TDME2 1.9.121
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
EntityRenderer.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <unordered_map>
5#include <vector>
6
7#include <tdme/tdme.h>
16#include <tdme/engine/Entity.h>
18#include <tdme/math/fwd-tdme.h>
20#include <tdme/math/Matrix4x4.h>
24#include <tdme/utilities/Pool.h>
25
26using std::string;
27using std::to_string;
28using std::unordered_map;
29using std::vector;
30
52
53/**
54 * Rendering class
55 * @author Andreas Drewke
56 * @version $Id$
57 */
62
63private:
64 static constexpr int32_t BATCHRENDERER_MAX { 256 };
65 static constexpr int32_t INSTANCEDRENDERING_OBJECTS_MAX { 16384 };
66
68 vector<int32_t>* vboInstancedRenderingIds { nullptr };
73 vector<Object3D*> objectsToRender;
74 vector<Object3D*> objectsNotRendered;
75 vector<Object3D*> objectsByModelToRender;
76 vector<Object3D*> objectsByModelNotRendered;
77 };
78
79 Engine* engine { nullptr };
80 Renderer* renderer { nullptr };
81
82 vector<BatchRendererTriangles*> trianglesBatchRenderers;
83 unordered_map<uint8_t, unordered_map<Model*, vector<Object3D*>>> objectsByShadersAndModels;
84 vector<TransparentRenderFace*> nodeTransparentRenderFaces;
87 unordered_map<string, TransparentRenderFacesGroup*> transparentRenderFacesGroups;
91 vector<Object3DRenderContext> contexts;
92
93 /**
94 * Renders transparent faces
95 * TODO: guess this should be optimized regarding GL commands
96 * skinned mesh is not supported when using GPU
97 * @param transparentRenderFaces transparent render faces
98 */
99 void prepareTransparentFaces(const vector<TransparentRenderFace*>& transparentRenderFaces);
100
101 /**
102 * Render transparent faces groups
103 * @param contextIdx context index
104 */
105 void renderTransparentFacesGroups(int contextIdx);
106
107 /**
108 * Release transparent faces groups
109 */
111
112 /**
113 * Renders multiple objects of same type(with same model)
114 * @param threadIdx thread idx
115 * @param objects objects of same type/ with same models
116 * @param collectTransparentFaces collect render faces
117 * @param renderTypes render types
118 * @param transparentRenderFacesPool transparent render faces pool
119 */
120 inline void renderObjectsOfSameType(int threadIdx, const vector<Object3D*>& objects, bool collectTransparentFaces, int32_t renderTypes, TransparentRenderFacesPool* transparentRenderFacesPool) {
122 renderObjectsOfSameTypeInstanced(threadIdx, objects, collectTransparentFaces, renderTypes, transparentRenderFacesPool);
123 } else {
124 renderObjectsOfSameTypeNonInstanced(objects, collectTransparentFaces, renderTypes);
125 }
126 }
127
128 /**
129 * Renders multiple objects of same type(with same model) not using instancing
130 * @param objects objects of same type/ with same models
131 * @param collectTransparentFaces collect render faces
132 * @param renderTypes render types
133 */
134 void renderObjectsOfSameTypeNonInstanced(const vector<Object3D*>& objects, bool collectTransparentFaces, int32_t renderTypes);
135
136 /**
137 * Renders multiple objects of same type(with same model) using instancing
138 * @param threadIdx thread idx
139 * @param objects objects of same type/ with same models
140 * @param collectTransparentFaces collect render faces
141 * @param renderTypes render types
142 */
143 void renderObjectsOfSameTypeInstanced(int threadIdx, const vector<Object3D*>& objects, bool collectTransparentFaces, int32_t renderTypes, TransparentRenderFacesPool* transparentRenderFacesPool);
144
145 /**
146 * Checks if a material could change when having multiple objects but same model
147 * @param object3DNode object 3d node
148 * @param facesEntityIdx faces entity idx
149 * @param renderTypes render types
150 */
151 inline bool checkMaterialChangable(Object3DNode* object3DNode, int32_t facesEntityIdx, int32_t renderTypes) {
153 }
154
155 /**
156 * Set ups a material for rendering
157 * @param contextIdx context index
158 * @param object3DNode object 3d node
159 * @param facesEntityIdx faces entity idx
160 * @param renderTypes render types
161 * @param updateOnly update only, means material has been set up already, only do changes
162 * @param materialKey material key
163 * @param currentMaterialKey current material key or empty
164 */
165 void setupMaterial(int contextIdx, Object3DNode* object3DNode, int32_t facesEntityIdx, int32_t renderTypes, bool updateOnly, string& materialKey, const string& currentMaterialKey = string());
166
167 /**
168 * Clear material for rendering
169 * @param contextIdx context index
170 */
171 void clearMaterial(int contextIdx);
172
173 /**
174 * Render function
175 * @param threadIdx thread index
176 * @param objects objects
177 * @param visibleObjectsByModels objects by models storage
178 * @param renderTransparentFaces render transparent faces
179 * @param renderTypes render types
180 */
181 inline void renderFunction(
182 int threadIdx,
183 Entity::RenderPass renderPass,
184 const vector<Object3D*>& objects,
185 unordered_map<uint8_t, unordered_map<Model*, vector<Object3D*>>>& objectsByShadersAndModels,
187 int renderTypes,
189 // reset shader
190 renderer->setShader(threadIdx, string());
191 auto effectPass = renderer->getEffectPass();
192 // sort objects by model
193 Vector3 objectCamFromAxis;
194 auto camera = engine->getCamera();
195 for (auto objectIdx = 0; objectIdx < objects.size(); objectIdx++) {
196 auto object = objects[objectIdx];
197 if (object->enabledInstances == 0) continue;
198 if (effectPass != 0 && object->excludeFromEffectPass == effectPass) continue;
199 if (object->renderPass != renderPass) continue;
200 auto objectUniqueShaderId = object->getDistanceShader().empty() == true?
201 object->getUniqueShaderId():
202 objectCamFromAxis.set(object->getBoundingBoxTransformed()->getCenter()).sub(camera->getLookFrom()).computeLengthSquared() < Math::square(object->getDistanceShaderDistance())?
203 object->getUniqueShaderId():
204 object->getUniqueDistanceShaderId();
205 auto& objectsByShaders = objectsByShadersAndModels[objectUniqueShaderId];
206 auto& objectsByModel = objectsByShaders[object->getModel()];
207 objectsByModel.push_back(object);
208 }
209
210 // render objects
211 auto& context = contexts[threadIdx];
212 for (auto& objectsByShaderAndModelIt: objectsByShadersAndModels) {
213 auto& objectsByModels = objectsByShaderAndModelIt.second;
214 for (auto& objectsByModelIt: objectsByModels) {
215 auto& objectsByModel = objectsByModelIt.second;
216 if (objectsByModel.size() == 0) {
217 continue;
218 } else
219 if (objectsByModel.size() > 0) {
220 do {
221 for (auto object: objectsByModel) {
222 if (context.objectsByModelToRender.size() == 0 ||
223 (object->instances == context.objectsByModelToRender[0]->instances &&
224 object->enabledInstances == context.objectsByModelToRender[0]->enabledInstances)) {
225 context.objectsByModelToRender.push_back(object);
226 } else {
227 context.objectsByModelNotRendered.push_back(object);
228 }
229 }
230 renderObjectsOfSameType(threadIdx, context.objectsByModelToRender, renderTransparentFaces, renderTypes, transparentRenderFacesPool);
231 objectsByModel = context.objectsByModelNotRendered;
232 context.objectsByModelToRender.clear();
233 context.objectsByModelNotRendered.clear();
234 } while (objectsByModel.size() > 0);
235 }
236 objectsByModel.clear();
237 }
238 }
239 }
240
241public:
242 static constexpr int32_t RENDERTYPE_NORMALS { 1 };
243 static constexpr int32_t RENDERTYPE_TEXTUREARRAYS { 2 };
245 static constexpr int32_t RENDERTYPE_EFFECTCOLORS { 8 };
246 static constexpr int32_t RENDERTYPE_MATERIALS { 16 };
247 static constexpr int32_t RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY { 32 };
248 static constexpr int32_t RENDERTYPE_TEXTURES { 64 };
249 static constexpr int32_t RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY { 128 };
250 static constexpr int32_t RENDERTYPE_LIGHTS { 256 };
251 static constexpr int32_t RENDERTYPE_SHADOWMAPPING { 512 };
252 static constexpr int32_t RENDERTYPE_RENDERGROUP_OBJECTORIGIN { 1024 };
253 static constexpr int32_t RENDERTYPE_ALL { 2047 };
254
255 /**
256 * Public constructor
257 * @param engine engine
258 * @param renderer renderer
259 */
261
262 /**
263 * Destructor
264 */
266
267 /**
268 * Init
269 */
270 void initialize();
271
272 /**
273 * Dispose
274 */
275 void dispose();
276
277 /**
278 * @return batch renderer for triangles
279 */
281
282 /**
283 * Resets the object 3d renderer
284 */
285 void reset();
286
287 /**
288 * Renders all given objects
289 * @param renderPass render pass
290 * @param objects objects
291 * @param renderTransparentFaces render transparent faces
292 * @param renderTypes render types
293 */
294 void render(Entity::RenderPass renderPass, const vector<Object3D*>& objects, bool renderTransparentFaces, int32_t renderTypes);
295
296 /**
297 * Renders collected transparent faces
298 */
300
301 /**
302 * Render points particle system entities
303 * @param renderPass render pass
304 * @param pses points particle system entities
305 */
306 void render(Entity::RenderPass renderPass, const vector<Entity*>& pses);
307
308 /**
309 * Renders all given lines objects
310 * @param renderPass render pass
311 * @param objects lines objects
312 */
313 void render(Entity::RenderPass renderPass, const vector<LinesObject3D*>& objects);
314
315};
Engine main class.
Definition: Engine.h:122
Camera * getCamera()
Definition: Engine.h:907
TDME engine entity.
Definition: Entity.h:31
Fog particle system entity to be used with engine class.
Object 3D to be used with engine class.
Definition: LinesObject3D.h:39
Object 3D to be used with engine class.
Definition: Object3D.h:60
Point particle system entity to be used with engine class.
Color 4 definition.
Definition: Color4.h:20
Represents a material.
Definition: Material.h:21
Representation of a 3d model.
Definition: Model.h:32
int32_t getEffectPass()
Get effect pass.
Definition: Renderer.h:460
virtual bool isInstancedRenderingAvailable()=0
Checks if instanced rendering is available.
void setShader(int contextIdx, const string &id)
Set shader.
Definition: Renderer.h:1178
EntityRenderer(Engine *engine, Renderer *renderer)
Public constructor.
static constexpr int32_t RENDERTYPE_TEXTUREARRAYS_DIFFUSEMASKEDTRANSPARENCY
void prepareTransparentFaces(const vector< TransparentRenderFace * > &transparentRenderFaces)
Renders transparent faces TODO: guess this should be optimized regarding GL commands skinned mesh is ...
void render(Entity::RenderPass renderPass, const vector< Object3D * > &objects, bool renderTransparentFaces, int32_t renderTypes)
Renders all given objects.
EntityRenderer_TransparentRenderFacesGroupPool * transparentRenderFacesGroupPool
void renderObjectsOfSameTypeInstanced(int threadIdx, const vector< Object3D * > &objects, bool collectTransparentFaces, int32_t renderTypes, TransparentRenderFacesPool *transparentRenderFacesPool)
Renders multiple objects of same type(with same model) using instancing.
static constexpr int32_t RENDERTYPE_TEXTURES_DIFFUSEMASKEDTRANSPARENCY
void renderObjectsOfSameType(int threadIdx, const vector< Object3D * > &objects, bool collectTransparentFaces, int32_t renderTypes, TransparentRenderFacesPool *transparentRenderFacesPool)
Renders multiple objects of same type(with same model)
TransparentRenderFacesPool * transparentRenderFacesPool
bool checkMaterialChangable(Object3DNode *object3DNode, int32_t facesEntityIdx, int32_t renderTypes)
Checks if a material could change when having multiple objects but same model.
static constexpr int32_t RENDERTYPE_MATERIALS_DIFFUSEMASKEDTRANSPARENCY
unordered_map< uint8_t, unordered_map< Model *, vector< Object3D * > > > objectsByShadersAndModels
void releaseTransparentFacesGroups()
Release transparent faces groups.
static constexpr int32_t RENDERTYPE_RENDERGROUP_OBJECTORIGIN
void renderFunction(int threadIdx, Entity::RenderPass renderPass, const vector< Object3D * > &objects, unordered_map< uint8_t, unordered_map< Model *, vector< Object3D * > > > &objectsByShadersAndModels, bool renderTransparentFaces, int renderTypes, TransparentRenderFacesPool *transparentRenderFacesPool)
Render function.
void setupMaterial(int contextIdx, Object3DNode *object3DNode, int32_t facesEntityIdx, int32_t renderTypes, bool updateOnly, string &materialKey, const string &currentMaterialKey=string())
Set ups a material for rendering.
void renderTransparentFacesGroups(int contextIdx)
Render transparent faces groups.
vector< TransparentRenderFace * > nodeTransparentRenderFaces
void clearMaterial(int contextIdx)
Clear material for rendering.
unordered_map< string, TransparentRenderFacesGroup * > transparentRenderFacesGroups
void reset()
Resets the object 3d renderer.
RenderTransparentRenderPointsPool * renderTransparentRenderPointsPool
vector< BatchRendererTriangles * > trianglesBatchRenderers
void renderObjectsOfSameTypeNonInstanced(const vector< Object3D * > &objects, bool collectTransparentFaces, int32_t renderTypes)
Renders multiple objects of same type(with same model) not using instancing.
void renderTransparentFaces()
Renders collected transparent faces.
Object 3d node specifically for rendering.
Definition: Object3DNode.h:39
vector< int32_t > specularMaterialDynamicDiffuseTextureIdsByEntities
Definition: Object3DNode.h:64
3x3 2D Matrix class
Definition: Matrix2D3x3.h:22
Simple class to determine if a transform is negative.
4x4 3D Matrix class
Definition: Matrix4x4.h:24
3D vector 3 class
Definition: Vector3.h:22
Vector3 & set(float x, float y, float z)
Set up vector.
Definition: Vector3.h:73
float computeLengthSquared() const
Definition: Vector3.h:209
Vector3 & sub(const Vector3 &v)
Subtracts a vector.
Definition: Vector3.h:325
Byte buffer class.
Definition: ByteBuffer.h:24
Pool template class.
Definition: Pool.h:22