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)
指定したノードを削除する.