00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "lib3ds_impl.h"
00019
00020
00021 static void
00022 initialize_texture_map(Lib3dsTextureMap *map) {
00023 map->flags = 0x10;
00024 map->percent = 1.0f;
00025 map->scale[0] = 1.0f;
00026 map->scale[1] = 1.0f;
00027 }
00028
00029
00038 Lib3dsMaterial*
00039 lib3ds_material_new(const char* name) {
00040 Lib3dsMaterial *mat;
00041
00042 mat = (Lib3dsMaterial*)calloc(sizeof(Lib3dsMaterial), 1);
00043 if (!mat) {
00044 return(0);
00045 }
00046
00047 if (name) {
00048 strcpy(mat->name, name);
00049 }
00050 mat->ambient[0] = mat->ambient[1] = mat->ambient[2] = 0.588235f;
00051 mat->diffuse[0] = mat->diffuse[1] = mat->diffuse[2] = 0.588235f;
00052 mat->specular[0] = mat->specular[1] = mat->specular[2] = 0.898039f;
00053 mat->shininess = 0.1f;
00054 mat->wire_size = 1.0f;
00055 mat->shading = 3;
00056
00057 initialize_texture_map(&mat->texture1_map);
00058 initialize_texture_map(&mat->texture1_mask);
00059 initialize_texture_map(&mat->texture2_map);
00060 initialize_texture_map(&mat->texture2_mask);
00061 initialize_texture_map(&mat->opacity_map);
00062 initialize_texture_map(&mat->opacity_mask);
00063 initialize_texture_map(&mat->bump_map);
00064 initialize_texture_map(&mat->bump_mask);
00065 initialize_texture_map(&mat->specular_map);
00066 initialize_texture_map(&mat->specular_mask);
00067 initialize_texture_map(&mat->shininess_map);
00068 initialize_texture_map(&mat->shininess_mask);
00069 initialize_texture_map(&mat->self_illum_map);
00070 initialize_texture_map(&mat->self_illum_mask);
00071 initialize_texture_map(&mat->reflection_map);
00072 initialize_texture_map(&mat->reflection_mask);
00073
00074 return(mat);
00075 }
00076
00077
00078 void
00079 lib3ds_material_free(Lib3dsMaterial *material) {
00080 memset(material, 0, sizeof(Lib3dsMaterial));
00081 free(material);
00082 }
00083
00084
00085 static void
00086 color_read(float rgb[3], Lib3dsIo *io) {
00087 Lib3dsChunk c;
00088 uint16_t chunk;
00089 int have_lin = FALSE;
00090
00091 lib3ds_chunk_read_start(&c, 0, io);
00092
00093 while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00094 switch (chunk) {
00095 case CHK_LIN_COLOR_24: {
00096 int i;
00097 for (i = 0; i < 3; ++i) {
00098 rgb[i] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00099 }
00100 have_lin = TRUE;
00101 break;
00102 }
00103
00104 case CHK_COLOR_24: {
00105
00106
00107 if (!have_lin) {
00108 int i;
00109 for (i = 0; i < 3; ++i) {
00110 rgb[i] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00111 }
00112 }
00113 break;
00114 }
00115
00116 case CHK_LIN_COLOR_F: {
00117 int i;
00118 for (i = 0; i < 3; ++i) {
00119 rgb[i] = lib3ds_io_read_float(io);
00120 }
00121 have_lin = TRUE;
00122 break;
00123 }
00124
00125 case CHK_COLOR_F: {
00126 if (!have_lin) {
00127 int i;
00128 for (i = 0; i < 3; ++i) {
00129 rgb[i] = lib3ds_io_read_float(io);
00130 }
00131 }
00132 break;
00133 }
00134
00135 default:
00136 lib3ds_chunk_unknown(chunk, io);
00137 }
00138 }
00139
00140 lib3ds_chunk_read_end(&c, io);
00141 }
00142
00143
00144 static void
00145 int_percentage_read(float *p, Lib3dsIo *io) {
00146 Lib3dsChunk c;
00147 uint16_t chunk;
00148
00149 lib3ds_chunk_read_start(&c, 0, io);
00150
00151 while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00152 switch (chunk) {
00153 case CHK_INT_PERCENTAGE: {
00154 int16_t i = lib3ds_io_read_intw(io);
00155 *p = (float)(1.0 * i / 100.0);
00156 break;
00157 }
00158
00159 default:
00160 lib3ds_chunk_unknown(chunk, io);
00161 }
00162 }
00163
00164 lib3ds_chunk_read_end(&c, io);
00165 }
00166
00167
00168 static void
00169 texture_map_read(Lib3dsTextureMap *map, Lib3dsIo *io) {
00170 Lib3dsChunk c;
00171 uint16_t chunk;
00172
00173 lib3ds_chunk_read_start(&c, 0, io);
00174
00175 while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00176 switch (chunk) {
00177 case CHK_INT_PERCENTAGE: {
00178 map->percent = 1.0f * lib3ds_io_read_intw(io) / 100.0f;
00179 break;
00180 }
00181
00182 case CHK_MAT_MAPNAME: {
00183 lib3ds_io_read_string(io, map->name, 64);
00184 lib3ds_io_log(io, LIB3DS_LOG_INFO, " NAME=%s", map->name);
00185 break;
00186 }
00187
00188 case CHK_MAT_MAP_TILING: {
00189 map->flags = lib3ds_io_read_word(io);
00190 break;
00191 }
00192
00193 case CHK_MAT_MAP_TEXBLUR:
00194 map->blur = lib3ds_io_read_float(io);
00195 break;
00196
00197 case CHK_MAT_MAP_USCALE:
00198 map->scale[0] = lib3ds_io_read_float(io);
00199 break;
00200
00201 case CHK_MAT_MAP_VSCALE: {
00202 map->scale[1] = lib3ds_io_read_float(io);
00203 break;
00204 }
00205 case CHK_MAT_MAP_UOFFSET: {
00206 map->offset[0] = lib3ds_io_read_float(io);
00207 break;
00208 }
00209
00210 case CHK_MAT_MAP_VOFFSET: {
00211 map->offset[1] = lib3ds_io_read_float(io);
00212 break;
00213 }
00214
00215 case CHK_MAT_MAP_ANG: {
00216 map->rotation = lib3ds_io_read_float(io);
00217 break;
00218 }
00219
00220 case CHK_MAT_MAP_COL1: {
00221 map->tint_1[0] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00222 map->tint_1[1] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00223 map->tint_1[2] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00224 break;
00225 }
00226
00227 case CHK_MAT_MAP_COL2: {
00228 map->tint_2[0] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00229 map->tint_2[1] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00230 map->tint_2[2] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00231 break;
00232 }
00233
00234 case CHK_MAT_MAP_RCOL: {
00235 map->tint_r[0] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00236 map->tint_r[1] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00237 map->tint_r[2] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00238 break;
00239 }
00240
00241 case CHK_MAT_MAP_GCOL: {
00242 map->tint_g[0] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00243 map->tint_g[1] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00244 map->tint_g[2] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00245 break;
00246 }
00247
00248 case CHK_MAT_MAP_BCOL: {
00249 map->tint_b[0] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00250 map->tint_b[1] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00251 map->tint_b[2] = 1.0f * lib3ds_io_read_byte(io) / 255.0f;
00252 break;
00253 }
00254
00255 default:
00256 lib3ds_chunk_unknown(chunk,io);
00257 }
00258 }
00259
00260 lib3ds_chunk_read_end(&c, io);
00261 }
00262
00263
00264 void
00265 lib3ds_material_read(Lib3dsMaterial *material, Lib3dsIo *io) {
00266 Lib3dsChunk c;
00267 uint16_t chunk;
00268
00269 assert(material);
00270 lib3ds_chunk_read_start(&c, CHK_MAT_ENTRY, io);
00271
00272 while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00273 switch (chunk) {
00274 case CHK_MAT_NAME: {
00275 lib3ds_io_read_string(io, material->name, 64);
00276 lib3ds_io_log(io, LIB3DS_LOG_INFO, " NAME=%s", material->name);
00277 break;
00278 }
00279
00280 case CHK_MAT_AMBIENT: {
00281 lib3ds_chunk_read_reset(&c, io);
00282 color_read(material->ambient, io);
00283 break;
00284 }
00285
00286 case CHK_MAT_DIFFUSE: {
00287 lib3ds_chunk_read_reset(&c, io);
00288 color_read(material->diffuse, io);
00289 break;
00290 }
00291
00292 case CHK_MAT_SPECULAR: {
00293 lib3ds_chunk_read_reset(&c, io);
00294 color_read(material->specular, io);
00295 break;
00296 }
00297
00298 case CHK_MAT_SHININESS: {
00299 lib3ds_chunk_read_reset(&c, io);
00300 int_percentage_read(&material->shininess, io);
00301 break;
00302 }
00303
00304 case CHK_MAT_SHIN2PCT: {
00305 lib3ds_chunk_read_reset(&c, io);
00306 int_percentage_read(&material->shin_strength, io);
00307 break;
00308 }
00309
00310 case CHK_MAT_TRANSPARENCY: {
00311 lib3ds_chunk_read_reset(&c, io);
00312 int_percentage_read(&material->transparency, io);
00313 break;
00314 }
00315
00316 case CHK_MAT_XPFALL: {
00317 lib3ds_chunk_read_reset(&c, io);
00318 int_percentage_read(&material->falloff, io);
00319 break;
00320 }
00321
00322 case CHK_MAT_SELF_ILPCT: {
00323 lib3ds_chunk_read_reset(&c, io);
00324 int_percentage_read(&material->self_illum, io);
00325 break;
00326 }
00327
00328 case CHK_MAT_USE_XPFALL: {
00329 material->use_falloff = TRUE;
00330 break;
00331 }
00332
00333 case CHK_MAT_REFBLUR: {
00334 lib3ds_chunk_read_reset(&c, io);
00335 int_percentage_read(&material->blur, io);
00336 break;
00337 }
00338
00339 case CHK_MAT_USE_REFBLUR: {
00340 material->use_blur = TRUE;
00341 break;
00342 }
00343
00344 case CHK_MAT_SHADING: {
00345 material->shading = lib3ds_io_read_intw(io);
00346 break;
00347 }
00348
00349 case CHK_MAT_SELF_ILLUM: {
00350 material->self_illum_flag = TRUE;
00351 break;
00352 }
00353
00354 case CHK_MAT_TWO_SIDE: {
00355 material->two_sided = TRUE;
00356 break;
00357 }
00358
00359 case CHK_MAT_DECAL: {
00360 material->map_decal = TRUE;
00361 break;
00362 }
00363
00364 case CHK_MAT_ADDITIVE: {
00365 material->is_additive = TRUE;
00366 break;
00367 }
00368
00369 case CHK_MAT_FACEMAP: {
00370 material->face_map = TRUE;
00371 break;
00372 }
00373
00374 case CHK_MAT_PHONGSOFT: {
00375 material->soften = TRUE;
00376 break;
00377 }
00378
00379 case CHK_MAT_WIRE: {
00380 material->use_wire = TRUE;
00381 break;
00382 }
00383
00384 case CHK_MAT_WIREABS: {
00385 material->use_wire_abs = TRUE;
00386 break;
00387 }
00388 case CHK_MAT_WIRE_SIZE: {
00389 material->wire_size = lib3ds_io_read_float(io);
00390 break;
00391 }
00392
00393 case CHK_MAT_TEXMAP: {
00394 lib3ds_chunk_read_reset(&c, io);
00395 texture_map_read(&material->texture1_map, io);
00396 break;
00397 }
00398
00399 case CHK_MAT_TEXMASK: {
00400 lib3ds_chunk_read_reset(&c, io);
00401 texture_map_read(&material->texture1_mask, io);
00402 break;
00403 }
00404
00405 case CHK_MAT_TEX2MAP: {
00406 lib3ds_chunk_read_reset(&c, io);
00407 texture_map_read(&material->texture2_map, io);
00408 break;
00409 }
00410
00411 case CHK_MAT_TEX2MASK: {
00412 lib3ds_chunk_read_reset(&c, io);
00413 texture_map_read(&material->texture2_mask, io);
00414 break;
00415 }
00416
00417 case CHK_MAT_OPACMAP: {
00418 lib3ds_chunk_read_reset(&c, io);
00419 texture_map_read(&material->opacity_map, io);
00420 break;
00421 }
00422
00423 case CHK_MAT_OPACMASK: {
00424 lib3ds_chunk_read_reset(&c, io);
00425 texture_map_read(&material->opacity_mask, io);
00426 break;
00427 }
00428
00429 case CHK_MAT_BUMPMAP: {
00430 lib3ds_chunk_read_reset(&c, io);
00431 texture_map_read(&material->bump_map, io);
00432 break;
00433 }
00434 case CHK_MAT_BUMPMASK: {
00435 lib3ds_chunk_read_reset(&c, io);
00436 texture_map_read(&material->bump_mask, io);
00437 break;
00438 }
00439 case CHK_MAT_SPECMAP: {
00440 lib3ds_chunk_read_reset(&c, io);
00441 texture_map_read(&material->specular_map, io);
00442 break;
00443 }
00444
00445 case CHK_MAT_SPECMASK: {
00446 lib3ds_chunk_read_reset(&c, io);
00447 texture_map_read(&material->specular_mask, io);
00448 break;
00449 }
00450
00451 case CHK_MAT_SHINMAP: {
00452 lib3ds_chunk_read_reset(&c, io);
00453 texture_map_read(&material->shininess_map, io);
00454 break;
00455 }
00456
00457 case CHK_MAT_SHINMASK: {
00458 lib3ds_chunk_read_reset(&c, io);
00459 texture_map_read(&material->shininess_mask, io);
00460 break;
00461 }
00462
00463 case CHK_MAT_SELFIMAP: {
00464 lib3ds_chunk_read_reset(&c, io);
00465 texture_map_read(&material->self_illum_map, io);
00466 break;
00467 }
00468
00469 case CHK_MAT_SELFIMASK: {
00470 lib3ds_chunk_read_reset(&c, io);
00471 texture_map_read(&material->self_illum_mask, io);
00472 break;
00473 }
00474
00475 case CHK_MAT_REFLMAP: {
00476 lib3ds_chunk_read_reset(&c, io);
00477 texture_map_read(&material->reflection_map, io);
00478 break;
00479 }
00480
00481 case CHK_MAT_REFLMASK: {
00482 lib3ds_chunk_read_reset(&c, io);
00483 texture_map_read(&material->reflection_mask, io);
00484 break;
00485 }
00486
00487 case CHK_MAT_ACUBIC: {
00488 lib3ds_io_read_intb(io);
00489 material->autorefl_map_anti_alias = lib3ds_io_read_intb(io);
00490 material->autorefl_map_flags = lib3ds_io_read_intw(io);
00491 material->autorefl_map_size = lib3ds_io_read_intd(io);
00492 material->autorefl_map_frame_step = lib3ds_io_read_intd(io);
00493 break;
00494 }
00495
00496 default:
00497 lib3ds_chunk_unknown(chunk, io);
00498 }
00499 }
00500
00501 lib3ds_chunk_read_end(&c, io);
00502 }
00503
00504
00505 static void
00506 color_write(float rgb[3], Lib3dsIo *io) {
00507 Lib3dsChunk c;
00508
00509 c.chunk = CHK_COLOR_24;
00510 c.size = 9;
00511 lib3ds_chunk_write(&c, io);
00512 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*rgb[0] + 0.5));
00513 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*rgb[1] + 0.5));
00514 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*rgb[2] + 0.5));
00515
00516 c.chunk = CHK_LIN_COLOR_24;
00517 c.size = 9;
00518 lib3ds_chunk_write(&c, io);
00519 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*rgb[0] + 0.5));
00520 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*rgb[1] + 0.5));
00521 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*rgb[2] + 0.5));
00522 }
00523
00524
00525 static void
00526 int_percentage_write(float p, Lib3dsIo *io) {
00527 Lib3dsChunk c;
00528
00529 c.chunk = CHK_INT_PERCENTAGE;
00530 c.size = 8;
00531 lib3ds_chunk_write(&c, io);
00532 lib3ds_io_write_intw(io, (uint8_t)floor(100.0*p + 0.5));
00533 }
00534
00535
00536 static void
00537 texture_map_write(uint16_t chunk, Lib3dsTextureMap *map, Lib3dsIo *io) {
00538 Lib3dsChunk c;
00539
00540 if (strlen(map->name) == 0) {
00541 return;
00542 }
00543 c.chunk = chunk;
00544 lib3ds_chunk_write_start(&c, io);
00545
00546 int_percentage_write(map->percent, io);
00547
00548 {
00549 Lib3dsChunk c;
00550 c.chunk = CHK_MAT_MAPNAME;
00551 c.size = 6 + (uint32_t)strlen(map->name) + 1;
00552 lib3ds_chunk_write(&c, io);
00553 lib3ds_io_write_string(io, map->name);
00554 }
00555
00556 {
00557 Lib3dsChunk c;
00558 c.chunk = CHK_MAT_MAP_TILING;
00559 c.size = 8;
00560 lib3ds_chunk_write(&c, io);
00561 lib3ds_io_write_word(io, (uint16_t)map->flags);
00562 }
00563
00564 {
00565 Lib3dsChunk c;
00566 c.chunk = CHK_MAT_MAP_TEXBLUR;
00567 c.size = 10;
00568 lib3ds_chunk_write(&c, io);
00569 lib3ds_io_write_float(io, map->blur);
00570 }
00571
00572 {
00573 Lib3dsChunk c;
00574 c.chunk = CHK_MAT_MAP_USCALE;
00575 c.size = 10;
00576 lib3ds_chunk_write(&c, io);
00577 lib3ds_io_write_float(io, map->scale[0]);
00578 }
00579
00580 {
00581 Lib3dsChunk c;
00582 c.chunk = CHK_MAT_MAP_VSCALE;
00583 c.size = 10;
00584 lib3ds_chunk_write(&c, io);
00585 lib3ds_io_write_float(io, map->scale[1]);
00586 }
00587
00588 {
00589 Lib3dsChunk c;
00590 c.chunk = CHK_MAT_MAP_UOFFSET;
00591 c.size = 10;
00592 lib3ds_chunk_write(&c, io);
00593 lib3ds_io_write_float(io, map->offset[0]);
00594 }
00595
00596 {
00597 Lib3dsChunk c;
00598 c.chunk = CHK_MAT_MAP_VOFFSET;
00599 c.size = 10;
00600 lib3ds_chunk_write(&c, io);
00601 lib3ds_io_write_float(io, map->offset[1]);
00602 }
00603
00604 {
00605 Lib3dsChunk c;
00606 c.chunk = CHK_MAT_MAP_ANG;
00607 c.size = 10;
00608 lib3ds_chunk_write(&c, io);
00609 lib3ds_io_write_float(io, map->rotation);
00610 }
00611
00612 {
00613 Lib3dsChunk c;
00614 c.chunk = CHK_MAT_MAP_COL1;
00615 c.size = 9;
00616 lib3ds_chunk_write(&c, io);
00617 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_1[0] + 0.5));
00618 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_1[1] + 0.5));
00619 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_1[2] + 0.5));
00620 }
00621
00622 {
00623 Lib3dsChunk c;
00624 c.chunk = CHK_MAT_MAP_COL2;
00625 c.size = 9;
00626 lib3ds_chunk_write(&c, io);
00627 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_2[0] + 0.5));
00628 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_2[1] + 0.5));
00629 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_2[2] + 0.5));
00630 }
00631
00632 {
00633 Lib3dsChunk c;
00634 c.chunk = CHK_MAT_MAP_RCOL;
00635 c.size = 9;
00636 lib3ds_chunk_write(&c, io);
00637 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_r[0] + 0.5));
00638 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_r[1] + 0.5));
00639 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_r[2] + 0.5));
00640 }
00641
00642 {
00643 Lib3dsChunk c;
00644 c.chunk = CHK_MAT_MAP_GCOL;
00645 c.size = 9;
00646 lib3ds_chunk_write(&c, io);
00647 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_g[0] + 0.5));
00648 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_g[1] + 0.5));
00649 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_g[2] + 0.5));
00650 }
00651
00652 {
00653 Lib3dsChunk c;
00654 c.chunk = CHK_MAT_MAP_BCOL;
00655 c.size = 9;
00656 lib3ds_chunk_write(&c, io);
00657 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_b[0] + 0.5));
00658 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_b[1] + 0.5));
00659 lib3ds_io_write_byte(io, (uint8_t)floor(255.0*map->tint_b[2] + 0.5));
00660 }
00661
00662 lib3ds_chunk_write_end(&c, io);
00663 }
00664
00665
00666 void
00667 lib3ds_material_write(Lib3dsMaterial *material, Lib3dsIo *io) {
00668 Lib3dsChunk c;
00669
00670 c.chunk = CHK_MAT_ENTRY;
00671 lib3ds_chunk_write_start(&c, io);
00672
00673 {
00674 Lib3dsChunk c;
00675 c.chunk = CHK_MAT_NAME;
00676 c.size = 6 + (uint32_t)strlen(material->name) + 1;
00677 lib3ds_chunk_write(&c, io);
00678 lib3ds_io_write_string(io, material->name);
00679 }
00680
00681 {
00682 Lib3dsChunk c;
00683 c.chunk = CHK_MAT_AMBIENT;
00684 c.size = 24;
00685 lib3ds_chunk_write(&c, io);
00686 color_write(material->ambient, io);
00687 }
00688
00689 {
00690 Lib3dsChunk c;
00691 c.chunk = CHK_MAT_DIFFUSE;
00692 c.size = 24;
00693 lib3ds_chunk_write(&c, io);
00694 color_write(material->diffuse, io);
00695 }
00696
00697 {
00698 Lib3dsChunk c;
00699 c.chunk = CHK_MAT_SPECULAR;
00700 c.size = 24;
00701 lib3ds_chunk_write(&c, io);
00702 color_write(material->specular, io);
00703 }
00704
00705 {
00706 Lib3dsChunk c;
00707 c.chunk = CHK_MAT_SHININESS;
00708 c.size = 14;
00709 lib3ds_chunk_write(&c, io);
00710 int_percentage_write(material->shininess, io);
00711 }
00712
00713 {
00714 Lib3dsChunk c;
00715 c.chunk = CHK_MAT_SHIN2PCT;
00716 c.size = 14;
00717 lib3ds_chunk_write(&c, io);
00718 int_percentage_write(material->shin_strength, io);
00719 }
00720
00721 {
00722 Lib3dsChunk c;
00723 c.chunk = CHK_MAT_TRANSPARENCY;
00724 c.size = 14;
00725 lib3ds_chunk_write(&c, io);
00726 int_percentage_write(material->transparency, io);
00727 }
00728
00729 {
00730 Lib3dsChunk c;
00731 c.chunk = CHK_MAT_XPFALL;
00732 c.size = 14;
00733 lib3ds_chunk_write(&c, io);
00734 int_percentage_write(material->falloff, io);
00735 }
00736
00737 if (material->use_falloff) {
00738 Lib3dsChunk c;
00739 c.chunk = CHK_MAT_USE_XPFALL;
00740 c.size = 6;
00741 lib3ds_chunk_write(&c, io);
00742 }
00743
00744 {
00745 Lib3dsChunk c;
00746 c.chunk = CHK_MAT_SHADING;
00747 c.size = 8;
00748 lib3ds_chunk_write(&c, io);
00749 lib3ds_io_write_intw(io, material->shading);
00750 }
00751
00752 {
00753 Lib3dsChunk c;
00754 c.chunk = CHK_MAT_REFBLUR;
00755 c.size = 14;
00756 lib3ds_chunk_write(&c, io);
00757 int_percentage_write(material->blur, io);
00758 }
00759
00760 if (material->use_blur) {
00761 Lib3dsChunk c;
00762 c.chunk = CHK_MAT_USE_REFBLUR;
00763 c.size = 6;
00764 lib3ds_chunk_write(&c, io);
00765 }
00766
00767 if (material->self_illum_flag) {
00768 Lib3dsChunk c;
00769 c.chunk = CHK_MAT_SELF_ILLUM;
00770 c.size = 6;
00771 lib3ds_chunk_write(&c, io);
00772 }
00773
00774 if (material->two_sided) {
00775 Lib3dsChunk c;
00776 c.chunk = CHK_MAT_TWO_SIDE;
00777 c.size = 6;
00778 lib3ds_chunk_write(&c, io);
00779 }
00780
00781 if (material->map_decal) {
00782 Lib3dsChunk c;
00783 c.chunk = CHK_MAT_DECAL;
00784 c.size = 6;
00785 lib3ds_chunk_write(&c, io);
00786 }
00787
00788 if (material->is_additive) {
00789 Lib3dsChunk c;
00790 c.chunk = CHK_MAT_ADDITIVE;
00791 c.size = 6;
00792 lib3ds_chunk_write(&c, io);
00793 }
00794
00795 if (material->use_wire) {
00796 Lib3dsChunk c;
00797 c.chunk = CHK_MAT_WIRE;
00798 c.size = 6;
00799 lib3ds_chunk_write(&c, io);
00800 }
00801
00802 if (material->use_wire_abs) {
00803 Lib3dsChunk c;
00804 c.chunk = CHK_MAT_WIREABS;
00805 c.size = 6;
00806 lib3ds_chunk_write(&c, io);
00807 }
00808
00809 {
00810 Lib3dsChunk c;
00811 c.chunk = CHK_MAT_WIRE_SIZE;
00812 c.size = 10;
00813 lib3ds_chunk_write(&c, io);
00814 lib3ds_io_write_float(io, material->wire_size);
00815 }
00816
00817 if (material->face_map) {
00818 Lib3dsChunk c;
00819 c.chunk = CHK_MAT_FACEMAP;
00820 c.size = 6;
00821 lib3ds_chunk_write(&c, io);
00822 }
00823
00824 if (material->soften) {
00825 Lib3dsChunk c;
00826 c.chunk = CHK_MAT_PHONGSOFT;
00827 c.size = 6;
00828 lib3ds_chunk_write(&c, io);
00829 }
00830
00831 texture_map_write(CHK_MAT_TEXMAP, &material->texture1_map, io);
00832 texture_map_write(CHK_MAT_TEXMASK, &material->texture1_mask, io);
00833 texture_map_write(CHK_MAT_TEX2MAP, &material->texture2_map, io);
00834 texture_map_write(CHK_MAT_TEX2MASK, &material->texture2_mask, io);
00835 texture_map_write(CHK_MAT_OPACMAP, &material->opacity_map, io);
00836 texture_map_write(CHK_MAT_OPACMASK, &material->opacity_mask, io);
00837 texture_map_write(CHK_MAT_BUMPMAP, &material->bump_map, io);
00838 texture_map_write(CHK_MAT_BUMPMASK, &material->bump_mask, io);
00839 texture_map_write(CHK_MAT_SPECMAP, &material->specular_map, io);
00840 texture_map_write(CHK_MAT_SPECMASK, &material->specular_mask, io);
00841 texture_map_write(CHK_MAT_SHINMAP, &material->shininess_map, io);
00842 texture_map_write(CHK_MAT_SHINMASK, &material->shininess_mask, io);
00843 texture_map_write(CHK_MAT_SELFIMAP, &material->self_illum_map, io);
00844 texture_map_write(CHK_MAT_SELFIMASK, &material->self_illum_mask, io);
00845 texture_map_write(CHK_MAT_REFLMAP, &material->reflection_map, io);
00846 texture_map_write(CHK_MAT_REFLMASK, &material->reflection_mask, io);
00847
00848 {
00849 Lib3dsChunk c;
00850 c.chunk = CHK_MAT_ACUBIC;
00851 c.size = 18;
00852 lib3ds_chunk_write(&c, io);
00853 lib3ds_io_write_intb(io, 0);
00854 lib3ds_io_write_intb(io, material->autorefl_map_anti_alias);
00855 lib3ds_io_write_intw(io, material->autorefl_map_flags);
00856 lib3ds_io_write_intd(io, material->autorefl_map_size);
00857 lib3ds_io_write_intd(io, material->autorefl_map_frame_step);
00858 }
00859
00860 lib3ds_chunk_write_end(&c, io);
00861 }