00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "lib3ds_impl.h"
00019
00020
00021 void
00022 lib3ds_viewport_read(Lib3dsViewport *viewport, Lib3dsIo *io) {
00023 Lib3dsChunk c;
00024 uint16_t chunk;
00025
00026 memset(viewport, 0, sizeof(*viewport));
00027 lib3ds_chunk_read_start(&c, 0, io);
00028 switch (c.chunk) {
00029 case CHK_VIEWPORT_LAYOUT: {
00030 int cur = 0;
00031 viewport->layout_style = lib3ds_io_read_word(io);
00032 viewport->layout_active = lib3ds_io_read_intw(io);
00033 lib3ds_io_read_intw(io);
00034 viewport->layout_swap = lib3ds_io_read_intw(io);
00035 lib3ds_io_read_intw(io);
00036 viewport->layout_swap_prior = lib3ds_io_read_intw(io);
00037 viewport->layout_swap_view = lib3ds_io_read_intw(io);
00038 lib3ds_chunk_read_tell(&c, io);
00039 while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00040 switch (chunk) {
00041 case CHK_VIEWPORT_SIZE: {
00042 viewport->layout_position[0] = lib3ds_io_read_word(io);
00043 viewport->layout_position[1] = lib3ds_io_read_word(io);
00044 viewport->layout_size[0] = lib3ds_io_read_word(io);
00045 viewport->layout_size[1] = lib3ds_io_read_word(io);
00046 break;
00047 }
00048
00049 case CHK_VIEWPORT_DATA_3: {
00050 if (cur < LIB3DS_LAYOUT_MAX_VIEWS) {
00051 lib3ds_io_read_intw(io);
00052 viewport->layout_views[cur].axis_lock = lib3ds_io_read_word(io);
00053 viewport->layout_views[cur].position[0] = lib3ds_io_read_intw(io);
00054 viewport->layout_views[cur].position[1] = lib3ds_io_read_intw(io);
00055 viewport->layout_views[cur].size[0] = lib3ds_io_read_intw(io);
00056 viewport->layout_views[cur].size[1] = lib3ds_io_read_intw(io);
00057 viewport->layout_views[cur].type = lib3ds_io_read_word(io);
00058 viewport->layout_views[cur].zoom = lib3ds_io_read_float(io);
00059 lib3ds_io_read_vector(io, viewport->layout_views[cur].center);
00060 viewport->layout_views[cur].horiz_angle = lib3ds_io_read_float(io);
00061 viewport->layout_views[cur].vert_angle = lib3ds_io_read_float(io);
00062 lib3ds_io_read(io, viewport->layout_views[cur].camera, 11);
00063 ++cur;
00064 }
00065 break;
00066 }
00067
00068 case CHK_VIEWPORT_DATA:
00069
00070 break;
00071
00072 default:
00073 lib3ds_chunk_unknown(chunk, io);
00074 }
00075 }
00076 break;
00077 }
00078
00079 case CHK_DEFAULT_VIEW: {
00080 while ((chunk = lib3ds_chunk_read_next(&c, io)) != 0) {
00081 switch (chunk) {
00082 case CHK_VIEW_TOP: {
00083 viewport->default_type = LIB3DS_VIEW_TOP;
00084 lib3ds_io_read_vector(io, viewport->default_position);
00085 viewport->default_width = lib3ds_io_read_float(io);
00086 break;
00087 }
00088
00089 case CHK_VIEW_BOTTOM: {
00090 viewport->default_type = LIB3DS_VIEW_BOTTOM;
00091 lib3ds_io_read_vector(io, viewport->default_position);
00092 viewport->default_width = lib3ds_io_read_float(io);
00093 break;
00094 }
00095
00096 case CHK_VIEW_LEFT: {
00097 viewport->default_type = LIB3DS_VIEW_LEFT;
00098 lib3ds_io_read_vector(io, viewport->default_position);
00099 viewport->default_width = lib3ds_io_read_float(io);
00100 break;
00101 }
00102
00103 case CHK_VIEW_RIGHT: {
00104 viewport->default_type = LIB3DS_VIEW_RIGHT;
00105 lib3ds_io_read_vector(io, viewport->default_position);
00106 viewport->default_width = lib3ds_io_read_float(io);
00107 break;
00108 }
00109
00110 case CHK_VIEW_FRONT: {
00111 viewport->default_type = LIB3DS_VIEW_FRONT;
00112 lib3ds_io_read_vector(io, viewport->default_position);
00113 viewport->default_width = lib3ds_io_read_float(io);
00114 break;
00115 }
00116
00117 case CHK_VIEW_BACK: {
00118 viewport->default_type = LIB3DS_VIEW_BACK;
00119 lib3ds_io_read_vector(io, viewport->default_position);
00120 viewport->default_width = lib3ds_io_read_float(io);
00121 break;
00122 }
00123
00124 case CHK_VIEW_USER: {
00125 viewport->default_type = LIB3DS_VIEW_USER;
00126 lib3ds_io_read_vector(io, viewport->default_position);
00127 viewport->default_width = lib3ds_io_read_float(io);
00128 viewport->default_horiz_angle = lib3ds_io_read_float(io);
00129 viewport->default_vert_angle = lib3ds_io_read_float(io);
00130 viewport->default_roll_angle = lib3ds_io_read_float(io);
00131 break;
00132 }
00133
00134 case CHK_VIEW_CAMERA: {
00135 viewport->default_type = LIB3DS_VIEW_CAMERA;
00136 lib3ds_io_read(io, viewport->default_camera, 11);
00137 break;
00138 }
00139
00140 default:
00141 lib3ds_chunk_unknown(chunk, io);
00142 }
00143 }
00144 break;
00145 }
00146 }
00147
00148 lib3ds_chunk_read_end(&c, io);
00149 }
00150
00151
00152 void
00153 lib3ds_viewport_write(Lib3dsViewport *viewport, Lib3dsIo *io) {
00154 if (viewport->layout_nviews) {
00155 Lib3dsChunk c;
00156 int i;
00157
00158 c.chunk = CHK_VIEWPORT_LAYOUT;
00159 lib3ds_chunk_write_start(&c, io);
00160
00161 lib3ds_io_write_word(io, viewport->layout_style);
00162 lib3ds_io_write_intw(io, viewport->layout_active);
00163 lib3ds_io_write_intw(io, 0);
00164 lib3ds_io_write_intw(io, viewport->layout_swap);
00165 lib3ds_io_write_intw(io, 0);
00166 lib3ds_io_write_intw(io, viewport->layout_swap_prior);
00167 lib3ds_io_write_intw(io, viewport->layout_swap_view);
00168
00169 {
00170 Lib3dsChunk c;
00171 c.chunk = CHK_VIEWPORT_SIZE;
00172 c.size = 14;
00173 lib3ds_chunk_write(&c, io);
00174 lib3ds_io_write_intw(io, viewport->layout_position[0]);
00175 lib3ds_io_write_intw(io, viewport->layout_position[1]);
00176 lib3ds_io_write_intw(io, viewport->layout_size[0]);
00177 lib3ds_io_write_intw(io, viewport->layout_size[1]);
00178 }
00179
00180 for (i = 0; i < viewport->layout_nviews; ++i) {
00181 Lib3dsChunk c;
00182 c.chunk = CHK_VIEWPORT_DATA_3;
00183 c.size = 55;
00184 lib3ds_chunk_write(&c, io);
00185
00186 lib3ds_io_write_intw(io, 0);
00187 lib3ds_io_write_word(io, viewport->layout_views[i].axis_lock);
00188 lib3ds_io_write_intw(io, viewport->layout_views[i].position[0]);
00189 lib3ds_io_write_intw(io, viewport->layout_views[i].position[1]);
00190 lib3ds_io_write_intw(io, viewport->layout_views[i].size[0]);
00191 lib3ds_io_write_intw(io, viewport->layout_views[i].size[1]);
00192 lib3ds_io_write_word(io, viewport->layout_views[i].type);
00193 lib3ds_io_write_float(io, viewport->layout_views[i].zoom);
00194 lib3ds_io_write_vector(io, viewport->layout_views[i].center);
00195 lib3ds_io_write_float(io, viewport->layout_views[i].horiz_angle);
00196 lib3ds_io_write_float(io, viewport->layout_views[i].vert_angle);
00197 lib3ds_io_write(io, viewport->layout_views[i].camera, 11);
00198 }
00199
00200 lib3ds_chunk_write_end(&c, io);
00201 }
00202
00203 if (viewport->default_type) {
00204 Lib3dsChunk c;
00205
00206 c.chunk = CHK_DEFAULT_VIEW;
00207 lib3ds_chunk_write_start(&c, io);
00208
00209 switch (viewport->default_type) {
00210 case LIB3DS_VIEW_TOP: {
00211 Lib3dsChunk c;
00212 c.chunk = CHK_VIEW_TOP;
00213 c.size = 22;
00214 lib3ds_chunk_write(&c, io);
00215 lib3ds_io_write_vector(io, viewport->default_position);
00216 lib3ds_io_write_float(io, viewport->default_width);
00217 break;
00218 }
00219
00220 case LIB3DS_VIEW_BOTTOM: {
00221 Lib3dsChunk c;
00222 c.chunk = CHK_VIEW_BOTTOM;
00223 c.size = 22;
00224 lib3ds_chunk_write(&c, io);
00225 lib3ds_io_write_vector(io, viewport->default_position);
00226 lib3ds_io_write_float(io, viewport->default_width);
00227 break;
00228 }
00229
00230 case LIB3DS_VIEW_LEFT: {
00231 Lib3dsChunk c;
00232 c.chunk = CHK_VIEW_LEFT;
00233 c.size = 22;
00234 lib3ds_chunk_write(&c, io);
00235 lib3ds_io_write_vector(io, viewport->default_position);
00236 lib3ds_io_write_float(io, viewport->default_width);
00237 break;
00238 }
00239
00240 case LIB3DS_VIEW_RIGHT: {
00241 Lib3dsChunk c;
00242 c.chunk = CHK_VIEW_RIGHT;
00243 c.size = 22;
00244 lib3ds_chunk_write(&c, io);
00245 lib3ds_io_write_vector(io, viewport->default_position);
00246 lib3ds_io_write_float(io, viewport->default_width);
00247 break;
00248 }
00249
00250 case LIB3DS_VIEW_FRONT: {
00251 Lib3dsChunk c;
00252 c.chunk = CHK_VIEW_FRONT;
00253 c.size = 22;
00254 lib3ds_chunk_write(&c, io);
00255 lib3ds_io_write_vector(io, viewport->default_position);
00256 lib3ds_io_write_float(io, viewport->default_width);
00257 break;
00258 }
00259
00260 case LIB3DS_VIEW_BACK: {
00261 Lib3dsChunk c;
00262 c.chunk = CHK_VIEW_BACK;
00263 c.size = 22;
00264 lib3ds_chunk_write(&c, io);
00265 lib3ds_io_write_vector(io, viewport->default_position);
00266 lib3ds_io_write_float(io, viewport->default_width);
00267 break;
00268 }
00269
00270 case LIB3DS_VIEW_USER: {
00271 Lib3dsChunk c;
00272 c.chunk = CHK_VIEW_USER;
00273 c.size = 34;
00274 lib3ds_chunk_write(&c, io);
00275 lib3ds_io_write_vector(io, viewport->default_position);
00276 lib3ds_io_write_float(io, viewport->default_width);
00277 lib3ds_io_write_float(io, viewport->default_horiz_angle);
00278 lib3ds_io_write_float(io, viewport->default_vert_angle);
00279 lib3ds_io_write_float(io, viewport->default_roll_angle);
00280 break;
00281 }
00282
00283 case LIB3DS_VIEW_CAMERA: {
00284 Lib3dsChunk c;
00285 c.chunk = CHK_VIEW_CAMERA;
00286 c.size = 17;
00287 lib3ds_chunk_write(&c, io);
00288 lib3ds_io_write(io, viewport->default_camera, 11);
00289 break;
00290 }
00291 }
00292
00293 lib3ds_chunk_write_end(&c, io);
00294 }
00295 }
00296