Show
Ignore:
Timestamp:
04/22/09 17:46:24 (5 years ago)
Author:
robert
Message:

From Neil Hughes, converted across to use istream for reading data from file to enable reading .3ds files over http (use OSG's libcurl plugin).

From Robert Osfield, ammendments of the above to better support reading of files from local directories.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/3ds/node.cpp

    r1563 r10076  
    408408 */ 
    409409Lib3dsBool 
    410 lib3ds_node_read(Lib3dsNode *node, Lib3dsFile *, FILE *f) 
     410lib3ds_node_read(Lib3dsNode *node, Lib3dsFile *, iostream *strm) 
    411411{ 
    412412  Lib3dsChunk c; 
     
    414414 
    415415  ASSERT(node); 
    416   if (!lib3ds_chunk_read_start(&c, 0, f)) { 
     416  if (!lib3ds_chunk_read_start(&c, 0, strm)) { 
    417417    return(LIB3DS_FALSE); 
    418418  } 
     
    430430  } 
    431431 
    432   while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { 
     432  while ((chunk=lib3ds_chunk_read_next(&c, strm))!=0) { 
    433433    switch (chunk) { 
    434434      case LIB3DS_NODE_ID: 
    435435        { 
    436           node->node_id=lib3ds_word_read(f); 
     436          node->node_id=lib3ds_word_read(strm); 
    437437          lib3ds_chunk_dump_info("  ID = %d", (short)node->node_id); 
    438438        } 
     
    440440      case LIB3DS_NODE_HDR: 
    441441        { 
    442           if (!lib3ds_string_read(node->name, 64, f)) { 
     442          if (!lib3ds_string_read(node->name, 64, strm)) { 
    443443            return(LIB3DS_FALSE); 
    444444          } 
    445           node->flags1=lib3ds_word_read(f); 
    446           node->flags2=lib3ds_word_read(f); 
    447           node->parent_id=lib3ds_word_read(f); 
     445          node->flags1=lib3ds_word_read(strm); 
     446          node->flags2=lib3ds_word_read(strm); 
     447          node->parent_id=lib3ds_word_read(strm); 
    448448          lib3ds_chunk_dump_info("  NAME =%s", node->name); 
    449449          lib3ds_chunk_dump_info("  PARENT=%d", (short)node->parent_id); 
     
    455455            int i; 
    456456            for (i=0; i<3; ++i) { 
    457               node->data.object.pivot[i]=lib3ds_float_read(f); 
     457              node->data.object.pivot[i]=lib3ds_float_read(strm); 
    458458            } 
    459459          } 
     
    466466        { 
    467467          if (node->type==LIB3DS_OBJECT_NODE) { 
    468             if (!lib3ds_string_read(node->data.object.instance, 64, f)) { 
     468            if (!lib3ds_string_read(node->data.object.instance, 64, strm)) { 
    469469              return(LIB3DS_FALSE); 
    470470            } 
     
    480480            int i; 
    481481            for (i=0; i<3; ++i) { 
    482               node->data.object.bbox_min[i]=lib3ds_float_read(f); 
     482              node->data.object.bbox_min[i]=lib3ds_float_read(strm); 
    483483            } 
    484484            for (i=0; i<3; ++i) { 
    485               node->data.object.bbox_max[i]=lib3ds_float_read(f); 
     485              node->data.object.bbox_max[i]=lib3ds_float_read(strm); 
    486486            } 
    487487          } 
     
    497497          switch (node->type) { 
    498498            case LIB3DS_AMBIENT_NODE: 
    499               result=lib3ds_lin3_track_read(&node->data.ambient.col_track, f); 
     499              result=lib3ds_lin3_track_read(&node->data.ambient.col_track, strm); 
    500500              break; 
    501501            case LIB3DS_LIGHT_NODE: 
    502               result=lib3ds_lin3_track_read(&node->data.light.col_track, f); 
     502              result=lib3ds_lin3_track_read(&node->data.light.col_track, strm); 
    503503              break; 
    504504            default: 
     
    516516          switch (node->type) { 
    517517            case LIB3DS_OBJECT_NODE: 
    518               result=lib3ds_lin3_track_read(&node->data.object.pos_track, f); 
     518              result=lib3ds_lin3_track_read(&node->data.object.pos_track, strm); 
    519519              break; 
    520520            case LIB3DS_CAMERA_NODE: 
    521               result=lib3ds_lin3_track_read(&node->data.camera.pos_track, f); 
     521              result=lib3ds_lin3_track_read(&node->data.camera.pos_track, strm); 
    522522              break; 
    523523            case LIB3DS_TARGET_NODE: 
    524               result=lib3ds_lin3_track_read(&node->data.target.pos_track, f); 
     524              result=lib3ds_lin3_track_read(&node->data.target.pos_track, strm); 
    525525              break; 
    526526            case LIB3DS_LIGHT_NODE: 
    527               result=lib3ds_lin3_track_read(&node->data.light.pos_track, f); 
     527              result=lib3ds_lin3_track_read(&node->data.light.pos_track, strm); 
    528528              break; 
    529529            case LIB3DS_SPOT_NODE: 
    530               result=lib3ds_lin3_track_read(&node->data.spot.pos_track, f); 
     530              result=lib3ds_lin3_track_read(&node->data.spot.pos_track, strm); 
    531531              break; 
    532532            default: 
     
    541541        { 
    542542          if (node->type==LIB3DS_OBJECT_NODE) { 
    543             if (!lib3ds_quat_track_read(&node->data.object.rot_track, f)) { 
     543            if (!lib3ds_quat_track_read(&node->data.object.rot_track, strm)) { 
    544544              return(LIB3DS_FALSE); 
    545545            } 
     
    553553        { 
    554554          if (node->type==LIB3DS_OBJECT_NODE) { 
    555             if (!lib3ds_lin3_track_read(&node->data.object.scl_track, f)) { 
     555            if (!lib3ds_lin3_track_read(&node->data.object.scl_track, strm)) { 
    556556              return(LIB3DS_FALSE); 
    557557            } 
     
    565565        { 
    566566          if (node->type==LIB3DS_CAMERA_NODE) { 
    567             if (!lib3ds_lin1_track_read(&node->data.camera.fov_track, f)) { 
     567            if (!lib3ds_lin1_track_read(&node->data.camera.fov_track, strm)) { 
    568568              return(LIB3DS_FALSE); 
    569569            } 
     
    577577        { 
    578578          if (node->type==LIB3DS_LIGHT_NODE) { 
    579             if (!lib3ds_lin1_track_read(&node->data.light.hotspot_track, f)) { 
     579            if (!lib3ds_lin1_track_read(&node->data.light.hotspot_track, strm)) { 
    580580              return(LIB3DS_FALSE); 
    581581            } 
     
    589589        { 
    590590          if (node->type==LIB3DS_LIGHT_NODE) { 
    591             if (!lib3ds_lin1_track_read(&node->data.light.falloff_track, f)) { 
     591            if (!lib3ds_lin1_track_read(&node->data.light.falloff_track, strm)) { 
    592592              return(LIB3DS_FALSE); 
    593593            } 
     
    604604          switch (node->type) { 
    605605            case LIB3DS_CAMERA_NODE: 
    606               result=lib3ds_lin1_track_read(&node->data.camera.roll_track, f); 
     606              result=lib3ds_lin1_track_read(&node->data.camera.roll_track, strm); 
    607607              break; 
    608608            case LIB3DS_LIGHT_NODE: 
    609               result=lib3ds_lin1_track_read(&node->data.light.roll_track, f); 
     609              result=lib3ds_lin1_track_read(&node->data.light.roll_track, strm); 
    610610              break; 
    611611            default: 
     
    620620        { 
    621621          if (node->type==LIB3DS_OBJECT_NODE) { 
    622             if (!lib3ds_bool_track_read(&node->data.object.hide_track, f)) { 
     622            if (!lib3ds_bool_track_read(&node->data.object.hide_track, strm)) { 
    623623              return(LIB3DS_FALSE); 
    624624            } 
     
    632632        { 
    633633          if (node->type==LIB3DS_OBJECT_NODE) { 
    634             node->data.object.morph_smooth=lib3ds_float_read(f); 
     634            node->data.object.morph_smooth=lib3ds_float_read(strm); 
    635635          } 
    636636          else { 
     
    642642        { 
    643643          if (node->type==LIB3DS_OBJECT_NODE) { 
    644             if (!lib3ds_morph_track_read(&node->data.object.morph_track, f)) { 
     644            if (!lib3ds_morph_track_read(&node->data.object.morph_track, strm)) { 
    645645              return(LIB3DS_FALSE); 
    646646            } 
     
    656656  } 
    657657 
    658   lib3ds_chunk_read_end(&c, f); 
     658  lib3ds_chunk_read_end(&c, strm); 
    659659  return(LIB3DS_TRUE); 
    660660} 
     
    665665 */ 
    666666Lib3dsBool 
    667 lib3ds_node_write(Lib3dsNode *node, Lib3dsFile *file, FILE *f) 
     667lib3ds_node_write(Lib3dsNode *node, Lib3dsFile *file, iostream *strm) 
    668668{ 
    669669  Lib3dsChunk c; 
     
    696696      return(LIB3DS_FALSE); 
    697697  } 
    698   if (!lib3ds_chunk_write_start(&c,f)) { 
     698  if (!lib3ds_chunk_write_start(&c,strm)) { 
    699699    return(LIB3DS_FALSE); 
    700700  } 
     
    704704    c.chunk=LIB3DS_NODE_ID; 
    705705    c.size=8; 
    706     lib3ds_chunk_write(&c,f); 
    707     lib3ds_intw_write(node->node_id,f); 
     706    lib3ds_chunk_write(&c,strm); 
     707    lib3ds_intw_write(node->node_id,strm); 
    708708  } 
    709709 
     
    712712    c.chunk=LIB3DS_NODE_HDR; 
    713713    c.size=6+ 1+strlen(node->name) +2+2+2; 
    714     lib3ds_chunk_write(&c,f); 
    715     lib3ds_string_write(node->name,f); 
    716     lib3ds_word_write(node->flags1,f); 
    717     lib3ds_word_write(node->flags2,f); 
    718     lib3ds_word_write(node->parent_id,f); 
     714    lib3ds_chunk_write(&c,strm); 
     715    lib3ds_string_write(node->name,strm); 
     716    lib3ds_word_write(node->flags1,strm); 
     717    lib3ds_word_write(node->flags2,strm); 
     718    lib3ds_word_write(node->parent_id,strm); 
    719719  } 
    720720 
     
    724724        Lib3dsChunk c; 
    725725        c.chunk=LIB3DS_COL_TRACK_TAG; 
    726         if (!lib3ds_chunk_write_start(&c,f)) { 
    727           return(LIB3DS_FALSE); 
    728         } 
    729         if (!lib3ds_lin3_track_write(&node->data.ambient.col_track,f)) { 
    730           return(LIB3DS_FALSE); 
    731         } 
    732         if (!lib3ds_chunk_write_end(&c,f)) { 
     726        if (!lib3ds_chunk_write_start(&c,strm)) { 
     727          return(LIB3DS_FALSE); 
     728        } 
     729        if (!lib3ds_lin3_track_write(&node->data.ambient.col_track,strm)) { 
     730          return(LIB3DS_FALSE); 
     731        } 
     732        if (!lib3ds_chunk_write_end(&c,strm)) { 
    733733          return(LIB3DS_FALSE); 
    734734        } 
     
    740740        c.chunk=LIB3DS_PIVOT; 
    741741        c.size=18; 
    742         lib3ds_chunk_write(&c,f); 
    743         lib3ds_vector_write(node->data.object.pivot,f); 
     742        lib3ds_chunk_write(&c,strm); 
     743        lib3ds_vector_write(node->data.object.pivot,strm); 
    744744      } 
    745745      { /*---- LIB3DS_INSTANCE_NAME ----*/ 
     
    751751          c.chunk=LIB3DS_INSTANCE_NAME; 
    752752          c.size=6+1+strlen(name); 
    753           lib3ds_chunk_write(&c,f); 
    754           lib3ds_string_write(name,f); 
     753          lib3ds_chunk_write(&c,strm); 
     754          lib3ds_string_write(name,strm); 
    755755        } 
    756756      } 
     
    768768          c.chunk=LIB3DS_BOUNDBOX; 
    769769          c.size=30; 
    770           lib3ds_chunk_write(&c,f); 
    771           lib3ds_vector_write(node->data.object.bbox_min, f); 
    772           lib3ds_vector_write(node->data.object.bbox_max, f); 
     770          lib3ds_chunk_write(&c,strm); 
     771          lib3ds_vector_write(node->data.object.bbox_min, strm); 
     772          lib3ds_vector_write(node->data.object.bbox_max, strm); 
    773773        } 
    774774      } 
     
    776776        Lib3dsChunk c; 
    777777        c.chunk=LIB3DS_POS_TRACK_TAG; 
    778         if (!lib3ds_chunk_write_start(&c,f)) { 
    779           return(LIB3DS_FALSE); 
    780         } 
    781         if (!lib3ds_lin3_track_write(&node->data.object.pos_track,f)) { 
    782           return(LIB3DS_FALSE); 
    783         } 
    784         if (!lib3ds_chunk_write_end(&c,f)) { 
     778        if (!lib3ds_chunk_write_start(&c,strm)) { 
     779          return(LIB3DS_FALSE); 
     780        } 
     781        if (!lib3ds_lin3_track_write(&node->data.object.pos_track,strm)) { 
     782          return(LIB3DS_FALSE); 
     783        } 
     784        if (!lib3ds_chunk_write_end(&c,strm)) { 
    785785          return(LIB3DS_FALSE); 
    786786        } 
     
    789789        Lib3dsChunk c; 
    790790        c.chunk=LIB3DS_ROT_TRACK_TAG; 
    791         if (!lib3ds_chunk_write_start(&c,f)) { 
    792           return(LIB3DS_FALSE); 
    793         } 
    794         if (!lib3ds_quat_track_write(&node->data.object.rot_track,f)) { 
    795           return(LIB3DS_FALSE); 
    796         } 
    797         if (!lib3ds_chunk_write_end(&c,f)) { 
     791        if (!lib3ds_chunk_write_start(&c,strm)) { 
     792          return(LIB3DS_FALSE); 
     793        } 
     794        if (!lib3ds_quat_track_write(&node->data.object.rot_track,strm)) { 
     795          return(LIB3DS_FALSE); 
     796        } 
     797        if (!lib3ds_chunk_write_end(&c,strm)) { 
    798798          return(LIB3DS_FALSE); 
    799799        } 
     
    802802        Lib3dsChunk c; 
    803803        c.chunk=LIB3DS_SCL_TRACK_TAG; 
    804         if (!lib3ds_chunk_write_start(&c,f)) { 
    805           return(LIB3DS_FALSE); 
    806         } 
    807         if (!lib3ds_lin3_track_write(&node->data.object.scl_track,f)) { 
    808           return(LIB3DS_FALSE); 
    809         } 
    810         if (!lib3ds_chunk_write_end(&c,f)) { 
     804        if (!lib3ds_chunk_write_start(&c,strm)) { 
     805          return(LIB3DS_FALSE); 
     806        } 
     807        if (!lib3ds_lin3_track_write(&node->data.object.scl_track,strm)) { 
     808          return(LIB3DS_FALSE); 
     809        } 
     810        if (!lib3ds_chunk_write_end(&c,strm)) { 
    811811          return(LIB3DS_FALSE); 
    812812        } 
     
    815815        Lib3dsChunk c; 
    816816        c.chunk=LIB3DS_HIDE_TRACK_TAG; 
    817         if (!lib3ds_chunk_write_start(&c,f)) { 
    818           return(LIB3DS_FALSE); 
    819         } 
    820         if (!lib3ds_bool_track_write(&node->data.object.hide_track,f)) { 
    821           return(LIB3DS_FALSE); 
    822         } 
    823         if (!lib3ds_chunk_write_end(&c,f)) { 
     817        if (!lib3ds_chunk_write_start(&c,strm)) { 
     818          return(LIB3DS_FALSE); 
     819        } 
     820        if (!lib3ds_bool_track_write(&node->data.object.hide_track,strm)) { 
     821          return(LIB3DS_FALSE); 
     822        } 
     823        if (!lib3ds_chunk_write_end(&c,strm)) { 
    824824          return(LIB3DS_FALSE); 
    825825        } 
     
    829829        c.chunk=LIB3DS_MORPH_SMOOTH; 
    830830        c.size=10; 
    831         lib3ds_chunk_write(&c,f); 
    832         lib3ds_float_write(node->data.object.morph_smooth,f); 
     831        lib3ds_chunk_write(&c,strm); 
     832        lib3ds_float_write(node->data.object.morph_smooth,strm); 
    833833      } 
    834834      break; 
     
    837837        Lib3dsChunk c; 
    838838        c.chunk=LIB3DS_POS_TRACK_TAG; 
    839         if (!lib3ds_chunk_write_start(&c,f)) { 
    840           return(LIB3DS_FALSE); 
    841         } 
    842         if (!lib3ds_lin3_track_write(&node->data.camera.pos_track,f)) { 
    843           return(LIB3DS_FALSE); 
    844         } 
    845         if (!lib3ds_chunk_write_end(&c,f)) { 
     839        if (!lib3ds_chunk_write_start(&c,strm)) { 
     840          return(LIB3DS_FALSE); 
     841        } 
     842        if (!lib3ds_lin3_track_write(&node->data.camera.pos_track,strm)) { 
     843          return(LIB3DS_FALSE); 
     844        } 
     845        if (!lib3ds_chunk_write_end(&c,strm)) { 
    846846          return(LIB3DS_FALSE); 
    847847        } 
     
    850850        Lib3dsChunk c; 
    851851        c.chunk=LIB3DS_FOV_TRACK_TAG; 
    852         if (!lib3ds_chunk_write_start(&c,f)) { 
    853           return(LIB3DS_FALSE); 
    854         } 
    855         if (!lib3ds_lin1_track_write(&node->data.camera.fov_track,f)) { 
    856           return(LIB3DS_FALSE); 
    857         } 
    858         if (!lib3ds_chunk_write_end(&c,f)) { 
     852        if (!lib3ds_chunk_write_start(&c,strm)) { 
     853          return(LIB3DS_FALSE); 
     854        } 
     855        if (!lib3ds_lin1_track_write(&node->data.camera.fov_track,strm)) { 
     856          return(LIB3DS_FALSE); 
     857        } 
     858        if (!lib3ds_chunk_write_end(&c,strm)) { 
    859859          return(LIB3DS_FALSE); 
    860860        } 
     
    863863        Lib3dsChunk c; 
    864864        c.chunk=LIB3DS_ROLL_TRACK_TAG; 
    865         if (!lib3ds_chunk_write_start(&c,f)) { 
    866           return(LIB3DS_FALSE); 
    867         } 
    868         if (!lib3ds_lin1_track_write(&node->data.camera.roll_track,f)) { 
    869           return(LIB3DS_FALSE); 
    870         } 
    871         if (!lib3ds_chunk_write_end(&c,f)) { 
     865        if (!lib3ds_chunk_write_start(&c,strm)) { 
     866          return(LIB3DS_FALSE); 
     867        } 
     868        if (!lib3ds_lin1_track_write(&node->data.camera.roll_track,strm)) { 
     869          return(LIB3DS_FALSE); 
     870        } 
     871        if (!lib3ds_chunk_write_end(&c,strm)) { 
    872872          return(LIB3DS_FALSE); 
    873873        } 
     
    878878        Lib3dsChunk c; 
    879879        c.chunk=LIB3DS_POS_TRACK_TAG; 
    880         if (!lib3ds_chunk_write_start(&c,f)) { 
    881           return(LIB3DS_FALSE); 
    882         } 
    883         if (!lib3ds_lin3_track_write(&node->data.target.pos_track,f)) { 
    884           return(LIB3DS_FALSE); 
    885         } 
    886         if (!lib3ds_chunk_write_end(&c,f)) { 
     880        if (!lib3ds_chunk_write_start(&c,strm)) { 
     881          return(LIB3DS_FALSE); 
     882        } 
     883        if (!lib3ds_lin3_track_write(&node->data.target.pos_track,strm)) { 
     884          return(LIB3DS_FALSE); 
     885        } 
     886        if (!lib3ds_chunk_write_end(&c,strm)) { 
    887887          return(LIB3DS_FALSE); 
    888888        } 
     
    893893        Lib3dsChunk c; 
    894894        c.chunk=LIB3DS_POS_TRACK_TAG; 
    895         if (!lib3ds_chunk_write_start(&c,f)) { 
    896           return(LIB3DS_FALSE); 
    897         } 
    898         if (!lib3ds_lin3_track_write(&node->data.light.pos_track,f)) { 
    899           return(LIB3DS_FALSE); 
    900         } 
    901         if (!lib3ds_chunk_write_end(&c,f)) { 
     895        if (!lib3ds_chunk_write_start(&c,strm)) { 
     896          return(LIB3DS_FALSE); 
     897        } 
     898        if (!lib3ds_lin3_track_write(&node->data.light.pos_track,strm)) { 
     899          return(LIB3DS_FALSE); 
     900        } 
     901        if (!lib3ds_chunk_write_end(&c,strm)) { 
    902902          return(LIB3DS_FALSE); 
    903903        } 
     
    906906        Lib3dsChunk c; 
    907907        c.chunk=LIB3DS_COL_TRACK_TAG; 
    908         if (!lib3ds_chunk_write_start(&c,f)) { 
    909           return(LIB3DS_FALSE); 
    910         } 
    911         if (!lib3ds_lin3_track_write(&node->data.light.col_track,f)) { 
    912           return(LIB3DS_FALSE); 
    913         } 
    914         if (!lib3ds_chunk_write_end(&c,f)) { 
     908        if (!lib3ds_chunk_write_start(&c,strm)) { 
     909          return(LIB3DS_FALSE); 
     910        } 
     911        if (!lib3ds_lin3_track_write(&node->data.light.col_track,strm)) { 
     912          return(LIB3DS_FALSE); 
     913        } 
     914        if (!lib3ds_chunk_write_end(&c,strm)) { 
    915915          return(LIB3DS_FALSE); 
    916916        } 
     
    921921        Lib3dsChunk c; 
    922922        c.chunk=LIB3DS_POS_TRACK_TAG; 
    923         if (!lib3ds_chunk_write_start(&c,f)) { 
    924           return(LIB3DS_FALSE); 
    925         } 
    926         if (!lib3ds_lin3_track_write(&node->data.light.pos_track,f)) { 
    927           return(LIB3DS_FALSE); 
    928         } 
    929         if (!lib3ds_chunk_write_end(&c,f)) { 
     923        if (!lib3ds_chunk_write_start(&c,strm)) { 
     924          return(LIB3DS_FALSE); 
     925        } 
     926        if (!lib3ds_lin3_track_write(&node->data.light.pos_track,strm)) { 
     927          return(LIB3DS_FALSE); 
     928        } 
     929        if (!lib3ds_chunk_write_end(&c,strm)) { 
    930930          return(LIB3DS_FALSE); 
    931931        } 
     
    934934        Lib3dsChunk c; 
    935935        c.chunk=LIB3DS_COL_TRACK_TAG; 
    936         if (!lib3ds_chunk_write_start(&c,f)) { 
    937           return(LIB3DS_FALSE); 
    938         } 
    939         if (!lib3ds_lin3_track_write(&node->data.light.col_track,f)) { 
    940           return(LIB3DS_FALSE); 
    941         } 
    942         if (!lib3ds_chunk_write_end(&c,f)) { 
     936        if (!lib3ds_chunk_write_start(&c,strm)) { 
     937          return(LIB3DS_FALSE); 
     938        } 
     939        if (!lib3ds_lin3_track_write(&node->data.light.col_track,strm)) { 
     940          return(LIB3DS_FALSE); 
     941        } 
     942        if (!lib3ds_chunk_write_end(&c,strm)) { 
    943943          return(LIB3DS_FALSE); 
    944944        } 
     
    947947        Lib3dsChunk c; 
    948948        c.chunk=LIB3DS_HOT_TRACK_TAG; 
    949         if (!lib3ds_chunk_write_start(&c,f)) { 
    950           return(LIB3DS_FALSE); 
    951         } 
    952         if (!lib3ds_lin1_track_write(&node->data.light.hotspot_track,f)) { 
    953           return(LIB3DS_FALSE); 
    954         } 
    955         if (!lib3ds_chunk_write_end(&c,f)) { 
     949        if (!lib3ds_chunk_write_start(&c,strm)) { 
     950          return(LIB3DS_FALSE); 
     951        } 
     952        if (!lib3ds_lin1_track_write(&node->data.light.hotspot_track,strm)) { 
     953          return(LIB3DS_FALSE); 
     954        } 
     955        if (!lib3ds_chunk_write_end(&c,strm)) { 
    956956          return(LIB3DS_FALSE); 
    957957        } 
     
    960960        Lib3dsChunk c; 
    961961        c.chunk=LIB3DS_FALL_TRACK_TAG; 
    962         if (!lib3ds_chunk_write_start(&c,f)) { 
    963           return(LIB3DS_FALSE); 
    964         } 
    965         if (!lib3ds_lin1_track_write(&node->data.light.falloff_track,f)) { 
    966           return(LIB3DS_FALSE); 
    967         } 
    968         if (!lib3ds_chunk_write_end(&c,f)) { 
     962        if (!lib3ds_chunk_write_start(&c,strm)) { 
     963          return(LIB3DS_FALSE); 
     964        } 
     965        if (!lib3ds_lin1_track_write(&node->data.light.falloff_track,strm)) { 
     966          return(LIB3DS_FALSE); 
     967        } 
     968        if (!lib3ds_chunk_write_end(&c,strm)) { 
    969969          return(LIB3DS_FALSE); 
    970970        } 
     
    973973        Lib3dsChunk c; 
    974974        c.chunk=LIB3DS_ROLL_TRACK_TAG; 
    975         if (!lib3ds_chunk_write_start(&c,f)) { 
    976           return(LIB3DS_FALSE); 
    977         } 
    978         if (!lib3ds_lin1_track_write(&node->data.light.roll_track,f)) { 
    979           return(LIB3DS_FALSE); 
    980         } 
    981         if (!lib3ds_chunk_write_end(&c,f)) { 
     975        if (!lib3ds_chunk_write_start(&c,strm)) { 
     976          return(LIB3DS_FALSE); 
     977        } 
     978        if (!lib3ds_lin1_track_write(&node->data.light.roll_track,strm)) { 
     979          return(LIB3DS_FALSE); 
     980        } 
     981        if (!lib3ds_chunk_write_end(&c,strm)) { 
    982982          return(LIB3DS_FALSE); 
    983983        } 
     
    988988        Lib3dsChunk c; 
    989989        c.chunk=LIB3DS_POS_TRACK_TAG; 
    990         if (!lib3ds_chunk_write_start(&c,f)) { 
    991           return(LIB3DS_FALSE); 
    992         } 
    993         if (!lib3ds_lin3_track_write(&node->data.spot.pos_track,f)) { 
    994           return(LIB3DS_FALSE); 
    995         } 
    996         if (!lib3ds_chunk_write_end(&c,f)) { 
     990        if (!lib3ds_chunk_write_start(&c,strm)) { 
     991          return(LIB3DS_FALSE); 
     992        } 
     993        if (!lib3ds_lin3_track_write(&node->data.spot.pos_track,strm)) { 
     994          return(LIB3DS_FALSE); 
     995        } 
     996        if (!lib3ds_chunk_write_end(&c,strm)) { 
    997997          return(LIB3DS_FALSE); 
    998998        } 
     
    10031003  } 
    10041004 
    1005   if (!lib3ds_chunk_write_end(&c,f)) { 
     1005  if (!lib3ds_chunk_write_end(&c,strm)) { 
    10061006    return(LIB3DS_FALSE); 
    10071007  }