/*---------------------------------------------------------------------------Open Asset Import Library (assimp)---------------------------------------------------------------------------Copyright (c) 2006-2022, assimp teamAll rights reserved.Redistribution and use of this software in source and binary forms,with or without modification, are permitted provided that the followingconditions are met:* Redistributions of source code must retain the abovecopyright notice, this list of conditions and thefollowing disclaimer.* Redistributions in binary form must reproduce the abovecopyright notice, this list of conditions and thefollowing disclaimer in the documentation and/or othermaterials provided with the distribution.* Neither the name of the assimp team, nor the names of itscontributors may be used to endorse or promote productsderived from this software without specific priorwritten permission of the assimp team.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOTLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FORA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHTOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOTLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANYTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USEOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.---------------------------------------------------------------------------*//** @file Implementation of the post processing step to remove* any parts of the mesh structure from the imported data.*/#include "RemoveVCProcess.h"#include <assimp/postprocess.h>#include <assimp/scene.h>#include <assimp/DefaultLogger.hpp>using namespace Assimp;// ------------------------------------------------------------------------------------------------// Constructor to be privately used by ImporterRemoveVCProcess::RemoveVCProcess() :configDeleteFlags(), mScene() {}// ------------------------------------------------------------------------------------------------// Destructor, private as wellRemoveVCProcess::~RemoveVCProcess() = default;// ------------------------------------------------------------------------------------------------// Returns whether the processing step is present in the given flag field.bool RemoveVCProcess::IsActive(unsigned int pFlags) const {return (pFlags & aiProcess_RemoveComponent) != 0;}// ------------------------------------------------------------------------------------------------// Small helper function to delete all elements in a T** array using deletetemplate <typename T>inline void ArrayDelete(T **&in, unsigned int &num) {for (unsigned int i = 0; i < num; ++i)delete in[i];delete[] in;in = nullptr;num = 0;}#if 0// ------------------------------------------------------------------------------------------------// Updates the node graph - removes all nodes which have the "remove" flag set and the// "don't remove" flag not set. Nodes with meshes are never deleted.bool UpdateNodeGraph(aiNode* node,std::list<aiNode*>& childsOfParent,bool root){bool b = false;std::list<aiNode*> mine;for (unsigned int i = 0; i < node->mNumChildren;++i){if(UpdateNodeGraph(node->mChildren[i],mine,false))b = true;}// somewhat tricky ... mNumMeshes must be originally 0 and MSB2 may not be set,// so we can do a simple comparison against MSB hereif (!root && AI_RC_UINT_MSB == node->mNumMeshes ){// this node needs to be removedif(node->mNumChildren){childsOfParent.insert(childsOfParent.end(),mine.begin(),mine.end());// set all children to nullptr to make sure they are not deleted when we delete ourselffor (unsigned int i = 0; i < node->mNumChildren;++i)node->mChildren[i] = nullptr;}b = true;delete node;}else{AI_RC_UNMASK(node->mNumMeshes);childsOfParent.push_back(node);if (b){// reallocate the array of our children herenode->mNumChildren = (unsigned int)mine.size();aiNode** const children = new aiNode*[mine.size()];aiNode** ptr = children;for (std::list<aiNode*>::iterator it = mine.begin(), end = mine.end();it != end; ++it){*ptr++ = *it;}delete[] node->mChildren;node->mChildren = children;return false;}}return b;}#endif// ------------------------------------------------------------------------------------------------// Executes the post processing step on the given imported data.void RemoveVCProcess::Execute(aiScene *pScene) {ASSIMP_LOG_DEBUG("RemoveVCProcess begin");bool bHas = false; //,bMasked = false;mScene = pScene;// handle animationsif (configDeleteFlags & aiComponent_ANIMATIONS) {bHas = true;ArrayDelete(pScene->mAnimations, pScene->mNumAnimations);}// handle texturesif (configDeleteFlags & aiComponent_TEXTURES) {bHas = true;ArrayDelete(pScene->mTextures, pScene->mNumTextures);}// handle materialsif (configDeleteFlags & aiComponent_MATERIALS && pScene->mNumMaterials) {bHas = true;for (unsigned int i = 1; i < pScene->mNumMaterials; ++i)delete pScene->mMaterials[i];pScene->mNumMaterials = 1;aiMaterial *helper = (aiMaterial *)pScene->mMaterials[0];ai_assert(nullptr != helper);helper->Clear();// grayaiColor3D clr(0.6f, 0.6f, 0.6f);helper->AddProperty(&clr, 1, AI_MATKEY_COLOR_DIFFUSE);// add a small ambient color valueclr = aiColor3D(0.05f, 0.05f, 0.05f);helper->AddProperty(&clr, 1, AI_MATKEY_COLOR_AMBIENT);aiString s;s.Set("Dummy_MaterialsRemoved");helper->AddProperty(&s, AI_MATKEY_NAME);}// handle light sourcesif (configDeleteFlags & aiComponent_LIGHTS) {bHas = true;ArrayDelete(pScene->mLights, pScene->mNumLights);}// handle camnerasif (configDeleteFlags & aiComponent_CAMERAS) {bHas = true;ArrayDelete(pScene->mCameras, pScene->mNumCameras);}// handle meshesif (configDeleteFlags & aiComponent_MESHES) {bHas = true;ArrayDelete(pScene->mMeshes, pScene->mNumMeshes);} else {for (unsigned int a = 0; a < pScene->mNumMeshes; a++) {if (ProcessMesh(pScene->mMeshes[a]))bHas = true;}}// now check whether the result is still a full sceneif (!pScene->mNumMeshes || !pScene->mNumMaterials) {pScene->mFlags |= AI_SCENE_FLAGS_INCOMPLETE;ASSIMP_LOG_DEBUG("Setting AI_SCENE_FLAGS_INCOMPLETE flag");// If we have no meshes anymore we should also clear another flag ...if (!pScene->mNumMeshes)pScene->mFlags &= ~AI_SCENE_FLAGS_NON_VERBOSE_FORMAT;}if (bHas) {ASSIMP_LOG_INFO("RemoveVCProcess finished. Data structure cleanup has been done.");} else {ASSIMP_LOG_DEBUG("RemoveVCProcess finished. Nothing to be done ...");}}// ------------------------------------------------------------------------------------------------// Setup configuration properties for the stepvoid RemoveVCProcess::SetupProperties(const Importer *pImp) {configDeleteFlags = pImp->GetPropertyInteger(AI_CONFIG_PP_RVC_FLAGS, 0x0);if (!configDeleteFlags) {ASSIMP_LOG_WARN("RemoveVCProcess: AI_CONFIG_PP_RVC_FLAGS is zero.");}}// ------------------------------------------------------------------------------------------------// Executes the post processing step on the given imported data.bool RemoveVCProcess::ProcessMesh(aiMesh *pMesh) {bool ret = false;// if all materials have been deleted let the material// index of the mesh point to the created default materialif (configDeleteFlags & aiComponent_MATERIALS)pMesh->mMaterialIndex = 0;// handle normalsif (configDeleteFlags & aiComponent_NORMALS && pMesh->mNormals) {delete[] pMesh->mNormals;pMesh->mNormals = nullptr;ret = true;}// handle tangents and bitangentsif (configDeleteFlags & aiComponent_TANGENTS_AND_BITANGENTS && pMesh->mTangents) {delete[] pMesh->mTangents;pMesh->mTangents = nullptr;delete[] pMesh->mBitangents;pMesh->mBitangents = nullptr;ret = true;}// handle texture coordinatesbool b = (0 != (configDeleteFlags & aiComponent_TEXCOORDS));for (unsigned int i = 0, real = 0; real < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++real) {if (!pMesh->mTextureCoords[i]) break;if (configDeleteFlags & aiComponent_TEXCOORDSn(real) || b) {delete[] pMesh->mTextureCoords[i];pMesh->mTextureCoords[i] = nullptr;ret = true;if (!b) {// collapse the rest of the arrayfor (unsigned int a = i + 1; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a)pMesh->mTextureCoords[a - 1] = pMesh->mTextureCoords[a];pMesh->mTextureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS - 1] = nullptr;continue;}}++i;}// handle vertex colorsb = (0 != (configDeleteFlags & aiComponent_COLORS));for (unsigned int i = 0, real = 0; real < AI_MAX_NUMBER_OF_COLOR_SETS; ++real) {if (!pMesh->mColors[i]) break;if (configDeleteFlags & aiComponent_COLORSn(i) || b) {delete[] pMesh->mColors[i];pMesh->mColors[i] = nullptr;ret = true;if (!b) {// collapse the rest of the arrayfor (unsigned int a = i + 1; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a)pMesh->mColors[a - 1] = pMesh->mColors[a];pMesh->mColors[AI_MAX_NUMBER_OF_COLOR_SETS - 1] = nullptr;continue;}}++i;}// handle bonesif (configDeleteFlags & aiComponent_BONEWEIGHTS && pMesh->mBones) {ArrayDelete(pMesh->mBones, pMesh->mNumBones);ret = true;}return ret;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。