vrshoot
diff libs/assimp/GenFaceNormalsProcess.cpp @ 0:b2f14e535253
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 01 Feb 2014 19:58:19 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libs/assimp/GenFaceNormalsProcess.cpp Sat Feb 01 19:58:19 2014 +0200 1.3 @@ -0,0 +1,138 @@ 1.4 +/* 1.5 +--------------------------------------------------------------------------- 1.6 +Open Asset Import Library (assimp) 1.7 +--------------------------------------------------------------------------- 1.8 + 1.9 +Copyright (c) 2006-2012, assimp team 1.10 + 1.11 +All rights reserved. 1.12 + 1.13 +Redistribution and use of this software in source and binary forms, 1.14 +with or without modification, are permitted provided that the following 1.15 +conditions are met: 1.16 + 1.17 +* Redistributions of source code must retain the above 1.18 + copyright notice, this list of conditions and the 1.19 + following disclaimer. 1.20 + 1.21 +* Redistributions in binary form must reproduce the above 1.22 + copyright notice, this list of conditions and the 1.23 + following disclaimer in the documentation and/or other 1.24 + materials provided with the distribution. 1.25 + 1.26 +* Neither the name of the assimp team, nor the names of its 1.27 + contributors may be used to endorse or promote products 1.28 + derived from this software without specific prior 1.29 + written permission of the assimp team. 1.30 + 1.31 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1.32 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1.33 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1.34 +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1.35 +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1.36 +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1.37 +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1.38 +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1.39 +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1.40 +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1.41 +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.42 +--------------------------------------------------------------------------- 1.43 +*/ 1.44 + 1.45 +/** @file Implementation of the post processing step to generate face 1.46 +* normals for all imported faces. 1.47 +*/ 1.48 + 1.49 +#include "AssimpPCH.h" 1.50 +#include "GenFaceNormalsProcess.h" 1.51 + 1.52 + 1.53 +using namespace Assimp; 1.54 + 1.55 +// ------------------------------------------------------------------------------------------------ 1.56 +// Constructor to be privately used by Importer 1.57 +GenFaceNormalsProcess::GenFaceNormalsProcess() 1.58 +{ 1.59 + // nothing to do here 1.60 +} 1.61 + 1.62 +// ------------------------------------------------------------------------------------------------ 1.63 +// Destructor, private as well 1.64 +GenFaceNormalsProcess::~GenFaceNormalsProcess() 1.65 +{ 1.66 + // nothing to do here 1.67 +} 1.68 + 1.69 +// ------------------------------------------------------------------------------------------------ 1.70 +// Returns whether the processing step is present in the given flag field. 1.71 +bool GenFaceNormalsProcess::IsActive( unsigned int pFlags) const 1.72 +{ 1.73 + return (pFlags & aiProcess_GenNormals) != 0; 1.74 +} 1.75 + 1.76 +// ------------------------------------------------------------------------------------------------ 1.77 +// Executes the post processing step on the given imported data. 1.78 +void GenFaceNormalsProcess::Execute( aiScene* pScene) 1.79 +{ 1.80 + DefaultLogger::get()->debug("GenFaceNormalsProcess begin"); 1.81 + 1.82 + if (pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) { 1.83 + throw DeadlyImportError("Post-processing order mismatch: expecting pseudo-indexed (\"verbose\") vertices here"); 1.84 + } 1.85 + 1.86 + bool bHas = false; 1.87 + for( unsigned int a = 0; a < pScene->mNumMeshes; a++) { 1.88 + if(this->GenMeshFaceNormals( pScene->mMeshes[a])) { 1.89 + bHas = true; 1.90 + } 1.91 + } 1.92 + if (bHas) { 1.93 + DefaultLogger::get()->info("GenFaceNormalsProcess finished. " 1.94 + "Face normals have been calculated"); 1.95 + } 1.96 + else DefaultLogger::get()->debug("GenFaceNormalsProcess finished. " 1.97 + "Normals are already there"); 1.98 +} 1.99 + 1.100 +// ------------------------------------------------------------------------------------------------ 1.101 +// Executes the post processing step on the given imported data. 1.102 +bool GenFaceNormalsProcess::GenMeshFaceNormals (aiMesh* pMesh) 1.103 +{ 1.104 + if (NULL != pMesh->mNormals) { 1.105 + return false; 1.106 + } 1.107 + 1.108 + // If the mesh consists of lines and/or points but not of 1.109 + // triangles or higher-order polygons the normal vectors 1.110 + // are undefined. 1.111 + if (!(pMesh->mPrimitiveTypes & (aiPrimitiveType_TRIANGLE | aiPrimitiveType_POLYGON))) { 1.112 + DefaultLogger::get()->info("Normal vectors are undefined for line and point meshes"); 1.113 + return false; 1.114 + } 1.115 + 1.116 + // allocate an array to hold the output normals 1.117 + pMesh->mNormals = new aiVector3D[pMesh->mNumVertices]; 1.118 + const float qnan = get_qnan(); 1.119 + 1.120 + // iterate through all faces and compute per-face normals but store them per-vertex. 1.121 + for( unsigned int a = 0; a < pMesh->mNumFaces; a++) { 1.122 + const aiFace& face = pMesh->mFaces[a]; 1.123 + if (face.mNumIndices < 3) { 1.124 + // either a point or a line -> no well-defined normal vector 1.125 + for (unsigned int i = 0;i < face.mNumIndices;++i) { 1.126 + pMesh->mNormals[face.mIndices[i]] = aiVector3D(qnan); 1.127 + } 1.128 + continue; 1.129 + } 1.130 + 1.131 + const aiVector3D* pV1 = &pMesh->mVertices[face.mIndices[0]]; 1.132 + const aiVector3D* pV2 = &pMesh->mVertices[face.mIndices[1]]; 1.133 + const aiVector3D* pV3 = &pMesh->mVertices[face.mIndices[face.mNumIndices-1]]; 1.134 + const aiVector3D vNor = ((*pV2 - *pV1) ^ (*pV3 - *pV1)).Normalize(); 1.135 + 1.136 + for (unsigned int i = 0;i < face.mNumIndices;++i) { 1.137 + pMesh->mNormals[face.mIndices[i]] = vNor; 1.138 + } 1.139 + } 1.140 + return true; 1.141 +}