nuclear@0: /* nuclear@0: Open Asset Import Library (assimp) nuclear@0: ---------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2012, assimp team nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the nuclear@0: following conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: nuclear@0: ---------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: /** @file MakeLeftHandedProcess.h nuclear@0: * @brief Defines a bunch of post-processing steps to handle nuclear@0: * coordinate system conversions. nuclear@0: * nuclear@0: * - LH to RH nuclear@0: * - UV origin upper-left to lower-left nuclear@0: * - face order cw to ccw nuclear@0: */ nuclear@0: #ifndef AI_CONVERTTOLHPROCESS_H_INC nuclear@0: #define AI_CONVERTTOLHPROCESS_H_INC nuclear@0: nuclear@0: #include "assimp/types.h" nuclear@0: #include "BaseProcess.h" nuclear@0: nuclear@0: struct aiMesh; nuclear@0: struct aiNodeAnim; nuclear@0: nuclear@0: namespace Assimp { nuclear@0: nuclear@0: // ----------------------------------------------------------------------------------- nuclear@0: /** @brief The MakeLeftHandedProcess converts all imported data to a left-handed nuclear@0: * coordinate system. nuclear@0: * nuclear@0: * This implies a mirroring of the Z axis of the coordinate system. But to keep nuclear@0: * transformation matrices free from reflections we shift the reflection to other nuclear@0: * places. We mirror the meshes and adapt the rotations. nuclear@0: * nuclear@0: * @note RH-LH and LH-RH is the same, so this class can be used for both nuclear@0: */ nuclear@0: class MakeLeftHandedProcess : public BaseProcess nuclear@0: { nuclear@0: nuclear@0: nuclear@0: public: nuclear@0: MakeLeftHandedProcess(); nuclear@0: ~MakeLeftHandedProcess(); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: bool IsActive( unsigned int pFlags) const; nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: void Execute( aiScene* pScene); nuclear@0: nuclear@0: protected: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** Recursively converts a node and all of its children nuclear@0: */ nuclear@0: void ProcessNode( aiNode* pNode, const aiMatrix4x4& pParentGlobalRotation); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** Converts a single mesh to left handed coordinates. nuclear@0: * This means that positions, normals and tangents are mirrored at nuclear@0: * the local Z axis and the order of all faces are inverted. nuclear@0: * @param pMesh The mesh to convert. nuclear@0: */ nuclear@0: void ProcessMesh( aiMesh* pMesh); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** Converts a single material to left-handed coordinates nuclear@0: * @param pMat Material to convert nuclear@0: */ nuclear@0: void ProcessMaterial( aiMaterial* pMat); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** Converts the given animation to LH coordinates. nuclear@0: * The rotation and translation keys are transformed, the scale keys nuclear@0: * work in local space and can therefore be left untouched. nuclear@0: * @param pAnim The bone animation to transform nuclear@0: */ nuclear@0: void ProcessAnimation( aiNodeAnim* pAnim); nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** Postprocessing step to flip the face order of the imported data nuclear@0: */ nuclear@0: class FlipWindingOrderProcess : public BaseProcess nuclear@0: { nuclear@0: friend class Importer; nuclear@0: nuclear@0: public: nuclear@0: /** Constructor to be privately used by Importer */ nuclear@0: FlipWindingOrderProcess(); nuclear@0: nuclear@0: /** Destructor, private as well */ nuclear@0: ~FlipWindingOrderProcess(); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: bool IsActive( unsigned int pFlags) const; nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: void Execute( aiScene* pScene); nuclear@0: nuclear@0: protected: nuclear@0: void ProcessMesh( aiMesh* pMesh); nuclear@0: }; nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** Postprocessing step to flip the UV coordinate system of the import data nuclear@0: */ nuclear@0: class FlipUVsProcess : public BaseProcess nuclear@0: { nuclear@0: friend class Importer; nuclear@0: nuclear@0: public: nuclear@0: /** Constructor to be privately used by Importer */ nuclear@0: FlipUVsProcess(); nuclear@0: nuclear@0: /** Destructor, private as well */ nuclear@0: ~FlipUVsProcess(); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: bool IsActive( unsigned int pFlags) const; nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: void Execute( aiScene* pScene); nuclear@0: nuclear@0: protected: nuclear@0: void ProcessMesh( aiMesh* pMesh); nuclear@0: void ProcessMaterial( aiMaterial* mat); nuclear@0: }; nuclear@0: nuclear@0: } // end of namespace Assimp nuclear@0: nuclear@0: #endif // AI_CONVERTTOLHPROCESS_H_INC