TDME2  1.9.200
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ObjectNodeRenderer.cpp
Go to the documentation of this file.
2 
3 #include <tdme/tdme.h>
11 #include <tdme/engine/Engine.h>
14 
26 
27 ObjectNodeRenderer::ObjectNodeRenderer(ObjectNode* objectNode)
28 {
29  this->objectNode = objectNode;
30  this->vboBaseIds = nullptr;
31  this->vboNormalMappingIds = nullptr;
32 }
33 
34 void ObjectNodeRenderer::preRender(int contextIdx)
35 {
36  // TODO: maybe store these in ObjectNodeRenderer too
37  auto meshUploaded = true;
38  auto created = false;
39 
40  // initialize if not yet done
41  if (vboBaseIds == nullptr) {
43  objectNode->id,
44  3 + (objectNode->mesh->node->getTextureCoordinates().empty() == false?1:0),
45  true,
46  true,
47  created
48  );
49  if (created == false) while (vboManagedBase->isUploaded() == false);
51  meshUploaded = created == false;
52 
53  // initialize tangents, bitangents
54  if (Engine::getRenderer()->isNormalMappingAvailable() &&
55  objectNode->mesh->node->getTangents().empty() == false &&
56  objectNode->mesh->node->getBitangents().empty() == false &&
57  vboNormalMappingIds == nullptr) {
58  vboManagedNormalMapping = Engine::getInstance()->getVBOManager()->addVBO(objectNode->id + ".normalmapping", 2, true, true, created);
59  if (created == false) while (vboManagedNormalMapping->isUploaded() == false);
61  }
62 
63  // initialize origins
64  if (objectNode->mesh->node->getOrigins().empty() == false &&
65  vboOrigins == nullptr) {
66  vboManagedOrigins = Engine::getInstance()->getVBOManager()->addVBO(objectNode->id + ".origins", 1, true, true, created);
67  if (created == false) while (vboManagedOrigins->isUploaded() == false);
69  }
70 
71  // initialize tangents, bitangents
72  auto lodLevels = 0;
73  // TODO: we only support faces entities 0 lod indices for terrain now
74  if (objectNode->mesh->node->getFacesEntities()[0].getLOD1Indices().empty() == false) lodLevels++;
75  if (objectNode->mesh->node->getFacesEntities()[0].getLOD2Indices().empty() == false) lodLevels++;
76  if (objectNode->mesh->node->getFacesEntities()[0].getLOD3Indices().empty() == false) lodLevels++;
77  if (lodLevels > 0 &&
78  vboLods == nullptr) {
79  vboManagedLods = Engine::getInstance()->getVBOManager()->addVBO(objectNode->id + ".lodindices", lodLevels, true, true, created);
80  if (created == false) while (vboManagedLods->isUploaded() == false);
82  }
83  }
84 
85  //
86  haveVBOs = true;
87 
88  // model node updates
89  auto verticesUpdate = objectNode->node->hasVerticesUpdate();
90  auto normalsUpdate = objectNode->node->hasNormalsUpdate();
91 
92  // check if to upload new mesh
93  if (objectNode->mesh->getRecreatedBuffers() == true || meshUploaded == false) {
94  if (meshUploaded == false) {
95  // upload indices
97  // upload texture coordinates
98  if (objectNode->mesh->node->getTextureCoordinates().empty() == false) {
100  }
101  // upload render node object origins
102  if (objectNode->mesh->node->getOrigins().empty() == false) {
105  }
106  // TODO: we only support faces entities 0 lod indices for terrain now
107  auto lodLevel = 0;
108  if (objectNode->mesh->node->getFacesEntities()[0].getLOD1Indices().empty() == false) {
109  objectNode->mesh->setupLodBuffer(Engine::getRenderer(), contextIdx, (*vboLods)[lodLevel], 1);
110  lodLevel++;
111  }
112  if (objectNode->mesh->node->getFacesEntities()[0].getLOD2Indices().empty() == false) {
113  objectNode->mesh->setupLodBuffer(Engine::getRenderer(), contextIdx, (*vboLods)[lodLevel], 2);
114  lodLevel++;
115  }
116  if (objectNode->mesh->node->getFacesEntities()[0].getLOD3Indices().empty() == false) {
117  objectNode->mesh->setupLodBuffer(Engine::getRenderer(), contextIdx, (*vboLods)[lodLevel], 3);
118  lodLevel++;
119  }
120  if (vboManagedLods != nullptr) vboManagedLods->setUploaded(true);
121  }
122  // upload vertices
124  // upload normals
126  // tangents, bitangents
127  if (vboNormalMappingIds != nullptr) {
131  }
133  } else
134  if (verticesUpdate == true || normalsUpdate == true) {
135  // upload vertices
136  if (verticesUpdate == true) objectNode->mesh->setupVerticesBuffer(Engine::getRenderer(), contextIdx, (*vboBaseIds)[1]);
137  // upload normals
138  if (normalsUpdate == true) objectNode->mesh->setupNormalsBuffer(Engine::getRenderer(), contextIdx, (*vboBaseIds)[2]);
139  }
140 }
141 
143 {
144  if (vboBaseIds != nullptr) {
146  vboBaseIds = nullptr;
147  }
148  if (vboNormalMappingIds != nullptr) {
149  Engine::getInstance()->getVBOManager()->removeVBO(objectNode->id + ".normalmapping");
150  vboNormalMappingIds = nullptr;
151  }
152  if (vboOrigins != nullptr) {
154  vboOrigins = nullptr;
155  }
156  if (vboLods != nullptr) {
157  Engine::getInstance()->getVBOManager()->removeVBO(objectNode->id + ".lodindices");
158  vboLods = nullptr;
159  }
160 }
Engine main class.
Definition: Engine.h:131
static Engine * getInstance()
Returns engine instance.
Definition: Engine.h:612
static Renderer * getRenderer()
Definition: Engine.h:434
static VBOManager * getVBOManager()
Definition: Engine.h:635
Model node.
Definition: Node.h:32
const vector< Vector3 > & getBitangents() const
Definition: Node.h:216
bool hasVerticesUpdate()
Definition: Node.h:146
const vector< Vector3 > & getTangents() const
Definition: Node.h:203
const vector< Vector3 > & getOrigins() const
Definition: Node.h:280
const vector< Vector2 > & getTextureCoordinates() const
Definition: Node.h:190
const vector< FacesEntity > & getFacesEntities() const
Definition: Node.h:260
VBOManager_VBOManaged * addVBO(const string &vboId, int32_t ids, bool useGPUMemory, bool shared, bool &created)
Adds a VBO to manager or retrieve VBO if existing.
Definition: VBOManager.cpp:31
void removeVBO(const string &vboId)
Removes a VBO from manager.
Definition: VBOManager.cpp:73
Object node mesh specifically for rendering.
void setupOriginsBuffer(Renderer *renderer, int contextIdx, int32_t vboId)
Set up render node object origins data buffer.
void setupNormalsBuffer(Renderer *renderer, int contextIdx, int32_t vboId)
Set up normals buffer.
void setupVertexIndicesBuffer(Renderer *renderer, int contextIdx, int32_t vboId)
Set up vertex indices buffer.
void setupLodBuffer(Renderer *renderer, int contextIdx, int32_t vboId, int lodLevel)
Set up render node object lod data buffer.
void setupTextureCoordinatesBuffer(Renderer *renderer, int contextIdx, int32_t vboId)
Set up texture coordinates buffer.
void setupTangentsBuffer(Renderer *renderer, int contextIdx, int32_t vboId)
Set up tangents buffer.
void setupVerticesBuffer(Renderer *renderer, int contextIdx, int32_t vboId)
Set up vertices buffer.
void setupBitangentsBuffer(Renderer *renderer, int contextIdx, int32_t vboId)
Set up bitangents buffer.
void preRender(int contextIdx)
Pre render step like uploading VBOs and such.
Object node specifically for rendering.
Definition: ObjectNode.h:41
Float buffer class.
Definition: FloatBuffer.h:18
Short buffer class.
Definition: ShortBuffer.h:14