/src/gpac/src/scenegraph/vrml_tools.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * GPAC - Multimedia Framework C SDK |
3 | | * |
4 | | * Authors: Jean Le Feuvre |
5 | | * Copyright (c) Telecom ParisTech 2000-2012 |
6 | | * All rights reserved |
7 | | * |
8 | | * This file is part of GPAC / Scene Graph sub-project |
9 | | * |
10 | | * GPAC is free software; you can redistribute it and/or modify |
11 | | * it under the terms of the GNU Lesser General Public License as published by |
12 | | * the Free Software Foundation; either version 2, or (at your option) |
13 | | * any later version. |
14 | | * |
15 | | * GPAC is distributed in the hope that it will be useful, |
16 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | | * GNU Lesser General Public License for more details. |
19 | | * |
20 | | * You should have received a copy of the GNU Lesser General Public |
21 | | * License along with this library; see the file COPYING. If not, write to |
22 | | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
23 | | * |
24 | | */ |
25 | | |
26 | | #include <gpac/internal/scenegraph_dev.h> |
27 | | |
28 | | /*MPEG4 & X3D tags (for node tables & script handling)*/ |
29 | | #include <gpac/nodes_mpeg4.h> |
30 | | #include <gpac/nodes_x3d.h> |
31 | | |
32 | | |
33 | | #ifndef GPAC_DISABLE_VRML |
34 | | #include <gpac/internal/bifs_dev.h> |
35 | | |
36 | | |
37 | | GF_EXPORT |
38 | | Bool gf_node_in_table_by_tag(u32 tag, u32 NDTType) |
39 | 0 | { |
40 | 0 | if (!tag) return 0; |
41 | 0 | if (tag==TAG_ProtoNode) return 1; |
42 | 0 | else if (tag<=GF_NODE_RANGE_LAST_MPEG4) { |
43 | 0 | #ifndef GPAC_DISABLE_BIFS |
44 | 0 | u32 i; |
45 | 0 | for (i=0; i<GF_BIFS_LAST_VERSION; i++) { |
46 | 0 | if (gf_bifs_get_node_type(NDTType, tag, i+1)) return 1; |
47 | 0 | } |
48 | 0 | return 0; |
49 | | #else |
50 | | /*if BIFS is disabled, we don't have the NDTs - we therefore allow any node in any table otherwise we would reject |
51 | | them all*/ |
52 | | return 1; |
53 | | #endif |
54 | |
|
55 | 0 | } |
56 | 0 | #ifndef GPAC_DISABLE_X3D |
57 | 0 | else if (tag<=GF_NODE_RANGE_LAST_X3D) { |
58 | 0 | return gf_x3d_get_node_type(NDTType, tag); |
59 | 0 | } |
60 | 0 | #endif |
61 | 0 | return 0; |
62 | 0 | } |
63 | | |
64 | | |
65 | | static void Node_on_add_children(GF_Node *node, GF_Route *route) |
66 | 0 | { |
67 | 0 | GF_ChildNodeItem *list; |
68 | 0 | GF_FieldInfo field; |
69 | 0 | GF_VRMLParent *n = (GF_VRMLParent *)node; |
70 | |
|
71 | 0 | if (n->children) { |
72 | 0 | list = n->children; |
73 | 0 | while (list->next) list = list->next; |
74 | 0 | list->next = n->addChildren; |
75 | 0 | } else { |
76 | 0 | n->children = n->addChildren; |
77 | 0 | } |
78 | 0 | n->addChildren = NULL; |
79 | | |
80 | | /*signal children field is modified*/ |
81 | 0 | field.name = "children"; |
82 | 0 | field.eventType = GF_SG_EVENT_EXPOSED_FIELD; |
83 | 0 | field.fieldType = GF_SG_VRML_MFNODE; |
84 | 0 | field.NDTtype = -1; |
85 | 0 | if ( node->sgprivate->tag == TAG_MPEG4_Transform ) |
86 | 0 | field.fieldIndex = 3; |
87 | 0 | else |
88 | 0 | field.fieldIndex = 2; |
89 | 0 | field.far_ptr = & n->children; |
90 | 0 | gf_node_event_out(node, field.fieldIndex); |
91 | 0 | gf_node_changed(node, &field); |
92 | |
|
93 | 0 | if (node->sgprivate->scenegraph->on_node_modified) { |
94 | 0 | field.name = "addChildren"; |
95 | 0 | field.eventType = GF_SG_EVENT_IN; |
96 | 0 | field.fieldType = GF_SG_VRML_MFNODE; |
97 | 0 | field.NDTtype = -1; |
98 | 0 | field.fieldIndex = 0; |
99 | 0 | field.far_ptr = & n->addChildren; |
100 | 0 | node->sgprivate->scenegraph->on_node_modified(node->sgprivate->scenegraph, node, &field, NULL); |
101 | 0 | } |
102 | 0 | } |
103 | | |
104 | | static void Node_on_remove_children(GF_Node *node, GF_Route *route) |
105 | 0 | { |
106 | 0 | GF_ChildNodeItem *list; |
107 | 0 | GF_FieldInfo field; |
108 | 0 | GF_VRMLParent *n = (GF_VRMLParent *)node; |
109 | |
|
110 | 0 | if (!n->removeChildren) return; |
111 | | |
112 | 0 | list = n->removeChildren; |
113 | 0 | while (list) { |
114 | 0 | if (gf_node_list_del_child(& n->children, list->node)) { |
115 | 0 | gf_node_unregister(list->node, node); |
116 | 0 | } |
117 | 0 | list = list->next; |
118 | 0 | } |
119 | 0 | gf_node_unregister_children(node, n->removeChildren); |
120 | 0 | n->removeChildren = NULL; |
121 | | |
122 | | /*signal children field is modified*/ |
123 | 0 | field.name = "children"; |
124 | 0 | field.eventType = GF_SG_EVENT_EXPOSED_FIELD; |
125 | 0 | field.fieldType = GF_SG_VRML_MFNODE; |
126 | 0 | field.NDTtype = -1; |
127 | 0 | if ( node->sgprivate->tag == TAG_MPEG4_Transform ) |
128 | 0 | field.fieldIndex = 3; |
129 | 0 | else |
130 | 0 | field.fieldIndex = 2; |
131 | 0 | field.far_ptr = & n->children; |
132 | 0 | gf_node_event_out(node, field.fieldIndex); |
133 | 0 | gf_node_changed(node, &field); |
134 | | |
135 | |
|
136 | 0 | if (node->sgprivate->scenegraph->on_node_modified) { |
137 | 0 | field.name = "removeChildren"; |
138 | 0 | field.eventType = GF_SG_EVENT_IN; |
139 | 0 | field.fieldType = GF_SG_VRML_MFNODE; |
140 | 0 | field.NDTtype = -1; |
141 | 0 | field.fieldIndex = 1; |
142 | 0 | field.far_ptr = & n->removeChildren; |
143 | 0 | node->sgprivate->scenegraph->on_node_modified(node->sgprivate->scenegraph, node, &field, NULL); |
144 | 0 | } |
145 | 0 | } |
146 | | |
147 | | void gf_sg_vrml_parent_setup(GF_Node *pNode) |
148 | 0 | { |
149 | 0 | GF_VRMLParent *par = (GF_VRMLParent *)pNode; |
150 | 0 | par->children = NULL; |
151 | 0 | par->addChildren = NULL; |
152 | 0 | par->on_addChildren = Node_on_add_children; |
153 | 0 | par->removeChildren = NULL; |
154 | 0 | par->on_removeChildren = Node_on_remove_children; |
155 | 0 | pNode->sgprivate->flags |= GF_SG_CHILD_DIRTY; |
156 | 0 | } |
157 | | |
158 | | void gf_sg_vrml_parent_destroy(GF_Node *pNode) |
159 | 0 | { |
160 | 0 | GF_VRMLParent *par = (GF_VRMLParent *)pNode; |
161 | 0 | gf_node_unregister_children(pNode, par->children); |
162 | 0 | gf_node_unregister_children(pNode, par->addChildren); |
163 | 0 | gf_node_unregister_children(pNode, par->removeChildren); |
164 | 0 | } |
165 | | |
166 | | GF_EXPORT |
167 | | GF_Err gf_sg_delete_all_protos(GF_SceneGraph *scene) |
168 | 0 | { |
169 | 0 | if (!scene) return GF_BAD_PARAM; |
170 | 0 | while (gf_list_count(scene->protos)) { |
171 | 0 | GF_Proto *p = (GF_Proto *)gf_list_get(scene->protos, 0); |
172 | 0 | gf_sg_proto_del(p); |
173 | 0 | } |
174 | 0 | return GF_OK; |
175 | 0 | } |
176 | | |
177 | | GF_EXPORT |
178 | | void gf_sg_set_proto_loader(GF_SceneGraph *scene, GF_SceneGraph *(*GetExternProtoLib)(void *SceneCallback, MFURL *lib_url)) |
179 | 0 | { |
180 | 0 | if (!scene) return; |
181 | 0 | scene->GetExternProtoLib = GetExternProtoLib; |
182 | 0 | } |
183 | | |
184 | | GF_EXPORT |
185 | | u32 gf_sg_get_next_available_route_id(GF_SceneGraph *sg) |
186 | 0 | { |
187 | 0 | u32 i, count; |
188 | 0 | u32 ID = 0; |
189 | |
|
190 | 0 | if (!sg->max_defined_route_id) { |
191 | 0 | count = gf_list_count(sg->Routes); |
192 | | /*routes are not sorted*/ |
193 | 0 | for (i=0; i<count; i++) { |
194 | 0 | GF_Route *r = (GF_Route *)gf_list_get(sg->Routes, i); |
195 | 0 | if (ID<=r->ID) ID = r->ID; |
196 | 0 | } |
197 | 0 | return ID+1; |
198 | 0 | } else { |
199 | 0 | sg->max_defined_route_id++; |
200 | 0 | return sg->max_defined_route_id; |
201 | 0 | } |
202 | 0 | } |
203 | | |
204 | | GF_EXPORT |
205 | | void gf_sg_set_max_defined_route_id(GF_SceneGraph *sg, u32 ID) |
206 | 0 | { |
207 | 0 | sg->max_defined_route_id = MAX(sg->max_defined_route_id, ID); |
208 | 0 | } |
209 | | |
210 | | GF_EXPORT |
211 | | u32 gf_sg_get_next_available_proto_id(GF_SceneGraph *sg) |
212 | 0 | { |
213 | 0 | u32 i, count; |
214 | 0 | u32 ID = 0; |
215 | 0 | count = gf_list_count(sg->protos); |
216 | | /*protos are not sorted*/ |
217 | 0 | for (i=0; i<count; i++) { |
218 | 0 | GF_Proto *p = (GF_Proto *)gf_list_get(sg->protos, i); |
219 | 0 | if (ID<=p->ID) ID = p->ID; |
220 | 0 | } |
221 | 0 | count = gf_list_count(sg->unregistered_protos); |
222 | 0 | for (i=0; i<count; i++) { |
223 | 0 | GF_Proto *p = (GF_Proto *)gf_list_get(sg->unregistered_protos, i); |
224 | 0 | if (ID<=p->ID) ID = p->ID; |
225 | 0 | } |
226 | 0 | return ID+1; |
227 | 0 | } |
228 | | |
229 | | //adds a child in the children list |
230 | | GF_EXPORT |
231 | | GF_Err gf_node_insert_child(GF_Node *parent, GF_Node *new_child, s32 Position) |
232 | 0 | { |
233 | 0 | GF_ParentNode *node = (GF_ParentNode *) parent; |
234 | 0 | if (Position == -1) { |
235 | 0 | gf_node_list_add_child(& node->children, new_child); |
236 | 0 | } else { |
237 | 0 | gf_node_list_insert_child(& node->children, new_child, Position); |
238 | 0 | } |
239 | 0 | return GF_OK; |
240 | 0 | } |
241 | | |
242 | | #if 0 |
243 | | GF_Err gf_node_remove_child(GF_Node *parent, GF_Node *toremove_child) |
244 | | { |
245 | | if (!gf_node_list_del_child(& ((GF_ParentNode *) parent)->children, toremove_child)) return GF_BAD_PARAM; |
246 | | /*V4Studio doesn't handle DEF/USE properly yet...*/ |
247 | | /*gf_node_unregister(toremove_child, parent);*/ |
248 | | return GF_OK; |
249 | | } |
250 | | #endif |
251 | | |
252 | | GF_EXPORT |
253 | | void gf_sg_script_load(GF_Node *n) |
254 | 0 | { |
255 | 0 | if (n && n->sgprivate->scenegraph->script_load) n->sgprivate->scenegraph->script_load(n); |
256 | 0 | } |
257 | | |
258 | | GF_EXPORT |
259 | | GF_Proto *gf_sg_find_proto(GF_SceneGraph *sg, u32 ProtoID, char *name) |
260 | 0 | { |
261 | 0 | GF_Proto *proto; |
262 | 0 | u32 i; |
263 | |
|
264 | 0 | assert(sg); |
265 | | |
266 | | /*browse all top-level */ |
267 | 0 | i=0; |
268 | 0 | while ((proto = (GF_Proto *)gf_list_enum(sg->protos, &i))) { |
269 | | /*first check on name if given, since parsers use this with ID=0*/ |
270 | 0 | if (name) { |
271 | 0 | if (proto->Name && !stricmp(name, proto->Name)) return proto; |
272 | 0 | } else if (proto->ID == ProtoID) return proto; |
273 | 0 | } |
274 | | /*browse all top-level unregistered in reverse order*/ |
275 | 0 | for (i=gf_list_count(sg->unregistered_protos); i>0; i--) { |
276 | 0 | proto = (GF_Proto *)gf_list_get(sg->unregistered_protos, i-1); |
277 | 0 | if (name) { |
278 | 0 | if (proto->Name && !stricmp(name, proto->Name)) return proto; |
279 | 0 | } else if (proto->ID == ProtoID) return proto; |
280 | 0 | } |
281 | 0 | return NULL; |
282 | 0 | } |
283 | | |
284 | | |
285 | | |
286 | | static SFBool *NewSFBool() |
287 | 0 | { |
288 | 0 | SFBool *tmp = (SFBool *)gf_malloc(sizeof(SFBool)); |
289 | 0 | memset(tmp, 0, sizeof(SFBool)); |
290 | 0 | return tmp; |
291 | 0 | } |
292 | | static SFFloat *NewSFFloat() |
293 | 0 | { |
294 | 0 | SFFloat *tmp = (SFFloat *)gf_malloc(sizeof(SFFloat)); |
295 | 0 | memset(tmp, 0, sizeof(SFFloat)); |
296 | 0 | return tmp; |
297 | 0 | } |
298 | | static SFDouble *NewSFDouble() |
299 | 0 | { |
300 | 0 | SFDouble *tmp = (SFDouble *)gf_malloc(sizeof(SFDouble)); |
301 | 0 | memset(tmp, 0, sizeof(SFDouble)); |
302 | 0 | return tmp; |
303 | 0 | } |
304 | | static SFTime *NewSFTime() |
305 | 0 | { |
306 | 0 | SFTime *tmp = (SFTime *)gf_malloc(sizeof(SFTime)); |
307 | 0 | memset(tmp, 0, sizeof(SFTime)); |
308 | 0 | return tmp; |
309 | 0 | } |
310 | | static SFInt32 *NewSFInt32() |
311 | 0 | { |
312 | 0 | SFInt32 *tmp = (SFInt32 *)gf_malloc(sizeof(SFInt32)); |
313 | 0 | memset(tmp, 0, sizeof(SFInt32)); |
314 | 0 | return tmp; |
315 | 0 | } |
316 | | static SFString *NewSFString() |
317 | 0 | { |
318 | 0 | SFString *tmp = (SFString *)gf_malloc(sizeof(SFString)); |
319 | 0 | memset(tmp, 0, sizeof(SFString)); |
320 | 0 | return tmp; |
321 | 0 | } |
322 | | static SFVec3f *NewSFVec3f() |
323 | 0 | { |
324 | 0 | SFVec3f *tmp = (SFVec3f *)gf_malloc(sizeof(SFVec3f)); |
325 | 0 | memset(tmp, 0, sizeof(SFVec3f)); |
326 | 0 | return tmp; |
327 | 0 | } |
328 | | static SFVec3d *NewSFVec3d() |
329 | 0 | { |
330 | 0 | SFVec3d *tmp = (SFVec3d *)gf_malloc(sizeof(SFVec3d)); |
331 | 0 | memset(tmp, 0, sizeof(SFVec3d)); |
332 | 0 | return tmp; |
333 | 0 | } |
334 | | static SFVec2f *NewSFVec2f() |
335 | 0 | { |
336 | 0 | SFVec2f *tmp = (SFVec2f *)gf_malloc(sizeof(SFVec2f)); |
337 | 0 | memset(tmp, 0, sizeof(SFVec2f)); |
338 | 0 | return tmp; |
339 | 0 | } |
340 | | static SFVec2d *NewSFVec2d() |
341 | 0 | { |
342 | 0 | SFVec2d *tmp = (SFVec2d *)gf_malloc(sizeof(SFVec2d)); |
343 | 0 | memset(tmp, 0, sizeof(SFVec2d)); |
344 | 0 | return tmp; |
345 | 0 | } |
346 | | static SFColor *NewSFColor() |
347 | 0 | { |
348 | 0 | SFColor *tmp = (SFColor *)gf_malloc(sizeof(SFColor)); |
349 | 0 | memset(tmp, 0, sizeof(SFColor)); |
350 | 0 | return tmp; |
351 | 0 | } |
352 | | static SFColorRGBA *NewSFColorRGBA() |
353 | 0 | { |
354 | 0 | SFColorRGBA *tmp = (SFColorRGBA *)gf_malloc(sizeof(SFColorRGBA)); |
355 | 0 | memset(tmp, 0, sizeof(SFColorRGBA)); |
356 | 0 | return tmp; |
357 | 0 | } |
358 | | static SFRotation *NewSFRotation() |
359 | 0 | { |
360 | 0 | SFRotation *tmp = (SFRotation *)gf_malloc(sizeof(SFRotation)); |
361 | 0 | memset(tmp, 0, sizeof(SFRotation)); |
362 | 0 | return tmp; |
363 | 0 | } |
364 | | static SFImage *NewSFImage() |
365 | 0 | { |
366 | 0 | SFImage *tmp = (SFImage *)gf_malloc(sizeof(SFImage)); |
367 | 0 | memset(tmp, 0, sizeof(SFImage)); |
368 | 0 | return tmp; |
369 | 0 | } |
370 | | static SFURL *NewSFURL() |
371 | 0 | { |
372 | 0 | SFURL *tmp = (SFURL *)gf_malloc(sizeof(SFURL)); |
373 | 0 | memset(tmp, 0, sizeof(SFURL)); |
374 | 0 | return tmp; |
375 | 0 | } |
376 | | static SFCommandBuffer *NewSFCommandBuffer() |
377 | 0 | { |
378 | 0 | SFCommandBuffer *tmp = (SFCommandBuffer *)gf_malloc(sizeof(SFCommandBuffer)); |
379 | 0 | memset(tmp, 0, sizeof(SFCommandBuffer)); |
380 | 0 | tmp->commandList = gf_list_new(); |
381 | 0 | return tmp; |
382 | 0 | } |
383 | | static SFScript *NewSFScript() |
384 | 0 | { |
385 | 0 | SFScript *tmp = (SFScript *)gf_malloc(sizeof(SFScript)); |
386 | 0 | memset(tmp, 0, sizeof(SFScript)); |
387 | 0 | return tmp; |
388 | 0 | } |
389 | | static SFAttrRef *NewSFAttrRef() |
390 | 0 | { |
391 | 0 | SFAttrRef *tmp; |
392 | 0 | GF_SAFEALLOC(tmp, SFAttrRef); |
393 | 0 | return tmp; |
394 | 0 | } |
395 | | static MFBool *NewMFBool() |
396 | 0 | { |
397 | 0 | MFBool *tmp = (MFBool *)gf_malloc(sizeof(MFBool)); |
398 | 0 | memset(tmp, 0, sizeof(MFBool)); |
399 | 0 | return tmp; |
400 | 0 | } |
401 | | static MFFloat *NewMFFloat() |
402 | 0 | { |
403 | 0 | MFFloat *tmp = (MFFloat *)gf_malloc(sizeof(MFFloat)); |
404 | 0 | memset(tmp, 0, sizeof(MFFloat)); |
405 | 0 | return tmp; |
406 | 0 | } |
407 | | static MFTime *NewMFTime() |
408 | 0 | { |
409 | 0 | MFTime *tmp = (MFTime *)gf_malloc(sizeof(MFTime)); |
410 | 0 | memset(tmp, 0, sizeof(MFTime)); |
411 | 0 | return tmp; |
412 | 0 | } |
413 | | static MFInt32 *NewMFInt32() |
414 | 0 | { |
415 | 0 | MFInt32 *tmp = (MFInt32 *)gf_malloc(sizeof(MFInt32)); |
416 | 0 | memset(tmp, 0, sizeof(MFInt32)); |
417 | 0 | return tmp; |
418 | 0 | } |
419 | | static MFString *NewMFString() |
420 | 0 | { |
421 | 0 | MFString *tmp = (MFString *)gf_malloc(sizeof(MFString)); |
422 | 0 | memset(tmp, 0, sizeof(MFString)); |
423 | 0 | return tmp; |
424 | 0 | } |
425 | | static MFVec3f *NewMFVec3f() |
426 | 0 | { |
427 | 0 | MFVec3f *tmp = (MFVec3f *)gf_malloc(sizeof(MFVec3f)); |
428 | 0 | memset(tmp, 0, sizeof(MFVec3f)); |
429 | 0 | return tmp; |
430 | 0 | } |
431 | | static MFVec3d *NewMFVec3d() |
432 | 0 | { |
433 | 0 | MFVec3d *tmp = (MFVec3d *)gf_malloc(sizeof(MFVec3d)); |
434 | 0 | memset(tmp, 0, sizeof(MFVec3d)); |
435 | 0 | return tmp; |
436 | 0 | } |
437 | | static MFVec2f *NewMFVec2f() |
438 | 0 | { |
439 | 0 | MFVec2f *tmp = (MFVec2f *)gf_malloc(sizeof(MFVec2f)); |
440 | 0 | memset(tmp, 0, sizeof(MFVec2f)); |
441 | 0 | return tmp; |
442 | 0 | } |
443 | | static MFVec2d *NewMFVec2d() |
444 | 0 | { |
445 | 0 | MFVec2d *tmp = (MFVec2d *)gf_malloc(sizeof(MFVec2d)); |
446 | 0 | memset(tmp, 0, sizeof(MFVec2d)); |
447 | 0 | return tmp; |
448 | 0 | } |
449 | | static MFColor *NewMFColor() |
450 | 0 | { |
451 | 0 | MFColor *tmp = (MFColor *)gf_malloc(sizeof(MFColor)); |
452 | 0 | memset(tmp, 0, sizeof(MFColor)); |
453 | 0 | return tmp; |
454 | 0 | } |
455 | | static MFColorRGBA *NewMFColorRGBA() |
456 | 0 | { |
457 | 0 | MFColorRGBA *tmp = (MFColorRGBA *)gf_malloc(sizeof(MFColorRGBA)); |
458 | 0 | memset(tmp, 0, sizeof(MFColorRGBA)); |
459 | 0 | return tmp; |
460 | 0 | } |
461 | | static MFRotation *NewMFRotation() |
462 | 0 | { |
463 | 0 | MFRotation *tmp = (MFRotation *)gf_malloc(sizeof(MFRotation)); |
464 | 0 | memset(tmp, 0, sizeof(MFRotation)); |
465 | 0 | return tmp; |
466 | 0 | } |
467 | | static MFURL *NewMFURL() |
468 | 0 | { |
469 | 0 | MFURL *tmp = (MFURL *)gf_malloc(sizeof(MFURL)); |
470 | 0 | memset(tmp, 0, sizeof(MFURL)); |
471 | 0 | return tmp; |
472 | 0 | } |
473 | | static MFScript *NewMFScript() |
474 | 0 | { |
475 | 0 | MFScript *tmp = (MFScript *)gf_malloc(sizeof(MFScript)); |
476 | 0 | memset(tmp, 0, sizeof(MFScript)); |
477 | 0 | return tmp; |
478 | 0 | } |
479 | | static MFAttrRef *NewMFAttrRef() |
480 | 0 | { |
481 | 0 | MFAttrRef *tmp; |
482 | 0 | GF_SAFEALLOC(tmp, MFAttrRef); |
483 | 0 | return tmp; |
484 | 0 | } |
485 | | |
486 | | GF_EXPORT |
487 | | void *gf_sg_vrml_field_pointer_new(u32 FieldType) |
488 | 0 | { |
489 | 0 | switch (FieldType) { |
490 | 0 | case GF_SG_VRML_SFBOOL: |
491 | 0 | return NewSFBool(); |
492 | 0 | case GF_SG_VRML_SFFLOAT: |
493 | 0 | return NewSFFloat(); |
494 | 0 | case GF_SG_VRML_SFDOUBLE: |
495 | 0 | return NewSFDouble(); |
496 | 0 | case GF_SG_VRML_SFTIME: |
497 | 0 | return NewSFTime(); |
498 | 0 | case GF_SG_VRML_SFINT32: |
499 | 0 | return NewSFInt32(); |
500 | 0 | case GF_SG_VRML_SFSTRING: |
501 | 0 | return NewSFString(); |
502 | 0 | case GF_SG_VRML_SFVEC3F: |
503 | 0 | return NewSFVec3f(); |
504 | 0 | case GF_SG_VRML_SFVEC2F: |
505 | 0 | return NewSFVec2f(); |
506 | 0 | case GF_SG_VRML_SFVEC3D: |
507 | 0 | return NewSFVec3d(); |
508 | 0 | case GF_SG_VRML_SFVEC2D: |
509 | 0 | return NewSFVec2d(); |
510 | 0 | case GF_SG_VRML_SFCOLOR: |
511 | 0 | return NewSFColor(); |
512 | 0 | case GF_SG_VRML_SFCOLORRGBA: |
513 | 0 | return NewSFColorRGBA(); |
514 | 0 | case GF_SG_VRML_SFROTATION: |
515 | 0 | return NewSFRotation(); |
516 | 0 | case GF_SG_VRML_SFIMAGE: |
517 | 0 | return NewSFImage(); |
518 | 0 | case GF_SG_VRML_SFATTRREF: |
519 | 0 | return NewSFAttrRef(); |
520 | 0 | case GF_SG_VRML_MFBOOL: |
521 | 0 | return NewMFBool(); |
522 | 0 | case GF_SG_VRML_MFFLOAT: |
523 | 0 | return NewMFFloat(); |
524 | 0 | case GF_SG_VRML_MFTIME: |
525 | 0 | return NewMFTime(); |
526 | 0 | case GF_SG_VRML_MFINT32: |
527 | 0 | return NewMFInt32(); |
528 | 0 | case GF_SG_VRML_MFSTRING: |
529 | 0 | return NewMFString(); |
530 | 0 | case GF_SG_VRML_MFVEC3F: |
531 | 0 | return NewMFVec3f(); |
532 | 0 | case GF_SG_VRML_MFVEC2F: |
533 | 0 | return NewMFVec2f(); |
534 | 0 | case GF_SG_VRML_MFVEC3D: |
535 | 0 | return NewMFVec3d(); |
536 | 0 | case GF_SG_VRML_MFVEC2D: |
537 | 0 | return NewMFVec2d(); |
538 | 0 | case GF_SG_VRML_MFCOLOR: |
539 | 0 | return NewMFColor(); |
540 | 0 | case GF_SG_VRML_MFCOLORRGBA: |
541 | 0 | return NewMFColorRGBA(); |
542 | 0 | case GF_SG_VRML_MFROTATION: |
543 | 0 | case GF_SG_VRML_MFVEC4F: |
544 | 0 | return NewMFRotation(); |
545 | 0 | case GF_SG_VRML_MFATTRREF: |
546 | 0 | return NewMFAttrRef(); |
547 | | |
548 | | //used in commands |
549 | 0 | case GF_SG_VRML_SFCOMMANDBUFFER: |
550 | 0 | return NewSFCommandBuffer(); |
551 | | |
552 | 0 | case GF_SG_VRML_SFURL: |
553 | 0 | return NewSFURL(); |
554 | 0 | case GF_SG_VRML_MFURL: |
555 | 0 | return NewMFURL(); |
556 | | |
557 | 0 | case GF_SG_VRML_SFSCRIPT: |
558 | 0 | return NewSFScript(); |
559 | 0 | case GF_SG_VRML_MFSCRIPT: |
560 | 0 | return NewMFScript(); |
561 | 0 | } |
562 | 0 | return NULL; |
563 | 0 | } |
564 | | |
565 | 0 | void gf_sg_mfint32_del(MFInt32 par) { |
566 | 0 | gf_free(par.vals); |
567 | 0 | } |
568 | 0 | void gf_sg_mffloat_del(MFFloat par) { |
569 | 0 | gf_free(par.vals); |
570 | 0 | } |
571 | 0 | void gf_sg_mfdouble_del(MFDouble par) { |
572 | 0 | gf_free(par.vals); |
573 | 0 | } |
574 | 0 | void gf_sg_mfbool_del(MFBool par) { |
575 | 0 | gf_free(par.vals); |
576 | 0 | } |
577 | 0 | void gf_sg_mfcolor_del(MFColor par) { |
578 | 0 | gf_free(par.vals); |
579 | 0 | } |
580 | 0 | void gf_sg_mfcolorrgba_del(MFColorRGBA par) { |
581 | 0 | gf_free(par.vals); |
582 | 0 | } |
583 | 0 | void gf_sg_mfrotation_del(MFRotation par) { |
584 | 0 | gf_free(par.vals); |
585 | 0 | } |
586 | 0 | void gf_sg_mftime_del(MFTime par) { |
587 | 0 | gf_free(par.vals); |
588 | 0 | } |
589 | 0 | void gf_sg_mfvec2f_del(MFVec2f par) { |
590 | 0 | gf_free(par.vals); |
591 | 0 | } |
592 | 0 | void gf_sg_mfvec2d_del(MFVec2d par) { |
593 | 0 | gf_free(par.vals); |
594 | 0 | } |
595 | 0 | void gf_sg_mfvec3f_del(MFVec3f par) { |
596 | 0 | gf_free(par.vals); |
597 | 0 | } |
598 | 0 | void gf_sg_mfvec3d_del(MFVec3d par) { |
599 | 0 | gf_free(par.vals); |
600 | 0 | } |
601 | 0 | void gf_sg_mfvec4f_del(MFVec4f par) { |
602 | 0 | gf_free(par.vals); |
603 | 0 | } |
604 | 0 | void gf_sg_mfattrref_del(MFAttrRef par) { |
605 | 0 | gf_free(par.vals); |
606 | 0 | } |
607 | 0 | void gf_sg_sfimage_del(SFImage im) { |
608 | 0 | gf_free(im.pixels); |
609 | 0 | } |
610 | 0 | void gf_sg_sfstring_del(SFString par) { |
611 | 0 | if (par.buffer) gf_free(par.buffer); |
612 | 0 | } |
613 | | |
614 | | void gf_sg_sfcommand_del(SFCommandBuffer cb) |
615 | 0 | { |
616 | 0 | u32 i; |
617 | 0 | for (i=gf_list_count(cb.commandList); i>0; i--) { |
618 | 0 | GF_Command *com = (GF_Command *)gf_list_get(cb.commandList, i-1); |
619 | 0 | gf_sg_command_del(com); |
620 | 0 | } |
621 | 0 | gf_list_del(cb.commandList); |
622 | 0 | if (cb.buffer) gf_free(cb.buffer); |
623 | 0 | } |
624 | | |
625 | | GF_EXPORT |
626 | | void gf_sg_vrml_field_pointer_del(void *field, u32 FieldType) |
627 | 0 | { |
628 | 0 | GF_Node *node; |
629 | |
|
630 | 0 | switch (FieldType) { |
631 | 0 | case GF_SG_VRML_SFBOOL: |
632 | 0 | case GF_SG_VRML_SFFLOAT: |
633 | 0 | case GF_SG_VRML_SFDOUBLE: |
634 | 0 | case GF_SG_VRML_SFTIME: |
635 | 0 | case GF_SG_VRML_SFINT32: |
636 | 0 | case GF_SG_VRML_SFVEC3F: |
637 | 0 | case GF_SG_VRML_SFVEC3D: |
638 | 0 | case GF_SG_VRML_SFVEC2F: |
639 | 0 | case GF_SG_VRML_SFVEC2D: |
640 | 0 | case GF_SG_VRML_SFCOLOR: |
641 | 0 | case GF_SG_VRML_SFCOLORRGBA: |
642 | 0 | case GF_SG_VRML_SFROTATION: |
643 | 0 | case GF_SG_VRML_SFATTRREF: |
644 | 0 | break; |
645 | 0 | case GF_SG_VRML_SFSTRING: |
646 | 0 | if ( ((SFString *)field)->buffer) gf_free(((SFString *)field)->buffer); |
647 | 0 | break; |
648 | 0 | case GF_SG_VRML_SFIMAGE: |
649 | 0 | gf_sg_sfimage_del(* ((SFImage *)field)); |
650 | 0 | break; |
651 | | |
652 | 0 | case GF_SG_VRML_SFNODE: |
653 | 0 | node = *(GF_Node **) field; |
654 | 0 | if (node) gf_node_del(node); |
655 | 0 | return; |
656 | 0 | case GF_SG_VRML_SFCOMMANDBUFFER: |
657 | 0 | gf_sg_sfcommand_del(*(SFCommandBuffer *)field); |
658 | 0 | break; |
659 | | |
660 | 0 | case GF_SG_VRML_MFBOOL: |
661 | 0 | gf_sg_mfbool_del( * ((MFBool *) field)); |
662 | 0 | break; |
663 | 0 | case GF_SG_VRML_MFFLOAT: |
664 | 0 | gf_sg_mffloat_del( * ((MFFloat *) field)); |
665 | 0 | break; |
666 | 0 | case GF_SG_VRML_MFDOUBLE: |
667 | 0 | gf_sg_mfdouble_del( * ((MFDouble *) field)); |
668 | 0 | break; |
669 | 0 | case GF_SG_VRML_MFTIME: |
670 | 0 | gf_sg_mftime_del( * ((MFTime *)field)); |
671 | 0 | break; |
672 | 0 | case GF_SG_VRML_MFINT32: |
673 | 0 | gf_sg_mfint32_del( * ((MFInt32 *)field)); |
674 | 0 | break; |
675 | 0 | case GF_SG_VRML_MFSTRING: |
676 | 0 | gf_sg_mfstring_del( *((MFString *)field)); |
677 | 0 | break; |
678 | 0 | case GF_SG_VRML_MFVEC3F: |
679 | 0 | gf_sg_mfvec3f_del( * ((MFVec3f *)field)); |
680 | 0 | break; |
681 | 0 | case GF_SG_VRML_MFVEC2F: |
682 | 0 | gf_sg_mfvec2f_del( * ((MFVec2f *)field)); |
683 | 0 | break; |
684 | 0 | case GF_SG_VRML_MFVEC3D: |
685 | 0 | gf_sg_mfvec3d_del( * ((MFVec3d *)field)); |
686 | 0 | break; |
687 | 0 | case GF_SG_VRML_MFVEC2D: |
688 | 0 | gf_sg_mfvec2d_del( * ((MFVec2d *)field)); |
689 | 0 | break; |
690 | 0 | case GF_SG_VRML_MFCOLOR: |
691 | 0 | gf_sg_mfcolor_del( * ((MFColor *)field)); |
692 | 0 | break; |
693 | 0 | case GF_SG_VRML_MFCOLORRGBA: |
694 | 0 | gf_sg_mfcolorrgba_del( * ((MFColorRGBA *)field)); |
695 | 0 | break; |
696 | 0 | case GF_SG_VRML_MFROTATION: |
697 | 0 | case GF_SG_VRML_MFVEC4F: |
698 | 0 | gf_sg_mfrotation_del( * ((MFRotation *)field)); |
699 | 0 | break; |
700 | 0 | case GF_SG_VRML_SFURL: |
701 | 0 | gf_sg_sfurl_del( * ((SFURL *) field)); |
702 | 0 | break; |
703 | 0 | case GF_SG_VRML_MFURL: |
704 | 0 | gf_sg_mfurl_del( * ((MFURL *) field)); |
705 | 0 | break; |
706 | 0 | case GF_SG_VRML_MFATTRREF: |
707 | 0 | gf_sg_mfattrref_del( * ((MFAttrRef *) field)); |
708 | 0 | break; |
709 | | //used only in proto since this field is created by default for regular nodes |
710 | 0 | case GF_SG_VRML_MFNODE: |
711 | 0 | assert(0); |
712 | 0 | return; |
713 | 0 | case GF_SG_VRML_MFSCRIPT: |
714 | 0 | gf_sg_mfscript_del( * ((MFScript *) field)); |
715 | 0 | break; |
716 | 0 | case GF_SG_VRML_SFSCRIPT: |
717 | 0 | break; |
718 | | |
719 | 0 | default: |
720 | 0 | assert(0); |
721 | 0 | return; |
722 | 0 | } |
723 | | //free pointer |
724 | 0 | gf_free(field); |
725 | 0 | } |
726 | | |
727 | | |
728 | | /********************************************************************* |
729 | | MF Fields manipulation (alloc, gf_realloc, GetAt) |
730 | | *********************************************************************/ |
731 | | GF_EXPORT |
732 | | const char *gf_sg_vrml_get_event_type_name(u32 EventType, Bool forX3D) |
733 | 0 | { |
734 | 0 | switch (EventType) { |
735 | 0 | case GF_SG_EVENT_IN: |
736 | 0 | return forX3D ? "inputOnly" : "eventIn"; |
737 | 0 | case GF_SG_EVENT_FIELD: |
738 | 0 | return forX3D ? "initializeOnly" : "field"; |
739 | 0 | case GF_SG_EVENT_EXPOSED_FIELD: |
740 | 0 | return forX3D ? "inputOutput" : "exposedField"; |
741 | 0 | case GF_SG_EVENT_OUT: |
742 | 0 | return forX3D ? "outputOnly" : "eventOut"; |
743 | 0 | default: |
744 | 0 | return "unknownEvent"; |
745 | 0 | } |
746 | 0 | } |
747 | | |
748 | | GF_EXPORT |
749 | | const char *gf_sg_vrml_get_field_type_name(u32 FieldType) |
750 | 0 | { |
751 | |
|
752 | 0 | switch (FieldType) { |
753 | 0 | case GF_SG_VRML_SFBOOL: |
754 | 0 | return "SFBool"; |
755 | 0 | case GF_SG_VRML_SFFLOAT: |
756 | 0 | return "SFFloat"; |
757 | 0 | case GF_SG_VRML_SFDOUBLE: |
758 | 0 | return "SFDouble"; |
759 | 0 | case GF_SG_VRML_SFTIME: |
760 | 0 | return "SFTime"; |
761 | 0 | case GF_SG_VRML_SFINT32: |
762 | 0 | return "SFInt32"; |
763 | 0 | case GF_SG_VRML_SFSTRING: |
764 | 0 | return "SFString"; |
765 | 0 | case GF_SG_VRML_SFVEC3F: |
766 | 0 | return "SFVec3f"; |
767 | 0 | case GF_SG_VRML_SFVEC2F: |
768 | 0 | return "SFVec2f"; |
769 | 0 | case GF_SG_VRML_SFVEC3D: |
770 | 0 | return "SFVec3d"; |
771 | 0 | case GF_SG_VRML_SFVEC2D: |
772 | 0 | return "SFVec2d"; |
773 | 0 | case GF_SG_VRML_SFCOLOR: |
774 | 0 | return "SFColor"; |
775 | 0 | case GF_SG_VRML_SFCOLORRGBA: |
776 | 0 | return "SFColorRGBA"; |
777 | 0 | case GF_SG_VRML_SFROTATION: |
778 | 0 | return "SFRotation"; |
779 | 0 | case GF_SG_VRML_SFIMAGE: |
780 | 0 | return "SFImage"; |
781 | 0 | case GF_SG_VRML_SFNODE: |
782 | 0 | return "SFNode"; |
783 | 0 | case GF_SG_VRML_SFVEC4F: |
784 | 0 | return "SFVec4f"; |
785 | 0 | case GF_SG_VRML_SFATTRREF: |
786 | 0 | return "SFAttrRef"; |
787 | 0 | case GF_SG_VRML_MFBOOL: |
788 | 0 | return "MFBool"; |
789 | 0 | case GF_SG_VRML_MFFLOAT: |
790 | 0 | return "MFFloat"; |
791 | 0 | case GF_SG_VRML_MFDOUBLE: |
792 | 0 | return "MFDouble"; |
793 | 0 | case GF_SG_VRML_MFTIME: |
794 | 0 | return "MFTime"; |
795 | 0 | case GF_SG_VRML_MFINT32: |
796 | 0 | return "MFInt32"; |
797 | 0 | case GF_SG_VRML_MFSTRING: |
798 | 0 | return "MFString"; |
799 | 0 | case GF_SG_VRML_MFVEC3F: |
800 | 0 | return "MFVec3f"; |
801 | 0 | case GF_SG_VRML_MFVEC2F: |
802 | 0 | return "MFVec2f"; |
803 | 0 | case GF_SG_VRML_MFVEC3D: |
804 | 0 | return "MFVec3d"; |
805 | 0 | case GF_SG_VRML_MFVEC2D: |
806 | 0 | return "MFVec2d"; |
807 | 0 | case GF_SG_VRML_MFCOLOR: |
808 | 0 | return "MFColor"; |
809 | 0 | case GF_SG_VRML_MFCOLORRGBA: |
810 | 0 | return "MFColorRGBA"; |
811 | 0 | case GF_SG_VRML_MFROTATION: |
812 | 0 | return "MFRotation"; |
813 | 0 | case GF_SG_VRML_MFIMAGE: |
814 | 0 | return "MFImage"; |
815 | 0 | case GF_SG_VRML_MFNODE: |
816 | 0 | return "MFNode"; |
817 | 0 | case GF_SG_VRML_MFVEC4F: |
818 | 0 | return "MFVec4f"; |
819 | 0 | case GF_SG_VRML_SFURL: |
820 | 0 | return "SFURL"; |
821 | 0 | case GF_SG_VRML_MFURL: |
822 | 0 | return "MFURL"; |
823 | 0 | case GF_SG_VRML_MFATTRREF: |
824 | 0 | return "MFAttrRef"; |
825 | 0 | case GF_SG_VRML_SFCOMMANDBUFFER: |
826 | 0 | return "SFCommandBuffer"; |
827 | 0 | case GF_SG_VRML_SFSCRIPT: |
828 | 0 | return "SFScript"; |
829 | 0 | case GF_SG_VRML_MFSCRIPT: |
830 | 0 | return "MFScript"; |
831 | 0 | default: |
832 | 0 | return "UnknownType"; |
833 | 0 | } |
834 | 0 | } |
835 | | |
836 | | u32 gf_sg_field_type_by_name(char *fieldType) |
837 | 0 | { |
838 | 0 | if (!stricmp(fieldType, "SFBool")) return GF_SG_VRML_SFBOOL; |
839 | 0 | else if (!stricmp(fieldType, "SFFloat")) return GF_SG_VRML_SFFLOAT; |
840 | 0 | else if (!stricmp(fieldType, "SFDouble")) return GF_SG_VRML_SFDOUBLE; |
841 | 0 | else if (!stricmp(fieldType, "SFTime")) return GF_SG_VRML_SFTIME; |
842 | 0 | else if (!stricmp(fieldType, "SFInt32")) return GF_SG_VRML_SFINT32; |
843 | 0 | else if (!stricmp(fieldType, "SFString")) return GF_SG_VRML_SFSTRING; |
844 | 0 | else if (!stricmp(fieldType, "SFVec2f")) return GF_SG_VRML_SFVEC2F; |
845 | 0 | else if (!stricmp(fieldType, "SFVec3f")) return GF_SG_VRML_SFVEC3F; |
846 | 0 | else if (!stricmp(fieldType, "SFVec2d")) return GF_SG_VRML_SFVEC2D; |
847 | 0 | else if (!stricmp(fieldType, "SFVec3d")) return GF_SG_VRML_SFVEC3D; |
848 | 0 | else if (!stricmp(fieldType, "SFColor")) return GF_SG_VRML_SFCOLOR; |
849 | 0 | else if (!stricmp(fieldType, "SFColorRGBA")) return GF_SG_VRML_SFCOLORRGBA; |
850 | 0 | else if (!stricmp(fieldType, "SFRotation")) return GF_SG_VRML_SFROTATION; |
851 | 0 | else if (!stricmp(fieldType, "SFImage")) return GF_SG_VRML_SFIMAGE; |
852 | 0 | else if (!stricmp(fieldType, "SFAttrRef")) return GF_SG_VRML_SFATTRREF; |
853 | 0 | else if (!stricmp(fieldType, "SFNode")) return GF_SG_VRML_SFNODE; |
854 | | |
855 | 0 | else if (!stricmp(fieldType, "MFBool")) return GF_SG_VRML_MFBOOL; |
856 | 0 | else if (!stricmp(fieldType, "MFFloat")) return GF_SG_VRML_MFFLOAT; |
857 | 0 | else if (!stricmp(fieldType, "MFDouble")) return GF_SG_VRML_MFDOUBLE; |
858 | 0 | else if (!stricmp(fieldType, "MFTime")) return GF_SG_VRML_MFTIME; |
859 | 0 | else if (!stricmp(fieldType, "MFInt32")) return GF_SG_VRML_MFINT32; |
860 | 0 | else if (!stricmp(fieldType, "MFString")) return GF_SG_VRML_MFSTRING; |
861 | 0 | else if (!stricmp(fieldType, "MFVec2f")) return GF_SG_VRML_MFVEC2F; |
862 | 0 | else if (!stricmp(fieldType, "MFVec3f")) return GF_SG_VRML_MFVEC3F; |
863 | 0 | else if (!stricmp(fieldType, "MFVec2d")) return GF_SG_VRML_MFVEC2D; |
864 | 0 | else if (!stricmp(fieldType, "MFVec3d")) return GF_SG_VRML_MFVEC3D; |
865 | 0 | else if (!stricmp(fieldType, "MFColor")) return GF_SG_VRML_MFCOLOR; |
866 | 0 | else if (!stricmp(fieldType, "MFColorRGBA")) return GF_SG_VRML_MFCOLORRGBA; |
867 | 0 | else if (!stricmp(fieldType, "MFRotation")) return GF_SG_VRML_MFROTATION; |
868 | 0 | else if (!stricmp(fieldType, "MFImage")) return GF_SG_VRML_MFIMAGE; |
869 | 0 | else if (!stricmp(fieldType, "MFAttrRef")) return GF_SG_VRML_MFATTRREF; |
870 | 0 | else if (!stricmp(fieldType, "MFNode")) return GF_SG_VRML_MFNODE; |
871 | | |
872 | 0 | return GF_SG_VRML_UNKNOWN; |
873 | 0 | } |
874 | | |
875 | | #endif |
876 | | |
877 | 0 | void gf_sg_sfurl_del(SFURL url) { |
878 | 0 | if (url.url) gf_free(url.url); |
879 | 0 | } |
880 | | |
881 | | GF_EXPORT |
882 | | Bool gf_sg_vrml_is_sf_field(u32 FieldType) |
883 | 0 | { |
884 | | //special case for AttrRef declared after first MF |
885 | 0 | if (FieldType==GF_SG_VRML_SFATTRREF) return GF_TRUE; |
886 | 0 | return (FieldType<GF_SG_VRML_FIRST_MF); |
887 | 0 | } |
888 | | |
889 | | void gf_sg_mfstring_del(MFString par) |
890 | 0 | { |
891 | 0 | u32 i; |
892 | 0 | for (i=0; i<par.count; i++) { |
893 | 0 | if (par.vals[i]) gf_free(par.vals[i]); |
894 | 0 | } |
895 | 0 | gf_free(par.vals); |
896 | 0 | } |
897 | | |
898 | | |
899 | | GF_EXPORT |
900 | | void gf_sg_mfurl_del(MFURL url) |
901 | 0 | { |
902 | 0 | u32 i; |
903 | 0 | for (i=0; i<url.count; i++) { |
904 | 0 | gf_sg_sfurl_del(url.vals[i]); |
905 | 0 | } |
906 | 0 | gf_free(url.vals); |
907 | 0 | } |
908 | | void gf_sg_mfscript_del(MFScript sc) |
909 | 0 | { |
910 | 0 | u32 i; |
911 | 0 | for (i=0; i<sc.count; i++) { |
912 | 0 | if (sc.vals[i].script_text) gf_free(sc.vals[i].script_text); |
913 | 0 | } |
914 | 0 | gf_free(sc.vals); |
915 | 0 | } |
916 | | |
917 | | |
918 | | void gf_sg_vrml_copy_mfurl(MFURL *dst, MFURL *src) |
919 | 0 | { |
920 | 0 | u32 i; |
921 | 0 | gf_sg_vrml_mf_reset(dst, GF_SG_VRML_MFURL); |
922 | 0 | dst->count = src->count; |
923 | 0 | dst->vals = gf_malloc(sizeof(SFURL)*src->count); |
924 | 0 | for (i=0; i<src->count; i++) { |
925 | 0 | dst->vals[i].OD_ID = src->vals[i].OD_ID; |
926 | 0 | dst->vals[i].url = src->vals[i].url ? gf_strdup(src->vals[i].url) : NULL; |
927 | 0 | } |
928 | 0 | } |
929 | | |
930 | | |
931 | | |
932 | | //return the size of fixed fields (eg no buffer in the field) |
933 | | u32 gf_sg_vrml_get_sf_size(u32 FieldType) |
934 | 0 | { |
935 | 0 | switch (FieldType) { |
936 | 0 | case GF_SG_VRML_SFBOOL: |
937 | 0 | case GF_SG_VRML_MFBOOL: |
938 | 0 | return sizeof(SFBool); |
939 | 0 | case GF_SG_VRML_SFFLOAT: |
940 | 0 | case GF_SG_VRML_MFFLOAT: |
941 | 0 | return sizeof(SFFloat); |
942 | 0 | case GF_SG_VRML_SFTIME: |
943 | 0 | case GF_SG_VRML_MFTIME: |
944 | 0 | return sizeof(SFTime); |
945 | 0 | case GF_SG_VRML_SFDOUBLE: |
946 | 0 | case GF_SG_VRML_MFDOUBLE: |
947 | 0 | return sizeof(SFDouble); |
948 | 0 | case GF_SG_VRML_SFINT32: |
949 | 0 | case GF_SG_VRML_MFINT32: |
950 | 0 | return sizeof(SFInt32); |
951 | 0 | case GF_SG_VRML_SFVEC3F: |
952 | 0 | case GF_SG_VRML_MFVEC3F: |
953 | 0 | return 3*sizeof(SFFloat); |
954 | 0 | case GF_SG_VRML_SFVEC2F: |
955 | 0 | case GF_SG_VRML_MFVEC2F: |
956 | 0 | return 2*sizeof(SFFloat); |
957 | 0 | case GF_SG_VRML_SFVEC3D: |
958 | 0 | case GF_SG_VRML_MFVEC3D: |
959 | 0 | return 3*sizeof(SFDouble); |
960 | 0 | case GF_SG_VRML_SFCOLOR: |
961 | 0 | case GF_SG_VRML_MFCOLOR: |
962 | 0 | return 3*sizeof(SFFloat); |
963 | 0 | case GF_SG_VRML_SFCOLORRGBA: |
964 | 0 | case GF_SG_VRML_MFCOLORRGBA: |
965 | 0 | return 4*sizeof(SFFloat); |
966 | 0 | case GF_SG_VRML_SFROTATION: |
967 | 0 | case GF_SG_VRML_MFROTATION: |
968 | 0 | case GF_SG_VRML_MFVEC4F: |
969 | 0 | return 4*sizeof(SFFloat); |
970 | | |
971 | 0 | case GF_SG_VRML_SFATTRREF: |
972 | 0 | case GF_SG_VRML_MFATTRREF: |
973 | 0 | return sizeof(SFAttrRef); |
974 | | //check if that works!! |
975 | 0 | case GF_SG_VRML_SFSTRING: |
976 | 0 | case GF_SG_VRML_MFSTRING: |
977 | | //ptr to char |
978 | 0 | return sizeof(SFString); |
979 | 0 | case GF_SG_VRML_SFSCRIPT: |
980 | 0 | case GF_SG_VRML_MFSCRIPT: |
981 | 0 | return sizeof(SFScript); |
982 | 0 | case GF_SG_VRML_SFURL: |
983 | 0 | case GF_SG_VRML_MFURL: |
984 | 0 | return sizeof(SFURL); |
985 | 0 | default: |
986 | 0 | return 0; |
987 | 0 | } |
988 | 0 | } |
989 | | |
990 | | GF_EXPORT |
991 | | u32 gf_sg_vrml_get_sf_type(u32 FieldType) |
992 | 0 | { |
993 | 0 | switch (FieldType) { |
994 | 0 | case GF_SG_VRML_SFBOOL: |
995 | 0 | case GF_SG_VRML_MFBOOL: |
996 | 0 | return GF_SG_VRML_SFBOOL; |
997 | 0 | case GF_SG_VRML_SFFLOAT: |
998 | 0 | case GF_SG_VRML_MFFLOAT: |
999 | 0 | return GF_SG_VRML_SFFLOAT; |
1000 | 0 | case GF_SG_VRML_SFDOUBLE: |
1001 | 0 | case GF_SG_VRML_MFDOUBLE: |
1002 | 0 | return GF_SG_VRML_SFDOUBLE; |
1003 | 0 | case GF_SG_VRML_SFTIME: |
1004 | 0 | case GF_SG_VRML_MFTIME: |
1005 | 0 | return GF_SG_VRML_SFTIME; |
1006 | 0 | case GF_SG_VRML_SFINT32: |
1007 | 0 | case GF_SG_VRML_MFINT32: |
1008 | 0 | return GF_SG_VRML_SFINT32; |
1009 | 0 | case GF_SG_VRML_SFVEC3F: |
1010 | 0 | case GF_SG_VRML_MFVEC3F: |
1011 | 0 | return GF_SG_VRML_SFVEC3F; |
1012 | 0 | case GF_SG_VRML_SFVEC4F: |
1013 | 0 | case GF_SG_VRML_MFVEC4F: |
1014 | 0 | return GF_SG_VRML_SFVEC4F; |
1015 | 0 | case GF_SG_VRML_SFVEC2F: |
1016 | 0 | case GF_SG_VRML_MFVEC2F: |
1017 | 0 | return GF_SG_VRML_SFVEC2F; |
1018 | 0 | case GF_SG_VRML_SFVEC3D: |
1019 | 0 | case GF_SG_VRML_MFVEC3D: |
1020 | 0 | return GF_SG_VRML_SFVEC3D; |
1021 | 0 | case GF_SG_VRML_SFVEC2D: |
1022 | 0 | case GF_SG_VRML_MFVEC2D: |
1023 | 0 | return GF_SG_VRML_SFVEC2D; |
1024 | 0 | case GF_SG_VRML_SFCOLOR: |
1025 | 0 | case GF_SG_VRML_MFCOLOR: |
1026 | 0 | return GF_SG_VRML_SFCOLOR; |
1027 | 0 | case GF_SG_VRML_SFCOLORRGBA: |
1028 | 0 | case GF_SG_VRML_MFCOLORRGBA: |
1029 | 0 | return GF_SG_VRML_SFCOLORRGBA; |
1030 | 0 | case GF_SG_VRML_SFROTATION: |
1031 | 0 | case GF_SG_VRML_MFROTATION: |
1032 | 0 | return GF_SG_VRML_SFROTATION; |
1033 | 0 | case GF_SG_VRML_SFATTRREF: |
1034 | 0 | case GF_SG_VRML_MFATTRREF: |
1035 | 0 | return GF_SG_VRML_SFATTRREF; |
1036 | | |
1037 | | //check if that works!! |
1038 | 0 | case GF_SG_VRML_SFSTRING: |
1039 | 0 | case GF_SG_VRML_MFSTRING: |
1040 | | //ptr to char |
1041 | 0 | return GF_SG_VRML_SFSTRING; |
1042 | 0 | case GF_SG_VRML_SFSCRIPT: |
1043 | 0 | case GF_SG_VRML_MFSCRIPT: |
1044 | 0 | return GF_SG_VRML_SFSCRIPT; |
1045 | 0 | case GF_SG_VRML_SFURL: |
1046 | 0 | case GF_SG_VRML_MFURL: |
1047 | 0 | return GF_SG_VRML_SFURL; |
1048 | 0 | case GF_SG_VRML_SFNODE: |
1049 | 0 | case GF_SG_VRML_MFNODE: |
1050 | 0 | return GF_SG_VRML_SFNODE; |
1051 | 0 | default: |
1052 | 0 | return GF_SG_VRML_UNKNOWN; |
1053 | 0 | } |
1054 | 0 | } |
1055 | | |
1056 | | // |
1057 | | // Insert (+alloc) an MFField with a specified position for insertion and sets the ptr to the |
1058 | | // newly created slot |
1059 | | // !! Doesnt work for MFNodes |
1060 | | // InsertAt is the 0-based index for the new slot |
1061 | | GF_EXPORT |
1062 | | GF_Err gf_sg_vrml_mf_insert(void *mf, u32 FieldType, void **new_ptr, u32 InsertAt) |
1063 | 0 | { |
1064 | 0 | char *buffer; |
1065 | 0 | u32 FieldSize, i, k; |
1066 | 0 | GenMFField *mffield = (GenMFField *)mf; |
1067 | |
|
1068 | 0 | if (gf_sg_vrml_is_sf_field(FieldType)) return GF_BAD_PARAM; |
1069 | 0 | if (FieldType == GF_SG_VRML_MFNODE) return GF_BAD_PARAM; |
1070 | | |
1071 | 0 | FieldSize = gf_sg_vrml_get_sf_size(FieldType); |
1072 | | |
1073 | | //field we can't copy |
1074 | 0 | if (!FieldSize) return GF_BAD_PARAM; |
1075 | | |
1076 | | //first item ever |
1077 | 0 | if (!mffield->count || !mffield->array) { |
1078 | 0 | if (mffield->array) gf_free(mffield->array); |
1079 | 0 | mffield->array = (char*)gf_malloc(sizeof(char)*FieldSize); |
1080 | 0 | memset(mffield->array, 0, sizeof(char)*FieldSize); |
1081 | 0 | mffield->count = 1; |
1082 | 0 | if (new_ptr) *new_ptr = mffield->array; |
1083 | 0 | return GF_OK; |
1084 | 0 | } |
1085 | | |
1086 | | //append at the end |
1087 | 0 | if (InsertAt >= mffield->count) { |
1088 | 0 | mffield->array = (char*)gf_realloc(mffield->array, sizeof(char)*(1+mffield->count)*FieldSize); |
1089 | 0 | memset(mffield->array + mffield->count * FieldSize, 0, FieldSize); |
1090 | 0 | if (new_ptr) *new_ptr = mffield->array + mffield->count * FieldSize; |
1091 | 0 | mffield->count += 1; |
1092 | 0 | return GF_OK; |
1093 | 0 | } |
1094 | | //alloc 1+itemCount |
1095 | 0 | buffer = (char*)gf_malloc(sizeof(char)*(1+mffield->count)*FieldSize); |
1096 | | |
1097 | | //insert in the array |
1098 | 0 | k=0; |
1099 | 0 | for (i=0; i < mffield->count; i++) { |
1100 | 0 | if (InsertAt == i) { |
1101 | 0 | if (new_ptr) { |
1102 | 0 | *new_ptr = buffer + i*FieldSize; |
1103 | 0 | memset(*new_ptr, 0, sizeof(char)*FieldSize); |
1104 | 0 | } |
1105 | 0 | k = 1; |
1106 | 0 | } |
1107 | 0 | memcpy(buffer + (k+i) * FieldSize , mffield->array + i*FieldSize, FieldSize); |
1108 | 0 | } |
1109 | 0 | gf_free(mffield->array); |
1110 | 0 | mffield->array = buffer; |
1111 | 0 | mffield->count += 1; |
1112 | 0 | return GF_OK; |
1113 | 0 | } |
1114 | | |
1115 | | |
1116 | | GF_EXPORT |
1117 | | GF_Err gf_sg_vrml_mf_reset(void *mf, u32 FieldType) |
1118 | 0 | { |
1119 | 0 | GenMFField *mffield = (GenMFField *)mf; |
1120 | 0 | if (!mffield || !mffield->array) return GF_OK; |
1121 | | |
1122 | | //field we can't copy |
1123 | 0 | if (gf_sg_vrml_is_sf_field(FieldType)) return GF_BAD_PARAM; |
1124 | 0 | if (!gf_sg_vrml_get_sf_size(FieldType)) return GF_BAD_PARAM; |
1125 | | |
1126 | 0 | switch (FieldType) { |
1127 | 0 | case GF_SG_VRML_MFSTRING: |
1128 | 0 | gf_sg_mfstring_del( * ((MFString *) mf)); |
1129 | 0 | break; |
1130 | 0 | case GF_SG_VRML_MFURL: |
1131 | 0 | gf_sg_mfurl_del( * ((MFURL *) mf)); |
1132 | 0 | break; |
1133 | 0 | case GF_SG_VRML_MFSCRIPT: |
1134 | 0 | gf_sg_mfscript_del( * ((MFScript *) mf)); |
1135 | 0 | break; |
1136 | 0 | default: |
1137 | 0 | if (mffield->array) gf_free(mffield->array); |
1138 | 0 | break; |
1139 | 0 | } |
1140 | | |
1141 | 0 | mffield->array = NULL; |
1142 | 0 | mffield->count = 0; |
1143 | 0 | return GF_OK; |
1144 | 0 | } |
1145 | | |
1146 | | #ifndef GPAC_DISABLE_VRML |
1147 | | |
1148 | 0 | #define MAX_MFFIELD_ALLOC 5000000 |
1149 | | GF_EXPORT |
1150 | | GF_Err gf_sg_vrml_mf_alloc(void *mf, u32 FieldType, u32 NbItems) |
1151 | 0 | { |
1152 | 0 | u32 FieldSize; |
1153 | 0 | GenMFField *mffield = (GenMFField *)mf; |
1154 | |
|
1155 | 0 | if (gf_sg_vrml_is_sf_field(FieldType)) return GF_BAD_PARAM; |
1156 | 0 | if (FieldType == GF_SG_VRML_MFNODE) return GF_BAD_PARAM; |
1157 | 0 | if (!mffield) return GF_NON_COMPLIANT_BITSTREAM; |
1158 | | |
1159 | 0 | FieldSize = gf_sg_vrml_get_sf_size(FieldType); |
1160 | | |
1161 | | //field we can't copy |
1162 | 0 | if (!FieldSize) return GF_BAD_PARAM; |
1163 | 0 | if (NbItems>MAX_MFFIELD_ALLOC) return GF_IO_ERR; |
1164 | | |
1165 | 0 | if (mffield->count==NbItems) return GF_OK; |
1166 | 0 | gf_sg_vrml_mf_reset(mf, FieldType); |
1167 | 0 | if (NbItems) { |
1168 | 0 | mffield->array = (char*)gf_malloc(sizeof(char)*FieldSize*NbItems); |
1169 | 0 | memset(mffield->array, 0, sizeof(char)*FieldSize*NbItems); |
1170 | 0 | } |
1171 | 0 | mffield->count = NbItems; |
1172 | 0 | return GF_OK; |
1173 | 0 | } |
1174 | | |
1175 | | GF_EXPORT |
1176 | | GF_Err gf_sg_vrml_mf_get_item(void *mf, u32 FieldType, void **new_ptr, u32 ItemPos) |
1177 | 0 | { |
1178 | 0 | u32 FieldSize; |
1179 | 0 | GenMFField *mffield = (GenMFField *)mf; |
1180 | |
|
1181 | 0 | *new_ptr = NULL; |
1182 | 0 | if (gf_sg_vrml_is_sf_field(FieldType)) return GF_BAD_PARAM; |
1183 | 0 | if (FieldType == GF_SG_VRML_MFNODE) return GF_BAD_PARAM; |
1184 | 0 | if (!mffield) return GF_NON_COMPLIANT_BITSTREAM; |
1185 | | |
1186 | 0 | FieldSize = gf_sg_vrml_get_sf_size(FieldType); |
1187 | | |
1188 | | //field we can't copy |
1189 | 0 | if (!FieldSize) return GF_BAD_PARAM; |
1190 | 0 | if (ItemPos >= mffield->count) return GF_BAD_PARAM; |
1191 | 0 | *new_ptr = mffield->array + ItemPos * FieldSize; |
1192 | 0 | return GF_OK; |
1193 | 0 | } |
1194 | | |
1195 | | |
1196 | | GF_EXPORT |
1197 | | GF_Err gf_sg_vrml_mf_append(void *mf, u32 FieldType, void **new_ptr) |
1198 | 0 | { |
1199 | 0 | GenMFField *mffield = (GenMFField *)mf; |
1200 | 0 | if (!mf) return GF_NON_COMPLIANT_BITSTREAM; |
1201 | 0 | return gf_sg_vrml_mf_insert(mf, FieldType, new_ptr, mffield->count+2); |
1202 | 0 | } |
1203 | | |
1204 | | |
1205 | | //remove the specified item (0-based index) |
1206 | | GF_EXPORT |
1207 | | GF_Err gf_sg_vrml_mf_remove(void *mf, u32 FieldType, u32 RemoveFrom) |
1208 | 0 | { |
1209 | 0 | char *buffer; |
1210 | 0 | u32 FieldSize, i, k; |
1211 | 0 | GenMFField *mffield = (GenMFField *)mf; |
1212 | 0 | if (!mffield) return GF_NON_COMPLIANT_BITSTREAM; |
1213 | | |
1214 | 0 | FieldSize = gf_sg_vrml_get_sf_size(FieldType); |
1215 | | |
1216 | | //field we can't copy |
1217 | 0 | if (!FieldSize) return GF_BAD_PARAM; |
1218 | | |
1219 | 0 | if (!mffield->count || RemoveFrom >= mffield->count) return GF_BAD_PARAM; |
1220 | | |
1221 | 0 | if (mffield->count == 1) { |
1222 | 0 | gf_free(mffield->array); |
1223 | 0 | mffield->array = NULL; |
1224 | 0 | mffield->count = 0; |
1225 | 0 | return GF_OK; |
1226 | 0 | } |
1227 | 0 | k=0; |
1228 | 0 | buffer = (char*)gf_malloc(sizeof(char)*(mffield->count-1)*FieldSize); |
1229 | 0 | for (i=0; i<mffield->count; i++) { |
1230 | 0 | if (RemoveFrom == i) { |
1231 | 0 | k = 1; |
1232 | 0 | } else { |
1233 | 0 | memcpy(buffer + (i-k)*FieldSize, mffield->array + i*FieldSize, FieldSize); |
1234 | 0 | } |
1235 | 0 | } |
1236 | 0 | gf_free(mffield->array); |
1237 | 0 | mffield->array = buffer; |
1238 | 0 | mffield->count -= 1; |
1239 | 0 | return GF_OK; |
1240 | 0 | } |
1241 | | |
1242 | | /*special cloning with type-casting from SF/MF strings to URL conversion since proto URL doesn't exist |
1243 | | as a field type (it's just a stupid encoding trick) */ |
1244 | | void VRML_FieldCopyCast(void *dest, u32 dst_field_type, void *orig, u32 ori_field_type) |
1245 | 0 | { |
1246 | 0 | SFURL *url; |
1247 | 0 | u32 size, i, sf_type_ori, sf_type_dst; |
1248 | 0 | void *dst_field, *orig_field; |
1249 | 0 | if (!dest || !orig) return; |
1250 | | |
1251 | 0 | switch (dst_field_type) { |
1252 | 0 | case GF_SG_VRML_SFSTRING: |
1253 | 0 | if (ori_field_type == GF_SG_VRML_SFURL) { |
1254 | 0 | url = ((SFURL *)orig); |
1255 | 0 | if (url->OD_ID>0) { |
1256 | 0 | char tmp[50]; |
1257 | 0 | sprintf(tmp, "%d", url->OD_ID); |
1258 | 0 | if ( ((SFString*)dest)->buffer) gf_free(((SFString*)dest)->buffer); |
1259 | 0 | ((SFString*)dest)->buffer = gf_strdup(tmp); |
1260 | 0 | } else { |
1261 | 0 | if ( ((SFString*)dest)->buffer) gf_free(((SFString*)dest)->buffer); |
1262 | 0 | ((SFString*)dest)->buffer = url->url ? gf_strdup(url->url) : NULL; |
1263 | 0 | } |
1264 | 0 | } |
1265 | | /*for SFString to MFString cast*/ |
1266 | 0 | else if (ori_field_type == GF_SG_VRML_SFSTRING) { |
1267 | 0 | if ( ((SFString*)dest)->buffer) gf_free(((SFString*)dest)->buffer); |
1268 | 0 | ((SFString*)dest)->buffer = ((SFString*)orig)->buffer ? gf_strdup(((SFString*)orig)->buffer) : NULL; |
1269 | 0 | } |
1270 | 0 | return; |
1271 | 0 | case GF_SG_VRML_SFURL: |
1272 | 0 | if (ori_field_type != GF_SG_VRML_SFSTRING) return; |
1273 | 0 | url = ((SFURL *)dest); |
1274 | 0 | url->OD_ID = 0; |
1275 | 0 | if (url->url) gf_free(url->url); |
1276 | 0 | if ( ((SFString*)orig)->buffer) |
1277 | 0 | url->url = gf_strdup(((SFString*)orig)->buffer); |
1278 | 0 | else |
1279 | 0 | url->url = NULL; |
1280 | 0 | return; |
1281 | 0 | case GF_SG_VRML_MFSTRING: |
1282 | 0 | case GF_SG_VRML_MFURL: |
1283 | 0 | break; |
1284 | 0 | default: |
1285 | 0 | return; |
1286 | 0 | } |
1287 | | |
1288 | 0 | sf_type_dst = gf_sg_vrml_get_sf_type(dst_field_type); |
1289 | |
|
1290 | 0 | if (gf_sg_vrml_is_sf_field(ori_field_type)) { |
1291 | 0 | size = 1; |
1292 | 0 | gf_sg_vrml_mf_alloc(dest, dst_field_type, size); |
1293 | 0 | gf_sg_vrml_mf_get_item(dest, dst_field_type, &dst_field, 0); |
1294 | 0 | VRML_FieldCopyCast(dst_field, sf_type_dst, orig, ori_field_type); |
1295 | 0 | return; |
1296 | 0 | } |
1297 | | |
1298 | 0 | size = ((GenMFField *)orig)->count; |
1299 | 0 | if (size != ((GenMFField *)dest)->count) gf_sg_vrml_mf_alloc(dest, dst_field_type, size); |
1300 | |
|
1301 | 0 | sf_type_ori = gf_sg_vrml_get_sf_type(ori_field_type); |
1302 | | //duplicate all items |
1303 | 0 | for (i=0; i<size; i++) { |
1304 | 0 | gf_sg_vrml_mf_get_item(dest, dst_field_type, &dst_field, i); |
1305 | 0 | gf_sg_vrml_mf_get_item(orig, ori_field_type, &orig_field, i); |
1306 | 0 | VRML_FieldCopyCast(dst_field, sf_type_dst, orig_field, sf_type_ori); |
1307 | 0 | } |
1308 | 0 | return; |
1309 | 0 | } |
1310 | | |
1311 | | GF_EXPORT |
1312 | | void gf_sg_vrml_field_clone(void *dest, void *orig, u32 field_type, GF_SceneGraph *inScene) |
1313 | 0 | { |
1314 | 0 | u32 size, i, sf_type; |
1315 | 0 | void *dst_field, *orig_field; |
1316 | |
|
1317 | 0 | if (!dest || !orig) return; |
1318 | | |
1319 | 0 | switch (field_type) { |
1320 | 0 | case GF_SG_VRML_SFBOOL: |
1321 | 0 | memcpy(dest, orig, sizeof(SFBool)); |
1322 | 0 | break; |
1323 | 0 | case GF_SG_VRML_SFCOLOR: |
1324 | 0 | memcpy(dest, orig, sizeof(SFColor)); |
1325 | 0 | break; |
1326 | 0 | case GF_SG_VRML_SFFLOAT: |
1327 | 0 | memcpy(dest, orig, sizeof(SFFloat)); |
1328 | 0 | break; |
1329 | 0 | case GF_SG_VRML_SFINT32: |
1330 | 0 | memcpy(dest, orig, sizeof(SFInt32)); |
1331 | 0 | break; |
1332 | 0 | case GF_SG_VRML_SFROTATION: |
1333 | 0 | memcpy(dest, orig, sizeof(SFRotation)); |
1334 | 0 | break; |
1335 | 0 | case GF_SG_VRML_SFTIME: |
1336 | 0 | memcpy(dest, orig, sizeof(SFTime)); |
1337 | 0 | break; |
1338 | 0 | case GF_SG_VRML_SFVEC2F: |
1339 | 0 | memcpy(dest, orig, sizeof(SFVec2f)); |
1340 | 0 | break; |
1341 | 0 | case GF_SG_VRML_SFVEC3F: |
1342 | 0 | memcpy(dest, orig, sizeof(SFVec3f)); |
1343 | 0 | break; |
1344 | 0 | case GF_SG_VRML_SFATTRREF: |
1345 | 0 | memcpy(dest, orig, sizeof(SFAttrRef)); |
1346 | 0 | break; |
1347 | 0 | case GF_SG_VRML_SFSTRING: |
1348 | 0 | if ( ((SFString*)dest)->buffer) gf_free(((SFString*)dest)->buffer); |
1349 | 0 | if ( ((SFString*)orig)->buffer ) |
1350 | 0 | ((SFString*)dest)->buffer = gf_strdup(((SFString*)orig)->buffer); |
1351 | 0 | else |
1352 | 0 | ((SFString*)dest)->buffer = NULL; |
1353 | 0 | break; |
1354 | 0 | case GF_SG_VRML_SFURL: |
1355 | 0 | if ( ((SFURL *)dest)->url ) gf_free( ((SFURL *)dest)->url ); |
1356 | 0 | ((SFURL *)dest)->OD_ID = ((SFURL *)orig)->OD_ID; |
1357 | 0 | if (((SFURL *)orig)->url) |
1358 | 0 | ((SFURL *)dest)->url = gf_strdup(((SFURL *)orig)->url); |
1359 | 0 | else |
1360 | 0 | ((SFURL *)dest)->url = NULL; |
1361 | 0 | break; |
1362 | 0 | case GF_SG_VRML_SFIMAGE: |
1363 | 0 | if (((SFImage *)dest)->pixels) gf_free(((SFImage *)dest)->pixels); |
1364 | 0 | ((SFImage *)dest)->width = ((SFImage *)orig)->width; |
1365 | 0 | ((SFImage *)dest)->height = ((SFImage *)orig)->height; |
1366 | 0 | ((SFImage *)dest)->numComponents = ((SFImage *)orig)->numComponents; |
1367 | 0 | size = ((SFImage *)dest)->width * ((SFImage *)dest)->height * ((SFImage *)dest)->numComponents; |
1368 | 0 | ((SFImage *)dest)->pixels = (u8*)gf_malloc(sizeof(char)*size); |
1369 | 0 | memcpy(((SFImage *)dest)->pixels, ((SFImage *)orig)->pixels, sizeof(char)*size); |
1370 | 0 | break; |
1371 | 0 | case GF_SG_VRML_SFCOMMANDBUFFER: |
1372 | 0 | { |
1373 | 0 | SFCommandBuffer *cb_dst = (SFCommandBuffer *)dest; |
1374 | 0 | SFCommandBuffer *cb_src = (SFCommandBuffer *)orig; |
1375 | |
|
1376 | 0 | cb_dst->bufferSize = cb_src->bufferSize; |
1377 | 0 | if (cb_dst->bufferSize && !gf_list_count(cb_src->commandList) ) { |
1378 | 0 | cb_dst->buffer = (u8*)gf_realloc(cb_dst->buffer, sizeof(char)*cb_dst->bufferSize); |
1379 | 0 | memcpy(cb_dst->buffer, cb_src->buffer, sizeof(char)*cb_src->bufferSize); |
1380 | 0 | } else { |
1381 | 0 | u32 j, c2; |
1382 | 0 | if (cb_dst->buffer) gf_free(cb_dst->buffer); |
1383 | 0 | cb_dst->buffer = NULL; |
1384 | | /*clone command list*/ |
1385 | 0 | c2 = gf_list_count(cb_src->commandList); |
1386 | 0 | for (j=0; j<c2; j++) { |
1387 | 0 | GF_Command *sub_com = (GF_Command *)gf_list_get(cb_src->commandList, j); |
1388 | 0 | GF_Command *new_com = gf_sg_vrml_command_clone(sub_com, inScene, 0); |
1389 | 0 | gf_list_add(cb_dst->commandList, new_com); |
1390 | 0 | } |
1391 | 0 | } |
1392 | 0 | } |
1393 | 0 | break; |
1394 | | |
1395 | | /*simply copy text string*/ |
1396 | 0 | case GF_SG_VRML_SFSCRIPT: |
1397 | 0 | if (((SFScript*)dest)->script_text) gf_free(((SFScript*)dest)->script_text); |
1398 | 0 | ((SFScript*)dest)->script_text = NULL; |
1399 | 0 | if ( ((SFScript*)orig)->script_text) |
1400 | 0 | ((SFScript *)dest)->script_text = (char *)gf_strdup( (char*) ((SFScript*)orig)->script_text ); |
1401 | 0 | break; |
1402 | | |
1403 | | |
1404 | | //simple MFFields, do a memcpy |
1405 | 0 | case GF_SG_VRML_MFBOOL: |
1406 | 0 | case GF_SG_VRML_MFFLOAT: |
1407 | 0 | case GF_SG_VRML_MFTIME: |
1408 | 0 | case GF_SG_VRML_MFINT32: |
1409 | 0 | case GF_SG_VRML_MFVEC3F: |
1410 | 0 | case GF_SG_VRML_MFVEC2F: |
1411 | 0 | case GF_SG_VRML_MFCOLOR: |
1412 | 0 | case GF_SG_VRML_MFROTATION: |
1413 | 0 | case GF_SG_VRML_MFATTRREF: |
1414 | 0 | size = gf_sg_vrml_get_sf_size(field_type) * ((GenMFField *)orig)->count; |
1415 | 0 | if (((GenMFField *)orig)->count != ((GenMFField *)dest)->count) { |
1416 | 0 | ((GenMFField *)dest)->array = gf_realloc(((GenMFField *)dest)->array, size); |
1417 | 0 | ((GenMFField *)dest)->count = ((GenMFField *)orig)->count; |
1418 | 0 | } |
1419 | 0 | if (size) |
1420 | 0 | memcpy(((GenMFField *)dest)->array, ((GenMFField *)orig)->array, size); |
1421 | 0 | break; |
1422 | | //complex MFFields |
1423 | 0 | case GF_SG_VRML_MFSTRING: |
1424 | 0 | case GF_SG_VRML_MFIMAGE: |
1425 | 0 | case GF_SG_VRML_MFURL: |
1426 | 0 | case GF_SG_VRML_MFSCRIPT: |
1427 | 0 | size = ((GenMFField *)orig)->count; |
1428 | 0 | gf_sg_vrml_mf_reset(dest, field_type); |
1429 | 0 | gf_sg_vrml_mf_alloc(dest, field_type, size); |
1430 | 0 | sf_type = gf_sg_vrml_get_sf_type(field_type); |
1431 | | //duplicate all items |
1432 | 0 | for (i=0; i<size; i++) { |
1433 | 0 | gf_sg_vrml_mf_get_item(dest, field_type, &dst_field, i); |
1434 | 0 | gf_sg_vrml_mf_get_item(orig, field_type, &orig_field, i); |
1435 | 0 | gf_sg_vrml_field_copy(dst_field, orig_field, sf_type); |
1436 | 0 | } |
1437 | 0 | break; |
1438 | 0 | } |
1439 | 0 | } |
1440 | | |
1441 | | GF_EXPORT |
1442 | | void gf_sg_vrml_field_copy(void *dest, void *orig, u32 field_type) |
1443 | 0 | { |
1444 | 0 | gf_sg_vrml_field_clone(dest, orig, field_type, NULL); |
1445 | 0 | } |
1446 | | |
1447 | | GF_EXPORT |
1448 | | Bool gf_sg_vrml_field_equal(void *dest, void *orig, u32 field_type) |
1449 | 0 | { |
1450 | 0 | u32 size, i, sf_type; |
1451 | 0 | void *dst_field, *orig_field; |
1452 | 0 | Bool changed = 0; |
1453 | |
|
1454 | 0 | if (!dest || !orig) return 0; |
1455 | | |
1456 | 0 | switch (field_type) { |
1457 | 0 | case GF_SG_VRML_SFBOOL: |
1458 | 0 | changed = memcmp(dest, orig, sizeof(SFBool)); |
1459 | 0 | break; |
1460 | 0 | case GF_SG_VRML_SFCOLOR: |
1461 | 0 | if (((SFColor *)dest)->red != ((SFColor *)orig)->red) changed = 1; |
1462 | 0 | else if (((SFColor *)dest)->green != ((SFColor *)orig)->green) changed = 1; |
1463 | 0 | else if (((SFColor *)dest)->blue != ((SFColor *)orig)->blue) changed = 1; |
1464 | 0 | break; |
1465 | 0 | case GF_SG_VRML_SFFLOAT: |
1466 | 0 | if ( (*(SFFloat *)dest) != (*(SFFloat *)orig) ) changed = 1; |
1467 | 0 | break; |
1468 | 0 | case GF_SG_VRML_SFINT32: |
1469 | 0 | changed = memcmp(dest, orig, sizeof(SFInt32)); |
1470 | 0 | break; |
1471 | 0 | case GF_SG_VRML_SFROTATION: |
1472 | 0 | if (((SFRotation *)dest)->x != ((SFRotation *)orig)->x) changed = 1; |
1473 | 0 | else if (((SFRotation *)dest)->y != ((SFRotation *)orig)->y) changed = 1; |
1474 | 0 | else if (((SFRotation *)dest)->z != ((SFRotation *)orig)->z) changed = 1; |
1475 | 0 | else if (((SFRotation *)dest)->q != ((SFRotation *)orig)->q) changed = 1; |
1476 | 0 | break; |
1477 | 0 | case GF_SG_VRML_SFTIME: |
1478 | 0 | if ( (*(SFTime *)dest) != (*(SFTime*)orig) ) changed = 1; |
1479 | 0 | break; |
1480 | 0 | case GF_SG_VRML_SFVEC2F: |
1481 | 0 | if (((SFVec2f *)dest)->x != ((SFVec2f *)orig)->x) changed = 1; |
1482 | 0 | else if (((SFVec2f *)dest)->y != ((SFVec2f *)orig)->y) changed = 1; |
1483 | 0 | break; |
1484 | 0 | case GF_SG_VRML_SFVEC3F: |
1485 | 0 | if (((SFVec3f *)dest)->x != ((SFVec3f *)orig)->x) changed = 1; |
1486 | 0 | else if (((SFVec3f *)dest)->y != ((SFVec3f *)orig)->y) changed = 1; |
1487 | 0 | else if (((SFVec3f *)dest)->z != ((SFVec3f *)orig)->z) changed = 1; |
1488 | 0 | break; |
1489 | 0 | case GF_SG_VRML_SFSTRING: |
1490 | 0 | if ( ((SFString*)dest)->buffer && ((SFString*)orig)->buffer) { |
1491 | 0 | changed = strcmp(((SFString*)dest)->buffer, ((SFString*)orig)->buffer); |
1492 | 0 | } else { |
1493 | 0 | changed = ( !((SFString*)dest)->buffer && !((SFString*)orig)->buffer) ? 0 : 1; |
1494 | 0 | } |
1495 | 0 | break; |
1496 | 0 | case GF_SG_VRML_SFURL: |
1497 | 0 | if (((SFURL *)dest)->OD_ID > 0 || ((SFURL *)orig)->OD_ID > 0) { |
1498 | 0 | if ( ((SFURL *)orig)->OD_ID != ((SFURL *)dest)->OD_ID) changed = 1; |
1499 | 0 | } else { |
1500 | 0 | if ( ((SFURL *)orig)->url && ! ((SFURL *)dest)->url) changed = 1; |
1501 | 0 | else if ( ! ((SFURL *)orig)->url && ((SFURL *)dest)->url) changed = 1; |
1502 | 0 | else if ( ((SFURL *)orig)->url && ((SFURL *)dest)->url && strcmp( ((SFURL *)orig)->url , ((SFURL *)dest)->url) ) changed = 1; |
1503 | 0 | } |
1504 | 0 | break; |
1505 | 0 | case GF_SG_VRML_SFIMAGE: |
1506 | 0 | case GF_SG_VRML_SFATTRREF: |
1507 | 0 | case GF_SG_VRML_SFSCRIPT: |
1508 | 0 | case GF_SG_VRML_SFCOMMANDBUFFER: |
1509 | 0 | changed = 1; |
1510 | 0 | break; |
1511 | | |
1512 | | //MFFields |
1513 | 0 | case GF_SG_VRML_MFATTRREF: |
1514 | 0 | changed = 1; |
1515 | 0 | break; |
1516 | 0 | case GF_SG_VRML_MFBOOL: |
1517 | 0 | case GF_SG_VRML_MFFLOAT: |
1518 | 0 | case GF_SG_VRML_MFTIME: |
1519 | 0 | case GF_SG_VRML_MFINT32: |
1520 | 0 | case GF_SG_VRML_MFSTRING: |
1521 | 0 | case GF_SG_VRML_MFVEC3F: |
1522 | 0 | case GF_SG_VRML_MFVEC2F: |
1523 | 0 | case GF_SG_VRML_MFCOLOR: |
1524 | 0 | case GF_SG_VRML_MFROTATION: |
1525 | 0 | case GF_SG_VRML_MFIMAGE: |
1526 | 0 | case GF_SG_VRML_MFURL: |
1527 | 0 | case GF_SG_VRML_MFSCRIPT: |
1528 | 0 | if ( ((GenMFField *)orig)->count != ((GenMFField *)dest)->count) changed = 1; |
1529 | 0 | else { |
1530 | 0 | size = ((GenMFField *)orig)->count; |
1531 | 0 | sf_type = gf_sg_vrml_get_sf_type(field_type); |
1532 | 0 | for (i=0; i<size; i++) { |
1533 | 0 | gf_sg_vrml_mf_get_item(dest, field_type, &dst_field, i); |
1534 | 0 | gf_sg_vrml_mf_get_item(orig, field_type, &orig_field, i); |
1535 | 0 | if (! gf_sg_vrml_field_equal(dst_field, orig_field, sf_type) ) { |
1536 | 0 | changed = 1; |
1537 | 0 | break; |
1538 | 0 | } |
1539 | 0 | } |
1540 | 0 | } |
1541 | 0 | break; |
1542 | 0 | } |
1543 | 0 | return changed ? 0 : 1; |
1544 | 0 | } |
1545 | | |
1546 | | |
1547 | | |
1548 | | GF_EXPORT |
1549 | | SFColorRGBA gf_sg_sfcolor_to_rgba(SFColor val) |
1550 | 0 | { |
1551 | 0 | SFColorRGBA res; |
1552 | 0 | res.alpha = FIX_ONE; |
1553 | 0 | res.red = val.red; |
1554 | 0 | res.green = val.green; |
1555 | 0 | res.blue = val.blue; |
1556 | 0 | return res; |
1557 | 0 | } |
1558 | | |
1559 | | |
1560 | | GF_EXPORT |
1561 | | u32 gf_node_get_num_fields_in_mode(GF_Node *Node, u8 IndexMode) |
1562 | 0 | { |
1563 | 0 | assert(Node); |
1564 | 0 | if (Node->sgprivate->tag == TAG_ProtoNode) return gf_sg_proto_get_num_fields(Node, IndexMode); |
1565 | 0 | else if (Node->sgprivate->tag == TAG_MPEG4_Script) |
1566 | 0 | return gf_sg_script_get_num_fields(Node, IndexMode); |
1567 | 0 | #ifndef GPAC_DISABLE_X3D |
1568 | 0 | else if (Node->sgprivate->tag == TAG_X3D_Script) |
1569 | 0 | return gf_sg_script_get_num_fields(Node, IndexMode); |
1570 | 0 | #endif |
1571 | 0 | else if (Node->sgprivate->tag <= GF_NODE_RANGE_LAST_MPEG4) return gf_sg_mpeg4_node_get_field_count(Node, IndexMode); |
1572 | 0 | #ifndef GPAC_DISABLE_X3D |
1573 | 0 | else if (Node->sgprivate->tag <= GF_NODE_RANGE_LAST_X3D) return gf_sg_x3d_node_get_field_count(Node); |
1574 | 0 | #endif |
1575 | 0 | else return 0; |
1576 | 0 | } |
1577 | | |
1578 | | |
1579 | | |
1580 | | /*all our internally handled nodes*/ |
1581 | | Bool InitColorInterpolator(M_ColorInterpolator *node); |
1582 | | Bool InitCoordinateInterpolator2D(M_CoordinateInterpolator2D *node); |
1583 | | Bool InitCoordinateInterpolator(M_CoordinateInterpolator *n); |
1584 | | Bool InitNormalInterpolator(M_NormalInterpolator *n); |
1585 | | Bool InitPositionInterpolator2D(M_PositionInterpolator2D *node); |
1586 | | Bool InitPositionInterpolator(M_PositionInterpolator *node); |
1587 | | Bool InitScalarInterpolator(M_ScalarInterpolator *node); |
1588 | | Bool InitOrientationInterpolator(M_OrientationInterpolator *node); |
1589 | | Bool InitValuator(M_Valuator *node); |
1590 | | Bool InitCoordinateInterpolator4D(M_CoordinateInterpolator4D *node); |
1591 | | Bool InitPositionInterpolator4D(M_PositionInterpolator4D *node); |
1592 | | |
1593 | | void PA_Init(GF_Node *n); |
1594 | | void PA_Modified(GF_Node *n, GF_FieldInfo *field); |
1595 | | void PA2D_Init(GF_Node *n); |
1596 | | void PA2D_Modified(GF_Node *n, GF_FieldInfo *field); |
1597 | | void SA_Init(GF_Node *n); |
1598 | | void SA_Modified(GF_Node *n, GF_FieldInfo *field); |
1599 | | /*X3D tools*/ |
1600 | | void InitBooleanFilter(GF_Node *n); |
1601 | | void InitBooleanSequencer(GF_Node *n); |
1602 | | void InitBooleanToggle(GF_Node *n); |
1603 | | void InitBooleanTrigger(GF_Node *n); |
1604 | | void InitIntegerSequencer(GF_Node *n); |
1605 | | void InitIntegerTrigger(GF_Node *n); |
1606 | | void InitTimeTrigger(GF_Node *n); |
1607 | | |
1608 | | Bool gf_sg_vrml_node_init(GF_Node *node) |
1609 | 0 | { |
1610 | 0 | switch (node->sgprivate->tag) { |
1611 | 0 | case TAG_MPEG4_ColorInterpolator: |
1612 | 0 | #ifndef GPAC_DISABLE_X3D |
1613 | 0 | case TAG_X3D_ColorInterpolator: |
1614 | 0 | #endif |
1615 | 0 | return InitColorInterpolator((M_ColorInterpolator *)node); |
1616 | 0 | case TAG_MPEG4_CoordinateInterpolator: |
1617 | 0 | #ifndef GPAC_DISABLE_X3D |
1618 | 0 | case TAG_X3D_CoordinateInterpolator: |
1619 | 0 | #endif |
1620 | 0 | return InitCoordinateInterpolator((M_CoordinateInterpolator *)node); |
1621 | 0 | case TAG_MPEG4_CoordinateInterpolator2D: |
1622 | 0 | return InitCoordinateInterpolator2D((M_CoordinateInterpolator2D *)node); |
1623 | 0 | case TAG_MPEG4_NormalInterpolator: |
1624 | 0 | #ifndef GPAC_DISABLE_X3D |
1625 | 0 | case TAG_X3D_NormalInterpolator: |
1626 | 0 | #endif |
1627 | 0 | return InitNormalInterpolator((M_NormalInterpolator*)node); |
1628 | 0 | case TAG_MPEG4_OrientationInterpolator: |
1629 | 0 | #ifndef GPAC_DISABLE_X3D |
1630 | 0 | case TAG_X3D_OrientationInterpolator: |
1631 | 0 | #endif |
1632 | 0 | return InitOrientationInterpolator((M_OrientationInterpolator*)node); |
1633 | 0 | case TAG_MPEG4_PositionInterpolator: |
1634 | 0 | #ifndef GPAC_DISABLE_X3D |
1635 | 0 | case TAG_X3D_PositionInterpolator: |
1636 | 0 | #endif |
1637 | 0 | return InitPositionInterpolator((M_PositionInterpolator *)node); |
1638 | 0 | case TAG_MPEG4_PositionInterpolator2D: |
1639 | 0 | #ifndef GPAC_DISABLE_X3D |
1640 | 0 | case TAG_X3D_PositionInterpolator2D: |
1641 | 0 | #endif |
1642 | 0 | return InitPositionInterpolator2D((M_PositionInterpolator2D *)node); |
1643 | 0 | case TAG_MPEG4_ScalarInterpolator: |
1644 | 0 | #ifndef GPAC_DISABLE_X3D |
1645 | 0 | case TAG_X3D_ScalarInterpolator: |
1646 | 0 | #endif |
1647 | 0 | return InitScalarInterpolator((M_ScalarInterpolator *)node); |
1648 | 0 | case TAG_MPEG4_Valuator: |
1649 | 0 | return InitValuator((M_Valuator *)node); |
1650 | 0 | case TAG_MPEG4_PositionAnimator: |
1651 | 0 | PA_Init(node); |
1652 | 0 | return 1; |
1653 | 0 | case TAG_MPEG4_PositionAnimator2D: |
1654 | 0 | PA2D_Init(node); |
1655 | 0 | return 1; |
1656 | 0 | case TAG_MPEG4_ScalarAnimator: |
1657 | 0 | SA_Init(node); |
1658 | 0 | return 1; |
1659 | 0 | case TAG_MPEG4_PositionInterpolator4D: |
1660 | 0 | return InitPositionInterpolator4D((M_PositionInterpolator4D *)node); |
1661 | 0 | case TAG_MPEG4_CoordinateInterpolator4D: |
1662 | 0 | return InitCoordinateInterpolator4D((M_CoordinateInterpolator4D *)node); |
1663 | 0 | case TAG_MPEG4_Script: |
1664 | 0 | #ifndef GPAC_DISABLE_X3D |
1665 | 0 | case TAG_X3D_Script: |
1666 | 0 | #endif |
1667 | 0 | return 1; |
1668 | | |
1669 | 0 | #ifndef GPAC_DISABLE_X3D |
1670 | 0 | case TAG_X3D_BooleanFilter: |
1671 | 0 | InitBooleanFilter(node); |
1672 | 0 | return 1; |
1673 | 0 | case TAG_X3D_BooleanSequencer: |
1674 | 0 | InitBooleanSequencer(node); |
1675 | 0 | return 1; |
1676 | 0 | case TAG_X3D_BooleanToggle: |
1677 | 0 | InitBooleanToggle(node); |
1678 | 0 | return 1; |
1679 | 0 | case TAG_X3D_BooleanTrigger: |
1680 | 0 | InitBooleanTrigger(node); |
1681 | 0 | return 1; |
1682 | 0 | case TAG_X3D_IntegerSequencer: |
1683 | 0 | InitIntegerSequencer(node); |
1684 | 0 | return 1; |
1685 | 0 | case TAG_X3D_IntegerTrigger: |
1686 | 0 | InitIntegerTrigger(node); |
1687 | 0 | return 1; |
1688 | 0 | case TAG_X3D_TimeTrigger: |
1689 | 0 | InitTimeTrigger(node); |
1690 | 0 | return 1; |
1691 | 0 | #endif |
1692 | 0 | } |
1693 | 0 | return 0; |
1694 | 0 | } |
1695 | | |
1696 | | Bool gf_sg_vrml_node_changed(GF_Node *node, GF_FieldInfo *field) |
1697 | 0 | { |
1698 | 0 | switch (node->sgprivate->tag) { |
1699 | 0 | case TAG_ProtoNode: |
1700 | | /*hardcoded protos need modification notifs*/ |
1701 | 0 | if (node->sgprivate->UserCallback) return 0; |
1702 | 0 | case TAG_MPEG4_ColorInterpolator: |
1703 | 0 | case TAG_MPEG4_CoordinateInterpolator: |
1704 | 0 | case TAG_MPEG4_CoordinateInterpolator2D: |
1705 | 0 | case TAG_MPEG4_NormalInterpolator: |
1706 | 0 | case TAG_MPEG4_OrientationInterpolator: |
1707 | 0 | case TAG_MPEG4_PositionInterpolator: |
1708 | 0 | case TAG_MPEG4_PositionInterpolator2D: |
1709 | 0 | case TAG_MPEG4_ScalarInterpolator: |
1710 | 0 | case TAG_MPEG4_Valuator: |
1711 | 0 | case TAG_MPEG4_PositionInterpolator4D: |
1712 | 0 | case TAG_MPEG4_CoordinateInterpolator4D: |
1713 | 0 | case TAG_MPEG4_Script: |
1714 | 0 | #ifndef GPAC_DISABLE_X3D |
1715 | 0 | case TAG_X3D_ColorInterpolator: |
1716 | 0 | case TAG_X3D_CoordinateInterpolator: |
1717 | 0 | case TAG_X3D_NormalInterpolator: |
1718 | 0 | case TAG_X3D_OrientationInterpolator: |
1719 | 0 | case TAG_X3D_PositionInterpolator: |
1720 | 0 | case TAG_X3D_ScalarInterpolator: |
1721 | 0 | case TAG_X3D_Script: |
1722 | 0 | case TAG_X3D_BooleanFilter: |
1723 | 0 | case TAG_X3D_BooleanSequencer: |
1724 | 0 | case TAG_X3D_BooleanToggle: |
1725 | 0 | case TAG_X3D_BooleanTrigger: |
1726 | 0 | case TAG_X3D_IntegerSequencer: |
1727 | 0 | case TAG_X3D_IntegerTrigger: |
1728 | 0 | case TAG_X3D_TimeTrigger: |
1729 | 0 | #endif |
1730 | 0 | return 1; |
1731 | 0 | case TAG_MPEG4_PositionAnimator: |
1732 | 0 | PA_Modified(node, field); |
1733 | 0 | return 1; |
1734 | 0 | case TAG_MPEG4_PositionAnimator2D: |
1735 | 0 | PA2D_Modified(node, field); |
1736 | 0 | return 1; |
1737 | 0 | case TAG_MPEG4_ScalarAnimator: |
1738 | 0 | SA_Modified(node, field); |
1739 | 0 | return 1; |
1740 | 0 | } |
1741 | 0 | return 0; |
1742 | 0 | } |
1743 | | |
1744 | | #if 0 //unused |
1745 | | char *gf_node_vrml_dump_attribute(GF_Node *n, GF_FieldInfo *info) |
1746 | | { |
1747 | | char szVal[1024]; |
1748 | | |
1749 | | switch (info->fieldType) { |
1750 | | case GF_SG_VRML_SFBOOL: |
1751 | | strcpy(szVal, *((SFBool*)info->far_ptr) ? "TRUE" : "FALSE"); |
1752 | | return gf_strdup(szVal); |
1753 | | case GF_SG_VRML_SFINT32: |
1754 | | sprintf(szVal, "%d", *((SFInt32*)info->far_ptr) ); |
1755 | | return gf_strdup(szVal); |
1756 | | case GF_SG_VRML_SFFLOAT: |
1757 | | sprintf(szVal, "%g", FIX2FLT( *((SFFloat*)info->far_ptr) ) ); |
1758 | | return gf_strdup(szVal); |
1759 | | case GF_SG_VRML_SFDOUBLE: |
1760 | | sprintf(szVal, "%g", *((SFDouble *)info->far_ptr) ); |
1761 | | return gf_strdup(szVal); |
1762 | | case GF_SG_VRML_SFTIME: |
1763 | | sprintf(szVal, "%g", *((SFTime *)info->far_ptr) ); |
1764 | | return gf_strdup(szVal); |
1765 | | case GF_SG_VRML_SFVEC2F: |
1766 | | sprintf(szVal, "%g %g", FIX2FLT(((SFVec2f *)info->far_ptr)->x), FIX2FLT( ((SFVec2f *)info->far_ptr)->y) ); |
1767 | | return gf_strdup(szVal); |
1768 | | case GF_SG_VRML_SFVEC2D: |
1769 | | sprintf(szVal, "%g %g", ((SFVec2d *)info->far_ptr)->x, ((SFVec2d *)info->far_ptr)->y); |
1770 | | return gf_strdup(szVal); |
1771 | | case GF_SG_VRML_SFVEC3F: |
1772 | | sprintf(szVal, "%g %g %g", FIX2FLT(((SFVec3f *)info->far_ptr)->x), FIX2FLT( ((SFVec3f *)info->far_ptr)->y) , FIX2FLT( ((SFVec3f *)info->far_ptr)->z) ); |
1773 | | return gf_strdup(szVal); |
1774 | | case GF_SG_VRML_SFVEC3D: |
1775 | | sprintf(szVal, "%g %g %g", ((SFVec3d *)info->far_ptr)->x, ((SFVec3d *)info->far_ptr)->y, ((SFVec3d *)info->far_ptr)->z); |
1776 | | return gf_strdup(szVal); |
1777 | | case GF_SG_VRML_SFCOLOR: |
1778 | | sprintf(szVal, "%g %g %g", FIX2FLT(((SFColor *)info->far_ptr)->red), FIX2FLT( ((SFColor *)info->far_ptr)->green) , FIX2FLT( ((SFColor *)info->far_ptr)->blue) ); |
1779 | | return gf_strdup(szVal); |
1780 | | case GF_SG_VRML_SFCOLORRGBA: |
1781 | | sprintf(szVal, "%g %g %g %g", FIX2FLT(((SFColorRGBA *)info->far_ptr)->red), FIX2FLT( ((SFColorRGBA*)info->far_ptr)->green) , FIX2FLT( ((SFColorRGBA*)info->far_ptr)->blue) , FIX2FLT( ((SFColorRGBA*)info->far_ptr)->alpha) ); |
1782 | | return gf_strdup(szVal); |
1783 | | case GF_SG_VRML_SFROTATION: |
1784 | | sprintf(szVal, "%g %g %g %g", FIX2FLT(((SFRotation *)info->far_ptr)->x), FIX2FLT( ((SFRotation *)info->far_ptr)->y) , FIX2FLT( ((SFRotation *)info->far_ptr)->z), FIX2FLT( ((SFRotation *)info->far_ptr)->q) ); |
1785 | | return gf_strdup(szVal); |
1786 | | case GF_SG_VRML_SFSTRING: |
1787 | | if (!((SFString*)info->far_ptr)->buffer ) return gf_strdup(""); |
1788 | | return gf_strdup( ((SFString*)info->far_ptr)->buffer ); |
1789 | | |
1790 | | case GF_SG_VRML_SFURL: |
1791 | | if (((SFURL *)info->far_ptr)->url) { |
1792 | | return gf_strdup( ((SFURL *)info->far_ptr)->url ); |
1793 | | } else { |
1794 | | sprintf(szVal, "od://%d", ((SFURL *)info->far_ptr)->OD_ID); |
1795 | | return gf_strdup(szVal); |
1796 | | } |
1797 | | |
1798 | | case GF_SG_VRML_SFIMAGE: |
1799 | | { |
1800 | | u32 i, count; |
1801 | | char *buf; |
1802 | | SFImage *img = (SFImage *)info->far_ptr; |
1803 | | |
1804 | | count = img->width * img->height * img->numComponents; |
1805 | | i = (3/*' 0x'*/ + 2/*%02X*/*img->numComponents)*count + 20; |
1806 | | buf = gf_malloc(sizeof(char) * i); |
1807 | | |
1808 | | sprintf(buf , "%d %d %d", img->width, img->height, img->numComponents); |
1809 | | |
1810 | | for (i=0; i<count; ) { |
1811 | | switch (img->numComponents) { |
1812 | | case 1: |
1813 | | sprintf(szVal, " 0x%02X", img->pixels[i]); |
1814 | | i++; |
1815 | | break; |
1816 | | case 2: |
1817 | | sprintf(szVal, " 0x%02X%02X", img->pixels[i], img->pixels[i+1]); |
1818 | | i+=2; |
1819 | | break; |
1820 | | case 3: |
1821 | | sprintf(szVal, " 0x%02X%02X%02X", img->pixels[i], img->pixels[i+1], img->pixels[i+2]); |
1822 | | i+=3; |
1823 | | break; |
1824 | | case 4: |
1825 | | sprintf(szVal, " 0x%02X%02X%02X%02X", img->pixels[i], img->pixels[i+1], img->pixels[i+2], img->pixels[i+3]); |
1826 | | i+=4; |
1827 | | break; |
1828 | | } |
1829 | | strcat(buf, szVal); |
1830 | | } |
1831 | | return buf; |
1832 | | } |
1833 | | default: |
1834 | | break; |
1835 | | } |
1836 | | /*todo - dump MFFields*/ |
1837 | | return NULL; |
1838 | | } |
1839 | | #endif |
1840 | | |
1841 | | |
1842 | | #endif /*GPAC_DISABLE_VRML*/ |
1843 | | |
1844 | | Bool gf_node_in_table(GF_Node *node, u32 NDTType) |
1845 | 0 | { |
1846 | 0 | #ifndef GPAC_DISABLE_VRML |
1847 | 0 | u32 tag = node ? node->sgprivate->tag : 0; |
1848 | 0 | if (tag==TAG_ProtoNode) { |
1849 | 0 | tag = gf_sg_proto_get_root_tag(((GF_ProtoInstance *)node)->proto_interface); |
1850 | 0 | if (tag==TAG_UndefinedNode) return 1; |
1851 | 0 | } |
1852 | 0 | return gf_node_in_table_by_tag(tag, NDTType); |
1853 | | #else |
1854 | | return 1; |
1855 | | #endif |
1856 | 0 | } |