71 lines
1.9 KiB
Factor
71 lines
1.9 KiB
Factor
|
USING: accessors alien.c-types alien.handles euler.b-rep
|
||
|
game.models.half-edge grouping kernel locals opengl.gl
|
||
|
opengl.glu sequences specialized-arrays specialized-vectors
|
||
|
libc destructors alien.data ;
|
||
|
IN: euler.b-rep.triangulation
|
||
|
|
||
|
SPECIALIZED-ARRAY: double
|
||
|
|
||
|
ERROR: triangulated-face-must-be-base ;
|
||
|
|
||
|
<PRIVATE
|
||
|
|
||
|
: tess-begin ( -- callback )
|
||
|
[| primitive-type vertices-h |
|
||
|
primitive-type GL_TRIANGLES =
|
||
|
[ "unexpected primitive type" throw ] unless
|
||
|
] GLUtessBeginDataCallback ;
|
||
|
|
||
|
: tess-end ( -- callback )
|
||
|
[| vertices-h |
|
||
|
! nop
|
||
|
] GLUtessEndDataCallback ;
|
||
|
|
||
|
: tess-vertex ( -- callback )
|
||
|
[| vertex-h vertices-h |
|
||
|
vertex-h alien-handle-ptr>
|
||
|
vertices-h alien-handle-ptr> push
|
||
|
] GLUtessVertexDataCallback ;
|
||
|
|
||
|
: tess-edge-flag ( -- callback )
|
||
|
[| flag vertices-h |
|
||
|
! nop
|
||
|
] GLUtessEdgeFlagDataCallback ;
|
||
|
|
||
|
PRIVATE>
|
||
|
|
||
|
:: triangulate-face ( face -- triangles )
|
||
|
[
|
||
|
face dup base-face>> eq? [ triangulated-face-must-be-base ] unless
|
||
|
|
||
|
gluNewTess &gluDeleteTess :> tess
|
||
|
V{ } clone :> vertices
|
||
|
vertices <alien-handle-ptr> &release-alien-handle-ptr :> vertices-h
|
||
|
|
||
|
tess GLU_TESS_BEGIN_DATA tess-begin gluTessCallback
|
||
|
tess GLU_TESS_END_DATA tess-end gluTessCallback
|
||
|
tess GLU_TESS_VERTEX_DATA tess-vertex gluTessCallback
|
||
|
tess GLU_TESS_EDGE_FLAG_DATA tess-edge-flag gluTessCallback
|
||
|
|
||
|
tess vertices-h gluTessBeginPolygon
|
||
|
|
||
|
4 double malloc-array &free :> vertex-buf
|
||
|
|
||
|
face [| ring |
|
||
|
tess gluTessBeginContour
|
||
|
|
||
|
ring edge>> [
|
||
|
tess swap vertex>>
|
||
|
[ position>> double >c-array ]
|
||
|
[ <alien-handle-ptr> &release-alien-handle-ptr ] bi gluTessVertex
|
||
|
] each-face-edge
|
||
|
|
||
|
tess gluTessEndContour
|
||
|
|
||
|
ring next-ring>> dup
|
||
|
] loop drop
|
||
|
tess gluTessEndPolygon
|
||
|
|
||
|
vertices { } like 3 <groups>
|
||
|
] with-destructors ;
|