- Procedure TTriForm.MemoDblClick(Sender : TObject);
- Var
- CombineArray : Array Of TVector3D;
- tess : PGLUTesselator;
- //================================================
- //Begin der CallbackFunktionen
- //================================================
- Procedure tcberror(errno : TGLEnum); Stdcall;
- Begin
- // Assert(False, IntToStr(errno) + ' : ' + gluErrorString(errno));
- End;
- Procedure tessVertex(vertexData : Pointer); Stdcall;
- Var
- Punkt : ^TVector3D;
- str : widestring;
- Begin
- {Hier wird dem Vertexpunkt, die Texturkoordiante übergeben. Die Procedure funktioniert aber nur richtig in
- Verbindung mit Linietyp für Spindel, da in dem selbstdeninierten Typ, die UV-Koordianten mit beinhaltet sein
- müssen, da man sonst darauf nicht zugreifen kann.}
- Punkt := Vertexdata;
- str := floattostrf(Punkt^[0], ffFixed, 9, 2) + ' ' + floattostrf(Punkt^[1], ffFixed, 9, 2) + ' ' +
- floattostrf(Punkt^[2], ffFixed, 9, 2);
- TriForm.Memo.Lines.add(str);
- End;
- Procedure tessCombine(Coords : TVector3d;VertexData : TVector4p;Weight : TVector4f;Var OutData : PPointer); Stdcall;
- {In dieser Procedure muss bearbeitet werden, wie bei der Tesselation mit Geradenüberschneidungen verfahren wird.
- Dann sollte ein neuer Punkt erstellt werden und diesem neue Texturkoordinaten übergeben werden.}
- Type
- pOGLPunkt = ^TVector3D;
- Var
- Arrayhigh : integer;
- Punkt1 : pOGLPunkt;
- Punkt2 : pOGLPunkt;
- Zahl : Real;
- Begin
- Arrayhigh := Length(CombineArray);
- setlength(CombineArray, Arrayhigh + 1);
- CombineArray[Arrayhigh] := Coords;
- OutData := @CombineArray[Arrayhigh];
- End;
- //================================================
- //Ende CallbackFunktionen
- //================================================
- Var
- pkt : Array Of TVector3D;
- Procedure pktAdd(x, y : double);
- Var
- h : Integer;
- Begin
- h := length(pkt);
- setlength(pkt, h + 1);
- pkt[h, 0] := x;
- pkt[h, 1] := y;
- pkt[h, 2] := 0;
- gluTessVertex(tess, pkt[h], @pkt[h]);
- End;
- Begin
- Memo.Lines.clear;
- tess := gluNewTess;
- gluTessCallback(tess, GLU_TESS_BEGIN, @glBegin);
- gluTessCallback(tess, GLU_TESS_VERTEX, @tessVertex);
- gluTessCallback(tess, GLU_TESS_END, @glEnd);
- gluTessCallback(tess, GLU_TESS_ERROR, @tcberror);
- gluTessCallback(tess, GLU_TESS_COMBINE, @tessCombine);
- gluTessBeginPolygon(tess, Nil);
- gluTessBeginContour(tess);
- pktAdd(0, 0);
- pktAdd(10, 0);
- pktAdd(8, 5);
- pktAdd(13, 5);
- pktAdd(12, 0);
- pktAdd(20, 0);
- pktAdd(20, 20);
- pktAdd(0, 20);
- pktAdd(0, 10);
- pktAdd(5, 12);
- pktAdd(5, 7);
- pktAdd(0, 8);
- gluTessEndContour(tess);
- gluEndPolygon(tess);
- gluDeleteTess(tess);
- setlength(CombineArray, 0);
- End;