2 * The 3D Studio File Format Library
3 * Copyright (C) 1996-2001 by J.E. Hoffmann <je-h@gmx.net>
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.
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.
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.
20 * $Id: viewport.c,v 1.7 2004/11/16 07:40:56 efalk Exp $
23 #include <lib3ds/viewport.h>
24 #include <lib3ds/chunk.h>
25 #include <lib3ds/io.h>
31 * \defgroup viewport Viewport and default view settings
33 * \author J.E. Hoffmann <je-h@gmx.net>
41 lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io)
46 if (!lib3ds_chunk_read_start(&c, 0, io)) {
51 case LIB3DS_VIEWPORT_LAYOUT:
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) {
64 case LIB3DS_VIEWPORT_SIZE:
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);
72 case LIB3DS_VIEWPORT_DATA_3:
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);
90 case LIB3DS_VIEWPORT_DATA:
95 lib3ds_chunk_unknown(chunk);
100 case LIB3DS_DEFAULT_VIEW:
102 memset(&viewport->default_view,0,sizeof(Lib3dsDefaultView));
103 while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) {
105 case LIB3DS_VIEW_TOP:
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);
112 case LIB3DS_VIEW_BOTTOM:
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);
119 case LIB3DS_VIEW_LEFT:
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);
126 case LIB3DS_VIEW_RIGHT:
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);
133 case LIB3DS_VIEW_FRONT:
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);
140 case LIB3DS_VIEW_BACK:
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);
147 case LIB3DS_VIEW_USER:
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);
157 case LIB3DS_VIEW_CAMERA:
159 viewport->default_view.type=LIB3DS_VIEW_TYPE_CAMERA;
160 lib3ds_io_read(io, (unsigned char*)viewport->default_view.camera, 11);
164 lib3ds_chunk_unknown(chunk);
171 lib3ds_chunk_read_end(&c, io);
180 lib3ds_viewport_set_views(Lib3dsViewport *viewport, Lib3dsDword views)
183 if (viewport->layout.views) {
185 viewport->layout.views=views;
186 viewport->layout.viewL=(Lib3dsView*)realloc(viewport->layout.viewL, sizeof(Lib3dsView)*views);
189 free(viewport->layout.viewL);
190 viewport->layout.views=0;
191 viewport->layout.viewL=0;
196 viewport->layout.views=views;
197 viewport->layout.viewL=(Lib3dsView*)calloc(sizeof(Lib3dsView),views);
207 lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io)
209 if (viewport->layout.views) {
213 c.chunk=LIB3DS_VIEWPORT_LAYOUT;
214 if (!lib3ds_chunk_write_start(&c,io)) {
215 return(LIB3DS_FALSE);
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);
228 c.chunk=LIB3DS_VIEWPORT_SIZE;
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]);
237 for (i=0; i<viewport->layout.views; ++i) {
239 c.chunk=LIB3DS_VIEWPORT_DATA_3;
241 lib3ds_chunk_write(&c,io);
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);
257 if (!lib3ds_chunk_write_end(&c,io)) {
258 return(LIB3DS_FALSE);
262 if (viewport->default_view.type) {
265 c.chunk=LIB3DS_DEFAULT_VIEW;
266 if (!lib3ds_chunk_write_start(&c,io)) {
267 return(LIB3DS_FALSE);
270 switch (viewport->default_view.type) {
271 case LIB3DS_VIEW_TYPE_TOP:
274 c.chunk=LIB3DS_VIEW_TOP;
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);
281 case LIB3DS_VIEW_TYPE_BOTTOM:
284 c.chunk=LIB3DS_VIEW_BOTTOM;
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);
291 case LIB3DS_VIEW_TYPE_LEFT:
294 c.chunk=LIB3DS_VIEW_LEFT;
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);
301 case LIB3DS_VIEW_TYPE_RIGHT:
304 c.chunk=LIB3DS_VIEW_RIGHT;
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);
311 case LIB3DS_VIEW_TYPE_FRONT:
314 c.chunk=LIB3DS_VIEW_FRONT;
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);
321 case LIB3DS_VIEW_TYPE_BACK:
324 c.chunk=LIB3DS_VIEW_BACK;
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);
331 case LIB3DS_VIEW_TYPE_USER:
334 c.chunk=LIB3DS_VIEW_USER;
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);
344 case LIB3DS_VIEW_TYPE_CAMERA:
347 c.chunk=LIB3DS_VIEW_CAMERA;
349 lib3ds_chunk_write(&c, io);
350 lib3ds_io_write(io, (unsigned char*)viewport->default_view.camera, 11);
355 if (!lib3ds_chunk_write_end(&c, io)) {
356 return(LIB3DS_FALSE);
366 * \param viewport The viewport to be dumped.
371 lib3ds_viewport_dump(Lib3dsViewport *vp)
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);
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);
420 \typedef Lib3dsViewport