Home | API | File List | Examples | Download

lib3ds_material.c

00001 /*
00002     Copyright (C) 1996-2008 by Jan Eric Kyprianidis <www.kyprianidis.com>
00003     All rights reserved.
00004     
00005     This program is free  software: you can redistribute it and/or modify 
00006     it under the terms of the GNU Lesser General Public License as published 
00007     by the Free Software Foundation, either version 2.1 of the License, or 
00008     (at your option) any later version.
00009 
00010     Thisprogram  is  distributed in the hope that it will be useful, 
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of 
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
00013     GNU Lesser General Public License for more details.
00014     
00015     You should  have received a copy of the GNU Lesser General Public License
00016     along with  this program; If not, see <http://www.gnu.org/licenses/>. 
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                 /* gamma corrected color chunk
00106                    replaced in 3ds R3 by LIN_COLOR_24 */
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     { /*---- CHK_MAT_MAPNAME ----*/
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     { /*---- CHK_MAT_MAP_TILING ----*/
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     { /*---- CHK_MAT_MAP_TEXBLUR ----*/
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     { /*---- CHK_MAT_MAP_USCALE ----*/
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     { /*---- CHK_MAT_MAP_VSCALE ----*/
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     { /*---- CHK_MAT_MAP_UOFFSET ----*/
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     { /*---- CHK_MAT_MAP_VOFFSET ----*/
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     { /*---- CHK_MAT_MAP_ANG ----*/
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     { /*---- CHK_MAT_MAP_COL1 ----*/
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     { /*---- CHK_MAT_MAP_COL2 ----*/
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     { /*---- CHK_MAT_MAP_RCOL ----*/
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     { /*---- CHK_MAT_MAP_GCOL ----*/
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     { /*---- CHK_MAT_MAP_BCOL ----*/
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     { /*---- CHK_MAT_NAME ----*/
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     { /*---- CHK_MAT_AMBIENT ----*/
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     { /*---- CHK_MAT_DIFFUSE ----*/
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     { /*---- CHK_MAT_SPECULAR ----*/
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     { /*---- CHK_MAT_SHININESS ----*/
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     { /*---- CHK_MAT_SHIN2PCT ----*/
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     { /*---- CHK_MAT_TRANSPARENCY ----*/
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     { /*---- CHK_MAT_XPFALL ----*/
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) { /*---- CHK_MAT_USE_XPFALL ----*/
00738         Lib3dsChunk c;
00739         c.chunk = CHK_MAT_USE_XPFALL;
00740         c.size = 6;
00741         lib3ds_chunk_write(&c, io);
00742     }
00743 
00744     { /*---- CHK_MAT_SHADING ----*/
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     { /*---- CHK_MAT_REFBLUR ----*/
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) { /*---- CHK_MAT_USE_REFBLUR ----*/
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) { /*---- CHK_MAT_SELF_ILLUM ----*/
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) { /*---- CHK_MAT_TWO_SIDE ----*/
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) { /*---- CHK_MAT_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) { /*---- CHK_MAT_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) { /*---- CHK_MAT_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) { /*---- CHK_MAT_WIREABS ----*/
00803         Lib3dsChunk c;
00804         c.chunk = CHK_MAT_WIREABS;
00805         c.size = 6;
00806         lib3ds_chunk_write(&c, io);
00807     }
00808 
00809     { /*---- CHK_MAT_WIRE_SIZE ----*/
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) { /*---- CHK_MAT_FACEMAP ----*/
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) { /*---- CHK_MAT_PHONGSOFT ----*/
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     { /*---- CHK_MAT_ACUBIC ----*/
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 }