geoboom geoboom loading
Hello, I'm not that active in Scratch but I have a question and that is, how do I adapt the Z-Clipping code so that it can work on textures

code (Works in TIC-80 with texture artifacts)

-- title:   game title
-- author: game developer, email, etc.
-- desc: short description
-- site: website link
-- license: MIT License (change this to your license of choice)
-- version: 0.1
-- script: lua

-- credits:
-- 3D Z-Clipping and other stuff by: CodingBio link: https://scratch.mit.edu/projects/747504673

local sin=math.sin
local cos=math.cos
local floor=math.floor
local rand=math.random

local screenw=240
local screenh=136

local focal=128

local Camera
local TempTri
local MeshForm

function BOOT()
Camera={
Position={PosX=0,PosY=0,PosZ=3.5},
Rotation={RotX=0.25,RotY=3.1415,RotZ=0}
}
TempTri={
Point1={x=0,y=0,z=0},
Point2={x=0,y=0,z=0},
Point3={x=0,y=0,z=0}
}
TempDotTri={
Point1={x=0,y=0,z=0},
Point2={x=0,y=0,z=0},
Point3={x=0,y=0,z=0}
}
NewMesh={
MeshForm={},
UVs={},
Position={PosX=0,PosY=0,PosZ=0},
Rotation={RotX=0,RotY=0,RotZ=0}
}

AddMeshTri(NewMesh,50,2,50,-50,2,50,50,2,-50) --Add a triangle in the NewMesh
AddTriUV(NewMesh,0,0,0,240,240,0) --Add a UV Reference (the texture used is the map) in the NewMesh

AddMeshTri(NewMesh,50,2,-50,-50,2,-50,-50,2,50)
AddTriUV(NewMesh,240,0,240,240,0,240)
end

function TIC()
cls()

GetInput()

for P=1,#NewMesh.MeshForm do
local Point=NewMesh.MeshForm[P]
local Texture=NewMesh.UVs[P]

DrawTexTri(NewMesh,Point[1],Point[2],Point[3],Point[4],Point[5],Point[6],Point[7],Point[8],Point[9],Texture[1],Texture[2],Texture[3],Texture[4],Texture[5],Texture[6])
end

ttri(0,0,86,0,0,86,0,0,0,320,320,0,1,0)
end

function AddMeshTri(mesh,x1,y1,z1,x2,y2,z2,x3,y3,z3)
table.insert(mesh.MeshForm,{x1,y1,z1,x2,y2,z2,x3,y3,z3})
end

function AddTriUV(mesh,u1,v1,u2,v2,u3,v3)
table.insert(mesh.UVs,{u1,v1,u2,v2,u3,v3})
end

function DotProduct(ax,ay,az,bx,by,bz)
return (ax*bx)+(ay*by)+(az*bz)
end

function DrawTexTri(mesh,x1,y1,z1,x2,y2,z2,x3,y3,z3,u1,v1,u2,v2,u3,v3)
--Set the Mesh Triangle position
SetPoint(TempTri.Point1,(x1-mesh.Position.PosX),(y1-mesh.Position.PosY),(z1-mesh.Position.PosZ))
SetPoint(TempTri.Point2,(x2-mesh.Position.PosX),(y2-mesh.Position.PosY),(z2-mesh.Position.PosZ))
SetPoint(TempTri.Point3,(x3-mesh.Position.PosX),(y3-mesh.Position.PosY),(z3-mesh.Position.PosZ))

--Set the Mesh Triangle rotation
SetPoint(TempTri.Point1,RotateX(TempTri.Point1.x,TempTri.Point1.y,TempTri.Point1.z,mesh.Rotation.RotX))
SetPoint(TempTri.Point2,RotateX(TempTri.Point2.x,TempTri.Point2.y,TempTri.Point2.z,mesh.Rotation.RotX))
SetPoint(TempTri.Point3,RotateX(TempTri.Point3.x,TempTri.Point3.y,TempTri.Point3.z,mesh.Rotation.RotX))

SetPoint(TempTri.Point1,RotateY(TempTri.Point1.x,TempTri.Point1.y,TempTri.Point1.z,mesh.Rotation.RotY))
SetPoint(TempTri.Point2,RotateY(TempTri.Point2.x,TempTri.Point2.y,TempTri.Point2.z,mesh.Rotation.RotY))
SetPoint(TempTri.Point3,RotateY(TempTri.Point3.x,TempTri.Point3.y,TempTri.Point3.z,mesh.Rotation.RotY))

