00001
00002 #ifndef __JBXL_CPP_COLLADA_TOOL_H_
00003 #define __JBXL_CPP_COLLADA_TOOL_H_
00004
00005
00006 #include "tools++.h"
00007 #include "txml.h"
00008
00009 #include "TriBrep.h"
00010 #include "Rotation.h"
00011 #include "FacetBaseData.h"
00012 #include "MaterialParam.h"
00013 #include "MeshObjectData.h"
00014
00015
00016
00017 namespace jbxl {
00018
00019
00020 #define COLLADA_STR_XMLNS "http://www.collada.org/2005/11/COLLADASchema"
00021 #define COLLADA_STR_AUTHOR "JBXL Collada Tools Library (C) 2014"
00022 #define COLLADA_STR_TOOL "JunkBox_Lib++ (http://www.nsl.tuis.ac.jp/)"
00023
00024
00025 #define COLLADA_X_UP 0
00026 #define COLLADA_Y_UP 1
00027 #define COLLADA_Z_UP 2
00028
00029
00030
00032
00033
00034
00038 class ColladaXML
00039 {
00040 public:
00041 ColladaXML(double meter=1.0, int axis=COLLADA_Z_UP, const char* ver=NULL) { init(meter, axis, ver);}
00042 ColladaXML(float meter, int axis=COLLADA_Z_UP, const char* ver=NULL) { init(meter, axis, ver);}
00043 virtual ~ColladaXML(void);
00044
00045 public:
00046 void init (double meter=1.0, int axis=COLLADA_Z_UP, const char* ver=NULL);
00047 void init(float meter, int axis = COLLADA_Z_UP, const char* ver = NULL) { init((double)meter, axis, ver); }
00048 void clear(double meter=1.0, int axis=COLLADA_Z_UP, const char* ver=NULL);
00049 void clear(float meter, int axis = COLLADA_Z_UP, const char* ver = NULL) { clear((double)meter, axis, ver); }
00050 void free (void);
00051
00052 void print(FILE* fp, int mode=XML_INDENT_FORMAT) { print_xml(fp, xml, mode);}
00053 void print_tree(FILE* fp) { print_xml_tree(fp, xml, " ");}
00054
00055 public:
00056 void initCollada(double meter, int axis, const char* ver);
00057 void initCollada(float meter, int axis, const char* ver) { initCollada((double)meter, axis, ver); }
00058 void addObject(MeshObjectData* meshdata, bool collider);
00059
00060 char* addGeometry(MeshObjectData* meshdata);
00061 void addScene(const char* geometry_id, MeshObjectData* meshdata, bool collider);
00062
00063 char* addVertexSource(tXML* mesh, MeshObjectData* meshdata);
00064 char* addNormalSource(tXML* mesh, MeshObjectData* meshdata);
00065 char* addTexcrdSource(tXML* mesh, MeshObjectData* meshdata);
00066 char* addVerticesPos (tXML* mesh, const char* position_id);
00067
00068 void addPosTechniqueAccessor(tXML* source, const char* source_array_id, int count);
00069 void addMapTechniqueAccessor(tXML* source, const char* source_array_id, int count);
00070
00071 void addPolylists(tXML* mesh, MeshObjectData* meshdata, const char* vertex_id, const char* normal_id=NULL, const char* texcrd_id=NULL);
00072 char* addImage(const char* filename);
00073 char* addMaterial(const char* material);
00074 tXML* addEffect(const char* material_url, const char* file_id, MaterialParam param);
00075 void addExtraBumpmap(tXML* effect, const char* bump_id);
00076
00077 bool existSameID(tXML* top, const char* tag, const char* id);
00078
00079 void setBlankTexture(const char* name) { if(name!=NULL) blank_texture = make_Buffer_bystr(name);}
00080 bool isBlankTexture (const char* name);
00081
00082 void outputFile(const char* fn, const char* path=NULL, int mode=XML_INDENT_FORMAT);
00083
00084
00085 bool forUnity3D;
00086 void addCenterObject(void);
00087 void addCenterScene(void);
00088
00089 private:
00090
00091 public:
00092 tXML* xml;
00093 tXML* collada;
00094
00095 tXML* asset;
00096 tXML* contributor;
00097 tXML* author;
00098 tXML* authoring_tool;
00099 tXML* created;
00100 tXML* modified;
00101 tXML* unit;
00102 tXML* up_axis;
00103
00104 tXML* library_images;
00105 tXML* library_geometries;
00106 tXML* library_effects;
00107 tXML* library_materials;
00108 tXML* library_visual_scenes;
00109 tXML* library_physics_scenes;
00110 tXML* library_physics_models;
00111
00112 tXML* instance_physics_model;
00113
00114 tXML* visual_scene;
00115 tXML* physics_scene;
00116 tXML* physics_model;
00117
00118 tXML* scene;
00119 tXML* instance_visual_scene;
00120 tXML* instance_physics_scene;
00121
00122 Buffer blank_texture;
00123 };
00124
00125
00126 inline void freeColladaXML(ColladaXML*& xml) { if(xml!=NULL) { xml->free(); delete xml; xml=NULL;} }
00127
00128
00129
00130 }
00131
00132
00133 #endif
00134