Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local event = require("event")
- local math = require("math")
- local os = require("os")
- -- Initialize variables
- local A, B, C = 0, 0, 0
- local cubeWidth = 20
- local width, height = 160, 44
- local zBuffer = {}
- local buffer = {}
- local backgroundASCIICode = '.'
- local distanceFromCam = 100
- local horizontalOffset
- local K1 = 40
- local incrementSpeed = 0.6
- -- Initialize the screen
- local screen = component.gpu
- -- Function to clear the screen
- local function clearScreen()
- screen.fill(1, 1, width, height, backgroundASCIICode)
- end
- -- Function to calculate X coordinate
- local function calculateX(i, j, k)
- return j * math.sin(A) * math.sin(B) * math.cos(C) - k * math.cos(A) * math.sin(B) * math.cos(C) +
- j * math.cos(A) * math.sin(C) + k * math.sin(A) * math.sin(C) + i * math.cos(B) * math.cos(C)
- end
- -- Function to calculate Y coordinate
- local function calculateY(i, j, k)
- return j * math.cos(A) * math.cos(C) + k * math.sin(A) * math.cos(C) -
- j * math.sin(A) * math.sin(B) * math.sin(C) + k * math.cos(A) * math.sin(B) * math.sin(C) -
- i * math.cos(B) * math.sin(C)
- end
- -- Function to calculate Z coordinate
- local function calculateZ(i, j, k)
- return k * math.cos(A) * math.cos(B) - j * math.sin(A) * math.cos(B) + i * math.sin(B)
- end
- -- Function to calculate for surface
- local function calculateForSurface(cubeX, cubeY, cubeZ, ch)
- local x = calculateX(cubeX, cubeY, cubeZ)
- local y = calculateY(cubeX, cubeY, cubeZ)
- local z = calculateZ(cubeX, cubeY, cubeZ) + distanceFromCam
- local ooz = 1 / z
- local xp = math.floor(width / 2 + horizontalOffset + K1 * ooz * x * 2)
- local yp = math.floor(height / 2 + K1 * ooz * y)
- local idx = xp + yp * width
- if idx >= 0 and idx < width * height then
- if not zBuffer[idx] or ooz > zBuffer[idx] then
- zBuffer[idx] = ooz
- buffer[idx] = ch
- end
- end
- end
- -- Main loop
- while true do
- clearScreen()
- zBuffer = {}
- buffer = {}
- -- First cube
- cubeWidth = 20
- horizontalOffset = -2 * cubeWidth
- for cubeX = -cubeWidth, cubeWidth, incrementSpeed do
- for cubeY = -cubeWidth, cubeWidth, incrementSpeed do
- calculateForSurface(cubeX, cubeY, -cubeWidth, '@')
- calculateForSurface(cubeWidth, cubeY, cubeX, '$')
- calculateForSurface(-cubeWidth, cubeY, -cubeX, '~')
- calculateForSurface(-cubeX, cubeY, cubeWidth, '#')
- calculateForSurface(cubeX, -cubeWidth, -cubeY, ';')
- calculateForSurface(cubeX, cubeWidth, cubeY, '+')
- end
- end
- -- Second cube
- cubeWidth = 10
- horizontalOffset = 1 * cubeWidth
- for cubeX = -cubeWidth, cubeWidth, incrementSpeed do
- for cubeY = -cubeWidth, cubeWidth, incrementSpeed do
- calculateForSurface(cubeX, cubeY, -cubeWidth, '@')
- calculateForSurface(cubeWidth, cubeY, cubeX, '$')
- calculateForSurface(-cubeWidth, cubeY, -cubeX, '~')
- calculateForSurface(-cubeX, cubeY, cubeWidth, '#')
- calculateForSurface(cubeX, -cubeWidth, -cubeY, ';')
- calculateForSurface(cubeX, cubeWidth, cubeY, '+')
- end
- end
- -- Third cube
- cubeWidth = 5
- horizontalOffset = 8 * cubeWidth
- for cubeX = -cubeWidth, cubeWidth, incrementSpeed do
- for cubeY = -cubeWidth, cubeWidth, incrementSpeed do
- calculateForSurface(cubeX, cubeY, -cubeWidth, '@')
- calculateForSurface(cubeWidth, cubeY, cubeX, '$')
- calculateForSurface(-cubeWidth, cubeY, -cubeX, '~')
- calculateForSurface(-cubeX, cubeY, cubeWidth, '#')
- calculateForSurface(cubeX, -cubeWidth, -cubeY, ';')
- calculateForSurface(cubeX, cubeWidth, cubeY, '+')
- end
- end
- -- Render the buffer
- for k = 0, width * height - 1 do
- if buffer[k] then
- screen.set(k % width + 1, math.floor(k / width) + 1, buffer[k])
- end
- end
- -- Update angles
- A = A + 0.05
- B = B + 0.05
- C = C + 0.01
- os.sleep(0.016) -- Sleep for approximately 16ms (60 FPS)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement