TDME2  1.9.200
ObjectBase.cpp
Go to the documentation of this file.
2 
3 #include <memory>
4 #include <string>
5 #include <unordered_map>
6 #include <vector>
7 
8 #include <tdme/tdme.h>
11 #include <tdme/engine/model/Face.h>
15 #include <tdme/engine/model/Node.h>
26 #include <tdme/engine/Engine.h>
27 #include <tdme/engine/Timing.h>
28 #include <tdme/math/Math.h>
29 #include <tdme/math/Matrix4x4.h>
30 #include <tdme/math/Vector3.h>
31 #include <tdme/utilities/Console.h>
32 
33 using std::make_unique;
34 using std::map;
35 using std::string;
36 using std::to_string;
37 using std::vector;
38 
59 using tdme::math::Math;
63 
64 ObjectBase::ObjectBase(Model* model, bool useManagers, Engine::AnimationProcessingTarget animationProcessingTarget, int instances)
65 {
66  this->model = model;
67  this->animationProcessingTarget = animationProcessingTarget;
68  this->usesManagers = useManagers;
69  this->instances = instances;
71  this->currentInstance = 0;
72  instanceAnimations.resize(instances);
73  instanceEnabled.resize(instances);
75  for (auto i = 0; i < instances; i++) {
76  instanceEnabled[i] = true;
78  }
79  transformedFacesIterator = nullptr;
80  // object nodes
82  // do initial transform if doing CPU no rendering for deriving bounding boxes and such
83  if (animationProcessingTarget == Engine::AnimationProcessingTarget::CPU_NORENDERING) ObjectNode::computeAnimation(0, objectNodes);
84 }
85 
87  for (auto i = 0; i < instances; i++) {
88  delete instanceAnimations[i];
89  }
90  for (auto i = 0; i < objectNodes.size(); i++) {
91  delete objectNodes[i];
92  }
93 }
94 
96  return objectNodes.size();
97 }
98 
99 void ObjectBase::getTriangles(vector<Triangle>& triangles, int nodeIdx)
100 {
101  if (nodeIdx == -1) {
102  for (auto objectNode : objectNodes) {
103  auto nodeVerticesTransformed = &objectNode->mesh->transformedVertices;
104  for (const auto& facesEntity: objectNode->node->getFacesEntities())
105  for (const auto& face: facesEntity.getFaces()) {
106  const auto& faceVertexIndices = face.getVertexIndices();
107  triangles.emplace_back(
108  (*nodeVerticesTransformed)[faceVertexIndices[0]],
109  (*nodeVerticesTransformed)[faceVertexIndices[1]],
110  (*nodeVerticesTransformed)[faceVertexIndices[2]]
111  );
112  }
113  }
114  } else {
115  auto objectNode = objectNodes[nodeIdx];
116  auto nodeVerticesTransformed = &objectNode->mesh->transformedVertices;
117  for (const auto& facesEntity: objectNode->node->getFacesEntities())
118  for (const auto& face: facesEntity.getFaces()) {
119  const auto& faceVertexIndices = face.getVertexIndices();
120  triangles.emplace_back(
121  (*nodeVerticesTransformed)[faceVertexIndices[0]],
122  (*nodeVerticesTransformed)[faceVertexIndices[1]],
123  (*nodeVerticesTransformed)[faceVertexIndices[2]]
124  );
125  }
126  }
127 }
128 
130 {
131  if (transformedFacesIterator == nullptr) {
132  transformedFacesIterator = make_unique<ObjectBase_TransformedFacesIterator>(this);
133  }
134  return transformedFacesIterator.get();
135 }
136 
137 ObjectNodeMesh* ObjectBase::getMesh(const string& nodeId)
138 {
139  // TODO: maybe rather use a hash map than an array to have a faster access
140  for (auto objectNode :objectNodes) {
141  if (objectNode->node->getId() == nodeId) {
142  return objectNode->mesh;
143  }
144  }
145  return nullptr;
146 }
147 
149 {
150  auto meshManager = Engine::getInstance()->getMeshManager();
151  //
152  // init mesh
153  for (auto i = 0; i < objectNodes.size(); i++) {
154  auto objectNode = objectNodes[i];
155  // initiate mesh if not yet done, happens usually after disposing from engine and readding to engine
156  if (objectNode->mesh == nullptr) {
157  vector<unordered_map<string, Matrix4x4*>*> instancesTransformMatrices;
158  vector<unordered_map<string, Matrix4x4*>*> instancesSkinningNodesMatrices;
159  for (auto animation: objectNode->object->instanceAnimations) {
160  instancesTransformMatrices.push_back(&animation->transformMatrices[0]);
161  instancesSkinningNodesMatrices.push_back(animation->getSkinningNodesTransformMatrices(objectNode->node));
162  }
163  if (usesManagers == true) {
164  objectNode->mesh = meshManager->getMesh(objectNode->id);
165  if (objectNode->mesh == nullptr) {
166  objectNode->mesh = new ObjectNodeMesh(
167  objectNode->renderer.get(),
169  objectNode->node,
170  instancesTransformMatrices,
171  instancesSkinningNodesMatrices,
172  instances
173  );
174  }
175  } else {
176  objectNode->mesh = new ObjectNodeMesh(
177  objectNode->renderer.get(),
179  objectNode->node,
180  instancesTransformMatrices,
181  instancesSkinningNodesMatrices,
182  instances
183  );
184  }
185  }
186  }
187 }
188 
190 {
191  auto meshManager = Engine::getInstance()->getMeshManager();
192  // dispose mesh
193  for (auto i = 0; i < objectNodes.size(); i++) {
194  auto objectNode = objectNodes[i];
195  // dispose renderer
196  objectNode->renderer->dispose();
197  // dispose object node
198  objectNode->dispose();
199  // dispose mesh
200  if (usesManagers == true) {
201  meshManager->removeMesh(objectNode->id);
202  } else {
203  delete objectNode->mesh;
204  }
205  objectNode->mesh = nullptr;
206  }
207  //
208 }
Engine main class.
Definition: Engine.h:131
static Engine * getInstance()
Returns engine instance.
Definition: Engine.h:612
static MeshManager * getMeshManager()
Definition: Engine.h:441
Timing class.
Definition: Timing.h:16
Represents a model face, consisting of vertex, normal, tangent and bitangent vectors,...
Definition: Face.h:18
Node faces entity A node can have multiple entities containing faces and a applied material.
Definition: FacesEntity.h:23
Joint / Bone.
Definition: Joint.h:19
Representation of a 3D model.
Definition: Model.h:35
Model node.
Definition: Node.h:32
Skinning definition for nodes.
Definition: Skinning.h:25
Triangle entity, this is not directly connectable with physics engine.
Definition: Triangle.h:18
void getTriangles(vector< Triangle > &triangles, int nodeIdx=-1)
Retrieves list of triangles of all or given nodes.
Definition: ObjectBase.cpp:99
virtual void initialize()
Initiates this object.
Definition: ObjectBase.cpp:148
ObjectBase_TransformedFacesIterator * getTransformedFacesIterator()
Definition: ObjectBase.cpp:129
Engine::AnimationProcessingTarget animationProcessingTarget
Definition: ObjectBase.h:59
ObjectNodeMesh * getMesh(const string &nodeId)
Returns object node mesh object.
Definition: ObjectBase.cpp:137
unique_ptr< ObjectBase_TransformedFacesIterator > transformedFacesIterator
Definition: ObjectBase.h:47
virtual void dispose()
Disposes this object.
Definition: ObjectBase.cpp:189
vector< ObjectAnimation * > instanceAnimations
Definition: ObjectBase.h:55
Object node mesh specifically for rendering.
Object node specifically for rendering.
Definition: ObjectNode.h:41
static void computeAnimation(int contextIdx, vector< ObjectNode * > &objectNodes)
Computes animation for given object nodes.
Definition: ObjectNode.cpp:185
static void createNodes(ObjectBase *object, bool useManagers, Engine::AnimationProcessingTarget animationProcessingTarget, vector< ObjectNode * > &objectNodes)
Creates object nodes from given object base object.
Definition: ObjectNode.cpp:80
Standard math functions.
Definition: Math.h:19
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.
Definition: Matrix4x4.h:23
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Console class.
Definition: Console.h:29