COLLADAサンプル
COLLADAのソースの本体はDAE.c Read.c Write.cの3つのファイルです。
コールバックをユーザが宣言したりする為、ライブラリにはなっていません。
C言語で書かれている事や、マクロが多用してあるので、この実装はいまいちな感じです。
これをラップするcvlibもあるので、それもこの後調査します。
なお、ここに書いたソースはコールバック内が空なので、実際には何も表示されません。
- プロジェクトの設定
C/C++、全般、追加のインクルードディレクトリ D:\COLLADA\include;D:\libxml2-2.6.18.win32\include; D:\iconv-1.9.1.win32\include;D:\project\colladatest C/C++、コード生成、ランタイムライブラリ マルチスレッドDLL(/MD) リンカ、全般、追加のライブラリディレクトリ D:\libxml2-2.6.18.win32\lib;D:\iconv-1.9.1.win32\lib; D:\COLLADA\install\lib リンカ、入力、追加の依存ファイル ws2_32.lib libxml2_a.lib iconv_a.lib zlib.lib
- マルチスレッドDLLにしないと、こんなエラーが出る
MSVCRT.lib(MSVCR71.dll) : error LNK2005: __snprintf は既に LIBCD.lib(snprintf.obj) で定義されています。 MSVCRT.lib(MSVCR71.dll) : error LNK2005: _memmove は既に LIBCD.lib(memmove.obj) で定義されています。 MSVCRT.lib(MSVCR71.dll) : error LNK2005: __vsnprintf は既に LIBCD.lib(vsnprint.obj) で定義されています。 MSVCRT.lib(MSVCR71.dll) : error LNK2005: _fprintf は既に LIBCD.lib(fprintf.obj) で定義されています。
- platform/platform.hには環境に依存する内容を書く
// platform.h #ifndef PLATFORM_H_INCLUDED #define PLATFORM_H_INCLUDED #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif // メモリ操作関数の指定 #define DAEMalloc malloc #define DAERealloc realloc #define DAEFree free #define EMalloc malloc #define ERealloc realloc #define EFree free // DAEバージョン #define DAE_VERSION "1.2.0" #include "DAE/types.h" // 構造体の宣言 typedef struct { DAECoordinate X, Y;} DAEFloat2; typedef struct { DAECoordinate X, Y, Z;} DAEFloat3; typedef struct { DAECoordinate X, Y, Z, W;} DAEFloat4; typedef struct { DAECoordinate R, G, B;} DAERGBf32Color; typedef struct { DAECoordinate R, G, B, A;} DAERGBAf32Color; typedef struct { DAETransformCore;} DAETransform; typedef struct { DAEControllerCore;} daeController; typedef struct { DAENodeCore;} daeNode; typedef struct { DAELightCore;} DAELight; typedef struct { DAECameraCore;} DAECamera; typedef struct { DAEImageCore;} DAEImage; typedef struct { DAEElementCore;} DAETexture; typedef struct { DAEElementCore;} DAEMaterial; typedef struct { DAEProgramCore;} DAEProgram; typedef struct { DAEGeometryCore;} daeGeometry; typedef struct { DAEAnimationCore;} DAEAnimation; typedef struct { DAESceneCore;} DAEScene; // ジオメトリクラス extern DAEElementClass daeClass_Geometry; // コールバック関数宣言 extern void dae_AppLightInit(DAELight*); extern void dae_AppLightFree(DAELight*); extern void dae_AppCameraInit(DAECamera*); extern void dae_AppCameraFree(DAECamera*); extern void dae_AppImageInit(DAEImage*); extern void dae_AppImageFree(DAEImage*); extern void dae_AppTextureInit(DAETexture*); extern void dae_AppTextureFree(DAETexture*); extern void dae_AppMaterialInit(DAEMaterial*); extern void dae_AppMaterialFree(DAEMaterial*); extern void dae_AppAnimationInit(DAEAnimation*); extern void dae_AppAnimationFree(DAEAnimation*); extern int dae_AddCameras(DAEScene* LScene, xmlNode* LRootXMLNode); extern int dae_AddImages(DAEScene* LScene, xmlNode* LRootXMLNode); extern int dae_Add2DTextures(DAEScene* LScene, xmlNode* LRootXMLNode); extern int dae_AddMaterials(DAEScene* LScene, xmlNode* LRootXMLNode); extern int dae_AddControllers(DAEScene* LScene, xmlNode* LRootXMLNode); extern int dae_AddGeometries(DAEScene* LScene, xmlNode* LRootXMLNode); extern int dae_AddAnimations(DAEScene* LDAEScene, xmlNode* LRootXMLNode); extern int dae_AddAppData(DAEScene* LDAEScene, xmlNode* LRootXMLNode); extern void dae_AppImageFree(DAEImage*); extern void dae_AppImageInit(DAEImage*); extern DAEElementClass daeClass_GeometryT; #define daeClass_Geometry (&daeClass_GeometryT) #include "DAE/DAE.h" #endif
- 必要なコールバックなど
// daesub.c #include <stdio.h> #include "platform/platform.h" // ジオメトリ初期化・末期化関数 static int GeometryInit(DAEElement* LElement) { return 0; } static int GeometryFree(DAEElement* LElement) { return 0; } // ジオメトリ実体 DAEElementClass daeClass_GeometryT= { DAEClass_Geometry, // SuperClass "daeGeometry", // Class Name "geometry", // XMLName sizeof(DAENode), // StructSize GeometryInit, // InitProc() (constructor) GeometryFree, // FreeProc() (destructor) NULL, // FromString() NULL, // ToString() }; // コールバック実体 void dae_AppLightInit(DAELight* LLight) {} void dae_AppLightFree(DAELight* LLight) {} void dae_AppCameraInit(DAECamera* LCamera) {} void dae_AppCameraFree(DAECamera* LCamera) {} void dae_AppTextureInit(DAETexture* LTexture) {} void dae_AppTextureFree(DAETexture* LTexture) {} void dae_AppMaterialInit(DAEMaterial* LMaterial) {} void dae_AppMaterialFree(DAEMaterial* LMaterial) {} void dae_AppAnimationInit(DAEAnimation* LAnimation) {} void dae_AppAnimationFree(DAEAnimation* LAnimation) {} int dae_PrintVaMessage(int LType, const char* LMessage, ...) {return 0;} void dae_AddAssetTag(xmlNode* LRootXMLNode) {} void dae_SceneReadNodeHierarchy(DAEScene* LScene, xmlNode* LXMLNode) {} void dae_CameraRead(DAEScene* LScene, xmlNode* LRootXMLNode) {} void dae_MaterialRead(DAEScene* LScene, xmlNode* LRootXMLNode) {} void dae_TextureRead(DAEScene* LScene, xmlNode* LRootXMLNode) {} void dae_PointSetRead(DAEScene* LScene, DAEGeometry* LDAEGeometry, const char* LName) {} void dae_SplineRead(DAEScene* LScene, DAEGeometry* LDAEGeometry, const char* LName) {} void dae_MeshRead(DAEScene* LScene, DAEGeometry* LDAEGeometry, const char* LName) {} void dae_ControllerRead(DAEScene* LDAEScene, xmlNode* LRootXMLNode) {} void dae_AnimationRead(DAEScene* LScene, xmlNode* LRootXMLNode, const char* LName) {} void dae_AppdataRead(DAEScene* LDAEScene, xmlNode* LApplicationXMLNode) {} int dae_AddNodes(DAEScene* LScene, xmlNode* LRootXMLNode){return 0;} int dae_AddCameras(DAEScene* LScene, xmlNode* LRootXMLNode) {return 0;} int dae_AddImages(DAEScene* LScene, xmlNode* LRootXMLNode) {return 0;} int dae_Add2DTextures(DAEScene* LScene, xmlNode* LRootXMLNode) {return 0;} int dae_AddMaterials(DAEScene* LScene, xmlNode* LRootXMLNode) {return 0;} int dae_AddControllers(DAEScene* LScene, xmlNode* LRootXMLNode) {return 0;} int dae_AddGeometries(DAEScene* LScene, xmlNode* LRootXMLNode) {return 0;} int dae_AddAnimations(DAEScene* LDAEScene, xmlNode* LRootXMLNode) {return 0;} int dae_AddAppData(DAEScene* LDAEScene, xmlNode* LRootXMLNode) {return 0;} void dae_AppImageFree(DAEImage* image){} void dae_AppImageInit(DAEImage* image){}
- メインのソース
#include <stdio.h> extern "C" { // DAEはc言語で書かれているので #include "platform/platform.h" } // シーンの表示 void printScene(DAEScene &scene) { // 全てのジオメトリを表示 for (int i = 0; i < scene.NumOfGeometries; i++) { DAE_PrintXMLNode(scene.Geometries[i]->XMLNode); } } int main(int argc, char *argv[]) { FILE *fp = NULL; DAEScene scene; // シーンの初期化 DAE_SceneInit(&scene); // シーンの読み込み if (DAE_SceneRead("cube.xml", fp, &scene) != DAE_SUCCESS) { printf("読み込み失敗\n"); return 1; } // シーンの表示 printScene(scene); }