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

    r1563 r10076  
    122122 */ 
    123123static Lib3dsBool 
    124 spotlight_read(Lib3dsLight *light, FILE *f) 
     124spotlight_read(Lib3dsLight *light, iostream *strm) 
    125125{ 
    126126  Lib3dsChunk c; 
     
    128128  int i; 
    129129 
    130   if (!lib3ds_chunk_read_start(&c, LIB3DS_DL_SPOTLIGHT, f)) { 
     130  if (!lib3ds_chunk_read_start(&c, LIB3DS_DL_SPOTLIGHT, strm)) { 
    131131    return(LIB3DS_FALSE); 
    132132  } 
    133133  light->spot_light=LIB3DS_TRUE; 
    134134  for (i=0; i<3; ++i) { 
    135     light->spot[i]=lib3ds_float_read(f); 
    136   } 
    137   light->hot_spot = lib3ds_float_read(f); 
    138   light->fall_off = lib3ds_float_read(f); 
    139   lib3ds_chunk_read_tell(&c, f); 
     135    light->spot[i]=lib3ds_float_read(strm); 
     136  } 
     137  light->hot_spot = lib3ds_float_read(strm); 
     138  light->fall_off = lib3ds_float_read(strm); 
     139  lib3ds_chunk_read_tell(&c, strm); 
    140140   
    141   while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { 
     141  while ((chunk=lib3ds_chunk_read_next(&c, strm))!=0) { 
    142142    switch (chunk) { 
    143143      case LIB3DS_DL_SPOT_ROLL: 
    144144        { 
    145           light->roll=lib3ds_float_read(f); 
     145          light->roll=lib3ds_float_read(strm); 
    146146        } 
    147147        break; 
     
    153153      case LIB3DS_DL_LOCAL_SHADOW2: 
    154154        { 
    155           light->shadow_bias=lib3ds_float_read(f); 
    156           light->shadow_filter=lib3ds_float_read(f); 
    157           light->shadow_size=lib3ds_intw_read(f); 
     155          light->shadow_bias=lib3ds_float_read(strm); 
     156          light->shadow_filter=lib3ds_float_read(strm); 
     157          light->shadow_size=lib3ds_intw_read(strm); 
    158158        } 
    159159        break; 
     
    170170      case LIB3DS_DL_SPOT_ASPECT: 
    171171        { 
    172           light->spot_aspect=lib3ds_float_read(f); 
     172          light->spot_aspect=lib3ds_float_read(strm); 
    173173        } 
    174174        break; 
     
    176176        { 
    177177          light->use_projector=LIB3DS_TRUE; 
    178           if (!lib3ds_string_read(light->projector, 64, f)) { 
     178          if (!lib3ds_string_read(light->projector, 64, strm)) { 
    179179            return(LIB3DS_FALSE); 
    180180          } 
     
    187187      case LIB3DS_DL_RAY_BIAS: 
    188188        { 
    189           light->ray_bias=lib3ds_float_read(f); 
     189          light->ray_bias=lib3ds_float_read(strm); 
    190190        } 
    191191        break; 
     
    200200  } 
    201201   
    202   lib3ds_chunk_read_end(&c, f); 
     202  lib3ds_chunk_read_end(&c, strm); 
    203203  return(LIB3DS_TRUE); 
    204204} 
     
    209209 */ 
    210210Lib3dsBool 
    211 lib3ds_light_read(Lib3dsLight *light, FILE *f) 
     211lib3ds_light_read(Lib3dsLight *light, iostream * strm) 
    212212{ 
    213213  Lib3dsChunk c; 
    214214  Lib3dsWord chunk; 
    215215 
    216   if (!lib3ds_chunk_read_start(&c, LIB3DS_N_DIRECT_LIGHT, f)) { 
     216  if (!lib3ds_chunk_read_start(&c, LIB3DS_N_DIRECT_LIGHT, strm)) { 
    217217    return(LIB3DS_FALSE); 
    218218  } 
     
    220220    int i; 
    221221    for (i=0; i<3; ++i) { 
    222       light->position[i]=lib3ds_float_read(f); 
    223     } 
    224   } 
    225   lib3ds_chunk_read_tell(&c, f); 
     222      light->position[i]=lib3ds_float_read(strm); 
     223    } 
     224  } 
     225  lib3ds_chunk_read_tell(&c, strm); 
    226226   
    227   while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) { 
     227  while ((chunk=lib3ds_chunk_read_next(&c, strm))!=0) { 
    228228    switch (chunk) { 
    229229      case LIB3DS_COLOR_F: 
     
    231231          int i; 
    232232          for (i=0; i<3; ++i) { 
    233             light->color[i]=lib3ds_float_read(f); 
     233            light->color[i]=lib3ds_float_read(strm); 
    234234          } 
    235235        } 
     
    242242      case LIB3DS_DL_OUTER_RANGE: 
    243243        { 
    244           light->outer_range=lib3ds_float_read(f); 
     244          light->outer_range=lib3ds_float_read(strm); 
    245245        } 
    246246        break; 
    247247      case LIB3DS_DL_INNER_RANGE: 
    248248        { 
    249           light->inner_range=lib3ds_float_read(f); 
     249          light->inner_range=lib3ds_float_read(strm); 
    250250        } 
    251251        break; 
    252252      case LIB3DS_DL_MULTIPLIER: 
    253253        { 
    254           light->multiplier=lib3ds_float_read(f); 
     254          light->multiplier=lib3ds_float_read(strm); 
    255255        } 
    256256        break; 
     
    262262      case LIB3DS_DL_ATTENUATE: 
    263263        { 
    264           light->attenuation=lib3ds_float_read(f); 
     264          light->attenuation=lib3ds_float_read(strm); 
    265265        } 
    266266        break; 
    267267      case LIB3DS_DL_SPOTLIGHT: 
    268268        { 
    269           lib3ds_chunk_read_reset(&c, f); 
    270           if (!spotlight_read(light, f)) { 
     269          lib3ds_chunk_read_reset(&c, strm); 
     270          if (!spotlight_read(light, strm)) { 
    271271            return(LIB3DS_FALSE); 
    272272          } 
     
    278278  } 
    279279   
    280   lib3ds_chunk_read_end(&c, f); 
     280  lib3ds_chunk_read_end(&c, strm); 
    281281  return(LIB3DS_TRUE); 
    282282} 
     
    287287 */ 
    288288Lib3dsBool 
    289 lib3ds_light_write(Lib3dsLight *light, FILE *f) 
     289lib3ds_light_write(Lib3dsLight *light, iostream *strm) 
    290290{ 
    291291  Lib3dsChunk c; 
    292292 
    293293  c.chunk=LIB3DS_N_DIRECT_LIGHT; 
    294   if (!lib3ds_chunk_write_start(&c,f)) { 
     294  if (!lib3ds_chunk_write_start(&c,strm)) { 
    295295    return(LIB3DS_FALSE); 
    296296  } 
    297   lib3ds_vector_write(light->position, f); 
     297  lib3ds_vector_write(light->position, strm); 
    298298  { /*---- LIB3DS_COLOR_F ----*/ 
    299299    Lib3dsChunk c; 
    300300    c.chunk=LIB3DS_COLOR_F; 
    301301    c.size=18; 
    302     lib3ds_chunk_write(&c, f); 
    303     lib3ds_rgb_write(light->color,f); 
     302    lib3ds_chunk_write(&c, strm); 
     303    lib3ds_rgb_write(light->color,strm); 
    304304  } 
    305305  if (light->off) { /*---- LIB3DS_DL_OFF ----*/ 
     
    307307    c.chunk=LIB3DS_DL_OFF; 
    308308    c.size=6; 
    309     lib3ds_chunk_write(&c, f); 
     309    lib3ds_chunk_write(&c, strm); 
    310310  } 
    311311  { /*---- LIB3DS_DL_OUTER_RANGE ----*/ 
     
    313313    c.chunk=LIB3DS_DL_OUTER_RANGE; 
    314314    c.size=10; 
    315     lib3ds_chunk_write(&c, f); 
    316     lib3ds_float_write(light->outer_range,f); 
     315    lib3ds_chunk_write(&c, strm); 
     316    lib3ds_float_write(light->outer_range,strm); 
    317317  } 
    318318  { /*---- LIB3DS_DL_INNER_RANGE ----*/ 
     
    320320    c.chunk=LIB3DS_DL_INNER_RANGE; 
    321321    c.size=10; 
    322     lib3ds_chunk_write(&c, f); 
    323     lib3ds_float_write(light->inner_range,f); 
     322    lib3ds_chunk_write(&c, strm); 
     323    lib3ds_float_write(light->inner_range,strm); 
    324324  } 
    325325  { /*---- LIB3DS_DL_MULTIPLIER ----*/ 
     
    327327    c.chunk=LIB3DS_DL_MULTIPLIER; 
    328328    c.size=10; 
    329     lib3ds_chunk_write(&c, f); 
    330     lib3ds_float_write(light->multiplier, f); 
     329    lib3ds_chunk_write(&c, strm); 
     330    lib3ds_float_write(light->multiplier, strm); 
    331331  } 
    332332  if (light->attenuation) { /*---- LIB3DS_DL_ATTENUATE ----*/ 
     
    334334    c.chunk=LIB3DS_DL_ATTENUATE; 
    335335    c.size=6; 
    336     lib3ds_chunk_write(&c, f); 
     336    lib3ds_chunk_write(&c, strm); 
    337337  } 
    338338 
     
    341341 
    342342    c.chunk=LIB3DS_DL_SPOTLIGHT; 
    343     if (!lib3ds_chunk_write_start(&c,f)) { 
     343    if (!lib3ds_chunk_write_start(&c,strm)) { 
    344344      return(LIB3DS_FALSE); 
    345345    } 
    346     lib3ds_vector_write(light->spot, f); 
    347     lib3ds_float_write(light->hot_spot, f); 
    348     lib3ds_float_write(light->fall_off, f); 
     346    lib3ds_vector_write(light->spot, strm); 
     347    lib3ds_float_write(light->hot_spot, strm); 
     348    lib3ds_float_write(light->fall_off, strm); 
    349349     
    350350    { /*---- LIB3DS_DL_SPOT_ROLL ----*/ 
     
    352352      c.chunk=LIB3DS_DL_SPOT_ROLL; 
    353353      c.size=10; 
    354       lib3ds_chunk_write(&c, f); 
    355       lib3ds_float_write(light->roll,f); 
     354      lib3ds_chunk_write(&c, strm); 
     355      lib3ds_float_write(light->roll,strm); 
    356356    } 
    357357    if (light->shadowed) { /*---- LIB3DS_DL_SHADOWED ----*/ 
     
    359359      c.chunk=LIB3DS_DL_SHADOWED; 
    360360      c.size=6; 
    361       lib3ds_chunk_write(&c, f); 
     361      lib3ds_chunk_write(&c, strm); 
    362362    } 
    363363    if ((fabs(light->shadow_bias)>LIB3DS_EPSILON) || 
     
    367367      c.chunk=LIB3DS_DL_LOCAL_SHADOW2; 
    368368      c.size=16; 
    369       lib3ds_chunk_write(&c, f); 
    370       lib3ds_float_write(light->shadow_bias,f); 
    371       lib3ds_float_write(light->shadow_filter,f); 
    372       lib3ds_intw_write(light->shadow_size,f); 
     369      lib3ds_chunk_write(&c, strm); 
     370      lib3ds_float_write(light->shadow_bias,strm); 
     371      lib3ds_float_write(light->shadow_filter,strm); 
     372      lib3ds_intw_write(light->shadow_size,strm); 
    373373    } 
    374374    if (light->see_cone) { /*---- LIB3DS_DL_SEE_CONE ----*/ 
     
    376376      c.chunk=LIB3DS_DL_SEE_CONE; 
    377377      c.size=6; 
    378       lib3ds_chunk_write(&c, f); 
     378      lib3ds_chunk_write(&c, strm); 
    379379    } 
    380380    if (light->rectangular_spot) { /*---- LIB3DS_DL_SPOT_RECTANGULAR ----*/ 
     
    382382      c.chunk=LIB3DS_DL_SPOT_RECTANGULAR; 
    383383      c.size=6; 
    384       lib3ds_chunk_write(&c, f); 
     384      lib3ds_chunk_write(&c, strm); 
    385385    } 
    386386    if (fabs(light->spot_aspect)>LIB3DS_EPSILON) { /*---- LIB3DS_DL_SPOT_ASPECT ----*/ 
     
    388388      c.chunk=LIB3DS_DL_SPOT_ASPECT; 
    389389      c.size=10; 
    390       lib3ds_chunk_write(&c, f); 
    391       lib3ds_float_write(light->spot_aspect,f); 
     390      lib3ds_chunk_write(&c, strm); 
     391      lib3ds_float_write(light->spot_aspect,strm); 
    392392    } 
    393393    if (light->use_projector) { /*---- LIB3DS_DL_SPOT_PROJECTOR ----*/ 
     
    395395      c.chunk=LIB3DS_DL_SPOT_PROJECTOR; 
    396396      c.size=10; 
    397       lib3ds_chunk_write(&c, f); 
    398       lib3ds_string_write(light->projector,f); 
     397      lib3ds_chunk_write(&c, strm); 
     398      lib3ds_string_write(light->projector,strm); 
    399399    } 
    400400    if (light->spot_overshoot) { /*---- LIB3DS_DL_SPOT_OVERSHOOT ----*/ 
     
    402402      c.chunk=LIB3DS_DL_SPOT_OVERSHOOT; 
    403403      c.size=6; 
    404       lib3ds_chunk_write(&c, f); 
     404      lib3ds_chunk_write(&c, strm); 
    405405    } 
    406406    if (fabs(light->ray_bias)>LIB3DS_EPSILON) { /*---- LIB3DS_DL_RAY_BIAS ----*/ 
     
    408408      c.chunk=LIB3DS_DL_RAY_BIAS; 
    409409      c.size=10; 
    410       lib3ds_chunk_write(&c, f); 
    411       lib3ds_float_write(light->ray_bias,f); 
     410      lib3ds_chunk_write(&c, strm); 
     411      lib3ds_float_write(light->ray_bias,strm); 
    412412    } 
    413413    if (light->ray_shadows) { /*---- LIB3DS_DL_RAYSHAD ----*/ 
     
    415415      c.chunk=LIB3DS_DL_RAYSHAD; 
    416416      c.size=6; 
    417       lib3ds_chunk_write(&c, f); 
    418     } 
    419     if (!lib3ds_chunk_write_end(&c,f)) { 
     417      lib3ds_chunk_write(&c, strm); 
     418    } 
     419    if (!lib3ds_chunk_write_end(&c,strm)) { 
    420420      return(LIB3DS_FALSE); 
    421421    } 
    422422  } 
    423   if (!lib3ds_chunk_write_end(&c,f)) { 
     423  if (!lib3ds_chunk_write_end(&c,strm)) { 
    424424    return(LIB3DS_FALSE); 
    425425  }