1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
{ Simple demo how to get direct list of 3D scene triangles. }
program triangulate_demo;
uses SysUtils, CastleVectors, CastleSceneCore, CastleShapes, CastleTriangles,
CastleFilesUtils;
type
TTriangleHandler = class
procedure HandleTriangle(Shape: TObject;
const Position: TTriangle3Single;
const Normal: TTriangle3Single; const TexCoord: TTriangle4;
const Face: TFaceIndex);
end;
procedure TTriangleHandler.HandleTriangle(Shape: TObject;
const Position: TTriangle3Single;
const Normal: TTriangle3Single; const TexCoord: TTriangle4;
const Face: TFaceIndex);
begin
Writeln('Triangle position (in world coordinates):');
Write(Position.ToString);
end;
var
Scene: TCastleSceneCore;
SI: TShapeTreeIterator;
Handler: TTriangleHandler;
begin
Scene := TCastleSceneCore.Create(nil);
try
Scene.Load(ApplicationData('bridge_final.x3dv'));
SI := TShapeTreeIterator.Create(Scene.Shapes, true);
try
Handler := TTriangleHandler.Create;
try
while SI.GetNext do
{ Try also LocalTriangulate instead of Triangulate,
to have Position in local shape coordinates. }
SI.Current.Triangulate(true, @Handler.HandleTriangle);
finally FreeAndNil(Handler) end;
finally FreeAndNil(SI) end;
{ An alternative method: use Scene.InternalOctreeVisibleTriangles.Triangles.
This is available only when Scene.Spatial contains appropriate flag.
This method is useful in larger programs, when besides writing triangles,
you want to e.g. render or perform collision detection with the scene.
In such case, you will have Scene.InternalOctreeVisibleTriangles
created anyway. So you can use it also to get triangles list.
var
TriangleInfo: PTriangle;
...
Scene.Spatial := Scene.Spatial + [ssVisibleTriangles];
Scene.TriangleOctreeLimits^.MaxDepth := 1;
for I := 0 to Scene.InternalOctreeVisibleTriangles.Triangles.Count - 1 do
begin
TriangleInfo := @(Scene.InternalOctreeVisibleTriangles.Triangles.List^[I]);
Writeln('Triangle position (in world coordinates):');
Write(TriangleInfo^.World.Triangle.ToString);
end;
}
finally FreeAndNil(Scene) end;
end.
|