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