Advertisement
9551

TriangleZbuffering

Nov 6th, 2021
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.10 KB | None | 0 0
  1. local function drawFlatTriangle(ZBUFFER,px1,px2,y,color,v1,v2,v3,inV1,inV2,inV3)
  2.     local xStart = math.ceil(px1-0.5)
  3.     local xEnd =   math.ceil(px2-0.5)
  4.     local sxStart = intY(inV1,inV2,y)
  5.     local sxEnd = intY(inV1,inV3,y)
  6.     local p1 = vector.new(sxStart,y)
  7.     local p2 = vector.new(sxEnd,y)
  8.     local t1 = getT(inV1,inV2,p1)
  9.     local t2 = getT(inV1,inV3,p2)
  10.     local z1 = lerp(inV1.w,inV2.w,t1)
  11.     local z2 = lerp(inV1.w,inV3.w,t2)
  12.     for x = xStart, xEnd do
  13.         if y > 0 and x > 0 then
  14.             local t3 = (x - sxStart) / (sxEnd - sxStart)
  15.             local wCur = math.floor(lerp(z1,z2,t3))
  16.             if not ZBUFFER[x][y] then ZBUFFER[x][y] = {w=math.huge} end
  17.             if wCur <= ZBUFFER[x][y].w or ZBUFFER[x][y].w == math.huge then
  18.                 ZBUFFER[x][y] = {
  19.                     color=color,
  20.                     w=wCur
  21.                 }
  22.             end
  23.         end
  24.     end
  25. end
  26. local function drawFlatTopTriangle(ZBUFFER,vec1,vec2,vec3,color,insVec1,insVec2,insVec3)
  27.     local m1 = (vec3.x - vec1.x) / (vec3.y - vec1.y)
  28.     local m2 = (vec3.x - vec2.x) / (vec3.y - vec2.y)
  29.     local yStart = math.ceil(vec1.y - 0.5)
  30.     local yEnd =   math.ceil(vec3.y - 0.5)-1
  31.     for y = yStart, yEnd do
  32.         local px1 = m1 * (y + 0.5 - vec1.y) + vec1.x
  33.         local px2 = m2 * (y + 0.5 - vec2.y) + vec2.x
  34.         drawFlatTriangle(ZBUFFER,px1,px2,y,color,vec1,vec2,vec3,insVec1,insVec2,insVec3)
  35.     end
  36. end
  37. local function drawFlatBottomTriangle( ZBUFFER,vec1,vec2,vec3,color,insVec1,insVec2,insVec3)
  38.     local m1 = (vec2.x - vec1.x) / (vec2.y - vec1.y)
  39.     local m2 = (vec3.x - vec1.x) / (vec3.y - vec1.y)
  40.     local yStart = math.ceil(vec1.y-0.5)
  41.     local yEnd =   math.ceil(vec3.y-0.5)-1
  42.     for y = yStart, yEnd do
  43.         local px1 = m1 * (y + 0.5 - vec1.y) + vec1.x
  44.         local px2 = m2 * (y + 0.5 - vec1.y) + vec1.x
  45.         drawFlatTriangle(ZBUFFER,px1,px2,y,color,vec1,vec2,vec3,insVec1,insVec2,insVec3)
  46.     end
  47. end
  48. local function proccesSolidTriangle(ZBUFFER,vec1,vec2,vec3,color)
  49.     local pv1 = vec1
  50.     local pv2 = vec2
  51.     local pv3 = vec3
  52.     if pv2.y < pv1.y then pv1,pv2 = pv2,pv1 end
  53.     if pv3.y < pv2.y then pv2,pv3 = pv3,pv2 end
  54.     if pv2.y < pv1.y then pv1,pv2 = pv2,pv1 end
  55.     if pv1.y == pv2.y then
  56.         if pv2.x < pv1.x then pv1,pv2 = pv2,pv1 end
  57.         drawFlatTopTriangle(ZBUFFER,pv1,pv2,pv3,color,vec1,vec2,vec3)
  58.     elseif pv2.y == pv3.y then
  59.         if pv3.x < pv2.x then pv3,pv2 = pv2,pv3 end
  60.         drawFlatBottomTriangle(ZBUFFER,pv1,pv2,pv3,color,vec1,vec2,vec3)
  61.     else
  62.         local alphaSplit = (pv2.y-pv1.y)/(pv3.y-pv1.y)
  63.         local vi ={
  64.             x = pv1.x + ((pv3.x - pv1.x) * alphaSplit),      
  65.             y = pv1.y + ((pv3.y - pv1.y) * alphaSplit), }
  66.         if pv2.x < vi.x then
  67.             drawFlatBottomTriangle(ZBUFFER,pv1,pv2,vi,color,vec1,vec2,vec3)
  68.             drawFlatTopTriangle(ZBUFFER,pv2,vi,pv3,color,vec1,vec2,vec3)
  69.         else
  70.             drawFlatBottomTriangle(ZBUFFER,pv1,vi,pv2,color,vec1,vec2,vec3)
  71.             drawFlatTopTriangle(ZBUFFER,vi,pv2,pv3,color,vec1,vec2,vec3)
  72.         end
  73.     end
  74. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement