9551

ThreeDeeh

Nov 5th, 2021 (edited)
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.32 KB | None | 0 0
  1. local toBlit = {}
  2. local chars = "0123456789abcdef"
  3. for i = 0, 15 do
  4.     toBlit[2^i] = chars:sub(i + 1, i + 1)
  5. end
  6. local function makeProjection(w,h,n,f)
  7.     --w = width
  8.     --h = height
  9.     --n = near plane
  10.     --f = far plane
  11.     return {
  12.         {2*n/w,0,0,0},
  13.         {0,2*n/h, 0,0},
  14.         {0,0,f/(f-n),-n*f/(f-n)},
  15.         {0,0,-1,0}
  16.     }
  17. end
  18. local makeIdentity = function()
  19.     return {
  20.         {1,0,0,0},
  21.         {0,1,0,0},
  22.         {0,0,1,0},
  23.         {0,0,0,1}
  24.     }
  25. end
  26. local makeTranslation = function(cords)
  27.     return {
  28.         {1,0,0,cords.x},
  29.         {0,1,0,cords.y},
  30.         {0,0,1,cords.z},
  31.         {0,0,0,1}
  32.     }
  33. end
  34. local function makeScale(scale)
  35.     return
  36.     {
  37.         {scale.x, 0, 0, 0},
  38.         {0, scale.y, 0, 0},
  39.         {0, 0, scale.z, 0},
  40.         {0, 0, 0, 1}
  41.     }        
  42. end
  43. local function makeRotation(eulers)
  44.     local x = math.rad(eulers.x)
  45.     local y = math.rad(eulers.y)
  46.     local z = math.rad(eulers.z)
  47.     local sx = math.sin(x)
  48.     local sy = math.sin(y)
  49.     local sz = math.sin(z)
  50.    
  51.     local cx = math.cos(x)
  52.     local cy = math.cos(y)
  53.     local cz = math.cos(z)
  54.     return
  55.     {
  56.         {cy * cz, -cy * sz, sy, 0},
  57.         {(sx * sy * cz) + (cx * sz), (-sx * sy * sz) + (cx * cz), -sx * cy, 0},
  58.         {(-cx * sy * cz) + (sx * sz), (cx * sy * sz) + (sx * cz), cx * cy, 0},
  59.         {0, 0, 0, 1,}
  60.     }
  61. end
  62. local function makePerspective(width, height, n, f, fov)
  63.     local aspectRatio = 3/2*height / width  
  64.     --local aspectRatio = height / width  
  65.     fov = math.rad(fov)
  66.     return
  67.     {
  68.         {aspectRatio/math.tan(fov*0.5),0,0,0},
  69.         {0,1/(math.tan(fov*0.5)),0,0},
  70.         {0,0,-f/(f-n),-f*n/(f-n)},
  71.         {0,0,-1,0}
  72.     },width,height
  73. end
  74. local function matmul(m1, m2)
  75.     if #m1[1] ~= #m2 then
  76.         error("Columns m1 must match rows m2",2)
  77.     end
  78.     local result = {}
  79.     for i = 1, #m1 do
  80.         result[i] = {}
  81.         for j = 1, #m2[1] do
  82.             local sum = 0
  83.             for k = 1, #m2 do sum = sum + (m1[i][k] * m2[k][j]) end
  84.             result[i][j] = sum
  85.         end
  86.     end
  87.     return result
  88. end
  89. local createSelfIndexArray = function()
  90.     return setmetatable({},
  91.         {
  92.             __index=function(t,k)
  93.                 local new = {}
  94.                 t[k]=new
  95.                 return new
  96.             end
  97.         }
  98.     )
  99. end
  100. local function interpolate(p1,p2,y)
  101.     return (((y-p1.y)*(p2.x-p1.x)) / (p2.y-p1.y) + p1.x)
  102. end
  103. local function interpolateY(a,b,y)
  104.     local ya = y - a.y
  105.     local ba = b.y - a.y
  106.     local x = a.x + (ya * (b.x - a.x)) / ba
  107.     local z = a.z + (ya * (b.z - a.z)) / ba
  108.     return x,z
  109. end
  110. local function interpolateZ(a,b,x)
  111.     local z = a.z + (x-a.x) * (((b.z-a.z)/(b.x-a.x)))
  112.     return z
  113. end
  114. local function intY(a,b,y)
  115.     return a.x + ((y - a.y) * (b.x - a.x)) / (b.y - a.y)
  116. end
  117. local function getT(a,b,p)
  118.     local v1 = vector.new( a.x-b.x, a.y-b.y )
  119.     local v2 = vector.new( a.x-p.x, a.y-p.y )
  120.     return (v1:dot(v2)) / (v1:dot(v1))
  121. end
  122. local function lerp(v1,v2,t)
  123.     return (1 - t) * v1 + t * v2
  124. end
  125. local function pPix(x,y,c)
  126.     term.setCursorPos(x,y)
  127.     term.setBackgroundColor(colors.white)
  128.     term.setTextColor(colors.black)
  129.     term.write(c)
  130.     term.setBackgroundColor(colors.black)
  131.     term.setTextColor(colors.white)
  132. end
  133. local function switchXYArray(array)
  134.     local output = createSelfIndexArray()
  135.     for x,yout in pairs(array) do
  136.         if type(yout) == "table" then
  137.             for y,val in pairs(yout) do
  138.                 output[y][x] = val
  139.             end
  140.         end
  141.     end
  142.     return output
  143. end
  144. local function strInsert(string,add)
  145.     return string..add
  146. end
  147. local function drawLine(startX, startY, endX, endY, wdata, ZBUFFER, color)
  148.     local drawPixelInternal = function(x,y)
  149.         local interpolated = interpolate(wdata[1],wdata[2],y)
  150.         if not ZBUFFER[x][y] then ZBUFFER[x][y] = {w=math.huge} end
  151.         if interpolated < ZBUFFER[x][y].w or ZBUFFER[x][y].w == math.huge then
  152.             ZBUFFER[x][y] = {
  153.                 w=interpolated,
  154.                 color=color
  155.             }
  156.         end
  157.     end
  158.     local startX,startY,endX,endY = math.floor(startX),math.floor(startY),math.floor(endX),math.floor(endY)
  159.     if startX == endX and startY == endY then drawPixelInternal(startX, startY) return end
  160.     local minX = math.min(startX, endX)
  161.     local maxX, minY, maxY
  162.     if minX == startX then minY = startY maxX = endX maxY = endY
  163.     else minY = endY maxX = startX maxY = startY end
  164.     local xDiff,yDiff = maxX - minX,maxY - minY
  165.     if xDiff > math.abs(yDiff) then
  166.         local y,dy = minY,yDiff / xDiff
  167.         for x = minX, maxX do drawPixelInternal(x, math.floor(y+0.5)) y = y + dy end
  168.     else
  169.         local x,dx = minX,xDiff / yDiff
  170.         if maxY >= minY then for y = minY, maxY do drawPixelInternal(math.floor(x ), y) x = x + dx end
  171.         else for y = minY, maxY, -1 do drawPixelInternal(math.floor(x+0.5), y) x = x - dx end end
  172.     end
  173. end
  174. local function drawFlatTriangle(ZBUFFER,px1,px2,y,color,v1,v2,v3)
  175.     local xStart = math.ceil(px1-0.5)
  176.     local xEnd =   math.ceil(px2-0.5)
  177.     local sxStart = intY(v1,v2,y)
  178.     local sxEnd = intY(v1,v3,y)
  179.     local p1 = vector.new(sxStart,y)
  180.     local p2 = vector.new(sxEnd,y)
  181.     local t1 = getT(v1,v2,p1)
  182.     local t2 = getT(v1,v3,p2)
  183.     local z1 = lerp(v1.z,v2.z,t1)
  184.     _G.val = v3.z
  185.     local z2 = lerp(v1.z,v3.z,t2)
  186.     _G.zito = v2
  187.     for x = xStart, xEnd do
  188.         if y > 0 and x > 0 then
  189.             local t3 = (x - sxStart) / (sxEnd - sxStart)
  190.             local z = math.floor(lerp(z1,z2,t3))
  191.             ZBUFFER[x][y] = color
  192.         end
  193.     end
  194. end
  195. local function drawFlatTopTriangle(ZBUFFER,vec1,vec2,vec3,color)
  196.     local m1 = (vec3.x - vec1.x) / (vec3.y - vec1.y)
  197.     local m2 = (vec3.x - vec2.x) / (vec3.y - vec2.y)
  198.     local yStart = math.ceil(vec1.y - 0.5)
  199.     local yEnd =   math.ceil(vec3.y - 0.5)-1
  200.     for y = yStart, yEnd do
  201.         local px1 = m1 * (y + 0.5 - vec1.y) + vec1.x
  202.         local px2 = m2 * (y + 0.5 - vec2.y) + vec2.x
  203.         drawFlatTriangle(ZBUFFER,px1,px2,y,color,vec1,vec2,vec3)
  204.     end
  205. end
  206. local function drawFlatBottomTriangle( ZBUFFER,vec1,vec2,vec3,color)
  207.     local m1 = (vec2.x - vec1.x) / (vec2.y - vec1.y)
  208.     local m2 = (vec3.x - vec1.x) / (vec3.y - vec1.y)
  209.     local yStart = math.ceil(vec1.y-0.5)
  210.     local yEnd =   math.ceil(vec3.y-0.5)-1
  211.     for y = yStart, yEnd do
  212.         local px1 = m1 * (y + 0.5 - vec1.y) + vec1.x
  213.         local px2 = m2 * (y + 0.5 - vec1.y) + vec1.x
  214.         drawFlatTriangle(ZBUFFER,px1,px2,y,color,vec1,vec2,vec3)
  215.     end
  216. end
  217. local function proccesSolidTriangle(ZBUFFER,vec1,vec2,vec3,color)
  218.     local pv1 = vec1
  219.     local pv2 = vec2
  220.     local pv3 = vec3
  221.     if pv2.y < pv1.y then pv1,pv2 = pv2,pv1 end
  222.     if pv3.y < pv2.y then pv2,pv3 = pv3,pv2 end
  223.     if pv2.y < pv1.y then pv1,pv2 = pv2,pv1 end
  224.     if pv1.y == pv2.y then
  225.         if pv2.x < pv1.x then pv1,pv2 = pv2,pv1 end
  226.         drawFlatTopTriangle(ZBUFFER,pv1,pv2,pv3,color)
  227.     elseif pv2.y == pv3.y then
  228.         if pv3.x < pv2.x then pv3,pv2 = pv2,pv3 end
  229.         drawFlatBottomTriangle(ZBUFFER,pv1,pv2,pv3,color)
  230.     else
  231.         local alphaSplit = (pv2.y-pv1.y)/(pv3.y-pv1.y)
  232.         local vi ={
  233.             x = pv1.x + ((pv3.x - pv1.x) * alphaSplit),      
  234.             y = pv1.y + ((pv3.y - pv1.y) * alphaSplit), }
  235.         if pv2.x < vi.x then
  236.             drawFlatBottomTriangle(ZBUFFER,pv1,pv2,vi,color)
  237.             drawFlatTopTriangle(ZBUFFER,pv2,vi,pv3,color)
  238.         else
  239.             drawFlatBottomTriangle(ZBUFFER,pv1,vi,pv2,color)
  240.             drawFlatTopTriangle(ZBUFFER,vi,pv2,pv3,color)
  241.         end
  242.     end
  243. end
  244. --[[local function proccesSolidTriangle(ZBUFFER,b,a,c,tColor)
  245.     if a.y < b.y then a,b = b,a end
  246.     if a.y < c.y then a,c = c,a end
  247.     if b.x > c.x then b,c = c,b end
  248.     for y = b.y, a.y-1 do
  249.         local xStart = intY(a,b,y)
  250.         local xEnd = intY(a,c,y)
  251.         local p1 = vector.new(xStart,y)
  252.         local p2 = vector.new(xEnd,y)
  253.         local t1 = getT(a,b,p1)
  254.         local t2 = getT(a,c,p2)
  255.         local z1 = lerp(a.z,b.z,t1)
  256.         local z2 = lerp(a.z,c.z,t2)
  257.         for x = xStart, xEnd do
  258.             local t3 = (x - xStart) / (xEnd - xStart)
  259.             local z = math.floor(lerp(z1,z2,t3))    
  260.             if not ZBUFFER[x][y] then ZBUFFER[x][y] = {w=math.huge} end
  261.             if z > ZBUFFER[x][y].w or ZBUFFER[x][y].w == math.huge then
  262.                 ZBUFFER[x][y] = {
  263.                     w=z,
  264.                     color=tColor
  265.                 }
  266.             end
  267.         end
  268.     end
  269. end]]
  270. local function createColor(whitelist,blacklist)
  271.     local cols,clist,cCount = {},{},0
  272.     local acls = whitelist or {}
  273.     local useall = not whitelist
  274.     local bcls = blacklist or {}
  275.     local clist = {}
  276.     for k,v in pairs(colors) do
  277.         if type(v) == "number" and useall or acls[v] and not bcls[v] then
  278.             table.insert(clist,v)
  279.         end
  280.     end
  281.     return setmetatable({},{
  282.         __index=function(t,k)
  283.             cCount = cCount + 1
  284.             local col = clist[cCount]
  285.             if cCount >= #clist then cCount = 0 end
  286.             t[k]=col
  287.             return col
  288.         end
  289.     })
  290. end
  291. local function createZBuffer()
  292.     local buffer = createSelfIndexArray()
  293.     buffer.stamp = "zbuffer"
  294.     return buffer
  295. end
  296. --[[local function createColor(clist)
  297.     local clist = clist or {}
  298.     local cCount = 0
  299.     return setmetatable({},{
  300.         __index=function(t,k)
  301.             cCount = cCount + 1
  302.             local col = clist[cCount]
  303.             if cCount >= #clist then cCount = 0 end
  304.             t[k]=col
  305.             return col
  306.         end
  307.     })
  308. end]]
  309. local function createPerspective(width,height,FOV)
  310.     return {makePerspective(width,height,100,10,FOV)}
  311. end
  312. local function createCamera(locVector,rotVector)
  313.     return {
  314.         loc=makeTranslation(-locVector),
  315.         rot=makeRotation(-rotVector)
  316.     }
  317. end
  318. local function getProcessingArgs()
  319.     return {
  320.         doCulling = true,
  321.         drawWireFrame = false,
  322.         drawTriangles = true
  323.     }
  324. end
  325. local function clip1(v1,v2,v3)
  326.     local alphaA = (-v1.z)/(v2.z-v1.pos.z)
  327.     local alphaB = (-v1.z)/(v2.z-v1.pos.z)
  328.     local v1a = interpolate(v1,v2,alphaA)
  329.     local v1b = interpolate(v1,v3,alphaB)
  330.     return {{v1a,v1,v2},{v1b,v1a,v2}}
  331. end
  332. local function clip2(v1,v2,v3)
  333.     local alpha1 = (-v1.z)/(v3.z-v1.z)
  334.     local alpha2 = (-v2.z)/(v3.z-v2.z)
  335.     local v1 = interpolate(v1,v3,alpha1)
  336.     local v2 = interpolate(v2,v3,alpha2)
  337.     return {{v1,v2,v3}}
  338. end
  339. local function clipCullTriangle(v1,v2,v3)
  340.     if v1.x > v1.w and v2.x > v2.w and v3.x > v3.w then return false
  341.     elseif v1.x > -v1.w and v2.x > -v2.w and v3.x > -v3.w then return false
  342.     elseif v1.y > v1.w and v2.y > v2.w and v3.y > v3.w then return false
  343.     elseif v1.y > -v1.w and v2.y > -v2.w and v3.y > -v3.w then return false
  344.     elseif v1.z > v1.w and v2.z > v2.w and v3.z > v3.w then return false
  345.     elseif v1.z > -v1.w and v2.z > -v2.w and v3.z > -v3.w then return false end
  346.     return v1,v2,v3
  347. end
  348. local function transform(objList,persperctive,camera)
  349.     local objectsInt = createSelfIndexArray()
  350.     for k,v in pairs(objList) do
  351.         objectsInt[k] = {main=v,vectors={},origins={},connections=v.connections}
  352.         local scale = makeScale(v.scale/(v.divider or 1))
  353.         local rot = makeRotation(v.rot)
  354.         local loc = makeTranslation(v.loc)
  355.         local tempObj = {}
  356.         for k1,v1 in ipairs(v.vertices) do
  357.             local model = matmul(loc, matmul(rot, matmul(scale, v1)))
  358.             local cam = matmul(camera.rot, matmul(camera.loc, model))
  359.             local projected = matmul(persperctive[1],cam)
  360.             table.insert(tempObj,projected)
  361.         end
  362.         for kc,vc in ipairs(v.connections) do
  363.             local v1 = vector.new(tempObj[vc[1]][1][1],tempObj[vc[1]][2][1],tempObj[vc[1]][3][1])
  364.             local v2 = vector.new(tempObj[vc[2]][1][1],tempObj[vc[2]][2][1],tempObj[vc[2]][3][1])
  365.             local v3 = vector.new(tempObj[vc[3]][1][1],tempObj[vc[3]][2][1],tempObj[vc[3]][3][1])
  366.             v1.w,v2.w,v3.w = tempObj[vc[1]][4][1],tempObj[vc[2]][4][1],tempObj[vc[3]][4][1]
  367.             --[[if clipCullTriangle(v1,v2,v3) then
  368.                 if v1.z < 0 then
  369.                     if v2.z < 0 then something[something] = clip2(v1,v2,v3)
  370.                     elseif v3.z < 0 then something[something] = clip2(v1,v3,v2)
  371.                     else something[something] = clip1(v1,v2,v3) end
  372.                 elseif v2.z < 0 then
  373.                     if v3.z < 0 then something[something] = clip2(v2,v3,v1)
  374.                     else something[something] = clip1(v2,v1,v3) end
  375.                 elseif v3.z < 0 then
  376.                     something[something] = clip2(v3,v1,v2)
  377.                 end
  378.             end]]
  379.         end
  380.         for k2,v2 in ipairs(tempObj) do
  381.             local projected = v2
  382.             local w = 1/projected[4][1]
  383.             projected[1][1] = (projected[1][1] * w  +1) * (persperctive[2] / 2)
  384.             projected[2][1] = (-projected[2][1] * w +1) * (persperctive[3] / 2)
  385.             table.insert(objectsInt[k].vectors,projected)
  386.             table.insert(objectsInt[k].origins,v2)
  387.         end
  388.     end
  389.     return objectsInt
  390. end
  391. local function drawTransformed(ZBUFFER,objects,arguments)
  392.     local term = termObj or term
  393.     if not arguments then
  394.         arguments = {
  395.             doCulling = true,
  396.             drawWireFrame = false,
  397.             drawTriangles = true
  398.         }
  399.     end
  400.     for k,vm in pairs(objects) do
  401.         for k,v in pairs(vm.connections) do
  402.             local v1 = vector.new(vm.origins[v[1]][1][1],vm.origins[v[1]][2][1],vm.origins[v[1]][3][1])
  403.             local v2 = vector.new(vm.origins[v[2]][1][1],vm.origins[v[2]][2][1],vm.origins[v[2]][3][1])
  404.             local v3 = vector.new(vm.origins[v[3]][1][1],vm.origins[v[3]][2][1],vm.origins[v[3]][3][1])
  405.             if ((v2:cross(v3)):dot(v1) >= 0) or not arguments.doCulling then
  406.                 if arguments.drawTriangles then
  407.                     _G.pls = v3
  408.                     proccesSolidTriangle(ZBUFFER,v1,v2,v3,vm.main.color[k])
  409.                 end
  410.                 if arguments.drawWireFrame then
  411.                     local wVecs1 = {
  412.                         vector.new(vm.vectors[v[1]][1][1],vm.vectors[v[1]][2][1],vm.vectors[v[1]][3][1]),
  413.                         vector.new(vm.vectors[v[2]][1][1],vm.vectors[v[2]][2][1],vm.vectors[v[2]][3][1])
  414.                     }
  415.                     local wVecs2 = {
  416.                         vector.new(vm.vectors[v[2]][1][1],vm.vectors[v[2]][2][1],vm.vectors[v[2]][3][1]),
  417.                         vector.new(vm.vectors[v[3]][1][1],vm.vectors[v[3]][2][1],vm.vectors[v[3]][3][1])
  418.                     }
  419.                     local wVecs3 = {
  420.                         vector.new(vm.vectors[v[3]][1][1],vm.vectors[v[3]][2][1],vm.vectors[v[3]][3][1]),
  421.                         vector.new(vm.vectors[v[1]][1][1],vm.vectors[v[1]][2][1],vm.vectors[v[1]][3][1])
  422.                     }
  423.                     drawLine(vm.vectors[v[1]][1][1],vm.vectors[v[1]][2][1],vm.vectors[v[2]][1][1],vm.vectors[v[2]][2][1],wVecs1,ZBUFFER,vm.main.color[k])
  424.                     drawLine(vm.vectors[v[2]][1][1],vm.vectors[v[2]][2][1],vm.vectors[v[3]][1][1],vm.vectors[v[3]][2][1],wVecs2,ZBUFFER,vm.main.color[k])
  425.                     drawLine(vm.vectors[v[3]][1][1],vm.vectors[v[3]][2][1],vm.vectors[v[1]][1][1],vm.vectors[v[1]][2][1],wVecs3,ZBUFFER,vm.main.color[k])
  426.                 end
  427.             end
  428.         end
  429.     end
  430.     return ZBUFFER
  431. end
  432. local convertBufferToDrawable = function(width,height,ZBUFFER,keepBuffer)
  433.     local switched = switchXYArray(ZBUFFER)
  434.     local output = {}
  435.     for i=1,height do
  436.         for ix=1,width do
  437.             if not output[i] then output[i] = "" end
  438.             if switched[i][ix] then
  439.                 output[i] = strInsert(output[i],toBlit[switched[i][ix].color])
  440.             else
  441.                 output[i] = strInsert(output[i],"f")
  442.             end
  443.         end
  444.     end
  445.     output.stamp = ZBUFFER.stamp
  446.     if not keepBuffer then
  447.         ZBUFFER = setmetatable(ZBUFFER,
  448.             {
  449.                 __index=function(t,k)
  450.                     local new = {}
  451.                     t[k]=new
  452.                     return new
  453.                 end
  454.             }
  455.         )
  456.         for k,v in pairs(ZBUFFER) do
  457.             ZBUFFER[k] = nil
  458.         end
  459.     end
  460.     return output
  461. end
  462. local drawConverted = function(termObject,drawData)
  463.     local obc = termObject.getBackgroundColor()
  464.     if drawData.stamp == "zbuffer" then
  465.         for i=1,#drawData do
  466.             termObject.setCursorPos(1,i)
  467.             termObject.blit((" "):rep(#drawData[i]),("f"):rep(#drawData[i]),drawData[i])
  468.         end
  469.         termObject.setBackgroundColor(obc)
  470.         return true
  471.     end
  472.     return false
  473. end
  474. local function newSquare()
  475.     local objData = {
  476.         scale = vector.new(1,1,1),
  477.         loc = vector.new(0,0,0),
  478.         rot = vector.new(0,0,0),
  479.         color = createColor(),
  480.         indexList = {1},
  481.         vertices = {
  482.             {{-0.5}, {-0.5}, {0}, {1}},
  483.             {{0.5}, {-0.5}, {0}, {1}},
  484.             {{-0.5},  {0.5}, {0}, {1}},
  485.             {{0.5},  {0.5}, {0}, {1}},
  486.         },
  487.         connections = {
  488.             {3,2,1},
  489.             {2,4,3},
  490.             {1,2,3},
  491.             {3,4,2},
  492.         }
  493.     }
  494.     for i,val in ipairs(objData.indexList) do
  495.         objData.indexList[i] = val*4-3
  496.     end
  497.     return objData
  498. end
  499. local function newCube()
  500.     local objData = {
  501.         scale = vector.new(1,1,1),
  502.         loc = vector.new(0,0,0),
  503.         rot = vector.new(0,0,0),
  504.         color = createColor(),
  505.         indexList = {1},
  506.         vertices = {
  507.             { { -0.5}, { -0.5}, {0.5}, {1} },  
  508.             { {0.5}, { -0.5}, {0.5}, {1} },
  509.             { { -0.5}, {0.5}, {0.5}, {1} },
  510.             { {0.5}, {0.5}, {0.5}, {1} },
  511.             { { -0.5}, { -0.5}, { -0.5}, {1}},
  512.             { {0.5}, { -0.5}, { -0.5}, {1}},
  513.             { { -0.5}, {0.5}, { -0.5}, {1}},
  514.             { {0.5}, {0.5}, { -0.5}, {1}}
  515.         },
  516.         connections = {{ 1,3,4 },{ 1,4,2 },{ 5,7,3 },{ 5,3,1 },{ 6,8,7 },{ 6,7,5 },{ 2,4,8 },{ 2,8,6 },{ 3,7,8 },{ 3,8,4 },{ 5,1,2 },{ 5,2,6 }}
  517.     }
  518.     for i,val in ipairs(objData.indexList) do
  519.         objData.indexList[i] = val*4-3
  520.     end
  521.     return objData
  522. end
  523. local function newPyramid()
  524.     local objData = {
  525.         scale = vector.new(1,1,1),
  526.         loc = vector.new(0,0,0),
  527.         rot = vector.new(0,0,0),
  528.         color = createColor(),
  529.         indexList = {1},
  530.         vertices = {
  531.             {{-0.5}, {-0.5}, {-0.5}, {1}},
  532.             {{0.5}, {-0.5}, {-0.5}, {1}},
  533.             {{-0.5}, {-0.5}, {0.5}, {1}},
  534.             {{0.5}, {-0.5}, {0.5}, {1}},
  535.             {{0}, {0.5}, {0}, {1}}
  536.         },
  537.         connections = {{3,2,1},{3,4,2},{2,5,1},{3,5,4},{4,5,2},{1,5,3}}
  538.     }
  539.     for i,val in ipairs(objData.indexList) do
  540.         objData.indexList[i] = val*4-3
  541.     end
  542.     return objData
  543. end
  544. local function newIcosahedron()
  545.     local objData = {
  546.         scale = vector.new(1,1,1),
  547.         loc = vector.new(0,0,0),
  548.         rot = vector.new(0,0,0),
  549.         color = createColor(),
  550.         indexList = {1},
  551.         divider = 30,
  552.         vertices = {
  553.             {{0},{30},{0},{1}},
  554.             {{26},{15},{0},{1}},
  555.             {{8},{15},{25},{1}},
  556.             {{-21},{15},{15},{1}},
  557.             {{-21},{15},{-15},{1}},
  558.             {{8},{15},{-25},{1}},
  559.             {{21},{-15},{15},{1}},
  560.             {{-8},{-15},{25},{1}},
  561.             {{-26},{-15},{0},{1}},
  562.             {{-8},{-15},{-25},{1}},
  563.             {{21},{-15},{-15},{1}},
  564.             {{0},{-30},{-15},{1}}
  565.         },
  566.         connections = {{1,2,3},{1,4,3},{1,4,5},{1,6,5},{1,6,2},{2,3,7},{8,3,7},{3,4,8},{9,4,8},{4,5,9},{10,5,9},{5,6,10},{11,6,10},{6,2,11},{7,2,11},{12,11,10},{12,9,10},{12,9,8},{12,7,8},{12,7,11}}        
  567.     }
  568.     for i,val in ipairs(objData.indexList) do
  569.         objData.indexList[i] = val*4-3
  570.     end
  571.     return objData
  572. end
  573. return {
  574.     transform = transform,
  575.     drawTransformed = drawTransformed,
  576.     objects = {
  577.         newSquare = newSquare,
  578.         newCube = newCube,
  579.         newPyramid = newPyramid,
  580.         newIcosahedron = newIcosahedron,
  581.     },
  582.     createColor = createColor,
  583.     createZBuffer = createZBuffer,
  584.     createPerspective = createPerspective,
  585.     createCamera = createCamera,
  586.     getProcessingArgs = getProcessingArgs,
  587.     convertBufferToDrawable = convertBufferToDrawable,
  588.     drawConverted = drawConverted,
  589.     convertBufferToDrawable = convertBufferToDrawable,
  590. }
  591.  
Add Comment
Please, Sign In to add comment