rev |
line source |
nuclear@0
|
1 /*
|
nuclear@0
|
2 Open Asset Import Library (assimp)
|
nuclear@0
|
3 ----------------------------------------------------------------------
|
nuclear@0
|
4
|
nuclear@0
|
5 Copyright (c) 2006-2012, assimp team
|
nuclear@0
|
6 All rights reserved.
|
nuclear@0
|
7
|
nuclear@0
|
8 Redistribution and use of this software in source and binary forms,
|
nuclear@0
|
9 with or without modification, are permitted provided that the
|
nuclear@0
|
10 following conditions are met:
|
nuclear@0
|
11
|
nuclear@0
|
12 * Redistributions of source code must retain the above
|
nuclear@0
|
13 copyright notice, this list of conditions and the
|
nuclear@0
|
14 following disclaimer.
|
nuclear@0
|
15
|
nuclear@0
|
16 * Redistributions in binary form must reproduce the above
|
nuclear@0
|
17 copyright notice, this list of conditions and the
|
nuclear@0
|
18 following disclaimer in the documentation and/or other
|
nuclear@0
|
19 materials provided with the distribution.
|
nuclear@0
|
20
|
nuclear@0
|
21 * Neither the name of the assimp team, nor the names of its
|
nuclear@0
|
22 contributors may be used to endorse or promote products
|
nuclear@0
|
23 derived from this software without specific prior
|
nuclear@0
|
24 written permission of the assimp team.
|
nuclear@0
|
25
|
nuclear@0
|
26 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
nuclear@0
|
27 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
nuclear@0
|
28 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
nuclear@0
|
29 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
nuclear@0
|
30 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
nuclear@0
|
31 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
nuclear@0
|
32 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
nuclear@0
|
33 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
nuclear@0
|
34 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
nuclear@0
|
35 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
nuclear@0
|
36 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
nuclear@0
|
37
|
nuclear@0
|
38 ----------------------------------------------------------------------
|
nuclear@0
|
39 */
|
nuclear@0
|
40
|
nuclear@0
|
41 /** @file ColladaExporter.h
|
nuclear@0
|
42 * Declares the exporter class to write a scene to a Collada file
|
nuclear@0
|
43 */
|
nuclear@0
|
44 #ifndef AI_COLLADAEXPORTER_H_INC
|
nuclear@0
|
45 #define AI_COLLADAEXPORTER_H_INC
|
nuclear@0
|
46
|
nuclear@0
|
47 #include "assimp/ai_assert.h"
|
nuclear@0
|
48 #include <sstream>
|
nuclear@0
|
49
|
nuclear@0
|
50 struct aiScene;
|
nuclear@0
|
51 struct aiNode;
|
nuclear@0
|
52
|
nuclear@0
|
53 namespace Assimp
|
nuclear@0
|
54 {
|
nuclear@0
|
55
|
nuclear@0
|
56 /// Helper class to export a given scene to a Collada file. Just for my personal
|
nuclear@0
|
57 /// comfort when implementing it.
|
nuclear@0
|
58 class ColladaExporter
|
nuclear@0
|
59 {
|
nuclear@0
|
60 public:
|
nuclear@0
|
61 /// Constructor for a specific scene to export
|
nuclear@0
|
62 ColladaExporter( const aiScene* pScene);
|
nuclear@0
|
63
|
nuclear@0
|
64 protected:
|
nuclear@0
|
65 /// Starts writing the contents
|
nuclear@0
|
66 void WriteFile();
|
nuclear@0
|
67
|
nuclear@0
|
68 /// Writes the asset header
|
nuclear@0
|
69 void WriteHeader();
|
nuclear@0
|
70
|
nuclear@0
|
71 /// Writes the material setup
|
nuclear@0
|
72 void WriteMaterials();
|
nuclear@0
|
73
|
nuclear@0
|
74 /// Writes the geometry library
|
nuclear@0
|
75 void WriteGeometryLibrary();
|
nuclear@0
|
76
|
nuclear@0
|
77 /// Writes the given mesh
|
nuclear@0
|
78 void WriteGeometry( size_t pIndex);
|
nuclear@0
|
79
|
nuclear@0
|
80 enum FloatDataType { FloatType_Vector, FloatType_TexCoord2, FloatType_TexCoord3, FloatType_Color };
|
nuclear@0
|
81
|
nuclear@0
|
82 /// Writes a float array of the given type
|
nuclear@0
|
83 void WriteFloatArray( const std::string& pIdString, FloatDataType pType, const float* pData, size_t pElementCount);
|
nuclear@0
|
84
|
nuclear@0
|
85 /// Writes the scene library
|
nuclear@0
|
86 void WriteSceneLibrary();
|
nuclear@0
|
87
|
nuclear@0
|
88 /// Recursively writes the given node
|
nuclear@0
|
89 void WriteNode( const aiNode* pNode);
|
nuclear@0
|
90
|
nuclear@0
|
91 /// Enters a new xml element, which increases the indentation
|
nuclear@0
|
92 void PushTag() { startstr.append( " "); }
|
nuclear@0
|
93 /// Leaves an element, decreasing the indentation
|
nuclear@0
|
94 void PopTag() { ai_assert( startstr.length() > 1); startstr.erase( startstr.length() - 2); }
|
nuclear@0
|
95
|
nuclear@0
|
96 /// Creates a mesh ID for the given mesh
|
nuclear@0
|
97 std::string GetMeshId( size_t pIndex) const { return std::string( "meshId" ) + boost::lexical_cast<std::string> (pIndex); }
|
nuclear@0
|
98
|
nuclear@0
|
99 public:
|
nuclear@0
|
100 /// Stringstream to write all output into
|
nuclear@0
|
101 std::stringstream mOutput;
|
nuclear@0
|
102
|
nuclear@0
|
103 protected:
|
nuclear@0
|
104 /// The scene to be written
|
nuclear@0
|
105 const aiScene* mScene;
|
nuclear@0
|
106
|
nuclear@0
|
107 /// current line start string, contains the current indentation for simple stream insertion
|
nuclear@0
|
108 std::string startstr;
|
nuclear@0
|
109 /// current line end string for simple stream insertion
|
nuclear@0
|
110 std::string endstr;
|
nuclear@0
|
111
|
nuclear@0
|
112 // pair of color and texture - texture precedences color
|
nuclear@0
|
113 struct Surface
|
nuclear@0
|
114 {
|
nuclear@0
|
115 aiColor4D color;
|
nuclear@0
|
116 std::string texture;
|
nuclear@0
|
117 size_t channel;
|
nuclear@0
|
118 Surface() { channel = 0; }
|
nuclear@0
|
119 };
|
nuclear@0
|
120
|
nuclear@0
|
121 // summarize a material in an convinient way.
|
nuclear@0
|
122 struct Material
|
nuclear@0
|
123 {
|
nuclear@0
|
124 std::string name;
|
nuclear@0
|
125 Surface ambient, diffuse, specular, emissive, reflective, normal;
|
nuclear@0
|
126 float shininess; /// specular exponent
|
nuclear@0
|
127
|
nuclear@0
|
128 Material() { shininess = 16.0f; }
|
nuclear@0
|
129 };
|
nuclear@0
|
130
|
nuclear@0
|
131 std::vector<Material> materials;
|
nuclear@0
|
132
|
nuclear@0
|
133 protected:
|
nuclear@0
|
134 /// Dammit C++ - y u no compile two-pass? No I have to add all methods below the struct definitions
|
nuclear@0
|
135 /// Reads a single surface entry from the given material keys
|
nuclear@0
|
136 void ReadMaterialSurface( Surface& poSurface, const aiMaterial* pSrcMat, aiTextureType pTexture, const char* pKey, size_t pType, size_t pIndex);
|
nuclear@0
|
137 /// Writes an image entry for the given surface
|
nuclear@0
|
138 void WriteImageEntry( const Surface& pSurface, const std::string& pNameAdd);
|
nuclear@0
|
139 /// Writes the two parameters necessary for referencing a texture in an effect entry
|
nuclear@0
|
140 void WriteTextureParamEntry( const Surface& pSurface, const std::string& pTypeName, const std::string& pMatName);
|
nuclear@0
|
141 /// Writes a color-or-texture entry into an effect definition
|
nuclear@0
|
142 void WriteTextureColorEntry( const Surface& pSurface, const std::string& pTypeName, const std::string& pImageName);
|
nuclear@0
|
143 };
|
nuclear@0
|
144
|
nuclear@0
|
145 }
|
nuclear@0
|
146
|
nuclear@0
|
147 #endif // !! AI_COLLADAEXPORTER_H_INC
|