aboutsummaryrefslogtreecommitdiff
path: root/NvCloth/samples/external/assimp-4.1.0/code/ColladaExporter.h
diff options
context:
space:
mode:
Diffstat (limited to 'NvCloth/samples/external/assimp-4.1.0/code/ColladaExporter.h')
-rw-r--r--NvCloth/samples/external/assimp-4.1.0/code/ColladaExporter.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/NvCloth/samples/external/assimp-4.1.0/code/ColladaExporter.h b/NvCloth/samples/external/assimp-4.1.0/code/ColladaExporter.h
new file mode 100644
index 0000000..e7a4a9b
--- /dev/null
+++ b/NvCloth/samples/external/assimp-4.1.0/code/ColladaExporter.h
@@ -0,0 +1,222 @@
+/*
+Open Asset Import Library (assimp)
+----------------------------------------------------------------------
+
+Copyright (c) 2006-2017, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior
+ written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------
+*/
+
+/** @file ColladaExporter.h
+ * Declares the exporter class to write a scene to a Collada file
+ */
+#ifndef AI_COLLADAEXPORTER_H_INC
+#define AI_COLLADAEXPORTER_H_INC
+
+#include <assimp/ai_assert.h>
+#include <assimp/material.h>
+#include <assimp/mesh.h>
+#include <assimp/light.h>
+#include <assimp/Exporter.hpp>
+#include <sstream>
+#include <vector>
+#include <map>
+
+#include "StringUtils.h"
+
+struct aiScene;
+struct aiNode;
+
+namespace Assimp
+{
+
+/// Helper class to export a given scene to a Collada file. Just for my personal
+/// comfort when implementing it.
+class ColladaExporter
+{
+public:
+ /// Constructor for a specific scene to export
+ ColladaExporter( const aiScene* pScene, IOSystem* pIOSystem, const std::string& path, const std::string& file);
+
+ /// Destructor
+ virtual ~ColladaExporter();
+
+protected:
+ /// Starts writing the contents
+ void WriteFile();
+
+ /// Writes the asset header
+ void WriteHeader();
+
+ /// Writes the embedded textures
+ void WriteTextures();
+
+ /// Writes the material setup
+ void WriteMaterials();
+
+ /// Writes the cameras library
+ void WriteCamerasLibrary();
+
+ // Write a camera entry
+ void WriteCamera(size_t pIndex);
+
+ /// Writes the cameras library
+ void WriteLightsLibrary();
+
+ // Write a camera entry
+ void WriteLight(size_t pIndex);
+ void WritePointLight(const aiLight *const light);
+ void WriteDirectionalLight(const aiLight *const light);
+ void WriteSpotLight(const aiLight *const light);
+ void WriteAmbienttLight(const aiLight *const light);
+
+ /// Writes the controller library
+ void WriteControllerLibrary();
+
+ /// Writes a skin controller of the given mesh
+ void WriteController( size_t pIndex);
+
+ /// Writes the geometry library
+ void WriteGeometryLibrary();
+
+ /// Writes the given mesh
+ void WriteGeometry( size_t pIndex);
+
+ //enum FloatDataType { FloatType_Vector, FloatType_TexCoord2, FloatType_TexCoord3, FloatType_Color, FloatType_Mat4x4, FloatType_Weight };
+ // customized to add animation related type
+ enum FloatDataType { FloatType_Vector, FloatType_TexCoord2, FloatType_TexCoord3, FloatType_Color, FloatType_Mat4x4, FloatType_Weight, FloatType_Time };
+
+ /// Writes a float array of the given type
+ void WriteFloatArray( const std::string& pIdString, FloatDataType pType, const ai_real* pData, size_t pElementCount);
+
+ /// Writes the scene library
+ void WriteSceneLibrary();
+
+ // customized, Writes the animation library
+ void WriteAnimationsLibrary();
+ void WriteAnimationLibrary( size_t pIndex);
+ std::string mFoundSkeletonRootNodeID = "skeleton_root"; // will be replaced by found node id in the WriteNode call.
+
+ /// Recursively writes the given node
+ void WriteNode( const aiScene* scene, aiNode* pNode);
+
+ /// Enters a new xml element, which increases the indentation
+ void PushTag() { startstr.append( " "); }
+ /// Leaves an element, decreasing the indentation
+ void PopTag() {
+ ai_assert( startstr.length() > 1);
+ startstr.erase( startstr.length() - 2);
+ }
+
+ /// Creates a mesh ID for the given mesh
+ std::string GetMeshId( size_t pIndex) const {
+ return std::string( "meshId" ) + to_string(pIndex);
+ }
+
+public:
+ /// Stringstream to write all output into
+ std::stringstream mOutput;
+
+protected:
+ /// The IOSystem for output
+ IOSystem* mIOSystem;
+
+ /// Path of the directory where the scene will be exported
+ const std::string mPath;
+
+ /// Name of the file (without extension) where the scene will be exported
+ const std::string mFile;
+
+ /// The scene to be written
+ const aiScene* mScene;
+ bool mSceneOwned;
+
+ /// current line start string, contains the current indentation for simple stream insertion
+ std::string startstr;
+ /// current line end string for simple stream insertion
+ std::string endstr;
+
+ // pair of color and texture - texture precedences color
+ struct Surface
+ {
+ bool exist;
+ aiColor4D color;
+ std::string texture;
+ size_t channel;
+ Surface() { exist = false; channel = 0; }
+ };
+
+ struct Property
+ {
+ bool exist;
+ ai_real value;
+ Property()
+ : exist(false)
+ , value(0.0)
+ {}
+ };
+
+ // summarize a material in an convinient way.
+ struct Material
+ {
+ std::string name;
+ std::string shading_model;
+ Surface ambient, diffuse, specular, emissive, reflective, transparent, normal;
+ Property shininess, transparency, index_refraction;
+
+ Material() {}
+ };
+
+ std::vector<Material> materials;
+
+ std::map<unsigned int, std::string> textures;
+
+protected:
+ /// Dammit C++ - y u no compile two-pass? No I have to add all methods below the struct definitions
+ /// Reads a single surface entry from the given material keys
+ void ReadMaterialSurface( Surface& poSurface, const aiMaterial* pSrcMat, aiTextureType pTexture, const char* pKey, size_t pType, size_t pIndex);
+ /// Writes an image entry for the given surface
+ void WriteImageEntry( const Surface& pSurface, const std::string& pNameAdd);
+ /// Writes the two parameters necessary for referencing a texture in an effect entry
+ void WriteTextureParamEntry( const Surface& pSurface, const std::string& pTypeName, const std::string& pMatName);
+ /// Writes a color-or-texture entry into an effect definition
+ void WriteTextureColorEntry( const Surface& pSurface, const std::string& pTypeName, const std::string& pImageName);
+ /// Writes a scalar property
+ void WriteFloatEntry( const Property& pProperty, const std::string& pTypeName);
+};
+
+}
+
+#endif // !! AI_COLLADAEXPORTER_H_INC