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
|
#ifndef INTERMEDIATE_RENDERER_H
#define INTERMEDIATE_RENDERER_H
#include "BaseRenderer.h"
#include "Runtime/Shaders/MaterialProperties.h"
#include "Runtime/Utilities/MemoryPool.h"
#include "SceneNode.h"
#include "IntermediateUsers.h"
#include "Runtime/Shaders/Material.h"
#include "Runtime/Modules/ExportModules.h"
class Mesh;
class Camera;
class Matrix4x4f;
class Vector3f;
class Quaternionf;
class Sprite;
class EXPORT_COREMODULE IntermediateRenderer : public BaseRenderer
{
public:
IntermediateRenderer ();
virtual ~IntermediateRenderer();
void Initialize(const Matrix4x4f& matrix, const AABB& localAABB, PPtr<Material> material, int layer, bool castShadows, bool receiveShadows);
// BaseRenderer
virtual UInt32 GetLayerMask() const { return 1<<m_Layer; }
virtual int GetLayer() const { return m_Layer; }
virtual int GetMaterialCount() const { return 1; }
virtual PPtr<Material> GetMaterial(int i) const { return m_Material; }
virtual void OnAssetDeleted() = 0;
virtual void OnAssetBoundsChanged();
void SetPropertyBlock( const MaterialPropertyBlock& block )
{
m_Properties = block;
m_CustomProperties = &m_Properties;
ComputeCustomPropertiesHash();
}
#if UNITY_EDITOR
SInt32 GetInstanceID() const { return m_InstanceID; }
void SetInstanceID (SInt32 id) { m_InstanceID = id; }
#endif
virtual void UpdateTransformInfo() {};
virtual void UpdateAABB() {Assert(false);}
const AABB& GetCachedWorldAABB () const { return m_TransformInfo.worldAABB; }
protected:
ListNode<IntermediateRenderer> m_Node;
PPtr<Material> m_Material;
MaterialPropertyBlock m_Properties;
int m_Layer;
#if UNITY_EDITOR
SInt32 m_InstanceID;
#endif
};
class EXPORT_COREMODULE MeshIntermediateRenderer : public IntermediateRenderer
{
public:
MeshIntermediateRenderer();
virtual ~MeshIntermediateRenderer();
void Initialize(const Matrix4x4f& matrix, Mesh* mesh, const AABB& localAABB, PPtr<Material> material, int layer, bool castShadows, bool receiveShadows, int submeshIndex);
// BaseRenderer
virtual void Render(int materialIndex, const ChannelAssigns& channels);
virtual void OnAssetDeleted();
static void StaticInitialize ();
static void StaticDestroy ();
private:
// Note: not using per-frame linear allocator, because in the editor
// it can render multiple frames using single player loop run (e.g. when editor is paused).
// Clearing per-frame data and then trying to use it later leads to Bad Things.
DECLARE_POOLED_ALLOC(MeshIntermediateRenderer);
Mesh* m_Mesh;
int m_SubMeshIndex;
};
#if ENABLE_SPRITES
class EXPORT_COREMODULE SpriteIntermediateRenderer : public IntermediateRenderer
{
public:
SpriteIntermediateRenderer();
virtual ~SpriteIntermediateRenderer();
void Initialize(const Matrix4x4f& matrix, Sprite* sprite, const AABB& localAABB, PPtr<Material> material, int layer, const ColorRGBA32& color);
// BaseRenderer
virtual void Render(int materialIndex, const ChannelAssigns& channels);
virtual void OnAssetDeleted();
static void StaticInitialize ();
static void StaticDestroy ();
private:
// Note: not using per-frame linear allocator, because in the editor
// it can render multiple frames using single player loop run (e.g. when editor is paused).
// Clearing per-frame data and then trying to use it later leads to Bad Things.
DECLARE_POOLED_ALLOC(SpriteIntermediateRenderer);
Sprite* m_Sprite;
ColorRGBAf m_Color;
};
#endif
class IntermediateRenderers
{
public:
void Clear( size_t startIndex = 0 );
const AABB* GetBoundingBoxes () const;
const SceneNode* GetSceneNodes () const;
size_t GetRendererCount () const { return m_BoundingBoxes.size(); }
void Add(IntermediateRenderer* renderer, int layer);
private:
dynamic_array<SceneNode> m_SceneNodes;
dynamic_array<AABB> m_BoundingBoxes;
};
IntermediateRenderer* AddMeshIntermediateRenderer( const Matrix4x4f& matrix, Mesh* mesh, PPtr<Material> material, int layer, bool castShadows, bool receiveShadows, int submeshIndex, Camera* camera );
IntermediateRenderer* AddMeshIntermediateRenderer( const Matrix4x4f& matrix, Mesh* mesh, const AABB& localAABB, PPtr<Material> material, int layer, bool castShadows, bool receiveShadows, int submeshIndex , Camera* camera );
#if ENABLE_SPRITES
IntermediateRenderer* AddSpriteIntermediateRenderer(const Matrix4x4f& matrix, Sprite* sprite, PPtr<Material> material, int layer, const ColorRGBA32& color, Camera* camera);
IntermediateRenderer* AddSpriteIntermediateRenderer(const Matrix4x4f& matrix, Sprite* sprite, const AABB& localAABB, PPtr<Material> material, int layer, const ColorRGBA32& color, Camera* camera);
#endif
#endif
|