I quickly realized that this clipping method could potentially create a load more polys that actually needed.
With that in mind, plus the very interesting info you gave in your last post Jim, I have come up with this.
I've spent many hours working this out, I can only hope it is infact as efficient as I would like it to be. Either way I beleive it is better that the recursive method.
Code and Exe is also attached.
;-----------------------------------------------
;
; Polygon clipping test bed / Working Clipper
;
; by Tetra, with many thanx to Jim
;
;-----------------------------------------------
Global keystop = 0
Global gfx_clip_xMin = 160
Global gfx_clip_xMax = 640 - 160
Global gfx_clip_yMin = 120
Global gfx_clip_yMax = 480 - 120
Global gfx_clip_zMin = -1500
; clipping buffers needed for clipPolygonCheck
Dim vBuff#( 15, 8 )
Global NoDrawnPols
Global goMouse = False
Graphics 640,480,32,2
SetBuffer( BackBuffer() )
Global v1x,v1y,v1z, v2x,v2y,v2z, v3x,v3y,v3z
Function SaveVertices()
fout = WriteFile( "data.dat" )
WriteInt( fout, v1x )
WriteInt( fout, v1y )
WriteInt( fout, v1z )
WriteInt( fout, v2x )
WriteInt( fout, v2y )
WriteInt( fout, v2z )
WriteInt( fout, v3x )
WriteInt( fout, v3y )
WriteInt( fout, v3z )
CloseFile( fout )
End Function
Function LoadVertices()
fin = ReadFile( "data.dat" )
If fin
v1x = ReadInt( fin )
v1y = ReadInt( fin )
v1z = ReadInt( fin )
v2x = ReadInt( fin )
v2y = ReadInt( fin )
v2z = ReadInt( fin )
v3x = ReadInt( fin )
v3y = ReadInt( fin )
v3z = ReadInt( fin )
CloseFile( fin )
Return True
EndIf
Return False
End Function
Function Main()
If KeyDown(57)
If keystop
setPoly()
keystop = False
EndIf
ElseIf KeyDown(3)
If keystop
rotatePoints()
keystop = False
EndIf
Else
keystop = True
EndIf
If KeyDown(203) Then v1x = v1x - 4
If KeyDown(205) Then v1x = v1x + 4
If KeyDown(200) Then v1y = v1y - 4
If KeyDown(208) Then v1y = v1y + 4
Select goMouse
Case 1
v1x = MouseX()
v1y = MouseY()
Case 2
v2x = MouseX()
v2y = MouseY()
Case 3
v3x = MouseX()
v3y = MouseY()
End Select
Color 0,255,0
Rect gfx_clip_xMin,gfx_clip_yMin, (gfx_clip_xMax - gfx_clip_xMin ) + 1, ( gfx_clip_yMax - gfx_clip_yMin ) + 1, 0
If inRange( MouseX(), MouseY(), v1x,v1y, 10 )
If MouseDown(1) Then goMouse = 1
Color 255,0,0
Oval v1x-9,v1y-9,19,19
Color 255,255,255
Oval v1x-9,v1y-9,19,19,0
Color 0,255,0
Text v1x-4,v1y-6,"A"
Else
Color 0,0,0
Oval v1x-9,v1y-9,19,19
Color 255,255,255
Oval v1x-9,v1y-9,19,19,0
Color 0,255,0
Text v1x-4,v1y-6,"A"
EndIf
If inRange( MouseX(), MouseY(), v2x,v2y, 10 )
If MouseDown(1) Then goMouse = 2
Color 255,0,0
Oval v2x-9,v2y-9,19,19
Color 255,255,255
Oval v2x-9,v2y-9,19,19,0
Color 0,255,0
Text v2x-4,v2y-6,"B"
Else
Color 0,0,0
Oval v2x-9,v2y-9,19,19
Color 255,255,255
Oval v2x-9,v2y-9,19,19,0
Color 0,255,0
Text v2x-4,v2y-6,"B"
EndIf
If inRange( MouseX(), MouseY(), v3x,v3y, 10 )
If MouseDown(1) Then goMouse = 3
Color 255,0,0
Oval v3x-9,v3y-9,19,19
Color 255,255,255
Oval v3x-9,v3y-9,19,19,0
Color 0,255,0
Text v3x-4,v3y-6,"C"
Else
Color 0,0,0
Oval v3x-9,v3y-9,19,19
Color 255,255,255
Oval v3x-9,v3y-9,19,19,0
Color 0,255,0
Text v3x-4,v3y-6,"C"
EndIf
NoDrawnPols = 0
If ( TriangleArea( v1x,v1y, v2x,v2y, v3x,v3y ) < 0 )
Color 255,0,0
Line v1x,v1y, v2x,v2y
Color 0,255,0
Line v2x,v2y, v3x,v3y
Color 0,0,255
Line v3x,v3y, v1x,v1y
clipPolygonCheck( v1x,v1y,v1z, v2x,v2y,v2z, v3x,v3y,v3z, 255,0,0, 0,255,0, 0,0,255 )
For x = 0 To 14
tx = x
If (vBuff( x, 6 ) <> 0 )
Color 255,255,0
Oval vBuff( x, 0 ) - 2, vBuff( x, 1 ) - 2, 5,5
Color 0,0,0
Rect vBuff( x, 0 ) + 4, vBuff( x, 1 ) - 14, 18, 14
Color vBuff( x, 3 ),vBuff( x, 4 ),vBuff( x, 5 )
Text vBuff( x, 0 ) + 4, vBuff( x, 1 ) - 14, "i"+tx;+":"+Int(cXT( x, 6 ))
EndIf
vBuff( x, 0 ) = 0
vBuff( x, 1 ) = 0
vBuff( x, 6 ) = 0
Next
EndIf
If Not MouseDown(1) Then goMouse = 0
Color 255,255,255
Text 10,10,"Drawn Polygons: "+NoDrawnPols
Text 10,25,"Spacebar for random Polygon, arrow keys move A"
Text 10,40, "Left click to move verticies, 2 to rotate"
Flip
Cls
End Function
Function inRange( x1,y1, x2,y2, dist )
If ( Abs( x2 - x1 ) < dist )And( Abs( y2 - y1 ) < dist )
Return True
Else
Return False
EndIf
End Function
Function setPoly()
SeedRnd MilliSecs()
Local go = 1
While go > 0
v1x = 320 + (Rand( 640 )-320)
v1y = 240 + (Rand( 480 )-240)
v1z = -2000
v2x = 320 + (Rand( 640 )-320)
v2y = 240 + (Rand( 480 )-240)
v2z = -2000
v3x = 320 + (Rand( 640 )-320)
v3y = 240 + (Rand( 480 )-240)
v3z = -2000
go = TriangleArea( v1x,v1y, v2x,v2y, v3x,v3y )
Wend
End Function
Function rotatePoints()
Local tx,ty,tz
tx = v1x
ty = v1y
tz = v1z
v1x = v2x
v1y = v2y
v1z = v2z
v2x = v3x
v2y = v3y
v2z = v3z
v3x = tx
v3y = ty
v3z = tz
End Function
;any polygon passing through here does not need clipping
Function renderPoly( xA#,yA#,zA#, xB#,yB#,zB#, xC#,yC#,zC#, rA,gA,bA, rB,gB,bB, rC,gC,bC )
NoDrawnPols = NoDrawnPols + 1
If TriangleArea( xA,yA, xB,yB, xC,yC ) < 0
Color 255,255,255
Line xA,yA, xB,yB
Line xB,yB, xC,yC
Line xC,yC, xA,yA
Else
Color 255,0,0
Line xA,yA, xB,yB
Line xB,yB, xC,yC
Line xC,yC, xA,yA
EndIf
;Color rA,gA,bA
;Line xA,yA, xB,yB
;Color rB,gB,bB
;Line xB,yB, xC,yC
;Color rC,gC,bC
;Line xC,yC, xA,yA
End Function
;---------------------------------------------------------------------------------------------------------
; Clipping stuff
Function TriangleArea( xA,yA, xB,yB, xC,yC )
Return ((xA - xB)*(yC - yB)) - ((yA - yB)*(xC - xB))
End Function
;Â Â Â |Â Â Â Â Â |
;Â $5 |Â Â $4Â Â | $6
;-----|---------|-----
;Â Â Â |Â Â Â Â Â |
;Â $1 |Â Screen | $2
;   |  Area |
;-----|---------|-----
;Â $9 |Â Â $8Â Â | $A
;Â Â Â |Â Â Â Â Â |
;---------------------------------------
;
;
Function ClipPos( xA#,yA# )
Local clip% = 0
If ( xA < gfx_clip_xMin ) Then clip% = clip% Or $1
If ( xA > gfx_clip_xMax ) Then clip% = clip% Or $2
If ( yA < gfx_clip_yMin ) Then clip% = clip% Or $4
If ( yA > gfx_clip_yMax ) Then clip% = clip% Or $8
Return clip
End Function
;---------------------------------------
;
;
Function ClipPosX( xA# )
Local clip% = 0
If ( xA < gfx_clip_xMin ) Then clip% = clip% Or $1
If ( xA > gfx_clip_xMax ) Then clip% = clip% Or $2
Return clip
End Function
;---------------------------------------
;
;
Function ClipPosY( yA# )
Local clip% = 0
If ( yA < gfx_clip_yMin ) Then clip% = clip% Or $4
If ( yA > gfx_clip_yMax ) Then clip% = clip% Or $8
Return clip
End Function
;---------------------------------------
;
;
Function clipPolygonCheck( xA#,yA#,zA#, xB#,yB#,zB#, xC#,yC#,zC#, rA,gA,bA, rB,gB,bB, rC,gC,bC )
Local edgeAB
Local edgeBC
Local edgeCA
Local edgeABx
Local edgeABy
Local edgeBCx
Local edgeBCy
Local edgeCAx
Local edgeCAy
vertexA% = ClipPos( xA, yA )
vertexB% = ClipPos( xB, yB )
vertexC% = ClipPos( xC, yC )
; Polygon does not need clipping
If ( vertexA + vertexB + vertexC = 0 )
renderPoly( xA,yA,zA, xB,yB,zB, xC,yC,zC, rA,gA,bA, rB,gB,bB, rC,gC,bC )
Return
EndIf
edgeAB = vertexA Xor vertexB
edgeBC = vertexB Xor vertexC
edgeCA = vertexC Xor vertexA
edgeABx = ( edgeAB And $3 )
edgeABy = ( edgeAB And $C )
edgeBCx = ( edgeBC And $3 )
edgeBCy = ( edgeBC And $C )
edgeCAx = ( edgeCA And $3 )
edgeCAy = ( edgeCA And $C )
; Clip A -> B
Select edgeABx
Case $1
ClipX( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_xMin, 0 )
Case $2
ClipX( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_xMax, 1 )
Case $3
ClipX( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_xMin, 0 )
ClipX( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_xMax, 1 )
End Select
Select edgeABy
Case $4
ClipY( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_yMin, 2 )
Case $8
ClipY( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_yMax, 3 )
Case $C
ClipY( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_yMin, 2 )
ClipY( xA,yA,zA, xB,yB,zB, rA,gA,bA, rB,gB,bB, gfx_clip_yMax, 3 )
End Select
; Clip B -> C
Select edgeBCx
Case $1
ClipX( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_xMin, 4 )
Case $2
ClipX( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_xMax, 5 )
Case $3
ClipX( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_xMin, 4 )
ClipX( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_xMax, 5 )
End Select
Select edgeBCy
Case $4
ClipY( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_yMin, 6 )
Case $8
ClipY( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_yMax, 7 )
Case $C
ClipY( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_yMin, 6 )
ClipY( xB,yB,zB, xC,yC,zC, rB,gB,bB, rC,gC,bC, gfx_clip_yMax, 7 )
End Select
; Clip C -> A
Select edgeCAx
Case $1
ClipX( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_xMin, 8 )
Case $2
ClipX( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_xMax, 9 )
Case $3
ClipX( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_xMin, 8 )
ClipX( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_xMax, 9 )
End Select
Select edgeCAy
Case $4
ClipY( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_yMin, 10 )
Case $8
ClipY( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_yMax, 11 )
Case $C
ClipY( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_yMin, 10 )
ClipY( xC,yC,zC, xA,yA,zA, rC,gC,bC, rA,gA,bA, gfx_clip_yMax, 11 )
End Select
Local selLeft = ( vBuff( 0, 6 ) Shl 8 ) Or ( vBuff( 4, 6 ) Shl 4 ) Or vBuff( 8, 6 )
Select selLeft
;top left
Case 1840
ClipInternal( 0, 4, gfx_clip_yMin )
Case 775
ClipInternal( 8, 0, gfx_clip_yMin )
Case 115
ClipInternal( 4, 8, gfx_clip_yMin )
Case 1795
ClipInternal( 0, 8, gfx_clip_yMin )
Case 55
ClipInternal( 8, 4, gfx_clip_yMin )
Case 880
ClipInternal( 4, 0, gfx_clip_yMin )
;bottom left
Case 944
ClipInternal( 4, 0, gfx_clip_yMax )
Case 2819
ClipInternal( 0, 8, gfx_clip_yMax )
Case 59
ClipInternal( 8, 4, gfx_clip_yMax )
Case 779
ClipInternal( 8, 0, gfx_clip_yMax )
Case 179
ClipInternal( 4, 8, gfx_clip_yMax )
Case 2864
ClipInternal( 0, 4, gfx_clip_yMax )
;top & bottom left
Case 1803
ClipInternal( 0, 8, gfx_clip_yMin )
ClipInternal( 8, 0, gfx_clip_yMax )
Case 183
ClipInternal( 8, 4, gfx_clip_yMin )
ClipInternal( 4, 8, gfx_clip_yMax )
Case 2928
ClipInternal( 4, 0, gfx_clip_yMin )
ClipInternal( 0, 4, gfx_clip_yMax )
Case 1968
ClipInternal( 0, 4, gfx_clip_yMin )
ClipInternal( 4, 0, gfx_clip_yMax )
Case 2823
ClipInternal( 8, 0, gfx_clip_yMin )
ClipInternal( 0, 8, gfx_clip_yMax )
Case 123
ClipInternal( 4, 8, gfx_clip_yMin )
ClipInternal( 8, 4, gfx_clip_yMax )
;remove unwanted vertices
Case 2992
vBuff( 0, 6 ) = 0
vBuff( 4, 6 ) = 0
Case 1904
vBuff( 0, 6 ) = 0
vBuff( 4, 6 ) = 0
Case 2827
vBuff( 8, 6 ) = 0
vBuff( 0, 6 ) = 0
Case 1799
vBuff( 8, 6 ) = 0
vBuff( 0, 6 ) = 0
Case 187
vBuff( 4, 6 ) = 0
vBuff( 8, 6 ) = 0
Case 119
vBuff( 4, 6 ) = 0
vBuff( 8, 6 ) = 0
End Select
Local selRight = ( vBuff( 1, 6 ) Shl 8 ) Or ( vBuff( 5, 6 ) Shl 4 ) Or vBuff( 9, 6 )
Select selRight
;top right
Case 1840
ClipInternal( 1, 5, gfx_clip_yMin )
Case 775
ClipInternal( 9, 1, gfx_clip_yMin )
Case 115
ClipInternal( 5, 9, gfx_clip_yMin )
Case 1795
ClipInternal( 1, 9, gfx_clip_yMin )
Case 55
ClipInternal( 9, 5, gfx_clip_yMin )
Case 880
ClipInternal( 5, 1, gfx_clip_yMin )
;bottom right
Case 944
ClipInternal( 5, 1, gfx_clip_yMax )
Case 2819
ClipInternal( 1, 9, gfx_clip_yMax )
Case 59
ClipInternal( 9, 5, gfx_clip_yMax )
Case 779
ClipInternal( 9, 1, gfx_clip_yMax )
Case 179
ClipInternal( 5, 9, gfx_clip_yMax )
Case 2864
ClipInternal( 1, 5, gfx_clip_yMax )
;top & bottom right
Case 1803
ClipInternal( 1, 9, gfx_clip_yMin )
ClipInternal( 9, 1, gfx_clip_yMax )
Case 183
ClipInternal( 9, 5, gfx_clip_yMin )
ClipInternal( 5, 9, gfx_clip_yMax )
Case 2928
ClipInternal( 5, 1, gfx_clip_yMin )
ClipInternal( 1, 5, gfx_clip_yMax )
Case 1968
ClipInternal( 1, 5, gfx_clip_yMin )
ClipInternal( 5, 1, gfx_clip_yMax )
Case 2823
ClipInternal( 9, 1, gfx_clip_yMin )
ClipInternal( 1, 9, gfx_clip_yMax )
Case 123
ClipInternal( 5, 9, gfx_clip_yMin )
ClipInternal( 9, 5, gfx_clip_yMax )
;remove unwanted vertices
Case 2992
vBuff( 1, 6 ) = 0
vBuff( 5, 6 ) = 0
Case 1904
vBuff( 1, 6 ) = 0
vBuff( 5, 6 ) = 0
Case 2827
vBuff( 9, 6 ) = 0
vBuff( 1, 6 ) = 0
Case 1799
vBuff( 9, 6 ) = 0
vBuff( 1, 6 ) = 0
Case 187
vBuff( 5, 6 ) = 0
vBuff( 9, 6 ) = 0
Case 119
vBuff( 5, 6 ) = 0
vBuff( 9, 6 ) = 0
End Select
Local PBuff[8]
Local NumberOfVertices = 0
Local LastV = 0
If KeyDown(7) Stop
; Edge A -> B
If ( vertexA = 0 )
vBuff( 12, 0 ) = xA#
vBuff( 12, 1 ) = yA#
vBuff( 12, 2 ) = zA#
vBuff( 12, 3 ) = rA
vBuff( 12, 4 ) = gA
vBuff( 12, 5 ) = bA
vBuff( 12, 6 ) = 0
PBuff[ NumberOfVertices ] = 12
NumberOfVertices = NumberOfVertices + 1
EndIf
LastV = NumberOfVertices
For i = 0 To 3
If ( vBuff( i, 6 ) > 0 ) Then
If ( LastV <> NumberOfVertices )
If ( vBuff( i, 7 ) > vBuff( PBuff[ NumberOfVertices - 1 ], 7 ) )
PBuff[ NumberOfVertices ] = i
NumberOfVertices = NumberOfVertices + 1
Else
PBuff[ NumberOfVertices ] = PBuff[ NumberOfVertices - 1 ]
PBuff[ NumberOfVertices - 1 ] = i
NumberOfVertices = NumberOfVertices + 1
EndIf
Else
PBuff[ NumberOfVertices ] = i
NumberOfVertices = NumberOfVertices + 1
EndIf
EndIf
Next
; Edge B -> C
If ( vertexB = 0 )
vBuff( 13, 0 ) = xB#
vBuff( 13, 1 ) = yB#
vBuff( 13, 2 ) = zB#
vBuff( 13, 3 ) = rB
vBuff( 13, 4 ) = gB
vBuff( 13, 5 ) = bB
vBuff( 13, 6 ) = 0
PBuff[ NumberOfVertices ] = 13
NumberOfVertices = NumberOfVertices + 1
EndIf
LastV = NumberOfVertices
For i = 4 To 7
If ( vBuff( i, 6 ) > 0 ) Then
If ( LastV <> NumberOfVertices )
If ( vBuff( i, 7 ) > vBuff( PBuff[ NumberOfVertices - 1 ], 7 ) )
PBuff[ NumberOfVertices ] = i
NumberOfVertices = NumberOfVertices + 1
Else
PBuff[ NumberOfVertices ] = PBuff[ NumberOfVertices - 1 ]
PBuff[ NumberOfVertices - 1 ] = i
NumberOfVertices = NumberOfVertices + 1
EndIf
Else
PBuff[ NumberOfVertices ] = i
NumberOfVertices = NumberOfVertices + 1
EndIf
EndIf
Next
; Edge C -> A
If ( vertexC = 0 )
vBuff( 14, 0 ) = xC#
vBuff( 14, 1 ) = yC#
vBuff( 14, 2 ) = zC#
vBuff( 14, 3 ) = rC
vBuff( 14, 4 ) = gC
vBuff( 14, 5 ) = bC
vBuff( 14, 6 ) = 0
PBuff[ NumberOfVertices ] = 14
NumberOfVertices = NumberOfVertices + 1
EndIf
LastV = NumberOfVertices
For i = 8 To 11
If ( vBuff( i, 6 ) > 0 ) Then
If ( LastV <> NumberOfVertices )
If ( vBuff( i, 7 ) > vBuff( PBuff[ NumberOfVertices - 1 ], 7 ) )
PBuff[ NumberOfVertices ] = i
NumberOfVertices = NumberOfVertices + 1
Else
PBuff[ NumberOfVertices ] = PBuff[ NumberOfVertices - 1 ]
PBuff[ NumberOfVertices - 1 ] = i
NumberOfVertices = NumberOfVertices + 1
EndIf
Else
PBuff[ NumberOfVertices ] = i
NumberOfVertices = NumberOfVertices + 1
EndIf
EndIf
Next
Select NumberOfVertices
Case 3
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[1], 0 ),vBuff( PBuff[1], 1 ),vBuff( PBuff[1], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[1], 4 ),vBuff( PBuff[1], 5 ),vBuff( PBuff[1], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ) )
Case 4
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[1], 0 ),vBuff( PBuff[1], 1 ),vBuff( PBuff[1], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[1], 4 ),vBuff( PBuff[1], 5 ),vBuff( PBuff[1], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ) )
Case 5
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[1], 0 ),vBuff( PBuff[1], 1 ),vBuff( PBuff[1], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[1], 4 ),vBuff( PBuff[1], 5 ),vBuff( PBuff[1], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[4], 0 ),vBuff( PBuff[4], 1 ),vBuff( PBuff[4], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ), vBuff( PBuff[4], 4 ),vBuff( PBuff[4], 5 ),vBuff( PBuff[4], 6 ) )
Case 6
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[1], 0 ),vBuff( PBuff[1], 1 ),vBuff( PBuff[1], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[1], 4 ),vBuff( PBuff[1], 5 ),vBuff( PBuff[1], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[5], 0 ),vBuff( PBuff[5], 1 ),vBuff( PBuff[5], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ), vBuff( PBuff[5], 4 ),vBuff( PBuff[5], 5 ),vBuff( PBuff[5], 6 ) )
renderPoly( vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[4], 0 ),vBuff( PBuff[4], 1 ),vBuff( PBuff[4], 2 ), vBuff( PBuff[5], 0 ),vBuff( PBuff[5], 1 ),vBuff( PBuff[5], 2 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ), vBuff( PBuff[4], 4 ),vBuff( PBuff[4], 5 ),vBuff( PBuff[4], 6 ), vBuff( PBuff[5], 4 ),vBuff( PBuff[5], 5 ),vBuff( PBuff[5], 6 ) )
Case 7
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[1], 0 ),vBuff( PBuff[1], 1 ),vBuff( PBuff[1], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[1], 4 ),vBuff( PBuff[1], 5 ),vBuff( PBuff[1], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[2], 0 ),vBuff( PBuff[2], 1 ),vBuff( PBuff[2], 2 ), vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[2], 4 ),vBuff( PBuff[2], 5 ),vBuff( PBuff[2], 6 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[5], 0 ),vBuff( PBuff[5], 1 ),vBuff( PBuff[5], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ), vBuff( PBuff[5], 4 ),vBuff( PBuff[5], 5 ),vBuff( PBuff[5], 6 ) )
renderPoly( vBuff( PBuff[3], 0 ),vBuff( PBuff[3], 1 ),vBuff( PBuff[3], 2 ), vBuff( PBuff[4], 0 ),vBuff( PBuff[4], 1 ),vBuff( PBuff[4], 2 ), vBuff( PBuff[5], 0 ),vBuff( PBuff[5], 1 ),vBuff( PBuff[5], 2 ), vBuff( PBuff[3], 4 ),vBuff( PBuff[3], 5 ),vBuff( PBuff[3], 6 ), vBuff( PBuff[4], 4 ),vBuff( PBuff[4], 5 ),vBuff( PBuff[4], 6 ), vBuff( PBuff[5], 4 ),vBuff( PBuff[5], 5 ),vBuff( PBuff[5], 6 ) )
renderPoly( vBuff( PBuff[0], 0 ),vBuff( PBuff[0], 1 ),vBuff( PBuff[0], 2 ), vBuff( PBuff[5], 0 ),vBuff( PBuff[5], 1 ),vBuff( PBuff[5], 2 ), vBuff( PBuff[6], 0 ),vBuff( PBuff[6], 1 ),vBuff( PBuff[6], 2 ), vBuff( PBuff[0], 4 ),vBuff( PBuff[0], 5 ),vBuff( PBuff[0], 6 ), vBuff( PBuff[5], 4 ),vBuff( PBuff[5], 5 ),vBuff( PBuff[5], 6 ), vBuff( PBuff[6], 4 ),vBuff( PBuff[6], 5 ),vBuff( PBuff[6], 6 ) )
End Select
End Function
;---------------------------------------
;
;
Function ClipInternal( a, b, gfx_clip# )
Local Ratio#
Ratio# = Float( gfx_clip - vBuff( a, 1 ) ) / Float(vBuff( b, 1 ) - vBuff( a, 1 ))
vBuff( a, 1 ) = vBuff( a, 1 ) + ( Ratio# * (vBuff( b, 1 ) - vBuff( a, 1 )) )
vBuff( a, 2 ) = vBuff( a, 2 ) + ( Ratio# * (vBuff( b, 2 ) - vBuff( a, 2 )) )
vBuff( a, 3 ) = vBuff( a, 3 ) + ( Ratio# * (vBuff( b, 3 ) - vBuff( a, 3 )) )
vBuff( a, 4 ) = vBuff( a, 4 ) + ( Ratio# * (vBuff( b, 4 ) - vBuff( a, 4 )) )
vBuff( a, 5 ) = vBuff( a, 5 ) + ( Ratio# * (vBuff( b, 5 ) - vBuff( a, 5 )) )
vBuff( a, 6 ) = $5
End Function
;---------------------------------------
;
;
Function ClipX( xA#,yA#,zA#, xB#,yB#,zB#, rA,gA,bA, rB,gB,bB, gfx_clip#, tmpIndex )
Local Ratio#
Ratio# = Float( gfx_clip - xA ) / Float(xB - xA)
vBuff( tmpIndex, 0 ) = gfx_clip#
vBuff( tmpIndex, 1 ) = yA + ( Ratio# * (yB - yA) )
vBuff( tmpIndex, 2 ) = zA + ( Ratio# * (zB - zA) )
vBuff( tmpIndex, 3 ) = rA + ( Ratio# * (rB - rA) )
vBuff( tmpIndex, 4 ) = gA + ( Ratio# * (gB - gA) )
vBuff( tmpIndex, 5 ) = bA + ( Ratio# * (bB - bA) )
vBuff( tmpIndex, 6 ) = ClipPosY( vBuff( tmpIndex, 1 ) ) Xor $3
vBuff( tmpIndex, 7 ) = Ratio#
End Function
;---------------------------------------
;
;
Function ClipY( xA#,yA#,zA#, xB#,yB#,zB#, rA,gA,bA, rB,gB,bB, gfx_clip#, tmpIndex )
Local Ratio#
Ratio# = Float( gfx_clip - yA ) / Float(yB - yA)
vBuff( tmpIndex, 0 ) = xA + ( Ratio# * (xB - xA) )
vBuff( tmpIndex, 6 ) = ClipPosX( vBuff( tmpIndex, 0 ) ) Xor $C
; dont bother if its not used
If ( vBuff( tmpIndex, 6 ) = $C )
vBuff( tmpIndex, 1 ) = gfx_clip#
vBuff( tmpIndex, 2 ) = zA + ( Ratio# * (zB - zA) )
vBuff( tmpIndex, 3 ) = rA + ( Ratio# * (rB - rA) )
vBuff( tmpIndex, 4 ) = gA + ( Ratio# * (gB - gA) )
vBuff( tmpIndex, 5 ) = bA + ( Ratio# * (bB - bA) )
vBuff( tmpIndex, 7 ) = Ratio#
Else
vBuff( tmpIndex, 6 ) = 0
EndIf
End Function
;------------------------------------------------- END CLIPPING STUFF -----------------------------
;---------------------------------------
; Main Program
;
If Not LoadVertices() Then setPoly()
While Not KeyDown(1)
Main()
Wend
SaveVertices()
End