2
// This unit is part of the GLScene Engine https://github.com/glscene
5
Spatial partitioning related code that also uses GLScene objects
8
23/08/10 - Yar - Added OpenGLTokens to uses, replaced OpenGL1x functions to OpenGLAdapter
9
06/06/10 - Yar - Added GLVectorTypes to uses
10
22/04/10 - Yar - Fixes after GLState revision
11
05/03/10 - DanB - More state added to TGLStateCache
12
24/03/07 - DaStr - Replaced GLWin32Viewer with GLViewer
13
(thanks Burkhard Carstens) (Bugtracker ID = 1684432)
14
06/03/07 - DaStr - Removed obsolete FPC IFDEF's
15
19/12/06 - DaStr - Old version of ExtendedFrustumMakeFromSceneViewer function
16
restored as an overloaded version of the new one
17
04/11/05 - Mathx - Corrections related to bug 1335349
18
(ExtendedFrustumMakeFromSceneViewer supporting more
19
than just regular TGLSceneViewer).
20
03/12/04 - MF - Created
24
unit GLSpatialPartitioning;
29
GLViewer, GLSpacePartition, GLScene, GLVectorGeometry,
30
OpenGLTokens, GLGeometryBB, GLRenderContextInfo, GLState;
33
{ Object for holding glscene objects in a spatial partitioning }
34
TSceneObj = class(TSpacePartitionLeaf)
36
Obj: TGLBaseSceneObject;
37
procedure UpdateCachedAABBAndBSphere; override;
38
constructor CreateObj(Owner: TSectoredSpacePartition; aObj: TGLBaseSceneObject);
39
destructor Destroy; override;
42
{ Render a spacial partitioning descending from TSectoredSpacePartition
43
(octree and quadtree) as a grid - great for debugging and visualisation }
44
procedure RenderSpatialPartitioning(var rci: TGLRenderContextInfo;
45
const Space: TSectoredSpacePartition);
47
{ Create an extended frustum from a GLSceneViewer - this makes the unit
48
specific to the windows platform!}
49
function ExtendedFrustumMakeFromSceneViewer(const AFrustum: TFrustum;
50
const vWidth, vHeight: integer; AGLCamera: TGLCamera): TExtendedFrustum; overload;
52
function ExtendedFrustumMakeFromSceneViewer(const AFrustum: TFrustum;
53
const AGLSceneViewer: TGLSceneViewer): TExtendedFrustum; overload;
55
{ Renders an AABB as a line }
56
procedure RenderAABB(var rci: TGLRenderContextInfo; AABB: TAABB; w, r, g, b: single); overload;
57
procedure RenderAABB(var rci: TGLRenderContextInfo; AABB: TAABB); overload;
65
procedure RenderAABB(var rci: TGLRenderContextInfo; AABB: TAABB);
67
RenderAABB(rci, AABB, 1, 0.8, 0.8, 0.8);
70
procedure RenderAABB(var rci: TGLRenderContextInfo; AABB: TAABB; w, r, g, b: single);
73
rci.GLStates.LineWidth := w;
75
GL.Begin_(GL_LINE_STRIP);
76
GL.Vertex3f(AABB.min.V[0], AABB.min.V[1], AABB.min.V[2]);
77
GL.Vertex3f(AABB.min.V[0], AABB.max.V[1], AABB.min.V[2]);
78
GL.Vertex3f(AABB.max.V[0], AABB.max.V[1], AABB.min.V[2]);
79
GL.Vertex3f(AABB.max.V[0], AABB.min.V[1], AABB.min.V[2]);
80
GL.Vertex3f(AABB.min.V[0], AABB.min.V[1], AABB.min.V[2]);
82
GL.Vertex3f(AABB.min.V[0], AABB.min.V[1], AABB.max.V[2]);
83
GL.Vertex3f(AABB.min.V[0], AABB.max.V[1], AABB.max.V[2]);
84
GL.Vertex3f(AABB.max.V[0], AABB.max.V[1], AABB.max.V[2]);
85
GL.Vertex3f(AABB.max.V[0], AABB.min.V[1], AABB.max.V[2]);
86
GL.Vertex3f(AABB.min.V[0], AABB.min.V[1], AABB.max.V[2]);
90
GL.Vertex3f(AABB.min.V[0], AABB.max.V[1], AABB.min.V[2]);
91
GL.Vertex3f(AABB.min.V[0], AABB.max.V[1], AABB.max.V[2]);
93
GL.Vertex3f(AABB.max.V[0], AABB.max.V[1], AABB.min.V[2]);
94
GL.Vertex3f(AABB.max.V[0], AABB.max.V[1], AABB.max.V[2]);
96
GL.Vertex3f(AABB.max.V[0], AABB.min.V[1], AABB.min.V[2]);
97
GL.Vertex3f(AABB.max.V[0], AABB.min.V[1], AABB.max.V[2]);
101
// RenderSpatialPartitioning
104
procedure RenderSpatialPartitioning(var rci: TGLRenderContextInfo;
105
const Space: TSectoredSpacePartition);
107
procedure RenderSectorNode(Node: TSectorNode);
112
if Node.NoChildren then
116
if Node.RecursiveLeafCount > 0 then
117
RenderAABB(rci, AABB, 1, 0, 0, 0)
119
RenderAABB(rci, AABB, 1, 0.8, 0.8, 0.8) //}
124
for i := 0 to Node.ChildCount - 1 do
125
RenderSectorNode(Node.Children[i]);
129
rci.GLStates.Disable(stLighting);
130
RenderSectorNode(Space.RootNode);
133
function ExtendedFrustumMakeFromSceneViewer(const AFrustum: TFrustum;
134
const AGLSceneViewer: TGLSceneViewer): TExtendedFrustum; //old version
136
Assert(Assigned(AGLSceneViewer.Camera), 'GLSceneViewer must have camera specified!');
137
result := ExtendedFrustumMake(AFrustum,
138
AGLSceneViewer.Camera.NearPlane,
139
AGLSceneViewer.Camera.DepthOfView,
140
AGLSceneViewer.FieldOfView,
141
AGLSceneViewer.Camera.Position.AsAffineVector,
142
AGLSceneViewer.Camera.Direction.AsAffineVector);
145
function ExtendedFrustumMakeFromSceneViewer(const AFrustum: TFrustum;
146
const vWidth, vHeight: integer; AGLCamera: TGLCamera): TExtendedFrustum; //changed version
150
if vWidth < vHeight then
151
buffov := AGLCamera.GetFieldOfView(vWidth)
153
buffov := AGLCamera.GetFieldOfView(vHeight);
154
result := ExtendedFrustumMake(AFrustum,
156
AGLCamera.DepthOfView,
158
AGLCamera.Position.AsAffineVector,
159
AGLCamera.Direction.AsAffineVector);
164
constructor TSceneObj.CreateObj(Owner: TSectoredSpacePartition; aObj: TGLBaseSceneObject);
167
inherited CreateOwned(Owner);
170
destructor TSceneObj.Destroy;
175
procedure TSceneObj.UpdateCachedAABBAndBSphere;
177
FCachedAABB := Obj.AxisAlignedBoundingBox;
178
FCachedAABB.min := Obj.LocalToAbsolute(FCachedAABB.min);
179
FCachedAABB.max := Obj.LocalToAbsolute(FCachedAABB.max);
180
FCachedBSphere.Radius := Obj.BoundingSphereRadius;
181
FCachedBSphere.Center := AffineVectorMake(Obj.AbsolutePosition);