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.cpp 9397 2008-12-18 15:49:44Z robert $
25
#include "readwrite.h"
31
* \defgroup viewport Viewport and default view settings
33
* \author J.E. Hoffmann <je-h@gmx.net>
41
lib3ds_viewport_read(Lib3dsViewport *viewport, FILE *f)
46
if (!lib3ds_chunk_read_start(&c, 0, f)) {
51
case LIB3DS_VIEWPORT_LAYOUT:
54
viewport->layout.style=lib3ds_word_read(f);
55
viewport->layout.active=lib3ds_intw_read(f);
57
viewport->layout.swap=lib3ds_intw_read(f);
59
viewport->layout.swap_prior=lib3ds_intw_read(f);
60
viewport->layout.swap_view=lib3ds_intw_read(f);
61
lib3ds_chunk_read_tell(&c, f);
62
while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) {
64
case LIB3DS_VIEWPORT_SIZE:
66
viewport->layout.position[0]=lib3ds_word_read(f);
67
viewport->layout.position[1]=lib3ds_word_read(f);
68
viewport->layout.size[0]=lib3ds_word_read(f);
69
viewport->layout.size[1]=lib3ds_word_read(f);
72
case LIB3DS_VIEWPORT_DATA_3:
74
lib3ds_viewport_set_views(viewport,cur+1);
76
viewport->layout.viewL[cur].axis_lock=lib3ds_word_read(f);
77
viewport->layout.viewL[cur].position[0]=lib3ds_intw_read(f);
78
viewport->layout.viewL[cur].position[1]=lib3ds_intw_read(f);
79
viewport->layout.viewL[cur].size[0]=lib3ds_intw_read(f);
80
viewport->layout.viewL[cur].size[1]=lib3ds_intw_read(f);
81
viewport->layout.viewL[cur].type=lib3ds_word_read(f);
82
viewport->layout.viewL[cur].zoom=lib3ds_float_read(f);
83
lib3ds_vector_read(viewport->layout.viewL[cur].center,f);
84
viewport->layout.viewL[cur].horiz_angle=lib3ds_float_read(f);
85
viewport->layout.viewL[cur].vert_angle=lib3ds_float_read(f);
87
int result = fread(viewport->layout.viewL[cur].camera,11,1,f);
88
if (result==0) return (LIB3DS_FALSE);
93
case LIB3DS_VIEWPORT_DATA:
98
lib3ds_chunk_unknown(chunk);
103
case LIB3DS_DEFAULT_VIEW:
105
memset(&viewport->default_view,0,sizeof(Lib3dsDefaultView));
106
while ((chunk=lib3ds_chunk_read_next(&c, f))!=0) {
108
case LIB3DS_VIEW_TOP:
110
viewport->default_view.type=LIB3DS_VIEW_TYPE_TOP;
111
lib3ds_vector_read(viewport->default_view.position,f);
112
viewport->default_view.width=lib3ds_float_read(f);
115
case LIB3DS_VIEW_BOTTOM:
117
viewport->default_view.type=LIB3DS_VIEW_TYPE_BOTTOM;
118
lib3ds_vector_read(viewport->default_view.position,f);
119
viewport->default_view.width=lib3ds_float_read(f);
122
case LIB3DS_VIEW_LEFT:
124
viewport->default_view.type=LIB3DS_VIEW_TYPE_LEFT;
125
lib3ds_vector_read(viewport->default_view.position,f);
126
viewport->default_view.width=lib3ds_float_read(f);
129
case LIB3DS_VIEW_RIGHT:
131
viewport->default_view.type=LIB3DS_VIEW_TYPE_RIGHT;
132
lib3ds_vector_read(viewport->default_view.position,f);
133
viewport->default_view.width=lib3ds_float_read(f);
136
case LIB3DS_VIEW_FRONT:
138
viewport->default_view.type=LIB3DS_VIEW_TYPE_FRONT;
139
lib3ds_vector_read(viewport->default_view.position,f);
140
viewport->default_view.width=lib3ds_float_read(f);
143
case LIB3DS_VIEW_BACK:
145
viewport->default_view.type=LIB3DS_VIEW_TYPE_BACK;
146
lib3ds_vector_read(viewport->default_view.position,f);
147
viewport->default_view.width=lib3ds_float_read(f);
150
case LIB3DS_VIEW_USER:
152
viewport->default_view.type=LIB3DS_VIEW_TYPE_USER;
153
lib3ds_vector_read(viewport->default_view.position,f);
154
viewport->default_view.width=lib3ds_float_read(f);
155
viewport->default_view.horiz_angle=lib3ds_float_read(f);
156
viewport->default_view.vert_angle=lib3ds_float_read(f);
157
viewport->default_view.roll_angle=lib3ds_float_read(f);
160
case LIB3DS_VIEW_CAMERA:
162
viewport->default_view.type=LIB3DS_VIEW_TYPE_CAMERA;
163
int result = fread(viewport->default_view.camera,11,1,f);
164
if (result==0) return (LIB3DS_FALSE);
168
lib3ds_chunk_unknown(chunk);
175
lib3ds_chunk_read_end(&c, f);
184
lib3ds_viewport_set_views(Lib3dsViewport *viewport, Lib3dsDword views)
187
if (viewport->layout.views) {
189
viewport->layout.views=views;
190
viewport->layout.viewL=(Lib3dsView*)realloc(viewport->layout.viewL, sizeof(Lib3dsView)*views);
193
free(viewport->layout.viewL);
194
viewport->layout.views=0;
195
viewport->layout.viewL=0;
199
viewport->layout.views=views;
200
viewport->layout.viewL= views ? (Lib3dsView*)calloc(sizeof(Lib3dsView),views) : 0;
209
lib3ds_viewport_write(Lib3dsViewport *viewport, FILE *f)
211
if (viewport->layout.views) {
215
c.chunk=LIB3DS_VIEWPORT_LAYOUT;
216
if (!lib3ds_chunk_write_start(&c,f)) {
217
return(LIB3DS_FALSE);
220
lib3ds_word_write(viewport->layout.style,f);
221
lib3ds_intw_write(viewport->layout.active,f);
222
lib3ds_intw_write(0,f);
223
lib3ds_intw_write(viewport->layout.swap,f);
224
lib3ds_intw_write(0,f);
225
lib3ds_intw_write(viewport->layout.swap_prior,f);
226
lib3ds_intw_write(viewport->layout.swap_view,f);
230
c.chunk=LIB3DS_VIEWPORT_SIZE;
232
lib3ds_chunk_write(&c,f);
233
lib3ds_intw_write(viewport->layout.position[0],f);
234
lib3ds_intw_write(viewport->layout.position[1],f);
235
lib3ds_intw_write(viewport->layout.size[0],f);
236
lib3ds_intw_write(viewport->layout.size[1],f);
239
for (i=0; i<viewport->layout.views; ++i) {
241
c.chunk=LIB3DS_VIEWPORT_DATA_3;
243
lib3ds_chunk_write(&c,f);
245
lib3ds_intw_write(0,f);
246
lib3ds_word_write(viewport->layout.viewL[i].axis_lock,f);
247
lib3ds_intw_write(viewport->layout.viewL[i].position[0],f);
248
lib3ds_intw_write(viewport->layout.viewL[i].position[1],f);
249
lib3ds_intw_write(viewport->layout.viewL[i].size[0],f);
250
lib3ds_intw_write(viewport->layout.viewL[i].size[1],f);
251
lib3ds_word_write(viewport->layout.viewL[i].type,f);
252
lib3ds_float_write(viewport->layout.viewL[i].zoom,f);
253
lib3ds_vector_write(viewport->layout.viewL[i].center,f);
254
lib3ds_float_write(viewport->layout.viewL[i].horiz_angle,f);
255
lib3ds_float_write(viewport->layout.viewL[i].vert_angle,f);
256
int result = fwrite(viewport->layout.viewL[i].camera,11,1,f);
257
if (result==0) return (LIB3DS_FALSE);
260
if (!lib3ds_chunk_write_end(&c,f)) {
261
return(LIB3DS_FALSE);
265
if (viewport->default_view.type) {
268
c.chunk=LIB3DS_DEFAULT_VIEW;
269
if (!lib3ds_chunk_write_start(&c,f)) {
270
return(LIB3DS_FALSE);
273
switch (viewport->default_view.type) {
274
case LIB3DS_VIEW_TYPE_TOP:
277
c.chunk=LIB3DS_VIEW_TOP;
279
lib3ds_chunk_write(&c,f);
280
lib3ds_vector_write(viewport->default_view.position,f);
281
lib3ds_float_write(viewport->default_view.width,f);
284
case LIB3DS_VIEW_TYPE_BOTTOM:
287
c.chunk=LIB3DS_VIEW_BOTTOM;
289
lib3ds_chunk_write(&c,f);
290
lib3ds_vector_write(viewport->default_view.position,f);
291
lib3ds_float_write(viewport->default_view.width,f);
294
case LIB3DS_VIEW_TYPE_LEFT:
297
c.chunk=LIB3DS_VIEW_LEFT;
299
lib3ds_chunk_write(&c,f);
300
lib3ds_vector_write(viewport->default_view.position,f);
301
lib3ds_float_write(viewport->default_view.width,f);
304
case LIB3DS_VIEW_TYPE_RIGHT:
307
c.chunk=LIB3DS_VIEW_RIGHT;
309
lib3ds_chunk_write(&c,f);
310
lib3ds_vector_write(viewport->default_view.position,f);
311
lib3ds_float_write(viewport->default_view.width,f);
314
case LIB3DS_VIEW_TYPE_FRONT:
317
c.chunk=LIB3DS_VIEW_FRONT;
319
lib3ds_chunk_write(&c,f);
320
lib3ds_vector_write(viewport->default_view.position,f);
321
lib3ds_float_write(viewport->default_view.width,f);
324
case LIB3DS_VIEW_TYPE_BACK:
327
c.chunk=LIB3DS_VIEW_BACK;
329
lib3ds_chunk_write(&c,f);
330
lib3ds_vector_write(viewport->default_view.position,f);
331
lib3ds_float_write(viewport->default_view.width,f);
334
case LIB3DS_VIEW_TYPE_USER:
337
c.chunk=LIB3DS_VIEW_USER;
339
lib3ds_chunk_write(&c,f);
340
lib3ds_vector_write(viewport->default_view.position,f);
341
lib3ds_float_write(viewport->default_view.width,f);
342
lib3ds_float_write(viewport->default_view.horiz_angle,f);
343
lib3ds_float_write(viewport->default_view.vert_angle,f);
344
lib3ds_float_write(viewport->default_view.roll_angle,f);
347
case LIB3DS_VIEW_TYPE_CAMERA:
350
c.chunk=LIB3DS_VIEW_CAMERA;
352
lib3ds_chunk_write(&c,f);
353
int result = fwrite(viewport->default_view.camera,1,11,f);
354
if (result==0) return (LIB3DS_FALSE);
359
if (!lib3ds_chunk_write_end(&c,f)) {
360
return(LIB3DS_FALSE);
369
\typedef Lib3dsViewport