̬̬̬̈̬ϬϬϬ̬̬̬̈̬̬ϬϬ""""""""""""""""""""""""""""""""33333333333333333333333333333333DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUffffffffffffffffffffffffffffffffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww̬̬̬̪쬪̬̬̬̪쬪ݻ3UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQUUUUQUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQUUU333333333333333333333333333333333333333333333333333333333333333333333333333333333CD4333C333333333333433343334333433D4D43C4333D43ݻ;;333;3333;33;;;;33;33;3UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQUUQUUUQUUUQUQQQUUUUUUUUUUQUUUQUUUUUUUUUUUUUUUUUUUUUU333333333333333333333333333333C4333333333333333333333CD43C3C3C3D33333433343C34333C3333DC333D333333D333C4333343334333433333333333ݻ;;;3UUUUUUUUUUUUUUUUUUUUUUUUUUQUUUUUUQQQUUUQUUUUUUQUQUUUUUUUUUUUQUUUQUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33DCC44C343C3C3D334333433343333C3C343CD33C43DC33C44334D334C3D3334333C333C3333333333333333333333333333333333333333333333333333333ݻUUQQUUUUUUUUUUUQUUUQUUUUUUQUUUUUQUUUQUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU33C43333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333)"")"))")"")))))"""")))))))")""")))))")))))"))""""" >? ]UU\UU \UU UUUUUUUUU UUUU ݝUUU]UUU\UUUUU _UUUU ]UUݝ)ݝ]]UUU UUU]UUݐ U ߙ]UUU]UUU\UUU UUUUUU UUUUUUUݙݙ\ݙ]UUUUUUUU ݙYUUUUUUUUUUU\UUUU)UUUݐ )UUUY]UUUUUUݝ]UUUUUUUUUUU\UU]UUUUUUՙ\UYUUU)UUUUUU))UUUQݐ))]UU]UUQ ݐ\)UUUUUUUUUUUUU UUUUUUUUUUUU]UU]UYUݐU]U PUUUUUUݝUUUUUUUUUQ )UU]U]Uݐ]U]U]UՙYUUYU))RUUUUUUU^UUUUUUU]Uݐ]U]U]ݐU")YUU""UYUUUUUUݙUUUUUUUQ]UUUQU))UUUU]U] RU]UU]UUUUUUUU UUUUUUUߙ]UUUUݐUUUU]]Րݐ)]UUU]UU]UUUUUUUUUUUUUU )YUU]UUU RUUUUUQ]]ݐ)\]U]UUU]UU]UUUUUUUQUUUUUUUUUUUU])^UUUUUU]) ] ]UYUUUݟ]UUUUUQUUUUUUQݐ)]UUQUUU]ݐ)U] YUYUYUUYUUUUUUUUUUUQUUUUUUU )")UU]UUUUUݕ U YURUU)YUUUU))YUUUUUQ))"UUUUU YUUUU]UUQUU )]U]ݐUU UUU \UUUUUUUUUUU)"YUUUUUUQQUUUUU]UUUU ]UUUUU]UUUUUUUUUUUUUUݝ"UUUUU]UUU ")Y]ݐUU]UU]UUUUUUUUUUUUUUUUQUUߙUUUU]UUݙ)U]ݐUU]UU]UUUUUUUU]UUUUUUQUU)))UUUU]U)U] ]UU]UUUUUUUUQ]UUUUUUQUU )UUUUUQ]UU U] UUݝ""\UUUUUUUUUQ]UUUUUQUUݐUUUUUUUQU]UU ))YU]YUUYUUUUUUUUU]UUUUUQU UUUUUUUUUQU]UQ YUUUU""UUUUUUU"UUQ]UUUUUQUQU]UUUUUUUUUUUQYUU]UUݐ)UUUUUUU)UUUQ]UUUUUUQU]UUUUUUQUUUUU)UU]UݐYUUUUQU)YUUUUU]UUUUUUUU]UUUUUUUUU"]UQ]UU]UUUUUU))"RUUUUUUU]UUUUUUUU]UUUUUUUU)"""]UQ]U]UUUUUYUUUUUUUUUݝYUUQQUU]UUUUUUUݐ")""]U]QUUUUYUUUUUQUUUUQݙ)YUUU]UUUUUQQUݐ)]UU]QU)UUUU YUUUUUUUUUUQUՙ]UUUUUUUUݐ)"U]UU]QU"UUUU]UUUUUUUUUUUUU))YU]UUUUUUUݐ)UU]U]UQݐ"UUUU]UUUUUUUUQUUU)")UUU]UUUUUUUݐYUU]U]UPݐUUUU]UUUUUUU""""UUUUU]UUUUQUU YUUU]U]ݐUUUU]UUUUUUU)"")YUUUUUU]UUUUUQUUUUQ]]UUUU]UUUUUUUݐYUUUUUUUU]UUUQUUUUUUQ]U]UUUUUUUUUU UUUUUUUUUU]UUUYUUUU]U]UUUUUUUUUUݐUUUUUUUUUUU]UUUUUUU"]UUUUUUUUUU \UUUUUUUUUUUU]")"UUUQUQU"]UUUUUUUUUUUUUUUUUUUUQUUUݙ)"))UUUUUU)]UUUUUUUUUUUUUUUUUUUUUUUݝ"UUQ)]UUUUUUUUUQUUUUUUUUUUQUUUݙ)]UUQQUU)"]UUUUUUUUUUUUUUUUUUUUUߟ"]UUUUU)]UQUUUUUUUUUUUUUUUUUUUUUݝ"""""""]UUQUUU )]UUUUUU]UUUUUUUUQUUUUݙ)))""Y]UUQUU ݙYUU]UUUUQQU]UUUUUUUUUUUUUUݝ)YU]UUUUU ݙU]UUUUQ]UUUUUUUUUUUUUUU )"")YUU]UQUUU )"]UUUUUQ]UUUUUUUUUUUUUUݐ")"UUU]UUQݙ))]UUUQQQQ]UUUUUUUUUQQUUUݐ)""UUUU]UUQ]Qݙ]UUUUU]UUUUUUUUQUUU ")""UUUUU]UQU]U)]UUUUU]UUUUUUUUUQUUUUݐYUUUUU]UU]ݙ]UUUUUUU]UUUUUUUQUUUUUݐYUUUUUUQU]""YU]UUUUU]UUUUUUQUUUUU YUUUUUUUQU))UUUUUUUU]UUUUUUUUQUUUUݐUUUUQUUU)UUUUUQUUUUUUUUUUUUUUQQUUUUݐUUUUUUUUUݙYUUUUUUQUUUUUUUUUUUUUUUU UUUUUUQUUUQUݙYUUUUUUQUUUUUUUUUUUUUUUUݐYUUUUUUQUUUQQU)""))UUUUUUUUUUUUUUUUUUUUUUUUUUU]UUUUUUQUUUUU)""RUUUUUUUUUUUUUUUUUUUUUUUUUU]UUUUUUQQUUQUU""))")YUUUUUUUUUUUUUQU UUUUUUUUUUUU]UUUUUUQUUUU""UUUUUUUQUUUUUUUUUUUUUUQUUUUUU]UUUUUUUUU"UUUUUUUUUUUU]U UUUUUUUUUUUUU]UUUUUUQUU]QUUU)UUUUUUUUUUUU] UUUUQQUUUUUU]UUUUUUQUU]UUUUUUUUUQUUUUUݙUUUUUUUUUUUU]UUUUUUQUUU]UUU)UUUUUUUUUUUUݙ]UUUUUUUUUUUU]UUUUUUQUUU]QU)"""UUUUUUQQUUUݙ]UUUUQUUUUUUUU]UUUUUUUUUU]QU ))""UUUUUUUUUU]UUUUUUUUUUUU]UUUUUUQUUU]QU")"""UUUUUUQQUUU)YQUUUUUUUUUU]UUUUUUU]U"))"UUUUUUQUQQUU")""""UUUUUUUUUUUUUUUUUQUU]Q)")UUUUUQUUUQUU")"YUUUUUUUUUUUUUUUUUU])"""UUUUUUUUUUUU)"YUUUUUUUUUUUUUUUUU]UUUUUQUUUUUUU)""UUUUUUUUUUUUUUUUUUUUUUUUUUUU"""""""""YUUUUUUUUUېUUUUUQQUUUU)")UUUUUUQUU;ݐUUUUQQUU)" UUUUUUUUUݐUUUUUUQQ)"UUUUUUUUUUݐUUUUUUQQU)"UUUUQUUUUU;ݐUUUUUU" UUUUQUUUUU3ݐUUUUQ")"UUUUQQUUUݐUUUUQ)")""""")UUUUQUUUUP;UUUU"))""""")"UUUUQQQUUUPUUU")""")")"UUUUUUUUPUU"""")")"U]UUUUUUUUPU"""")")UU]UUUUUUUUݙ)")"UUU]UUUQUUUUU;ݙ"")"YUUU]UUUQUUUU;ݐ)")")"YUUUU]UUUUUUUU5ݐ)")"""""YUUUUU]UUUUUUUUUP """)YUUUUUU]UUUUUUUUPݐ")UUUUUUU]UUUQUUUUUP """""UUUUUUUU]UUUUUUUUPݐ)""""UUUUUUUUU]UUUUUUU5 )""UUUUUUUUUU]UUUUUU5ݐ")"UUUUUUUUUUU]UUUUUU5 ""YUUUUUUUUUUU]UUUUUU5ݐ"""YUUUUUUUUUUUU]UUUUPU """")"YUUUUUUUUUUUUU]UUUUUPUݐ)""""YUUUUUUQUUUUUUUUUQQUUP )")""YUUUUUUQUUUUUUUUQUUPݐ)"""UUUUUUQUUUUUUUQQQUU ))""UUUUUUUUUUUUUUUQUUUU)UUUUUUUUUUUUUUUUUUUU UUUUUUUUQUUUUUUUUUQUUݐYUUUUUUUUUUUUUQUUUUUUQU YUUUUUUUUUUQQUUUUUUUQPQݐYUUUUUUUUUUUUUUUP YUUUUUUUUUUUQQUUUUUPUUݐYUUUUUUUUUUUUUUUUUUPUUQ UUUUUUUUUUUUQUUUUUQUUUU UUݐUUUUUUUUUUUUUQUUUUUUQUUUUUU UUUUUUUUUUUUUUQUUUUUUUUUUUUݐUUUUUUUUUUUUUUQUUUUUUUUUUU YUUUUUUUUUUUUUUUUUUUUUUUUU PݐYUUUUUUUUUUUUUUUUUUUUUUUUUUU P YUUUUUUUUUUUUUUUUUUUUUUQUUUUU PݐYUUUUUUUUUUUUUUUUUUUUUUUQUUUUU P YUUUUUUUUUUUUUUUUUUUUQUQUUUUUݐUUUUUUUUUUUUUUUUUUQQQUUUUU UUUUUUUUUUUUUUUUUUUUQUUUUUݐUUUUUUUUUUUUUUUUUUUUQQQUUUUUUUU UUUUUUUUUUUUUUUUUUUUUUUUQUUUUUUUUU PUUUUUUUUUUUUUUUUUUUUUUUUUQUUUUUUUUUU P]UUUUUUUUUUUUUUUUUUUUUUUQUUQUUUUUUUP]UUUUUUUUUUUUUUUUUUUUUUQQQUUUUUUUUUUUUUUUUUUUUUUUUUUUUUQUUUUUUUUUUUUUUUUUUUUUUUUUUUQUUUUUUUU ]UUUUUUUUUUUUUUUUUUUQUQUQQUUUUUUUU ]UUUUUUUUUUUUUUUUUUUQUUUUUUUUUUUUUUU; 3-- title: NeoTIC -- author: Funky -- desc: Barebones 3d renderer with texturing -- script: lua -- This project is licensed under the terms of the -- DO WHAT THE FRICK YOU WANT TO PUBLIC LICENSE, version 3, -- as published by theiostream on March 2012, as it follows: -- 0. You just DO WHAT THE FRICK YOU WANT TO. local myWorld = {} ---------------------------------------------------------- -- Catalog of Models: ---------------------------------------------------------- --nesbox nesbox= [[ x = { 0, 1, 0, 1}, y = { 1, 1, 0, 0}, z = { 0, 0, 0, 0}, c = { 1}, t = { 16}, ]] --a fancy cube fCube =[[ x = { 0,1,0,1, 0,0,0,0, 1,1,1,1, 1,0,1,0, 0,1,0,1 }, y = { 1,1,0,0, 1,1,0,0, 1,1,0,0, 1,1,0,0, 1,1,1,1 }, z = { 0,0,0,0, 1,0,1,0, 0,1,0,1, 1,1,1,1, 1,1,0,0 }, c = { 32, 36, 40, 44, 96}, t = { 32, 32, 32, 32, 32}, ]] -- a pyramid pyramid=[[ x = { 1, 0, 1, 0, 1, 0, 1, 0, 0,-1, 0,-1, 0,-1, 0,-1,}, y = { 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,}, z = { 1, 1, 0, 0, 0, 0,-1,-1, 1, 1, 0, 0, 0, 0,-1,-1,}, c = { 7, 9, 11, 21,}, t = { 8, 8, 8, 8,}, ]] -- corner drawing order for a textured square -- 1 ___ 2 -- | //| -- | // | -- |//__| -- 3 4 -- "table merging"; the -- magic may leak on touch function AddToWorld(destiny,str1,str2) local bar=load('foo='..'{'..str1..str2..'}') bar() destiny[#destiny+1]=foo end AddToWorld( myWorld, pyramid ,' xP= 2'..',yP=0'..',zP=2') for L1= -10,10,2 do for L2= 1,20,2 do AddToWorld( myWorld, fCube ,' xP='..L1..',yP='..(-2)..',zP='..L2) end end gPlayer = { x = .5, y = 0, z = -2, ya= 0, pa= 0 } --ya "yawn angle" , pa "pitch angle" function TIC() ta=time() cls() gPlayer = movement(gPlayer) drawOrder= DrawWorld(gPlayer.x,gPlayer.y,gPlayer.z,gPlayer.ya,gPlayer.pa,myWorld) table.sort(drawOrder, function (k1, k2) return k1.dist > k2.dist end ) DrawTextures(drawOrder) tb=time() print('frameTime: '..(tb-ta).."\n"..'polygons: '..#drawOrder*2,0,0,12) end -- "if it was difficult to write -- it should be difficult to read" -- last change: 13/5/2022 function DrawWorld(x,y,z,ya,pa,lWorld) local s1,s2,s3 --'spin' local function Rotate (xIn,yIn,zIn,si,co,xyz) s1 = (xyz==1) and xIn or ( (xyz==2) and co*xIn+si*zIn or co*xIn-si*yIn ) s2 = (xyz==1) and co*yIn-si*zIn or ( (xyz==2) and yIn or si*xIn+co*yIn ) s3 = (xyz==1) and si*yIn+co*zIn or ( (xyz==2) and -si*xIn+co*zIn or zIn) end local siPya,coPya=math.sin(ya*3.14/180),math.cos(ya*3.14/180) local siPpa,coPpa=math.sin(pa*3.14/180),math.cos(pa*3.14/180) Rotate( .01, .01, .02, siPpa, coPpa, 1) Rotate( s1, s2, s3, siPya, coPya, 2) local rP1x, rP1y, rP1z= s1, s2, s3 Rotate(-.01, .01, .02, siPpa, coPpa, 1) -- 2______ 1 Rotate( s1, s2, s3, siPya, coPya, 2) -- \ / local rP2x, rP2y, rP2z= s1, s2, s3 -- \/3 Rotate( .00,-.01, .02, siPpa, coPpa, 1) Rotate( s1, s2, s3, siPya, coPya, 2) local rP3x, rP3y, rP3z= s1, s2, s3 local drawOrder={ } for L1, T1 in ipairs(lWorld) do for L2 = 0, (#T1.x-#T1.x%4)/4 - 1 do local v11,v12,v13 = T1.x[L2*4+1],T1.y[L2*4+1],T1.z[L2*4+1] local v21,v22,v23 = T1.x[L2*4+2],T1.y[L2*4+2],T1.z[L2*4+2] local v31,v32,v33 = T1.x[L2*4+3],T1.y[L2*4+3],T1.z[L2*4+3] local v41,v42,v43 = T1.x[L2*4+4],T1.y[L2*4+4],T1.z[L2*4+4] local vn1 = trigonometry(x,y,z,T1.xP+v11,T1.yP+v12,T1.zP+v13,rP1x,rP1y,rP1z,rP2x,rP2y,rP2z,rP3x,rP3y,rP3z) if vn1.D == false then goto skip end local vn2 = trigonometry(x,y,z,T1.xP+v21,T1.yP+v22,T1.zP+v23,rP1x,rP1y,rP1z,rP2x,rP2y,rP2z,rP3x,rP3y,rP3z) if vn2.D == false then goto skip end local vn3 = trigonometry(x,y,z,T1.xP+v31,T1.yP+v32,T1.zP+v33,rP1x,rP1y,rP1z,rP2x,rP2y,rP2z,rP3x,rP3y,rP3z) if vn3.D == false then goto skip end local vn4 = trigonometry(x,y,z,T1.xP+v41,T1.yP+v42,T1.zP+v43,rP1x,rP1y,rP1z,rP2x,rP2y,rP2z,rP3x,rP3y,rP3z) if vn4.D == false then goto skip end drawOrder[#drawOrder+1]= { dist=vn4.A, ID= (T1.c[L2+1]<<36) + (T1.t[L2+1]<<24) , Vx= 239/2 - 10000 * vn1.B, Vy= 135/2 + 10000 * vn1.C, Cx= T1.xP, Cy= T1.yP, Cz= T1.zP, x = {239/2 - 10000 * vn1.B, 239/2 - 10000 * vn2.B, 239/2 - 10000 * vn3.B, 239/2 - 10000 * vn4.B, } , y = {135/2 + 10000 * vn1.C, 135/2 + 10000 * vn2.C, 135/2 + 10000 * vn3.C, 135/2 + 10000 * vn4.C, } , } ::skip:: end end return drawOrder end function DrawTextures(textures) for L1, T1 in ipairs(textures) do local var1= T1.ID>>36 local spSz = (T1.ID<<28)>>52 local txpos = (var1%16) * 8 local typos = (var1-var1%16)/2 for L2=0,1 do textri( T1.x[1+L2] , T1.y[1+L2] , T1.x[2+L2] , T1.y[2+L2] , T1.x[3+L2] , T1.y[3+L2] , txpos+spSz* L2 , typos , txpos+spSz*(L2-1)^2, typos+spSz*L2, txpos+spSz* L2 , typos+spSz ) end end end function trigonometry(Px,Py,Pz,Tx,Ty,Tz,rP1x,rP1y,rP1z,rP2x,rP2y,rP2z,rP3x,rP3y,rP3z) local v01, v02, v03= Px-Tx, Py-Ty, Pz-Tz local v11, v12, v13= rP1x+v01, rP1y+v02, rP1z+v03 local v21, v22, v23= rP2x+v01, rP2y+v02, rP2z+v03 local v31, v32, v33= rP3x+v01, rP3y+v02, rP3z+v03 local d1 = ( v11*v11 + v12*v12 + v13*v13 )^.5 local d2 = ( v21*v21 + v22*v22 + v23*v23 )^.5 local d3 = ( v31*v31 + v32*v32 + v33*v33 )^.5 local d5 = ( v01*v01 + v02*v02 + v03*v03 )^.5 return { A = d5, --distance B = d1-d2, C = (d1+d2)/2-d3, D = not( d5 13 (v7) -> 12 (v8) -> 10 (b81) -> 6 (b83) function movement(foo) local sin,cos,d2r = math.sin, math.cos, 3.14/180 local t={ [true]=1, [false]=0 } foo.x=foo.x+(sin(foo.ya*d2r)/4)*t[btn(0)] foo.z=foo.z+(cos(foo.ya*d2r)/4)*t[btn(0)] foo.x=foo.x-(sin(foo.ya*d2r)/4)*t[btn(1)] foo.z=foo.z-(cos(foo.ya*d2r)/4)*t[btn(1)] foo.x=foo.x+(sin((foo.ya+90)*d2r)/4)*t[btn(3)] foo.z=foo.z+(cos((foo.ya+90)*d2r)/4)*t[btn(3)] foo.x=foo.x+(sin((foo.ya-90)*d2r)/4)*t[btn(2)] foo.z=foo.z+(cos((foo.ya-90)*d2r)/4)*t[btn(2)] if key(17) then foo.y=foo.y-.1 end if key(23) then foo.y=foo.y+.1 end if btn(4) then foo.ya= ((foo.ya - 5)%360)%-360 end if btn(5) then foo.ya= ((foo.ya + 5)%360)%-360 end if btn(6) then foo.pa= ((foo.pa + 5)%360)%-360 end if btn(7) then foo.pa= ((foo.pa - 5)%360)%-360 end return foo end