Home | API | File List | Examples | Download

lib3ds_viewport.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 void
00022 lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io) {
00023     Lib3dsChunk c;
00024     uint16_t chunk;
00025 
00026     memset(viewport, 0, sizeof(*viewport));
00027     lib3ds_chunk_read_start(&c, 0, io);
00028     switch (c.chunk) {
00029         case CHK_VIEWPORT_LAYOUT: {
00030             int cur = 0;
00031             viewport->layout_style = lib3ds_io_read_word(io);
00032             viewport->layout_active = lib3ds_io_read_intw(io);
00033             lib3ds_io_read_intw(io);
00034             viewport->layout_swap = lib3ds_io_read_intw(io);
00035             lib3ds_io_read_intw(io);
00036             viewport->layout_swap_prior = lib3ds_io_read_intw(io);
00037             viewport->layout_swap_view = lib3ds_io_read_intw(io);
00038             lib3ds_chunk_read_tell(&c, io);
00039             while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00040                 switch (chunk) {
00041                     case CHK_VIEWPORT_SIZE: {
00042                         viewport->layout_position[0] = lib3ds_io_read_word(io);
00043                         viewport->layout_position[1] = lib3ds_io_read_word(io);
00044                         viewport->layout_size[0] = lib3ds_io_read_word(io);
00045                         viewport->layout_size[1] = lib3ds_io_read_word(io);
00046                         break;
00047                     }
00048 
00049                     case CHK_VIEWPORT_DATA_3: {
00050                         if (cur < LIB3DS_LAYOUT_MAX_VIEWS) {
00051                             lib3ds_io_read_intw(io);
00052                             viewport->layout_views[cur].axis_lock = lib3ds_io_read_word(io);
00053                             viewport->layout_views[cur].position[0] = lib3ds_io_read_intw(io);
00054                             viewport->layout_views[cur].position[1] = lib3ds_io_read_intw(io);
00055                             viewport->layout_views[cur].size[0] = lib3ds_io_read_intw(io);
00056                             viewport->layout_views[cur].size[1] = lib3ds_io_read_intw(io);
00057                             viewport->layout_views[cur].type = lib3ds_io_read_word(io);
00058                             viewport->layout_views[cur].zoom = lib3ds_io_read_float(io);
00059                             lib3ds_io_read_vector(io, viewport->layout_views[cur].center);
00060                             viewport->layout_views[cur].horiz_angle = lib3ds_io_read_float(io);
00061                             viewport->layout_views[cur].vert_angle = lib3ds_io_read_float(io);
00062                             lib3ds_io_read(io, viewport->layout_views[cur].camera, 11);
00063                             ++cur;
00064                         }
00065                         break;
00066                     }
00067 
00068                     case CHK_VIEWPORT_DATA:
00069                         /* 3DS R2 & R3 chunk unsupported */
00070                         break;
00071 
00072                     default:
00073                         lib3ds_chunk_unknown(chunk, io);
00074                 }
00075             }
00076             break;
00077         }
00078 
00079         case CHK_DEFAULT_VIEW: {
00080             while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00081                 switch (chunk) {
00082                     case CHK_VIEW_TOP: {
00083                         viewport->default_type = LIB3DS_VIEW_TOP;
00084                         lib3ds_io_read_vector(io, viewport->default_position);
00085                         viewport->default_width = lib3ds_io_read_float(io);
00086                         break;
00087                     }
00088 
00089                     case CHK_VIEW_BOTTOM: {
00090                         viewport->default_type = LIB3DS_VIEW_BOTTOM;
00091                         lib3ds_io_read_vector(io, viewport->default_position);
00092                         viewport->default_width = lib3ds_io_read_float(io);
00093                         break;
00094                     }
00095 
00096                     case CHK_VIEW_LEFT: {
00097                         viewport->default_type = LIB3DS_VIEW_LEFT;
00098                         lib3ds_io_read_vector(io, viewport->default_position);
00099                         viewport->default_width = lib3ds_io_read_float(io);
00100                         break;
00101                     }
00102 
00103                     case CHK_VIEW_RIGHT: {
00104                         viewport->default_type = LIB3DS_VIEW_RIGHT;
00105                         lib3ds_io_read_vector(io, viewport->default_position);
00106                         viewport->default_width = lib3ds_io_read_float(io);
00107                         break;
00108                     }
00109 
00110                     case CHK_VIEW_FRONT: {
00111                         viewport->default_type = LIB3DS_VIEW_FRONT;
00112                         lib3ds_io_read_vector(io, viewport->default_position);
00113                         viewport->default_width = lib3ds_io_read_float(io);
00114                         break;
00115                     }
00116 
00117                     case CHK_VIEW_BACK: {
00118                         viewport->default_type = LIB3DS_VIEW_BACK;
00119                         lib3ds_io_read_vector(io, viewport->default_position);
00120                         viewport->default_width = lib3ds_io_read_float(io);
00121                         break;
00122                     }
00123 
00124                     case CHK_VIEW_USER: {
00125                         viewport->default_type = LIB3DS_VIEW_USER;
00126                         lib3ds_io_read_vector(io, viewport->default_position);
00127                         viewport->default_width = lib3ds_io_read_float(io);
00128                         viewport->default_horiz_angle = lib3ds_io_read_float(io);
00129                         viewport->default_vert_angle = lib3ds_io_read_float(io);
00130                         viewport->default_roll_angle = lib3ds_io_read_float(io);
00131                         break;
00132                     }
00133 
00134                     case CHK_VIEW_CAMERA: {
00135                         viewport->default_type = LIB3DS_VIEW_CAMERA;
00136                         lib3ds_io_read(io, viewport->default_camera, 11);
00137                         break;
00138                     }
00139 
00140                     default:
00141                         lib3ds_chunk_unknown(chunk, io);
00142                 }
00143             }
00144             break;
00145         }
00146     }
00147 
00148     lib3ds_chunk_read_end(&c, io);
00149 }
00150 
00151 
00152 void
00153 lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io) {
00154     if (viewport->layout_nviews) {
00155         Lib3dsChunk c;
00156         int i;
00157 
00158         c.chunk = CHK_VIEWPORT_LAYOUT;
00159         lib3ds_chunk_write_start(&c, io);
00160 
00161         lib3ds_io_write_word(io, viewport->layout_style);
00162         lib3ds_io_write_intw(io, viewport->layout_active);
00163         lib3ds_io_write_intw(io, 0);
00164         lib3ds_io_write_intw(io, viewport->layout_swap);
00165         lib3ds_io_write_intw(io, 0);
00166         lib3ds_io_write_intw(io, viewport->layout_swap_prior);
00167         lib3ds_io_write_intw(io, viewport->layout_swap_view);
00168 
00169         {
00170             Lib3dsChunk c;
00171             c.chunk = CHK_VIEWPORT_SIZE;
00172             c.size = 14;
00173             lib3ds_chunk_write(&c, io);
00174             lib3ds_io_write_intw(io, viewport->layout_position[0]);
00175             lib3ds_io_write_intw(io, viewport->layout_position[1]);
00176             lib3ds_io_write_intw(io, viewport->layout_size[0]);
00177             lib3ds_io_write_intw(io, viewport->layout_size[1]);
00178         }
00179 
00180         for (i = 0; i < viewport->layout_nviews; ++i) {
00181             Lib3dsChunk c;
00182             c.chunk = CHK_VIEWPORT_DATA_3;
00183             c.size = 55;
00184             lib3ds_chunk_write(&c, io);
00185 
00186             lib3ds_io_write_intw(io, 0);
00187             lib3ds_io_write_word(io, viewport->layout_views[i].axis_lock);
00188             lib3ds_io_write_intw(io, viewport->layout_views[i].position[0]);
00189             lib3ds_io_write_intw(io, viewport->layout_views[i].position[1]);
00190             lib3ds_io_write_intw(io, viewport->layout_views[i].size[0]);
00191             lib3ds_io_write_intw(io, viewport->layout_views[i].size[1]);
00192             lib3ds_io_write_word(io, viewport->layout_views[i].type);
00193             lib3ds_io_write_float(io, viewport->layout_views[i].zoom);
00194             lib3ds_io_write_vector(io, viewport->layout_views[i].center);
00195             lib3ds_io_write_float(io, viewport->layout_views[i].horiz_angle);
00196             lib3ds_io_write_float(io, viewport->layout_views[i].vert_angle);
00197             lib3ds_io_write(io, viewport->layout_views[i].camera, 11);
00198         }
00199 
00200         lib3ds_chunk_write_end(&c, io);
00201     }
00202 
00203     if (viewport->default_type) {
00204         Lib3dsChunk c;
00205 
00206         c.chunk = CHK_DEFAULT_VIEW;
00207         lib3ds_chunk_write_start(&c, io);
00208 
00209         switch (viewport->default_type) {
00210             case LIB3DS_VIEW_TOP: {
00211                 Lib3dsChunk c;
00212                 c.chunk = CHK_VIEW_TOP;
00213                 c.size = 22;
00214                 lib3ds_chunk_write(&c, io);
00215                 lib3ds_io_write_vector(io, viewport->default_position);
00216                 lib3ds_io_write_float(io, viewport->default_width);
00217                 break;
00218             }
00219 
00220             case LIB3DS_VIEW_BOTTOM: {
00221                 Lib3dsChunk c;
00222                 c.chunk = CHK_VIEW_BOTTOM;
00223                 c.size = 22;
00224                 lib3ds_chunk_write(&c, io);
00225                 lib3ds_io_write_vector(io, viewport->default_position);
00226                 lib3ds_io_write_float(io, viewport->default_width);
00227                 break;
00228             }
00229 
00230             case LIB3DS_VIEW_LEFT: {
00231                 Lib3dsChunk c;
00232                 c.chunk = CHK_VIEW_LEFT;
00233                 c.size = 22;
00234                 lib3ds_chunk_write(&c, io);
00235                 lib3ds_io_write_vector(io, viewport->default_position);
00236                 lib3ds_io_write_float(io, viewport->default_width);
00237                 break;
00238             }
00239 
00240             case LIB3DS_VIEW_RIGHT: {
00241                 Lib3dsChunk c;
00242                 c.chunk = CHK_VIEW_RIGHT;
00243                 c.size = 22;
00244                 lib3ds_chunk_write(&c, io);
00245                 lib3ds_io_write_vector(io, viewport->default_position);
00246                 lib3ds_io_write_float(io, viewport->default_width);
00247                 break;
00248             }
00249 
00250             case LIB3DS_VIEW_FRONT: {
00251                 Lib3dsChunk c;
00252                 c.chunk = CHK_VIEW_FRONT;
00253                 c.size = 22;
00254                 lib3ds_chunk_write(&c, io);
00255                 lib3ds_io_write_vector(io, viewport->default_position);
00256                 lib3ds_io_write_float(io, viewport->default_width);
00257                 break;
00258             }
00259 
00260             case LIB3DS_VIEW_BACK: {
00261                 Lib3dsChunk c;
00262                 c.chunk = CHK_VIEW_BACK;
00263                 c.size = 22;
00264                 lib3ds_chunk_write(&c, io);
00265                 lib3ds_io_write_vector(io, viewport->default_position);
00266                 lib3ds_io_write_float(io, viewport->default_width);
00267                 break;
00268             }
00269 
00270             case LIB3DS_VIEW_USER: {
00271                 Lib3dsChunk c;
00272                 c.chunk = CHK_VIEW_USER;
00273                 c.size = 34;
00274                 lib3ds_chunk_write(&c, io);
00275                 lib3ds_io_write_vector(io, viewport->default_position);
00276                 lib3ds_io_write_float(io, viewport->default_width);
00277                 lib3ds_io_write_float(io, viewport->default_horiz_angle);
00278                 lib3ds_io_write_float(io, viewport->default_vert_angle);
00279                 lib3ds_io_write_float(io, viewport->default_roll_angle);
00280                 break;
00281             }
00282 
00283             case LIB3DS_VIEW_CAMERA: {
00284                 Lib3dsChunk c;
00285                 c.chunk = CHK_VIEW_CAMERA;
00286                 c.size = 17;
00287                 lib3ds_chunk_write(&c, io);
00288                 lib3ds_io_write(io, viewport->default_camera, 11);
00289                 break;
00290             }
00291         }
00292 
00293         lib3ds_chunk_write_end(&c, io);
00294     }
00295 }
00296