diff options
Diffstat (limited to '')
-rw-r--r-- | src/others/mimesh/libg3d-0.0.8/plugins/import/imp_blend/imp_blend_callbacks.c | 237 |
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 */ | ||
33 | gboolean 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 */ | ||
87 | gboolean 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 | |||
103 | static 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 | |||
121 | static 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 */ | ||
131 | gboolean 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 */ | ||
152 | gboolean 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 | |||
219 | gboolean 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 | |||