dropped all dependencies apart from SDL into the libs subdir
[summerhack] / libs / lib3ds / viewport.c
1 /*
2  * The 3D Studio File Format Library
3  * Copyright (C) 1996-2001 by J.E. Hoffmann <je-h@gmx.net>
4  * All rights reserved.
5  *
6  * This program is  free  software;  you can redistribute it and/or modify it
7  * under the terms of the  GNU Lesser General Public License  as published by 
8  * the  Free Software Foundation;  either version 2.1 of the License,  or (at 
9  * your option) any later version.
10  *
11  * This  program  is  distributed in  the  hope that it will  be useful,  but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13  * or  FITNESS FOR A  PARTICULAR PURPOSE.  See the  GNU Lesser General Public  
14  * License for more details.
15  *
16  * You should  have received  a copy of the GNU Lesser General Public License
17  * along with  this program;  if not, write to the  Free Software Foundation,
18  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  *
20  * $Id: viewport.c,v 1.7 2004/11/16 07:40:56 efalk Exp $
21  */
22 #define LIB3DS_EXPORT
23 #include <lib3ds/viewport.h>
24 #include <lib3ds/chunk.h>
25 #include <lib3ds/io.h>
26 #include <stdlib.h>
27 #include <string.h>
28
29
30 /*!
31  * \defgroup viewport Viewport and default view settings
32  *
33  * \author J.E. Hoffmann <je-h@gmx.net>
34  */
35
36
37 /*!
38  * \ingroup viewport 
39  */
40 Lib3dsBool
41 lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io)
42 {
43   Lib3dsChunk c;
44   Lib3dsWord chunk;
45
46   if (!lib3ds_chunk_read_start(&c, 0, io)) {
47     return(LIB3DS_FALSE);
48   }
49   
50   switch (c.chunk) {
51     case LIB3DS_VIEWPORT_LAYOUT:
52       {
53         int cur=0;
54         viewport->layout.style=lib3ds_io_read_word(io);
55         viewport->layout.active=lib3ds_io_read_intw(io);
56         lib3ds_io_read_intw(io);
57         viewport->layout.swap=lib3ds_io_read_intw(io);
58         lib3ds_io_read_intw(io);
59         viewport->layout.swap_prior=lib3ds_io_read_intw(io);
60         viewport->layout.swap_view=lib3ds_io_read_intw(io);
61         lib3ds_chunk_read_tell(&c, io);
62         while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) {
63           switch (chunk) {
64             case LIB3DS_VIEWPORT_SIZE:
65               {
66                 viewport->layout.position[0]=lib3ds_io_read_word(io);
67                 viewport->layout.position[1]=lib3ds_io_read_word(io);
68                 viewport->layout.size[0]=lib3ds_io_read_word(io);
69                 viewport->layout.size[1]=lib3ds_io_read_word(io);
70               }
71               break;
72             case LIB3DS_VIEWPORT_DATA_3:
73               {
74                 lib3ds_viewport_set_views(viewport,cur+1);
75                 lib3ds_io_read_intw(io);
76                 viewport->layout.viewL[cur].axis_lock=lib3ds_io_read_word(io);
77                 viewport->layout.viewL[cur].position[0]=lib3ds_io_read_intw(io);
78                 viewport->layout.viewL[cur].position[1]=lib3ds_io_read_intw(io);
79                 viewport->layout.viewL[cur].size[0]=lib3ds_io_read_intw(io);
80                 viewport->layout.viewL[cur].size[1]=lib3ds_io_read_intw(io);
81                 viewport->layout.viewL[cur].type=lib3ds_io_read_word(io);
82                 viewport->layout.viewL[cur].zoom=lib3ds_io_read_float(io);
83                 lib3ds_io_read_vector(io, viewport->layout.viewL[cur].center);
84                 viewport->layout.viewL[cur].horiz_angle=lib3ds_io_read_float(io);
85                 viewport->layout.viewL[cur].vert_angle=lib3ds_io_read_float(io);
86                 lib3ds_io_read(io, (unsigned char*)viewport->layout.viewL[cur].camera, 11);
87                 ++cur;
88               }
89               break;
90             case LIB3DS_VIEWPORT_DATA:
91               /* 3DS R2 & R3 chunk
92                  unsupported */
93               break;
94             default:
95               lib3ds_chunk_unknown(chunk);
96           }
97         }
98       }
99       break;
100     case LIB3DS_DEFAULT_VIEW:
101       {
102         memset(&viewport->default_view,0,sizeof(Lib3dsDefaultView));
103         while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) {
104           switch (chunk) {
105             case LIB3DS_VIEW_TOP:
106               {
107                 viewport->default_view.type=LIB3DS_VIEW_TYPE_TOP;
108                 lib3ds_io_read_vector(io, viewport->default_view.position);
109                 viewport->default_view.width=lib3ds_io_read_float(io);
110               }
111               break;
112             case LIB3DS_VIEW_BOTTOM:
113               {
114                 viewport->default_view.type=LIB3DS_VIEW_TYPE_BOTTOM;
115                 lib3ds_io_read_vector(io, viewport->default_view.position);
116                 viewport->default_view.width=lib3ds_io_read_float(io);
117               }
118               break;
119             case LIB3DS_VIEW_LEFT:
120               {
121                 viewport->default_view.type=LIB3DS_VIEW_TYPE_LEFT;
122                 lib3ds_io_read_vector(io, viewport->default_view.position);
123                 viewport->default_view.width=lib3ds_io_read_float(io);
124               }
125               break;
126             case LIB3DS_VIEW_RIGHT:
127               {
128                 viewport->default_view.type=LIB3DS_VIEW_TYPE_RIGHT;
129                 lib3ds_io_read_vector(io, viewport->default_view.position);
130                 viewport->default_view.width=lib3ds_io_read_float(io);
131               }
132               break;
133             case LIB3DS_VIEW_FRONT:
134               {
135                 viewport->default_view.type=LIB3DS_VIEW_TYPE_FRONT;
136                 lib3ds_io_read_vector(io, viewport->default_view.position);
137                 viewport->default_view.width=lib3ds_io_read_float(io);
138               }
139               break;
140             case LIB3DS_VIEW_BACK:
141               {
142                 viewport->default_view.type=LIB3DS_VIEW_TYPE_BACK;
143                 lib3ds_io_read_vector(io, viewport->default_view.position);
144                 viewport->default_view.width=lib3ds_io_read_float(io);
145               }
146               break;
147             case LIB3DS_VIEW_USER:
148               {
149                 viewport->default_view.type=LIB3DS_VIEW_TYPE_USER;
150                 lib3ds_io_read_vector(io, viewport->default_view.position);
151                 viewport->default_view.width=lib3ds_io_read_float(io);
152                 viewport->default_view.horiz_angle=lib3ds_io_read_float(io);
153                 viewport->default_view.vert_angle=lib3ds_io_read_float(io);
154                 viewport->default_view.roll_angle=lib3ds_io_read_float(io);
155               }
156               break;
157             case LIB3DS_VIEW_CAMERA:
158               {
159                 viewport->default_view.type=LIB3DS_VIEW_TYPE_CAMERA;
160                 lib3ds_io_read(io, (unsigned char*)viewport->default_view.camera, 11);
161               }
162               break;
163             default:
164               lib3ds_chunk_unknown(chunk);
165           }
166         }
167       }
168       break;
169   }
170
171   lib3ds_chunk_read_end(&c, io);
172   return(LIB3DS_TRUE);
173 }
174
175
176 /*!
177  * \ingroup viewport 
178  */
179 void
180 lib3ds_viewport_set_views(Lib3dsViewport *viewport, Lib3dsDword views)
181 {
182   ASSERT(viewport);
183   if (viewport->layout.views) {
184     if (views) {
185       viewport->layout.views=views;
186       viewport->layout.viewL=(Lib3dsView*)realloc(viewport->layout.viewL, sizeof(Lib3dsView)*views);
187     }
188     else {
189       free(viewport->layout.viewL);
190       viewport->layout.views=0;
191       viewport->layout.viewL=0;
192     }
193   }
194   else {
195     if (views) {
196       viewport->layout.views=views;
197       viewport->layout.viewL=(Lib3dsView*)calloc(sizeof(Lib3dsView),views);
198     }
199   }
200 }
201
202
203 /*!
204  * \ingroup viewport 
205  */
206 Lib3dsBool
207 lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io)
208 {
209   if (viewport->layout.views) {
210     Lib3dsChunk c;
211     unsigned i;
212
213     c.chunk=LIB3DS_VIEWPORT_LAYOUT;
214     if (!lib3ds_chunk_write_start(&c,io)) {
215       return(LIB3DS_FALSE);
216     }
217
218     lib3ds_io_write_word(io, viewport->layout.style);
219     lib3ds_io_write_intw(io, viewport->layout.active);
220     lib3ds_io_write_intw(io, 0);
221     lib3ds_io_write_intw(io, viewport->layout.swap);
222     lib3ds_io_write_intw(io, 0);
223     lib3ds_io_write_intw(io, viewport->layout.swap_prior);
224     lib3ds_io_write_intw(io, viewport->layout.swap_view);
225     
226     {
227       Lib3dsChunk c;
228       c.chunk=LIB3DS_VIEWPORT_SIZE;
229       c.size=14;
230       lib3ds_chunk_write(&c,io);
231       lib3ds_io_write_intw(io, viewport->layout.position[0]);
232       lib3ds_io_write_intw(io, viewport->layout.position[1]);
233       lib3ds_io_write_intw(io, viewport->layout.size[0]);
234       lib3ds_io_write_intw(io, viewport->layout.size[1]);
235     }
236
237     for (i=0; i<viewport->layout.views; ++i) {
238       Lib3dsChunk c;
239       c.chunk=LIB3DS_VIEWPORT_DATA_3;
240       c.size=55;
241       lib3ds_chunk_write(&c,io);
242
243       lib3ds_io_write_intw(io, 0);
244       lib3ds_io_write_word(io, viewport->layout.viewL[i].axis_lock);
245       lib3ds_io_write_intw(io, viewport->layout.viewL[i].position[0]);
246       lib3ds_io_write_intw(io, viewport->layout.viewL[i].position[1]);
247       lib3ds_io_write_intw(io, viewport->layout.viewL[i].size[0]);
248       lib3ds_io_write_intw(io, viewport->layout.viewL[i].size[1]);
249       lib3ds_io_write_word(io, viewport->layout.viewL[i].type);
250       lib3ds_io_write_float(io, viewport->layout.viewL[i].zoom);
251       lib3ds_io_write_vector(io, viewport->layout.viewL[i].center);
252       lib3ds_io_write_float(io, viewport->layout.viewL[i].horiz_angle);
253       lib3ds_io_write_float(io, viewport->layout.viewL[i].vert_angle);
254       lib3ds_io_write(io, (unsigned char*)viewport->layout.viewL[i].camera,11);
255     }
256
257     if (!lib3ds_chunk_write_end(&c,io)) {
258       return(LIB3DS_FALSE);
259     }
260   }
261
262   if (viewport->default_view.type) {
263     Lib3dsChunk c;
264
265     c.chunk=LIB3DS_DEFAULT_VIEW;
266     if (!lib3ds_chunk_write_start(&c,io)) {
267       return(LIB3DS_FALSE);
268     }
269
270     switch (viewport->default_view.type) {
271       case LIB3DS_VIEW_TYPE_TOP:
272         {
273           Lib3dsChunk c;
274           c.chunk=LIB3DS_VIEW_TOP;
275           c.size=22;
276           lib3ds_chunk_write(&c,io);
277           lib3ds_io_write_vector(io, viewport->default_view.position);
278           lib3ds_io_write_float(io, viewport->default_view.width);
279         }
280         break;
281       case LIB3DS_VIEW_TYPE_BOTTOM:
282         {
283           Lib3dsChunk c;
284           c.chunk=LIB3DS_VIEW_BOTTOM;
285           c.size=22;
286           lib3ds_chunk_write(&c,io);
287           lib3ds_io_write_vector(io, viewport->default_view.position);
288           lib3ds_io_write_float(io, viewport->default_view.width);
289         }
290         break;
291       case LIB3DS_VIEW_TYPE_LEFT:
292         {
293           Lib3dsChunk c;
294           c.chunk=LIB3DS_VIEW_LEFT;
295           c.size=22;
296           lib3ds_chunk_write(&c,io);
297           lib3ds_io_write_vector(io, viewport->default_view.position);
298           lib3ds_io_write_float(io, viewport->default_view.width);
299         }
300         break;
301       case LIB3DS_VIEW_TYPE_RIGHT:
302         {
303           Lib3dsChunk c;
304           c.chunk=LIB3DS_VIEW_RIGHT;
305           c.size=22;
306           lib3ds_chunk_write(&c,io);
307           lib3ds_io_write_vector(io, viewport->default_view.position);
308           lib3ds_io_write_float(io, viewport->default_view.width);
309         }
310         break;
311       case LIB3DS_VIEW_TYPE_FRONT:
312         {
313           Lib3dsChunk c;
314           c.chunk=LIB3DS_VIEW_FRONT;
315           c.size=22;
316           lib3ds_chunk_write(&c,io);
317           lib3ds_io_write_vector(io, viewport->default_view.position);
318           lib3ds_io_write_float(io, viewport->default_view.width);
319         }
320         break;
321       case LIB3DS_VIEW_TYPE_BACK:
322         {
323           Lib3dsChunk c;
324           c.chunk=LIB3DS_VIEW_BACK;
325           c.size=22;
326           lib3ds_chunk_write(&c,io);
327           lib3ds_io_write_vector(io, viewport->default_view.position);
328           lib3ds_io_write_float(io, viewport->default_view.width);
329         }
330         break;
331       case LIB3DS_VIEW_TYPE_USER:
332         {
333           Lib3dsChunk c;
334           c.chunk=LIB3DS_VIEW_USER;
335           c.size=34;
336           lib3ds_chunk_write(&c,io);
337           lib3ds_io_write_vector(io, viewport->default_view.position);
338           lib3ds_io_write_float(io, viewport->default_view.width);
339           lib3ds_io_write_float(io, viewport->default_view.horiz_angle);
340           lib3ds_io_write_float(io, viewport->default_view.vert_angle);
341           lib3ds_io_write_float(io, viewport->default_view.roll_angle);
342         }
343         break;
344       case LIB3DS_VIEW_TYPE_CAMERA:
345         {
346           Lib3dsChunk c;
347           c.chunk=LIB3DS_VIEW_CAMERA;
348           c.size=17;
349           lib3ds_chunk_write(&c, io);
350           lib3ds_io_write(io, (unsigned char*)viewport->default_view.camera, 11);
351         }
352         break;
353     }
354
355     if (!lib3ds_chunk_write_end(&c, io)) {
356       return(LIB3DS_FALSE);
357     }
358   }
359   return(LIB3DS_TRUE);
360 }
361
362
363 /*!
364  * Dump viewport.
365  *
366  * \param viewport The viewport to be dumped.
367  *
368  * \ingroup node
369  */
370 void
371 lib3ds_viewport_dump(Lib3dsViewport *vp)
372 {
373   Lib3dsView    *view;
374   int           i;
375   ASSERT(vp);
376
377   printf("  viewport:\n");
378   printf("    layout:\n");
379   printf("      style:       %d\n", vp->layout.style);
380   printf("      active:      %d\n", vp->layout.active);
381   printf("      swap:        %d\n", vp->layout.swap);
382   printf("      swap_prior:  %d\n", vp->layout.swap_prior);
383   printf("      position:    %d,%d\n",
384         vp->layout.position[0], vp->layout.position[1]);
385   printf("      size:        %d,%d\n", vp->layout.size[0], vp->layout.size[1]);
386   printf("      views:       %ld\n", vp->layout.views);
387   if (vp->layout.views > 0 && vp->layout.viewL != NULL) {
388     for(i=0, view=vp->layout.viewL; i < vp->layout.views; ++i, ++view) {
389       printf("        view %d:\n", i);
390       printf("          type:         %d\n", view->type);
391       printf("          axis_lock:    %d\n", view->axis_lock);
392       printf("          position:     (%d,%d)\n",
393         view->position[0], view->position[1]);
394       printf("          size:         (%d,%d)\n", view->size[0], view->size[1]);
395       printf("          zoom:         %g\n", view->zoom);
396       printf("          center:       (%g,%g,%g)\n",
397         view->center[0], view->center[1], view->center[2]);
398       printf("          horiz_angle:  %g\n", view->horiz_angle);
399       printf("          vert_angle:   %g\n", view->vert_angle);
400       printf("          camera:       %s\n", view->camera);
401     }
402   }
403
404   printf("    default_view:\n");
405   printf("      type:         %d\n", vp->default_view.type);
406   printf("      position:     (%g,%g,%g)\n",
407     vp->default_view.position[0],
408     vp->default_view.position[1],
409     vp->default_view.position[2]);
410   printf("      width:        %g\n", vp->default_view.width);
411   printf("      horiz_angle:  %g\n", vp->default_view.horiz_angle);
412   printf("      vert_angle:   %g\n", vp->default_view.vert_angle);
413   printf("      roll_angle:   %g\n", vp->default_view.roll_angle);
414   printf("      camera:       %s\n", vp->default_view.camera);
415 }
416
417
418 /*!
419
420 \typedef Lib3dsViewport
421   \ingroup viewport
422   \sa _Lib3dsViewport
423
424 */