00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
00089
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