aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_maya/imp_maya_callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/others/mimesh/libg3d-0.0.8/plugins/import/imp_maya/imp_maya_callbacks.c')
-rw-r--r--src/others/mimesh/libg3d-0.0.8/plugins/import/imp_maya/imp_maya_callbacks.c645
1 files changed, 645 insertions, 0 deletions
diff --git a/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_maya/imp_maya_callbacks.c b/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_maya/imp_maya_callbacks.c
new file mode 100644
index 0000000..f2b4907
--- /dev/null
+++ b/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_maya/imp_maya_callbacks.c
@@ -0,0 +1,645 @@
1/* $Id$ */
2
3/*
4 libg3d - 3D object loading library
5
6 Copyright (C) 2005-2009 Markus Dahms <mad@automagically.de>
7
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21*/
22#include <string.h>
23
24#include <g3d/iff.h>
25#include <g3d/model.h>
26#include <g3d/material.h>
27#include <g3d/primitive.h>
28#include <g3d/stream.h>
29#include <g3d/matrix.h>
30#include <g3d/debug.h>
31
32#include "imp_maya_obj.h"
33#include "imp_maya_var.h"
34
35/* compound? */
36gboolean maya_cb_CMPD(G3DIffGlobal *global, G3DIffLocal *local)
37{
38 gint32 flags, i;
39 gdouble *val;
40 gchar *var;
41 gchar *padding = " ";
42
43 if(local->nb < 26)
44 {
45 g_warning("[Maya][CMPD] size: %d", local->nb);
46 return FALSE;
47 }
48
49 /* var */
50 var = g_new0(gchar, local->nb - 25);
51 g3d_stream_read(global->stream, var, local->nb - 25);
52 local->nb -= (local->nb - 25);
53
54 /* flags ? */
55 flags = g3d_stream_read_int8(global->stream);
56 local->nb -= 1;
57
58 val = g_new0(gdouble, 3);
59
60 for(i = 0; i < 3; i ++)
61 {
62 val[i] = g3d_stream_read_double_be(global->stream);
63 local->nb -= 8;
64 }
65
66 g_debug("\\%s[Maya][CMPD] %s = [%g %g %g]",
67 padding + (strlen(padding) - local->level),
68 var,
69 val[0], val[1], val[2]);
70
71 if(local->object)
72 maya_var_set((MayaObject *)local->object, var, val);
73 else
74 g_free(val);
75
76 g_free(var);
77
78 return TRUE;
79}
80
81/* creator */
82gboolean maya_cb_CREA(G3DIffGlobal *global, G3DIffLocal *local)
83{
84 MayaObject *obj;
85 gint32 max_len, flags;
86 gchar *buffer, *name;
87 gchar *padding = " ";
88
89 /* flags ? */
90 flags = g3d_stream_read_int8(global->stream);
91 local->nb -= 1;
92
93 max_len = local->nb;
94 buffer = g_malloc(max_len + 1);
95
96 /* object name */
97 local->nb -= g3d_stream_read_cstr(global->stream, buffer, max_len);
98 name = g_strdup(buffer);
99
100 obj = (MayaObject *)local->object;
101 if(obj)
102 obj->name = g_strdup(buffer);
103
104 /* parent name */
105 if(local->nb > 0)
106 local->nb -= g3d_stream_read_cstr(global->stream, buffer, max_len);
107 else
108 *buffer = '\0';
109
110 if(obj && *buffer)
111 obj->parent = g_strdup(buffer);
112
113 g_debug("\\%s[Maya][CREA] %s (%s)",
114 padding + (strlen(padding) - local->level),
115 name, *buffer ? buffer : "none");
116
117 g_free(buffer);
118 g_free(name);
119
120 return TRUE;
121}
122
123gboolean maya_cb_CWFL(G3DIffGlobal *global, G3DIffLocal *local)
124{
125 gchar *buffer, *name;
126 gchar *padding = " ";
127 guint32 flags, max_len;
128
129 /* flags ? */
130 flags = g3d_stream_read_int8(global->stream);
131 local->nb -= 1;
132
133 max_len = local->nb;
134 buffer = g_malloc(max_len + 1);
135
136 local->nb -= g3d_stream_read_cstr(global->stream, buffer, max_len);
137 name = g_strdup(buffer);
138
139 local->nb -= g3d_stream_read_cstr(global->stream, buffer, max_len);
140
141 g_debug("\\%s[Maya][CWFL] %s; %s (flags: %u, %d bytes left)",
142 padding + (strlen(padding) - local->level),
143 name, buffer, flags, local->nb);
144
145 g_free(name);
146 g_free(buffer);
147
148 return TRUE;
149}
150
151/* double # */
152gboolean maya_cb_DBLn(G3DIffGlobal *global, G3DIffLocal *local)
153{
154 gint32 len, flags, ndbl, i;
155 gdouble *val;
156 gchar *var;
157 gchar *padding = " ";
158
159 len = local->nb - 9;
160 var = g_malloc(len);
161 g3d_stream_read(global->stream, var, len);
162 local->nb -= len;
163
164 flags = g3d_stream_read_int8(global->stream);
165 local->nb -= 1;
166
167 ndbl = local->nb / 8;
168 val = g_new0(gdouble, ndbl);
169 for(i = 0; i < ndbl; i ++)
170 {
171 val[i] = g3d_stream_read_double_be(global->stream);
172 local->nb -= 8;
173 }
174
175 g_debug("\\%s[Maya][DBL#] %s (%d doubles) (0x%02X)",
176 padding + (strlen(padding) - local->level),
177 var, ndbl, flags);
178
179 if(local->object)
180 maya_var_set((MayaObject *)local->object, var, val);
181 else
182 g_free(val);
183
184 g_free(var);
185
186 return TRUE;
187}
188
189/* double 2 */
190gboolean maya_cb_DBL2(G3DIffGlobal *global, G3DIffLocal *local)
191{
192 gint32 len, flags;
193 gdouble *val;
194 gchar *var;
195 gchar *padding = " ";
196
197 len = local->nb - 17;
198 var = g_malloc(len);
199 g3d_stream_read(global->stream, var, len);
200 local->nb -= len;
201
202 flags = g3d_stream_read_int8(global->stream);
203 local->nb -= 1;
204
205 val = g_new0(gdouble, 2);
206 val[0] = g3d_stream_read_double_be(global->stream);
207 val[1] = g3d_stream_read_double_be(global->stream);
208 local->nb -= 16;
209
210 g_debug("\\%s[Maya][DBL2] %s = (%g,%g) (0x%02X)",
211 padding + (strlen(padding) - local->level),
212 var, val[0], val[1], flags);
213
214 if(local->object)
215 maya_var_set((MayaObject *)local->object, var, val);
216 else
217 g_free(val);
218
219 g_free(var);
220
221 return TRUE;
222}
223
224/* double 3 */
225gboolean maya_cb_DBL3(G3DIffGlobal *global, G3DIffLocal *local)
226{
227 gint32 len, flags;
228 gdouble *val;
229 gchar *var;
230 gchar *padding = " ";
231
232 len = local->nb - 25;
233 var = g_malloc(len);
234 g3d_stream_read(global->stream, var, len);
235 local->nb -= len;
236
237 flags = g3d_stream_read_int8(global->stream);
238 local->nb -= 1;
239
240 val = g_new0(gdouble, 3);
241 val[0] = g3d_stream_read_double_be(global->stream);
242 val[1] = g3d_stream_read_double_be(global->stream);
243 val[2] = g3d_stream_read_double_be(global->stream);
244 local->nb -= 24;
245
246 g_debug("\\%s[Maya][DBL3] %s = (%g,%g,%g) (0x%02X)",
247 padding + (strlen(padding) - local->level),
248 var, val[0], val[1], val[2], flags);
249
250 if(local->object)
251 maya_var_set((MayaObject *)local->object, var, val);
252 else
253 g_free(val);
254
255 g_free(var);
256
257 return TRUE;
258}
259
260/* double */
261gboolean maya_cb_DBLE(G3DIffGlobal *global, G3DIffLocal *local)
262{
263 gint32 len, flags;
264 gdouble val;
265 gchar *var;
266 gchar *padding = " ";
267
268 len = local->nb - 9;
269 if(len <= 0)
270 {
271 g_warning("[Maya][DBLE] length of chunk: %d", local->nb);
272 return FALSE;
273 }
274
275 var = g_malloc(len);
276 g3d_stream_read(global->stream, var, len);
277 local->nb -= len;
278
279 flags = g3d_stream_read_int8(global->stream);
280 local->nb -= 1;
281
282 val = g3d_stream_read_double_be(global->stream);
283 local->nb -= 8;
284
285 g_debug("\\%s[Maya][DBLE] %s = %g (0x%02X)",
286 padding + (strlen(padding) - local->level),
287 var, val, flags);
288
289 if(local->object)
290 maya_var_set_double((MayaObject *)local->object, var, val);
291
292 g_free(var);
293
294 return TRUE;
295}
296
297/* mesh object */
298gboolean maya_cb_DMSH(G3DIffGlobal *global, G3DIffLocal *local)
299{
300 MayaObject *obj;
301 G3DObject *object, *parent;
302 G3DMaterial *material;
303
304 if(local->finalize)
305 {
306 obj = (MayaObject *)local->object;
307
308 object = (G3DObject *)obj->user_data;
309 object->name = obj->name ? g_strdup(obj->name) : "(unnamed mesh)";
310
311 if(obj->parent)
312 {
313 parent = g3d_model_get_object_by_name(global->model, obj->parent);
314 if(parent)
315 object->transformation = parent->transformation;
316 }
317
318 maya_obj_add_to_tree(obj, global->model, object);
319 maya_obj_free(obj);
320 }
321 else
322 {
323 obj = maya_obj_new();
324 local->object = obj;
325
326 material = g3d_material_new();
327 material->name = g_strdup("(default material)");
328
329 object = g_new0(G3DObject, 1);
330 object->materials = g_slist_append(object->materials, material);
331
332 obj->user_data = object;
333 }
334
335 return TRUE;
336}
337
338/* float 3 */
339gboolean maya_cb_FLT3(G3DIffGlobal *global, G3DIffLocal *local)
340{
341 gint32 len, flags;
342 G3DFloat *val;
343 gchar *var;
344 gchar *padding = " ";
345
346 len = local->nb - 13;
347 var = g_malloc(len);
348 g3d_stream_read(global->stream, var, len);
349 local->nb -= len;
350
351 flags = g3d_stream_read_int8(global->stream);
352 local->nb -= 1;
353
354 val = g_new0(G3DFloat, 3);
355 val[0] = g3d_stream_read_float_be(global->stream);
356 val[1] = g3d_stream_read_float_be(global->stream);
357 val[2] = g3d_stream_read_float_be(global->stream);
358 local->nb -= 12;
359
360 g_debug("\\%s[Maya][DBL3] %s = (%g; %g; %g) (0x%02X)",
361 padding + (strlen(padding) - local->level),
362 var, val[0], val[1], val[2], flags);
363
364 if(local->object)
365 maya_var_set((MayaObject *)local->object, var, val);
366 else
367 g_free(val);
368
369 g_free(var);
370
371 return TRUE;
372}
373
374/* matrix */
375gboolean maya_cb_MATR(G3DIffGlobal *global, G3DIffLocal *local)
376{
377 gint32 flags, i;
378 G3DFloat *val;
379 gchar *var;
380 gchar *padding = " ";
381
382 if(local->nb <= 129)
383 {
384 g_warning("[Maya][MATR] matrix size: %d", local->nb);
385 return FALSE;
386 }
387
388 /* var */
389 var = g_new0(gchar, local->nb - 129);
390 g3d_stream_read(global->stream, var, local->nb - 129);
391 local->nb -= (local->nb - 129);
392
393 /* flags ? */
394 flags = g3d_stream_read_int8(global->stream);
395 local->nb -= 1;
396
397 val = g_new0(G3DFloat, 16);
398
399 for(i = 0; i < 16; i ++)
400 {
401 val[i] = (G3DFloat)g3d_stream_read_double_be(global->stream);
402 local->nb -= 8;
403 }
404
405 g_debug("\\%s[Maya][MATR] %s = \n"
406 "%f %f %f %f\n"
407 "%f %f %f %f\n"
408 "%f %f %f %f\n"
409 "%f %f %f %f",
410 padding + (strlen(padding) - local->level),
411 var,
412 val[0 * 4 + 0], val[1 * 4 + 0], val[2 * 4 + 0], val[3 * 4 + 0],
413 val[0 * 4 + 1], val[1 * 4 + 1], val[2 * 4 + 1], val[3 * 4 + 1],
414 val[0 * 4 + 2], val[1 * 4 + 2], val[2 * 4 + 2], val[3 * 4 + 2],
415 val[0 * 4 + 3], val[1 * 4 + 3], val[2 * 4 + 3], val[3 * 4 + 3]);
416
417 if(local->object)
418 maya_var_set((MayaObject *)local->object, var, val);
419 else
420 g_free(val);
421
422 g_free(var);
423
424 return TRUE;
425}
426
427/* mesh */
428gboolean maya_cb_MESH(G3DIffGlobal *global, G3DIffLocal *local)
429{
430 G3DObject *object;
431 G3DMaterial *material;
432 G3DFace *face;
433 gint32 x1, x2, x3, x4, i, i1, i2;
434
435 x1 = g3d_stream_read_int16_be(global->stream);
436 x2 = g3d_stream_read_int16_be(global->stream);
437 x3 = g3d_stream_read_int16_be(global->stream);
438 x4 = g3d_stream_read_int16_be(global->stream);
439 local->nb -= 8;
440
441 object = (G3DObject *)((MayaObject *)local->object)->user_data;
442 material = (G3DMaterial *)g_slist_nth_data(object->materials, 0);
443
444 if(x1 == 0x6369)
445 {
446 object->vertex_count = x4 / 3;
447 object->vertex_data = g_new0(G3DFloat, object->vertex_count * 3);
448
449 for(i = 0; i < object->vertex_count; i ++)
450 {
451 object->vertex_data[i * 3 + 0] = g3d_stream_read_float_be(global->stream);
452 object->vertex_data[i * 3 + 1] = g3d_stream_read_float_be(global->stream);
453 object->vertex_data[i * 3 + 2] = g3d_stream_read_float_be(global->stream);
454 local->nb -= 12;
455 }
456
457 x3 = g3d_stream_read_int16_be(global->stream);
458 x4 = g3d_stream_read_int16_be(global->stream);
459 local->nb -= 4;
460#if 0
461 g_debug("[Maya][MESH] %d %d", x3, x4);
462#endif
463 i1 = -1;
464 i2 = -1;
465 for(i = 0; i < x4 / 2; i ++)
466 {
467 if(i1 == -1)
468 {
469 i1 = g3d_stream_read_int32_be(global->stream) & 0xFFFFFF;
470 i2 = g3d_stream_read_int32_be(global->stream) & 0xFFFFFF;
471 local->nb -= 8;
472 }
473 else
474 {
475 face = g_new0(G3DFace, 1);
476 face->vertex_count = 4;
477 face->vertex_indices = g_new0(guint32, 4);
478 face->vertex_indices[0] = i1;
479 face->vertex_indices[1] = i2;
480 face->vertex_indices[2] =
481 g3d_stream_read_int32_be(global->stream) & 0xFFFFFF;
482 face->vertex_indices[3] =
483 g3d_stream_read_int32_be(global->stream) & 0xFFFFFF;
484 face->material = material;
485 local->nb -= 8;
486 i1 = face->vertex_indices[3];
487 i2 = face->vertex_indices[2];
488
489 object->faces = g_slist_append(object->faces, face);
490 }
491 }
492
493 x3 = g3d_stream_read_int16_be(global->stream);
494 x4 = g3d_stream_read_int16_be(global->stream);
495 local->nb -= 4;
496 }
497 return TRUE;
498}
499
500/* poly cube */
501gboolean maya_cb_PCUB(G3DIffGlobal *global, G3DIffLocal *local)
502{
503 MayaObject *obj;
504 G3DObject *object;
505 G3DMaterial *material;
506 gdouble w, h, d;
507
508 if(local->finalize)
509 {
510 obj = (MayaObject *)local->object;
511 g_return_val_if_fail(obj != NULL, FALSE);
512
513 w = maya_var_get_double(obj, "w", 1.0);
514 h = maya_var_get_double(obj, "h", 1.0);
515 d = maya_var_get_double(obj, "d", 1.0);
516
517 material = g3d_material_new();
518 object = g3d_primitive_box(w, h, d, material);
519 object->name = obj->name ? g_strdup(obj->name) :
520 g_strdup("(unnamed cube)");
521
522 object->materials = g_slist_append(object->materials, material);
523 maya_obj_add_to_tree(obj, global->model, object);
524
525 /* destroy object */
526 maya_obj_free(obj);
527 }
528 else
529 {
530 /* create object */
531 obj = maya_obj_new();
532 local->object = obj;
533 }
534
535 return TRUE;
536}
537
538/* cylinder */
539gboolean maya_cb_PCYL(G3DIffGlobal *global, G3DIffLocal *local)
540{
541 MayaObject *obj;
542 G3DObject *object;
543 G3DMaterial *material;
544 gdouble h, r;
545 guint32 s;
546
547 if(local->finalize) {
548 obj = (MayaObject *)local->object;
549 g_return_val_if_fail(obj != NULL, FALSE);
550
551 h = maya_var_get_double(obj, "h", 1.0);
552 r = maya_var_get_double(obj, "r", 0.5);
553 s = MAX(3, (guint32)maya_var_get_double(obj, "sx", 20));
554
555 material = g3d_material_new();
556 object = g3d_primitive_cylinder(r, h, s, TRUE, TRUE, material);
557 if(object) {
558 object->name = obj->name ? g_strdup(obj->name) :
559 g_strdup("(unnamed cylinder)");
560
561 object->materials = g_slist_append(object->materials, material);
562 maya_obj_add_to_tree(obj, global->model, object);
563 }
564 /* destroy object */
565 maya_obj_free(obj);
566 } else {
567 /* create object */
568 obj = maya_obj_new();
569 local->object = obj;
570 }
571 return TRUE;
572}
573
574/* string */
575gboolean maya_cb_STR_(G3DIffGlobal *global, G3DIffLocal *local)
576{
577 gchar *buffer, *var;
578 gchar *padding = " ";
579
580 /* variable */
581 buffer = g_malloc(local->nb);
582 local->nb -= g3d_stream_read_cstr(global->stream, buffer, local->nb);
583 var = g_strdup(buffer);
584
585 /* value */
586 local->nb -= g3d_stream_read_cstr(global->stream, buffer, local->nb);
587
588 g_debug("\\%s[Maya][STR ] %s = '%.*s' (%d characters)",
589 padding + (strlen(padding) - local->level),
590 var, 40, buffer, (int) strlen(buffer));
591
592 if(local->object)
593 maya_var_set((MayaObject *)local->object, var, g_strdup(buffer));
594
595 g_free(buffer);
596 g_free(var);
597
598 return TRUE;
599}
600
601/* transformation */
602gboolean maya_cb_XFRM(G3DIffGlobal *global, G3DIffLocal *local)
603{
604 MayaObject *obj;
605 G3DObject *object;
606 G3DTransformation *tf;
607 gdouble *val;
608
609 if(local->finalize)
610 {
611 obj = (MayaObject *)local->object;
612
613 object = maya_obj_to_g3d(obj);
614
615 tf = g_new0(G3DTransformation, 1);
616 g3d_matrix_identity(tf->matrix);
617
618 val = maya_var_get(obj, "t");
619 if(val)
620 g3d_matrix_translate(val[0], val[1], val[2], tf->matrix);
621
622 val = maya_var_get(obj, "r");
623 if(val)
624 g3d_matrix_rotate_xyz(val[0], val[1], val[2], tf->matrix);
625
626 val = maya_var_get(obj, "s");
627 if(val)
628 g3d_matrix_scale(val[0], val[1], val[2], tf->matrix);
629
630 /* g3d_matrix_dump(tf->matrix); */
631
632 object->transformation = tf;
633
634 maya_obj_add_to_tree(obj, global->model, object);
635
636 maya_obj_free(obj);
637 }
638 else
639 {
640 obj = maya_obj_new();
641 local->object = obj;
642 }
643
644 return TRUE;
645}