Advertisement
nonogamer9

Spinning cubes for OpenComputers

Jul 19th, 2024 (edited)
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.14 KB | Software | 0 0
  1. local component = require("component")
  2. local event = require("event")
  3. local math = require("math")
  4. local os = require("os")
  5.  
  6. -- Initialize variables
  7. local A, B, C = 0, 0, 0
  8. local cubeWidth = 20
  9. local width, height = 160, 44
  10. local zBuffer = {}
  11. local buffer = {}
  12. local backgroundASCIICode = '.'
  13. local distanceFromCam = 100
  14. local horizontalOffset
  15. local K1 = 40
  16. local incrementSpeed = 0.6
  17.  
  18. -- Initialize the screen
  19. local screen = component.gpu
  20.  
  21. -- Function to clear the screen
  22. local function clearScreen()
  23.     screen.fill(1, 1, width, height, backgroundASCIICode)
  24. end
  25.  
  26. -- Function to calculate X coordinate
  27. local function calculateX(i, j, k)
  28.     return j * math.sin(A) * math.sin(B) * math.cos(C) - k * math.cos(A) * math.sin(B) * math.cos(C) +
  29.            j * math.cos(A) * math.sin(C) + k * math.sin(A) * math.sin(C) + i * math.cos(B) * math.cos(C)
  30. end
  31.  
  32. -- Function to calculate Y coordinate
  33. local function calculateY(i, j, k)
  34.     return j * math.cos(A) * math.cos(C) + k * math.sin(A) * math.cos(C) -
  35.            j * math.sin(A) * math.sin(B) * math.sin(C) + k * math.cos(A) * math.sin(B) * math.sin(C) -
  36.            i * math.cos(B) * math.sin(C)
  37. end
  38.  
  39. -- Function to calculate Z coordinate
  40. local function calculateZ(i, j, k)
  41.     return k * math.cos(A) * math.cos(B) - j * math.sin(A) * math.cos(B) + i * math.sin(B)
  42. end
  43.  
  44. -- Function to calculate for surface
  45. local function calculateForSurface(cubeX, cubeY, cubeZ, ch)
  46.     local x = calculateX(cubeX, cubeY, cubeZ)
  47.     local y = calculateY(cubeX, cubeY, cubeZ)
  48.     local z = calculateZ(cubeX, cubeY, cubeZ) + distanceFromCam
  49.  
  50.     local ooz = 1 / z
  51.     local xp = math.floor(width / 2 + horizontalOffset + K1 * ooz * x * 2)
  52.     local yp = math.floor(height / 2 + K1 * ooz * y)
  53.  
  54.     local idx = xp + yp * width
  55.     if idx >= 0 and idx < width * height then
  56.         if not zBuffer[idx] or ooz > zBuffer[idx] then
  57.             zBuffer[idx] = ooz
  58.             buffer[idx] = ch
  59.         end
  60.     end
  61. end
  62.  
  63. -- Main loop
  64. while true do
  65.     clearScreen()
  66.     zBuffer = {}
  67.     buffer = {}
  68.  
  69.     -- First cube
  70.     cubeWidth = 20
  71.     horizontalOffset = -2 * cubeWidth
  72.     for cubeX = -cubeWidth, cubeWidth, incrementSpeed do
  73.         for cubeY = -cubeWidth, cubeWidth, incrementSpeed do
  74.             calculateForSurface(cubeX, cubeY, -cubeWidth, '@')
  75.             calculateForSurface(cubeWidth, cubeY, cubeX, '$')
  76.             calculateForSurface(-cubeWidth, cubeY, -cubeX, '~')
  77.             calculateForSurface(-cubeX, cubeY, cubeWidth, '#')
  78.             calculateForSurface(cubeX, -cubeWidth, -cubeY, ';')
  79.             calculateForSurface(cubeX, cubeWidth, cubeY, '+')
  80.         end
  81.     end
  82.  
  83.     -- Second cube
  84.     cubeWidth = 10
  85.     horizontalOffset = 1 * cubeWidth
  86.     for cubeX = -cubeWidth, cubeWidth, incrementSpeed do
  87.         for cubeY = -cubeWidth, cubeWidth, incrementSpeed do
  88.             calculateForSurface(cubeX, cubeY, -cubeWidth, '@')
  89.             calculateForSurface(cubeWidth, cubeY, cubeX, '$')
  90.             calculateForSurface(-cubeWidth, cubeY, -cubeX, '~')
  91.             calculateForSurface(-cubeX, cubeY, cubeWidth, '#')
  92.             calculateForSurface(cubeX, -cubeWidth, -cubeY, ';')
  93.             calculateForSurface(cubeX, cubeWidth, cubeY, '+')
  94.         end
  95.     end
  96.  
  97.     -- Third cube
  98.     cubeWidth = 5
  99.     horizontalOffset = 8 * cubeWidth
  100.     for cubeX = -cubeWidth, cubeWidth, incrementSpeed do
  101.         for cubeY = -cubeWidth, cubeWidth, incrementSpeed do
  102.             calculateForSurface(cubeX, cubeY, -cubeWidth, '@')
  103.             calculateForSurface(cubeWidth, cubeY, cubeX, '$')
  104.             calculateForSurface(-cubeWidth, cubeY, -cubeX, '~')
  105.             calculateForSurface(-cubeX, cubeY, cubeWidth, '#')
  106.             calculateForSurface(cubeX, -cubeWidth, -cubeY, ';')
  107.             calculateForSurface(cubeX, cubeWidth, cubeY, '+')
  108.         end
  109.     end
  110.  
  111.     -- Render the buffer
  112.     for k = 0, width * height - 1 do
  113.         if buffer[k] then
  114.             screen.set(k % width + 1, math.floor(k / width) + 1, buffer[k])
  115.         end
  116.     end
  117.  
  118.     -- Update angles
  119.     A = A + 0.05
  120.     B = B + 0.05
  121.     C = C + 0.01
  122.  
  123.     os.sleep(0.016)  -- Sleep for approximately 16ms (60 FPS)
  124. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement