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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
#ifndef UNITYSCENE_H
#define UNITYSCENE_H
#include "Runtime/Geometry/AABB.h"
#include "IntermediateRenderer.h"
#include "Runtime/Utilities/dynamic_array.h"
#include "SceneNode.h"
#include "Runtime/Utilities/LinkedList.h"
#include "UmbraTomeData.h"
struct SceneCullingParameters;
struct CullingParameters;
struct CullingOutput;
class BaseRenderer;
class OcclusionPortal;
class Renderer;
class IntermediateRenderer;
class LODGroupManager;
class MinMaxAABB;
class Texture2D;
namespace Unity { class Component; class Culler; }
namespace Umbra { class QueryExt; class Tome; class CameraTransform; class Visibility; }
typedef int UmbraInt32;
// Function called when a node is determined to be visible.
//typedef bool CullFunction( void* user, const SceneNode& node, const AABB& aabb, float lodFade );
namespace Unity
{
// Simple dummy for the scene class, used by the cullers.
class Scene
{
public:
Scene ();
~Scene ();
void NotifyVisible(const CullingOutput& visibleObjects);
void NotifyInvisible();
void BeginCameraRender();
void EndCameraRender();
// Adds/removes from the scene
SceneHandle AddRenderer (Renderer *renderer);
BaseRenderer* RemoveRenderer (SceneHandle handle);
// Functions to set information about renderers
void SetDirtyAABB (SceneHandle handle) { SceneNode& node = m_RendererNodes[handle]; if (!node.dirtyAABB) { m_DirtyAABBList.push_back(handle); node.dirtyAABB = true; } }
void SetRendererAABB (SceneHandle handle, const AABB& aabb) { m_BoundingBoxes[handle] = aabb; m_RendererNodes[handle].dirtyAABB = false; }
void SetRendererLayer (SceneHandle handle, UInt32 layer) { m_RendererNodes[handle].layer = layer; }
void SetRendererLODGroup (SceneHandle handle, int group) { m_RendererNodes[handle].lodGroup = group; }
void SetRendererLODIndexMask (SceneHandle handle, UInt32 mask) { m_RendererNodes[handle].lodIndexMask = mask; }
void SetRendererNeedsCullCallback (SceneHandle handle, bool flag) { m_RendererNodes[handle].needsCullCallback = flag; }
// Const access only to SceneNode and AABB!
// Scene needs to be notified about changes and some data is private
const SceneNode& GetRendererNode (SceneHandle handle) { return m_RendererNodes[handle]; }
const AABB& GetRendererAABB (SceneHandle handle) { return m_BoundingBoxes[handle]; }
const SceneNode* GetStaticSceneNodes () const;
const SceneNode* GetDynamicSceneNodes () const;
const AABB* GetStaticBoundingBoxes () const;
const AABB* GetDynamicBoundingBoxes () const;
size_t GetRendererNodeCount () const { return m_RendererNodes.size(); }
size_t GetStaticObjectCount () const;
size_t GetDynamicObjectCount () const;
size_t GetIntermediateObjectCount () const;
void RecalculateDirtyBounds();
// Intermediate nodes
void ClearIntermediateRenderers();
IntermediateRenderers& GetIntermediateRenderers () { return m_IntermediateNodes; }
void SetOcclusionPortalEnabled (unsigned int portalIndex, bool enabled);
//@TODO: REview this function
void SetPreventAddRemoveRenderer(bool enable);
#if DEBUGMODE
bool HasNodeForRenderer( const BaseRenderer* r );
#endif
#if UNITY_EDITOR
void GetUmbraDebugLines (const CullingParameters& cullingParameters, dynamic_array<Vector3f>& lines, bool targetCells);
unsigned GetUmbraDataSize ();
bool IsPositionInPVSVolume (const Vector3f& pos);
#endif
Umbra::QueryExt* GetUmbraQuery () { return m_UmbraQuery; }
int GetNumRenderers() { return m_RendererNodes.size(); }
const UmbraTomeData& GetUmbraTome () { return m_UmbraTome; }
void CleanupPVSAndRequestRebuild ();
static void InitializeClass ();
static void CleanupClass ();
private:
void InitializeUmbra();
void CleanupUmbra ();
void CleanupUmbraNodesAndQuery ();
SceneHandle AddRendererInternal (Renderer *renderer, int layer, const AABB& aabb);
bool IsDirtyAABB (SceneHandle handle) const { return m_RendererNodes[handle].dirtyAABB; }
IntermediateRenderers m_IntermediateNodes;
dynamic_array<SceneHandle> m_PendingRemoval;
enum
{
kVisibleCurrentFrame = 1 << 0,
kVisiblePreviousFrame = 1 << 1,
kBecameVisibleCalled = 1 << 2
};
// These arrays are always kept in sync
dynamic_array<SceneNode> m_RendererNodes;
dynamic_array<AABB> m_BoundingBoxes;
dynamic_array<UInt8> m_VisibilityBits;
// Other data
dynamic_array<SceneHandle> m_DirtyAABBList;
Umbra::QueryExt* m_UmbraQuery;
UInt8* m_GateState;
UmbraTomeData m_UmbraTome;
int m_PreventAddRemoveRenderer;
bool m_RequestStaticPVSRebuild;
};
Scene& GetScene ();
} // namespace Unity
#endif
|