diff --git a/code/AssetLib/AMF/AMFImporter_Postprocess.cpp b/code/AssetLib/AMF/AMFImporter_Postprocess.cpp index 3b6336c95..9d514b4e8 100644 --- a/code/AssetLib/AMF/AMFImporter_Postprocess.cpp +++ b/code/AssetLib/AMF/AMFImporter_Postprocess.cpp @@ -146,23 +146,19 @@ size_t AMFImporter::PostprocessHelper_GetTextureID_Or_Create(const std::string & } } + // // Converted texture not found, create it. - AMFTexture *src_texture[4] { - nullptr - }; + // + AMFTexture *src_texture[4]{ nullptr }; std::vector src_texture_4check; SPP_Texture converted_texture; { // find all specified source textures - AMFNodeElementBase *t_tex; - + AMFNodeElementBase *t_tex = nullptr; + // R if (!pID_R.empty()) { - pugi::xml_node *node = mXmlParser->findNode(pID_R); - if (nullptr == node) { - throw DeadlyImportError("Id not found " + pID_R + "."); - } - //if (!Find_NodeElement(pID_R, AMFNodeElementBase::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_R); + if (!Find_NodeElement(pID_R, AMFNodeElementBase::EType::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_R); src_texture[0] = (AMFTexture *)t_tex; src_texture_4check.push_back((AMFTexture *)t_tex); @@ -172,12 +168,7 @@ size_t AMFImporter::PostprocessHelper_GetTextureID_Or_Create(const std::string & // G if (!pID_G.empty()) { - pugi::xml_node *node = mXmlParser->findNode(pID_G); - if (nullptr == node) { - throw DeadlyImportError("Id not found " + pID_G + "."); - } - - //if (!Find_NodeElement(pID_G, AMFNodeElementBase::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_G); + if (!Find_NodeElement(pID_G, AMFNodeElementBase::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_G); src_texture[1] = (AMFTexture *)t_tex; src_texture_4check.push_back((AMFTexture *)t_tex); @@ -187,11 +178,7 @@ size_t AMFImporter::PostprocessHelper_GetTextureID_Or_Create(const std::string & // B if (!pID_B.empty()) { - //if (!Find_NodeElement(pID_B, AMFNodeElementBase::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_B); - pugi::xml_node *node = mXmlParser->findNode(pID_B); - if (nullptr == node) { - throw DeadlyImportError("Id not found " + pID_B + "."); - } + if (!Find_NodeElement(pID_B, AMFNodeElementBase::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_B); src_texture[2] = (AMFTexture *)t_tex; src_texture_4check.push_back((AMFTexture *)t_tex); @@ -201,12 +188,7 @@ size_t AMFImporter::PostprocessHelper_GetTextureID_Or_Create(const std::string & // A if (!pID_A.empty()) { - pugi::xml_node *node = mXmlParser->findNode(pID_A); - if (nullptr == node) { - throw DeadlyImportError("Id not found " + pID_A + "."); - } - - //if (!Find_NodeElement(pID_A, AMFNodeElementBase::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_A); + if (!Find_NodeElement(pID_A, AMFNodeElementBase::ENET_Texture, &t_tex)) Throw_ID_NotFound(pID_A); src_texture[3] = (AMFTexture *)t_tex; src_texture_4check.push_back((AMFTexture *)t_tex); @@ -216,7 +198,7 @@ size_t AMFImporter::PostprocessHelper_GetTextureID_Or_Create(const std::string & } // END: find all specified source textures // check that all textures has same size - if (!src_texture_4check.empty() ) { + if (src_texture_4check.size() > 1) { for (size_t i = 0, i_e = (src_texture_4check.size() - 1); i < i_e; i++) { if ((src_texture_4check[i]->Width != src_texture_4check[i + 1]->Width) || (src_texture_4check[i]->Height != src_texture_4check[i + 1]->Height) || (src_texture_4check[i]->Depth != src_texture_4check[i + 1]->Depth)) { @@ -241,9 +223,7 @@ size_t AMFImporter::PostprocessHelper_GetTextureID_Or_Create(const std::string & if (!pID_B.empty()) converted_texture.FormatHint[6] = '8'; if (!pID_A.empty()) converted_texture.FormatHint[7] = '8'; - // // Сopy data of textures. - // size_t tex_size = 0; size_t step = 0; size_t off_g = 0; @@ -693,7 +673,7 @@ void AMFImporter::Postprocess_BuildConstellation(AMFConstellation &pConstellatio con_node = new aiNode; con_node->mName = pConstellation.ID; // Walk through children and search for instances of another objects, constellations. - for (const CAMFImporter_NodeElement *ne : pConstellation.Child) { + for (const AMFNodeElementBase *ne : pConstellation.Child) { aiMatrix4x4 tmat; aiNode *t_node; aiNode *found_node; @@ -702,7 +682,7 @@ void AMFImporter::Postprocess_BuildConstellation(AMFConstellation &pConstellatio if (ne->Type != AMFNodeElementBase::ENET_Instance) throw DeadlyImportError("Only nodes can be in ."); // create alias for conveniance - CAMFImporter_NodeElement_Instance &als = *((CAMFImporter_NodeElement_Instance *)ne); + AMFInstance &als = *((AMFInstance *)ne); // find referenced object if (!Find_ConvertedNode(als.ObjectID, pNodeList, &found_node)) Throw_ID_NotFound(als.ObjectID); @@ -739,7 +719,7 @@ void AMFImporter::Postprocess_BuildConstellation(AMFConstellation &pConstellatio void AMFImporter::Postprocess_BuildScene(aiScene *pScene) { std::list node_list; std::list mesh_list; - std::list meta_list; + std::list meta_list; // // Because for AMF "material" is just complex colors mixing so aiMaterial will not be used. @@ -752,10 +732,11 @@ void AMFImporter::Postprocess_BuildScene(aiScene *pScene) { AMFNodeElementBase *root_el = nullptr; for (AMFNodeElementBase *ne : mNodeElement_List) { - if (ne->Type != AMFNodeElementBase::ENET_Root) continue; + if (ne->Type != AMFNodeElementBase::ENET_Root) { + continue; + } root_el = ne; - break; } // for(const CAMFImporter_NodeElement* ne: mNodeElement_List) @@ -769,7 +750,7 @@ void AMFImporter::Postprocess_BuildScene(aiScene *pScene) { // 1. // 2. will be converted later when processing triangles list. \sa Postprocess_BuildMeshSet for (const AMFNodeElementBase *root_child : root_el->Child) { - if (root_child->Type == AMFNodeElementBase::ENET_Material) Postprocess_BuildMaterial(*((CAMFImporter_NodeElement_Material *)root_child)); + if (root_child->Type == AMFNodeElementBase::ENET_Material) Postprocess_BuildMaterial(*((AMFMaterial *)root_child)); } // After "appearance" nodes we must read because it will be used in -> . @@ -780,7 +761,7 @@ void AMFImporter::Postprocess_BuildScene(aiScene *pScene) { aiNode *tnode = nullptr; // for mesh and node must be built: object ID assigned to aiNode name and will be used in future for - Postprocess_BuildNodeAndObject(*((CAMFImporter_NodeElement_Object *)root_child), mesh_list, &tnode); + Postprocess_BuildNodeAndObject(*((AMFObject *)root_child), mesh_list, &tnode); if (tnode != nullptr) node_list.push_back(tnode); } } // for(const CAMFImporter_NodeElement* root_child: root_el->Child) @@ -795,7 +776,7 @@ void AMFImporter::Postprocess_BuildScene(aiScene *pScene) { } // 5, - if (root_child->Type == AMFNodeElementBase::ENET_Metadata) meta_list.push_back((CAMFImporter_NodeElement_Metadata *)root_child); + if (root_child->Type == AMFNodeElementBase::ENET_Metadata) meta_list.push_back((AMFMetadata *)root_child); } // for(const CAMFImporter_NodeElement* root_child: root_el->Child) // at now we can add collected metadata to root node diff --git a/code/AssetLib/Collada/ColladaParser.h b/code/AssetLib/Collada/ColladaParser.h index 841995de5..58044e479 100644 --- a/code/AssetLib/Collada/ColladaParser.h +++ b/code/AssetLib/Collada/ColladaParser.h @@ -52,6 +52,8 @@ #include #include +#include + namespace Assimp { class ZipArchiveIOSystem; @@ -374,10 +376,10 @@ protected: // ------------------------------------------------------------------------------------------------ // Check for element match -inline bool ColladaParser::IsElement(const char *pName) const { +/*inline bool ColladaParser::IsElement(const char *pName) const { ai_assert(mReader->getNodeType() == irr::io::EXN_ELEMENT); return ::strcmp(mReader->getNodeName(), pName) == 0; -} +}*/ // ------------------------------------------------------------------------------------------------ // Finds the item in the given library by its reference, throws if not found diff --git a/code/AssetLib/Irr/IRRLoader.cpp b/code/AssetLib/Irr/IRRLoader.cpp index 19efb732b..2221371bb 100644 --- a/code/AssetLib/Irr/IRRLoader.cpp +++ b/code/AssetLib/Irr/IRRLoader.cpp @@ -82,13 +82,8 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer IRRImporter::IRRImporter() : -<<<<<<< HEAD fps(), configSpeedFlag() { // empty -======= - fps(), configSpeedFlag() { - // empty ->>>>>>> master } // ------------------------------------------------------------------------------------------------ @@ -100,7 +95,6 @@ IRRImporter::~IRRImporter() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. bool IRRImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const { -<<<<<<< HEAD const std::string extension = GetExtension(pFile); if (extension == "irr") { return true; @@ -117,38 +111,15 @@ bool IRRImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool c } return false; -======= - const std::string extension = GetExtension(pFile); - if (extension == "irr") { - return true; - } else if (extension == "xml" || checkSig) { - /* If CanRead() is called in order to check whether we - * support a specific file extension in general pIOHandler - * might be nullptr and it's our duty to return true here. - */ - if (nullptr == pIOHandler) { - return true; - } - const char *tokens[] = { "irr_scene" }; - return SearchFileHeaderForToken(pIOHandler, pFile, tokens, 1); - } - - return false; ->>>>>>> master } // ------------------------------------------------------------------------------------------------ const aiImporterDesc *IRRImporter::GetInfo() const { -<<<<<<< HEAD return &desc; -======= - return &desc; ->>>>>>> master } // ------------------------------------------------------------------------------------------------ void IRRImporter::SetupProperties(const Importer *pImp) { -<<<<<<< HEAD // read the output frame rate of all node animation channels fps = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_IRR_ANIM_FPS, 100); if (fps < 10.) { @@ -158,23 +129,11 @@ void IRRImporter::SetupProperties(const Importer *pImp) { // AI_CONFIG_FAVOUR_SPEED configSpeedFlag = (0 != pImp->GetPropertyInteger(AI_CONFIG_FAVOUR_SPEED, 0)); -======= - // read the output frame rate of all node animation channels - fps = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_IRR_ANIM_FPS, 100); - if (fps < 10.) { - ASSIMP_LOG_ERROR("IRR: Invalid FPS configuration"); - fps = 100; - } - - // AI_CONFIG_FAVOUR_SPEED - configSpeedFlag = (0 != pImp->GetPropertyInteger(AI_CONFIG_FAVOUR_SPEED, 0)); ->>>>>>> master } // ------------------------------------------------------------------------------------------------ // Build a mesh tha consists of a single squad (a side of a skybox) aiMesh *IRRImporter::BuildSingleQuadMesh(const SkyboxVertex &v1, -<<<<<<< HEAD const SkyboxVertex &v2, const SkyboxVertex &v3, const SkyboxVertex &v4) { @@ -216,54 +175,10 @@ aiMesh *IRRImporter::BuildSingleQuadMesh(const SkyboxVertex &v1, *vec++ = v3.uv; *vec = v4.uv; return out; -======= - const SkyboxVertex &v2, - const SkyboxVertex &v3, - const SkyboxVertex &v4) { - // allocate and prepare the mesh - aiMesh *out = new aiMesh(); - - out->mPrimitiveTypes = aiPrimitiveType_POLYGON; - out->mNumFaces = 1; - - // build the face - out->mFaces = new aiFace[1]; - aiFace &face = out->mFaces[0]; - - face.mNumIndices = 4; - face.mIndices = new unsigned int[4]; - for (unsigned int i = 0; i < 4; ++i) - face.mIndices[i] = i; - - out->mNumVertices = 4; - - // copy vertex positions - aiVector3D *vec = out->mVertices = new aiVector3D[4]; - *vec++ = v1.position; - *vec++ = v2.position; - *vec++ = v3.position; - *vec = v4.position; - - // copy vertex normals - vec = out->mNormals = new aiVector3D[4]; - *vec++ = v1.normal; - *vec++ = v2.normal; - *vec++ = v3.normal; - *vec = v4.normal; - - // copy texture coordinates - vec = out->mTextureCoords[0] = new aiVector3D[4]; - *vec++ = v1.uv; - *vec++ = v2.uv; - *vec++ = v3.uv; - *vec = v4.uv; - return out; ->>>>>>> master } // ------------------------------------------------------------------------------------------------ void IRRImporter::BuildSkybox(std::vector &meshes, std::vector materials) { -<<<<<<< HEAD // Update the material of the skybox - replace the name and disable shading for skyboxes. for (unsigned int i = 0; i < 6; ++i) { aiMaterial *out = (aiMaterial *)(*(materials.end() - (6 - i))); @@ -329,78 +244,10 @@ void IRRImporter::BuildSkybox(std::vector &meshes, std::vectormMaterialIndex = static_cast(materials.size() - 1u); -======= - // Update the material of the skybox - replace the name and disable shading for skyboxes. - for (unsigned int i = 0; i < 6; ++i) { - aiMaterial *out = (aiMaterial *)(*(materials.end() - (6 - i))); - - aiString s; - s.length = ::ai_snprintf(s.data, MAXLEN, "SkyboxSide_%u", i); - out->AddProperty(&s, AI_MATKEY_NAME); - - int shading = aiShadingMode_NoShading; - out->AddProperty(&shading, 1, AI_MATKEY_SHADING_MODEL); - } - - // Skyboxes are much more difficult. They are represented - // by six single planes with different textures, so we'll - // need to build six meshes. - - const ai_real l = 10.0; // the size used by Irrlicht - - // FRONT SIDE - meshes.push_back(BuildSingleQuadMesh( - SkyboxVertex(-l, -l, -l, 0, 0, 1, 1.0, 1.0), - SkyboxVertex(l, -l, -l, 0, 0, 1, 0.0, 1.0), - SkyboxVertex(l, l, -l, 0, 0, 1, 0.0, 0.0), - SkyboxVertex(-l, l, -l, 0, 0, 1, 1.0, 0.0))); - meshes.back()->mMaterialIndex = static_cast(materials.size() - 6u); - - // LEFT SIDE - meshes.push_back(BuildSingleQuadMesh( - SkyboxVertex(l, -l, -l, -1, 0, 0, 1.0, 1.0), - SkyboxVertex(l, -l, l, -1, 0, 0, 0.0, 1.0), - SkyboxVertex(l, l, l, -1, 0, 0, 0.0, 0.0), - SkyboxVertex(l, l, -l, -1, 0, 0, 1.0, 0.0))); - meshes.back()->mMaterialIndex = static_cast(materials.size() - 5u); - - // BACK SIDE - meshes.push_back(BuildSingleQuadMesh( - SkyboxVertex(l, -l, l, 0, 0, -1, 1.0, 1.0), - SkyboxVertex(-l, -l, l, 0, 0, -1, 0.0, 1.0), - SkyboxVertex(-l, l, l, 0, 0, -1, 0.0, 0.0), - SkyboxVertex(l, l, l, 0, 0, -1, 1.0, 0.0))); - meshes.back()->mMaterialIndex = static_cast(materials.size() - 4u); - - // RIGHT SIDE - meshes.push_back(BuildSingleQuadMesh( - SkyboxVertex(-l, -l, l, 1, 0, 0, 1.0, 1.0), - SkyboxVertex(-l, -l, -l, 1, 0, 0, 0.0, 1.0), - SkyboxVertex(-l, l, -l, 1, 0, 0, 0.0, 0.0), - SkyboxVertex(-l, l, l, 1, 0, 0, 1.0, 0.0))); - meshes.back()->mMaterialIndex = static_cast(materials.size() - 3u); - - // TOP SIDE - meshes.push_back(BuildSingleQuadMesh( - SkyboxVertex(l, l, -l, 0, -1, 0, 1.0, 1.0), - SkyboxVertex(l, l, l, 0, -1, 0, 0.0, 1.0), - SkyboxVertex(-l, l, l, 0, -1, 0, 0.0, 0.0), - SkyboxVertex(-l, l, -l, 0, -1, 0, 1.0, 0.0))); - meshes.back()->mMaterialIndex = static_cast(materials.size() - 2u); - - // BOTTOM SIDE - meshes.push_back(BuildSingleQuadMesh( - SkyboxVertex(l, -l, l, 0, 1, 0, 0.0, 0.0), - SkyboxVertex(l, -l, -l, 0, 1, 0, 1.0, 0.0), - SkyboxVertex(-l, -l, -l, 0, 1, 0, 1.0, 1.0), - SkyboxVertex(-l, -l, l, 0, 1, 0, 0.0, 1.0))); - meshes.back()->mMaterialIndex = static_cast(materials.size() - 1u); ->>>>>>> master } // ------------------------------------------------------------------------------------------------ void IRRImporter::CopyMaterial(std::vector &materials, -<<<<<<< HEAD std::vector> &inmaterials, unsigned int &defMatIdx, aiMesh *mesh) { @@ -410,17 +257,6 @@ void IRRImporter::CopyMaterial(std::vector &materials, defMatIdx = (unsigned int)materials.size(); //TODO: add this materials to someone? /*aiMaterial* mat = new aiMaterial(); -======= - std::vector> &inmaterials, - unsigned int &defMatIdx, - aiMesh *mesh) { - if (inmaterials.empty()) { - // Do we have a default material? If not we need to create one - if (UINT_MAX == defMatIdx) { - defMatIdx = (unsigned int)materials.size(); - //TODO: add this materials to someone? - /*aiMaterial* mat = new aiMaterial(); ->>>>>>> master aiString s; s.Set(AI_DEFAULT_MATERIAL_NAME); @@ -428,7 +264,6 @@ void IRRImporter::CopyMaterial(std::vector &materials, aiColor3D c(0.6f,0.6f,0.6f); mat->AddProperty(&c,1,AI_MATKEY_COLOR_DIFFUSE);*/ -<<<<<<< HEAD } mesh->mMaterialIndex = defMatIdx; return; @@ -438,31 +273,15 @@ void IRRImporter::CopyMaterial(std::vector &materials, mesh->mMaterialIndex = (unsigned int)materials.size(); materials.push_back(inmaterials[0].first); -======= - } - mesh->mMaterialIndex = defMatIdx; - return; - } else if (inmaterials.size() > 1) { - ASSIMP_LOG_INFO("IRR: Skipping additional materials"); - } - - mesh->mMaterialIndex = (unsigned int)materials.size(); - materials.push_back(inmaterials[0].first); ->>>>>>> master } // ------------------------------------------------------------------------------------------------ inline int ClampSpline(int idx, int size) { -<<<<<<< HEAD return (idx < 0 ? size + idx : (idx >= size ? idx - size : idx)); -======= - return (idx < 0 ? size + idx : (idx >= size ? idx - size : idx)); ->>>>>>> master } // ------------------------------------------------------------------------------------------------ inline void FindSuitableMultiple(int &angle) { -<<<<<<< HEAD if (angle < 3) angle = 3; else if (angle < 10) @@ -471,21 +290,10 @@ inline void FindSuitableMultiple(int &angle) { angle = 20; else if (angle < 30) angle = 30; -======= - if (angle < 3) - angle = 3; - else if (angle < 10) - angle = 10; - else if (angle < 20) - angle = 20; - else if (angle < 30) - angle = 30; ->>>>>>> master } // ------------------------------------------------------------------------------------------------ void IRRImporter::ComputeAnimations(Node *root, aiNode *real, std::vector &anims) { -<<<<<<< HEAD ai_assert(nullptr != root && nullptr != real); // XXX totally WIP - doesn't produce proper results, need to evaluate @@ -587,119 +395,8 @@ void IRRImporter::ComputeAnimations(Node *root, aiNode *real, std::vectoranimators.empty()) { - return; - } - unsigned int total(0); - for (std::list::iterator it = root->animators.begin(); it != root->animators.end(); ++it) { - if ((*it).type == Animator::UNKNOWN || (*it).type == Animator::OTHER) { - ASSIMP_LOG_WARN("IRR: Skipping unknown or unsupported animator"); - continue; - } - ++total; - } - if (!total) { - return; - } else if (1 == total) { - ASSIMP_LOG_WARN("IRR: Adding dummy nodes to simulate multiple animators"); - } - - // NOTE: 1 tick == i millisecond - - unsigned int cur = 0; - for (std::list::iterator it = root->animators.begin(); - it != root->animators.end(); ++it) { - if ((*it).type == Animator::UNKNOWN || (*it).type == Animator::OTHER) continue; - - Animator &in = *it; - aiNodeAnim *anim = new aiNodeAnim(); - - if (cur != total - 1) { - // Build a new name - a prefix instead of a suffix because it is - // easier to check against - anim->mNodeName.length = ::ai_snprintf(anim->mNodeName.data, MAXLEN, - "$INST_DUMMY_%i_%s", total - 1, - (root->name.length() ? root->name.c_str() : "")); - - // we'll also need to insert a dummy in the node hierarchy. - aiNode *dummy = new aiNode(); - - for (unsigned int i = 0; i < real->mParent->mNumChildren; ++i) - if (real->mParent->mChildren[i] == real) - real->mParent->mChildren[i] = dummy; - - dummy->mParent = real->mParent; - dummy->mName = anim->mNodeName; - - dummy->mNumChildren = 1; - dummy->mChildren = new aiNode *[dummy->mNumChildren]; - dummy->mChildren[0] = real; - - // the transformation matrix of the dummy node is the identity - - real->mParent = dummy; - } else - anim->mNodeName.Set(root->name); - ++cur; - - switch (in.type) { - case Animator::ROTATION: { - // ----------------------------------------------------- - // find out how long a full rotation will take - // This is the least common multiple of 360.f and all - // three euler angles. Although we'll surely find a - // possible multiple (haha) it could be somewhat large - // for our purposes. So we need to modify the angles - // here in order to get good results. - // ----------------------------------------------------- - int angles[3]; - angles[0] = (int)(in.direction.x * 100); - angles[1] = (int)(in.direction.y * 100); - angles[2] = (int)(in.direction.z * 100); - - angles[0] %= 360; - angles[1] %= 360; - angles[2] %= 360; - - if ((angles[0] * angles[1]) != 0 && (angles[1] * angles[2]) != 0) { - FindSuitableMultiple(angles[0]); - FindSuitableMultiple(angles[1]); - FindSuitableMultiple(angles[2]); - } - - int lcm = 360; - - if (angles[0]) - lcm = Math::lcm(lcm, angles[0]); - - if (angles[1]) - lcm = Math::lcm(lcm, angles[1]); - - if (angles[2]) - lcm = Math::lcm(lcm, angles[2]); - - if (360 == lcm) - break; ->>>>>>> master - -#if 0 - // This can be a division through zero, but we don't care - float f1 = (float)lcm / angles[0]; - float f2 = (float)lcm / angles[1]; - float f3 = (float)lcm / angles[2]; -#endif - -<<<<<<< HEAD // find out how many time units we'll need for the finest // track (in seconds) - this defines the number of output // keys (fps * seconds) @@ -854,168 +551,11 @@ void IRRImporter::ComputeAnimations(Node *root, aiNode *real, std::vectormNumRotationKeys = (unsigned int)(max * fps); - anim->mRotationKeys = new aiQuatKey[anim->mNumRotationKeys]; - - // begin with a zero angle - aiVector3D angle; - for (unsigned int i = 0; i < anim->mNumRotationKeys; ++i) { - // build the quaternion for the given euler angles - aiQuatKey &q = anim->mRotationKeys[i]; - - q.mValue = aiQuaternion(angle.x, angle.y, angle.z); - q.mTime = (double)i; - - // increase the angle - angle += in.direction; - } - - // This animation is repeated and repeated ... - anim->mPostState = anim->mPreState = aiAnimBehaviour_REPEAT; - } break; - - case Animator::FLY_CIRCLE: { - // ----------------------------------------------------- - // Find out how much time we'll need to perform a - // full circle. - // ----------------------------------------------------- - const double seconds = (1. / in.speed) / 1000.; - const double tdelta = 1000. / fps; - - anim->mNumPositionKeys = (unsigned int)(fps * seconds); - anim->mPositionKeys = new aiVectorKey[anim->mNumPositionKeys]; - - // from Irrlicht, what else should we do than copying it? - aiVector3D vecU, vecV; - if (in.direction.y) { - vecV = aiVector3D(50, 0, 0) ^ in.direction; - } else - vecV = aiVector3D(0, 50, 00) ^ in.direction; - vecV.Normalize(); - vecU = (vecV ^ in.direction).Normalize(); - - // build the output keys - for (unsigned int i = 0; i < anim->mNumPositionKeys; ++i) { - aiVectorKey &key = anim->mPositionKeys[i]; - key.mTime = i * tdelta; - - const ai_real t = (ai_real)(in.speed * key.mTime); - key.mValue = in.circleCenter + in.circleRadius * ((vecU * std::cos(t)) + (vecV * std::sin(t))); - } - - // This animation is repeated and repeated ... - anim->mPostState = anim->mPreState = aiAnimBehaviour_REPEAT; - } break; - - case Animator::FLY_STRAIGHT: { - anim->mPostState = anim->mPreState = (in.loop ? aiAnimBehaviour_REPEAT : aiAnimBehaviour_CONSTANT); - const double seconds = in.timeForWay / 1000.; - const double tdelta = 1000. / fps; - - anim->mNumPositionKeys = (unsigned int)(fps * seconds); - anim->mPositionKeys = new aiVectorKey[anim->mNumPositionKeys]; - - aiVector3D diff = in.direction - in.circleCenter; - const ai_real lengthOfWay = diff.Length(); - diff.Normalize(); - - const double timeFactor = lengthOfWay / in.timeForWay; - - // build the output keys - for (unsigned int i = 0; i < anim->mNumPositionKeys; ++i) { - aiVectorKey &key = anim->mPositionKeys[i]; - key.mTime = i * tdelta; - key.mValue = in.circleCenter + diff * ai_real(timeFactor * key.mTime); - } - } break; - - case Animator::FOLLOW_SPLINE: { - // repeat outside the defined time range - anim->mPostState = anim->mPreState = aiAnimBehaviour_REPEAT; - const int size = (int)in.splineKeys.size(); - if (!size) { - // We have no point in the spline. That's bad. Really bad. - ASSIMP_LOG_WARN("IRR: Spline animators with no points defined"); - - delete anim; - anim = nullptr; - break; - } else if (size == 1) { - // We have just one point in the spline so we don't need the full calculation - anim->mNumPositionKeys = 1; - anim->mPositionKeys = new aiVectorKey[anim->mNumPositionKeys]; - - anim->mPositionKeys[0].mValue = in.splineKeys[0].mValue; - anim->mPositionKeys[0].mTime = 0.f; - break; - } - - unsigned int ticksPerFull = 15; - anim->mNumPositionKeys = (unsigned int)(ticksPerFull * fps); - anim->mPositionKeys = new aiVectorKey[anim->mNumPositionKeys]; - - for (unsigned int i = 0; i < anim->mNumPositionKeys; ++i) { - aiVectorKey &key = anim->mPositionKeys[i]; - - const ai_real dt = (i * in.speed * ai_real(0.001)); - const ai_real u = dt - std::floor(dt); - const int idx = (int)std::floor(dt) % size; - - // get the 4 current points to evaluate the spline - const aiVector3D &p0 = in.splineKeys[ClampSpline(idx - 1, size)].mValue; - const aiVector3D &p1 = in.splineKeys[ClampSpline(idx + 0, size)].mValue; - const aiVector3D &p2 = in.splineKeys[ClampSpline(idx + 1, size)].mValue; - const aiVector3D &p3 = in.splineKeys[ClampSpline(idx + 2, size)].mValue; - - // compute polynomials - const ai_real u2 = u * u; - const ai_real u3 = u2 * 2; - - const ai_real h1 = ai_real(2.0) * u3 - ai_real(3.0) * u2 + ai_real(1.0); - const ai_real h2 = ai_real(-2.0) * u3 + ai_real(3.0) * u3; - const ai_real h3 = u3 - ai_real(2.0) * u3; - const ai_real h4 = u3 - u2; - - // compute the spline tangents - const aiVector3D t1 = (p2 - p0) * in.tightness; - aiVector3D t2 = (p3 - p1) * in.tightness; - - // and use them to get the interpolated point - t2 = (h1 * p1 + p2 * h2 + t1 * h3 + h4 * t2); - - // build a simple translation matrix from it - key.mValue = t2; - key.mTime = (double)i; - } - } break; - default: - // UNKNOWN , OTHER - break; - }; - if (anim) { - anims.push_back(anim); - ++total; - } - } ->>>>>>> master } // ------------------------------------------------------------------------------------------------ // This function is maybe more generic than we'd need it here void SetupMapping(aiMaterial *mat, aiTextureMapping mode, const aiVector3D &axis = aiVector3D(0.f, 0.f, -1.f)) { -<<<<<<< HEAD if (nullptr == mat) { return; } @@ -1074,67 +614,10 @@ void SetupMapping(aiMaterial *mat, aiTextureMapping mode, const aiVector3D &axis } mat->mNumProperties = (unsigned int)p.size(); ::memcpy(mat->mProperties, &p[0], sizeof(void *) * mat->mNumProperties); -======= - // Check whether there are texture properties defined - setup - // the desired texture mapping mode for all of them and ignore - // all UV settings we might encounter. WE HAVE NO UVS! - - std::vector p; - p.reserve(mat->mNumProperties + 1); - - for (unsigned int i = 0; i < mat->mNumProperties; ++i) { - aiMaterialProperty *prop = mat->mProperties[i]; - if (!::strcmp(prop->mKey.data, "$tex.file")) { - // Setup the mapping key - aiMaterialProperty *m = new aiMaterialProperty(); - m->mKey.Set("$tex.mapping"); - m->mIndex = prop->mIndex; - m->mSemantic = prop->mSemantic; - m->mType = aiPTI_Integer; - - m->mDataLength = 4; - m->mData = new char[4]; - *((int *)m->mData) = mode; - - p.push_back(prop); - p.push_back(m); - - // Setup the mapping axis - if (mode == aiTextureMapping_CYLINDER || mode == aiTextureMapping_PLANE || mode == aiTextureMapping_SPHERE) { - m = new aiMaterialProperty(); - m->mKey.Set("$tex.mapaxis"); - m->mIndex = prop->mIndex; - m->mSemantic = prop->mSemantic; - m->mType = aiPTI_Float; - - m->mDataLength = 12; - m->mData = new char[12]; - *((aiVector3D *)m->mData) = axis; - p.push_back(m); - } - } else if (!::strcmp(prop->mKey.data, "$tex.uvwsrc")) { - delete mat->mProperties[i]; - } else - p.push_back(prop); - } - - if (p.empty()) return; - - // rebuild the output array - if (p.size() > mat->mNumAllocated) { - delete[] mat->mProperties; - mat->mProperties = new aiMaterialProperty *[p.size() * 2]; - - mat->mNumAllocated = static_cast(p.size() * 2); - } - mat->mNumProperties = (unsigned int)p.size(); - ::memcpy(mat->mProperties, &p[0], sizeof(void *) * mat->mNumProperties); ->>>>>>> master } // ------------------------------------------------------------------------------------------------ void IRRImporter::GenerateGraph(Node *root, aiNode *rootOut, aiScene *scene, -<<<<<<< HEAD BatchLoader &batch, std::vector &meshes, std::vector &anims, @@ -1367,247 +850,11 @@ void IRRImporter::GenerateGraph(Node *root, aiNode *rootOut, aiScene *scene, anims, attach, materials, defMatIdx); } } -======= - BatchLoader &batch, - std::vector &meshes, - std::vector &anims, - std::vector &attach, - std::vector &materials, - unsigned int &defMatIdx) { - unsigned int oldMeshSize = (unsigned int)meshes.size(); - //unsigned int meshTrafoAssign = 0; - - // Now determine the type of the node - switch (root->type) { - case Node::ANIMMESH: - case Node::MESH: { - if (!root->meshPath.length()) - break; - - // Get the loaded mesh from the scene and add it to - // the list of all scenes to be attached to the - // graph we're currently building - aiScene *localScene = batch.GetImport(root->id); - if (!localScene) { - ASSIMP_LOG_ERROR("IRR: Unable to load external file: " + root->meshPath); - break; - } - attach.push_back(AttachmentInfo(localScene, rootOut)); - - // Now combine the material we've loaded for this mesh - // with the real materials we got from the file. As we - // don't execute any pp-steps on the file, the numbers - // should be equal. If they are not, we can impossibly - // do this ... - if (root->materials.size() != (unsigned int)localScene->mNumMaterials) { - ASSIMP_LOG_WARN("IRR: Failed to match imported materials " - "with the materials found in the IRR scene file"); - - break; - } - for (unsigned int i = 0; i < localScene->mNumMaterials; ++i) { - // Delete the old material, we don't need it anymore - delete localScene->mMaterials[i]; - - std::pair &src = root->materials[i]; - localScene->mMaterials[i] = src.first; - } - - // NOTE: Each mesh should have exactly one material assigned, - // but we do it in a separate loop if this behaviour changes - // in future. - for (unsigned int i = 0; i < localScene->mNumMeshes; ++i) { - // Process material flags - aiMesh *mesh = localScene->mMeshes[i]; - - // If "trans_vertex_alpha" mode is enabled, search all vertex colors - // and check whether they have a common alpha value. This is quite - // often the case so we can simply extract it to a shared oacity - // value. - std::pair &src = root->materials[mesh->mMaterialIndex]; - aiMaterial *mat = (aiMaterial *)src.first; - - if (mesh->HasVertexColors(0) && src.second & AI_IRRMESH_MAT_trans_vertex_alpha) { - bool bdo = true; - for (unsigned int a = 1; a < mesh->mNumVertices; ++a) { - - if (mesh->mColors[0][a].a != mesh->mColors[0][a - 1].a) { - bdo = false; - break; - } - } - if (bdo) { - ASSIMP_LOG_INFO("IRR: Replacing mesh vertex alpha with common opacity"); - - for (unsigned int a = 0; a < mesh->mNumVertices; ++a) - mesh->mColors[0][a].a = 1.f; - - mat->AddProperty(&mesh->mColors[0][0].a, 1, AI_MATKEY_OPACITY); - } - } - - // If we have a second texture coordinate set and a second texture - // (either lightmap, normalmap, 2layered material) we need to - // setup the correct UV index for it. The texture can either - // be diffuse (lightmap & 2layer) or a normal map (normal & parallax) - if (mesh->HasTextureCoords(1)) { - - int idx = 1; - if (src.second & (AI_IRRMESH_MAT_solid_2layer | AI_IRRMESH_MAT_lightmap)) { - mat->AddProperty(&idx, 1, AI_MATKEY_UVWSRC_DIFFUSE(0)); - } else if (src.second & AI_IRRMESH_MAT_normalmap_solid) { - mat->AddProperty(&idx, 1, AI_MATKEY_UVWSRC_NORMALS(0)); - } - } - } - } break; - - case Node::LIGHT: - case Node::CAMERA: - - // We're already finished with lights and cameras - break; - - case Node::SPHERE: { - // Generate the sphere model. Our input parameter to - // the sphere generation algorithm is the number of - // subdivisions of each triangle - but here we have - // the number of poylgons on a specific axis. Just - // use some hardcoded limits to approximate this ... - unsigned int mul = root->spherePolyCountX * root->spherePolyCountY; - if (mul < 100) - mul = 2; - else if (mul < 300) - mul = 3; - else - mul = 4; - - meshes.push_back(StandardShapes::MakeMesh(mul, - &StandardShapes::MakeSphere)); - - // Adjust scaling - root->scaling *= root->sphereRadius / 2; - - // Copy one output material - CopyMaterial(materials, root->materials, defMatIdx, meshes.back()); - - // Now adjust this output material - if there is a first texture - // set, setup spherical UV mapping around the Y axis. - SetupMapping((aiMaterial *)materials.back(), aiTextureMapping_SPHERE); - } break; - - case Node::CUBE: { - // Generate an unit cube first - meshes.push_back(StandardShapes::MakeMesh( - &StandardShapes::MakeHexahedron)); - - // Adjust scaling - root->scaling *= root->sphereRadius; - - // Copy one output material - CopyMaterial(materials, root->materials, defMatIdx, meshes.back()); - - // Now adjust this output material - if there is a first texture - // set, setup cubic UV mapping - SetupMapping((aiMaterial *)materials.back(), aiTextureMapping_BOX); - } break; - - case Node::SKYBOX: { - // A skybox is defined by six materials - if (root->materials.size() < 6) { - ASSIMP_LOG_ERROR("IRR: There should be six materials for a skybox"); - break; - } - - // copy those materials and generate 6 meshes for our new skybox - materials.reserve(materials.size() + 6); - for (unsigned int i = 0; i < 6; ++i) - materials.insert(materials.end(), root->materials[i].first); - - BuildSkybox(meshes, materials); - - // ************************************************************* - // Skyboxes will require a different code path for rendering, - // so there must be a way for the user to add special support - // for IRR skyboxes. We add a 'IRR.SkyBox_' prefix to the node. - // ************************************************************* - root->name = "IRR.SkyBox_" + root->name; - ASSIMP_LOG_INFO("IRR: Loading skybox, this will " - "require special handling to be displayed correctly"); - } break; - - case Node::TERRAIN: { - // to support terrains, we'd need to have a texture decoder - ASSIMP_LOG_ERROR("IRR: Unsupported node - TERRAIN"); - } break; - default: - // DUMMY - break; - }; - - // Check whether we added a mesh (or more than one ...). In this case - // we'll also need to attach it to the node - if (oldMeshSize != (unsigned int)meshes.size()) { - - rootOut->mNumMeshes = (unsigned int)meshes.size() - oldMeshSize; - rootOut->mMeshes = new unsigned int[rootOut->mNumMeshes]; - - for (unsigned int a = 0; a < rootOut->mNumMeshes; ++a) { - rootOut->mMeshes[a] = oldMeshSize + a; - } - } - - // Setup the name of this node - rootOut->mName.Set(root->name); - - // Now compute the final local transformation matrix of the - // node from the given translation, rotation and scaling values. - // (the rotation is given in Euler angles, XYZ order) - //std::swap((float&)root->rotation.z,(float&)root->rotation.y); - rootOut->mTransformation.FromEulerAnglesXYZ(AI_DEG_TO_RAD(root->rotation)); - - // apply scaling - aiMatrix4x4 &mat = rootOut->mTransformation; - mat.a1 *= root->scaling.x; - mat.b1 *= root->scaling.x; - mat.c1 *= root->scaling.x; - mat.a2 *= root->scaling.y; - mat.b2 *= root->scaling.y; - mat.c2 *= root->scaling.y; - mat.a3 *= root->scaling.z; - mat.b3 *= root->scaling.z; - mat.c3 *= root->scaling.z; - - // apply translation - mat.a4 += root->position.x; - mat.b4 += root->position.y; - mat.c4 += root->position.z; - - // now compute animations for the node - ComputeAnimations(root, rootOut, anims); - - // Add all children recursively. First allocate enough storage - // for them, then call us again - rootOut->mNumChildren = (unsigned int)root->children.size(); - if (rootOut->mNumChildren) { - - rootOut->mChildren = new aiNode *[rootOut->mNumChildren]; - for (unsigned int i = 0; i < rootOut->mNumChildren; ++i) { - - aiNode *node = rootOut->mChildren[i] = new aiNode(); - node->mParent = rootOut; - GenerateGraph(root->children[i], node, scene, batch, meshes, - anims, attach, materials, defMatIdx); - } - } ->>>>>>> master } // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void IRRImporter::InternReadFile(const std::string &pFile, -<<<<<<< HEAD - aiScene *pScene, IOSystem *pIOHandler) { +void IRRImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) { std::unique_ptr file(pIOHandler->Open(pFile)); // Check whether we can read from the file @@ -1736,144 +983,9 @@ void IRRImporter::InternReadFile(const std::string &pFile, // We should have a valid node here // FIX: no ... the scene root node is also contained in an attributes block if (!curNode) { -======= - aiScene *pScene, IOSystem *pIOHandler) { - std::unique_ptr file(pIOHandler->Open(pFile)); - - // Check whether we can read from the file - if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open IRR file " + pFile + ""); - } - - // Construct the irrXML parser - CIrrXML_IOStreamReader st(file.get()); - reader = createIrrXMLReader((IFileReadCallBack *)&st); - - // The root node of the scene - Node *root = new Node(Node::DUMMY); - root->parent = nullptr; - root->name = ""; - - // Current node parent - Node *curParent = root; - - // Scenegraph node we're currently working on - Node *curNode = nullptr; - - // List of output cameras - std::vector cameras; - - // List of output lights - std::vector lights; - - // Batch loader used to load external models - BatchLoader batch(pIOHandler); - // batch.SetBasePath(pFile); - - cameras.reserve(5); - lights.reserve(5); - - bool inMaterials = false, inAnimator = false; - unsigned int guessedAnimCnt = 0, guessedMeshCnt = 0, guessedMatCnt = 0; - - // Parse the XML file - while (reader->read()) { - switch (reader->getNodeType()) { - case EXN_ELEMENT: - - if (!ASSIMP_stricmp(reader->getNodeName(), "node")) { - // *********************************************************************** - /* What we're going to do with the node depends - * on its type: - * - * "mesh" - Load a mesh from an external file - * "cube" - Generate a cube - * "skybox" - Generate a skybox - * "light" - A light source - * "sphere" - Generate a sphere mesh - * "animatedMesh" - Load an animated mesh from an external file - * and join its animation channels with ours. - * "empty" - A dummy node - * "camera" - A camera - * "terrain" - a terrain node (data comes from a heightmap) - * "billboard", "" - * - * Each of these nodes can be animated and all can have multiple - * materials assigned (except lights, cameras and dummies, of course). - */ - // *********************************************************************** - const char *sz = reader->getAttributeValueSafe("type"); - Node *nd; - if (!ASSIMP_stricmp(sz, "mesh") || !ASSIMP_stricmp(sz, "octTree")) { - // OctTree's and meshes are treated equally - nd = new Node(Node::MESH); - } else if (!ASSIMP_stricmp(sz, "cube")) { - nd = new Node(Node::CUBE); - ++guessedMeshCnt; - // meshes.push_back(StandardShapes::MakeMesh(&StandardShapes::MakeHexahedron)); - } else if (!ASSIMP_stricmp(sz, "skybox")) { - nd = new Node(Node::SKYBOX); - guessedMeshCnt += 6; - } else if (!ASSIMP_stricmp(sz, "camera")) { - nd = new Node(Node::CAMERA); - - // Setup a temporary name for the camera - aiCamera *cam = new aiCamera(); - cam->mName.Set(nd->name); - cameras.push_back(cam); - } else if (!ASSIMP_stricmp(sz, "light")) { - nd = new Node(Node::LIGHT); - - // Setup a temporary name for the light - aiLight *cam = new aiLight(); - cam->mName.Set(nd->name); - lights.push_back(cam); - } else if (!ASSIMP_stricmp(sz, "sphere")) { - nd = new Node(Node::SPHERE); - ++guessedMeshCnt; - } else if (!ASSIMP_stricmp(sz, "animatedMesh")) { - nd = new Node(Node::ANIMMESH); - } else if (!ASSIMP_stricmp(sz, "empty")) { - nd = new Node(Node::DUMMY); - } else if (!ASSIMP_stricmp(sz, "terrain")) { - nd = new Node(Node::TERRAIN); - } else if (!ASSIMP_stricmp(sz, "billBoard")) { - // We don't support billboards, so ignore them - ASSIMP_LOG_ERROR("IRR: Billboards are not supported by Assimp"); - nd = new Node(Node::DUMMY); - } else { - ASSIMP_LOG_WARN("IRR: Found unknown node: " + std::string(sz)); - - /* We skip the contents of nodes we don't know. - * We parse the transformation and all animators - * and skip the rest. - */ - nd = new Node(Node::DUMMY); - } - - /* Attach the newly created node to the scenegraph - */ - curNode = nd; - nd->parent = curParent; - curParent->children.push_back(nd); - } else if (!ASSIMP_stricmp(reader->getNodeName(), "materials")) { - inMaterials = true; - } else if (!ASSIMP_stricmp(reader->getNodeName(), "animators")) { - inAnimator = true; - } else if (!ASSIMP_stricmp(reader->getNodeName(), "attributes")) { - /* We should have a valid node here - * FIX: no ... the scene root node is also contained in an attributes block - */ - if (!curNode) { ->>>>>>> master -#if 0 - ASSIMP_LOG_ERROR("IRR: Encountered element, but " - "there is no node active"); -#endif continue; } -<<<<<<< HEAD Animator *curAnim = nullptr; // Materials can occur for nearly any type of node @@ -1883,17 +995,6 @@ void IRRImporter::InternReadFile(const std::string &pFile, std::pair &p = curNode->materials.back(); p.first = ParseMaterial(p.second); -======= - Animator *curAnim = nullptr; - - // Materials can occur for nearly any type of node - if (inMaterials && curNode->type != Node::DUMMY) { - /* This is a material description - parse it! - */ - curNode->materials.push_back(std::pair()); - std::pair &p = curNode->materials.back(); ->>>>>>> master - ++guessedMatCnt; continue; } else if (inAnimator) { @@ -1902,7 +1003,6 @@ void IRRImporter::InternReadFile(const std::string &pFile, curNode->animators.push_back(Animator()); curAnim = &curNode->animators.back(); -<<<<<<< HEAD ++guessedAnimCnt; } @@ -2083,192 +1183,7 @@ void IRRImporter::InternReadFile(const std::string &pFile, } } else if ((prop.name == "Mesh" && Node::MESH == curNode->type) || Node::ANIMMESH == curNode->type) { - /* This is the file name of the mesh - either -======= - ++guessedMatCnt; - continue; - } else if (inAnimator) { - /* This is an animation path - add a new animator - * to the list. - */ - curNode->animators.push_back(Animator()); - curAnim = &curNode->animators.back(); - - ++guessedAnimCnt; - } - - /* Parse all elements in the attributes block - * and process them. - */ - while (reader->read()) { - if (reader->getNodeType() == EXN_ELEMENT) { - if (!ASSIMP_stricmp(reader->getNodeName(), "vector3d")) { - VectorProperty prop; - ReadVectorProperty(prop); - - if (inAnimator) { - if (curAnim->type == Animator::ROTATION && prop.name == "Rotation") { - // We store the rotation euler angles in 'direction' - curAnim->direction = prop.value; - } else if (curAnim->type == Animator::FOLLOW_SPLINE) { - // Check whether the vector follows the PointN naming scheme, - // here N is the ONE-based index of the point - if (prop.name.length() >= 6 && prop.name.substr(0, 5) == "Point") { - // Add a new key to the list - curAnim->splineKeys.push_back(aiVectorKey()); - aiVectorKey &key = curAnim->splineKeys.back(); - - // and parse its properties - key.mValue = prop.value; - key.mTime = strtoul10(&prop.name[5]); - } - } else if (curAnim->type == Animator::FLY_CIRCLE) { - if (prop.name == "Center") { - curAnim->circleCenter = prop.value; - } else if (prop.name == "Direction") { - curAnim->direction = prop.value; - - // From Irrlicht's source - a workaround for backward compatibility with Irrlicht 1.1 - if (curAnim->direction == aiVector3D()) { - curAnim->direction = aiVector3D(0.f, 1.f, 0.f); - } else - curAnim->direction.Normalize(); - } - } else if (curAnim->type == Animator::FLY_STRAIGHT) { - if (prop.name == "Start") { - // We reuse the field here - curAnim->circleCenter = prop.value; - } else if (prop.name == "End") { - // We reuse the field here - curAnim->direction = prop.value; - } - } - } else { - if (prop.name == "Position") { - curNode->position = prop.value; - } else if (prop.name == "Rotation") { - curNode->rotation = prop.value; - } else if (prop.name == "Scale") { - curNode->scaling = prop.value; - } else if (Node::CAMERA == curNode->type) { - aiCamera *cam = cameras.back(); - if (prop.name == "Target") { - cam->mLookAt = prop.value; - } else if (prop.name == "UpVector") { - cam->mUp = prop.value; - } - } - } - } else if (!ASSIMP_stricmp(reader->getNodeName(), "bool")) { - BoolProperty prop; - ReadBoolProperty(prop); - - if (inAnimator && curAnim->type == Animator::FLY_CIRCLE && prop.name == "Loop") { - curAnim->loop = prop.value; - } - } else if (!ASSIMP_stricmp(reader->getNodeName(), "float")) { - FloatProperty prop; - ReadFloatProperty(prop); - - if (inAnimator) { - // The speed property exists for several animators - if (prop.name == "Speed") { - curAnim->speed = prop.value; - } else if (curAnim->type == Animator::FLY_CIRCLE && prop.name == "Radius") { - curAnim->circleRadius = prop.value; - } else if (curAnim->type == Animator::FOLLOW_SPLINE && prop.name == "Tightness") { - curAnim->tightness = prop.value; - } - } else { - if (prop.name == "FramesPerSecond" && Node::ANIMMESH == curNode->type) { - curNode->framesPerSecond = prop.value; - } else if (Node::CAMERA == curNode->type) { - /* This is the vertical, not the horizontal FOV. - * We need to compute the right FOV from the - * screen aspect which we don't know yet. - */ - if (prop.name == "Fovy") { - cameras.back()->mHorizontalFOV = prop.value; - } else if (prop.name == "Aspect") { - cameras.back()->mAspect = prop.value; - } else if (prop.name == "ZNear") { - cameras.back()->mClipPlaneNear = prop.value; - } else if (prop.name == "ZFar") { - cameras.back()->mClipPlaneFar = prop.value; - } - } else if (Node::LIGHT == curNode->type) { - /* Additional light information - */ - if (prop.name == "Attenuation") { - lights.back()->mAttenuationLinear = prop.value; - } else if (prop.name == "OuterCone") { - lights.back()->mAngleOuterCone = AI_DEG_TO_RAD(prop.value); - } else if (prop.name == "InnerCone") { - lights.back()->mAngleInnerCone = AI_DEG_TO_RAD(prop.value); - } - } - // radius of the sphere to be generated - - // or alternatively, size of the cube - else if ((Node::SPHERE == curNode->type && prop.name == "Radius") || (Node::CUBE == curNode->type && prop.name == "Size")) { - - curNode->sphereRadius = prop.value; - } - } - } else if (!ASSIMP_stricmp(reader->getNodeName(), "int")) { - IntProperty prop; - ReadIntProperty(prop); - - if (inAnimator) { - if (curAnim->type == Animator::FLY_STRAIGHT && prop.name == "TimeForWay") { - curAnim->timeForWay = prop.value; - } - } else { - // sphere polgon numbers in each direction - if (Node::SPHERE == curNode->type) { - - if (prop.name == "PolyCountX") { - curNode->spherePolyCountX = prop.value; - } else if (prop.name == "PolyCountY") { - curNode->spherePolyCountY = prop.value; - } - } - } - } else if (!ASSIMP_stricmp(reader->getNodeName(), "string") || !ASSIMP_stricmp(reader->getNodeName(), "enum")) { - StringProperty prop; - ReadStringProperty(prop); - if (prop.value.length()) { - if (prop.name == "Name") { - curNode->name = prop.value; - - /* If we're either a camera or a light source - * we need to update the name in the aiLight/ - * aiCamera structure, too. - */ - if (Node::CAMERA == curNode->type) { - cameras.back()->mName.Set(prop.value); - } else if (Node::LIGHT == curNode->type) { - lights.back()->mName.Set(prop.value); - } - } else if (Node::LIGHT == curNode->type && "LightType" == prop.name) { - if (prop.value == "Spot") - lights.back()->mType = aiLightSource_SPOT; - else if (prop.value == "Point") - lights.back()->mType = aiLightSource_POINT; - else if (prop.value == "Directional") - lights.back()->mType = aiLightSource_DIRECTIONAL; - else { - // We won't pass the validation with aiLightSourceType_UNDEFINED, - // so we remove the light and replace it with a silly dummy node - delete lights.back(); - lights.pop_back(); - curNode->type = Node::DUMMY; - - ASSIMP_LOG_ERROR("Ignoring light of unknown type: " + prop.value); - } - } else if ((prop.name == "Mesh" && Node::MESH == curNode->type) || - Node::ANIMMESH == curNode->type) { - /* This is the file name of the mesh - either ->>>>>>> master + /* This is the file name of the mesh - either * animated or not. We need to make sure we setup * the correct post-processing settings here. */ @@ -2277,7 +1192,6 @@ void IRRImporter::InternReadFile(const std::string &pFile, /* If the mesh is a static one remove all animations from the impor data */ -<<<<<<< HEAD if (Node::ANIMMESH != curNode->type) { pp |= aiProcess_RemoveComponent; SetGenericProperty(map.ints, AI_CONFIG_PP_RVC_FLAGS, @@ -2452,191 +1366,6 @@ void IRRImporter::InternReadFile(const std::string &pFile, // Finished ... everything destructs automatically and all // temporary scenes have already been deleted by MergeScenes() delete root; -======= - if (Node::ANIMMESH != curNode->type) { - pp |= aiProcess_RemoveComponent; - SetGenericProperty(map.ints, AI_CONFIG_PP_RVC_FLAGS, - aiComponent_ANIMATIONS | aiComponent_BONEWEIGHTS); - } - - /* TODO: maybe implement the protection against recursive - * loading calls directly in BatchLoader? The current - * implementation is not absolutely safe. A LWS and an IRR - * file referencing each other *could* cause the system to - * recurse forever. - */ - - const std::string extension = GetExtension(prop.value); - if ("irr" == extension) { - ASSIMP_LOG_ERROR("IRR: Can't load another IRR file recursively"); - } else { - curNode->id = batch.AddLoadRequest(prop.value, pp, &map); - curNode->meshPath = prop.value; - } - } else if (inAnimator && prop.name == "Type") { - // type of the animator - if (prop.value == "rotation") { - curAnim->type = Animator::ROTATION; - } else if (prop.value == "flyCircle") { - curAnim->type = Animator::FLY_CIRCLE; - } else if (prop.value == "flyStraight") { - curAnim->type = Animator::FLY_CIRCLE; - } else if (prop.value == "followSpline") { - curAnim->type = Animator::FOLLOW_SPLINE; - } else { - ASSIMP_LOG_WARN("IRR: Ignoring unknown animator: " + prop.value); - - curAnim->type = Animator::UNKNOWN; - } - } - } - } - } else if (reader->getNodeType() == EXN_ELEMENT_END && !ASSIMP_stricmp(reader->getNodeName(), "attributes")) { - break; - } - } - } - break; - - case EXN_ELEMENT_END: - - // If we reached the end of a node, we need to continue processing its parent - if (!ASSIMP_stricmp(reader->getNodeName(), "node")) { - if (!curNode) { - // currently is no node set. We need to go - // back in the node hierarchy - if (!curParent) { - curParent = root; - ASSIMP_LOG_ERROR("IRR: Too many closing elements"); - } else - curParent = curParent->parent; - } else - curNode = nullptr; - } - // clear all flags - else if (!ASSIMP_stricmp(reader->getNodeName(), "materials")) { - inMaterials = false; - } else if (!ASSIMP_stricmp(reader->getNodeName(), "animators")) { - inAnimator = false; - } - break; - - default: - // GCC complains that not all enumeration values are handled - break; - } - } - - // Now iterate through all cameras and compute their final (horizontal) FOV - for (aiCamera *cam : cameras) { - // screen aspect could be missing - if (cam->mAspect) { - cam->mHorizontalFOV *= cam->mAspect; - } else { - ASSIMP_LOG_WARN("IRR: Camera aspect is not given, can't compute horizontal FOV"); - } - } - - batch.LoadAll(); - - /* Allocate a tempoary scene data structure - */ - aiScene *tempScene = new aiScene(); - tempScene->mRootNode = new aiNode(); - tempScene->mRootNode->mName.Set(""); - - /* Copy the cameras to the output array - */ - if (!cameras.empty()) { - tempScene->mNumCameras = (unsigned int)cameras.size(); - tempScene->mCameras = new aiCamera *[tempScene->mNumCameras]; - ::memcpy(tempScene->mCameras, &cameras[0], sizeof(void *) * tempScene->mNumCameras); - } - - /* Copy the light sources to the output array - */ - if (!lights.empty()) { - tempScene->mNumLights = (unsigned int)lights.size(); - tempScene->mLights = new aiLight *[tempScene->mNumLights]; - ::memcpy(tempScene->mLights, &lights[0], sizeof(void *) * tempScene->mNumLights); - } - - // temporary data - std::vector anims; - std::vector materials; - std::vector attach; - std::vector meshes; - - // try to guess how much storage we'll need - anims.reserve(guessedAnimCnt + (guessedAnimCnt >> 2)); - meshes.reserve(guessedMeshCnt + (guessedMeshCnt >> 2)); - materials.reserve(guessedMatCnt + (guessedMatCnt >> 2)); - - /* Now process our scenegraph recursively: generate final - * meshes and generate animation channels for all nodes. - */ - unsigned int defMatIdx = UINT_MAX; - GenerateGraph(root, tempScene->mRootNode, tempScene, - batch, meshes, anims, attach, materials, defMatIdx); - - if (!anims.empty()) { - tempScene->mNumAnimations = 1; - tempScene->mAnimations = new aiAnimation *[tempScene->mNumAnimations]; - aiAnimation *an = tempScene->mAnimations[0] = new aiAnimation(); - - // *********************************************************** - // This is only the global animation channel of the scene. - // If there are animated models, they will have separate - // animation channels in the scene. To display IRR scenes - // correctly, users will need to combine the global anim - // channel with all the local animations they want to play - // *********************************************************** - an->mName.Set("Irr_GlobalAnimChannel"); - - // copy all node animation channels to the global channel - an->mNumChannels = (unsigned int)anims.size(); - an->mChannels = new aiNodeAnim *[an->mNumChannels]; - ::memcpy(an->mChannels, &anims[0], sizeof(void *) * an->mNumChannels); - } - if (!meshes.empty()) { - // copy all meshes to the temporary scene - tempScene->mNumMeshes = (unsigned int)meshes.size(); - tempScene->mMeshes = new aiMesh *[tempScene->mNumMeshes]; - ::memcpy(tempScene->mMeshes, &meshes[0], tempScene->mNumMeshes * sizeof(void *)); - } - - /* Copy all materials to the output array - */ - if (!materials.empty()) { - tempScene->mNumMaterials = (unsigned int)materials.size(); - tempScene->mMaterials = new aiMaterial *[tempScene->mNumMaterials]; - ::memcpy(tempScene->mMaterials, &materials[0], sizeof(void *) * tempScene->mNumMaterials); - } - - /* Now merge all sub scenes and attach them to the correct - * attachment points in the scenegraph. - */ - SceneCombiner::MergeScenes(&pScene, tempScene, attach, - AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES | (!configSpeedFlag ? ( - AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES_IF_NECESSARY | AI_INT_MERGE_SCENE_GEN_UNIQUE_MATNAMES) : - 0)); - - /* If we have no meshes | no materials now set the INCOMPLETE - * scene flag. This is necessary if we failed to load all - * models from external files - */ - if (!pScene->mNumMeshes || !pScene->mNumMaterials) { - ASSIMP_LOG_WARN("IRR: No meshes loaded, setting AI_SCENE_FLAGS_INCOMPLETE"); - pScene->mFlags |= AI_SCENE_FLAGS_INCOMPLETE; - } - - /* Finished ... everything destructs automatically and all - * temporary scenes have already been deleted by MergeScenes() - */ - - delete root; - delete reader; ->>>>>>> master } #endif // !! ASSIMP_BUILD_NO_IRR_IMPORTER diff --git a/code/AssetLib/Irr/IRRMeshLoader.cpp b/code/AssetLib/Irr/IRRMeshLoader.cpp index 4c9fcd5d3..cb39802f3 100644 --- a/code/AssetLib/Irr/IRRMeshLoader.cpp +++ b/code/AssetLib/Irr/IRRMeshLoader.cpp @@ -129,7 +129,6 @@ static void releaseMesh(aiMesh **mesh) { // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -<<<<<<< HEAD void IRRMeshImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) { std::unique_ptr file(pIOHandler->Open(pFile)); @@ -511,407 +510,6 @@ void IRRMeshImporter::InternReadFile(const std::string &pFile, for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) { pScene->mRootNode->mMeshes[i] = i; } - -======= -void IRRMeshImporter::InternReadFile( const std::string& pFile, - aiScene* pScene, IOSystem* pIOHandler) -{ - std::unique_ptr file( pIOHandler->Open( pFile)); - - // Check whether we can read from the file - if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open IRRMESH file " + pFile + "."); - } - - // Construct the irrXML parser - CIrrXML_IOStreamReader st(file.get()); - reader = createIrrXMLReader((IFileReadCallBack*) &st); - - // final data - std::vector materials; - std::vector meshes; - materials.reserve (5); - meshes.reserve(5); - - // temporary data - current mesh buffer - aiMaterial* curMat = nullptr; - aiMesh* curMesh = nullptr; - unsigned int curMatFlags = 0; - - std::vector curVertices,curNormals,curTangents,curBitangents; - std::vector curColors; - std::vector curUVs,curUV2s; - - // some temporary variables - int textMeaning = 0; - int vertexFormat = 0; // 0 = normal; 1 = 2 tcoords, 2 = tangents - bool useColors = false; - - // Parse the XML file - while (reader->read()) { - switch (reader->getNodeType()) { - case EXN_ELEMENT: - - if (!ASSIMP_stricmp(reader->getNodeName(),"buffer") && (curMat || curMesh)) { - // end of previous buffer. A material and a mesh should be there - if ( !curMat || !curMesh) { - ASSIMP_LOG_ERROR("IRRMESH: A buffer must contain a mesh and a material"); - releaseMaterial( &curMat ); - releaseMesh( &curMesh ); - } else { - materials.push_back(curMat); - meshes.push_back(curMesh); - } - curMat = nullptr; - curMesh = nullptr; - - curVertices.clear(); - curColors.clear(); - curNormals.clear(); - curUV2s.clear(); - curUVs.clear(); - curTangents.clear(); - curBitangents.clear(); - } - - - if (!ASSIMP_stricmp(reader->getNodeName(),"material")) { - if (curMat) { - ASSIMP_LOG_WARN("IRRMESH: Only one material description per buffer, please"); - releaseMaterial( &curMat ); - } - curMat = ParseMaterial(curMatFlags); - } - /* no else here! */ if (!ASSIMP_stricmp(reader->getNodeName(),"vertices")) - { - int num = reader->getAttributeValueAsInt("vertexCount"); - - if (!num) { - // This is possible ... remove the mesh from the list and skip further reading - ASSIMP_LOG_WARN("IRRMESH: Found mesh with zero vertices"); - - releaseMaterial( &curMat ); - releaseMesh( &curMesh ); - textMeaning = 0; - continue; - } - - curVertices.reserve(num); - curNormals.reserve(num); - curColors.reserve(num); - curUVs.reserve(num); - - // Determine the file format - const char* t = reader->getAttributeValueSafe("type"); - if (!ASSIMP_stricmp("2tcoords", t)) { - curUV2s.reserve (num); - vertexFormat = 1; - - if (curMatFlags & AI_IRRMESH_EXTRA_2ND_TEXTURE) { - // ********************************************************* - // We have a second texture! So use this UV channel - // for it. The 2nd texture can be either a normal - // texture (solid_2layer or lightmap_xxx) or a normal - // map (normal_..., parallax_...) - // ********************************************************* - int idx = 1; - aiMaterial* mat = ( aiMaterial* ) curMat; - - if (curMatFlags & AI_IRRMESH_MAT_lightmap){ - mat->AddProperty(&idx,1,AI_MATKEY_UVWSRC_LIGHTMAP(0)); - } - else if (curMatFlags & AI_IRRMESH_MAT_normalmap_solid){ - mat->AddProperty(&idx,1,AI_MATKEY_UVWSRC_NORMALS(0)); - } - else if (curMatFlags & AI_IRRMESH_MAT_solid_2layer) { - mat->AddProperty(&idx,1,AI_MATKEY_UVWSRC_DIFFUSE(1)); - } - } - } - else if (!ASSIMP_stricmp("tangents", t)) { - curTangents.reserve (num); - curBitangents.reserve (num); - vertexFormat = 2; - } - else if (ASSIMP_stricmp("standard", t)) { - releaseMaterial( &curMat ); - ASSIMP_LOG_WARN("IRRMESH: Unknown vertex format"); - } - else vertexFormat = 0; - textMeaning = 1; - } - else if (!ASSIMP_stricmp(reader->getNodeName(),"indices")) { - if (curVertices.empty() && curMat) { - releaseMaterial( &curMat ); - throw DeadlyImportError("IRRMESH: indices must come after vertices"); - } - - textMeaning = 2; - - // start a new mesh - curMesh = new aiMesh(); - - // allocate storage for all faces - curMesh->mNumVertices = reader->getAttributeValueAsInt("indexCount"); - if (!curMesh->mNumVertices) { - // This is possible ... remove the mesh from the list and skip further reading - ASSIMP_LOG_WARN("IRRMESH: Found mesh with zero indices"); - - // mesh - away - releaseMesh( &curMesh ); - - // material - away - releaseMaterial( &curMat ); - - textMeaning = 0; - continue; - } - - if (curMesh->mNumVertices % 3) { - ASSIMP_LOG_WARN("IRRMESH: Number if indices isn't divisible by 3"); - } - - curMesh->mNumFaces = curMesh->mNumVertices / 3; - curMesh->mFaces = new aiFace[curMesh->mNumFaces]; - - // setup some members - curMesh->mMaterialIndex = (unsigned int)materials.size(); - curMesh->mPrimitiveTypes = aiPrimitiveType_TRIANGLE; - - // allocate storage for all vertices - curMesh->mVertices = new aiVector3D[curMesh->mNumVertices]; - - if (curNormals.size() == curVertices.size()) { - curMesh->mNormals = new aiVector3D[curMesh->mNumVertices]; - } - if (curTangents.size() == curVertices.size()) { - curMesh->mTangents = new aiVector3D[curMesh->mNumVertices]; - } - if (curBitangents.size() == curVertices.size()) { - curMesh->mBitangents = new aiVector3D[curMesh->mNumVertices]; - } - if (curColors.size() == curVertices.size() && useColors) { - curMesh->mColors[0] = new aiColor4D[curMesh->mNumVertices]; - } - if (curUVs.size() == curVertices.size()) { - curMesh->mTextureCoords[0] = new aiVector3D[curMesh->mNumVertices]; - } - if (curUV2s.size() == curVertices.size()) { - curMesh->mTextureCoords[1] = new aiVector3D[curMesh->mNumVertices]; - } - } - break; - - case EXN_TEXT: - { - const char* sz = reader->getNodeData(); - if (textMeaning == 1) { - textMeaning = 0; - - // read vertices - do { - SkipSpacesAndLineEnd(&sz); - aiVector3D temp;aiColor4D c; - - // Read the vertex position - sz = fast_atoreal_move(sz,(float&)temp.x); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.y); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.z); - SkipSpaces(&sz); - curVertices.push_back(temp); - - // Read the vertex normals - sz = fast_atoreal_move(sz,(float&)temp.x); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.y); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.z); - SkipSpaces(&sz); - curNormals.push_back(temp); - - // read the vertex colors - uint32_t clr = strtoul16(sz,&sz); - ColorFromARGBPacked(clr,c); - - if (!curColors.empty() && c != *(curColors.end()-1)) - useColors = true; - - curColors.push_back(c); - SkipSpaces(&sz); - - - // read the first UV coordinate set - sz = fast_atoreal_move(sz,(float&)temp.x); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.y); - SkipSpaces(&sz); - temp.z = 0.f; - temp.y = 1.f - temp.y; // DX to OGL - curUVs.push_back(temp); - - // read the (optional) second UV coordinate set - if (vertexFormat == 1) { - sz = fast_atoreal_move(sz,(float&)temp.x); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.y); - temp.y = 1.f - temp.y; // DX to OGL - curUV2s.push_back(temp); - } - // read optional tangent and bitangent vectors - else if (vertexFormat == 2) { - // tangents - sz = fast_atoreal_move(sz,(float&)temp.x); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.z); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.y); - SkipSpaces(&sz); - temp.y *= -1.0f; - curTangents.push_back(temp); - - // bitangents - sz = fast_atoreal_move(sz,(float&)temp.x); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.z); - SkipSpaces(&sz); - - sz = fast_atoreal_move(sz,(float&)temp.y); - SkipSpaces(&sz); - temp.y *= -1.0f; - curBitangents.push_back(temp); - } - } - - /* IMPORTANT: We assume that each vertex is specified in one - line. So we can skip the rest of the line - unknown vertex - elements are ignored. - */ - - while (SkipLine(&sz)); - } - else if (textMeaning == 2) { - textMeaning = 0; - - // read indices - aiFace* curFace = curMesh->mFaces; - aiFace* const faceEnd = curMesh->mFaces + curMesh->mNumFaces; - - aiVector3D* pcV = curMesh->mVertices; - aiVector3D* pcN = curMesh->mNormals; - aiVector3D* pcT = curMesh->mTangents; - aiVector3D* pcB = curMesh->mBitangents; - aiColor4D* pcC0 = curMesh->mColors[0]; - aiVector3D* pcT0 = curMesh->mTextureCoords[0]; - aiVector3D* pcT1 = curMesh->mTextureCoords[1]; - - unsigned int curIdx = 0; - unsigned int total = 0; - while(SkipSpacesAndLineEnd(&sz)) { - if (curFace >= faceEnd) { - ASSIMP_LOG_ERROR("IRRMESH: Too many indices"); - break; - } - if (!curIdx) { - curFace->mNumIndices = 3; - curFace->mIndices = new unsigned int[3]; - } - - unsigned int idx = strtoul10(sz,&sz); - if (idx >= curVertices.size()) { - ASSIMP_LOG_ERROR("IRRMESH: Index out of range"); - idx = 0; - } - - curFace->mIndices[curIdx] = total++; - - *pcV++ = curVertices[idx]; - if (pcN)*pcN++ = curNormals[idx]; - if (pcT)*pcT++ = curTangents[idx]; - if (pcB)*pcB++ = curBitangents[idx]; - if (pcC0)*pcC0++ = curColors[idx]; - if (pcT0)*pcT0++ = curUVs[idx]; - if (pcT1)*pcT1++ = curUV2s[idx]; - - if (++curIdx == 3) { - ++curFace; - curIdx = 0; - } - } - - if (curFace != faceEnd) - ASSIMP_LOG_ERROR("IRRMESH: Not enough indices"); - - // Finish processing the mesh - do some small material workarounds - if (curMatFlags & AI_IRRMESH_MAT_trans_vertex_alpha && !useColors) { - // Take the opacity value of the current material - // from the common vertex color alpha - aiMaterial* mat = (aiMaterial*)curMat; - mat->AddProperty(&curColors[0].a,1,AI_MATKEY_OPACITY); - } - }} - break; - - default: - // GCC complains here ... - break; - - }; - } - - // End of the last buffer. A material and a mesh should be there - if (curMat || curMesh) { - if ( !curMat || !curMesh) { - ASSIMP_LOG_ERROR("IRRMESH: A buffer must contain a mesh and a material"); - releaseMaterial( &curMat ); - releaseMesh( &curMesh ); - } - else { - materials.push_back(curMat); - meshes.push_back(curMesh); - } - } - - if (materials.empty()) - throw DeadlyImportError("IRRMESH: Unable to read a mesh from this file"); - - - // now generate the output scene - pScene->mNumMeshes = (unsigned int)meshes.size(); - pScene->mMeshes = new aiMesh*[pScene->mNumMeshes]; - for (unsigned int i = 0; i < pScene->mNumMeshes;++i) { - pScene->mMeshes[i] = meshes[i]; - - // clean this value ... - pScene->mMeshes[i]->mNumUVComponents[3] = 0; - } - - pScene->mNumMaterials = (unsigned int)materials.size(); - pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials]; - ::memcpy(pScene->mMaterials,&materials[0],sizeof(void*)*pScene->mNumMaterials); - - pScene->mRootNode = new aiNode(); - pScene->mRootNode->mName.Set(""); - pScene->mRootNode->mNumMeshes = pScene->mNumMeshes; - pScene->mRootNode->mMeshes = new unsigned int[pScene->mNumMeshes]; - - for (unsigned int i = 0; i < pScene->mNumMeshes;++i) - pScene->mRootNode->mMeshes[i] = i; - - // clean up and return - delete reader; - AI_DEBUG_INVALIDATE_PTR(reader); ->>>>>>> master } #endif // !! ASSIMP_BUILD_NO_IRRMESH_IMPORTER diff --git a/code/AssetLib/XGL/XGLLoader.h b/code/AssetLib/XGL/XGLLoader.h index ac7d83482..17fc658fc 100644 --- a/code/AssetLib/XGL/XGLLoader.h +++ b/code/AssetLib/XGL/XGLLoader.h @@ -47,22 +47,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_XGLLOADER_H_INCLUDED #include -<<<<<<< HEAD #include -======= ->>>>>>> master #include #include #include #include #include -<<<<<<< HEAD #include - -#include -======= #include ->>>>>>> master + #include #include