aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_blend/imp_blend_callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/others/mimesh/libg3d-0.0.8/plugins/import/imp_blend/imp_blend_callbacks.c')
-rw-r--r--src/others/mimesh/libg3d-0.0.8/plugins/import/imp_blend/imp_blend_callbacks.c237
1 files changed, 237 insertions, 0 deletions
diff --git a/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_blend/imp_blend_callbacks.c b/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_blend/imp_blend_callbacks.c
new file mode 100644
index 0000000..f5e7b95
--- /dev/null
+++ b/src/others/mimesh/libg3d-0.0.8/plugins/import/imp_blend/imp_blend_callbacks.c
@@ -0,0 +1,237 @@
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/vector.h>
25#include <g3d/matrix.h>
26#include <g3d/material.h>
27
28#include "imp_blend_types.h"
29#include "imp_blend_def.h"
30#include "imp_blend_sdna.h"
31
32/* mesh data */
33gboolean blend_cb_DATA_ME(BlendGlobal *global, BlendLocal *local)
34{
35 G3DFace *face;
36 BlendSdnaPropData *spdata;
37 gchar *stmp;
38 gint32 i, j;
39
40 if((local->ndata == 0) || (local->data[0] == NULL))
41 return TRUE;
42 g_return_val_if_fail(local->object != NULL, FALSE);
43
44 /* all structs in one DATA chunk have the same type */
45 if(strcmp(local->data[0]->sstruct->name, "MVert") == 0) {
46 local->object->vertex_count = local->ndata;
47 local->object->vertex_data = g3d_vector_new(3,
48 local->object->vertex_count);
49 for(i = 0; i < local->ndata; i ++) {
50 spdata = blend_sdna_get_property(local->data[i], "co", T_FLOAT);
51 if(spdata)
52 for(j = 0; j < 3; j ++)
53 local->object->vertex_data[i * 3 + j] = spdata->fval[j];
54 }
55 } else if(strcmp(local->data[0]->sstruct->name, "MFace") == 0) {
56 for(i = 0; i < local->ndata; i ++) {
57 face = g_new0(G3DFace, 1);
58 face->vertex_count = 4;
59 face->vertex_indices = g_new0(guint32, 4);
60 face->material = g_slist_nth_data(local->object->materials, 0);
61 local->object->faces = g_slist_prepend(local->object->faces, face);
62 for(j = 0; j < 4; j ++) {
63 stmp = g_strdup_printf("v%d", j);
64 spdata = blend_sdna_get_property(local->data[i], stmp, T_INT);
65 if(spdata)
66 face->vertex_indices[j] = spdata->ival[0];
67 g_free(stmp);
68 }
69#if DEBUG > 2
70 g_debug("MFace: %03i (%02i, %02i, %02i, %02i)", i,
71 face->vertex_indices[0], face->vertex_indices[1],
72 face->vertex_indices[2], face->vertex_indices[3]);
73#endif
74 spdata = blend_sdna_get_property(local->data[i], "mat_nr", T_CHAR);
75 /* TODO */
76 }
77 } else {
78#if DEBUG > 0
79 for(i = 0; i < local->ndata; i ++)
80 blend_sdna_dump_data(local->data[i], 0);
81#endif
82 }
83 return TRUE;
84}
85
86/* struct DNA */
87gboolean blend_cb_DNA1(BlendGlobal *global, BlendLocal *local)
88{
89 if(global->sdna != NULL)
90 return TRUE;
91 global->sdna = blend_sdna_read_dna1(global->stream,
92 global->flags, local->len);
93 if(global->sdna == NULL) {
94 g_warning("Blend: failed to read DNA1, giving up...");
95 return FALSE;
96 }
97 /* rewind stream to really read content */
98 g3d_stream_seek(global->stream, BLEND_HEADER_SIZE, G_SEEK_SET);
99 local->len = 0;
100 return TRUE;
101}
102
103static gchar *get_name_from_id(BlendSdnaData *sdata)
104{
105 BlendSdnaPropData *spdata, *spdata2;
106 gchar *name = NULL;
107 gint32 i;
108
109 spdata = blend_sdna_get_property(sdata, "id", T_STRUCT);
110 if(spdata) {
111 spdata2 = blend_sdna_get_property(spdata->structval, "name", T_CHAR);
112 if(spdata2) {
113 name = g_new0(gchar, spdata2->sprop->nitems + 1);
114 for(i = 0; i < spdata2->sprop->nitems; i ++)
115 name[i] = spdata2->ival[i];
116 }
117 }
118 return name;
119}
120
121static G3DFloat get_float(BlendSdnaData *sdata, const gchar *var)
122{
123 BlendSdnaPropData *spdata;
124 spdata = blend_sdna_get_property(sdata, var, T_FLOAT);
125 if(spdata)
126 return spdata->fval[0];
127 return 0.0;
128}
129
130/* material */
131gboolean blend_cb_MA(BlendGlobal *global, BlendLocal *local)
132{
133 G3DMaterial *material;
134
135 g_return_val_if_fail(local->data[0] != NULL, FALSE);
136
137#if DEBUG > 0
138 blend_sdna_dump_data(local->data[0], 0);
139#endif
140
141 material = g3d_material_new();
142 material->name = get_name_from_id(local->data[0]);
143 global->model->materials = g_slist_append(global->model->materials,
144 material);
145 material->r = get_float(local->data[0], "r");
146 material->g = get_float(local->data[0], "g");
147 material->b = get_float(local->data[0], "b");
148 return TRUE;
149}
150
151/* mesh */
152gboolean blend_cb_ME(BlendGlobal *global, BlendLocal *local)
153{
154 G3DObject *object;
155 G3DMaterial *material;
156 G3DVector v[3];
157 BlendSdnaPropData *spdata;
158 gint32 i;
159
160 g_return_val_if_fail(local->data[0] != NULL, FALSE);
161
162#if DEBUG > 0
163 blend_sdna_dump_data(local->data[0], 0);
164#endif
165
166 object = g_new0(G3DObject, 1);
167 if(local->grpobject)
168 local->grpobject->objects = g_slist_append(local->grpobject->objects,
169 object);
170 else
171 global->model->objects = g_slist_append(global->model->objects,
172 object);
173 local->object = object;
174 material = g3d_material_new();
175 material->name = g_strdup("(default material)");
176 object->materials = g_slist_append(local->object->materials, material);
177
178 /* name */
179 object->name = get_name_from_id(local->data[0]);
180
181 object->transformation = g_new0(G3DTransformation, 1);
182 g3d_matrix_identity(object->transformation->matrix);
183
184 /* rotation */
185 spdata = blend_sdna_get_property(local->data[0], "rot", T_FLOAT);
186 if(spdata) {
187 for(i = 0; i < 3; i ++)
188 v[i] = spdata->fval[i];
189 g3d_matrix_rotate_xyz(v[0], v[1], v[2],
190 object->transformation->matrix);
191#if DEBUG > 0
192 g_debug("ME: rotate %f, %f, %f", v[0], v[1], v[2]);
193#endif
194 }
195 /* size */
196 spdata = blend_sdna_get_property(local->data[0], "size", T_FLOAT);
197 if(spdata) {
198 for(i = 0; i < 3; i ++)
199 v[i] = spdata->fval[i];
200 g3d_matrix_scale(v[0], v[1], v[2], object->transformation->matrix);
201#if DEBUG > 2
202 g_debug("ME: scale %f, %f, %f", v[0], v[1], v[2]);
203#endif
204 }
205 /* location */
206 spdata = blend_sdna_get_property(local->data[0], "loc", T_FLOAT);
207 if(spdata) {
208 for(i = 0; i < 3; i ++)
209 v[i] = spdata->fval[i];
210 g3d_matrix_translate(v[0], v[1], v[2],
211 object->transformation->matrix);
212#if DEBUG > 2
213 g_debug("ME: translate %f, %f, %f", v[0], v[1], v[2]);
214#endif
215 }
216 return TRUE;
217}
218
219gboolean blend_cb_OB(BlendGlobal *global, BlendLocal *local)
220{
221 G3DObject *object;
222
223 g_return_val_if_fail(local->data[0] != NULL, FALSE);
224
225#if DEBUG > 0
226 blend_sdna_dump_data(local->data[0], 0);
227#endif
228
229 object = g_new0(G3DObject, 1);
230 object->name = get_name_from_id(local->data[0]);
231 local->grpobject = object;
232 global->model->objects = g_slist_append(global->model->objects, object);
233
234 return TRUE;
235}
236
237