/*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 thefollowing conditions 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.----------------------------------------------------------------------*/#include "ScenePreprocessor.h"#include <assimp/ai_assert.h>#include <assimp/scene.h>#include <assimp/DefaultLogger.hpp>using namespace Assimp;// ---------------------------------------------------------------------------------------------void ScenePreprocessor::ProcessScene() {ai_assert(scene != nullptr);// Process all meshesfor (unsigned int i = 0; i < scene->mNumMeshes; ++i) {if (nullptr == scene->mMeshes[i]) {continue;}ProcessMesh(scene->mMeshes[i]);}// - nothing to do for nodes for the moment// - nothing to do for textures for the moment// - nothing to do for lights for the moment// - nothing to do for cameras for the moment// Process all animationsfor (unsigned int i = 0; i < scene->mNumAnimations; ++i) {if (nullptr == scene->mAnimations[i]) {continue;}ProcessAnimation(scene->mAnimations[i]);}// Generate a default material if none was specifiedif (!scene->mNumMaterials && scene->mNumMeshes) {scene->mMaterials = new aiMaterial *[2];aiMaterial *helper;aiString name;scene->mMaterials[scene->mNumMaterials] = helper = new aiMaterial();aiColor3D clr(0.6f, 0.6f, 0.6f);helper->AddProperty(&clr, 1, AI_MATKEY_COLOR_DIFFUSE);// setup the default name to make this material identifiablename.Set(AI_DEFAULT_MATERIAL_NAME);helper->AddProperty(&name, AI_MATKEY_NAME);ASSIMP_LOG_DEBUG("ScenePreprocessor: Adding default material \'" AI_DEFAULT_MATERIAL_NAME "\'");for (unsigned int i = 0; i < scene->mNumMeshes; ++i) {if (nullptr == scene->mMeshes[i]) {continue;}scene->mMeshes[i]->mMaterialIndex = scene->mNumMaterials;}scene->mNumMaterials++;}}// ---------------------------------------------------------------------------------------------void ScenePreprocessor::ProcessMesh(aiMesh *mesh) {// If aiMesh::mNumUVComponents is *not* set assign the default value of 2for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++i) {if (!mesh->mTextureCoords[i]) {mesh->mNumUVComponents[i] = 0;continue;}if (!mesh->mNumUVComponents[i]) {mesh->mNumUVComponents[i] = 2;}aiVector3D *p = mesh->mTextureCoords[i], *end = p + mesh->mNumVertices;// Ensure unused components are zeroed. This will make 1D texture channels work// as if they were 2D channels .. just in case an application doesn't handle// this caseif (2 == mesh->mNumUVComponents[i]) {for (; p != end; ++p) {p->z = 0.f;}} else if (1 == mesh->mNumUVComponents[i]) {for (; p != end; ++p) {p->z = p->y = 0.f;}} else if (3 == mesh->mNumUVComponents[i]) {// Really 3D coordinates? Check whether the third coordinate is != 0 for at least one elementfor (; p != end; ++p) {if (p->z != 0) {break;}}if (p == end) {ASSIMP_LOG_WARN("ScenePreprocessor: UVs are declared to be 3D but they're obviously not. Reverting to 2D.");mesh->mNumUVComponents[i] = 2;}}}// If the information which primitive types are there in the// mesh is currently not available, compute it.if (!mesh->mPrimitiveTypes) {for (unsigned int a = 0; a < mesh->mNumFaces; ++a) {aiFace &face = mesh->mFaces[a];switch (face.mNumIndices) {case 3u:mesh->mPrimitiveTypes |= aiPrimitiveType_TRIANGLE;break;case 2u:mesh->mPrimitiveTypes |= aiPrimitiveType_LINE;break;case 1u:mesh->mPrimitiveTypes |= aiPrimitiveType_POINT;break;default:mesh->mPrimitiveTypes |= aiPrimitiveType_POLYGON;break;}}}// If tangents and normals are given but no bitangents compute themif (mesh->mTangents && mesh->mNormals && !mesh->mBitangents) {mesh->mBitangents = new aiVector3D[mesh->mNumVertices];for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {mesh->mBitangents[i] = mesh->mNormals[i] ^ mesh->mTangents[i];}}}// ---------------------------------------------------------------------------------------------void ScenePreprocessor::ProcessAnimation(aiAnimation *anim) {double first = 10e10, last = -10e10;for (unsigned int i = 0; i < anim->mNumChannels; ++i) {aiNodeAnim *channel = anim->mChannels[i];// If the exact duration of the animation is not given// compute it now.if (anim->mDuration == -1.) {// Position keysfor (unsigned int j = 0; j < channel->mNumPositionKeys; ++j) {aiVectorKey &key = channel->mPositionKeys[j];first = std::min(first, key.mTime);last = std::max(last, key.mTime);}// Scaling keysfor (unsigned int j = 0; j < channel->mNumScalingKeys; ++j) {aiVectorKey &key = channel->mScalingKeys[j];first = std::min(first, key.mTime);last = std::max(last, key.mTime);}// Rotation keysfor (unsigned int j = 0; j < channel->mNumRotationKeys; ++j) {aiQuatKey &key = channel->mRotationKeys[j];first = std::min(first, key.mTime);last = std::max(last, key.mTime);}}// Check whether the animation channel has no rotation// or position tracks. In this case we generate a dummy// track from the information we have in the transformation// matrix of the corresponding node.if (!channel->mNumRotationKeys || !channel->mNumPositionKeys || !channel->mNumScalingKeys) {// Find the node that belongs to this animationaiNode *node = scene->mRootNode->FindNode(channel->mNodeName);if (node) // ValidateDS will complain later if 'node' is nullptr{// Decompose the transformation matrix of the nodeaiVector3D scaling, position;aiQuaternion rotation;node->mTransformation.Decompose(scaling, rotation, position);// No rotation keys? Generate a dummy trackif (!channel->mNumRotationKeys) {if (channel->mRotationKeys) {delete[] channel->mRotationKeys;channel->mRotationKeys = nullptr;}ai_assert(!channel->mRotationKeys);channel->mNumRotationKeys = 1;channel->mRotationKeys = new aiQuatKey[1];aiQuatKey &q = channel->mRotationKeys[0];q.mTime = 0.;q.mValue = rotation;ASSIMP_LOG_VERBOSE_DEBUG("ScenePreprocessor: Dummy rotation track has been generated");} else {ai_assert(channel->mRotationKeys);}// No scaling keys? Generate a dummy trackif (!channel->mNumScalingKeys) {if (channel->mScalingKeys) {delete[] channel->mScalingKeys;channel->mScalingKeys = nullptr;}ai_assert(!channel->mScalingKeys);channel->mNumScalingKeys = 1;channel->mScalingKeys = new aiVectorKey[1];aiVectorKey &q = channel->mScalingKeys[0];q.mTime = 0.;q.mValue = scaling;ASSIMP_LOG_VERBOSE_DEBUG("ScenePreprocessor: Dummy scaling track has been generated");} else {ai_assert(channel->mScalingKeys);}// No position keys? Generate a dummy trackif (!channel->mNumPositionKeys) {if (channel->mPositionKeys) {delete[] channel->mPositionKeys;channel->mPositionKeys = nullptr;}ai_assert(!channel->mPositionKeys);channel->mNumPositionKeys = 1;channel->mPositionKeys = new aiVectorKey[1];aiVectorKey &q = channel->mPositionKeys[0];q.mTime = 0.;q.mValue = position;ASSIMP_LOG_VERBOSE_DEBUG("ScenePreprocessor: Dummy position track has been generated");} else {ai_assert(channel->mPositionKeys);}}}}if (anim->mDuration == -1.) {ASSIMP_LOG_VERBOSE_DEBUG("ScenePreprocessor: Setting animation duration");anim->mDuration = last - std::min(first, 0.);}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。