TDME2  1.9.200
ObjectRenderGroup.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <array>
4 #include <memory>
5 #include <string>
6 #include <unordered_map>
7 #include <vector>
8 
9 #include <tdme/tdme.h>
10 #include <tdme/engine/fwd-tdme.h>
12 #include <tdme/engine/Color4.h>
14 #include <tdme/engine/model/Node.h>
17 #include <tdme/engine/Camera.h>
18 #include <tdme/engine/Entity.h>
20 #include <tdme/engine/LODObject.h>
21 #include <tdme/engine/Object.h>
22 #include <tdme/engine/Rotation.h>
23 #include <tdme/engine/Transform.h>
24 #include <tdme/math/Matrix4x4.h>
25 #include <tdme/math/Vector3.h>
26 
27 using std::array;
28 using std::string;
29 using std::to_string;
30 using std::unique_ptr;
31 using std::unordered_map;
32 using std::vector;
33 
48 
49 /**
50  * Object render group for static objects that might be animated by shaders
51  * @author Andreas Drewke
52  */
54  public Transform,
55  public Entity
56 {
57 private:
58  Engine* engine { nullptr };
59  bool frustumCulling { true };
60 
61  string id;
62  bool enabled;
63  bool pickable;
72  unique_ptr<Entity> combinedEntity;
73  unordered_map<Model*, vector<Transform>> transformByModel;
74  vector<unique_ptr<Model>> combinedModels;
76  string shaderId { "default" };
77  array<int, 3> lodReduceBy;
78 
80 
82 
85 
86  /**
87  * Compute bounding box
88  */
89  inline void updateBoundingBox() {
90  if (combinedEntity == nullptr) return;
93  }
94 
95  /**
96  * Combine node into given combined model
97  * @param sourceNode source node to combine into current model
98  * @param origins origins
99  * @param objectParentTransformMatrices object parent transform matrix
100  * @param combinedModel combined model
101  * @param reduceFactorBy reduce factor by
102  */
103  static void combineNode(Node* sourceNode, const vector<Vector3>& origins, const vector<Matrix4x4>& objectParentTransformMatrices, Model* combinedModel);
104 
105  /**
106  * Combine model with transform into current model
107  * @param model model
108  * @param transform transform
109  * @param combinedModel combined model
110  * @param reduceFactorBy reduce factor by
111  * @return model
112  */
113  static void combineObjects(Model* model, const vector<Transform>& objectsTransform, Model* combinedModel);
114 
115  // overridden methods
116  inline void setParentTransform(const Transform& parentTransform) override {
117  //
118  this->parentTransform = parentTransform;
119  auto entityTransform = parentTransform * (*this);
120  entityTransformMatrix = entityTransform.getTransformMatrix();
121  //
122  if (combinedEntity != nullptr) combinedEntity->setParentTransform(parentTransform);
123  //
125  }
126 
127 public:
128  // forbid class copy
130 
131  /**
132  * Public constructor
133  * @param id id
134  * @param model model
135  * @param lodLevels lod levels
136  * @param modelLOD2MinDistance model LOD 2 min distance
137  * @param modelLOD3MinDistance model LOD 3 min distance
138  * @param modelLOD2ReduceBy model LOD 2 reduce by factor
139  * @param modelLOD3ReduceBy model LOD 3 reduce by factor
140  * @param optimizeModels optimize models
141  */
143  const string& id,
144  int lodLevels = 1,
145  float modelLOD2MinDistance = 25.0f,
146  float modelLOD3MinDistance = 50.0f,
147  int modelLOD2ReduceBy = 4,
148  int modelLOD3ReduceBy = 16,
149  bool optimizeModels = true
150  );
151 
152  /**
153  * Destructor
154  */
156 
157  // overridden methods
158  inline EntityType getEntityType() override {
160  }
161 
162  /**
163  * Update render group model and bounding box
164  */
165  void updateRenderGroup();
166 
167  /**
168  * @return entity
169  */
170  inline Entity* getEntity() {
171  return combinedEntity.get();
172  }
173 
174  /**
175  * Adds a instance to this render group
176  * @param model model
177  * @param transform transform
178  */
179  void addObject(Model* model, const Transform& transform);
180 
181  // overridden methods
182  void setEngine(Engine* engine) override;
183  void setRenderer(Renderer* renderer) override;
184  void initialize() override;
185  void dispose() override;
186 
187  inline bool isEnabled() override {
188  return enabled;
189  }
190 
191  void setEnabled(bool enabled) override;
192  bool isFrustumCulling() override;
193  void setFrustumCulling(bool frustumCulling) override;
194  void update() override;
195 
196  inline BoundingBox* getBoundingBox() override {
197  return &boundingBox;
198  }
199 
200  inline BoundingBox* getWorldBoundingBox() override {
201  return &worldBoundingBox;
202  }
203 
204  inline const Color4& getEffectColorMul() const override {
205  return effectColorMul;
206  }
207 
208  inline void setEffectColorMul(const Color4& effectColorMul) override {
209  this->effectColorMul = effectColorMul;
210  }
211 
212  inline const Color4& getEffectColorAdd() const override {
213  return effectColorAdd;
214  }
215 
216  inline void setEffectColorAdd(const Color4& effectColorAdd) override {
217  this->effectColorAdd = effectColorAdd;
218  }
219 
220  inline const string& getId() override {
221  return id;
222  }
223 
224  inline bool isPickable() override {
225  return pickable;
226  }
227 
228  inline bool isContributesShadows() override {
229  return contributesShadows;
230  }
231 
232  inline void setContributesShadows(bool contributesShadows) override {
233  this->contributesShadows = contributesShadows;
234  if (combinedEntity != nullptr) combinedEntity->setContributesShadows(contributesShadows);
235  }
236 
237  inline bool isReceivesShadows() override {
238  return receivesShadows;
239  }
240 
241  inline void setReceivesShadows(bool receivesShadows) override {
242  this->receivesShadows = receivesShadows;
243  if (combinedEntity != nullptr) combinedEntity->setReceivesShadows(receivesShadows);
244  }
245 
246  inline void setPickable(bool pickable) override {
247  if (combinedEntity != nullptr) combinedEntity->setPickable(pickable);
248  }
249 
250  inline const Vector3& getTranslation() const override {
251  return Transform::getTranslation();
252  }
253 
254  inline void setTranslation(const Vector3& translation) override {
256  }
257 
258  inline const Vector3& getScale() const override {
259  return Transform::getScale();
260  }
261 
262  inline void setScale(const Vector3& scale) override {
264  }
265 
266  inline const int getRotationCount() const override {
268  }
269 
270  inline Rotation& getRotation(const int idx) override {
271  return Transform::getRotation(idx);
272  }
273 
274  inline void addRotation(const Vector3& axis, const float angle) override {
275  Transform::addRotation(axis, angle);
276  }
277 
278  inline void removeRotation(const int idx) override {
280  }
281 
282  inline const Vector3& getRotationAxis(const int idx) const override {
283  return Transform::getRotationAxis(idx);
284  }
285 
286  inline void setRotationAxis(const int idx, const Vector3& axis) override {
287  Transform::setRotationAxis(idx, axis);
288  }
289 
290  inline const float getRotationAngle(const int idx) const override {
291  return Transform::getRotationAngle(idx);
292  }
293 
294  inline void setRotationAngle(const int idx, const float angle) override {
295  Transform::setRotationAngle(idx, angle);
296  }
297 
298  inline const Quaternion& getRotationsQuaternion() const override {
300  }
301 
302  inline const Matrix4x4& getTransformMatrix() const override {
303  return entityTransformMatrix;
304  }
305 
306  inline const Transform& getParentTransform() const override {
307  return parentTransform;
308  }
309 
310  inline const Transform& getTransform() const override {
311  return *this;
312  }
313 
314  void setTransform(const Transform& transform) override;
315 
316  inline RenderPass getRenderPass() const override {
317  return renderPass;
318  }
319 
320  inline void setRenderPass(RenderPass renderPass) override {
321  this->renderPass = renderPass;
322  if (combinedEntity == nullptr) return;
323  combinedEntity->setRenderPass(renderPass);
324  }
325 
326  /**
327  * @return shader id
328  */
329  inline const string& getShader() {
330  return shaderId;
331  }
332 
333  /**
334  * Set shader id
335  * @param id shader
336  */
337  inline void setShader(const string& id) {
338  this->shaderId = id;
339  shaderParameters.setShader(id);
340  // TODO: put me into entity interface
341  if (combinedEntity == nullptr) return;
342  if (combinedEntity->getEntityType() == Entity::ENTITYTYPE_OBJECT) {
343  static_cast<Object*>(combinedEntity.get())->setShader(id);
344  shaderParameters.setShader(static_cast<Object*>(combinedEntity.get())->getShader());
345  } else
346  if (combinedEntity->getEntityType() == Entity::ENTITYTYPE_LODOBJECT) {
347  static_cast<LODObject*>(combinedEntity.get())->setShader(id);
349  }
350  }
351 
352  /**
353  * Returns shader parameter for given parameter name, if the value does not exist, the default will be returned
354  * @param shaderId shader id
355  * @param parameterName parameter name
356  * @return shader parameter
357  */
358  inline const ShaderParameter getShaderParameter(const string& parameterName) {
359  return shaderParameters.getShaderParameter(parameterName);
360  }
361 
362  /**
363  * Set shader parameter for given parameter name
364  * @param shaderId shader id
365  * @param parameterName parameter name
366  * @param paraemterValue parameter value
367  */
368  inline void setShaderParameter(const string& parameterName, const ShaderParameter& parameterValue) {
369  shaderParameters.setShaderParameter(parameterName, parameterValue);
370  if (combinedEntity == nullptr) return;
371  if (combinedEntity->getEntityType() == Entity::ENTITYTYPE_OBJECT) {
372  static_cast<Object*>(combinedEntity.get())->setShaderParameter(parameterName, parameterValue);
373  } else
374  if (combinedEntity->getEntityType() == Entity::ENTITYTYPE_LODOBJECT) {
375  static_cast<LODObject*>(combinedEntity.get())->setShaderParameter(parameterName, parameterValue);
376  }
377  }
378 
379 };
Color 4 definition class.
Definition: Color4.h:18
Engine main class.
Definition: Engine.h:131
TDME2 engine entity shader parameters.
void setShaderParameter(const string &parameterName, const ShaderParameter &parameterValue)
Set shader parameter for given parameter name.
void setShader(const string &shaderId)
Set shader.
const ShaderParameter getShaderParameter(const string &parameterName) const
Returns shader parameter for given parameter name, if the value does not exist, the default will be r...
Engine entity.
Definition: Entity.h:30
friend class ObjectRenderGroup
Definition: Entity.h:34
@ ENTITYTYPE_OBJECTRENDERGROUP
Definition: Entity.h:96
LOD object to be used with engine class.
Definition: LODObject.h:49
Object render group for static objects that might be animated by shaders.
BoundingBox * getBoundingBox() override
const Vector3 & getTranslation() const override
const Transform & getTransform() const override
RenderPass getRenderPass() const override
void dispose() override
Dispose this entity.
void setShader(const string &id)
Set shader id.
static void combineNode(Node *sourceNode, const vector< Vector3 > &origins, const vector< Matrix4x4 > &objectParentTransformMatrices, Model *combinedModel)
Combine node into given combined model.
void setTranslation(const Vector3 &translation) override
Set translation.
void removeRotation(const int idx) override
Remove rotation.
Rotation & getRotation(const int idx) override
Get rotation at given index.
const int getRotationCount() const override
const Vector3 & getRotationAxis(const int idx) const override
void initialize() override
Initiates this entity.
EntityShaderParameters shaderParameters
void setRenderPass(RenderPass renderPass) override
Set render pass.
void setReceivesShadows(bool receivesShadows) override
Enable/disable receives shadows.
void addRotation(const Vector3 &axis, const float angle) override
Add rotation.
void update() override
Update transform.
void setPickable(bool pickable) override
Set this entity pickable.
void updateRenderGroup()
Update render group model and bounding box.
vector< unique_ptr< Model > > combinedModels
void setEffectColorMul(const Color4 &effectColorMul) override
Set effect color that will be multiplied with fragment color.
const ShaderParameter getShaderParameter(const string &parameterName)
Returns shader parameter for given parameter name, if the value does not exist, the default will be r...
void setShaderParameter(const string &parameterName, const ShaderParameter &parameterValue)
Set shader parameter for given parameter name.
void setTransform(const Transform &transform) override
Set transform.
void updateBoundingBox()
Compute bounding box.
unordered_map< Model *, vector< Transform > > transformByModel
const Quaternion & getRotationsQuaternion() const override
void setScale(const Vector3 &scale) override
Set scale.
void addObject(Model *model, const Transform &transform)
Adds a instance to this render group.
const Vector3 & getScale() const override
const float getRotationAngle(const int idx) const override
BoundingBox * getWorldBoundingBox() override
static void combineObjects(Model *model, const vector< Transform > &objectsTransform, Model *combinedModel)
Combine model with transform into current model.
unique_ptr< Entity > combinedEntity
const Color4 & getEffectColorMul() const override
The effect color will be multiplied with fragment color.
void setFrustumCulling(bool frustumCulling) override
Set frustum culling.
void setEngine(Engine *engine) override
Set up engine.
void setEnabled(bool enabled) override
Enable/disable rendering.
const Transform & getParentTransform() const override
const Matrix4x4 & getTransformMatrix() const override
const string & getId() override
EntityType getEntityType() override
void setContributesShadows(bool contributesShadows) override
Enable/disable contributes shadows.
void setRotationAxis(const int idx, const Vector3 &axis) override
Set rotation axis.
void setEffectColorAdd(const Color4 &effectColorAdd) override
Set effect color that will be added to fragment color.
const Color4 & getEffectColorAdd() const override
The effect color will be added to fragment color.
void setParentTransform(const Transform &parentTransform) override
Set parent transform.
void setRenderer(Renderer *renderer) override
Set up renderer.
void setRotationAngle(const int idx, const float angle) override
Object to be used with engine class.
Definition: Object.h:60
const string & getShader()
Definition: Object.h:360
Rotation representation.
Definition: Rotation.h:18
Shader parameter model class.
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
void setRotationAngle(const int idx, const float angle)
Definition: Transform.h:155
void setRotationAxis(const int idx, const Vector3 &axis)
Set rotation axis.
Definition: Transform.h:138
void setTranslation(const Vector3 &translation)
Set translation.
Definition: Transform.h:64
void removeRotation(const int idx)
Remove rotation.
Definition: Transform.h:121
const Vector3 & getScale() const
Definition: Transform.h:71
Rotation & getRotation(const int idx)
Get rotation at given index.
Definition: Transform.h:95
void setScale(const Vector3 &scale)
Set scale.
Definition: Transform.h:79
const int getRotationCount() const
Definition: Transform.h:86
const Vector3 & getRotationAxis(const int idx) const
Definition: Transform.h:129
const Quaternion & getRotationsQuaternion() const
Definition: Transform.h:162
const Vector3 & getTranslation() const
Definition: Transform.h:56
void addRotation(const Vector3 &axis, const float angle)
Add rotation.
Definition: Transform.h:113
const float getRotationAngle(const int idx) const
Definition: Transform.h:146
Representation of a 3D model.
Definition: Model.h:35
Model node.
Definition: Node.h:32
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Definition: BoundingBox.h:26
void fromBoundingVolume(BoundingBox *original)
Set up this bounding volume from given bounding volume.
Definition: BoundingBox.cpp:70
void fromBoundingVolumeWithTransformMatrix(BoundingBox *original, const Matrix4x4 &transformMatrix)
Create bounding volume from given original(of same type) with applied transform matrix.
Definition: BoundingBox.cpp:79
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Quaternion class representing quaternion mathematical structure and operations with x,...
Definition: Quaternion.h:24
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6