00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <lib3ds/node.h>
00023 #include <lib3ds/file.h>
00024 #include <lib3ds/io.h>
00025 #include <lib3ds/chunk.h>
00026 #include <lib3ds/matrix.h>
00027 #include <stdlib.h>
00028 #include <string.h>
00029 #include <math.h>
00030
00031
00047 Lib3dsNode*
00048 lib3ds_node_new_ambient()
00049 {
00050 Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);
00051 node->type=LIB3DS_AMBIENT_NODE;
00052 lib3ds_matrix_identity(node->matrix);
00053 return(node);
00054 }
00055
00056
00067 Lib3dsNode*
00068 lib3ds_node_new_object()
00069 {
00070 Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);
00071 node->type=LIB3DS_OBJECT_NODE;
00072 lib3ds_matrix_identity(node->matrix);
00073 return(node);
00074 }
00075
00076
00087 Lib3dsNode*
00088 lib3ds_node_new_camera()
00089 {
00090 Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);
00091 node->type=LIB3DS_CAMERA_NODE;
00092 lib3ds_matrix_identity(node->matrix);
00093 return(node);
00094 }
00095
00096
00107 Lib3dsNode*
00108 lib3ds_node_new_target()
00109 {
00110 Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);
00111 node->type=LIB3DS_TARGET_NODE;
00112 lib3ds_matrix_identity(node->matrix);
00113 return(node);
00114 }
00115
00116
00127 Lib3dsNode*
00128 lib3ds_node_new_light()
00129 {
00130 Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);
00131 node->type=LIB3DS_LIGHT_NODE;
00132 lib3ds_matrix_identity(node->matrix);
00133 return(node);
00134 }
00135
00136
00147 Lib3dsNode*
00148 lib3ds_node_new_spot()
00149 {
00150 Lib3dsNode *node=(Lib3dsNode*)calloc(sizeof(Lib3dsNode), 1);
00151 node->type=LIB3DS_SPOT_NODE;
00152 lib3ds_matrix_identity(node->matrix);
00153 return(node);
00154 }
00155
00156
00157 static void
00158 free_node_and_childs(Lib3dsNode *node)
00159 {
00160 ASSERT(node);
00161 switch (node->type) {
00162 case LIB3DS_UNKNOWN_NODE:
00163 break;
00164 case LIB3DS_AMBIENT_NODE:
00165 {
00166 Lib3dsAmbientData *n=&node->data.ambient;
00167 lib3ds_lin3_track_free_keys(&n->col_track);
00168 }
00169 break;
00170 case LIB3DS_OBJECT_NODE:
00171 {
00172 Lib3dsObjectData *n=&node->data.object;
00173
00174 lib3ds_lin3_track_free_keys(&n->pos_track);
00175 lib3ds_quat_track_free_keys(&n->rot_track);
00176 lib3ds_lin3_track_free_keys(&n->scl_track);
00177 lib3ds_bool_track_free_keys(&n->hide_track);
00178 lib3ds_morph_track_free_keys(&n->morph_track);
00179 }
00180 break;
00181 case LIB3DS_CAMERA_NODE:
00182 {
00183 Lib3dsCameraData *n=&node->data.camera;
00184 lib3ds_lin3_track_free_keys(&n->pos_track);
00185 lib3ds_lin1_track_free_keys(&n->fov_track);
00186 lib3ds_lin1_track_free_keys(&n->roll_track);
00187 }
00188 break;
00189 case LIB3DS_TARGET_NODE:
00190 {
00191 Lib3dsTargetData *n=&node->data.target;
00192 lib3ds_lin3_track_free_keys(&n->pos_track);
00193 }
00194 break;
00195 case LIB3DS_LIGHT_NODE:
00196 {
00197 Lib3dsLightData *n=&node->data.light;
00198 lib3ds_lin3_track_free_keys(&n->pos_track);
00199 lib3ds_lin3_track_free_keys(&n->col_track);
00200 lib3ds_lin1_track_free_keys(&n->hotspot_track);
00201 lib3ds_lin1_track_free_keys(&n->falloff_track);
00202 lib3ds_lin1_track_free_keys(&n->roll_track);
00203 }
00204 break;
00205 case LIB3DS_SPOT_NODE:
00206 {
00207 Lib3dsSpotData *n=&node->data.spot;
00208 lib3ds_lin3_track_free_keys(&n->pos_track);
00209 }
00210 break;
00211 }
00212 {
00213 Lib3dsNode *p,*q;
00214 for (p=node->childs; p; p=q) {
00215 q=p->next;
00216 free_node_and_childs(p);
00217 }
00218 }
00219 node->type=LIB3DS_UNKNOWN_NODE;
00220 free(node);
00221 }
00222
00223
00231 void
00232 lib3ds_node_free(Lib3dsNode *node)
00233 {
00234 ASSERT(node);
00235 free_node_and_childs(node);
00236 }
00237
00238
00250 void
00251 lib3ds_node_eval(Lib3dsNode *node, Lib3dsFloat t)
00252 {
00253 ASSERT(node);
00254 switch (node->type) {
00255 case LIB3DS_UNKNOWN_NODE:
00256 {
00257 ASSERT(LIB3DS_FALSE);
00258 }
00259 break;
00260 case LIB3DS_AMBIENT_NODE:
00261 {
00262 Lib3dsAmbientData *n=&node->data.ambient;
00263 if (node->parent) {
00264 lib3ds_matrix_copy(node->matrix, node->parent->matrix);
00265 }
00266 else {
00267 lib3ds_matrix_identity(node->matrix);
00268 }
00269 lib3ds_lin3_track_eval(&n->col_track, n->col, t);
00270 }
00271 break;
00272 case LIB3DS_OBJECT_NODE:
00273 {
00274 Lib3dsMatrix M;
00275 Lib3dsObjectData *n=&node->data.object;
00276
00277 lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);
00278 lib3ds_quat_track_eval(&n->rot_track, n->rot, t);
00279 if (n->scl_track.keyL) {
00280 lib3ds_lin3_track_eval(&n->scl_track, n->scl, t);
00281 }
00282 else {
00283 n->scl[0] = n->scl[1] = n->scl[2] = 1.0f;
00284 }
00285 lib3ds_bool_track_eval(&n->hide_track, &n->hide, t);
00286 lib3ds_morph_track_eval(&n->morph_track, n->morph, t);
00287
00288 lib3ds_matrix_identity(M);
00289 lib3ds_matrix_translate(M, n->pos);
00290 lib3ds_matrix_rotate(M, n->rot);
00291 lib3ds_matrix_scale(M, n->scl);
00292
00293 if (node->parent) {
00294 lib3ds_matrix_copy(node->matrix, node->parent->matrix);
00295 lib3ds_matrix_mult(node->matrix, M);
00296 }
00297 else {
00298 lib3ds_matrix_copy(node->matrix, M);
00299 }
00300 }
00301 break;
00302 case LIB3DS_CAMERA_NODE:
00303 {
00304 Lib3dsCameraData *n=&node->data.camera;
00305 lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);
00306 lib3ds_lin1_track_eval(&n->fov_track, &n->fov, t);
00307 lib3ds_lin1_track_eval(&n->roll_track, &n->roll, t);
00308 if (node->parent) {
00309 lib3ds_matrix_copy(node->matrix, node->parent->matrix);
00310 }
00311 else {
00312 lib3ds_matrix_identity(node->matrix);
00313 }
00314 lib3ds_matrix_translate(node->matrix, n->pos);
00315 }
00316 break;
00317 case LIB3DS_TARGET_NODE:
00318 {
00319 Lib3dsTargetData *n=&node->data.target;
00320 lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);
00321 if (node->parent) {
00322 lib3ds_matrix_copy(node->matrix, node->parent->matrix);
00323 }
00324 else {
00325 lib3ds_matrix_identity(node->matrix);
00326 }
00327 lib3ds_matrix_translate(node->matrix, n->pos);
00328 }
00329 break;
00330 case LIB3DS_LIGHT_NODE:
00331 {
00332 Lib3dsLightData *n=&node->data.light;
00333 lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);
00334 lib3ds_lin3_track_eval(&n->col_track, n->col, t);
00335 lib3ds_lin1_track_eval(&n->hotspot_track, &n->hotspot, t);
00336 lib3ds_lin1_track_eval(&n->falloff_track, &n->falloff, t);
00337 lib3ds_lin1_track_eval(&n->roll_track, &n->roll, t);
00338 if (node->parent) {
00339 lib3ds_matrix_copy(node->matrix, node->parent->matrix);
00340 }
00341 else {
00342 lib3ds_matrix_identity(node->matrix);
00343 }
00344 lib3ds_matrix_translate(node->matrix, n->pos);
00345 }
00346 break;
00347 case LIB3DS_SPOT_NODE:
00348 {
00349 Lib3dsSpotData *n=&node->data.spot;
00350 lib3ds_lin3_track_eval(&n->pos_track, n->pos, t);
00351 if (node->parent) {
00352 lib3ds_matrix_copy(node->matrix, node->parent->matrix);
00353 }
00354 else {
00355 lib3ds_matrix_identity(node->matrix);
00356 }
00357 lib3ds_matrix_translate(node->matrix, n->pos);
00358 }
00359 break;
00360 }
00361 {
00362 Lib3dsNode *p;
00363
00364 for (p=node->childs; p!=0; p=p->next) {
00365 lib3ds_node_eval(p, t);
00366 }
00367 }
00368 }
00369
00370
00385 Lib3dsNode*
00386 lib3ds_node_by_name(Lib3dsNode *node, const char* name, Lib3dsNodeTypes type)
00387 {
00388 Lib3dsNode *p,*q;
00389
00390 for (p=node->childs; p!=0; p=p->next) {
00391 if ((p->type==type) && (strcmp(p->name, name)==0)) {
00392 return(p);
00393 }
00394 q=lib3ds_node_by_name(p, name, type);
00395 if (q) {
00396 return(q);
00397 }
00398 }
00399 return(0);
00400 }
00401
00402
00415 Lib3dsNode*
00416 lib3ds_node_by_id(Lib3dsNode *node, Lib3dsWord node_id)
00417 {
00418 Lib3dsNode *p,*q;
00419
00420 for (p=node->childs; p!=0; p=p->next) {
00421 if (p->node_id==node_id) {
00422 return(p);
00423 }
00424 q=lib3ds_node_by_id(p, node_id);
00425 if (q) {
00426 return(q);
00427 }
00428 }
00429 return(0);
00430 }
00431
00432
00433 static const char* node_names_table[]= {
00434 "***Unknown***",
00435 "Ambient",
00436 "Object",
00437 "Camera",
00438 "Target",
00439 "Light",
00440 "Spot"
00441 };
00442
00443
00452 void
00453 lib3ds_node_dump(Lib3dsNode *node, Lib3dsIntd level)
00454 {
00455 Lib3dsNode *p;
00456 char l[128];
00457
00458 ASSERT(node);
00459 memset(l, ' ', 2*level);
00460 l[2*level]=0;
00461
00462 if (node->type==LIB3DS_OBJECT_NODE) {
00463 printf("%s%s [%s] (%s)\n",
00464 l,
00465 node->name,
00466 node->data.object.instance,
00467 node_names_table[node->type]
00468 );
00469 }
00470 else {
00471 printf("%s%s (%s)\n",
00472 l,
00473 node->name,
00474 node_names_table[node->type]
00475 );
00476 }
00477
00478 for (p=node->childs; p!=0; p=p->next) {
00479 lib3ds_node_dump(p, level+1);
00480 }
00481 }
00482
00483
00487 Lib3dsBool
00488 lib3ds_node_read(Lib3dsNode *node, Lib3dsFile *file, Lib3dsIo *io)
00489 {
00490 Lib3dsChunk c;
00491 Lib3dsWord chunk;
00492
00493 ASSERT(node);
00494 if (!lib3ds_chunk_read_start(&c, 0, io)) {
00495 return(LIB3DS_FALSE);
00496 }
00497 switch (c.chunk) {
00498 case LIB3DS_AMBIENT_NODE_TAG:
00499 case LIB3DS_OBJECT_NODE_TAG:
00500 case LIB3DS_CAMERA_NODE_TAG:
00501 case LIB3DS_TARGET_NODE_TAG:
00502 case LIB3DS_LIGHT_NODE_TAG:
00503 case LIB3DS_SPOTLIGHT_NODE_TAG:
00504 case LIB3DS_L_TARGET_NODE_TAG:
00505 break;
00506 default:
00507 return(LIB3DS_FALSE);
00508 }
00509
00510 while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) {
00511 switch (chunk) {
00512 case LIB3DS_NODE_ID:
00513 {
00514 node->node_id=lib3ds_io_read_word(io);
00515 lib3ds_chunk_dump_info(" ID = %d", (short)node->node_id);
00516 }
00517 break;
00518 case LIB3DS_NODE_HDR:
00519 {
00520 if (!lib3ds_io_read_string(io, node->name, 64)) {
00521 return(LIB3DS_FALSE);
00522 }
00523 node->flags1=lib3ds_io_read_word(io);
00524 node->flags2=lib3ds_io_read_word(io);
00525 node->parent_id=lib3ds_io_read_word(io);
00526 lib3ds_chunk_dump_info(" NAME =%s", node->name);
00527 lib3ds_chunk_dump_info(" PARENT=%d", (short)node->parent_id);
00528 }
00529 break;
00530 case LIB3DS_PIVOT:
00531 {
00532 if (node->type==LIB3DS_OBJECT_NODE) {
00533 int i;
00534 for (i=0; i<3; ++i) {
00535 node->data.object.pivot[i]=lib3ds_io_read_float(io);
00536 }
00537 }
00538 else {
00539 lib3ds_chunk_unknown(chunk);
00540 }
00541 }
00542 break;
00543 case LIB3DS_INSTANCE_NAME:
00544 {
00545 if (node->type==LIB3DS_OBJECT_NODE) {
00546 if (!lib3ds_io_read_string(io, node->data.object.instance, 64)) {
00547 return(LIB3DS_FALSE);
00548 }
00549 }
00550 else {
00551 lib3ds_chunk_unknown(chunk);
00552 }
00553 }
00554 break;
00555 case LIB3DS_BOUNDBOX:
00556 {
00557 if (node->type==LIB3DS_OBJECT_NODE) {
00558 int i;
00559 for (i=0; i<3; ++i) {
00560 node->data.object.bbox_min[i]=lib3ds_io_read_float(io);
00561 }
00562 for (i=0; i<3; ++i) {
00563 node->data.object.bbox_max[i]=lib3ds_io_read_float(io);
00564 }
00565 }
00566 else {
00567 lib3ds_chunk_unknown(chunk);
00568 }
00569 }
00570 break;
00571 case LIB3DS_COL_TRACK_TAG:
00572 {
00573 Lib3dsBool result=LIB3DS_TRUE;
00574
00575 switch (node->type) {
00576 case LIB3DS_AMBIENT_NODE:
00577 result=lib3ds_lin3_track_read(&node->data.ambient.col_track, io);
00578 break;
00579 case LIB3DS_LIGHT_NODE:
00580 result=lib3ds_lin3_track_read(&node->data.light.col_track, io);
00581 break;
00582 default:
00583 lib3ds_chunk_unknown(chunk);
00584 }
00585 if (!result) {
00586 return(LIB3DS_FALSE);
00587 }
00588 }
00589 break;
00590 case LIB3DS_POS_TRACK_TAG:
00591 {
00592 Lib3dsBool result=LIB3DS_TRUE;
00593
00594 switch (node->type) {
00595 case LIB3DS_OBJECT_NODE:
00596 result=lib3ds_lin3_track_read(&node->data.object.pos_track, io);
00597 break;
00598 case LIB3DS_CAMERA_NODE:
00599 result=lib3ds_lin3_track_read(&node->data.camera.pos_track, io);
00600 break;
00601 case LIB3DS_TARGET_NODE:
00602 result=lib3ds_lin3_track_read(&node->data.target.pos_track, io);
00603 break;
00604 case LIB3DS_LIGHT_NODE:
00605 result=lib3ds_lin3_track_read(&node->data.light.pos_track, io);
00606 break;
00607 case LIB3DS_SPOT_NODE:
00608 result=lib3ds_lin3_track_read(&node->data.spot.pos_track, io);
00609 break;
00610 default:
00611 lib3ds_chunk_unknown(chunk);
00612 }
00613 if (!result) {
00614 return(LIB3DS_FALSE);
00615 }
00616 }
00617 break;
00618 case LIB3DS_ROT_TRACK_TAG:
00619 {
00620 if (node->type==LIB3DS_OBJECT_NODE) {
00621 if (!lib3ds_quat_track_read(&node->data.object.rot_track, io)) {
00622 return(LIB3DS_FALSE);
00623 }
00624 }
00625 else {
00626 lib3ds_chunk_unknown(chunk);
00627 }
00628 }
00629 break;
00630 case LIB3DS_SCL_TRACK_TAG:
00631 {
00632 if (node->type==LIB3DS_OBJECT_NODE) {
00633 if (!lib3ds_lin3_track_read(&node->data.object.scl_track, io)) {
00634 return(LIB3DS_FALSE);
00635 }
00636 }
00637 else {
00638 lib3ds_chunk_unknown(chunk);
00639 }
00640 }
00641 break;
00642 case LIB3DS_FOV_TRACK_TAG:
00643 {
00644 if (node->type==LIB3DS_CAMERA_NODE) {
00645 if (!lib3ds_lin1_track_read(&node->data.camera.fov_track, io)) {
00646 return(LIB3DS_FALSE);
00647 }
00648 }
00649 else {
00650 lib3ds_chunk_unknown(chunk);
00651 }
00652 }
00653 break;
00654 case LIB3DS_HOT_TRACK_TAG:
00655 {
00656 if (node->type==LIB3DS_LIGHT_NODE) {
00657 if (!lib3ds_lin1_track_read(&node->data.light.hotspot_track, io)) {
00658 return(LIB3DS_FALSE);
00659 }
00660 }
00661 else {
00662 lib3ds_chunk_unknown(chunk);
00663 }
00664 }
00665 break;
00666 case LIB3DS_FALL_TRACK_TAG:
00667 {
00668 if (node->type==LIB3DS_LIGHT_NODE) {
00669 if (!lib3ds_lin1_track_read(&node->data.light.falloff_track, io)) {
00670 return(LIB3DS_FALSE);
00671 }
00672 }
00673 else {
00674 lib3ds_chunk_unknown(chunk);
00675 }
00676 }
00677 break;
00678 case LIB3DS_ROLL_TRACK_TAG:
00679 {
00680 Lib3dsBool result=LIB3DS_TRUE;
00681
00682 switch (node->type) {
00683 case LIB3DS_CAMERA_NODE:
00684 result=lib3ds_lin1_track_read(&node->data.camera.roll_track, io);
00685 break;
00686 case LIB3DS_LIGHT_NODE:
00687 result=lib3ds_lin1_track_read(&node->data.light.roll_track, io);
00688 break;
00689 default:
00690 lib3ds_chunk_unknown(chunk);
00691 }
00692 if (!result) {
00693 return(LIB3DS_FALSE);
00694 }
00695 }
00696 break;
00697 case LIB3DS_HIDE_TRACK_TAG:
00698 {
00699 if (node->type==LIB3DS_OBJECT_NODE) {
00700 if (!lib3ds_bool_track_read(&node->data.object.hide_track, io)) {
00701 return(LIB3DS_FALSE);
00702 }
00703 }
00704 else {
00705 lib3ds_chunk_unknown(chunk);
00706 }
00707 }
00708 break;
00709 case LIB3DS_MORPH_SMOOTH:
00710 {
00711 if (node->type==LIB3DS_OBJECT_NODE) {
00712 node->data.object.morph_smooth=lib3ds_io_read_float(io);
00713 }
00714 else {
00715 lib3ds_chunk_unknown(chunk);
00716 }
00717 }
00718 break;
00719 case LIB3DS_MORPH_TRACK_TAG:
00720 {
00721 if (node->type==LIB3DS_OBJECT_NODE) {
00722 if (!lib3ds_morph_track_read(&node->data.object.morph_track, io)) {
00723 return(LIB3DS_FALSE);
00724 }
00725 }
00726 else {
00727 lib3ds_chunk_unknown(chunk);
00728 }
00729 }
00730 break;
00731 default:
00732 lib3ds_chunk_unknown(chunk);
00733 }
00734 }
00735
00736 lib3ds_chunk_read_end(&c, io);
00737 return(LIB3DS_TRUE);
00738 }
00739
00740
00744 Lib3dsBool
00745 lib3ds_node_write(Lib3dsNode *node, Lib3dsFile *file, Lib3dsIo *io)
00746 {
00747 Lib3dsChunk c;
00748
00749 switch (node->type) {
00750 case LIB3DS_AMBIENT_NODE:
00751 c.chunk=LIB3DS_AMBIENT_NODE_TAG;
00752 break;
00753 case LIB3DS_OBJECT_NODE:
00754 c.chunk=LIB3DS_OBJECT_NODE_TAG;
00755 break;
00756 case LIB3DS_CAMERA_NODE:
00757 c.chunk=LIB3DS_CAMERA_NODE_TAG;
00758 break;
00759 case LIB3DS_TARGET_NODE:
00760 c.chunk=LIB3DS_TARGET_NODE_TAG;
00761 break;
00762 case LIB3DS_LIGHT_NODE:
00763 if (lib3ds_file_node_by_name(file, node->name, LIB3DS_SPOT_NODE)) {
00764 c.chunk=LIB3DS_SPOTLIGHT_NODE_TAG;
00765 }
00766 else {
00767 c.chunk=LIB3DS_LIGHT_NODE_TAG;
00768 }
00769 break;
00770 case LIB3DS_SPOT_NODE:
00771 c.chunk=LIB3DS_L_TARGET_NODE_TAG;
00772 break;
00773 default:
00774 return(LIB3DS_FALSE);
00775 }
00776 if (!lib3ds_chunk_write_start(&c,io)) {
00777 return(LIB3DS_FALSE);
00778 }
00779
00780 {
00781 Lib3dsChunk c;
00782 c.chunk=LIB3DS_NODE_ID;
00783 c.size=8;
00784 lib3ds_chunk_write(&c,io);
00785 lib3ds_io_write_intw(io, node->node_id);
00786 }
00787
00788 {
00789 Lib3dsChunk c;
00790 c.chunk=LIB3DS_NODE_HDR;
00791 c.size=6+ 1+(Lib3dsDword)strlen(node->name) +2+2+2;
00792 lib3ds_chunk_write(&c,io);
00793 lib3ds_io_write_string(io, node->name);
00794 lib3ds_io_write_word(io, node->flags1);
00795 lib3ds_io_write_word(io, node->flags2);
00796 lib3ds_io_write_word(io, node->parent_id);
00797 }
00798
00799 switch (c.chunk) {
00800 case LIB3DS_AMBIENT_NODE_TAG:
00801 {
00802 Lib3dsChunk c;
00803 c.chunk=LIB3DS_COL_TRACK_TAG;
00804 if (!lib3ds_chunk_write_start(&c,io)) {
00805 return(LIB3DS_FALSE);
00806 }
00807 if (!lib3ds_lin3_track_write(&node->data.ambient.col_track,io)) {
00808 return(LIB3DS_FALSE);
00809 }
00810 if (!lib3ds_chunk_write_end(&c,io)) {
00811 return(LIB3DS_FALSE);
00812 }
00813 }
00814 break;
00815 case LIB3DS_OBJECT_NODE_TAG:
00816 {
00817 Lib3dsChunk c;
00818 c.chunk=LIB3DS_PIVOT;
00819 c.size=18;
00820 lib3ds_chunk_write(&c,io);
00821 lib3ds_io_write_vector(io, node->data.object.pivot);
00822 }
00823 {
00824 Lib3dsChunk c;
00825 const char *name;
00826 if (strlen(node->data.object.instance)) {
00827 name=node->data.object.instance;
00828
00829 c.chunk=LIB3DS_INSTANCE_NAME;
00830 c.size=6+1+(Lib3dsDword)strlen(name);
00831 lib3ds_chunk_write(&c,io);
00832 lib3ds_io_write_string(io, name);
00833 }
00834 }
00835 {
00836 int i;
00837 for (i=0; i<3; ++i) {
00838 if ((fabs(node->data.object.bbox_min[i])>LIB3DS_EPSILON) ||
00839 (fabs(node->data.object.bbox_max[i])>LIB3DS_EPSILON)) {
00840 break;
00841 }
00842 }
00843
00844 if (i<3) {
00845 Lib3dsChunk c;
00846 c.chunk=LIB3DS_BOUNDBOX;
00847 c.size=30;
00848 lib3ds_chunk_write(&c,io);
00849 lib3ds_io_write_vector(io, node->data.object.bbox_min);
00850 lib3ds_io_write_vector(io, node->data.object.bbox_max);
00851 }
00852 }
00853 {
00854 Lib3dsChunk c;
00855 c.chunk=LIB3DS_POS_TRACK_TAG;
00856 if (!lib3ds_chunk_write_start(&c,io)) {
00857 return(LIB3DS_FALSE);
00858 }
00859 if (!lib3ds_lin3_track_write(&node->data.object.pos_track,io)) {
00860 return(LIB3DS_FALSE);
00861 }
00862 if (!lib3ds_chunk_write_end(&c,io)) {
00863 return(LIB3DS_FALSE);
00864 }
00865 }
00866 {
00867 Lib3dsChunk c;
00868 c.chunk=LIB3DS_ROT_TRACK_TAG;
00869 if (!lib3ds_chunk_write_start(&c,io)) {
00870 return(LIB3DS_FALSE);
00871 }
00872 if (!lib3ds_quat_track_write(&node->data.object.rot_track,io)) {
00873 return(LIB3DS_FALSE);
00874 }
00875 if (!lib3ds_chunk_write_end(&c,io)) {
00876 return(LIB3DS_FALSE);
00877 }
00878 }
00879 {
00880 Lib3dsChunk c;
00881 c.chunk=LIB3DS_SCL_TRACK_TAG;
00882 if (!lib3ds_chunk_write_start(&c,io)) {
00883 return(LIB3DS_FALSE);
00884 }
00885 if (!lib3ds_lin3_track_write(&node->data.object.scl_track,io)) {
00886 return(LIB3DS_FALSE);
00887 }
00888 if (!lib3ds_chunk_write_end(&c,io)) {
00889 return(LIB3DS_FALSE);
00890 }
00891 }
00892 if (node->data.object.hide_track.keyL) {
00893 Lib3dsChunk c;
00894 c.chunk=LIB3DS_HIDE_TRACK_TAG;
00895 if (!lib3ds_chunk_write_start(&c,io)) {
00896 return(LIB3DS_FALSE);
00897 }
00898 if (!lib3ds_bool_track_write(&node->data.object.hide_track,io)) {
00899 return(LIB3DS_FALSE);
00900 }
00901 if (!lib3ds_chunk_write_end(&c,io)) {
00902 return(LIB3DS_FALSE);
00903 }
00904 }
00905 if (fabs(node->data.object.morph_smooth)>LIB3DS_EPSILON){
00906 Lib3dsChunk c;
00907 c.chunk=LIB3DS_MORPH_SMOOTH;
00908 c.size=10;
00909 lib3ds_chunk_write(&c,io);
00910 lib3ds_io_write_float(io, node->data.object.morph_smooth);
00911 }
00912 break;
00913 case LIB3DS_CAMERA_NODE_TAG:
00914 {
00915 Lib3dsChunk c;
00916 c.chunk=LIB3DS_POS_TRACK_TAG;
00917 if (!lib3ds_chunk_write_start(&c,io)) {
00918 return(LIB3DS_FALSE);
00919 }
00920 if (!lib3ds_lin3_track_write(&node->data.camera.pos_track,io)) {
00921 return(LIB3DS_FALSE);
00922 }
00923 if (!lib3ds_chunk_write_end(&c,io)) {
00924 return(LIB3DS_FALSE);
00925 }
00926 }
00927 {
00928 Lib3dsChunk c;
00929 c.chunk=LIB3DS_FOV_TRACK_TAG;
00930 if (!lib3ds_chunk_write_start(&c,io)) {
00931 return(LIB3DS_FALSE);
00932 }
00933 if (!lib3ds_lin1_track_write(&node->data.camera.fov_track,io)) {
00934 return(LIB3DS_FALSE);
00935 }
00936 if (!lib3ds_chunk_write_end(&c,io)) {
00937 return(LIB3DS_FALSE);
00938 }
00939 }
00940 {
00941 Lib3dsChunk c;
00942 c.chunk=LIB3DS_ROLL_TRACK_TAG;
00943 if (!lib3ds_chunk_write_start(&c,io)) {
00944 return(LIB3DS_FALSE);
00945 }
00946 if (!lib3ds_lin1_track_write(&node->data.camera.roll_track,io)) {
00947 return(LIB3DS_FALSE);
00948 }
00949 if (!lib3ds_chunk_write_end(&c,io)) {
00950 return(LIB3DS_FALSE);
00951 }
00952 }
00953 break;
00954 case LIB3DS_TARGET_NODE_TAG:
00955 {
00956 Lib3dsChunk c;
00957 c.chunk=LIB3DS_POS_TRACK_TAG;
00958 if (!lib3ds_chunk_write_start(&c,io)) {
00959 return(LIB3DS_FALSE);
00960 }
00961 if (!lib3ds_lin3_track_write(&node->data.target.pos_track,io)) {
00962 return(LIB3DS_FALSE);
00963 }
00964 if (!lib3ds_chunk_write_end(&c,io)) {
00965 return(LIB3DS_FALSE);
00966 }
00967 }
00968 break;
00969 case LIB3DS_LIGHT_NODE_TAG:
00970 {
00971 Lib3dsChunk c;
00972 c.chunk=LIB3DS_POS_TRACK_TAG;
00973 if (!lib3ds_chunk_write_start(&c,io)) {
00974 return(LIB3DS_FALSE);
00975 }
00976 if (!lib3ds_lin3_track_write(&node->data.light.pos_track,io)) {
00977 return(LIB3DS_FALSE);
00978 }
00979 if (!lib3ds_chunk_write_end(&c,io)) {
00980 return(LIB3DS_FALSE);
00981 }
00982 }
00983 {
00984 Lib3dsChunk c;
00985 c.chunk=LIB3DS_COL_TRACK_TAG;
00986 if (!lib3ds_chunk_write_start(&c,io)) {
00987 return(LIB3DS_FALSE);
00988 }
00989 if (!lib3ds_lin3_track_write(&node->data.light.col_track,io)) {
00990 return(LIB3DS_FALSE);
00991 }
00992 if (!lib3ds_chunk_write_end(&c,io)) {
00993 return(LIB3DS_FALSE);
00994 }
00995 }
00996 break;
00997 case LIB3DS_SPOTLIGHT_NODE_TAG:
00998 {
00999 Lib3dsChunk c;
01000 c.chunk=LIB3DS_POS_TRACK_TAG;
01001 if (!lib3ds_chunk_write_start(&c,io)) {
01002 return(LIB3DS_FALSE);
01003 }
01004 if (!lib3ds_lin3_track_write(&node->data.light.pos_track,io)) {
01005 return(LIB3DS_FALSE);
01006 }
01007 if (!lib3ds_chunk_write_end(&c,io)) {
01008 return(LIB3DS_FALSE);
01009 }
01010 }
01011 {
01012 Lib3dsChunk c;
01013 c.chunk=LIB3DS_COL_TRACK_TAG;
01014 if (!lib3ds_chunk_write_start(&c,io)) {
01015 return(LIB3DS_FALSE);
01016 }
01017 if (!lib3ds_lin3_track_write(&node->data.light.col_track,io)) {
01018 return(LIB3DS_FALSE);
01019 }
01020 if (!lib3ds_chunk_write_end(&c,io)) {
01021 return(LIB3DS_FALSE);
01022 }
01023 }
01024 {
01025 Lib3dsChunk c;
01026 c.chunk=LIB3DS_HOT_TRACK_TAG;
01027 if (!lib3ds_chunk_write_start(&c,io)) {
01028 return(LIB3DS_FALSE);
01029 }
01030 if (!lib3ds_lin1_track_write(&node->data.light.hotspot_track,io)) {
01031 return(LIB3DS_FALSE);
01032 }
01033 if (!lib3ds_chunk_write_end(&c,io)) {
01034 return(LIB3DS_FALSE);
01035 }
01036 }
01037 {
01038 Lib3dsChunk c;
01039 c.chunk=LIB3DS_FALL_TRACK_TAG;
01040 if (!lib3ds_chunk_write_start(&c,io)) {
01041 return(LIB3DS_FALSE);
01042 }
01043 if (!lib3ds_lin1_track_write(&node->data.light.falloff_track,io)) {
01044 return(LIB3DS_FALSE);
01045 }
01046 if (!lib3ds_chunk_write_end(&c,io)) {
01047 return(LIB3DS_FALSE);
01048 }
01049 }
01050 {
01051 Lib3dsChunk c;
01052 c.chunk=LIB3DS_ROLL_TRACK_TAG;
01053 if (!lib3ds_chunk_write_start(&c,io)) {
01054 return(LIB3DS_FALSE);
01055 }
01056 if (!lib3ds_lin1_track_write(&node->data.light.roll_track,io)) {
01057 return(LIB3DS_FALSE);
01058 }
01059 if (!lib3ds_chunk_write_end(&c,io)) {
01060 return(LIB3DS_FALSE);
01061 }
01062 }
01063 break;
01064 case LIB3DS_L_TARGET_NODE_TAG:
01065 {
01066 Lib3dsChunk c;
01067 c.chunk=LIB3DS_POS_TRACK_TAG;
01068 if (!lib3ds_chunk_write_start(&c,io)) {
01069 return(LIB3DS_FALSE);
01070 }
01071 if (!lib3ds_lin3_track_write(&node->data.spot.pos_track,io)) {
01072 return(LIB3DS_FALSE);
01073 }
01074 if (!lib3ds_chunk_write_end(&c,io)) {
01075 return(LIB3DS_FALSE);
01076 }
01077 }
01078 break;
01079 default:
01080 return(LIB3DS_FALSE);
01081 }
01082
01083 if (!lib3ds_chunk_write_end(&c,io)) {
01084 return(LIB3DS_FALSE);
01085 }
01086 return(LIB3DS_TRUE);
01087 }
01088