BlitzCoder Essentials
•
Home Page
•
About BlitzCoder
•
Contributors
•
Terms of Use
•
Email Us
Main Areas
•
BlitzCoder Chat
•
Discussions
•
Articles/Tutorials
•
Code Database
•
Link Database
•
Showcase Area
•
Worklogs
•
Competitions
Special Areas
•
Undocumented
Other Blitz Sites
•
Blitz Basic Home
•
Blitz Showcase
•
BlitzPlay Library
Forum Login
Username:
Password:
•
Register Now!
BlitzCoder Code Archives Page
Main Codes Page
"Polygon Clipping code for my texture mapper"
, by paranoidpete
Use this in conjunction with my texture mapper to clip to the screen boundaries. (Warning - this is pretty slow)
Code
Include "texturemapper0.bb" Global gwidth=GraphicsWidth(), gheight=GraphicsHeight() Function TexturePolygonClip(x0,y0,u0,v0,x1,y1,u1,v1,x2,y2,u2,v2,tex.image) Delete Each cliplista AddClipLA(x0,y0,u0,v0) AddClipLA(x1,y1,u1,v1) AddClipLA(x2,y2,u2,v2) ;left Delete Each cliplistb vaa.cliplista=Last cliplista vab.cliplista=First cliplista Repeat If vaa\x>0 If vab\x>0 AddClipLB(vab\x,vab\y,vab\u,vab\v) Else y=vaa\y+((vab\y-vaa\y)/(vab\x-vaa\x-0.0000001))*(-vaa\x) u=vaa\u+((vab\u-vaa\u)/(vab\x-vaa\x-0.0000001))*(-vaa\x) v=vaa\v+((vab\v-vaa\v)/(vab\x-vaa\x-0.0000001))*(-vaa\x) AddClipLB(0,y,u,v) EndIf Else If vab\x>0 y=vaa\y+((vab\y-vaa\y)/(vab\x-vaa\x-0.0000001))*(-vaa\x) u=vaa\u+((vab\u-vaa\u)/(vab\x-vaa\x-0.0000001))*(-vaa\x) v=vaa\v+((vab\v-vaa\v)/(vab\x-vaa\x-0.0000001))*(-vaa\x) AddClipLB(0,y,u,v) AddClipLB(vab\x,vab\y,vab\u,vab\v) EndIf EndIf vaa=vab vab=After vab Until vab=Null num=0 For clipb.cliplistb=Each cliplistb num=num+1 Next If num<3 Return ;right Delete Each cliplista vba.cliplistb=Last cliplistb vbb.cliplistb=First cliplistb Repeat If vba\x<(gwidth-1) If vbb\x<(gwidth-1) AddClipLA(vbb\x,vbb\y,vbb\u,vbb\v) Else y=vba\y+((vbb\y-vba\y)/(vbb\x-vba\x-0.0000001))*(-vba\x+gwidth-1) u=vba\u+((vbb\u-vba\u)/(vbb\x-vba\x-0.0000001))*(-vba\x+gwidth-1) v=vba\v+((vbb\v-vba\v)/(vbb\x-vba\x-0.0000001))*(-vba\x+gwidth-1) AddClipLA((gwidth-1),y,u,v) EndIf Else If vbb\x<(gwidth-1) y=vba\y+((vbb\y-vba\y)/(vbb\x-vba\x-0.0000001))*(-vba\x+gwidth-1) u=vba\u+((vbb\u-vba\u)/(vbb\x-vba\x-0.0000001))*(-vba\x+gwidth-1) v=vba\v+((vbb\v-vba\v)/(vbb\x-vba\x-0.0000001))*(-vba\x+gwidth-1) AddClipLA((gwidth-1),y,u,v) AddClipLA(vbb\x,vbb\y,vbb\u,vbb\v) EndIf EndIf vba=vbb vbb=After vbb Until vbb=Null num=0 For clipa.cliplista=Each cliplista num=num+1 Next If num<3 Return ;top Delete Each cliplistb vaa.cliplista=Last cliplista vab.cliplista=First cliplista Repeat If vaa\y>0 If vab\y>0 AddClipLB(vab\x,vab\y,vab\u,vab\v) Else x=vaa\x+((vab\x-vaa\x)/(vab\y-vaa\y-0.0000001))*(-vaa\y) u=vaa\u+((vab\u-vaa\u)/(vab\y-vaa\y-0.0000001))*(-vaa\y) v=vaa\v+((vab\v-vaa\v)/(vab\y-vaa\y-0.0000001))*(-vaa\y) AddClipLB(x,0,u,v) EndIf Else If vab\y>0 x=vaa\x+((vab\x-vaa\x)/(vab\y-vaa\y-0.0000001))*(-vaa\y) u=vaa\u+((vab\u-vaa\u)/(vab\y-vaa\y-0.0000001))*(-vaa\y) v=vaa\v+((vab\v-vaa\v)/(vab\y-vaa\y-0.0000001))*(-vaa\y) AddClipLB(x,0,u,v) AddClipLB(vab\x,vab\y,vab\u,vab\v) EndIf EndIf vaa=vab vab=After vab Until vab=Null num=0 For clipb.cliplistb=Each cliplistb num=num+1 Next If num<3 Return ;bottom Delete Each cliplista vba.cliplistb=Last cliplistb vbb.cliplistb=First cliplistb Repeat If vba\y<(gheight-1) If vbb\y<(gheight-1) AddClipLA(vbb\x,vbb\y,vbb\u,vbb\v) Else x=vba\x+((vbb\x-vba\x)/(vbb\y-vba\y-0.0000001))*(-vba\y+gheight) u=vba\u+((vbb\u-vba\u)/(vbb\y-vba\y-0.0000001))*(-vba\y+gheight) v=vba\v+((vbb\v-vba\v)/(vbb\y-vba\y-0.0000001))*(-vba\y+gheight) AddClipLA(x,(gheight-1),u,v) EndIf Else If vbb\y<(gheight-1) x=vba\x+((vbb\x-vba\x)/(vbb\y-vba\y-0.0000001))*(-vba\y+gheight) u=vba\u+((vbb\u-vba\u)/(vbb\y-vba\y-0.0000001))*(-vba\y+gheight) v=vba\v+((vbb\v-vba\v)/(vbb\y-vba\y-0.0000001))*(-vba\y+gheight) AddClipLA(x,(gheight-1),u,v) AddClipLA(vbb\x,vbb\y,vbb\u,vbb\v) EndIf EndIf vba=vbb vbb=After vbb Until vbb=Null num=0 For clipa.cliplista=Each cliplista num=num+1 Next If num<3 Return ve0.cliplista=Last cliplista ve1.cliplista=First cliplista ve2.cliplista=After ve1 Repeat TexturePolygon(ve0\x,ve0\y,ve0\u,ve0\v,ve1\x,ve1\y,ve1\u,ve1\v,ve2\x,ve2\y,ve2\u,ve2\v,tex) ve1=ve2 ve2=After ve2 Until ve2=Null End Function Type ClipListA Field x,y,u,v End Type Type ClipListB Field x,y,u,v End Type Function AddClipLA(x,y,u,v) c.cliplista=New cliplista c\x=x : c\y=y : c\u=Abs u : c\v=Abs v End Function Function AddClipLB(x,y,u,v) c.cliplistb=New cliplistb c\x=x : c\y=y : c\u=Abs u : c\v=Abs v End Function
Copyright(c) 2000-2004, BlitzCoder. All Rights Reserved.
Code software created by Krylar's Kreations