X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2F3dengfx%2Flibs%2Flib3ds%2Fviewport.c;fp=src%2F3dengfx%2Flibs%2Flib3ds%2Fviewport.c;h=9a5a45b8d70d51f38ef30b21b182f079ac1dba9d;hb=6e23259dbabaeb1711a2a5ca25b9cb421f693759;hp=0000000000000000000000000000000000000000;hpb=fe068fa879814784c45e0cb2e65dac489e8f5594;p=summerhack diff --git a/src/3dengfx/libs/lib3ds/viewport.c b/src/3dengfx/libs/lib3ds/viewport.c new file mode 100644 index 0000000..9a5a45b --- /dev/null +++ b/src/3dengfx/libs/lib3ds/viewport.c @@ -0,0 +1,424 @@ +/* + * The 3D Studio File Format Library + * Copyright (C) 1996-2001 by J.E. Hoffmann + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id: viewport.c,v 1.7 2004/11/16 07:40:56 efalk Exp $ + */ +#define LIB3DS_EXPORT +#include +#include +#include +#include +#include + + +/*! + * \defgroup viewport Viewport and default view settings + * + * \author J.E. Hoffmann + */ + + +/*! + * \ingroup viewport + */ +Lib3dsBool +lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io) +{ + Lib3dsChunk c; + Lib3dsWord chunk; + + if (!lib3ds_chunk_read_start(&c, 0, io)) { + return(LIB3DS_FALSE); + } + + switch (c.chunk) { + case LIB3DS_VIEWPORT_LAYOUT: + { + int cur=0; + viewport->layout.style=lib3ds_io_read_word(io); + viewport->layout.active=lib3ds_io_read_intw(io); + lib3ds_io_read_intw(io); + viewport->layout.swap=lib3ds_io_read_intw(io); + lib3ds_io_read_intw(io); + viewport->layout.swap_prior=lib3ds_io_read_intw(io); + viewport->layout.swap_view=lib3ds_io_read_intw(io); + lib3ds_chunk_read_tell(&c, io); + while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { + switch (chunk) { + case LIB3DS_VIEWPORT_SIZE: + { + viewport->layout.position[0]=lib3ds_io_read_word(io); + viewport->layout.position[1]=lib3ds_io_read_word(io); + viewport->layout.size[0]=lib3ds_io_read_word(io); + viewport->layout.size[1]=lib3ds_io_read_word(io); + } + break; + case LIB3DS_VIEWPORT_DATA_3: + { + lib3ds_viewport_set_views(viewport,cur+1); + lib3ds_io_read_intw(io); + viewport->layout.viewL[cur].axis_lock=lib3ds_io_read_word(io); + viewport->layout.viewL[cur].position[0]=lib3ds_io_read_intw(io); + viewport->layout.viewL[cur].position[1]=lib3ds_io_read_intw(io); + viewport->layout.viewL[cur].size[0]=lib3ds_io_read_intw(io); + viewport->layout.viewL[cur].size[1]=lib3ds_io_read_intw(io); + viewport->layout.viewL[cur].type=lib3ds_io_read_word(io); + viewport->layout.viewL[cur].zoom=lib3ds_io_read_float(io); + lib3ds_io_read_vector(io, viewport->layout.viewL[cur].center); + viewport->layout.viewL[cur].horiz_angle=lib3ds_io_read_float(io); + viewport->layout.viewL[cur].vert_angle=lib3ds_io_read_float(io); + lib3ds_io_read(io, (unsigned char*)viewport->layout.viewL[cur].camera, 11); + ++cur; + } + break; + case LIB3DS_VIEWPORT_DATA: + /* 3DS R2 & R3 chunk + unsupported */ + break; + default: + lib3ds_chunk_unknown(chunk); + } + } + } + break; + case LIB3DS_DEFAULT_VIEW: + { + memset(&viewport->default_view,0,sizeof(Lib3dsDefaultView)); + while ((chunk=lib3ds_chunk_read_next(&c, io))!=0) { + switch (chunk) { + case LIB3DS_VIEW_TOP: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_TOP; + lib3ds_io_read_vector(io, viewport->default_view.position); + viewport->default_view.width=lib3ds_io_read_float(io); + } + break; + case LIB3DS_VIEW_BOTTOM: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_BOTTOM; + lib3ds_io_read_vector(io, viewport->default_view.position); + viewport->default_view.width=lib3ds_io_read_float(io); + } + break; + case LIB3DS_VIEW_LEFT: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_LEFT; + lib3ds_io_read_vector(io, viewport->default_view.position); + viewport->default_view.width=lib3ds_io_read_float(io); + } + break; + case LIB3DS_VIEW_RIGHT: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_RIGHT; + lib3ds_io_read_vector(io, viewport->default_view.position); + viewport->default_view.width=lib3ds_io_read_float(io); + } + break; + case LIB3DS_VIEW_FRONT: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_FRONT; + lib3ds_io_read_vector(io, viewport->default_view.position); + viewport->default_view.width=lib3ds_io_read_float(io); + } + break; + case LIB3DS_VIEW_BACK: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_BACK; + lib3ds_io_read_vector(io, viewport->default_view.position); + viewport->default_view.width=lib3ds_io_read_float(io); + } + break; + case LIB3DS_VIEW_USER: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_USER; + lib3ds_io_read_vector(io, viewport->default_view.position); + viewport->default_view.width=lib3ds_io_read_float(io); + viewport->default_view.horiz_angle=lib3ds_io_read_float(io); + viewport->default_view.vert_angle=lib3ds_io_read_float(io); + viewport->default_view.roll_angle=lib3ds_io_read_float(io); + } + break; + case LIB3DS_VIEW_CAMERA: + { + viewport->default_view.type=LIB3DS_VIEW_TYPE_CAMERA; + lib3ds_io_read(io, (unsigned char*)viewport->default_view.camera, 11); + } + break; + default: + lib3ds_chunk_unknown(chunk); + } + } + } + break; + } + + lib3ds_chunk_read_end(&c, io); + return(LIB3DS_TRUE); +} + + +/*! + * \ingroup viewport + */ +void +lib3ds_viewport_set_views(Lib3dsViewport *viewport, Lib3dsDword views) +{ + ASSERT(viewport); + if (viewport->layout.views) { + if (views) { + viewport->layout.views=views; + viewport->layout.viewL=(Lib3dsView*)realloc(viewport->layout.viewL, sizeof(Lib3dsView)*views); + } + else { + free(viewport->layout.viewL); + viewport->layout.views=0; + viewport->layout.viewL=0; + } + } + else { + if (views) { + viewport->layout.views=views; + viewport->layout.viewL=(Lib3dsView*)calloc(sizeof(Lib3dsView),views); + } + } +} + + +/*! + * \ingroup viewport + */ +Lib3dsBool +lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io) +{ + if (viewport->layout.views) { + Lib3dsChunk c; + unsigned i; + + c.chunk=LIB3DS_VIEWPORT_LAYOUT; + if (!lib3ds_chunk_write_start(&c,io)) { + return(LIB3DS_FALSE); + } + + lib3ds_io_write_word(io, viewport->layout.style); + lib3ds_io_write_intw(io, viewport->layout.active); + lib3ds_io_write_intw(io, 0); + lib3ds_io_write_intw(io, viewport->layout.swap); + lib3ds_io_write_intw(io, 0); + lib3ds_io_write_intw(io, viewport->layout.swap_prior); + lib3ds_io_write_intw(io, viewport->layout.swap_view); + + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEWPORT_SIZE; + c.size=14; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_intw(io, viewport->layout.position[0]); + lib3ds_io_write_intw(io, viewport->layout.position[1]); + lib3ds_io_write_intw(io, viewport->layout.size[0]); + lib3ds_io_write_intw(io, viewport->layout.size[1]); + } + + for (i=0; ilayout.views; ++i) { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEWPORT_DATA_3; + c.size=55; + lib3ds_chunk_write(&c,io); + + lib3ds_io_write_intw(io, 0); + lib3ds_io_write_word(io, viewport->layout.viewL[i].axis_lock); + lib3ds_io_write_intw(io, viewport->layout.viewL[i].position[0]); + lib3ds_io_write_intw(io, viewport->layout.viewL[i].position[1]); + lib3ds_io_write_intw(io, viewport->layout.viewL[i].size[0]); + lib3ds_io_write_intw(io, viewport->layout.viewL[i].size[1]); + lib3ds_io_write_word(io, viewport->layout.viewL[i].type); + lib3ds_io_write_float(io, viewport->layout.viewL[i].zoom); + lib3ds_io_write_vector(io, viewport->layout.viewL[i].center); + lib3ds_io_write_float(io, viewport->layout.viewL[i].horiz_angle); + lib3ds_io_write_float(io, viewport->layout.viewL[i].vert_angle); + lib3ds_io_write(io, (unsigned char*)viewport->layout.viewL[i].camera,11); + } + + if (!lib3ds_chunk_write_end(&c,io)) { + return(LIB3DS_FALSE); + } + } + + if (viewport->default_view.type) { + Lib3dsChunk c; + + c.chunk=LIB3DS_DEFAULT_VIEW; + if (!lib3ds_chunk_write_start(&c,io)) { + return(LIB3DS_FALSE); + } + + switch (viewport->default_view.type) { + case LIB3DS_VIEW_TYPE_TOP: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_TOP; + c.size=22; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_vector(io, viewport->default_view.position); + lib3ds_io_write_float(io, viewport->default_view.width); + } + break; + case LIB3DS_VIEW_TYPE_BOTTOM: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_BOTTOM; + c.size=22; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_vector(io, viewport->default_view.position); + lib3ds_io_write_float(io, viewport->default_view.width); + } + break; + case LIB3DS_VIEW_TYPE_LEFT: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_LEFT; + c.size=22; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_vector(io, viewport->default_view.position); + lib3ds_io_write_float(io, viewport->default_view.width); + } + break; + case LIB3DS_VIEW_TYPE_RIGHT: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_RIGHT; + c.size=22; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_vector(io, viewport->default_view.position); + lib3ds_io_write_float(io, viewport->default_view.width); + } + break; + case LIB3DS_VIEW_TYPE_FRONT: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_FRONT; + c.size=22; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_vector(io, viewport->default_view.position); + lib3ds_io_write_float(io, viewport->default_view.width); + } + break; + case LIB3DS_VIEW_TYPE_BACK: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_BACK; + c.size=22; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_vector(io, viewport->default_view.position); + lib3ds_io_write_float(io, viewport->default_view.width); + } + break; + case LIB3DS_VIEW_TYPE_USER: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_USER; + c.size=34; + lib3ds_chunk_write(&c,io); + lib3ds_io_write_vector(io, viewport->default_view.position); + lib3ds_io_write_float(io, viewport->default_view.width); + lib3ds_io_write_float(io, viewport->default_view.horiz_angle); + lib3ds_io_write_float(io, viewport->default_view.vert_angle); + lib3ds_io_write_float(io, viewport->default_view.roll_angle); + } + break; + case LIB3DS_VIEW_TYPE_CAMERA: + { + Lib3dsChunk c; + c.chunk=LIB3DS_VIEW_CAMERA; + c.size=17; + lib3ds_chunk_write(&c, io); + lib3ds_io_write(io, (unsigned char*)viewport->default_view.camera, 11); + } + break; + } + + if (!lib3ds_chunk_write_end(&c, io)) { + return(LIB3DS_FALSE); + } + } + return(LIB3DS_TRUE); +} + + +/*! + * Dump viewport. + * + * \param viewport The viewport to be dumped. + * + * \ingroup node + */ +void +lib3ds_viewport_dump(Lib3dsViewport *vp) +{ + Lib3dsView *view; + int i; + ASSERT(vp); + + printf(" viewport:\n"); + printf(" layout:\n"); + printf(" style: %d\n", vp->layout.style); + printf(" active: %d\n", vp->layout.active); + printf(" swap: %d\n", vp->layout.swap); + printf(" swap_prior: %d\n", vp->layout.swap_prior); + printf(" position: %d,%d\n", + vp->layout.position[0], vp->layout.position[1]); + printf(" size: %d,%d\n", vp->layout.size[0], vp->layout.size[1]); + printf(" views: %ld\n", vp->layout.views); + if (vp->layout.views > 0 && vp->layout.viewL != NULL) { + for(i=0, view=vp->layout.viewL; i < vp->layout.views; ++i, ++view) { + printf(" view %d:\n", i); + printf(" type: %d\n", view->type); + printf(" axis_lock: %d\n", view->axis_lock); + printf(" position: (%d,%d)\n", + view->position[0], view->position[1]); + printf(" size: (%d,%d)\n", view->size[0], view->size[1]); + printf(" zoom: %g\n", view->zoom); + printf(" center: (%g,%g,%g)\n", + view->center[0], view->center[1], view->center[2]); + printf(" horiz_angle: %g\n", view->horiz_angle); + printf(" vert_angle: %g\n", view->vert_angle); + printf(" camera: %s\n", view->camera); + } + } + + printf(" default_view:\n"); + printf(" type: %d\n", vp->default_view.type); + printf(" position: (%g,%g,%g)\n", + vp->default_view.position[0], + vp->default_view.position[1], + vp->default_view.position[2]); + printf(" width: %g\n", vp->default_view.width); + printf(" horiz_angle: %g\n", vp->default_view.horiz_angle); + printf(" vert_angle: %g\n", vp->default_view.vert_angle); + printf(" roll_angle: %g\n", vp->default_view.roll_angle); + printf(" camera: %s\n", vp->default_view.camera); +} + + +/*! + +\typedef Lib3dsViewport + \ingroup viewport + \sa _Lib3dsViewport + +*/