diff options
Diffstat (limited to '')
-rw-r--r-- | src/others/mimesh/libg3d-0.0.8/plugins/import/imp_maya/imp_maya_callbacks.c | 645 |
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? */ | ||
36 | gboolean 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 */ | ||
82 | gboolean 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 | |||
123 | gboolean 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 # */ | ||
152 | gboolean 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 */ | ||
190 | gboolean 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 */ | ||
225 | gboolean 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 */ | ||
261 | gboolean 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 */ | ||
298 | gboolean 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 */ | ||
339 | gboolean 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 */ | ||
375 | gboolean 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 */ | ||
428 | gboolean 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 */ | ||
501 | gboolean 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 */ | ||
539 | gboolean 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 */ | ||
575 | gboolean 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 */ | ||
602 | gboolean 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 | } | ||