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/material.cpp

    r7057 r10076  
    6868 
    6969static Lib3dsBool 
    70 color_read(Lib3dsRgba rgb, FILE *f) 
     70color_read(Lib3dsRgba rgb, iostream *strm) 
    7171{ 
    7272  Lib3dsChunk c; 
     
    7474  Lib3dsBool have_lin=LIB3DS_FALSE; 
    7575 
    76   if (!lib3ds_chunk_read_start(&c, 0, f)) { 
    77     return(LIB3DS_FALSE); 
    78   } 
    79  
    80   while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { 
     76  if (!lib3ds_chunk_read_start(&c, 0, strm)) { 
     77    return(LIB3DS_FALSE); 
     78  } 
     79 
     80  while ((chunk=lib3ds_chunk_read_next(&c, strm))!=0) { 
    8181    switch (chunk) { 
    8282      case LIB3DS_LIN_COLOR_24: 
     
    8484          int i; 
    8585          for (i=0; i<3; ++i) { 
    86             rgb[i]=1.0f*lib3ds_byte_read(f)/255.0f; 
     86            rgb[i]=1.0f*lib3ds_byte_read(strm)/255.0f; 
    8787          } 
    8888          rgb[3]=1.0f; 
     
    9696          int i; 
    9797          for (i=0; i<3; ++i) { 
    98             rgb[i]=1.0f*lib3ds_byte_read(f)/255.0f; 
     98            rgb[i]=1.0f*lib3ds_byte_read(strm)/255.0f; 
    9999          } 
    100100          rgb[3]=1.0f; 
     
    103103      case LIB3DS_COLOR_F: 
    104104        // sth: this will fix 3ds-files exported from cinema 4d 
    105         lib3ds_rgb_read(rgb, f); 
     105        lib3ds_rgb_read(rgb, strm); 
    106106        break; 
    107107      default: 
     
    110110  } 
    111111   
    112   lib3ds_chunk_read_end(&c, f); 
     112  lib3ds_chunk_read_end(&c, strm); 
    113113  return(LIB3DS_TRUE); 
    114114} 
     
    116116 
    117117static Lib3dsBool 
    118 int_percentage_read(Lib3dsFloat *p, FILE *f) 
     118int_percentage_read(Lib3dsFloat *p, iostream *strm) 
    119119{ 
    120120  Lib3dsChunk c; 
    121121  Lib3dsWord chunk; 
    122122 
    123   if (!lib3ds_chunk_read_start(&c, 0, f)) { 
    124     return(LIB3DS_FALSE); 
    125   } 
    126  
    127   while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { 
     123  if (!lib3ds_chunk_read_start(&c, 0, strm)) { 
     124    return(LIB3DS_FALSE); 
     125  } 
     126 
     127  while ((chunk=lib3ds_chunk_read_next(&c, strm))!=0) { 
    128128    switch (chunk) { 
    129129      case LIB3DS_INT_PERCENTAGE: 
    130130        { 
    131           Lib3dsIntw i=lib3ds_intw_read(f); 
     131          Lib3dsIntw i=lib3ds_intw_read(strm); 
    132132          *p=(Lib3dsFloat)(1.0*i/100.0); 
    133133        } 
     
    138138  } 
    139139   
    140   lib3ds_chunk_read_end(&c, f); 
     140  lib3ds_chunk_read_end(&c, strm); 
    141141  return(LIB3DS_TRUE); 
    142142} 
     
    144144 
    145145static Lib3dsBool 
    146 texture_map_read(Lib3dsTextureMap *map, FILE *f) 
     146texture_map_read(Lib3dsTextureMap *map, iostream *strm) 
    147147{ 
    148148  Lib3dsChunk c; 
    149149  Lib3dsWord chunk; 
    150150 
    151   if (!lib3ds_chunk_read_start(&c, 0, f)) { 
    152     return(LIB3DS_FALSE); 
    153   } 
    154  
    155   while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { 
     151  if (!lib3ds_chunk_read_start(&c, 0, strm)) { 
     152    return(LIB3DS_FALSE); 
     153  } 
     154 
     155  while ((chunk=lib3ds_chunk_read_next(&c, strm))!=0) { 
    156156    switch (chunk) { 
    157157      case LIB3DS_INT_PERCENTAGE: 
    158158        { 
    159           map->percent=1.0f*lib3ds_intw_read(f)/100.0f; 
     159          map->percent=1.0f*lib3ds_intw_read(strm)/100.0f; 
    160160        } 
    161161        break; 
    162162      case LIB3DS_MAT_MAPNAME: 
    163163        { 
    164           if (!lib3ds_string_read(map->name, 64, f)) { 
     164          if (!lib3ds_string_read(map->name, 64, strm)) { 
    165165            return(LIB3DS_FALSE); 
    166166          } 
     
    170170      case LIB3DS_MAT_MAP_TILING: 
    171171        { 
    172           map->flags=lib3ds_word_read(f); 
     172          map->flags=lib3ds_word_read(strm); 
    173173        } 
    174174        break; 
    175175      case LIB3DS_MAT_MAP_TEXBLUR: 
    176176        { 
    177           map->blur=lib3ds_float_read(f); 
     177          map->blur=lib3ds_float_read(strm); 
    178178        } 
    179179        break; 
    180180      case LIB3DS_MAT_MAP_USCALE: 
    181181        { 
    182           map->scale[0]=lib3ds_float_read(f); 
     182          map->scale[0]=lib3ds_float_read(strm); 
    183183        } 
    184184        break; 
    185185      case LIB3DS_MAT_MAP_VSCALE: 
    186186        { 
    187           map->scale[1]=lib3ds_float_read(f); 
     187          map->scale[1]=lib3ds_float_read(strm); 
    188188        } 
    189189        break; 
    190190      case LIB3DS_MAT_MAP_UOFFSET: 
    191191        { 
    192           map->offset[0]=lib3ds_float_read(f); 
     192          map->offset[0]=lib3ds_float_read(strm); 
    193193        } 
    194194        break; 
    195195      case LIB3DS_MAT_MAP_VOFFSET: 
    196196        { 
    197           map->offset[1]=lib3ds_float_read(f); 
     197          map->offset[1]=lib3ds_float_read(strm); 
    198198        } 
    199199        break; 
    200200      case LIB3DS_MAT_MAP_ANG: 
    201201        { 
    202           map->rotation=lib3ds_float_read(f); 
     202          map->rotation=lib3ds_float_read(strm); 
    203203        } 
    204204        break; 
    205205      case LIB3DS_MAT_MAP_COL1: 
    206206        { 
    207           map->tint_1[0]=1.0f*lib3ds_byte_read(f)/255.0f; 
    208           map->tint_1[1]=1.0f*lib3ds_byte_read(f)/255.0f; 
    209           map->tint_1[2]=1.0f*lib3ds_byte_read(f)/255.0f; 
     207          map->tint_1[0]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     208          map->tint_1[1]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     209          map->tint_1[2]=1.0f*lib3ds_byte_read(strm)/255.0f; 
    210210        } 
    211211        break; 
    212212      case LIB3DS_MAT_MAP_COL2: 
    213213        { 
    214           map->tint_2[0]=1.0f*lib3ds_byte_read(f)/255.0f; 
    215           map->tint_2[1]=1.0f*lib3ds_byte_read(f)/255.0f; 
    216           map->tint_2[2]=1.0f*lib3ds_byte_read(f)/255.0f; 
     214          map->tint_2[0]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     215          map->tint_2[1]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     216          map->tint_2[2]=1.0f*lib3ds_byte_read(strm)/255.0f; 
    217217        } 
    218218        break; 
    219219      case LIB3DS_MAT_MAP_RCOL: 
    220220        { 
    221           map->tint_r[0]=1.0f*lib3ds_byte_read(f)/255.0f; 
    222           map->tint_r[1]=1.0f*lib3ds_byte_read(f)/255.0f; 
    223           map->tint_r[2]=1.0f*lib3ds_byte_read(f)/255.0f; 
     221          map->tint_r[0]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     222          map->tint_r[1]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     223          map->tint_r[2]=1.0f*lib3ds_byte_read(strm)/255.0f; 
    224224        } 
    225225        break; 
    226226      case LIB3DS_MAT_MAP_GCOL: 
    227227        { 
    228           map->tint_g[0]=1.0f*lib3ds_byte_read(f)/255.0f; 
    229           map->tint_g[1]=1.0f*lib3ds_byte_read(f)/255.0f; 
    230           map->tint_g[2]=1.0f*lib3ds_byte_read(f)/255.0f; 
     228          map->tint_g[0]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     229          map->tint_g[1]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     230          map->tint_g[2]=1.0f*lib3ds_byte_read(strm)/255.0f; 
    231231        } 
    232232        break; 
    233233      case LIB3DS_MAT_MAP_BCOL: 
    234234        { 
    235           map->tint_b[0]=1.0f*lib3ds_byte_read(f)/255.0f; 
    236           map->tint_b[1]=1.0f*lib3ds_byte_read(f)/255.0f; 
    237           map->tint_b[2]=1.0f*lib3ds_byte_read(f)/255.0f; 
     235          map->tint_b[0]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     236          map->tint_b[1]=1.0f*lib3ds_byte_read(strm)/255.0f; 
     237          map->tint_b[2]=1.0f*lib3ds_byte_read(strm)/255.0f; 
    238238        } 
    239239        break; 
     
    243243  } 
    244244   
    245   lib3ds_chunk_read_end(&c, f); 
     245  lib3ds_chunk_read_end(&c, strm); 
    246246  return(LIB3DS_TRUE); 
    247247} 
     
    338338 */ 
    339339Lib3dsBool 
    340 lib3ds_material_read(Lib3dsMaterial *material, FILE *f) 
     340lib3ds_material_read(Lib3dsMaterial *material, iostream *strm) 
    341341{ 
    342342  Lib3dsChunk c; 
     
    344344 
    345345  ASSERT(material); 
    346   if (!lib3ds_chunk_read_start(&c, LIB3DS_MAT_ENTRY, f)) { 
    347     return(LIB3DS_FALSE); 
    348   } 
    349  
    350   while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { 
     346  if (!lib3ds_chunk_read_start(&c, LIB3DS_MAT_ENTRY, strm)) { 
     347    return(LIB3DS_FALSE); 
     348  } 
     349 
     350  while ((chunk=lib3ds_chunk_read_next(&c, strm))!=0) { 
    351351    switch (chunk) { 
    352352      case LIB3DS_MAT_NAME: 
    353353        { 
    354           if (!lib3ds_string_read(material->name, 64, f)) { 
     354          if (!lib3ds_string_read(material->name, 64, strm)) { 
    355355            return(LIB3DS_FALSE); 
    356356          } 
     
    360360      case LIB3DS_MAT_AMBIENT: 
    361361        { 
    362           lib3ds_chunk_read_reset(&c, f); 
    363           if (!color_read(material->ambient, f)) { 
     362          lib3ds_chunk_read_reset(&c, strm); 
     363          if (!color_read(material->ambient, strm)) { 
    364364            return(LIB3DS_FALSE); 
    365365          } 
     
    368368      case LIB3DS_MAT_DIFFUSE: 
    369369        { 
    370           lib3ds_chunk_read_reset(&c, f); 
    371           if (!color_read(material->diffuse, f)) { 
     370          lib3ds_chunk_read_reset(&c, strm); 
     371          if (!color_read(material->diffuse, strm)) { 
    372372            return(LIB3DS_FALSE); 
    373373          } 
     
    376376      case LIB3DS_MAT_SPECULAR: 
    377377        { 
    378           lib3ds_chunk_read_reset(&c, f); 
    379           if (!color_read(material->specular, f)) { 
     378          lib3ds_chunk_read_reset(&c, strm); 
     379          if (!color_read(material->specular, strm)) { 
    380380            return(LIB3DS_FALSE); 
    381381          } 
     
    384384      case LIB3DS_MAT_SHININESS: 
    385385        { 
    386           lib3ds_chunk_read_reset(&c, f); 
    387           if (!int_percentage_read(&material->shininess, f)) { 
     386          lib3ds_chunk_read_reset(&c, strm); 
     387          if (!int_percentage_read(&material->shininess, strm)) { 
    388388            return(LIB3DS_FALSE); 
    389389          } 
     
    392392      case LIB3DS_MAT_SHIN2PCT: 
    393393        { 
    394           lib3ds_chunk_read_reset(&c, f); 
    395           if (!int_percentage_read(&material->shin_strength, f)) { 
     394          lib3ds_chunk_read_reset(&c, strm); 
     395          if (!int_percentage_read(&material->shin_strength, strm)) { 
    396396            return(LIB3DS_FALSE); 
    397397          } 
     
    400400      case LIB3DS_MAT_TRANSPARENCY: 
    401401        { 
    402           lib3ds_chunk_read_reset(&c, f); 
    403           if (!int_percentage_read(&material->transparency, f)) { 
     402          lib3ds_chunk_read_reset(&c, strm); 
     403          if (!int_percentage_read(&material->transparency, strm)) { 
    404404            return(LIB3DS_FALSE); 
    405405          } 
     
    408408      case LIB3DS_MAT_XPFALL: 
    409409        { 
    410           lib3ds_chunk_read_reset(&c, f); 
    411           if (!int_percentage_read(&material->falloff, f)) { 
     410          lib3ds_chunk_read_reset(&c, strm); 
     411          if (!int_percentage_read(&material->falloff, strm)) { 
    412412            return(LIB3DS_FALSE); 
    413413          } 
     
    421421      case LIB3DS_MAT_REFBLUR: 
    422422        { 
    423           lib3ds_chunk_read_reset(&c, f); 
    424           if (!int_percentage_read(&material->blur, f)) { 
     423          lib3ds_chunk_read_reset(&c, strm); 
     424          if (!int_percentage_read(&material->blur, strm)) { 
    425425            return(LIB3DS_FALSE); 
    426426          } 
     
    434434      case LIB3DS_MAT_SHADING: 
    435435        { 
    436           material->shading=lib3ds_intw_read(f); 
     436          material->shading=lib3ds_intw_read(strm); 
    437437        } 
    438438        break; 
     
    479479      case LIB3DS_MAT_WIRE_SIZE: 
    480480        { 
    481           material->wire_size=lib3ds_float_read(f); 
     481          material->wire_size=lib3ds_float_read(strm); 
    482482        } 
    483483        break; 
    484484      case LIB3DS_MAT_TEXMAP: 
    485485        { 
    486           lib3ds_chunk_read_reset(&c, f); 
    487           if (!texture_map_read(&material->texture1_map, f)) { 
     486          lib3ds_chunk_read_reset(&c, strm); 
     487          if (!texture_map_read(&material->texture1_map, strm)) { 
    488488            return(LIB3DS_FALSE); 
    489489          } 
     
    492492      case LIB3DS_MAT_TEXMASK: 
    493493        { 
    494           lib3ds_chunk_read_reset(&c, f); 
    495           if (!texture_map_read(&material->texture1_mask, f)) { 
     494          lib3ds_chunk_read_reset(&c, strm); 
     495          if (!texture_map_read(&material->texture1_mask, strm)) { 
    496496            return(LIB3DS_FALSE); 
    497497          } 
     
    500500      case LIB3DS_MAT_TEX2MAP: 
    501501        { 
    502           lib3ds_chunk_read_reset(&c, f); 
    503           if (!texture_map_read(&material->texture2_map, f)) { 
     502          lib3ds_chunk_read_reset(&c, strm); 
     503          if (!texture_map_read(&material->texture2_map, strm)) { 
    504504            return(LIB3DS_FALSE); 
    505505          } 
     
    508508      case LIB3DS_MAT_TEX2MASK: 
    509509        { 
    510           lib3ds_chunk_read_reset(&c, f); 
    511           if (!texture_map_read(&material->texture2_mask, f)) { 
     510          lib3ds_chunk_read_reset(&c, strm); 
     511          if (!texture_map_read(&material->texture2_mask, strm)) { 
    512512            return(LIB3DS_FALSE); 
    513513          } 
     
    516516      case LIB3DS_MAT_OPACMAP: 
    517517        { 
    518           lib3ds_chunk_read_reset(&c, f); 
    519           if (!texture_map_read(&material->opacity_map, f)) { 
     518          lib3ds_chunk_read_reset(&c, strm); 
     519          if (!texture_map_read(&material->opacity_map, strm)) { 
    520520            return(LIB3DS_FALSE); 
    521521          } 
     
    524524      case LIB3DS_MAT_OPACMASK: 
    525525        { 
    526           lib3ds_chunk_read_reset(&c, f); 
    527           if (!texture_map_read(&material->opacity_mask, f)) { 
     526          lib3ds_chunk_read_reset(&c, strm); 
     527          if (!texture_map_read(&material->opacity_mask, strm)) { 
    528528            return(LIB3DS_FALSE); 
    529529          } 
     
    532532      case LIB3DS_MAT_BUMPMAP: 
    533533        { 
    534           lib3ds_chunk_read_reset(&c, f); 
    535           if (!texture_map_read(&material->bump_map, f)) { 
     534          lib3ds_chunk_read_reset(&c, strm); 
     535          if (!texture_map_read(&material->bump_map, strm)) { 
    536536            return(LIB3DS_FALSE); 
    537537          } 
     
    540540      case LIB3DS_MAT_BUMPMASK: 
    541541        { 
    542           lib3ds_chunk_read_reset(&c, f); 
    543           if (!texture_map_read(&material->bump_mask, f)) { 
     542          lib3ds_chunk_read_reset(&c, strm); 
     543          if (!texture_map_read(&material->bump_mask, strm)) { 
    544544            return(LIB3DS_FALSE); 
    545545          } 
     
    548548      case LIB3DS_MAT_SPECMAP: 
    549549        { 
    550           lib3ds_chunk_read_reset(&c, f); 
    551           if (!texture_map_read(&material->specular_map, f)) { 
     550          lib3ds_chunk_read_reset(&c, strm); 
     551          if (!texture_map_read(&material->specular_map, strm)) { 
    552552            return(LIB3DS_FALSE); 
    553553          } 
     
    556556      case LIB3DS_MAT_SPECMASK: 
    557557        { 
    558           lib3ds_chunk_read_reset(&c, f); 
    559           if (!texture_map_read(&material->specular_mask, f)) { 
     558          lib3ds_chunk_read_reset(&c, strm); 
     559          if (!texture_map_read(&material->specular_mask, strm)) { 
    560560            return(LIB3DS_FALSE); 
    561561          } 
     
    564564      case LIB3DS_MAT_SHINMAP: 
    565565        { 
    566           lib3ds_chunk_read_reset(&c, f); 
    567           if (!texture_map_read(&material->shininess_map, f)) { 
     566          lib3ds_chunk_read_reset(&c, strm); 
     567          if (!texture_map_read(&material->shininess_map, strm)) { 
    568568            return(LIB3DS_FALSE); 
    569569          } 
     
    572572      case LIB3DS_MAT_SHINMASK: 
    573573        { 
    574           lib3ds_chunk_read_reset(&c, f); 
    575           if (!texture_map_read(&material->shininess_mask, f)) { 
     574          lib3ds_chunk_read_reset(&c, strm); 
     575          if (!texture_map_read(&material->shininess_mask, strm)) { 
    576576            return(LIB3DS_FALSE); 
    577577          } 
     
    580580      case LIB3DS_MAT_SELFIMAP: 
    581581        { 
    582           lib3ds_chunk_read_reset(&c, f); 
    583           if (!texture_map_read(&material->self_illum_map, f)) { 
     582          lib3ds_chunk_read_reset(&c, strm); 
     583          if (!texture_map_read(&material->self_illum_map, strm)) { 
    584584            return(LIB3DS_FALSE); 
    585585          } 
     
    588588      case LIB3DS_MAT_SELFIMASK: 
    589589        { 
    590           lib3ds_chunk_read_reset(&c, f); 
    591           if (!texture_map_read(&material->self_illum_mask, f)) { 
     590          lib3ds_chunk_read_reset(&c, strm); 
     591          if (!texture_map_read(&material->self_illum_mask, strm)) { 
    592592            return(LIB3DS_FALSE); 
    593593          } 
     
    596596      case LIB3DS_MAT_REFLMAP: 
    597597        { 
    598           lib3ds_chunk_read_reset(&c, f); 
    599           if (!texture_map_read(&material->reflection_map, f)) { 
     598          lib3ds_chunk_read_reset(&c, strm); 
     599          if (!texture_map_read(&material->reflection_map, strm)) { 
    600600            return(LIB3DS_FALSE); 
    601601          } 
     
    604604      case LIB3DS_MAT_REFLMASK: 
    605605        { 
    606           lib3ds_chunk_read_reset(&c, f); 
    607           if (!texture_map_read(&material->reflection_mask, f)) { 
     606          lib3ds_chunk_read_reset(&c, strm); 
     607          if (!texture_map_read(&material->reflection_mask, strm)) { 
    608608            return(LIB3DS_FALSE); 
    609609          } 
     
    612612      case LIB3DS_MAT_ACUBIC: 
    613613        { 
    614           lib3ds_intb_read(f); 
    615           material->autorefl_map.level=lib3ds_intb_read(f); 
    616           material->autorefl_map.flags=lib3ds_intw_read(f); 
    617           material->autorefl_map.size=lib3ds_intd_read(f); 
    618           material->autorefl_map.frame_step=lib3ds_intd_read(f); 
     614          lib3ds_intb_read(strm); 
     615          material->autorefl_map.level=lib3ds_intb_read(strm); 
     616          material->autorefl_map.flags=lib3ds_intw_read(strm); 
     617          material->autorefl_map.size=lib3ds_intd_read(strm); 
     618          material->autorefl_map.frame_step=lib3ds_intd_read(strm); 
    619619        } 
    620620        break; 
     
    624624  } 
    625625 
    626   lib3ds_chunk_read_end(&c, f); 
     626  lib3ds_chunk_read_end(&c, strm); 
    627627  return(LIB3DS_TRUE); 
    628628} 
     
    630630 
    631631static Lib3dsBool 
    632 color_write(Lib3dsRgba rgb, FILE *f) 
     632color_write(Lib3dsRgba rgb, iostream *strm) 
    633633{ 
    634634  Lib3dsChunk c; 
     
    636636  c.chunk=LIB3DS_COLOR_24; 
    637637  c.size=9; 
    638   lib3ds_chunk_write(&c,f); 
    639   lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[0]+0.5),f); 
    640   lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[1]+0.5),f); 
    641   lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[2]+0.5),f); 
     638  lib3ds_chunk_write(&c,strm); 
     639  lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[0]+0.5),strm); 
     640  lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[1]+0.5),strm); 
     641  lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[2]+0.5),strm); 
    642642 
    643643  c.chunk=LIB3DS_LIN_COLOR_24; 
    644644  c.size=9; 
    645   lib3ds_chunk_write(&c,f); 
    646   lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[0]+0.5),f); 
    647   lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[1]+0.5),f); 
    648   lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[2]+0.5),f); 
     645  lib3ds_chunk_write(&c,strm); 
     646  lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[0]+0.5),strm); 
     647  lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[1]+0.5),strm); 
     648  lib3ds_byte_write((Lib3dsByte)floor(255.0*rgb[2]+0.5),strm); 
    649649 
    650650  return(LIB3DS_TRUE); 
     
    653653 
    654654static Lib3dsBool 
    655 int_percentage_write(Lib3dsFloat p, FILE *f) 
     655int_percentage_write(Lib3dsFloat p, iostream *strm) 
    656656{ 
    657657  Lib3dsChunk c; 
     
    659659  c.chunk=LIB3DS_INT_PERCENTAGE; 
    660660  c.size=8; 
    661   lib3ds_chunk_write(&c,f); 
    662   lib3ds_intw_write((Lib3dsByte)floor(100.0*p+0.5),f); 
     661  lib3ds_chunk_write(&c,strm); 
     662  lib3ds_intw_write((Lib3dsByte)floor(100.0*p+0.5),strm); 
    663663 
    664664  return(LIB3DS_TRUE); 
     
    667667 
    668668static Lib3dsBool 
    669 texture_map_write(Lib3dsWord chunk, Lib3dsTextureMap *map, FILE *f) 
     669texture_map_write(Lib3dsWord chunk, Lib3dsTextureMap *map, iostream *strm) 
    670670{ 
    671671  Lib3dsChunk c; 
     
    675675  } 
    676676  c.chunk=chunk; 
    677   if (!lib3ds_chunk_write_start(&c,f)) { 
     677  if (!lib3ds_chunk_write_start(&c,strm)) { 
    678678    return(LIB3DS_FALSE); 
    679679  } 
    680680   
    681   int_percentage_write(map->percent,f); 
     681  int_percentage_write(map->percent,strm); 
    682682 
    683683  { /*---- LIB3DS_MAT_MAPNAME ----*/ 
     
    685685    c.chunk=LIB3DS_MAT_MAPNAME; 
    686686    c.size=6+strlen(map->name)+1; 
    687     lib3ds_chunk_write(&c,f); 
    688     lib3ds_string_write(map->name,f); 
     687    lib3ds_chunk_write(&c,strm); 
     688    lib3ds_string_write(map->name,strm); 
    689689  } 
    690690 
     
    693693    c.chunk=LIB3DS_MAT_MAP_TILING; 
    694694    c.size=8; 
    695     lib3ds_chunk_write(&c,f); 
    696     lib3ds_word_write((Lib3dsWord)map->flags,f); 
     695    lib3ds_chunk_write(&c,strm); 
     696    lib3ds_word_write((Lib3dsWord)map->flags,strm); 
    697697  } 
    698698   
     
    701701    c.chunk=LIB3DS_MAT_MAP_TEXBLUR; 
    702702    c.size=10; 
    703     lib3ds_chunk_write(&c,f); 
    704     lib3ds_float_write(map->blur,f); 
     703    lib3ds_chunk_write(&c,strm); 
     704    lib3ds_float_write(map->blur,strm); 
    705705  } 
    706706 
     
    709709    c.chunk=LIB3DS_MAT_MAP_USCALE; 
    710710    c.size=10; 
    711     lib3ds_chunk_write(&c,f); 
    712     lib3ds_float_write(map->scale[0],f); 
     711    lib3ds_chunk_write(&c,strm); 
     712    lib3ds_float_write(map->scale[0],strm); 
    713713  } 
    714714 
     
    717717    c.chunk=LIB3DS_MAT_MAP_VSCALE; 
    718718    c.size=10; 
    719     lib3ds_chunk_write(&c,f); 
    720     lib3ds_float_write(map->scale[1],f); 
     719    lib3ds_chunk_write(&c,strm); 
     720    lib3ds_float_write(map->scale[1],strm); 
    721721  } 
    722722 
     
    725725    c.chunk=LIB3DS_MAT_MAP_UOFFSET; 
    726726    c.size=10; 
    727     lib3ds_chunk_write(&c,f); 
    728     lib3ds_float_write(map->offset[0],f); 
     727    lib3ds_chunk_write(&c,strm); 
     728    lib3ds_float_write(map->offset[0],strm); 
    729729  } 
    730730 
     
    733733    c.chunk=LIB3DS_MAT_MAP_VOFFSET; 
    734734    c.size=10; 
    735     lib3ds_chunk_write(&c,f); 
    736     lib3ds_float_write(map->offset[1],f); 
     735    lib3ds_chunk_write(&c,strm); 
     736    lib3ds_float_write(map->offset[1],strm); 
    737737  } 
    738738 
     
    741741    c.chunk=LIB3DS_MAT_MAP_ANG; 
    742742    c.size=10; 
    743     lib3ds_chunk_write(&c,f); 
    744     lib3ds_float_write(map->rotation,f); 
     743    lib3ds_chunk_write(&c,strm); 
     744    lib3ds_float_write(map->rotation,strm); 
    745745  } 
    746746 
     
    749749    c.chunk=LIB3DS_MAT_MAP_COL1; 
    750750    c.size=9; 
    751     lib3ds_chunk_write(&c,f); 
    752     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_1[0]+0.5), f); 
    753     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_1[1]+0.5), f); 
    754     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_1[2]+0.5), f); 
     751    lib3ds_chunk_write(&c,strm); 
     752    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_1[0]+0.5), strm); 
     753    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_1[1]+0.5), strm); 
     754    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_1[2]+0.5), strm); 
    755755  } 
    756756 
     
    759759    c.chunk=LIB3DS_MAT_MAP_COL2; 
    760760    c.size=9; 
    761     lib3ds_chunk_write(&c,f); 
    762     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_2[0]+0.5), f); 
    763     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_2[1]+0.5), f); 
    764     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_2[2]+0.5), f); 
     761    lib3ds_chunk_write(&c,strm); 
     762    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_2[0]+0.5), strm); 
     763    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_2[1]+0.5), strm); 
     764    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_2[2]+0.5), strm); 
    765765  } 
    766766   
     
    769769    c.chunk=LIB3DS_MAT_MAP_RCOL; 
    770770    c.size=9; 
    771     lib3ds_chunk_write(&c,f); 
    772     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_r[0]+0.5), f); 
    773     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_r[1]+0.5), f); 
    774     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_r[2]+0.5), f); 
     771    lib3ds_chunk_write(&c,strm); 
     772    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_r[0]+0.5), strm); 
     773    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_r[1]+0.5), strm); 
     774    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_r[2]+0.5), strm); 
    775775  } 
    776776 
     
    779779    c.chunk=LIB3DS_MAT_MAP_GCOL; 
    780780    c.size=9; 
    781     lib3ds_chunk_write(&c,f); 
    782     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_g[0]+0.5), f); 
    783     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_g[1]+0.5), f); 
    784     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_g[2]+0.5), f); 
     781    lib3ds_chunk_write(&c,strm); 
     782    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_g[0]+0.5), strm); 
     783    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_g[1]+0.5), strm); 
     784    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_g[2]+0.5), strm); 
    785785  } 
    786786   
     
    789789    c.chunk=LIB3DS_MAT_MAP_BCOL; 
    790790    c.size=9; 
    791     lib3ds_chunk_write(&c,f); 
    792     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_b[0]+0.5), f); 
    793     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_b[1]+0.5), f); 
    794     lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_b[2]+0.5), f); 
    795   } 
    796  
    797   if (!lib3ds_chunk_write_end(&c,f)) { 
     791    lib3ds_chunk_write(&c,strm); 
     792    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_b[0]+0.5), strm); 
     793    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_b[1]+0.5), strm); 
     794    lib3ds_byte_write((Lib3dsByte)floor(255.0*map->tint_b[2]+0.5), strm); 
     795  } 
     796 
     797  if (!lib3ds_chunk_write_end(&c,strm)) { 
    798798    return(LIB3DS_FALSE); 
    799799  } 
     
    806806 */ 
    807807Lib3dsBool 
    808 lib3ds_material_write(Lib3dsMaterial *material, FILE *f) 
     808lib3ds_material_write(Lib3dsMaterial *material, iostream *strm) 
    809809{ 
    810810  Lib3dsChunk c; 
    811811 
    812812  c.chunk=LIB3DS_MAT_ENTRY; 
    813   if (!lib3ds_chunk_write_start(&c,f)) { 
     813  if (!lib3ds_chunk_write_start(&c,strm)) { 
    814814    return(LIB3DS_FALSE); 
    815815  } 
     
    819819    c.chunk=LIB3DS_MAT_NAME; 
    820820    c.size=6+strlen(material->name)+1; 
    821     lib3ds_chunk_write(&c,f); 
    822     lib3ds_string_write(material->name,f); 
     821    lib3ds_chunk_write(&c,strm); 
     822    lib3ds_string_write(material->name,strm); 
    823823  } 
    824824 
     
    827827    c.chunk=LIB3DS_MAT_AMBIENT; 
    828828    c.size=24; 
    829     lib3ds_chunk_write(&c,f); 
    830     color_write(material->ambient,f); 
     829    lib3ds_chunk_write(&c,strm); 
     830    color_write(material->ambient,strm); 
    831831  } 
    832832 
     
    835835    c.chunk=LIB3DS_MAT_DIFFUSE; 
    836836    c.size=24; 
    837     lib3ds_chunk_write(&c,f); 
    838     color_write(material->diffuse,f); 
     837    lib3ds_chunk_write(&c,strm); 
     838    color_write(material->diffuse,strm); 
    839839  } 
    840840 
     
    843843    c.chunk=LIB3DS_MAT_SPECULAR; 
    844844    c.size=24; 
    845     lib3ds_chunk_write(&c,f); 
    846     color_write(material->specular,f); 
     845    lib3ds_chunk_write(&c,strm); 
     846    color_write(material->specular,strm); 
    847847  } 
    848848 
     
    851851    c.chunk=LIB3DS_MAT_SHININESS; 
    852852    c.size=14; 
    853     lib3ds_chunk_write(&c,f); 
    854     int_percentage_write(material->shininess,f); 
     853    lib3ds_chunk_write(&c,strm); 
     854    int_percentage_write(material->shininess,strm); 
    855855  } 
    856856 
     
    859859    c.chunk=LIB3DS_MAT_SHIN2PCT; 
    860860    c.size=14; 
    861     lib3ds_chunk_write(&c,f); 
    862     int_percentage_write(material->shin_strength,f); 
     861    lib3ds_chunk_write(&c,strm); 
     862    int_percentage_write(material->shin_strength,strm); 
    863863  } 
    864864 
     
    867867    c.chunk=LIB3DS_MAT_TRANSPARENCY; 
    868868    c.size=14; 
    869     lib3ds_chunk_write(&c,f); 
    870     int_percentage_write(material->transparency,f); 
     869    lib3ds_chunk_write(&c,strm); 
     870    int_percentage_write(material->transparency,strm); 
    871871  } 
    872872 
     
    875875    c.chunk=LIB3DS_MAT_XPFALL; 
    876876    c.size=14; 
    877     lib3ds_chunk_write(&c,f); 
    878     int_percentage_write(material->falloff,f); 
     877    lib3ds_chunk_write(&c,strm); 
     878    int_percentage_write(material->falloff,strm); 
    879879  } 
    880880 
     
    883883    c.chunk=LIB3DS_MAT_USE_XPFALL; 
    884884    c.size=6; 
    885     lib3ds_chunk_write(&c,f); 
     885    lib3ds_chunk_write(&c,strm); 
    886886  } 
    887887 
     
    890890    c.chunk=LIB3DS_MAT_SHADING; 
    891891    c.size=8; 
    892     lib3ds_chunk_write(&c,f); 
    893     lib3ds_intw_write(material->shading,f); 
     892    lib3ds_chunk_write(&c,strm); 
     893    lib3ds_intw_write(material->shading,strm); 
    894894  } 
    895895 
     
    898898    c.chunk=LIB3DS_MAT_REFBLUR; 
    899899    c.size=14; 
    900     lib3ds_chunk_write(&c,f); 
    901     int_percentage_write(material->blur,f); 
     900    lib3ds_chunk_write(&c,strm); 
     901    int_percentage_write(material->blur,strm); 
    902902  } 
    903903 
     
    906906    c.chunk=LIB3DS_MAT_USE_REFBLUR; 
    907907    c.size=6; 
    908     lib3ds_chunk_write(&c,f); 
     908    lib3ds_chunk_write(&c,strm); 
    909909  } 
    910910 
     
    913913    c.chunk=LIB3DS_MAT_SELF_ILLUM; 
    914914    c.size=6; 
    915     lib3ds_chunk_write(&c,f); 
     915    lib3ds_chunk_write(&c,strm); 
    916916  } 
    917917 
     
    920920    c.chunk=LIB3DS_MAT_TWO_SIDE; 
    921921    c.size=6; 
    922     lib3ds_chunk_write(&c,f); 
     922    lib3ds_chunk_write(&c,strm); 
    923923  } 
    924924   
     
    927927    c.chunk=LIB3DS_MAT_DECAL; 
    928928    c.size=6; 
    929     lib3ds_chunk_write(&c,f); 
     929    lib3ds_chunk_write(&c,strm); 
    930930  } 
    931931 
     
    934934    c.chunk=LIB3DS_MAT_ADDITIVE; 
    935935    c.size=6; 
    936     lib3ds_chunk_write(&c,f); 
     936    lib3ds_chunk_write(&c,strm); 
    937937  } 
    938938 
     
    941941    c.chunk=LIB3DS_MAT_WIRE; 
    942942    c.size=6; 
    943     lib3ds_chunk_write(&c,f); 
     943    lib3ds_chunk_write(&c,strm); 
    944944  } 
    945945 
     
    948948    c.chunk=LIB3DS_MAT_WIREABS; 
    949949    c.size=6; 
    950     lib3ds_chunk_write(&c,f); 
     950    lib3ds_chunk_write(&c,strm); 
    951951  } 
    952952 
     
    955955    c.chunk=LIB3DS_MAT_WIRE_SIZE; 
    956956    c.size=10; 
    957     lib3ds_chunk_write(&c,f); 
    958     lib3ds_float_write(material->wire_size,f); 
     957    lib3ds_chunk_write(&c,strm); 
     958    lib3ds_float_write(material->wire_size,strm); 
    959959  } 
    960960 
     
    963963    c.chunk=LIB3DS_MAT_FACEMAP; 
    964964    c.size=6; 
    965     lib3ds_chunk_write(&c,f); 
     965    lib3ds_chunk_write(&c,strm); 
    966966  } 
    967967 
     
    970970    c.chunk=LIB3DS_MAT_PHONGSOFT; 
    971971    c.size=6; 
    972     lib3ds_chunk_write(&c,f); 
    973   } 
    974  
    975   if (!texture_map_write(LIB3DS_MAT_TEXMAP, &material->texture1_map, f)) { 
    976     return(LIB3DS_FALSE); 
    977   } 
    978   if (!texture_map_write(LIB3DS_MAT_TEXMASK, &material->texture1_mask, f)) { 
    979     return(LIB3DS_FALSE); 
    980   } 
    981   if (!texture_map_write(LIB3DS_MAT_TEX2MAP, &material->texture2_map, f)) { 
    982     return(LIB3DS_FALSE); 
    983   } 
    984   if (!texture_map_write(LIB3DS_MAT_TEX2MASK, &material->texture2_mask, f)) { 
    985     return(LIB3DS_FALSE); 
    986   } 
    987   if (!texture_map_write(LIB3DS_MAT_OPACMAP, &material->opacity_map, f)) { 
    988     return(LIB3DS_FALSE); 
    989   } 
    990   if (!texture_map_write(LIB3DS_MAT_OPACMASK, &material->opacity_mask, f)) { 
    991     return(LIB3DS_FALSE); 
    992   } 
    993   if (!texture_map_write(LIB3DS_MAT_BUMPMAP, &material->bump_map, f)) { 
    994     return(LIB3DS_FALSE); 
    995   } 
    996   if (!texture_map_write(LIB3DS_MAT_BUMPMASK, &material->bump_mask, f)) { 
    997     return(LIB3DS_FALSE); 
    998   } 
    999   if (!texture_map_write(LIB3DS_MAT_SPECMAP, &material->specular_map, f)) { 
    1000     return(LIB3DS_FALSE); 
    1001   } 
    1002   if (!texture_map_write(LIB3DS_MAT_SPECMASK, &material->specular_mask, f)) { 
    1003     return(LIB3DS_FALSE); 
    1004   } 
    1005   if (!texture_map_write(LIB3DS_MAT_SHINMAP, &material->shininess_map, f)) { 
    1006     return(LIB3DS_FALSE); 
    1007   } 
    1008   if (!texture_map_write(LIB3DS_MAT_SHINMASK, &material->shininess_mask, f)) { 
    1009     return(LIB3DS_FALSE); 
    1010   } 
    1011   if (!texture_map_write(LIB3DS_MAT_SELFIMAP, &material->self_illum_map, f)) { 
    1012     return(LIB3DS_FALSE); 
    1013   } 
    1014   if (!texture_map_write(LIB3DS_MAT_SELFIMASK, &material->self_illum_mask, f)) { 
    1015     return(LIB3DS_FALSE); 
    1016   } 
    1017   if (!texture_map_write(LIB3DS_MAT_REFLMAP,  &material->reflection_map, f)) { 
    1018     return(LIB3DS_FALSE); 
    1019   } 
    1020   if (!texture_map_write(LIB3DS_MAT_REFLMASK,  &material->reflection_mask, f)) { 
    1021     return(LIB3DS_FALSE); 
    1022   } 
    1023  
    1024   if (!lib3ds_chunk_write_end(&c,f)) { 
     972    lib3ds_chunk_write(&c,strm); 
     973  } 
     974 
     975  if (!texture_map_write(LIB3DS_MAT_TEXMAP, &material->texture1_map, strm)) { 
     976    return(LIB3DS_FALSE); 
     977  } 
     978  if (!texture_map_write(LIB3DS_MAT_TEXMASK, &material->texture1_mask, strm)) { 
     979    return(LIB3DS_FALSE); 
     980  } 
     981  if (!texture_map_write(LIB3DS_MAT_TEX2MAP, &material->texture2_map, strm)) { 
     982    return(LIB3DS_FALSE); 
     983  } 
     984  if (!texture_map_write(LIB3DS_MAT_TEX2MASK, &material->texture2_mask, strm)) { 
     985    return(LIB3DS_FALSE); 
     986  } 
     987  if (!texture_map_write(LIB3DS_MAT_OPACMAP, &material->opacity_map, strm)) { 
     988    return(LIB3DS_FALSE); 
     989  } 
     990  if (!texture_map_write(LIB3DS_MAT_OPACMASK, &material->opacity_mask, strm)) { 
     991    return(LIB3DS_FALSE); 
     992  } 
     993  if (!texture_map_write(LIB3DS_MAT_BUMPMAP, &material->bump_map, strm)) { 
     994    return(LIB3DS_FALSE); 
     995  } 
     996  if (!texture_map_write(LIB3DS_MAT_BUMPMASK, &material->bump_mask, strm)) { 
     997    return(LIB3DS_FALSE); 
     998  } 
     999  if (!texture_map_write(LIB3DS_MAT_SPECMAP, &material->specular_map, strm)) { 
     1000    return(LIB3DS_FALSE); 
     1001  } 
     1002  if (!texture_map_write(LIB3DS_MAT_SPECMASK, &material->specular_mask, strm)) { 
     1003    return(LIB3DS_FALSE); 
     1004  } 
     1005  if (!texture_map_write(LIB3DS_MAT_SHINMAP, &material->shininess_map, strm)) { 
     1006    return(LIB3DS_FALSE); 
     1007  } 
     1008  if (!texture_map_write(LIB3DS_MAT_SHINMASK, &material->shininess_mask, strm)) { 
     1009    return(LIB3DS_FALSE); 
     1010  } 
     1011  if (!texture_map_write(LIB3DS_MAT_SELFIMAP, &material->self_illum_map, strm)) { 
     1012    return(LIB3DS_FALSE); 
     1013  } 
     1014  if (!texture_map_write(LIB3DS_MAT_SELFIMASK, &material->self_illum_mask, strm)) { 
     1015    return(LIB3DS_FALSE); 
     1016  } 
     1017  if (!texture_map_write(LIB3DS_MAT_REFLMAP,  &material->reflection_map, strm)) { 
     1018    return(LIB3DS_FALSE); 
     1019  } 
     1020  if (!texture_map_write(LIB3DS_MAT_REFLMASK,  &material->reflection_mask, strm)) { 
     1021    return(LIB3DS_FALSE); 
     1022  } 
     1023 
     1024  if (!lib3ds_chunk_write_end(&c,strm)) { 
    10251025    return(LIB3DS_FALSE); 
    10261026  }