5 #include <unordered_map>
29 using std::make_unique;
32 using std::unique_ptr;
33 using std::unordered_map;
57 int64_t ObjectNode::counter = 0;
59 ObjectNode::ObjectNode()
69 auto overriddenTransformationsMatricesIt =
object->instanceAnimations[0]->overriddenTransformMatrices.find(
node->
getId());
73 auto transformationsMatricesIt =
object->instanceAnimations[0]->transformMatrices[0].find(
node->
getId());
82 auto model =
object->getModel();
83 createNodes(
object, model->getSubNodes(), model->hasAnimations(), useManagers, animationProcessingTarget, objectNodes);
88 for (
const auto& [nodeId,
node]: nodes) {
100 objectNodes.push_back(objectNode);
107 to_string(animationProcessingTarget) +
110 if (
node->
getSkinning() !=
nullptr || (animationProcessingTarget == Engine::AnimationProcessingTarget::CPU_NORENDERING)) {
116 objectNode->object =
object;
117 objectNode->node =
node;
119 objectNode->renderer = make_unique<ObjectNodeRenderer>(objectNode);
120 vector<unordered_map<string, Matrix4x4*>*> instancesTransformMatrices;
121 vector<unordered_map<string, Matrix4x4*>*> instancesSkinningNodesMatrices;
123 instancesTransformMatrices.push_back(&animation->transformMatrices[0]);
124 instancesSkinningNodesMatrices.push_back(animation->getSkinningNodesTransformMatrices(objectNode->node));
126 if (useManagers ==
true) {
128 objectNode->mesh = meshManager->
getMesh(objectNode->id);
129 if (objectNode->mesh ==
nullptr) {
131 objectNode->renderer.get(),
132 animationProcessingTarget,
134 instancesTransformMatrices,
135 instancesSkinningNodesMatrices,
138 meshManager->addMesh(objectNode->id, objectNode->mesh);
142 objectNode->renderer.get(),
143 animationProcessingTarget,
145 instancesTransformMatrices,
146 instancesSkinningNodesMatrices,
153 if (material !=
nullptr) {
154 objectNode->textureMatricesByEntities[j].set(material->getTextureMatrix());
156 objectNode->textureMatricesByEntities[j].identity();
159 objectNode->specularMaterialDiffuseTextureIdsByEntities.resize(
node->
getFacesEntities().size());
160 objectNode->specularMaterialDynamicDiffuseTextureIdsByEntities.resize(
node->
getFacesEntities().size());
161 objectNode->specularMaterialSpecularTextureIdsByEntities.resize(
node->
getFacesEntities().size());
164 objectNode->pbrMaterialMetallicRoughnessTextureIdsByEntities.resize(
node->
getFacesEntities().size());
168 objectNode->specularMaterialDiffuseTextureIdsByEntities[j] =
TEXTUREID_NONE;
169 objectNode->specularMaterialDynamicDiffuseTextureIdsByEntities[j] =
TEXTUREID_NONE;
170 objectNode->specularMaterialSpecularTextureIdsByEntities[j] =
TEXTUREID_NONE;
171 objectNode->specularMaterialNormalTextureIdsByEntities[j] =
TEXTUREID_NONE;
172 objectNode->pbrMaterialBaseColorTextureIdsByEntities[j] =
TEXTUREID_NONE;
173 objectNode->pbrMaterialMetallicRoughnessTextureIdsByEntities[j] =
TEXTUREID_NONE;
174 objectNode->pbrMaterialNormalTextureIdsByEntities[j] =
TEXTUREID_NONE;
175 objectNode->pbrMaterialEmissiveTextureIdsByEntities[j] =
TEXTUREID_NONE;
178 objectNode->updateNodeTransformationsMatrix();
187 for (
auto objectNode : objectNodes) {
188 objectNode->mesh->computeSkinning(contextIdx, objectNode->object);
195 auto material = facesEntities[facesEntityIdx].getMaterial();
197 if (material ==
nullptr) material = Material::getDefaultMaterial();
198 auto specularMaterialProperties = material->getSpecularMaterialProperties();
199 if (specularMaterialProperties !=
nullptr) {
202 if (specularMaterialProperties->getDiffuseTexture() !=
nullptr) {
210 if (specularMaterialProperties->getSpecularTexture() !=
nullptr) {
218 if (specularMaterialProperties->getNormalTexture() !=
nullptr) {
226 auto pbrMaterialProperties = material->getPBRMaterialProperties();
227 if (pbrMaterialProperties !=
nullptr &&
renderer->isPBRAvailable() ==
true) {
230 if (pbrMaterialProperties->getBaseColorTexture() !=
nullptr) {
238 if (pbrMaterialProperties->getMetallicRoughnessTexture() !=
nullptr) {
246 if (pbrMaterialProperties->getNormalTexture() !=
nullptr) {
254 if (pbrMaterialProperties->getEmissiveTexture() !=
nullptr) {
266 auto textureManager = engine->getTextureManager();
269 for (
auto j = 0; j < facesEntities.size(); j++) {
271 auto material = facesEntities[j].getMaterial();
273 auto specularMaterialProperties = material !=
nullptr?material->getSpecularMaterialProperties():
nullptr;
274 if (specularMaterialProperties !=
nullptr) {
279 if (specularMaterialProperties->getDiffuseTexture() !=
nullptr)
280 textureManager->removeTexture(specularMaterialProperties->getDiffuseTexture()->getId());
288 if (specularMaterialProperties->getSpecularTexture() !=
nullptr)
289 textureManager->removeTexture(specularMaterialProperties->getSpecularTexture()->getId());
297 if (specularMaterialProperties->getNormalTexture() !=
nullptr)
298 textureManager->removeTexture(specularMaterialProperties->getNormalTexture()->getId());
304 auto pbrMaterialProperties = material !=
nullptr?material->getPBRMaterialProperties():
nullptr;
305 if (pbrMaterialProperties !=
nullptr) {
310 if (pbrMaterialProperties->getBaseColorTexture() !=
nullptr)
311 textureManager->removeTexture(pbrMaterialProperties->getBaseColorTexture()->getId());
318 if (pbrMaterialProperties->getMetallicRoughnessTexture() !=
nullptr)
319 textureManager->removeTexture(pbrMaterialProperties->getMetallicRoughnessTexture()->getId());
327 if (pbrMaterialProperties->getNormalTexture() !=
nullptr)
328 textureManager->removeTexture(pbrMaterialProperties->getNormalTexture()->getId());
336 if (pbrMaterialProperties->getEmissiveTexture() !=
nullptr)
337 textureManager->removeTexture(pbrMaterialProperties->getEmissiveTexture()->getId());
static Engine * getInstance()
Returns engine instance.
static TextureManager * getTextureManager()
AnimationProcessingTarget
static MeshManager * getMeshManager()
Represents a model face, consisting of vertex, normal, tangent and bitangent vectors,...
Node faces entity A node can have multiple entities containing faces and a applied material.
Representation of a 3D model.
int32_t getFaceCount() const
unordered_map< string, Node * > & getSubNodes()
const string & getId()
Returns id.
const vector< FacesEntity > & getFacesEntities() const
Represents specular material properties.
Skinning definition for nodes.
Represents specular material properties.
ObjectNodeMesh * getMesh(const string &meshId)
Get mesh from managed meshes.
TextureManager_TextureManaged * addTexture(const string &id, bool &created)
Adds a texture to manager.
vector< ObjectAnimation * > instanceAnimations
Object node mesh specifically for rendering.
Object node VBO renderer.
Object node specifically for rendering.
static constexpr int32_t TEXTUREID_NOTUSED
vector< int32_t > pbrMaterialBaseColorTextureIdsByEntities
vector< int32_t > specularMaterialDiffuseTextureIdsByEntities
friend class ObjectNodeMesh
vector< int32_t > pbrMaterialMetallicRoughnessTextureIdsByEntities
vector< int32_t > specularMaterialNormalTextureIdsByEntities
vector< int32_t > specularMaterialSpecularTextureIdsByEntities
Matrix4x4 * nodeTransformMatrix
ObjectNode()
Public constructor.
static void computeAnimation(int contextIdx, vector< ObjectNode * > &objectNodes)
Computes animation for given object nodes.
vector< int32_t > pbrMaterialNormalTextureIdsByEntities
static STATIC_DLL_IMPEXT int64_t counter
vector< int32_t > pbrMaterialEmissiveTextureIdsByEntities
static constexpr int32_t TEXTUREID_NONE
static void createNodes(ObjectBase *object, bool useManagers, Engine::AnimationProcessingTarget animationProcessingTarget, vector< ObjectNode * > &objectNodes)
Creates object nodes from given object base object.
static void setupTextures(Renderer *renderer, int contextIdx, ObjectNode *objectNode, int32_t facesEntityIdx)
Set up textures for given object node and faces entity.
unique_ptr< ObjectNodeRenderer > renderer
void updateNodeTransformationsMatrix()
Update node transformations matrix.
Matrix3x3 class representing matrix3x3 mathematical structure and operations for 2d space.
Matrix4x4 class representing matrix4x4 mathematical structure and operations for 3d space.