C:/jkyprian/devel/lib3ds/lib3ds/viewport.c

00001 /*
00002  * The 3D Studio File Format Library
00003  * Copyright (C) 1996-2007 by Jan Eric Kyprianidis <www.kyprianidis.com>
00004  * All rights reserved.
00005  *
00006  * This program is  free  software;  you can redistribute it and/or modify it
00007  * under the terms of the  GNU Lesser General Public License  as published by 
00008  * the  Free Software Foundation;  either version 2.1 of the License,  or (at 
00009  * your option) any later version.
00010  *
00011  * This  program  is  distributed in  the  hope that it will  be useful,  but
00012  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00013  * or  FITNESS FOR A  PARTICULAR PURPOSE.  See the  GNU Lesser General Public  
00014  * License for more details.
00015  *
00016  * You should  have received  a copy of the GNU Lesser General Public License
00017  * along with  this program;  if not, write to the  Free Software Foundation,
00018  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019  *
00020  * $Id: viewport.c,v 1.11 2007/06/20 17:04:09 jeh Exp $
00021  */
00022 #include <lib3ds/viewport.h>
00023 #include <lib3ds/chunk.h>
00024 #include <lib3ds/io.h>
00025 #include <stdlib.h>
00026 #include <string.h>
00027 
00028 
00037 Lib3dsBool
00038 lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io)
00039 {
00040   Lib3dsChunk c;
00041   Lib3dsWord chunk;
00042 
00043   if (!lib3ds_chunk_read_start(&c, 0, io)) {
00044     return(LIB3DS_FALSE);
00045   }
00046   
00047   switch (c.chunk) {
00048     case LIB3DS_VIEWPORT_LAYOUT:
00049       {
00050         int cur=0;
00051         viewport->layout.style=lib3ds_io_read_word(io);
00052         viewport->layout.active=lib3ds_io_read_intw(io);
00053         lib3ds_io_read_intw(io);
00054         viewport->layout.swap=lib3ds_io_read_intw(io);
00055         lib3ds_io_read_intw(io);
00056         viewport->layout.swap_prior=lib3ds_io_read_intw(io);
00057         viewport->layout.swap_view=lib3ds_io_read_intw(io);
00058         lib3ds_chunk_read_tell(&c, io);
00059         while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) {
00060           switch (chunk) {
00061             case LIB3DS_VIEWPORT_SIZE:
00062               {
00063                 viewport->layout.position[0]=lib3ds_io_read_word(io);
00064                 viewport->layout.position[1]=lib3ds_io_read_word(io);
00065                 viewport->layout.size[0]=lib3ds_io_read_word(io);
00066                 viewport->layout.size[1]=lib3ds_io_read_word(io);
00067               }
00068               break;
00069             case LIB3DS_VIEWPORT_DATA_3:
00070               {
00071                 lib3ds_viewport_set_views(viewport,cur+1);
00072                 lib3ds_io_read_intw(io);
00073                 viewport->layout.viewL[cur].axis_lock=lib3ds_io_read_word(io);
00074                 viewport->layout.viewL[cur].position[0]=lib3ds_io_read_intw(io);
00075                 viewport->layout.viewL[cur].position[1]=lib3ds_io_read_intw(io);
00076                 viewport->layout.viewL[cur].size[0]=lib3ds_io_read_intw(io);
00077                 viewport->layout.viewL[cur].size[1]=lib3ds_io_read_intw(io);
00078                 viewport->layout.viewL[cur].type=lib3ds_io_read_word(io);
00079                 viewport->layout.viewL[cur].zoom=lib3ds_io_read_float(io);
00080                 lib3ds_io_read_vector(io, viewport->layout.viewL[cur].center);
00081                 viewport->layout.viewL[cur].horiz_angle=lib3ds_io_read_float(io);
00082                 viewport->layout.viewL[cur].vert_angle=lib3ds_io_read_float(io);
00083                 lib3ds_io_read(io, viewport->layout.viewL[cur].camera, 11);
00084                 ++cur;
00085               }
00086               break;
00087             case LIB3DS_VIEWPORT_DATA:
00088               /* 3DS R2 & R3 chunk
00089                  unsupported */
00090               break;
00091             default:
00092               lib3ds_chunk_unknown(chunk);
00093           }
00094         }
00095       }
00096       break;
00097     case LIB3DS_DEFAULT_VIEW:
00098       {
00099         memset(&viewport->default_view,0,sizeof(Lib3dsDefaultView));
00100         while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) {
00101           switch (chunk) {
00102             case LIB3DS_VIEW_TOP:
00103               {
00104                 viewport->default_view.type=LIB3DS_VIEW_TYPE_TOP;
00105                 lib3ds_io_read_vector(io, viewport->default_view.position);
00106                 viewport->default_view.width=lib3ds_io_read_float(io);
00107               }
00108               break;
00109             case LIB3DS_VIEW_BOTTOM:
00110               {
00111                 viewport->default_view.type=LIB3DS_VIEW_TYPE_BOTTOM;
00112                 lib3ds_io_read_vector(io, viewport->default_view.position);
00113                 viewport->default_view.width=lib3ds_io_read_float(io);
00114               }
00115               break;
00116             case LIB3DS_VIEW_LEFT:
00117               {
00118                 viewport->default_view.type=LIB3DS_VIEW_TYPE_LEFT;
00119                 lib3ds_io_read_vector(io, viewport->default_view.position);
00120                 viewport->default_view.width=lib3ds_io_read_float(io);
00121               }
00122               break;
00123             case LIB3DS_VIEW_RIGHT:
00124               {
00125                 viewport->default_view.type=LIB3DS_VIEW_TYPE_RIGHT;
00126                 lib3ds_io_read_vector(io, viewport->default_view.position);
00127                 viewport->default_view.width=lib3ds_io_read_float(io);
00128               }
00129               break;
00130             case LIB3DS_VIEW_FRONT:
00131               {
00132                 viewport->default_view.type=LIB3DS_VIEW_TYPE_FRONT;
00133                 lib3ds_io_read_vector(io, viewport->default_view.position);
00134                 viewport->default_view.width=lib3ds_io_read_float(io);
00135               }
00136               break;
00137             case LIB3DS_VIEW_BACK:
00138               {
00139                 viewport->default_view.type=LIB3DS_VIEW_TYPE_BACK;
00140                 lib3ds_io_read_vector(io, viewport->default_view.position);
00141                 viewport->default_view.width=lib3ds_io_read_float(io);
00142               }
00143               break;
00144             case LIB3DS_VIEW_USER:
00145               {
00146                 viewport->default_view.type=LIB3DS_VIEW_TYPE_USER;
00147                 lib3ds_io_read_vector(io, viewport->default_view.position);
00148                 viewport->default_view.width=lib3ds_io_read_float(io);
00149                 viewport->default_view.horiz_angle=lib3ds_io_read_float(io);
00150                 viewport->default_view.vert_angle=lib3ds_io_read_float(io);
00151                 viewport->default_view.roll_angle=lib3ds_io_read_float(io);
00152               }
00153               break;
00154             case LIB3DS_VIEW_CAMERA:
00155               {
00156                 viewport->default_view.type=LIB3DS_VIEW_TYPE_CAMERA;
00157                 lib3ds_io_read(io, viewport->default_view.camera, 11);
00158               }
00159               break;
00160             default:
00161               lib3ds_chunk_unknown(chunk);
00162           }
00163         }
00164       }
00165       break;
00166   }
00167 
00168   lib3ds_chunk_read_end(&c, io);
00169   return(LIB3DS_TRUE);
00170 }
00171 
00172 
00176 void
00177 lib3ds_viewport_set_views(Lib3dsViewport *viewport, Lib3dsDword views)
00178 {
00179   ASSERT(viewport);
00180   if (viewport->layout.views) {
00181     if (views) {
00182       viewport->layout.views=views;
00183       viewport->layout.viewL=(Lib3dsView*)realloc(viewport->layout.viewL, sizeof(Lib3dsView)*views);
00184     }
00185     else {
00186       free(viewport->layout.viewL);
00187       viewport->layout.views=0;
00188       viewport->layout.viewL=0;
00189     }
00190   }
00191   else {
00192     if (views) {
00193       viewport->layout.views=views;
00194       viewport->layout.viewL=(Lib3dsView*)calloc(sizeof(Lib3dsView),views);
00195     }
00196   }
00197 }
00198 
00199 
00203 Lib3dsBool
00204 lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io)
00205 {
00206   if (viewport->layout.views) {
00207     Lib3dsChunk c;
00208     unsigned i;
00209 
00210     c.chunk=LIB3DS_VIEWPORT_LAYOUT;
00211     if (!lib3ds_chunk_write_start(&c,io)) {
00212       return(LIB3DS_FALSE);
00213     }
00214 
00215     lib3ds_io_write_word(io, viewport->layout.style);
00216     lib3ds_io_write_intw(io, viewport->layout.active);
00217     lib3ds_io_write_intw(io, 0);
00218     lib3ds_io_write_intw(io, viewport->layout.swap);
00219     lib3ds_io_write_intw(io, 0);
00220     lib3ds_io_write_intw(io, viewport->layout.swap_prior);
00221     lib3ds_io_write_intw(io, viewport->layout.swap_view);
00222     
00223     {
00224       Lib3dsChunk c;
00225       c.chunk=LIB3DS_VIEWPORT_SIZE;
00226       c.size=14;
00227       lib3ds_chunk_write(&c,io);
00228       lib3ds_io_write_intw(io, viewport->layout.position[0]);
00229       lib3ds_io_write_intw(io, viewport->layout.position[1]);
00230       lib3ds_io_write_intw(io, viewport->layout.size[0]);
00231       lib3ds_io_write_intw(io, viewport->layout.size[1]);
00232     }
00233 
00234     for (i=0; i<viewport->layout.views; ++i) {
00235       Lib3dsChunk c;
00236       c.chunk=LIB3DS_VIEWPORT_DATA_3;
00237       c.size=55;
00238       lib3ds_chunk_write(&c,io);
00239 
00240       lib3ds_io_write_intw(io, 0);
00241       lib3ds_io_write_word(io, viewport->layout.viewL[i].axis_lock);
00242       lib3ds_io_write_intw(io, viewport->layout.viewL[i].position[0]);
00243       lib3ds_io_write_intw(io, viewport->layout.viewL[i].position[1]);
00244       lib3ds_io_write_intw(io, viewport->layout.viewL[i].size[0]);
00245       lib3ds_io_write_intw(io, viewport->layout.viewL[i].size[1]);
00246       lib3ds_io_write_word(io, viewport->layout.viewL[i].type);
00247       lib3ds_io_write_float(io, viewport->layout.viewL[i].zoom);
00248       lib3ds_io_write_vector(io, viewport->layout.viewL[i].center);
00249       lib3ds_io_write_float(io, viewport->layout.viewL[i].horiz_angle);
00250       lib3ds_io_write_float(io, viewport->layout.viewL[i].vert_angle);
00251       lib3ds_io_write(io, viewport->layout.viewL[i].camera,11);
00252     }
00253 
00254     if (!lib3ds_chunk_write_end(&c,io)) {
00255       return(LIB3DS_FALSE);
00256     }
00257   }
00258 
00259   if (viewport->default_view.type) {
00260     Lib3dsChunk c;
00261 
00262     c.chunk=LIB3DS_DEFAULT_VIEW;
00263     if (!lib3ds_chunk_write_start(&c,io)) {
00264       return(LIB3DS_FALSE);
00265     }
00266 
00267     switch (viewport->default_view.type) {
00268       case LIB3DS_VIEW_TYPE_TOP:
00269         {
00270           Lib3dsChunk c;
00271           c.chunk=LIB3DS_VIEW_TOP;
00272           c.size=22;
00273           lib3ds_chunk_write(&c,io);
00274           lib3ds_io_write_vector(io, viewport->default_view.position);
00275           lib3ds_io_write_float(io, viewport->default_view.width);
00276         }
00277         break;
00278       case LIB3DS_VIEW_TYPE_BOTTOM:
00279         {
00280           Lib3dsChunk c;
00281           c.chunk=LIB3DS_VIEW_BOTTOM;
00282           c.size=22;
00283           lib3ds_chunk_write(&c,io);
00284           lib3ds_io_write_vector(io, viewport->default_view.position);
00285           lib3ds_io_write_float(io, viewport->default_view.width);
00286         }
00287         break;
00288       case LIB3DS_VIEW_TYPE_LEFT:
00289         {
00290           Lib3dsChunk c;
00291           c.chunk=LIB3DS_VIEW_LEFT;
00292           c.size=22;
00293           lib3ds_chunk_write(&c,io);
00294           lib3ds_io_write_vector(io, viewport->default_view.position);
00295           lib3ds_io_write_float(io, viewport->default_view.width);
00296         }
00297         break;
00298       case LIB3DS_VIEW_TYPE_RIGHT:
00299         {
00300           Lib3dsChunk c;
00301           c.chunk=LIB3DS_VIEW_RIGHT;
00302           c.size=22;
00303           lib3ds_chunk_write(&c,io);
00304           lib3ds_io_write_vector(io, viewport->default_view.position);
00305           lib3ds_io_write_float(io, viewport->default_view.width);
00306         }
00307         break;
00308       case LIB3DS_VIEW_TYPE_FRONT:
00309         {
00310           Lib3dsChunk c;
00311           c.chunk=LIB3DS_VIEW_FRONT;
00312           c.size=22;
00313           lib3ds_chunk_write(&c,io);
00314           lib3ds_io_write_vector(io, viewport->default_view.position);
00315           lib3ds_io_write_float(io, viewport->default_view.width);
00316         }
00317         break;
00318       case LIB3DS_VIEW_TYPE_BACK:
00319         {
00320           Lib3dsChunk c;
00321           c.chunk=LIB3DS_VIEW_BACK;
00322           c.size=22;
00323           lib3ds_chunk_write(&c,io);
00324           lib3ds_io_write_vector(io, viewport->default_view.position);
00325           lib3ds_io_write_float(io, viewport->default_view.width);
00326         }
00327         break;
00328       case LIB3DS_VIEW_TYPE_USER:
00329         {
00330           Lib3dsChunk c;
00331           c.chunk=LIB3DS_VIEW_USER;
00332           c.size=34;
00333           lib3ds_chunk_write(&c,io);
00334           lib3ds_io_write_vector(io, viewport->default_view.position);
00335           lib3ds_io_write_float(io, viewport->default_view.width);
00336           lib3ds_io_write_float(io, viewport->default_view.horiz_angle);
00337           lib3ds_io_write_float(io, viewport->default_view.vert_angle);
00338           lib3ds_io_write_float(io, viewport->default_view.roll_angle);
00339         }
00340         break;
00341       case LIB3DS_VIEW_TYPE_CAMERA:
00342         {
00343           Lib3dsChunk c;
00344           c.chunk=LIB3DS_VIEW_CAMERA;
00345           c.size=17;
00346           lib3ds_chunk_write(&c, io);
00347           lib3ds_io_write(io, viewport->default_view.camera, 11);
00348         }
00349         break;
00350     }
00351 
00352     if (!lib3ds_chunk_write_end(&c, io)) {
00353       return(LIB3DS_FALSE);
00354     }
00355   }
00356   return(LIB3DS_TRUE);
00357 }
00358 
00359 
00367 void
00368 lib3ds_viewport_dump(Lib3dsViewport *vp)
00369 {
00370   Lib3dsView *view;
00371   unsigned i;
00372   ASSERT(vp);
00373 
00374   printf("  viewport:\n");
00375   printf("    layout:\n");
00376   printf("      style:       %d\n", vp->layout.style);
00377   printf("      active:      %d\n", vp->layout.active);
00378   printf("      swap:        %d\n", vp->layout.swap);
00379   printf("      swap_prior:  %d\n", vp->layout.swap_prior);
00380   printf("      position:    %d,%d\n",
00381         vp->layout.position[0], vp->layout.position[1]);
00382   printf("      size:        %d,%d\n", vp->layout.size[0], vp->layout.size[1]);
00383   printf("      views:       %ld\n", vp->layout.views);
00384   if (vp->layout.views > 0 && vp->layout.viewL != NULL) {
00385     for(i=0, view=vp->layout.viewL; i < vp->layout.views; ++i, ++view) {
00386       printf("        view %d:\n", i);
00387       printf("          type:         %d\n", view->type);
00388       printf("          axis_lock:    %d\n", view->axis_lock);
00389       printf("          position:     (%d,%d)\n",
00390         view->position[0], view->position[1]);
00391       printf("          size:         (%d,%d)\n", view->size[0], view->size[1]);
00392       printf("          zoom:         %g\n", view->zoom);
00393       printf("          center:       (%g,%g,%g)\n",
00394         view->center[0], view->center[1], view->center[2]);
00395       printf("          horiz_angle:  %g\n", view->horiz_angle);
00396       printf("          vert_angle:   %g\n", view->vert_angle);
00397       printf("          camera:       %s\n", view->camera);
00398     }
00399   }
00400 
00401   printf("    default_view:\n");
00402   printf("      type:         %d\n", vp->default_view.type);
00403   printf("      position:     (%g,%g,%g)\n",
00404     vp->default_view.position[0],
00405     vp->default_view.position[1],
00406     vp->default_view.position[2]);
00407   printf("      width:        %g\n", vp->default_view.width);
00408   printf("      horiz_angle:  %g\n", vp->default_view.horiz_angle);
00409   printf("      vert_angle:   %g\n", vp->default_view.vert_angle);
00410   printf("      roll_angle:   %g\n", vp->default_view.roll_angle);
00411   printf("      camera:       %s\n", vp->default_view.camera);
00412 }
00413 

Hosted by
SourceForge.net Logo
Generated at Wed Jun 20 18:51:36 2007 by Doxygen 1.5.2