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 ColladaExporter.h nuclear@0: * Declares the exporter class to write a scene to a Collada file nuclear@0: */ nuclear@0: #ifndef AI_COLLADAEXPORTER_H_INC nuclear@0: #define AI_COLLADAEXPORTER_H_INC nuclear@0: nuclear@0: #include "assimp/ai_assert.h" nuclear@0: #include nuclear@0: nuclear@0: struct aiScene; nuclear@0: struct aiNode; nuclear@0: nuclear@0: namespace Assimp nuclear@0: { nuclear@0: nuclear@0: /// Helper class to export a given scene to a Collada file. Just for my personal nuclear@0: /// comfort when implementing it. nuclear@0: class ColladaExporter nuclear@0: { nuclear@0: public: nuclear@0: /// Constructor for a specific scene to export nuclear@0: ColladaExporter( const aiScene* pScene); nuclear@0: nuclear@0: protected: nuclear@0: /// Starts writing the contents nuclear@0: void WriteFile(); nuclear@0: nuclear@0: /// Writes the asset header nuclear@0: void WriteHeader(); nuclear@0: nuclear@0: /// Writes the material setup nuclear@0: void WriteMaterials(); nuclear@0: nuclear@0: /// Writes the geometry library nuclear@0: void WriteGeometryLibrary(); nuclear@0: nuclear@0: /// Writes the given mesh nuclear@0: void WriteGeometry( size_t pIndex); nuclear@0: nuclear@0: enum FloatDataType { FloatType_Vector, FloatType_TexCoord2, FloatType_TexCoord3, FloatType_Color }; nuclear@0: nuclear@0: /// Writes a float array of the given type nuclear@0: void WriteFloatArray( const std::string& pIdString, FloatDataType pType, const float* pData, size_t pElementCount); nuclear@0: nuclear@0: /// Writes the scene library nuclear@0: void WriteSceneLibrary(); nuclear@0: nuclear@0: /// Recursively writes the given node nuclear@0: void WriteNode( const aiNode* pNode); nuclear@0: nuclear@0: /// Enters a new xml element, which increases the indentation nuclear@0: void PushTag() { startstr.append( " "); } nuclear@0: /// Leaves an element, decreasing the indentation nuclear@0: void PopTag() { ai_assert( startstr.length() > 1); startstr.erase( startstr.length() - 2); } nuclear@0: nuclear@0: /// Creates a mesh ID for the given mesh nuclear@0: std::string GetMeshId( size_t pIndex) const { return std::string( "meshId" ) + boost::lexical_cast (pIndex); } nuclear@0: nuclear@0: public: nuclear@0: /// Stringstream to write all output into nuclear@0: std::stringstream mOutput; nuclear@0: nuclear@0: protected: nuclear@0: /// The scene to be written nuclear@0: const aiScene* mScene; nuclear@0: nuclear@0: /// current line start string, contains the current indentation for simple stream insertion nuclear@0: std::string startstr; nuclear@0: /// current line end string for simple stream insertion nuclear@0: std::string endstr; nuclear@0: nuclear@0: // pair of color and texture - texture precedences color nuclear@0: struct Surface nuclear@0: { nuclear@0: aiColor4D color; nuclear@0: std::string texture; nuclear@0: size_t channel; nuclear@0: Surface() { channel = 0; } nuclear@0: }; nuclear@0: nuclear@0: // summarize a material in an convinient way. nuclear@0: struct Material nuclear@0: { nuclear@0: std::string name; nuclear@0: Surface ambient, diffuse, specular, emissive, reflective, normal; nuclear@0: float shininess; /// specular exponent nuclear@0: nuclear@0: Material() { shininess = 16.0f; } nuclear@0: }; nuclear@0: nuclear@0: std::vector materials; nuclear@0: nuclear@0: protected: nuclear@0: /// Dammit C++ - y u no compile two-pass? No I have to add all methods below the struct definitions nuclear@0: /// Reads a single surface entry from the given material keys nuclear@0: void ReadMaterialSurface( Surface& poSurface, const aiMaterial* pSrcMat, aiTextureType pTexture, const char* pKey, size_t pType, size_t pIndex); nuclear@0: /// Writes an image entry for the given surface nuclear@0: void WriteImageEntry( const Surface& pSurface, const std::string& pNameAdd); nuclear@0: /// Writes the two parameters necessary for referencing a texture in an effect entry nuclear@0: void WriteTextureParamEntry( const Surface& pSurface, const std::string& pTypeName, const std::string& pMatName); nuclear@0: /// Writes a color-or-texture entry into an effect definition nuclear@0: void WriteTextureColorEntry( const Surface& pSurface, const std::string& pTypeName, const std::string& pImageName); nuclear@0: }; nuclear@0: nuclear@0: } nuclear@0: nuclear@0: #endif // !! AI_COLLADAEXPORTER_H_INC