SetPoint(TempTri.Point1,RotateZ(TempTri.Point1.x,TempTri.Point1.y,TempTri.Point1.z,mesh.Rotation.RotZ))
SetPoint(TempTri.Point2,RotateZ(TempTri.Point2.x,TempTri.Point2.y,TempTri.Point2.z,mesh.Rotation.RotZ))
SetPoint(TempTri.Point3,RotateZ(TempTri.Point3.x,TempTri.Point3.y,TempTri.Point3.z,mesh.Rotation.RotZ))

--Set the Mesh Triangle RTC Position (Relative to camera)
SetPoint(TempTri.Point1,(TempTri.Point1.x-Camera.Position.PosX),(TempTri.Point1.y-Camera.Position.PosY),(TempTri.Point1.z-Camera.Position.PosZ))
SetPoint(TempTri.Point2,(TempTri.Point2.x-Camera.Position.PosX),(TempTri.Point2.y-Camera.Position.PosY),(TempTri.Point2.z-Camera.Position.PosZ))
SetPoint(TempTri.Point3,(TempTri.Point3.x-Camera.Position.PosX),(TempTri.Point3.y-Camera.Position.PosY),(TempTri.Point3.z-Camera.Position.PosZ))

--Set the Mesh Triangle RTC Rotation (Relative to camera)
SetPoint(TempTri.Point1,RotateY(TempTri.Point1.x,TempTri.Point1.y,TempTri.Point1.z,Camera.Rotation.RotY))
SetPoint(TempTri.Point2,RotateY(TempTri.Point2.x,TempTri.Point2.y,TempTri.Point2.z,Camera.Rotation.RotY))
SetPoint(TempTri.Point3,RotateY(TempTri.Point3.x,TempTri.Point3.y,TempTri.Point3.z,Camera.Rotation.RotY))

SetPoint(TempTri.Point1,RotateX(TempTri.Point1.x,TempTri.Point1.y,TempTri.Point1.z,Camera.Rotation.RotX))
SetPoint(TempTri.Point2,RotateX(TempTri.Point2.x,TempTri.Point2.y,TempTri.Point2.z,Camera.Rotation.RotX))
SetPoint(TempTri.Point3,RotateX(TempTri.Point3.x,TempTri.Point3.y,TempTri.Point3.z,Camera.Rotation.RotX))

--Project the Mesh Triangle on the screen
--SetScreenPoint(TempTri.Point1,Project(TempTri.Point1.x,TempTri.Point1.y,TempTri.Point1.z))
--SetScreenPoint(TempTri.Point2,Project(TempTri.Point2.x,TempTri.Point2.y,TempTri.Point2.z))
--SetScreenPoint(TempTri.Point3,Project(TempTri.Point3.x,TempTri.Point3.y,TempTri.Point3.z))

if (TempTri.Point1.z > 1)or(TempTri.Point2.z > 1)or(TempTri.Point3.z > 1) then
if (TempTri.Point1.z > 1)and(TempTri.Point2.z > 1)and(TempTri.Point3.z > 1) then
--tri(TempTri.Point1.x,TempTri.Point1.y,TempTri.Point2.x,TempTri.Point2.y,TempTri.Point3.x,TempTri.Point3.y,15)
ttri(120+(focal*(TempTri.Point1.x/TempTri.Point1.z)),68+(focal*(TempTri.Point1.y/TempTri.Point1.z)),120+(focal*(TempTri.Point2.x/TempTri.Point2.z)),68+(focal*(TempTri.Point2.y/TempTri.Point2.z)),120+(focal*(TempTri.Point3.x/TempTri.Point3.z)),68+(focal*(TempTri.Point3.y/TempTri.Point3.z)),u1,v1,u2,v2,u3,v3,1,0,TempTri.Point1.z,TempTri.Point2.z,TempTri.Point3.z)
else
local VisibleVertex={}
local ClippedVertex={}

if TempTri.Point1.z > 1 then
table.insert(VisibleVertex,TempTri.Point1.x)
table.insert(VisibleVertex,TempTri.Point1.y)
table.insert(VisibleVertex,TempTri.Point1.z)
else
table.insert(ClippedVertex,TempTri.Point1.x)
table.insert(ClippedVertex,TempTri.Point1.y)
table.insert(ClippedVertex,TempTri.Point1.z)
end
if TempTri.Point2.z > 1 then
table.insert(VisibleVertex,TempTri.Point2.x)
table.insert(VisibleVertex,TempTri.Point2.y)
table.insert(VisibleVertex,TempTri.Point2.z)
else
table.insert(ClippedVertex,TempTri.Point2.x)
table.insert(ClippedVertex,TempTri.Point2.y)
table.insert(ClippedVertex,TempTri.Point2.z)
end
if TempTri.Point3.z > 1 then
table.insert(VisibleVertex,TempTri.Point3.x)
table.insert(VisibleVertex,TempTri.Point3.y)
table.insert(VisibleVertex,TempTri.Point3.z)
else
table.insert(ClippedVertex,TempTri.Point3.x)
table.insert(ClippedVertex,TempTri.Point3.y)
table.insert(ClippedVertex,TempTri.Point3.z)
end
if #VisibleVertex == 3 then
ZClipTriCaseB(ClippedVertex[1],ClippedVertex[2],ClippedVertex[3],ClippedVertex[4],ClippedVertex[5],ClippedVertex[6],VisibleVertex[1],VisibleVertex[2],VisibleVertex[3],u1,v1,u2,v2,u3,v3)
elseif #VisibleVertex == 6 then
return
ZClipTriCaseA(ClippedVertex[1],ClippedVertex[2],ClippedVertex[3],VisibleVertex[1],VisibleVertex[2],VisibleVertex[3],VisibleVertex[4],VisibleVertex[5],VisibleVertex[6],u1,v1,u2,v2,u3,v3)
end
end
end

