LZScene

Форк
0
/
GLSpatialPartitioning.pas 
183 строки · 6.0 Кб
1
//
2
// This unit is part of the GLScene Engine https://github.com/glscene
3
//
4
{
5
  Spatial partitioning related code that also uses GLScene objects
6

7
  History :  
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
21
   
22
}
23

24
unit GLSpatialPartitioning;
25

26
interface
27

28
uses
29
  GLViewer, GLSpacePartition, GLScene, GLVectorGeometry,
30
  OpenGLTokens, GLGeometryBB, GLRenderContextInfo, GLState;
31

32
type
33
  { Object for holding glscene objects in a spatial partitioning }
34
  TSceneObj = class(TSpacePartitionLeaf)
35
  public
36
    Obj: TGLBaseSceneObject;
37
    procedure UpdateCachedAABBAndBSphere; override;
38
    constructor CreateObj(Owner: TSectoredSpacePartition; aObj: TGLBaseSceneObject);
39
    destructor Destroy; override;
40
  end;
41

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);
46

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;
51

52
function ExtendedFrustumMakeFromSceneViewer(const AFrustum: TFrustum;
53
  const AGLSceneViewer: TGLSceneViewer): TExtendedFrustum; overload;
54

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;
58

59
implementation
60

61
uses
62
  GLVectorTypes,
63
  GLContext;
64

65
procedure RenderAABB(var rci: TGLRenderContextInfo; AABB: TAABB);
66
begin
67
  RenderAABB(rci, AABB, 1, 0.8, 0.8, 0.8);
68
end;
69

70
procedure RenderAABB(var rci: TGLRenderContextInfo; AABB: TAABB; w, r, g, b: single);
71
begin
72
  GL.Color3f(r, g, b);
73
  rci.GLStates.LineWidth := w;
74

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]);
81

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]);
87
  GL.End_;
88

89
  GL.Begin_(GL_LINES);
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]);
92

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]);
95

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]);
98
  GL.End_;
99
end;
100

101
// RenderSpatialPartitioning
102
//
103

104
procedure RenderSpatialPartitioning(var rci: TGLRenderContextInfo;
105
  const Space: TSectoredSpacePartition);
106

107
  procedure RenderSectorNode(Node: TSectorNode);
108
  var
109
    i: integer;
110
    AABB: TAABB;
111
  begin
112
    if Node.NoChildren then
113
    begin
114
      AABB := Node.AABB;
115

116
      if Node.RecursiveLeafCount > 0 then
117
        RenderAABB(rci, AABB, 1, 0, 0, 0)
118
      else
119
        RenderAABB(rci, AABB, 1, 0.8, 0.8, 0.8) //}
120

121
    end
122
    else
123
    begin
124
      for i := 0 to Node.ChildCount - 1 do
125
        RenderSectorNode(Node.Children[i]);
126
    end;
127
  end;
128
begin
129
  rci.GLStates.Disable(stLighting);
130
  RenderSectorNode(Space.RootNode);
131
end;
132

133
function ExtendedFrustumMakeFromSceneViewer(const AFrustum: TFrustum;
134
  const AGLSceneViewer: TGLSceneViewer): TExtendedFrustum; //old version
135
begin
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);
143
end;
144

145
function ExtendedFrustumMakeFromSceneViewer(const AFrustum: TFrustum;
146
  const vWidth, vHeight: integer; AGLCamera: TGLCamera): TExtendedFrustum; //changed version
147
var
148
  buffov: single;
149
begin
150
  if vWidth < vHeight then
151
    buffov := AGLCamera.GetFieldOfView(vWidth)
152
  else
153
    buffov := AGLCamera.GetFieldOfView(vHeight);
154
  result := ExtendedFrustumMake(AFrustum,
155
    AGLCamera.NearPlane,
156
    AGLCamera.DepthOfView,
157
    buffov,
158
    AGLCamera.Position.AsAffineVector,
159
    AGLCamera.Direction.AsAffineVector);
160
end;
161

162
{ TSceneObj }
163

164
constructor TSceneObj.CreateObj(Owner: TSectoredSpacePartition; aObj: TGLBaseSceneObject);
165
begin
166
  Obj := aObj;
167
  inherited CreateOwned(Owner);
168
end;
169

170
destructor TSceneObj.Destroy;
171
begin
172
  inherited;
173
end;
174

175
procedure TSceneObj.UpdateCachedAABBAndBSphere;
176
begin
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);
182
end;
183
end.
184

185

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.