Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local function drawFlatTriangle(ZBUFFER,px1,px2,y,color,v1,v2,v3,inV1,inV2,inV3)
- local xStart = math.ceil(px1-0.5)
- local xEnd = math.ceil(px2-0.5)
- local sxStart = intY(inV1,inV2,y)
- local sxEnd = intY(inV1,inV3,y)
- local p1 = vector.new(sxStart,y)
- local p2 = vector.new(sxEnd,y)
- local t1 = getT(inV1,inV2,p1)
- local t2 = getT(inV1,inV3,p2)
- local z1 = lerp(inV1.w,inV2.w,t1)
- local z2 = lerp(inV1.w,inV3.w,t2)
- for x = xStart, xEnd do
- if y > 0 and x > 0 then
- local t3 = (x - sxStart) / (sxEnd - sxStart)
- local wCur = math.floor(lerp(z1,z2,t3))
- if not ZBUFFER[x][y] then ZBUFFER[x][y] = {w=math.huge} end
- if wCur <= ZBUFFER[x][y].w or ZBUFFER[x][y].w == math.huge then
- ZBUFFER[x][y] = {
- color=color,
- w=wCur
- }
- end
- end
- end
- end
- local function drawFlatTopTriangle(ZBUFFER,vec1,vec2,vec3,color,insVec1,insVec2,insVec3)
- local m1 = (vec3.x - vec1.x) / (vec3.y - vec1.y)
- local m2 = (vec3.x - vec2.x) / (vec3.y - vec2.y)
- local yStart = math.ceil(vec1.y - 0.5)
- local yEnd = math.ceil(vec3.y - 0.5)-1
- for y = yStart, yEnd do
- local px1 = m1 * (y + 0.5 - vec1.y) + vec1.x
- local px2 = m2 * (y + 0.5 - vec2.y) + vec2.x
- drawFlatTriangle(ZBUFFER,px1,px2,y,color,vec1,vec2,vec3,insVec1,insVec2,insVec3)
- end
- end
- local function drawFlatBottomTriangle( ZBUFFER,vec1,vec2,vec3,color,insVec1,insVec2,insVec3)
- local m1 = (vec2.x - vec1.x) / (vec2.y - vec1.y)
- local m2 = (vec3.x - vec1.x) / (vec3.y - vec1.y)
- local yStart = math.ceil(vec1.y-0.5)
- local yEnd = math.ceil(vec3.y-0.5)-1
- for y = yStart, yEnd do
- local px1 = m1 * (y + 0.5 - vec1.y) + vec1.x
- local px2 = m2 * (y + 0.5 - vec1.y) + vec1.x
- drawFlatTriangle(ZBUFFER,px1,px2,y,color,vec1,vec2,vec3,insVec1,insVec2,insVec3)
- end
- end
- local function proccesSolidTriangle(ZBUFFER,vec1,vec2,vec3,color)
- local pv1 = vec1
- local pv2 = vec2
- local pv3 = vec3
- if pv2.y < pv1.y then pv1,pv2 = pv2,pv1 end
- if pv3.y < pv2.y then pv2,pv3 = pv3,pv2 end
- if pv2.y < pv1.y then pv1,pv2 = pv2,pv1 end
- if pv1.y == pv2.y then
- if pv2.x < pv1.x then pv1,pv2 = pv2,pv1 end
- drawFlatTopTriangle(ZBUFFER,pv1,pv2,pv3,color,vec1,vec2,vec3)
- elseif pv2.y == pv3.y then
- if pv3.x < pv2.x then pv3,pv2 = pv2,pv3 end
- drawFlatBottomTriangle(ZBUFFER,pv1,pv2,pv3,color,vec1,vec2,vec3)
- else
- local alphaSplit = (pv2.y-pv1.y)/(pv3.y-pv1.y)
- local vi ={
- x = pv1.x + ((pv3.x - pv1.x) * alphaSplit),
- y = pv1.y + ((pv3.y - pv1.y) * alphaSplit), }
- if pv2.x < vi.x then
- drawFlatBottomTriangle(ZBUFFER,pv1,pv2,vi,color,vec1,vec2,vec3)
- drawFlatTopTriangle(ZBUFFER,pv2,vi,pv3,color,vec1,vec2,vec3)
- else
- drawFlatBottomTriangle(ZBUFFER,pv1,vi,pv2,color,vec1,vec2,vec3)
- drawFlatTopTriangle(ZBUFFER,vi,pv2,pv3,color,vec1,vec2,vec3)
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement