- FCalculatedVertice:array of TGLVectori2;
- FTriangleIndices:array of cardinal;
- ...
- function TKar_OGLShape.isconvex(prev,cur,next:TGLVectori2):boolean;
- var
- v1,v2:TGLVectori2;
- begin
- result:=false;
- v1[0]:=prev[0]-cur[0];
- v1[1]:=prev[1]-cur[1];
- v2[0]:=next[0]-cur[0];
- v2[1]:=next[1]-cur[1];
- if (v1[0]*v2[1]-v1[1]*v2[0])<=0 then
- result:=true;
- end;
- function TKar_OGLShape.SameSide(p1,p2,v1,v2:TGLVectori2):Boolean;
- var
- cp1,cp2:TGLVectori3;
- d1,d2,d3:TGLVectori2;
- begin
- d1[0]:=v2[0]-v1[0]; d1[1]:=v2[1]-v1[1];
- d2[0]:=p1[0]-v1[0]; d2[1]:=p1[1]-v1[1];
- d3[0]:=p2[0]-v1[0]; d3[1]:=p2[1]-v1[1];
- cp1[2]:=d1[0]*d2[1]-d1[1]*d2[0];
- cp2[2]:=d1[0]*d3[1]-d1[1]*d3[0];
- if (cp1[2]*cp2[2])>=0 then
- result:=true
- else
- result:=false;
- end;
- function TKar_OGLShape.PointInPolygon(a,b,c,p1:TGLVectori2):Boolean;
- begin
- if SameSide(p1,a,b,c) and SameSide(p1,b,a,c) and SameSide(p1,c,a,b) then
- result:=true
- else
- result:=false;
- end;
- function TKar_OGLShape.isear(p1,p2,p3:cardinal;const list:array of TGLVectori2):Boolean;
- var
- i:integer;
- begin
- result:=false;
- for i:=0 to high(list) do
- if (i<>p1) and (i<>p2) and (i<>p3) then
- if PointInPolygon(list[p1],list[p2],list[p3],list[i]) then
- exit;
- result:=true;
- end;
- procedure TKar_OGLShape.Tesselieren;
- var
- l:array of cardinal;
- prev,next,j,i:cardinal;
- begin
- setlength(l,length(FCalculatedVertice));
- for i:=0 to high(FCalculatedVertice) do
- l[i]:=i;
- while length(l)>3 do
- begin
- i:=0;
- while i<=high(l) do
- begin
- if i=0 then prev:=high(l) else prev:=i-1;
- if i=high(l) then next:=0 else next:=i+1;
- if isconvex(FCalculatedVertice[l[prev]],FCalculatedVertice[l[i]],FCalculatedVertice[l[next]])
- and isear(prev,i,next,FCalculatedVertice) then
- begin
- //setindices
- setlength(FTriangleIndices,length(FTriangleIndices)+3);
- FTriangleIndices[high(FTriangleIndices)-2]:=l[prev];
- FTriangleIndices[high(FTriangleIndices)-1]:=l[i];
- FTriangleIndices[high(FTriangleIndices)]:=l[next];
- //remove from list
- for j:=i to high(l)-1 do
- l[j]:=l[j+1];
- setlength(l,high(l));
- end;
- inc(i);
- end;
- end;
- //setindices
- setlength(FTriangleIndices,length(FTriangleIndices)+3);
- FTriangleIndices[high(FTriangleIndices)-2]:=l[0];
- FTriangleIndices[high(FTriangleIndices)-1]:=l[1];
- FTriangleIndices[high(FTriangleIndices)]:=l[2];
- end;