From 95815c9ea392642ccd518ff2c468b1add09649ec Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 17 Mar 2022 19:12:28 +0200 Subject: [PATCH] compilation fixes --- CMakeLists.txt | 2 +- assetManager.cpp | 6 ++++++ assimpModelReader.cpp | 23 +++++++++++++++++++---- assimpModelReader.h | 11 ++++++++--- model.cpp | 19 +++++++++---------- modelAsset.h | 2 +- node.cpp | 22 ++++++++++++++++++---- node.h | 3 ++- xmlModelReader.cpp | 34 ++++++++++++++++++++++++---------- xmlModelReader.h | 11 ++++++++--- 10 files changed, 96 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bcf2ed1..03903a5 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ set(MATH quaternion.cpp vector.cpp matrix.cpp ray.cpp) set(RENDER lineRenderer.cpp particleEmitter.cpp camera.cpp light.cpp material.cpp mesh.cpp meshData.cpp model.cpp node.cpp quad.cpp box.cpp root.cpp shader.cpp texture.cpp) set(ANIM animationController.cpp animationChannel.cpp animation.cpp animatable.cpp keyframeChannel.cpp driver.cpp) set(ARMATURE skeleton.cpp bone.cpp ikSolver.cpp) -set(ASSET_READERS abstractAssetReader.cpp imageReader.cpp fontReader.cpp modelReader.cpp assimpModelReader.cpp xmlModelReader.cpp) +set(ASSET_READERS imageReader.cpp fontReader.cpp modelReader.cpp assimpModelReader.cpp xmlModelReader.cpp) set(ASSET_MANAGER assetManager.cpp textAsset.h imageAsset.h modelAsset.h fontAsset.h) set(LIB_SRC ${RENDER} ${MATH} ${UTILS} ${GUI} ${ARMATURE} ${ASSET_MANAGER} ${ASSET_READERS} ${ANIM}) diff --git a/assetManager.cpp b/assetManager.cpp index 7408dcb..1de908a 100644 --- a/assetManager.cpp +++ b/assetManager.cpp @@ -3,6 +3,7 @@ #include "util.h" #include "imageReader.h" #include "fontReader.h" +#include "xmlModelReader.h" #include @@ -34,6 +35,11 @@ namespace vb01{ if(find(fontFormats.begin(), fontFormats.end(), format) != fontFormats.end()) assetReader = FontReader::getSingleton(); + vector modelFormats = vector{"xml"}; + + if(find(modelFormats.begin(), modelFormats.end(), format) != modelFormats.end()) + assetReader = XmlModelReader::getSingleton(); + assets.push_back(assetReader->readAsset(path)); } diff --git a/assimpModelReader.cpp b/assimpModelReader.cpp index 85171ce..2bed4f4 100644 --- a/assimpModelReader.cpp +++ b/assimpModelReader.cpp @@ -1,5 +1,7 @@ #include "assimpModelReader.h" #include "mesh.h" +#include "modelAsset.h" +#include "node.h" #include #include @@ -9,16 +11,30 @@ using namespace std; using namespace Assimp; namespace vb01{ - AssimpModelReader::AssimpModelReader(Model *model, string path) : ModelReader(model, path){ + AssimpModelReader *assimpModelReader = nullptr; + + AssimpModelReader* AssimpModelReader::getSingleton(){ + if(!assimpModelReader) + assimpModelReader = new AssimpModelReader(); + + return assimpModelReader; + } + + Asset* AssimpModelReader::readAsset(string path){ Importer importer; const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_GenNormals | aiProcess_CalcTangentSpace); if(!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode){ - cout<<"Failed to load model:"<mRootNode, scene, model); + ModelAsset *asset = new ModelAsset(); + asset->path = path; + asset->rootNode = new Node(); + processNode(scene->mRootNode, scene, asset->rootNode); + + return asset; } void AssimpModelReader::processNode(aiNode *node, const aiScene *scene, Node *currentNode){ @@ -78,7 +94,6 @@ namespace vb01{ } */ Mesh *vbMesh = new Mesh(MeshData(vertices, indices, numTris)); - vbMesh ->construct(); currentNode->attachMesh(vbMesh); } } diff --git a/assimpModelReader.h b/assimpModelReader.h index cffb9b2..912e9b1 100644 --- a/assimpModelReader.h +++ b/assimpModelReader.h @@ -1,17 +1,22 @@ #ifndef ASSIMP_MODEL_READER_H #define ASSIMP_MODEL_READER_H -#include "modelReader.h" +#include "abstractAssetReader.h" class aiNode; class aiMesh; class aiScene; namespace vb01{ - class AssimpModelReader : public ModelReader{ + struct Asset; + class Node; + + class AssimpModelReader : public AbstractAssetReader{ public: - AssimpModelReader(Model*, std::string); + static AssimpModelReader* getSingleton(); + Asset* readAsset(std::string); private: + AssimpModelReader(){} void processNode(aiNode*, const aiScene*, Node*); void processMesh(aiMesh*, const aiScene*, Node*); void processMaterial(); diff --git a/model.cpp b/model.cpp index 68decfe..e5ceda0 100755 --- a/model.cpp +++ b/model.cpp @@ -7,8 +7,8 @@ #include "root.h" #include "skeleton.h" #include "animation.h" -#include "xmlModelReader.h" -#include "assimpModelReader.h" +#include "modelAsset.h" +#include "assetManager.h" #include #include @@ -20,15 +20,14 @@ using namespace std; using namespace Assimp; namespace vb01{ - Model::Model(string path) : Node(){ - int dotId = getCharId(path, '.', true); - string extension = path.substr(dotId + 1, string::npos); - ModelReader *modelReader = nullptr; + Model::Model(string path) : Node(((ModelAsset*)AssetManager::getSingleton()->getAsset(path))->rootNode){ + vector descendants; + getDescendants(descendants); - if(extension == "xml") - modelReader = new XmlModelReader(this, path); - else - modelReader = new AssimpModelReader(this, path); + for(Node *desc : descendants) + for(Mesh *mesh : desc->getMeshes()){ + mesh->construct(); + } } Model::~Model(){ diff --git a/modelAsset.h b/modelAsset.h index 22bfcda..419b8bf 100644 --- a/modelAsset.h +++ b/modelAsset.h @@ -7,7 +7,7 @@ namespace vb01{ class Node; struct ModelAsset : public Asset{ - Node *rootNode; + Node *rootNode = nullptr; }; } diff --git a/node.cpp b/node.cpp index 6fa076a..6f40c3d 100755 --- a/node.cpp +++ b/node.cpp @@ -1,5 +1,5 @@ #include "root.h" -#include "node.h" +#include "bone.h" #include "mesh.h" #include "particleEmitter.h" #include "light.h" @@ -20,10 +20,24 @@ namespace vb01{ this->pos = pos; this->scale = scale; this->orientation = orientation; + } - globalAxis[0] = Vector3::VEC_I; - globalAxis[1] = Vector3::VEC_J; - globalAxis[2] = Vector3::VEC_K; + Node::Node(Node *node) : Animatable(node->getName()){ + for(Mesh *m : node->getMeshes()) + attachMesh(new Mesh(m->getMeshBase())); + + for(Skeleton *skel : node->getSkeletons()){ + Skeleton *sk = new Skeleton(); + vector bones = skel->getBones(); + + for(Bone *b : bones) + sk->addBone(b, nullptr); + + addSkeleton(sk); + } + + for(Node *child : node->getChildren()) + attachChild(new Node(child)); } Node::~Node(){ diff --git a/node.h b/node.h index dda7492..b526709 100755 --- a/node.h +++ b/node.h @@ -21,6 +21,7 @@ namespace vb01{ class Node : public Animatable{ public: Node(Vector3 = Vector3::VEC_ZERO, Quaternion = Quaternion::QUAT_W, Vector3 = Vector3::VEC_IJK, std::string = ""); + Node(Node*); virtual ~Node(); void addSkeleton(Skeleton*); void attachMesh(Mesh*); @@ -78,7 +79,7 @@ namespace vb01{ virtual float getDriverValue(Driver::VariableType); bool visible = true; - Vector3 pos, scale, globalAxis[3]; + Vector3 pos, scale, globalAxis[3]{Vector3::VEC_I, Vector3::VEC_J, Vector3::VEC_K}; Quaternion orientation; std::vector meshes; std::vector emitters; diff --git a/xmlModelReader.cpp b/xmlModelReader.cpp index eb97d60..02a44d7 100644 --- a/xmlModelReader.cpp +++ b/xmlModelReader.cpp @@ -6,7 +6,7 @@ #include "vector.h" #include "animationController.h" #include "animatable.h" -#include "keyframeChannel.h" +#include "modelAsset.h" #include @@ -16,17 +16,30 @@ using namespace std; using namespace tinyxml2; namespace vb01{ - XmlModelReader::XmlModelReader(Model *model, string path) : ModelReader(model, path){ + XmlModelReader *xmlModelReader = nullptr; + + XmlModelReader* XmlModelReader::getSingleton(){ + if(!xmlModelReader) + xmlModelReader = new XmlModelReader(); + + return xmlModelReader; + } + + Asset* XmlModelReader::readAsset(string path){ XMLDocument *doc = new XMLDocument(); doc->LoadFile(path.c_str()); XMLElement *root = doc->FirstChildElement(); + ModelAsset *asset = new ModelAsset(); + asset->path = path; + asset->rootNode = new Node(); + assetRootNode = asset->rootNode; for(XMLElement *ch = root->FirstChildElement(); ch; ch = ch->NextSiblingElement()) - model->attachChild(processNode(model, ch)); + assetRootNode->attachChild(processNode(assetRootNode, ch)); vector descendants; - model->getDescendants(descendants); + assetRootNode->getDescendants(descendants); setupDrivers(descendants); vector meshes; @@ -43,6 +56,8 @@ namespace vb01{ delete m->getSkeleton(); m->setSkeleton(sk); } + + return asset; } void XmlModelReader::setupDrivers(vector descendants){ @@ -87,7 +102,7 @@ namespace vb01{ i = 0; int numVertices = 3 * atoi(meshEl->Attribute("num_faces")); - Mesh::Vertex *vertices = new Mesh::Vertex[numVertices]; + MeshData::Vertex *vertices = new MeshData::Vertex[numVertices]; tagName = "vert"; vector vertIds; u32 *indices = new u32[numVertices]; @@ -110,7 +125,7 @@ namespace vb01{ float biTanZ = atof(vertEl->Attribute("bz")); Vector3 biTan = Vector3(biTanX, biTanY, biTanZ); - Mesh::Vertex vertex; + MeshData::Vertex vertex; vertex.pos = vertPos[id]; vertex.norm = vertNorm[id]; vertex.uv = uv; @@ -133,7 +148,7 @@ namespace vb01{ tagName = "shapekey"; i = 0; int numShapeKeys = atoi(meshEl->Attribute("num_shape_keys")); - Mesh::ShapeKey *shapeKeys = new Mesh::ShapeKey[numShapeKeys]; + MeshData::ShapeKey *shapeKeys = new MeshData::ShapeKey[numShapeKeys]; for(XMLElement *shapeKeyEl = meshEl->FirstChildElement(tagName); shapeKeyEl && strcmp(shapeKeyEl->Name(), tagName) == 0; shapeKeyEl = shapeKeyEl->NextSiblingElement(), i++){ shapeKeys[i].name = shapeKeyEl->Attribute("name"); @@ -160,8 +175,7 @@ namespace vb01{ vertices[j].shapeKeyOffsets[i] = shapeKeyPos[vertIds[j]] - vertPos[vertIds[j]]; } - Mesh *mesh = new Mesh(vertices, indices, numVertices / 3, vertexGroups, numVertexGroups, shapeKeys, numShapeKeys); - mesh->construct(); + Mesh *mesh = new Mesh(MeshData(vertices, indices, numVertices / 3, vertexGroups, numVertexGroups, shapeKeys, numShapeKeys)); const char *skeletonName = meshEl->Attribute("skeleton"); @@ -261,7 +275,7 @@ namespace vb01{ Vector3 pos = head; if(strcmp(xmlEl->Parent()->ToElement()->Name(), "skeleton") == 0){ - parent = model; + parent = assetRootNode; swap(pos.y, pos.z); pos.z = -pos.z; swap(yAxis.y, yAxis.z); diff --git a/xmlModelReader.h b/xmlModelReader.h index 45501d5..657e707 100644 --- a/xmlModelReader.h +++ b/xmlModelReader.h @@ -1,7 +1,8 @@ #ifndef XML_MODEL_READER_H #define XML_MODEL_READER_H -#include "modelReader.h" +#include "abstractAssetReader.h" +#include "keyframeChannel.h" #include #include @@ -17,11 +18,14 @@ namespace vb01{ class Animatable; class Animation; class Driver; + struct Asset; - class XmlModelReader : public ModelReader{ + class XmlModelReader : public AbstractAssetReader{ public: - XmlModelReader(Model*, std::string); + static XmlModelReader* getSingleton(); + Asset* readAsset(std::string); private: + XmlModelReader(){}; Node* processNode(Node*, tinyxml2::XMLElement*, bool = false); Mesh* processMesh(tinyxml2::XMLElement*); std::vector processKeyframeChannells(tinyxml2::XMLElement*); @@ -30,6 +34,7 @@ namespace vb01{ void setupDrivers(std::vector); std::vector> driversByNodeNames; + Node *assetRootNode = nullptr; }; }