TDME2  1.9.200
LODObjectImposter.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 #include <string>
5 #include <vector>
6 
7 #include <tdme/tdme.h>
8 #include <tdme/engine/fwd-tdme.h>
10 #include <tdme/engine/Color4.h>
14 #include <tdme/engine/Camera.h>
15 #include <tdme/engine/Entity.h>
18 #include <tdme/engine/Object.h>
19 #include <tdme/engine/Rotation.h>
20 #include <tdme/engine/Transform.h>
21 #include <tdme/math/Matrix4x4.h>
22 #include <tdme/math/Vector3.h>
23 #include <tdme/utilities/Console.h>
24 
25 using std::string;
26 using std::to_string;
27 using std::unique_ptr;
28 using std::vector;
29 
45 
46 /**
47  * LOD object + imposter to be used with engine class
48  * @author Andreas Drewke
49  */
51  public Transform,
52  public Entity
53 {
54 private:
55  Engine* engine { nullptr };
56  bool frustumCulling { true };
57 
58  Model* modelLOD1 { nullptr };
61 
62  string id;
63  unique_ptr<Object> objectLOD1;
64  unique_ptr<ImposterObject> objectLOD2;
65 
66  Object* objectLOD { nullptr };
67 
68  int levelLOD;
69  bool enabled;
70  bool pickable;
78  string shaderId { "default" };
79 
81 
84 
85  // overridden methods
86  inline void setParentTransform(const Transform& parentTransform) override {
87  //
88  this->parentTransform = parentTransform;
89  auto entityTransform = parentTransform * (*this);
90  entityTransformMatrix = entityTransform.getTransformMatrix();
91  // delegate to LOD objects
92  objectLOD1->setTransform(entityTransform);
93  objectLOD2->setTransform(entityTransform);
94  }
95 
96 public:
97  // forbid class copy
99 
100  /**
101  * Public constructor
102  * @param id id
103  * @param modelLOD1 model LOD 1
104  * @param imposterModelsLOD2 imposter models LOD 2
105  * @param lod2MinDistance LOD2 min distance
106  * @param lodNoneMinDistance LOD None min distance
107  */
109  const string& id,
110  Model* modelLOD1,
111  const vector<Model*>& imposterModelsLOD2,
112  float lod2MinDistance,
113  float lodNoneMinDistance = 150.0f
114  );
115 
116  /**
117  * Public destructor
118  */
120 
121  // overridden method
122  inline EntityType getEntityType() override {
124  }
125 
126  /**
127  * @return LOD object 1
128  */
129  inline Object* getLOD1Object() {
130  return objectLOD1.get();
131  }
132 
133  /**
134  * @return LOD object 2
135  */
137  return objectLOD2.get();
138  }
139 
140  /**
141  * @return LOD object
142  */
143  inline Object* getLODObject() {
144  return objectLOD;
145  }
146 
147  /**
148  * Get current lod object
149  * @param camera camera
150  * @return LOD object to render
151  */
152  inline Object* determineLODObject(Camera* camera) {
153  // determine LOD object and level type
154  auto objectCamFromLengthSquared = getWorldBoundingBox()->computeClosestPointInBoundingBox(camera->getLookFrom()).sub(camera->getLookFrom()).computeLengthSquared();
155  if (objectCamFromLengthSquared >= Math::square(lodNoneMinDistance)) {
156  objectLOD = nullptr;
157  levelLOD = 3;
158  } else
159  if (objectCamFromLengthSquared >= Math::square(lod2MinDistance)) {
160  levelLOD = 2;
161  objectLOD = objectLOD2->determineBillboardObject(camera);
162  } else {
163  objectLOD = objectLOD1.get();
164  levelLOD = 1;
165  }
166 
167  // done
168  return objectLOD;
169  }
170 
171  /**
172  * @return effect color add for LOD2 level
173  */
174  inline const Color4& getEffectColorAddLOD2() const {
175  return effectColorAddLOD2;
176  }
177 
178  /**
179  * Set effect color add for LOD2 level
180  * @param effectColorAddLOD2 effect color add for LOD2 level
181  */
183  this->effectColorAddLOD2 = effectColorAddLOD2;
184  }
185 
186  /**
187  * @return effect color mul for LOD2 level
188  */
189  inline const Color4& getEffectColorMulLOD2() const {
190  return effectColorMulLOD2;
191  }
192 
193  /**
194  * Set effect color mul for LOD2 level
195  * @param effectColorMulLOD2 effect color mul for LOD2 level
196  */
198  this->effectColorMulLOD2 = effectColorMulLOD2;
199  }
200 
201  // overridden methods
202  void setEngine(Engine* engine) override;
203  void setRenderer(Renderer* renderer) override;
204  void initialize() override;
205  void dispose() override;
206 
207  inline bool isEnabled() override {
208  return enabled;
209  }
210 
211  void setEnabled(bool enabled) override;
212  bool isFrustumCulling() override;
213  void setFrustumCulling(bool frustumCulling) override;
214  void update() override;
215 
216  inline BoundingBox* getBoundingBox() override {
217  return objectLOD1->getBoundingBox();
218  }
219 
220  inline BoundingBox* getWorldBoundingBox() override {
221  return objectLOD1->getWorldBoundingBox();
222  }
223 
224  inline const Color4& getEffectColorMul() const override {
225  return effectColorMul;
226  }
227 
228  inline void setEffectColorMul(const Color4& effectColorMul) override {
229  this->effectColorMul = effectColorMul;
230  }
231 
232  inline const Color4& getEffectColorAdd() const override {
233  return effectColorAdd;
234  }
235 
236  inline void setEffectColorAdd(const Color4& effectColorAdd) override {
237  this->effectColorAdd = effectColorAdd;
238  }
239 
240  inline const string& getId() override {
241  return id;
242  }
243 
244  inline bool isPickable() override {
245  return pickable;
246  }
247 
248  inline bool isContributesShadows() override {
249  return contributesShadows;
250  }
251 
252  inline void setContributesShadows(bool contributesShadows) override {
253  this->contributesShadows = contributesShadows;
254  objectLOD1->setContributesShadows(contributesShadows);
255  objectLOD2->setContributesShadows(contributesShadows);
256  }
257 
258  inline bool isReceivesShadows() override {
259  return receivesShadows;
260  }
261 
262  inline void setReceivesShadows(bool receivesShadows) override {
263  this->receivesShadows = receivesShadows;
264  objectLOD1->setReceivesShadows(receivesShadows);
265  objectLOD2->setReceivesShadows(receivesShadows);
266  }
267 
268  inline void setPickable(bool pickable) override {
269  this->pickable = pickable;
270  }
271 
272  inline const Matrix4x4 getNodeTransformMatrix(const string& id) {
273  return objectLOD1->getNodeTransformMatrix(id);
274  }
275 
276  inline const Vector3& getTranslation() const override {
277  return Transform::getTranslation();
278  }
279 
280  inline void setTranslation(const Vector3& translation) override {
282  }
283 
284  inline const Vector3& getScale() const override {
285  return Transform::getScale();
286  }
287 
288  inline void setScale(const Vector3& scale) override {
290  }
291 
292  inline const int getRotationCount() const override {
294  }
295 
296  inline Rotation& getRotation(const int idx) override {
297  return Transform::getRotation(idx);
298  }
299 
300  inline void addRotation(const Vector3& axis, const float angle) override {
301  Transform::addRotation(axis, angle);
302  }
303 
304  inline void removeRotation(const int idx) override {
306  }
307 
308  inline const Vector3& getRotationAxis(const int idx) const override {
309  return Transform::getRotationAxis(idx);
310  }
311 
312  inline void setRotationAxis(const int idx, const Vector3& axis) override {
313  Transform::setRotationAxis(idx, axis);
314  }
315 
316  inline const float getRotationAngle(const int idx) const override {
317  return Transform::getRotationAngle(idx);
318  }
319 
320  inline void setRotationAngle(const int idx, const float angle) override {
321  Transform::setRotationAngle(idx, angle);
322  }
323 
324  inline const Quaternion& getRotationsQuaternion() const override {
326  }
327 
328  inline const Matrix4x4& getTransformMatrix() const override {
329  return entityTransformMatrix;
330  }
331 
332  inline const Transform& getParentTransform() const override {
333  return parentTransform;
334  }
335 
336  inline const Transform& getTransform() const override {
337  return *this;
338  }
339 
340  void setTransform(const Transform& transform) override;
341 
342  inline RenderPass getRenderPass() const override {
343  return renderPass;
344  }
345 
346  inline void setRenderPass(RenderPass renderPass) override {
347  this->renderPass = renderPass;
348  objectLOD1->setRenderPass(renderPass);
349  objectLOD2->setRenderPass(renderPass);
350  }
351 
352  /**
353  * @return shader id
354  */
355  inline const string& getShader() {
356  return shaderId;
357  }
358 
359  /**
360  * Set shader id
361  * @param id shader
362  */
363  inline void setShader(const string& id) {
364  this->shaderId = id;
365  shaderParameters.setShader(shaderId);
366  objectLOD1->setShader(shaderId);
367  objectLOD2->setShader(shaderId);
368  }
369 
370  /**
371  * Returns shader parameter for given parameter name, if the value does not exist, the default will be returned
372  * @param shaderId shader id
373  * @param parameterName parameter name
374  * @return shader parameter
375  */
376  inline const ShaderParameter getShaderParameter(const string& parameterName) {
377  return shaderParameters.getShaderParameter(parameterName);
378  }
379 
380  /**
381  * Set shader parameter for given parameter name
382  * @param shaderId shader id
383  * @param parameterName parameter name
384  * @param paraemterValue parameter value
385  */
386  inline void setShaderParameter(const string& parameterName, const ShaderParameter& parameterValue) {
387  shaderParameters.setShaderParameter(parameterName, parameterValue);
388  objectLOD1->setShaderParameter(parameterName, parameterValue);
389  objectLOD2->setShaderParameter(parameterName, parameterValue);
390  }
391 
392 };
const Vector3 & getLookFrom() const
Definition: Camera.h:219
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
@ ENTITYTYPE_LODOBJECTIMPOSTER
Definition: Entity.h:94
Imposter object to be used with engine class.
LOD object + imposter to be used with engine class.
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.
LODObjectImposter(const string &id, Model *modelLOD1, const vector< Model * > &imposterModelsLOD2, float lod2MinDistance, float lodNoneMinDistance=150.0f)
Public constructor.
const Color4 & getEffectColorAddLOD2() const
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.
unique_ptr< ImposterObject > objectLOD2
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.
const Matrix4x4 getNodeTransformMatrix(const string &id)
void setPickable(bool pickable) override
Set this entity pickable.
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 setEffectColorAddLOD2(const Color4 &effectColorAddLOD2)
Set effect color add for LOD2 level.
~LODObjectImposter()
Public destructor.
const Quaternion & getRotationsQuaternion() const override
void setScale(const Vector3 &scale) override
Set scale.
const Vector3 & getScale() const override
const Color4 & getEffectColorMulLOD2() const
const float getRotationAngle(const int idx) const override
BoundingBox * getWorldBoundingBox() override
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.
Object * determineLODObject(Camera *camera)
Get current lod object.
void setEffectColorMulLOD2(const Color4 &effectColorMulLOD2)
Set effect color mul for LOD2 level.
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
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