Coverage Report

Created: 2024-02-11 06:48

/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-2023
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
  gf_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
    gf_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
    gf_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
  gf_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
}