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);
}