56    this->
init(meter, axis, ver);
 
 
  159    if (shelldata==NULL) 
return;
 
  162    if (skin_joint!=NULL) {
 
  164        if (joints_template!=NULL) {
 
  175    char* ctrl_id = this->
addController(geom_id, shelldata, skin_joint);    
 
  176    this->
addScene(geom_id, ctrl_id, shelldata, collider, skin_joint);      
 
  178    if (geom_id!=NULL) 
::free(geom_id);
 
  179    if (ctrl_id!=NULL) 
::free(ctrl_id);
 
 
  188        if (pelvis_tag!=NULL) {
 
  192            PRINT_MESG(
"WARNING: ColladaXML::closeObject: not found mPelvis in Joints template file.\n");
 
 
  201    if (geometry_id==NULL || shelldata==NULL || skin_joint==NULL) 
return NULL;
 
  219    for (
int i=1; i<=4; i++) {
 
  220        for (
int j=1; j<=4; j++) {
 
  239    for (
int jnt=0; jnt<num_joints; jnt++) {
 
  258    for (
int jnt=0; jnt<num_joints; jnt++) {
 
  259        for (
int i=1; i<=4; i++) {
 
  260            for (
int j=1; j<=4; j++) {
 
  270    if (weight_index==NULL) 
return NULL;
 
  271    memset(weight_index, 0, vec_len);
 
  272    char* weight_id = 
addWeightSource(skin_tag, shelldata, weight_index, num_joints);
 
  302    int prev_vertex = -1;
 
  304    for (
int i=0; i<shelldata->
ttl_vertex*num_joints; i++) {
 
  305        if (weight_index[i].z==
TRUE) {
 
  306            if (prev_vertex==-1) prev_vertex = weight_index[i].
x;               
 
  310            if (prev_vertex!=weight_index[i].x) {
 
  312                prev_vertex = weight_index[i].
x;
 
  324        PRINT_MESG(
"WARNING: ColladaXML::addController: Vcount and Vertex number missmatched (%d != %d), Valid data num = %d\n", snum, shelldata->
ttl_vertex, wnum);
 
  334    if (weight_id!=NULL) 
::free(weight_id);
 
 
  342    if (shelldata==NULL) 
return NULL;
 
  351    if (geometry_name.
buf!=NULL) {
 
  373    addPolylists(mesh_tag, shelldata, vertex_id, normal_id, texcrd_id);
 
 
  389    if (tag==NULL || shelldata==NULL) 
return NULL;
 
  406        while (facet!=NULL) {
 
 
  427    if (tag==NULL || shelldata==NULL) 
return NULL;
 
  444        while (facet!=NULL) {
 
 
  466    if (tag==NULL || shelldata==NULL) 
return NULL;
 
  483        while (facet!=NULL) {
 
 
  524    if (tag==NULL || shelldata==NULL || weight_index==NULL) 
return NULL;
 
  541        while (facet!=NULL) {
 
  546                for (
int j=0; j<jnum; j++) {
 
  551                    for (
int j=0; j<num_joints; j++) {
 
  552                        weight_index[num_joints*vnum + j].
x = i;
 
  553                        weight_index[num_joints*vnum + j].
y = j;
 
  554                        weight_index[num_joints*vnum + j].
z = 
FALSE;
 
  556                        int weight_value = 0;
 
  557                        if (j<jnum) weight_value = weight[i].
get_value(j);
 
  559                        if (weight_value!=0) {
 
  560                            double value = weight_value/(double)total;
 
  562                            weight_index[vnum*num_joints + j].
z = 
TRUE;
 
  568                    weight_index[vnum*num_joints].
x = i;
 
  569                    weight_index[vnum*num_joints].
y = 0;
 
  570                    weight_index[vnum*num_joints].
z = 
TRUE;
 
  582        PRINT_MESG(
"WARNING: ColladaXML::addWeightSource: no match vertex num (%d != %d)\n", vnum, shelldata->
ttl_vertex);
 
 
  594    if (tag==NULL || position_id==NULL) 
return NULL;
 
 
  615    if (source_tag==NULL || source_array_id==NULL) 
return;
 
 
  632    if (source_tag==NULL || source_array_id==NULL) 
return;
 
 
  656    if (source_tag==NULL || source_array_id==NULL) 
return;
 
 
  678    if (mesh_tag==NULL || vertex_id==NULL || shelldata==NULL) 
return;
 
  683    while (facet!=NULL) {
 
  695                if (!exist_same_material) { 
 
  717        if (normal_id!=NULL) {
 
  724        if (texcrd_id!=NULL) {
 
 
  758    if (fn==NULL) 
return NULL;
 
  765    if (!exist_same_image) {
 
 
  783    if (material_id==NULL) 
return NULL;
 
 
  800    if (material_url==NULL || file_id==NULL) 
return NULL;
 
  855    tXML* diffuse_tag = NULL;
 
  865        bool no_texture = 
true;
 
  866        if (diffuse_tag!=NULL) no_texture = 
false;
 
  877        for (
int i=0; i<4; i++) {
 
  879            if (
forUnity && col==0.0) col = 0.0001;
 
  888        if (
forUnity && alpha<0.01) alpha = 0.01;
 
 
  915    if (profile_tag==NULL || bump_id==NULL) 
return;
 
 
  966    if ((geometry_id==NULL && controller_id==NULL) || shelldata==NULL) 
return;
 
  968    bool local_affine = 
true;
 
  971        local_affine = 
false;
 
  986        memset(buf, 0, 
LNAME);
 
  991        for (
int jnt=0; jnt<num_joints; jnt++) {
 
  993            if (joint_name!=NULL) {
 
  994                int len = (int)strlen(joint_name);
 
  995                memcpy(buf + 1, joint_name, len);
 
 1000                if (node_tag!=NULL) {
 
 1001                    tXML* matrix_tag = node_tag->next;
 
 1002                    for (
int i=1; i<=4; i++) {
 
 1003                        for (
int j=1; j<=4; j++) {
 
 1011                    PRINT_MESG(
"ERROR: ColladaXML::addScene: Joint (%s) is not found in Joints template file!\n", joint_name);
 
 1037        if (pelvis_num >= 0) {
 
 1065    tXML* rigid_body_tag = NULL;
 
 1066    tXML* instance_rigid_body_tag = NULL;
 
 1083    for (
int i = 1; i <= 4; i++) {
 
 1084        for (
int j = 1; j <= 4; j++) {
 
 1090    tXML* instance_tag = NULL;
 
 1091    if (controller_id!=NULL) {
 
 1092        instance_tag = 
add_xml_node(node_tag, 
"instance_controller");
 
 1099        instance_tag = 
add_xml_node(node_tag, 
"instance_geometry");
 
 1104    tXML* technique_common_tag = 
add_xml_node(bind_material_tag, 
"technique_common");
 
 1106    tXML* instance_material_tag;
 
 1108    while(facet!=NULL) {
 
 1110            instance_material_tag = 
add_xml_node(technique_common_tag, 
"instance_material");
 
 1114        facet = facet->
next;
 
 1119        technique_common_tag = 
add_xml_node(rigid_body_tag, 
"technique_common");
 
 1126        if (controller_id!=NULL) {
 
 1127            instance_tag = 
add_xml_node(shape_tag, 
"instance_controller");
 
 1131            instance_tag = 
add_xml_node(shape_tag, 
"instance_geometry");
 
 1138    if (local_affine) affine.
free();
 
 
 1179    if (file_name.
buf[0]==
'.') file_name.
buf[0] = 
'_';
 
 1187    FILE* fp = fopen((
char*)out_path.
buf, 
"wb");
 
 1193        PRINT_MESG(
"ColladaXML::outputFile: ERROR: File open Error! (%s)\n", (
char*)out_path.
buf);
 
 
 1211    if (avatar_tag!=NULL) {
 
 1215        for (
int i=1; i<=4; i++) {
 
 1216            for (
int j=1; j<=4; j++) {
 
 
 1229    if (delete_tag==NULL) 
return;
 
 1231    if (delete_tag->next!=NULL) {
 
 1232        tXML* next = delete_tag->next;
 
 1233        while (next->esis!=NULL) next = next->esis;
 
 1235        if (next->ysis!=NULL) {
 
 1236            if (!
strcasecmp((
char*)next->ysis->ldat.key.buf, 
"extra")) {
 
 1237                tXML* ysis = next->ysis;
 
 1241        if (!
strcasecmp((
char*)next->ldat.key.buf, 
"matrix")) {
 
 
 1252    if (delete_tag==NULL) 
return;
 
 1254    if (!
strcasecmp((
char*)delete_tag->ldat.key.buf, 
"matrix")) {
 
 1255        if (delete_tag->next==NULL) {
 
 1260    if (delete_tag->next!=NULL) {
 
 1263    if (delete_tag->ysis!=NULL) {
 
 
 1277    if (top_tag==NULL) 
return;
 
 1280    memset(buf, 0, 
LNAME);
 
 1283    tList* lp = joints_name;
 
 1285        char* jname = (
char*)lp->ldat.key.buf;
 
 1286        int len = (int)strlen(jname);
 
 1287        memcpy(buf + 1, jname, len);
 
 1289        buf[len + 2] = 
'\0';
 
 
 1323    for (
int i=1; i<=4; i++) {
 
 1324        for (
int j=1; j<=4; j++) {
 
 
#define MATERIAL_MAPPING_PLANAR
 
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
 
Buffer init_Buffer()
初期化したBuffer型変数を返す.
 
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
 
int cat_Buffer(Buffer *src, Buffer *dst)
Buffer変数 srcから dstへバッファを catする.
 
int copy_Buffer(Buffer *src, Buffer *dst)
Buffer型変数 srcから dstへバッファをコピーする.
 
#define make_Buffer_str(str)
set_Buffer()
 
#define make_Buffer_randomstr(sz)
make_Buffer_randomstr()
 
#define replace_sBuffer_str(buf, f, t)
replace_sBuffer()
 
#define cat_s2Buffer(src, dst)
cat_b2Buffer()
 
#define make_Buffer_bystr(str)
set_Buffer()
 
void setShift(T x, T y, T z)
 
void computeMatrix(bool with_scale=true)
 
AffineTrans< T > getInverseAffine(void)
 
Vector< T > getScale(void)
 
Vector< T > execRotationScale(Vector< T > v)
 
void element(int i, int j, T v)
 
Vector< T > getShift(void)
 
tXML * instance_physics_model_tag
 
char * addImage(const char *filename)
 
char * addVertexSource(tXML *tag, MeshObjectData *shelldata)
 
char * addWeightSource(tXML *tag, MeshObjectData *shelldata, Vector< int > *weight_index, int num_joints)
 
tXML * library_visual_scenes_tag
 
void addCenterScene(void)
 
void addExtraBumpmap(tXML *effect_tag, const char *bump_id)
 
void deleteJoint(tXML *delete_tag)
 
char * addMaterial(const char *material)
 
char * addController(const char *geometry_id, MeshObjectData *shelldata, SkinJointData *skin_joint)
 
void addMapTechniqueAccessor(tXML *source_tag, const char *source_array_id, int count)
 
void init(double meter=1.0, int axis=COLLADA_Z_UP, const char *ver=NULL)
 
void output_dae(FILE *fp, int mode=XML_SPACE_FORMAT)
 
void initCollada(double meter, int axis, const char *ver)
 
AffineTrans< double > * affineTrans
 
char * addGeometry(MeshObjectData *shelldata)
 
tXML * authoring_tool_tag
 
void outputFile(const char *fn, const char *path=NULL, int mode=XML_SPACE_FORMAT)
 
void addShell(MeshObjectData *shelldata, bool collider, SkinJointData *skin_joint=NULL, tXML *joints_template=NULL)
 
char * addVerticesPos(tXML *mesh_tag, const char *position_id)
 
tXML * joints_template_tag
 
void deleteNousedJoints(tXML *delete_tag)
 
tXML * library_physics_models_tag
 
char * addNormalSource(tXML *tag, MeshObjectData *shelldata)
 
void addPolylists(tXML *mesh_tag, MeshObjectData *shelldata, const char *vertex_id, const char *normal_id=NULL, const char *texcrd_id=NULL)
 
void addCenterObject(void)
 
tXML * library_images_tag
 
void deleteListJoints(tXML *top_tag, tList *joints_name)
 
void addSimpleTechniqueAccessor(tXML *source_tag, const char *source_array_id, int count, int stride, const char *name, const char *type)
 
AffineTrans< double > affineSkeleton
 
bool isBlankTexture(const char *name)
 
tXML * addEffect(const char *material_url, const char *file_id, MaterialParam param)
 
tXML * library_materials_tag
 
virtual ~ColladaXML(void)
 
tXML * instance_physics_scene_tag
 
tXML * instance_visual_scene_tag
 
tXML * library_geometries_tag
 
void addScene(const char *geometry_id, char *controll_id, MeshObjectData *shelldata, bool collider, SkinJointData *skin_joint)
 
void setJointLocationMatrix(void)
 
bool existSameID(tXML *top, const char *tag, const char *id)
 
void addPosTechniqueAccessor(tXML *source_tag, const char *source_array_id, int count)
 
tXML * library_physics_scenes_tag
 
tXML * library_controllers_tag
 
tXML * library_effects_tag
 
void clear(double meter=1.0, int axis=COLLADA_Z_UP, const char *ver=NULL)
 
char * addTexcrdSource(tXML *tag, MeshObjectData *shelldata)
 
bool isTransparency(void)
 
bool isSetShininess(void)
 
char * getBumpMapName(void)
 
char * getTextureName(void)
 
TextureParam texture
テクスチャ
 
double getShininess(void)
 
TextureParam specmap
Specular マップ テクスチャ
 
MeshObject の Polygonデータ(1面)を格納するクラス.リスト構造を取る.
 
MaterialParam material_param
マテリアルパラメータ
 
Vector< double > * normal_value
法線ベクトルデータの並び.要素数は num_vertex
 
bool same_material
他の Node が既に同じマテリアルを使用している.
 
int num_texcrd
テクスチャ画像の座標数.通常は num_vertex に等しい.(texcrd_value の要素数)
 
void execAffineTransUVMap(UVMap< double > *uvmap=NULL, int num=-1)
 
ArrayParam< int > * weight_value
頂点の重み.Jointを持つデータに使用される.要素数は num_vertex. 各 weight_value[i] の値は トータルで正規化される必要がある.
 
int * data_index
インデックスデータ.要素数は num_index
 
UVMap< double > * texcrd_value
テクスチャマップの並び.要素数は num_texcrd
 
UVMap< double > * generatePlanarUVMap(Vector< double > scale, UVMap< double > *uvmap=NULL)
 
Buffer material_id
マテリアルを識別するID.JBXL_MATERIAL_PREFIX で始まる.
 
int num_vertex
頂点のデータ数.(vertex_value, normal_value の要素数)
 
Vector< double > * vertex_value
頂点データの並び.要素数は num_vertex
 
int ttl_texcrd
テクスチャ画像の座標総数.通常は ttl_vertexと同じ値.
 
AffineTrans< double > * affineTrans
アフィン変換.ここで使用するのは,shift, rotate, scale(size) のみ
 
int num_vcount
1ポリゴン あたりの頂点数.現在は 3のみサポート
 
MeshFacetNode * facet
FACETデータ(1面のポリゴンデータ)のリストへのポインタ
 
AffineTrans< double > bind_shape
 
AffineTrans< double > * alt_inverse_bind
 
AffineTrans< double > * inverse_bind
 
ArrayParam< char * > joint_names
Joint名の配列.
 
Vector< double > getColor(void)
 
#define JBXL_STATE_ANCHOR
アンカーノード
 
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.
 
tTree * add_tTree_node(tTree *pp, tTree *node)
ツリー ppへノード nodeを末っ子として追加.
 
tTree * insert_tTree_node(tTree *pp, tTree *node)
ツリー ppへノード nodeを長子として追加.
 
#define TREE_DELETE_NODE
後で削除処理を行うノード.
 
tXML * add_xml_attr_str(tXML *xml, const char *name, const char *value)
xml に属性名 name, 文字列の属性値 value を持つノードを追加する.
 
char * xml_get_node_attr(tXML *node, const char *attr)
属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない.
 
tXML * set_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下のコンテントノードの値を置き換える.
 
tXML * get_xml_node_bystr(tXML *pp, const char *str)
get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン
 
tXML * init_xml_doc()
XML のドキュメントヘッダを作成する.
 
tXML * add_xml_attr_float(tXML *xml, const char *name, float value)
xml に属性名 name, float型実数の属性値 value を持つノードを追加する.
 
tXML * insert_xml_node(tXML *xml, const char *name)
XMLツリーのxml の直下(姉妹の一番上:長子)にノード(属性は指定しない)を挿入する.
 
tXML * add_xml_node(tXML *xml, const char *name)
XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する.
 
tXML * xml_parse(char *pp)
文字列のXMLデータを解釈して,tXMLのツリーを生成する.
 
int add_xml_content_area(tXML *xml, int len)
xml に空のコンテントノードを追加する.
 
tXML * append_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下のコンテントノードにコンテンツを追加する.
 
tXML * add_xml_content_node(tXML *xml, const char *content)
XMLツリーのxml の直下にコンテントを挿入する.
 
tXML * get_xml_attr_node(tXML *pp, const char *key, const char *val)
属性 key=val のノードを探し,最初に見つけたノードを返す.
 
tList * get_xml_node_list(tXML *pp, tXML *pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへのポインタをリストに格納して返す.
 
tXML * add_xml_attr_int(tXML *xml, const char *name, int value)
xml に属性名 name, 整数の属性値 value を持つノードを追加する.
 
#define get_xml_node_str(p, s)
get_xml_node_bystr()
 
#define del_xml(p)
指定したノード以下のXMLツリー(ppの姉妹は含まない)を削除する.
 
#define del_all_xml(p)
XMLツリーの全ノードの削除.ポインタ ppのノードを含むXMLツリー全体を削除する.
 
#define del_xml_node(p)
指定したノードを削除する.