vrshoot

annotate 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
rev   line source
nuclear@0 1 /*
nuclear@0 2 ---------------------------------------------------------------------------
nuclear@0 3 Open Asset Import Library (assimp)
nuclear@0 4 ---------------------------------------------------------------------------
nuclear@0 5
nuclear@0 6 Copyright (c) 2006-2012, assimp team
nuclear@0 7
nuclear@0 8 All rights reserved.
nuclear@0 9
nuclear@0 10 Redistribution and use of this software in source and binary forms,
nuclear@0 11 with or without modification, are permitted provided that the following
nuclear@0 12 conditions are met:
nuclear@0 13
nuclear@0 14 * Redistributions of source code must retain the above
nuclear@0 15 copyright notice, this list of conditions and the
nuclear@0 16 following disclaimer.
nuclear@0 17
nuclear@0 18 * Redistributions in binary form must reproduce the above
nuclear@0 19 copyright notice, this list of conditions and the
nuclear@0 20 following disclaimer in the documentation and/or other
nuclear@0 21 materials provided with the distribution.
nuclear@0 22
nuclear@0 23 * Neither the name of the assimp team, nor the names of its
nuclear@0 24 contributors may be used to endorse or promote products
nuclear@0 25 derived from this software without specific prior
nuclear@0 26 written permission of the assimp team.
nuclear@0 27
nuclear@0 28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
nuclear@0 29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
nuclear@0 30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
nuclear@0 31 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
nuclear@0 32 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
nuclear@0 33 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
nuclear@0 34 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
nuclear@0 35 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
nuclear@0 36 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
nuclear@0 37 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nuclear@0 38 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nuclear@0 39 ---------------------------------------------------------------------------
nuclear@0 40 */
nuclear@0 41
nuclear@0 42 /** @file Implementation of the post processing step to generate face
nuclear@0 43 * normals for all imported faces.
nuclear@0 44 */
nuclear@0 45
nuclear@0 46 #include "AssimpPCH.h"
nuclear@0 47 #include "GenFaceNormalsProcess.h"
nuclear@0 48
nuclear@0 49
nuclear@0 50 using namespace Assimp;
nuclear@0 51
nuclear@0 52 // ------------------------------------------------------------------------------------------------
nuclear@0 53 // Constructor to be privately used by Importer
nuclear@0 54 GenFaceNormalsProcess::GenFaceNormalsProcess()
nuclear@0 55 {
nuclear@0 56 // nothing to do here
nuclear@0 57 }
nuclear@0 58
nuclear@0 59 // ------------------------------------------------------------------------------------------------
nuclear@0 60 // Destructor, private as well
nuclear@0 61 GenFaceNormalsProcess::~GenFaceNormalsProcess()
nuclear@0 62 {
nuclear@0 63 // nothing to do here
nuclear@0 64 }
nuclear@0 65
nuclear@0 66 // ------------------------------------------------------------------------------------------------
nuclear@0 67 // Returns whether the processing step is present in the given flag field.
nuclear@0 68 bool GenFaceNormalsProcess::IsActive( unsigned int pFlags) const
nuclear@0 69 {
nuclear@0 70 return (pFlags & aiProcess_GenNormals) != 0;
nuclear@0 71 }
nuclear@0 72
nuclear@0 73 // ------------------------------------------------------------------------------------------------
nuclear@0 74 // Executes the post processing step on the given imported data.
nuclear@0 75 void GenFaceNormalsProcess::Execute( aiScene* pScene)
nuclear@0 76 {
nuclear@0 77 DefaultLogger::get()->debug("GenFaceNormalsProcess begin");
nuclear@0 78
nuclear@0 79 if (pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) {
nuclear@0 80 throw DeadlyImportError("Post-processing order mismatch: expecting pseudo-indexed (\"verbose\") vertices here");
nuclear@0 81 }
nuclear@0 82
nuclear@0 83 bool bHas = false;
nuclear@0 84 for( unsigned int a = 0; a < pScene->mNumMeshes; a++) {
nuclear@0 85 if(this->GenMeshFaceNormals( pScene->mMeshes[a])) {
nuclear@0 86 bHas = true;
nuclear@0 87 }
nuclear@0 88 }
nuclear@0 89 if (bHas) {
nuclear@0 90 DefaultLogger::get()->info("GenFaceNormalsProcess finished. "
nuclear@0 91 "Face normals have been calculated");
nuclear@0 92 }
nuclear@0 93 else DefaultLogger::get()->debug("GenFaceNormalsProcess finished. "
nuclear@0 94 "Normals are already there");
nuclear@0 95 }
nuclear@0 96
nuclear@0 97 // ------------------------------------------------------------------------------------------------
nuclear@0 98 // Executes the post processing step on the given imported data.
nuclear@0 99 bool GenFaceNormalsProcess::GenMeshFaceNormals (aiMesh* pMesh)
nuclear@0 100 {
nuclear@0 101 if (NULL != pMesh->mNormals) {
nuclear@0 102 return false;
nuclear@0 103 }
nuclear@0 104
nuclear@0 105 // If the mesh consists of lines and/or points but not of
nuclear@0 106 // triangles or higher-order polygons the normal vectors
nuclear@0 107 // are undefined.
nuclear@0 108 if (!(pMesh->mPrimitiveTypes & (aiPrimitiveType_TRIANGLE | aiPrimitiveType_POLYGON))) {
nuclear@0 109 DefaultLogger::get()->info("Normal vectors are undefined for line and point meshes");
nuclear@0 110 return false;
nuclear@0 111 }
nuclear@0 112
nuclear@0 113 // allocate an array to hold the output normals
nuclear@0 114 pMesh->mNormals = new aiVector3D[pMesh->mNumVertices];
nuclear@0 115 const float qnan = get_qnan();
nuclear@0 116
nuclear@0 117 // iterate through all faces and compute per-face normals but store them per-vertex.
nuclear@0 118 for( unsigned int a = 0; a < pMesh->mNumFaces; a++) {
nuclear@0 119 const aiFace& face = pMesh->mFaces[a];
nuclear@0 120 if (face.mNumIndices < 3) {
nuclear@0 121 // either a point or a line -> no well-defined normal vector
nuclear@0 122 for (unsigned int i = 0;i < face.mNumIndices;++i) {
nuclear@0 123 pMesh->mNormals[face.mIndices[i]] = aiVector3D(qnan);
nuclear@0 124 }
nuclear@0 125 continue;
nuclear@0 126 }
nuclear@0 127
nuclear@0 128 const aiVector3D* pV1 = &pMesh->mVertices[face.mIndices[0]];
nuclear@0 129 const aiVector3D* pV2 = &pMesh->mVertices[face.mIndices[1]];
nuclear@0 130 const aiVector3D* pV3 = &pMesh->mVertices[face.mIndices[face.mNumIndices-1]];
nuclear@0 131 const aiVector3D vNor = ((*pV2 - *pV1) ^ (*pV3 - *pV1)).Normalize();
nuclear@0 132
nuclear@0 133 for (unsigned int i = 0;i < face.mNumIndices;++i) {
nuclear@0 134 pMesh->mNormals[face.mIndices[i]] = vNor;
nuclear@0 135 }
nuclear@0 136 }
nuclear@0 137 return true;
nuclear@0 138 }