package Ġorg . open rnd r . k tes sell ation Ċ Ċ open Ġclass ĠGL U tes sell ator Impl Ġ: ĠGL U tes sell ator Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġstate Ġ/* Ġwhat Ġbegin / end Ġcalls Ġhave Ġwe Ġseen ? Ġ*/ : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġlast Edge Ġ/* Ġlast Edge -> Org Ġis Ġthe Ġmost Ġrecent Ġvertex Ġ*/ : ĠGL U half Edge ? Ġ= ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġinternal Ġvar Ġmesh : ĠGL U mesh ? Ġ= Ġnull ĊĠĠĠ Ġ/* Ġstores Ġthe Ġinput Ġcont ours , Ġand Ġeventually ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġtes sell ation Ġitself Ġ*/ ĊĊĠĠĠ Ġ/** * Ġstate Ġneeded Ġfor Ġproject ing Ġonto Ġthe Ġsweep Ġplane Ġ Ġ*/ ĊĠĠĠ Ġvar Ġnormal Ġ= ĠDouble Array ( 3 ) Ġ/* Ġuser - specified Ġnormal Ġ( if Ġprovided ) Ġ*/ ĊĠĠĠ Ġvar Ġs Unit Ġ= ĠDouble Array ( 3 ) Ġ/* Ġunit Ġvector Ġin Ġs - direction Ġ( debugging ) Ġ*/ ĊĠĠĠ Ġvar Ġt Unit Ġ= ĠDouble Array ( 3 ) Ġ/* Ġunit Ġvector Ġin Ġt - direction Ġ( debugging ) Ġ*/ ĊĊĠĠĠ Ġ/** * Ġstate Ġneeded Ġfor Ġthe Ġline Ġsweep Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġrel Tolerance Ġ/* Ġtolerance Ġfor Ġmerging Ġfeatures Ġ*/ : ĠDouble ĊĠĠĠ Ġvar Ġwind ing Rule Ġ/* Ġrule Ġfor Ġdetermining Ġpolygon Ġinterior Ġ*/ : ĠInt ĊĠĠĠ Ġvar Ġfatal Error Ġ/* Ġfatal Ġerror : Ġneeded Ġcombine Ġcallback Ġ*/ Ġ= Ġfalse ĊĠĠĠ Ġinternal Ġvar Ġdict Ġ/* Ġedge Ġdictionary Ġfor Ġsweep Ġline Ġ*/ : ĠDict ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġpq Ġ/* Ġpriority Ġqueue Ġof Ġvertex Ġevents Ġ*/ : ĠPriority Q ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġevent Ġ/* Ġcurrent Ġsweep Ġevent Ġbeing Ġprocessed Ġ*/ : ĠGL U vertex ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** * Ġstate Ġneeded Ġfor Ġrendering Ġcallbacks Ġ( see Ġrender . c ) Ġ Ġ*/ ĊĠĠĠ Ġvar Ġflag Boundary Ġ/* Ġmark Ġboundary Ġedges Ġ( use ĠEdge Flag ) Ġ*/ : ĠBoolean ĊĠĠĠ Ġvar Ġboundary Only Ġ/* ĠExtract Ġcont ours , Ġnot Ġtriangles Ġ*/ : ĠBoolean ĊĠĠĠ Ġinternal Ġvar Ġlon ely Tri List : ĠGL U face ? Ġ= Ġnull ĊĠĠĠ Ġ/* Ġlist Ġof Ġtriangles Ġwhich Ġcould Ġnot Ġbe Ġrendered Ġas Ġstri ps Ġor Ġf ans Ġ*/ ĊĠĠĠ Ġ/** * Ġstate Ġneeded Ġto Ġcache Ġsingle - contour Ġpoly gons Ġfor Ġrender Cache () Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġflush Cache On Next Vertex Ġ/* Ġempty Ġcache Ġon Ġnext Ġvertex () Ġcall Ġ*/ Ġ= Ġfalse ĊĠĠĠ Ġvar Ġcache Count Ġ/* Ġnumber Ġof Ġcached Ġvertices Ġ*/ Ġ= Ġ 0 ĊĠĠĠ Ġinternal Ġvar Ġcache : ĠArray < Cached Vertex ?> Ġ= ĊĠĠĠĠĠĠĠ ĠarrayOf Null s < Cached Vertex >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT ESS _ MAX _ CACHE ĊĠĠĠĠĠĠĠ Ġ) Ġ/* Ġthe Ġvertex Ġdata Ġ*/ ĊĊĠĠĠ Ġ/** * Ġrendering Ġcallbacks Ġthat Ġalso Ġpass Ġpolygon Ġdata ĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġpolygon Data Ġ/* Ġclient Ġdata Ġfor Ġcurrent Ġpolygon Ġ*/ : ĠAny ? ĊĠĠĠ Ġprivate Ġvar Ġcall Begin : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall Edge Flag : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall Vertex : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall End : ĠGL U tes sell ator Callback ĊĊĠĠĠ Ġ// ĠĠĠ Ġprivate ĠGL U tes sell ator Callback Ġcall Mesh ; ĊĠĠĠ Ġprivate Ġvar Ġcall Error : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall Combine : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall Begin Data : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall Edge Flag Data : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall Vertex Data : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall End Data : ĠGL U tes sell ator Callback ĊĊĠĠĠ Ġ// ĠĠĠ Ġprivate ĠGL U tes sell ator Callback Ġcall Mesh Data ; ĊĠĠĠ Ġprivate Ġvar Ġcall Error Data : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġvar Ġcall Combine Data : ĠGL U tes sell ator Callback ĊĠĠĠ Ġprivate Ġfun Ġmake D orm ant () Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĠReturn Ġthe Ġtes sell ator Ġto Ġits Ġoriginal Ġd orm ant Ġstate . Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( mesh Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMesh .__ gl _ mesh Delete Mesh ( mesh !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠT ess State . T _ D ORM ANT ĊĠĠĠĠĠĠĠ Ġlast Edge Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmesh Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequire State ( newState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( state Ġ== ĠnewState ) Ġ{ Ġ" state Ġshould Ġbe Ġ$ newState Ġis Ġ$ state " Ġ} ĊĠĠĠĠĠĠĠ Ġ// if Ġ( state Ġ!= ĠnewState ) Ġgoto State ( newState ); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgoto State ( newState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" request ing Ġnew Ġstate ! Ġ$ newState Ġcurrent Ġstate Ġis Ġ$ state ") ĊĠĠĠĠĠĠĠ Ġwhile Ġ( state Ġ!= ĠnewState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠWe Ġchange Ġthe Ġcurrent Ġstate Ġone Ġlevel Ġat Ġa Ġtime , Ġto Ġget Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġdesired Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ< ĠnewState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠT ess State . T _ D ORM ANT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ T ESS _ MISSING _ BEGIN _ POLYGON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl u Tess Begin Polygon ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state Ġ== ĠT ess State . T _ IN _ POLYGON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ T ESS _ MISSING _ BEGIN _ CON TO UR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl u Tess Begin Contour () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠT ess State . T _ IN _ CON TO UR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ T ESS _ MISSING _ END _ CON TO UR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl u Tess End Contour () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( state Ġ== ĠT ess State . T _ IN _ POLYGON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ T ESS _ MISSING _ END _ POLYGON ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġgl u Tess End Polygon ( Ġt ess Ġ) Ġis Ġtoo Ġmuch Ġwork ! Ġ*/ make D orm ant () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Delete Tess () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire State ( Tess State . T _ D ORM ANT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess Property ( which : ĠInt , Ġvalue : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ TO LER ANCE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ< Ġ 0 . 0 Ġ|| Ġvalue Ġ> Ġ 1 . 0 ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrel Tolerance Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ W IND ING _ RULE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwind ing Rule Ġ= Ġvalue . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wind ing Rule . toDouble () Ġ!= Ġvalue ) Ġreturn Ġ/* Ġnot Ġan Ġinteger Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( wind ing Rule ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ W IND ING _ O DD , ĠGL U . GL U _ T ESS _ W IND ING _ NON ZERO , ĠGL U . GL U _ T ESS _ W IND ING _ POSITIVE , ĠGL U . GL U _ T ESS _ W IND ING _ NEGATIVE , ĠGL U . GL U _ T ESS _ W IND ING _ ABS _ G EQ _ TWO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . wind ing Rule Ġ= Ġwind ing Rule ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary Only Ġ= Ġvalue Ġ!= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ BOUND ARY _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary Only Ġ= Ġvalue Ġ!= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ INVALID _ ENUM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ INVALID _ VALUE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠReturns Ġtes sell ator Ġproperty Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġgl u Get Tess Property ( which : ĠInt , Ġvalue : ĠDouble Array , Ġvalue _ offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ TO LER ANCE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( rel Tolerance Ġin Ġ 0 . 0 .. 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue [ value _ offset ] Ġ= Ġrel Tolerance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ W IND ING _ RULE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( wind ing Rule Ġ== ĠGL U . GL U _ T ESS _ W IND ING _ O DD Ġ|| Ġwind ing Rule Ġ== ĠGL U . GL U _ T ESS _ W IND ING _ NON ZERO Ġ|| Ġwind ing Rule Ġ== ĠGL U . GL U _ T ESS _ W IND ING _ POSITIVE Ġ|| Ġwind ing Rule Ġ== ĠGL U . GL U _ T ESS _ W IND ING _ NEGATIVE Ġ|| Ġwind ing Rule Ġ== ĠGL U . GL U _ T ESS _ W IND ING _ ABS _ G EQ _ TWO ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue [ value _ offset ] Ġ= Ġwind ing Rule . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ BOUND ARY _ ONLY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// require ( boundary Only Ġ== Ġtrue Ġ|| Ġboundary Only Ġ== Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue [ value _ offset ] Ġ= Ġif Ġ( boundary Only ) Ġ 1 . 0 Ġelse Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue [ value _ offset ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ INVALID _ ENUM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ/* Ġgl u Get Tess Property () Ġ*/ ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess Normal ( x : ĠDouble , Ġy : ĠDouble , Ġz : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnormal [ 0 ] Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġnormal [ 1 ] Ġ= Ġy ĊĠĠĠĠĠĠĠ Ġnormal [ 2 ] Ġ= Ġz ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess Callback ( which : ĠInt , Ġa Callback : ĠGL U tes sell ator Callback ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ BEGIN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Begin Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ BEGIN _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Begin Data Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ EDGE _ FLAG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Edge Flag Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠIf Ġthe Ġclient Ġwants Ġboundary Ġedges Ġto Ġbe Ġflag ged , Ċ Ġ* Ġwe Ġrender Ġeverything Ġas Ġseparate Ġtriangles Ġ( no Ġstri ps Ġor Ġf ans ). Ċ Ġ*/ flag Boundary Ġ= Ġa Callback Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ EDGE _ FLAG _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Begin Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Edge Flag Data Ġ= Ġcall Begin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠIf Ġthe Ġclient Ġwants Ġboundary Ġedges Ġto Ġbe Ġflag ged , Ċ Ġ* Ġwe Ġrender Ġeverything Ġas Ġseparate Ġtriangles Ġ( no Ġstri ps Ġor Ġf ans ). Ċ Ġ*/ flag Boundary Ġ= Ġa Callback Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ VERTEX Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Vertex Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ VERTEX _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Vertex Data Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall End Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ END _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall End Data Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ ERROR _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Data Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ COMB INE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Combine Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U . GL U _ T ESS _ COMB INE _ DATA Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Combine Data Ġ= Ġa Callback Ġ?: ĠNULL _ CB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ INVALID _ ENUM ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Vertex ( coords : ĠDouble Array , Ġvertex Data : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġe : ĠGL U half Edge ? ĊĠĠĠĠĠĠĠ Ġe Ġ= Ġlast Edge ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull ) Ġ{ Ċ /* ĠMake Ġa Ġself - loop Ġ( one Ġvertex , Ġone Ġedge ). Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= ĠMesh .__ gl _ mesh Make Edge ( mesh Ġ?: Ġerror (" mesh Ġ== Ġnull ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Mesh .__ gl _ mesh Sp lice ( e , Ġe . Sym Ġ?: Ġerror (" e . Sym Ġ== Ġnull "))) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ /* ĠCreate Ġa Ġnew Ġvertex Ġand Ġedge Ġwhich Ġimmediately Ġfollow Ġe Ċ Ġ* Ġin Ġthe Ġordering Ġaround Ġthe Ġleft Ġface . Ċ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mesh .__ gl _ mesh Split Edge ( e ) Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe Ġ= Ġe . L next ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ /* ĠThe Ġnew Ġvertex Ġis Ġnow Ġe . Org . Ġ*/ ĊĠĠĠĠĠĠĠ Ġe !!. Org !!. data Ġ= Ġvertex Data ĊĠĠĠĠĠĠĠ Ġe !!. Org !!. coords [ 0 ] Ġ= Ġcoords [ 0 ] ĊĠĠĠĠĠĠĠ Ġe !!. Org !!. coords [ 1 ] Ġ= Ġcoords [ 1 ] ĊĠĠĠĠĠĠĠ Ġe !!. Org !!. coords [ 2 ] Ġ= Ġcoords [ 2 ] Ċ Ċ /* ĠThe Ġwind ing Ġof Ġan Ġedge Ġsays Ġhow Ġthe Ġwind ing Ġnumber Ġchanges Ġas Ġwe Ċ Ġ* Ġcross Ġfrom Ġthe Ġedge '' s Ġright Ġface Ġto Ġits Ġleft Ġface . Ġ ĠWe Ġadd Ġthe Ċ Ġ* Ġvertices Ġin Ġsuch Ġan Ġorder Ġthat Ġa ĠCC W Ġcontour Ġwill Ġadd Ġ+ 1 Ġto Ċ Ġ* Ġthe Ġwind ing Ġnumber Ġof Ġthe Ġregion Ġinside Ġthe Ġcontour . Ċ Ġ*/ e . wind ing Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġe . Sym !!. wind ing Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġlast Edge Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcache Vertex ( coords : ĠDouble Array , Ġvertex Data : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cache [ cache Count ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache [ cache Count ] Ġ= ĠCached Vertex () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġv : ĠCached Vertex Ġ= Ġcache [ cache Count ] Ġ?: Ġerror (" cache [ cache Count ] Ġ== Ġnull ") ĊĠĠĠĠĠĠĠ Ġv . data Ġ= Ġvertex Data ĊĠĠĠĠĠĠĠ Ġv . coords [ 0 ] Ġ= Ġcoords [ 0 ] ĊĠĠĠĠĠĠĠ Ġv . coords [ 1 ] Ġ= Ġcoords [ 1 ] ĊĠĠĠĠĠĠĠ Ġv . coords [ 2 ] Ġ= Ġcoords [ 2 ] ĊĠĠĠĠĠĠĠ Ġ++ cache Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflush Cache (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv : ĠArray < Cached Vertex ?> Ġ= Ġcache ĊĠĠĠĠĠĠĠ Ġmesh Ġ= ĠMesh .__ gl _ mesh New Mesh () ĊĠĠĠĠĠĠĠ Ġif Ġ( mesh Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcache Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex : ĠCached Vertex Ġ= Ġv [ i ] Ġ?: Ġerror (" v [ i ] Ġ== Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! add Vertex ( vertex . coords , Ġvertex . data )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcache Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġflush Cache On Next Vertex Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess Vertex ( coords : ĠDouble Array , Ġcoords _ offset : ĠInt , Ġvertex Data : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġtoo Large Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġx : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġclamp ed Ġ= ĠDouble Array ( 3 ) ĊĠĠĠĠĠĠĠ Ġrequire State ( Tess State . T _ IN _ CON TO UR ) ĊĠĠĠĠĠĠĠ Ġif Ġ( flush Cache On Next Vertex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! flush Cache ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ OUT _ OF _ MEMORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Edge Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġcoords [ i Ġ+ Ġcoords _ offset ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġ- GL U . GL U _ T ESS _ MAX _ COORD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ- GL U . GL U _ T ESS _ MAX _ COORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoo Large Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ> ĠGL U . GL U _ T ESS _ MAX _ COORD ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= ĠGL U . GL U _ T ESS _ MAX _ COORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoo Large Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclamp ed [ i ] Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ i ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( too Large ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ T ESS _ COORD _ TOO _ LARGE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( mesh Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache Count Ġ< ĠT ESS _ MAX _ CACHE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Vertex ( clamp ed , Ġvertex Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! flush Cache ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ OUT _ OF _ MEMORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! add Vertex ( clamp ed , Ġvertex Data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ OUT _ OF _ MEMORY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess Begin Polygon ( data : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire State ( Tess State . T _ D ORM ANT ) ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠT ess State . T _ IN _ POLYGON ĊĠĠĠĠĠĠĠ Ġcache Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġflush Cache On Next Vertex Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġmesh Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġpolygon Data Ġ= Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess Begin Contour () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire State ( Tess State . T _ IN _ POLYGON ) ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠT ess State . T _ IN _ CON TO UR ĊĠĠĠĠĠĠĠ Ġlast Edge Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( cache Count Ġ> Ġ 0 ) Ġ{ Ċ /* ĠJust Ġset Ġa Ġflag Ġso Ġwe Ġdon 't Ġget Ġconfused Ġby Ġempty Ġcont ours Ċ Ġ* Ġ-- Ġthese Ġcan Ġbe Ġgenerated Ġaccidentally Ġwith Ġthe Ġobsolete Ċ Ġ* ĠNext Contour () Ġinterface . Ċ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflush Cache On Next Vertex Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess End Contour () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire State ( Tess State . T _ IN _ CON TO UR ) ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠT ess State . T _ IN _ POLYGON ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u Tess End Polygon () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmesh : ĠGL U mesh ? ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire State ( Tess State . T _ IN _ POLYGON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠT ess State . T _ D ORM ANT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . mesh Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! flag Boundary Ġ/* && Ġcall Mesh Ġ== ĠNULL _ CB */) Ġ{ Ċ Ċ /* ĠTry Ġsome Ġspecial Ġcode Ġto Ġmake Ġthe Ġeasy Ġcases Ġgo Ġquickly Ċ Ġ* Ġ( eg . Ġconvex Ġpoly gons ). Ġ ĠThis Ġcode Ġdoes ĠNOT Ġhandle Ġmultiple Ġcont ours , Ċ Ġ* Ġinter sections , Ġedge Ġflags , Ġand Ġof Ġcourse Ġit Ġdoes Ġnot Ġgenerate Ċ Ġ* Ġan Ġexplicit Ġmesh Ġeither . Ċ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Render .__ gl _ render Cache ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpolygon Data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! flush Cache ()) Ġthrow ĠRuntimeException () Ġ/* Ġcould 've Ġused Ġa Ġlabel */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ /* ĠDetermine Ġthe Ġpolygon Ġnormal Ġand Ġproject Ġvertices Ġonto Ġthe Ġplane ĊĠĠĠĠĠĠĠĠ Ġ* Ġof Ġthe Ġpolygon . ĊĠĠĠĠĠĠĠĠ Ġ*/ Normal .__ gl _ project Polygon ( this ) Ċ Ċ /* Ġ__ gl _ compute Interior ( Ġt ess Ġ) Ġcomputes Ġthe Ġplan ar Ġarrange ment Ġspecified Ċ Ġ* Ġby Ġthe Ġgiven Ġcont ours , Ġand Ġfurther Ġsub div ides Ġthis Ġarrange ment Ċ Ġ* Ġinto Ġregions . Ġ ĠEach Ġregion Ġis Ġmarked Ġ" inside " Ġif Ġit Ġbelongs Ċ Ġ* Ġto Ġthe Ġpolygon , Ġaccording Ġto Ġthe Ġrule Ġgiven Ġby Ġwind ing Rule . Ċ Ġ* ĠEach Ġinterior Ġregion Ġis Ġguaranteed Ġbe Ġmon ot one . Ċ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Sweep .__ gl _ compute Interior ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException () Ġ/* Ġcould 've Ġused Ġa Ġlabel Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmesh Ġ= Ġthis . mesh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! fatal Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrc Ġ= Ġtrue Ċ Ċ /* ĠIf Ġthe Ġuser Ġwants Ġonly Ġthe Ġboundary Ġcont ours , Ġwe Ġthrow Ġaway Ġall Ġedges Ċ Ġ* Ġexcept Ġthose Ġwhich Ġseparate Ġthe Ġinterior Ġfrom Ġthe Ġex terior . Ċ Ġ* ĠOtherwise Ġwe Ġtes sell ate Ġall Ġthe Ġregions Ġmarked Ġ" inside ". Ċ Ġ*/ rc Ġ= Ġif Ġ( boundary Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ess Mono .__ gl _ mesh Set Wind ing Number ( mesh !! , Ġ 1 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ess Mono .__ gl _ mesh Tes sell ate Interior ( mesh !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! rc ) Ġthrow ĠRuntimeException () Ġ/* Ġcould 've Ġused Ġa Ġlabel Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMesh .__ gl _ mesh Check Mesh ( mesh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Begin Ġ!== ĠNULL _ CB Ġ|| Ġcall End Ġ!== ĠNULL _ CB Ġ|| Ġcall Vertex Ġ!== ĠNULL _ CB Ġ|| Ġcall Edge Flag Ġ!== ĠNULL _ CB Ġ|| Ġcall Begin Data Ġ!== ĠNULL _ CB Ġ|| Ġcall End Data Ġ!== ĠNULL _ CB Ġ|| Ġcall Vertex Data Ġ!== ĠNULL _ CB Ġ|| Ġcall Edge Flag Data Ġ!== ĠNULL _ CB ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( boundary Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRender .__ gl _ render Boundary ( this , Ġmesh ) Ġ/* Ġoutput Ġboundary Ġcont ours Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRender .__ gl _ render Mesh ( this , Ġmesh ) Ġ/* Ġoutput Ġstri ps Ġand Ġf ans Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Mesh Ġ!= ĠNULL _ CB ) Ġ{ Ċ // Ċ // /* ĠThrow Ġaway Ġthe Ġex terior Ġfaces , Ġso Ġthat Ġall Ġfaces Ġare Ġinterior . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġway Ġthe Ġuser Ġdoesn 't Ġhave Ġto Ġcheck Ġthe Ġ" inside " Ġflag , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġand Ġwe Ġdon 't Ġneed Ġto Ġeven Ġreveal Ġits Ġexistence . Ġ ĠIt Ġalso Ġleaves Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġfreedom Ġfor Ġan Ġimplementation Ġto Ġnot Ġgenerate Ġthe Ġex terior Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġfaces Ġin Ġthe Ġfirst Ġplace . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ess Mono .__ gl _ mesh Discard Ex terior ( mesh ); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Mesh . mesh ( mesh ); ĉ ĉ /* Ġuser Ġwants Ġthe Ġmesh Ġitself Ġ*/ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmesh Ġ= Ġnull ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpolygon Data Ġ= Ġnull ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMesh .__ gl _ mesh Delete Mesh ( mesh !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolygon Data Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmesh Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Error Or Error Data ( GL U . GL U _ OUT _ OF _ MEMORY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ*/ Ġ/* ĠOb solete Ġcalls Ġ-- Ġfor Ġbackward Ġcompatibility Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġgl u Begin Polygon () Ġ{ ĊĠĠĠĠĠĠĠ Ġgl u Tess Begin Polygon ( null ) ĊĠĠĠĠĠĠĠ Ġgl u Tess Begin Contour () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ARG SU SED */ ĊĠĠĠ Ġoverride Ġfun Ġgl u Next Contour ( type : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl u Tess End Contour () ĊĠĠĠĠĠĠĠ Ġgl u Tess Begin Contour () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl u End Polygon () Ġ{ ĊĠĠĠĠĠĠĠ Ġgl u Tess End Contour () ĊĠĠĠĠĠĠĠ Ġgl u Tess End Polygon () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcall Begin Or Begin Data ( a : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Begin Data Ġ!== ĠNULL _ CB ) Ġcall Begin Data . begin Data ( a , Ġpolygon Data ) Ġelse Ġcall Begin . begin ( a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcall Vertex Or Vertex Data ( a : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Vertex Data Ġ!== ĠNULL _ CB ) Ġcall Vertex Data . vertex Data ( a , Ġpolygon Data ) Ġelse Ġcall Vertex . vertex ( a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcall Edge Flag Or Edge Flag Data ( a : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Edge Flag Data Ġ!== ĠNULL _ CB ) Ġcall Edge Flag Data . edge Flag Data ( a , Ġpolygon Data ) Ġelse Ġcall Edge Flag . edge Flag ( a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcall End Or End Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call End Data Ġ!== ĠNULL _ CB ) Ġcall End Data . end Data ( polygon Data ) Ġelse Ġcall End . end () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcall Combine Or Combine Data ( ĊĠĠĠĠĠĠĠ Ġcoords : ĠDouble Array ?, ĊĠĠĠĠĠĠĠ Ġvertex Data : ĠArray < Any ?> ?, ĊĠĠĠĠĠĠĠ Ġweights : ĠFloat Array ?, ĊĠĠĠĠĠĠĠ Ġout Data : ĠArray < Any ?> ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Combine Data Ġ!== ĠNULL _ CB ) Ġcall Combine Data . combine Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoords , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Data , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweights , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Data , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolygon Data ĊĠĠĠĠĠĠĠ Ġ) Ġelse Ġcall Combine . combine ( coords , Ġvertex Data , Ġweights , Ġout Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcall Error Or Error Data ( a : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Error Data Ġ!== ĠNULL _ CB ) Ġcall Error Data . error Data ( a , Ġpolygon Data ) Ġelse Ġcall Error . error ( a ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT ESS _ MAX _ CACHE Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGL U _ T ESS _ DEFAULT _ TO LER ANCE Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġprivate Ġstatic Ġfinal Ġint ĠGL U _ T ESS _ MESH Ġ= Ġ 1 0 0 1 1 2 ; ĉ /* Ġvoid Ġ(* )( GL U mesh Ġ* mesh ) ĉĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNULL _ CB : ĠGL U tes sell ator Callback Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGL U tes sell ator Callback Adapter () ĊĊĠĠĠĠĠĠĠ Ġfun Ġgl u New Tess (): ĠGL U tes sell ator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGL U tes sell ator Impl () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠĠĠ Ġ# define ĠMAX _ FAST _ ALLOC ĉ ( MAX ( sizeof ( Edge Pair ), Ġ\ ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMAX ( sizeof ( GL U vertex ), sizeof ( GL U face )))) ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠT ess State . T _ D ORM ANT ĊĠĠĠĠĠĠĠ Ġnormal [ 0 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġnormal [ 1 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġnormal [ 2 ] Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġrel Tolerance Ġ= ĠGL U _ T ESS _ DEFAULT _ TO LER ANCE ĊĠĠĠĠĠĠĠ Ġwind ing Rule Ġ= ĠGL U . GL U _ T ESS _ W IND ING _ O DD ĊĠĠĠĠĠĠĠ Ġflag Boundary Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġboundary Only Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcall Begin Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Edge Flag Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Vertex Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall End Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Error Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Combine Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġcall Mesh Ġ= ĠNULL _ CB ; ĊĠĠĠĠĠĠĠ Ġcall Begin Data Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Edge Flag Data Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Vertex Data Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall End Data Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Error Data Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġcall Combine Data Ġ= ĠNULL _ CB ĊĠĠĠĠĠĠĠ Ġpolygon Data Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġcache . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache [ i ] Ġ= ĠCached Vertex () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