TDME2  1.9.200
LODObject.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 #include <string>
5 
6 #include <tdme/tdme.h>
7 #include <tdme/engine/fwd-tdme.h>
9 #include <tdme/engine/Color4.h>
13 #include <tdme/engine/Camera.h>
14 #include <tdme/engine/Entity.h>
16 #include <tdme/engine/Object.h>
17 #include <tdme/engine/Rotation.h>
18 #include <tdme/engine/Transform.h>
19 #include <tdme/math/Matrix4x4.h>
20 #include <tdme/math/Vector3.h>
21 #include <tdme/utilities/Console.h>
22 
23 using std::string;
24 using std::to_string;
25 using std::unique_ptr;
26 
41 
42 /**
43  * LOD object to be used with engine class
44  * @author Andreas Drewke
45  */
47  public Transform,
48  public Entity
49 {
50 public:
52 
53 private:
54  friend class ObjectRenderGroup;
55 
56  Engine* engine { nullptr };
57  bool frustumCulling { true };
58 
59  Model* modelLOD1 { nullptr };
60  Model* modelLOD2 { nullptr };
61  Model* modelLOD3 { nullptr };
67 
68  string id;
69  unique_ptr<Object> objectLOD1;
70  unique_ptr<Object> objectLOD2;
71  unique_ptr<Object> objectLOD3;
72  Object* objectLOD { nullptr };
73  int levelLOD;
74  bool enabled;
75  bool pickable;
85  string shaderId { "default" };
86 
88 
91 
92  // overridden methods
93  inline void setParentTransform(const Transform& parentTransform) override {
94  //
95  this->parentTransform = parentTransform;
96  auto entityTransform = parentTransform * (*this);
97  entityTransformMatrix = entityTransform.getTransformMatrix();
98  // delegate to LOD objects
99  if (objectLOD1 != nullptr) objectLOD1->setTransform(entityTransform);
100  if (objectLOD2 != nullptr) objectLOD2->setTransform(entityTransform);
101  if (objectLOD3 != nullptr) objectLOD3->setTransform(entityTransform);
102  }
103 
104 public:
105  // forbid class copy
107 
108  /**
109  * Public constructor
110  * @param id id
111  * @param modelLOD1 model LOD 1
112  * @param levelTypeLOD2 LOD level type LOD2
113  * @param modelLOD2MinDistance model LOD 2 min distance
114  * @param modelLOD2 model LOD 2
115  * @param levelTypeLOD3 LOD level type LOD3
116  * @param modelLOD3MinDistance model LOD 3 min distance
117  * @param modelLOD3 model LOD 3
118  * @param lodNoneMinDistance LOD None min distance
119  */
120  LODObject(
121  const string& id,
122  Model* modelLOD1,
124  float modelLOD2MinDistance,
125  Model* modelLOD2,
127  float modelLOD3MinDistance,
128  Model* modelLOD3,
129  float lodNoneMinDistance = 150.0f
130  );
131 
132  /**
133  * Public destructor
134  */
135  ~LODObject();
136 
137  // overridden method
138  inline EntityType getEntityType() override {
139  return ENTITYTYPE_LODOBJECT;
140  }
141 
142  /**
143  * @return LOD object 1
144  */
145  inline Object* getLOD1Object() {
146  return objectLOD1.get();
147  }
148 
149  /**
150  * @return LOD object 2
151  */
152  inline Object* getLOD2Object() {
153  return objectLOD2.get();
154  }
155 
156  /**
157  * @return LOD object 3
158  */
159  inline Object* getLOD3Object() {
160  return objectLOD3.get();
161  }
162 
163  /**
164  * @return LOD object
165  */
166  inline Object* getLODObject() {
167  // set effect colors
168  if (objectLOD != nullptr) {
169  // set effect colors
170  if (objectLOD != nullptr) {
171  if (levelLOD == 3) {
174  } else
175  if (levelLOD == 2) {
178  } else {
179  objectLOD->setEffectColorAdd(Color4(0.0f, 0.0f, 0.0f, 0.0f));
180  objectLOD->setEffectColorMul(Color4(1.0f, 1.0f, 1.0f, 1.0f));
181  }
184  effectColorAdd.add(this->effectColorAdd);
185  effectColorMul.scale(this->effectColorMul);
188  }
189  }
190 
191  //
192  return objectLOD;
193  }
194 
195  /**
196  * Get current lod object
197  * @param camera camera
198  * @return LOD object to render
199  */
200  inline Object* determineLODObject(Camera* camera) {
202  // determine LOD object and level type
203  auto objectCamFromLengthSquared = getWorldBoundingBox()->computeClosestPointInBoundingBox(camera->getLookFrom()).sub(camera->getLookFrom()).computeLengthSquared();
204  if (objectCamFromLengthSquared >= Math::square(lodNoneMinDistance)) {
205  objectLOD = nullptr;
206  levelLOD = 4;
207  } else
209  objectCamFromLengthSquared >= Math::square(modelLOD3MinDistance)) {
210  objectLOD = objectLOD3.get();
211  levelLOD = 3;
212  } else
214  objectCamFromLengthSquared >= Math::square(modelLOD2MinDistance)) {
215  objectLOD = objectLOD2.get();
216  levelLOD = 2;
217  } else {
218  objectLOD = objectLOD1.get();
219  levelLOD = 1;
220  }
221 
222  // set effect colors
223  if (objectLOD != nullptr) {
224  if (levelLOD == 3) {
227  } else
228  if (levelLOD == 2) {
231  } else {
232  objectLOD->setEffectColorAdd(Color4(0.0f, 0.0f, 0.0f, 0.0f));
233  objectLOD->setEffectColorMul(Color4(1.0f, 1.0f, 1.0f, 1.0f));
234  }
237  effectColorAdd.add(this->effectColorAdd);
238  effectColorMul.scale(this->effectColorMul);
241  }
242 
243  // done
244  return objectLOD;
245  }
246 
247  /**
248  * @return effect color add for LOD2 level
249  */
250  inline const Color4& getEffectColorAddLOD2() const {
251  return effectColorAddLOD2;
252  }
253 
254  /**
255  * Set effect color add for LOD2 level
256  * @param effectColorAddLOD2 effect color add for LOD2 level
257  */
259  this->effectColorAddLOD2 = effectColorAddLOD2;
260  }
261 
262  /**
263  * @return effect color mul for LOD2 level
264  */
265  inline const Color4& getEffectColorMulLOD2() const {
266  return effectColorMulLOD2;
267  }
268 
269  /**
270  * Set effect color mul for LOD2 level
271  * @param effectColorMulLOD2 effect color mul for LOD2 level
272  */
274  this->effectColorMulLOD2 = effectColorMulLOD2;
275  }
276 
277  /**
278  * @return effect color add for LOD3 level
279  */
280  inline const Color4& getEffectColorAddLOD3() const {
281  return effectColorAddLOD3;
282  }
283 
284  /**
285  * Set effect color add for LOD3 level
286  * @param effectColorAddLOD3 effect color add for LOD3 level
287  */
289  this->effectColorAddLOD3 = effectColorAddLOD3;
290  }
291 
292  /**
293  * @return effect color mul for LOD3 level
294  */
295  inline const Color4& getEffectColorMulLOD3() const {
296  return effectColorMulLOD3;
297  }
298 
299  /**
300  * Set effect color mul for LOD3 level
301  * @param effectColorMulLOD3 effect color mul for LOD3 level
302  */
304  this->effectColorMulLOD3 = effectColorMulLOD3;
305  }
306 
307  // overridden methods
308  void setEngine(Engine* engine) override;
309  void setRenderer(Renderer* renderer) override;
310  void initialize() override;
311  void dispose() override;
312 
313  inline bool isEnabled() override {
314  return enabled;
315  }
316 
317  void setEnabled(bool enabled) override;
318  bool isFrustumCulling() override;
319  void setFrustumCulling(bool frustumCulling) override;
320  void update() override;
321 
322  inline BoundingBox* getBoundingBox() override {
323  return objectLOD1->getBoundingBox();
324  }
325 
326  inline BoundingBox* getWorldBoundingBox() override {
327  return objectLOD1->getWorldBoundingBox();
328  }
329 
330  inline const Color4& getEffectColorMul() const override {
331  return effectColorMul;
332  }
333 
334  inline void setEffectColorMul(const Color4& effectColorMul) override {
335  this->effectColorMul = effectColorMul;
336  }
337 
338  inline const Color4& getEffectColorAdd() const override {
339  return effectColorAdd;
340  }
341 
342  inline void setEffectColorAdd(const Color4& effectColorAdd) override {
343  this->effectColorAdd = effectColorAdd;
344  }
345 
346  inline const string& getId() override {
347  return id;
348  }
349 
350  inline bool isPickable() override {
351  return pickable;
352  }
353 
354  inline bool isContributesShadows() override {
355  return contributesShadows;
356  }
357 
358  inline void setContributesShadows(bool contributesShadows) override {
359  this->contributesShadows = contributesShadows;
360  if (objectLOD1 != nullptr) objectLOD1->setContributesShadows(contributesShadows);
361  if (objectLOD2 != nullptr) objectLOD2->setContributesShadows(contributesShadows);
362  if (objectLOD3 != nullptr) objectLOD3->setContributesShadows(contributesShadows);
363  }
364 
365  inline bool isReceivesShadows() override {
366  return receivesShadows;
367  }
368 
369  inline void setReceivesShadows(bool receivesShadows) override {
370  this->receivesShadows = receivesShadows;
371  if (objectLOD1 != nullptr) objectLOD1->setReceivesShadows(receivesShadows);
372  if (objectLOD2 != nullptr) objectLOD2->setReceivesShadows(receivesShadows);
373  if (objectLOD3 != nullptr) objectLOD3->setReceivesShadows(receivesShadows);
374  }
375 
376  inline void setPickable(bool pickable) override {
377  this->pickable = pickable;
378  }
379 
380  inline const Matrix4x4 getNodeTransformMatrix(const string& id) {
381  return objectLOD1->getNodeTransformMatrix(id);
382  }
383 
384  inline const Vector3& getTranslation() const override {
385  return Transform::getTranslation();
386  }
387 
388  inline void setTranslation(const Vector3& translation) override {
390  }
391 
392  inline const Vector3& getScale() const override {
393  return Transform::getScale();
394  }
395 
396  inline void setScale(const Vector3& scale) override {
398  }
399 
400  inline const int getRotationCount() const override {
402  }
403 
404  inline Rotation& getRotation(const int idx) override {
405  return Transform::getRotation(idx);
406  }
407 
408  inline void addRotation(const Vector3& axis, const float angle) override {
409  Transform::addRotation(axis, angle);
410  }
411 
412  inline void removeRotation(const int idx) override {
414  }
415 
416  inline const Vector3& getRotationAxis(const int idx) const override {
417  return Transform::getRotationAxis(idx);
418  }
419 
420  inline void setRotationAxis(const int idx, const Vector3& axis) override {
421  Transform::setRotationAxis(idx, axis);
422  }
423 
424  inline const float getRotationAngle(const int idx) const override {
425  return Transform::getRotationAngle(idx);
426  }
427 
428  inline void setRotationAngle(const int idx, const float angle) override {
429  Transform::setRotationAngle(idx, angle);
430  }
431 
432  inline const Quaternion& getRotationsQuaternion() const override {
434  }
435 
436  inline const Matrix4x4& getTransformMatrix() const override {
437  return entityTransformMatrix;
438  }
439 
440  inline const Transform& getParentTransform() const override {
441  return parentTransform;
442  }
443 
444  inline const Transform& getTransform() const override {
445  return *this;
446  }
447 
448  void setTransform(const Transform& transform) override;
449 
450  inline RenderPass getRenderPass() const override {
451  return renderPass;
452  }
453 
454  inline void setRenderPass(RenderPass renderPass) override {
455  this->renderPass = renderPass;
456  if (objectLOD1 != nullptr) objectLOD1->setRenderPass(renderPass);
457  if (objectLOD2 != nullptr) objectLOD2->setRenderPass(renderPass);
458  if (objectLOD3 != nullptr) objectLOD3->setRenderPass(renderPass);
459  }
460 
461  /**
462  * @return shader id
463  */
464  inline const string& getShader() {
465  return shaderId;
466  }
467 
468  /**
469  * Set shader id
470  * @param id shader
471  */
472  inline void setShader(const string& id) {
473  this->shaderId = id;
474  shaderParameters.setShader(shaderId);
475  if (objectLOD1 != nullptr) objectLOD1->setShader(shaderId);
476  if (objectLOD2 != nullptr) objectLOD2->setShader(shaderId);
477  if (objectLOD3 != nullptr) objectLOD3->setShader(shaderId);
478  }
479 
480  /**
481  * Returns shader parameter for given parameter name, if the value does not exist, the default will be returned
482  * @param shaderId shader id
483  * @param parameterName parameter name
484  * @return shader parameter
485  */
486  inline const ShaderParameter getShaderParameter(const string& parameterName) {
487  return shaderParameters.getShaderParameter(parameterName);
488  }
489 
490  /**
491  * Set shader parameter for given parameter name
492  * @param shaderId shader id
493  * @param parameterName parameter name
494  * @param paraemterValue parameter value
495  */
496  inline void setShaderParameter(const string& parameterName, const ShaderParameter& parameterValue) {
497  shaderParameters.setShaderParameter(parameterName, parameterValue);
498  if (objectLOD1 != nullptr) objectLOD1->setShaderParameter(parameterName, parameterValue);
499  if (objectLOD2 != nullptr) objectLOD2->setShaderParameter(parameterName, parameterValue);
500  if (objectLOD3 != nullptr) objectLOD3->setShaderParameter(parameterName, parameterValue);
501  }
502 
503 };
const Vector3 & getLookFrom() const
Definition: Camera.h:219
Color 4 definition class.
Definition: Color4.h:18
Color4 & add(float scalar)
Adds a scalar.
Definition: Color4.h:154
Color4 & scale(float scalar)
Scales this color.
Definition: Color4.h:206
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
LOD object to be used with engine class.
Definition: LODObject.h:49
BoundingBox * getBoundingBox() override
Definition: LODObject.h:322
const Vector3 & getTranslation() const override
Definition: LODObject.h:384
LODObject(const string &id, Model *modelLOD1, LODLevelType levelTypeLOD2, float modelLOD2MinDistance, Model *modelLOD2, LODLevelType levelTypeLOD3, float modelLOD3MinDistance, Model *modelLOD3, float lodNoneMinDistance=150.0f)
Public constructor.
Definition: LODObject.cpp:24
const Transform & getTransform() const override
Definition: LODObject.h:444
RenderPass getRenderPass() const override
Definition: LODObject.h:450
void dispose() override
Dispose this entity.
Definition: LODObject.cpp:171
void setShader(const string &id)
Set shader id.
Definition: LODObject.h:472
LODLevelType levelTypeLOD3
Definition: LODObject.h:66
const Color4 & getEffectColorAddLOD2() const
Definition: LODObject.h:250
void setTranslation(const Vector3 &translation) override
Set translation.
Definition: LODObject.h:388
Transform parentTransform
Definition: LODObject.h:89
void removeRotation(const int idx) override
Remove rotation.
Definition: LODObject.h:412
Rotation & getRotation(const int idx) override
Get rotation at given index.
Definition: LODObject.h:404
~LODObject()
Public destructor.
Definition: LODObject.cpp:81
RenderPass renderPass
Definition: LODObject.h:84
unique_ptr< Object > objectLOD3
Definition: LODObject.h:71
const int getRotationCount() const override
Definition: LODObject.h:400
const Vector3 & getRotationAxis(const int idx) const override
Definition: LODObject.h:416
void initialize() override
Initiates this entity.
Definition: LODObject.cpp:179
bool isReceivesShadows() override
Definition: LODObject.h:365
EntityShaderParameters shaderParameters
Definition: LODObject.h:87
void setRenderPass(RenderPass renderPass) override
Set render pass.
Definition: LODObject.h:454
void setReceivesShadows(bool receivesShadows) override
Enable/disable receives shadows.
Definition: LODObject.h:369
const string & getShader()
Definition: LODObject.h:464
void addRotation(const Vector3 &axis, const float angle) override
Add rotation.
Definition: LODObject.h:408
void update() override
Update transform.
Definition: LODObject.cpp:114
const Matrix4x4 getNodeTransformMatrix(const string &id)
Definition: LODObject.h:380
void setPickable(bool pickable) override
Set this entity pickable.
Definition: LODObject.h:376
Object * getLODObject()
Definition: LODObject.h:166
void setEffectColorMul(const Color4 &effectColorMul) override
Set effect color that will be multiplied with fragment color.
Definition: LODObject.h:334
const ShaderParameter getShaderParameter(const string &parameterName)
Returns shader parameter for given parameter name, if the value does not exist, the default will be r...
Definition: LODObject.h:486
const Color4 & getEffectColorMulLOD3() const
Definition: LODObject.h:295
bool isPickable() override
Definition: LODObject.h:350
LODLevelType levelTypeLOD2
Definition: LODObject.h:65
void setShaderParameter(const string &parameterName, const ShaderParameter &parameterValue)
Set shader parameter for given parameter name.
Definition: LODObject.h:496
Matrix4x4 entityTransformMatrix
Definition: LODObject.h:90
void setTransform(const Transform &transform) override
Set transform.
Definition: LODObject.cpp:98
unique_ptr< Object > objectLOD1
Definition: LODObject.h:69
void setEffectColorAddLOD2(const Color4 &effectColorAddLOD2)
Set effect color add for LOD2 level.
Definition: LODObject.h:258
const Color4 & getEffectColorAddLOD3() const
Definition: LODObject.h:280
const Quaternion & getRotationsQuaternion() const override
Definition: LODObject.h:432
void setScale(const Vector3 &scale) override
Set scale.
Definition: LODObject.h:396
bool isContributesShadows() override
Definition: LODObject.h:354
Object * getLOD1Object()
Definition: LODObject.h:145
const Vector3 & getScale() const override
Definition: LODObject.h:392
const Color4 & getEffectColorMulLOD2() const
Definition: LODObject.h:265
const float getRotationAngle(const int idx) const override
Definition: LODObject.h:424
BoundingBox * getWorldBoundingBox() override
Definition: LODObject.h:326
const Color4 & getEffectColorMul() const override
The effect color will be multiplied with fragment color.
Definition: LODObject.h:330
void setFrustumCulling(bool frustumCulling) override
Set frustum culling.
Definition: LODObject.cpp:154
void setEngine(Engine *engine) override
Set up engine.
Definition: LODObject.cpp:84
Object * getLOD3Object()
Definition: LODObject.h:159
void setEnabled(bool enabled) override
Enable/disable rendering.
Definition: LODObject.cpp:130
const Transform & getParentTransform() const override
Definition: LODObject.h:440
const Matrix4x4 & getTransformMatrix() const override
Definition: LODObject.h:436
const string & getId() override
Definition: LODObject.h:346
EntityType getEntityType() override
Definition: LODObject.h:138
void setEffectColorMulLOD3(const Color4 &effectColorMulLOD3)
Set effect color mul for LOD3 level.
Definition: LODObject.h:303
void setContributesShadows(bool contributesShadows) override
Enable/disable contributes shadows.
Definition: LODObject.h:358
void setRotationAxis(const int idx, const Vector3 &axis) override
Set rotation axis.
Definition: LODObject.h:420
unique_ptr< Object > objectLOD2
Definition: LODObject.h:70
bool isFrustumCulling() override
Definition: LODObject.cpp:150
bool isEnabled() override
Definition: LODObject.h:313
Object * determineLODObject(Camera *camera)
Get current lod object.
Definition: LODObject.h:200
void setEffectColorAddLOD3(const Color4 &effectColorAddLOD3)
Set effect color add for LOD3 level.
Definition: LODObject.h:288
void setEffectColorMulLOD2(const Color4 &effectColorMulLOD2)
Set effect color mul for LOD2 level.
Definition: LODObject.h:273
void setEffectColorAdd(const Color4 &effectColorAdd) override
Set effect color that will be added to fragment color.
Definition: LODObject.h:342
const Color4 & getEffectColorAdd() const override
The effect color will be added to fragment color.
Definition: LODObject.h:338
void setParentTransform(const Transform &parentTransform) override
Set parent transform.
Definition: LODObject.h:93
void setRenderer(Renderer *renderer) override
Set up renderer.
Definition: LODObject.cpp:94
Object * getLOD2Object()
Definition: LODObject.h:152
void setRotationAngle(const int idx, const float angle) override
Definition: LODObject.h:428
Object render group for static objects that might be animated by shaders.
Object to be used with engine class.
Definition: Object.h:60
void setEffectColorMul(const Color4 &effectColorMul) override
Set effect color that will be multiplied with fragment color.
Definition: Object.h:251
const Color4 & getEffectColorMul() const override
The effect color will be multiplied with fragment color.
Definition: Object.h:247
void setEffectColorAdd(const Color4 &effectColorAdd) override
Set effect color that will be added to fragment color.
Definition: Object.h:243
const Color4 & getEffectColorAdd() const override
The effect color will be added to fragment color.
Definition: Object.h:239
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
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Definition: BoundingBox.h:26
Vector3 computeClosestPointInBoundingBox(const Vector3 &point)
Compute closest point in bounding box of given point.
Definition: BoundingBox.h:78
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
float computeLengthSquared() const
Definition: Vector3.h:281
Vector3 & sub(float scalar)
Subtracts a scalar.
Definition: Vector3.h:177
Console class.
Definition: Console.h:29
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6