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 OptimizeMeshes.h nuclear@0: * @brief Declares a post processing step to join meshes, if possible nuclear@0: */ nuclear@0: #ifndef AI_OPTIMIZEMESHESPROCESS_H_INC nuclear@0: #define AI_OPTIMIZEMESHESPROCESS_H_INC nuclear@0: nuclear@0: #include "BaseProcess.h" nuclear@0: #include "assimp/types.h" nuclear@0: nuclear@0: struct aiMesh; nuclear@0: class OptimizeMeshesProcessTest; nuclear@0: namespace Assimp { nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** @brief Postprocessing step to optimize mesh usage nuclear@0: * nuclear@0: * The implementation looks for meshes that could be joined and joins them. nuclear@0: * Usually this will reduce the number of drawcalls. nuclear@0: * nuclear@0: * @note Instanced meshes are currently not processed. nuclear@0: */ nuclear@0: class OptimizeMeshesProcess : public BaseProcess nuclear@0: { nuclear@0: public: nuclear@0: nuclear@0: OptimizeMeshesProcess(); nuclear@0: ~OptimizeMeshesProcess(); nuclear@0: nuclear@0: nuclear@0: /** @brief Internal utility to store additional mesh info nuclear@0: */ nuclear@0: struct MeshInfo nuclear@0: { nuclear@0: MeshInfo() nuclear@0: : instance_cnt (0) nuclear@0: , vertex_format (0) nuclear@0: , output_id (0xffffffff) nuclear@0: {} nuclear@0: nuclear@0: //! Number of times this mesh is referenced nuclear@0: unsigned int instance_cnt; nuclear@0: nuclear@0: //! Vertex format id nuclear@0: unsigned int vertex_format; nuclear@0: nuclear@0: //! Output ID nuclear@0: unsigned int output_id; nuclear@0: }; nuclear@0: nuclear@0: public: nuclear@0: // ------------------------------------------------------------------- nuclear@0: bool IsActive( unsigned int pFlags) const; nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: void Execute( aiScene* pScene); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: void SetupProperties(const Importer* pImp); nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** @brief Specify whether you want meshes with different nuclear@0: * primitive types to be merged as well. nuclear@0: * nuclear@0: * IsActive() sets this property automatically to true if the nuclear@0: * aiProcess_SortByPType flag is found. nuclear@0: */ nuclear@0: void EnablePrimitiveTypeSorting(bool enable) { nuclear@0: pts = enable; nuclear@0: } nuclear@0: nuclear@0: // Getter nuclear@0: bool IsPrimitiveTypeSortingEnabled () const { nuclear@0: return pts; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** @brief Specify a maximum size of a single output mesh. nuclear@0: * nuclear@0: * If a single input mesh already exceeds this limit, it won't nuclear@0: * be split. nuclear@0: * @param verts Maximum number of vertices per mesh nuclear@0: * @param faces Maximum number of faces per mesh nuclear@0: */ nuclear@0: void SetPreferredMeshSizeLimit (unsigned int verts, unsigned int faces) nuclear@0: { nuclear@0: max_verts = verts; nuclear@0: max_faces = faces; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: protected: nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** @brief Do the actual optimization on all meshes of this node nuclear@0: * @param pNode Node we're working with nuclear@0: */ nuclear@0: void ProcessNode( aiNode* pNode); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** @brief Returns true if b can be joined with a nuclear@0: * nuclear@0: * @param verts Number of output verts up to now nuclear@0: * @param faces Number of output faces up to now nuclear@0: */ nuclear@0: bool CanJoin ( unsigned int a, unsigned int b, nuclear@0: unsigned int verts, unsigned int faces ); nuclear@0: nuclear@0: // ------------------------------------------------------------------- nuclear@0: /** @brief Find instanced meshes, for the moment we're excluding nuclear@0: * them from all optimizations nuclear@0: */ nuclear@0: void FindInstancedMeshes (aiNode* pNode); nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: //! Scene we're working with nuclear@0: aiScene* mScene; nuclear@0: nuclear@0: //! Per mesh info nuclear@0: std::vector meshes; nuclear@0: nuclear@0: //! Next output mesh nuclear@0: aiMesh* mesh; nuclear@0: nuclear@0: //! Output meshes nuclear@0: std::vector output; nuclear@0: nuclear@0: //! @see EnablePrimitiveTypeSorting nuclear@0: mutable bool pts; nuclear@0: nuclear@0: //! @see SetPreferredMeshSizeLimit nuclear@0: mutable unsigned int max_verts,max_faces; nuclear@0: nuclear@0: //! Temporary storage nuclear@0: std::vector merge_list; nuclear@0: }; nuclear@0: nuclear@0: } // end of namespace Assimp nuclear@0: nuclear@0: #endif // AI_CALCTANGENTSPROCESS_H_INC