--trace()
end

function GetInput()
local MouseX,MouseY=mouse()

if btn(0) then
Camera.Position.PosX=Camera.Position.PosX+(-sin(Camera.Rotation.RotY)/10)
Camera.Position.PosZ=Camera.Position.PosZ+(cos(Camera.Rotation.RotY)/10)
end
if btn(1) then
Camera.Position.PosX=Camera.Position.PosX-(-sin(Camera.Rotation.RotY)/10)
Camera.Position.PosZ=Camera.Position.PosZ-(cos(Camera.Rotation.RotY)/10)
end

if btn(2) then
Camera.Rotation.RotY=Camera.Rotation.RotY+0.05
end
if btn(3) then
Camera.Rotation.RotY=Camera.Rotation.RotY-0.05
end

print(cos(Camera.Rotation.RotY),2,2)
print(sin(Camera.Rotation.RotY),2,10)
end

function Lerp(a,b,t)
return (b-a)*t
end

function Project(x,y,z)
local PointX=focal*(x/z)
local PointY=focal*(y/z)

return 120+PointX,68+PointY
end

function RotateX(x,y,z,a)
return x, y*cos(a)-z*sin(a), y*sin(a)+z*cos(a)
end

function RotateY(x,y,z,a)
return z*sin(a)+x*cos(a), y, z*cos(a)-x*sin(a)
end

function RotateZ(x,y,z,a)
return x*cos(a)-y*sin(a), x*sin(a)+y*cos(a), z
end

function SetPoint(pointvar,x,y,z)
pointvar.x=x
pointvar.y=y
pointvar.z=z
end

function SetScreenPoint(pointvar,x,y)
pointvar.x=x
pointvar.y=y
end

function ZClipTriCaseA(x1,y1,z1,x2,y2,z2,x3,y3,z3,u1,v1,u2,v2,u3,v3)
local ClipedZ1=((z2-1)/(z2-z1))
local ClipedX1=120+(focal*(x2-((x2-x1)*ClipedZ1)))
local ClipedY1=68+(focal*(y2-((y2-y1)*ClipedZ1)))
local ClipedZ2=((z3-1)/(z3-z1))
local ClipedX2=120+(focal*(x3-((x3-x1)*ClipedZ2)))
local ClipedY2=68+(focal*(y3-((y3-y1)*ClipedZ2)))

ttri(ClipedX1,ClipedY1,120+(focal*(x2/z2)),68+(focal*(y2/z2)),120+(focal*(x3/z3)),68+(focal*(y3/z3)),u1,v1,u2,v2,u3,v3,1,0,z1,z2,z3)
ttri(ClipedX1,ClipedY1,ClipedX2,ClipedY2,120+(focal*(x3/z3)),68+(focal*(y3/z3)),u1,v1,u2,v2,u3,v3,1,0,z1,z2,z3)
end

function ZClipTriCaseB(x1,y1,z1,x2,y2,z2,x3,y3,z3,u1,v1,u2,v2,u3,v3)
local ClipedZ1=((z3-1)/(z3-z1))
local ClipedX1=120+(focal*(x3-((x3-x1)*ClipedZ1)))
local ClipedY1=68+(focal*(y3-((y3-y1)*ClipedZ1)))
local ClipedZ2=((z3-1)/(z3-z2))
local ClipedX2=120+(focal*(x3-((x3-x2)*ClipedZ2)))
local ClipedY2=68+(focal*(y3-((y3-y2)*ClipedZ2)))

ttri(ClipedX1,ClipedY1,ClipedX2,ClipedY2,120+(focal*(x3/z3)),68+(focal*(y3/z3)),u1,v1,u2,v2,u3,v3,1,0,z1,z2,z3)
end