C:/jkyprian/devel/lib3ds/lib3ds/node.c

00001 /*
00002  * The 3D Studio File Format Library
00003  * Copyright (C) 1996-2007 by Jan Eric Kyprianidis <www.kyprianidis.com>
00004  * All rights reserved.
00005  *
00006  * This program is  free  software;  you can redistribute it and/or modify it
00007  * under the terms of the  GNU Lesser General Public License  as published by 
00008  * the  Free Software Foundation;  either version 2.1 of the License,  or (at 
00009  * your option) any later version.
00010  *
00011  * This  program  is  distributed in  the  hope that it will  be useful,  but
00012  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00013  * or  FITNESS FOR A  PARTICULAR PURPOSE.  See the  GNU Lesser General Public  
00014  * License for more details.
00015  *
00016  * You should  have received  a copy of the GNU Lesser General Public License
00017  * along with  this program;  if not, write to the  Free Software Foundation,
00018  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019  *
00020  * $Id: node.c,v 1.20 2007/06/20 17:04:08 jeh Exp $
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   { /*---- LIB3DS_NODE_ID ----*/
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   { /*---- LIB3DS_NODE_HDR ----*/
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       { /*---- LIB3DS_COL_TRACK_TAG ----*/
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       { /*---- LIB3DS_PIVOT ----*/
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       { /*---- LIB3DS_INSTANCE_NAME ----*/
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) { /*---- LIB3DS_BOUNDBOX ----*/
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       { /*---- LIB3DS_POS_TRACK_TAG ----*/
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       { /*---- LIB3DS_ROT_TRACK_TAG ----*/
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       { /*---- LIB3DS_SCL_TRACK_TAG ----*/
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) { /*---- LIB3DS_HIDE_TRACK_TAG ----*/
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){ /*---- LIB3DS_MORPH_SMOOTH ----*/
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       { /*---- LIB3DS_POS_TRACK_TAG ----*/
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       { /*---- LIB3DS_FOV_TRACK_TAG ----*/
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       { /*---- LIB3DS_ROLL_TRACK_TAG ----*/
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       { /*---- LIB3DS_POS_TRACK_TAG ----*/
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       { /*---- LIB3DS_POS_TRACK_TAG ----*/
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       { /*---- LIB3DS_COL_TRACK_TAG ----*/
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       { /*---- LIB3DS_POS_TRACK_TAG ----*/
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       { /*---- LIB3DS_COL_TRACK_TAG ----*/
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       { /*---- LIB3DS_HOT_TRACK_TAG ----*/
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       { /*---- LIB3DS_FALL_TRACK_TAG ----*/
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       { /*---- LIB3DS_ROLL_TRACK_TAG ----*/
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       { /*---- LIB3DS_POS_TRACK_TAG ----*/
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 

Hosted by
SourceForge.net Logo
Generated at Wed Jun 20 18:51:36 2007 by Doxygen 1.5.2