30
30
/*X3D tags (for internal nodes)*/
31
31
#include <gpac/nodes_x3d.h>
35
#include "../LASeR/m4_laser_dev.h"
39
33
static void ReplaceDEFNode(GF_Node *FromNode, u32 NodeID, GF_Node *newNode, Bool updateOrderedGroup);
35
#ifndef GPAC_DISABLE_SVG
36
static void ReplaceIRINode(GF_Node *FromNode, GF_Node *oldNode, GF_Node *newNode);
42
40
#define DEFAULT_MAX_CYCLIC_RENDER 30
170
176
else if (info.fieldType==GF_SG_VRML_MFNODE) {
171
177
mflist = *(GF_List **) info.far_ptr;
172
for (j=0; j<gf_list_count(mflist); j++) {
173
n = gf_list_get(mflist, j);
179
while ((n = gf_list_enum(mflist, &j))) {
174
180
if (n->sgprivate->scenegraph==sg) {
175
181
gf_node_unregister(n, node);
176
183
gf_list_rem(mflist, j);
179
185
SG_GraphRemoved(n, sg);
212
230
/*WATCHOUT: we may have cyclic dependencies due to
213
231
1- a node referencing itself (forbidden in VRML)
214
232
2- nodes refered to in commands of conditionals children of this node (MPEG-4 is mute about that)
233
we recursively preocess from last declared DEF node to first one
216
for (i=0; i<sg->node_reg_size; i++) {
217
GF_Node *node = sg->node_registry[i];
236
for (i=sg->node_reg_size; i>0; i--) {
238
GF_Node *node = sg->node_registry[i-1];
218
241
/*first replace all instances in parents by NULL WITHOUT UNREGISTERING (to avoid destroying the node).
219
242
This will take care of nodes referencing themselves*/
220
243
#ifdef GF_ARRAY_PARENT_NODES
222
for (j=0; j<gf_list_count(node->sgprivate->parentNodes); j++) {
245
type = node->sgprivate->tag;
246
#ifndef GPAC_DISABLE_SVG
247
if ((type>= GF_NODE_RANGE_FIRST_SVG) && (type<= GF_NODE_RANGE_LAST_SVG)) type = 1;
251
count = gf_list_count(node->sgprivate->parentNodes);
252
for (j=0; j<count; j++) {
223
253
GF_Node *par = gf_list_get(node->sgprivate->parentNodes, j);
224
ReplaceDEFNode(par, node->sgprivate->NodeID, NULL, 0);
254
if ((par != node) && (SG_SearchForNode(sg, par) != NULL)) {
259
#ifndef GPAC_DISABLE_SVG
261
ReplaceIRINode(par, node->sgprivate->NodeID, NULL);
264
ReplaceDEFNode(par, node->sgprivate->NodeID, NULL, 0);
267
if (ignore) continue;
226
269
/*then we remove the node from the registry and destroy it. This will take
227
270
care of conditional case as we perform special checking when destroying commands*/
228
271
gf_list_reset(node->sgprivate->parentNodes);
230
274
GF_NodeList *nlist = node->sgprivate->parents;
275
type = node->sgprivate->tag;
276
#ifndef GPAC_DISABLE_SVG
277
if ((type>= GF_NODE_RANGE_FIRST_SVG) && (type<= GF_NODE_RANGE_LAST_SVG)) type = 1;
232
282
GF_NodeList *next = nlist->next;
233
ReplaceDEFNode(nlist->node, node->sgprivate->NodeID, NULL, 0);
283
if ((nlist->node!=node) && SG_SearchForNode(sg, nlist->node) != NULL) {
287
#ifndef GPAC_DISABLE_SVG
289
ReplaceIRINode(nlist->node, node, NULL);
292
ReplaceDEFNode(nlist->node, node->sgprivate->NodeID, NULL, 0);
298
node->sgprivate->parents = nlist;
237
302
node->sgprivate->parents = NULL;
239
sg->node_registry[i] = NULL;
305
//sg->node_registry[i-1] = NULL;
306
count = sg->node_reg_size;
307
node->sgprivate->num_instances = 1;
308
gf_node_unregister(node, NULL);
309
if (count != sg->node_reg_size) goto restart;
242
311
sg->node_reg_size = 0;
436
506
/*if def, remove from sg def table*/
437
507
if (pNode->sgprivate->NodeID) {
438
if (!SG_SearchForNodeIndex(pSG, pNode, &node_ind)) {
508
if (SG_SearchForNodeIndex(pSG, pNode, &node_ind)) {
509
assert (pNode == pSG->node_registry[node_ind]);
510
j = pSG->node_reg_size - node_ind - 1;
511
if (j) memmove( & pSG->node_registry[node_ind], & pSG->node_registry[node_ind+1], j * sizeof(GF_Node *));
512
pSG->node_reg_size -= 1;
441
assert (pNode == pSG->node_registry[node_ind]);
442
j = pSG->node_reg_size - node_ind - 1;
443
if (j) memmove( & pSG->node_registry[node_ind], & pSG->node_registry[node_ind+1], j * sizeof(GF_Node *));
444
pSG->node_reg_size -= 1;
447
518
/*check all routes from or to this node and destroy them - cf spec*/
448
for (j=0; j<gf_list_count(pSG->Routes); j++) {
449
GF_Route *r = gf_list_get(pSG->Routes, j);
520
while ((r = gf_list_enum(pSG->Routes, &j))) {
450
521
if ( (r->ToNode == pNode) || (r->FromNode == pNode)) {
451
522
gf_sg_route_del(r);
526
#if defined(GPAC_HAS_SPIDERMONKEY) && !defined(GPAC_DISABLE_SVG)
528
if (pSG->svg_js) pSG->svg_js->on_node_destroy(pSG, pNode);
456
531
/*delete the node*/
457
532
gf_node_del(pNode);
537
615
case GF_SG_VRML_MFNODE:
538
616
container = *(GF_List **) field.far_ptr;
539
for (j=0; j<gf_list_count(container); j++) {
540
p = gf_list_get(container, j);
618
while ((p = gf_list_enum(container, &j))) {
541
619
/*replace nodes different from newNode but with same ID*/
542
620
if ((newNode == p) || (gf_node_get_id(p) != NodeID)) continue;
544
623
gf_list_rem(container, j);
546
625
gf_list_insert(container, newNode, j);
562
641
gf_node_changed(FromNode, &field);
644
#ifndef GPAC_DISABLE_SVG
646
static void Replace_IRI(GF_SceneGraph *sg, GF_Node *old_node, GF_Node *newNode)
649
count = gf_list_count(sg->xlink_hrefs);
650
for (i=0; i<count; i++) {
651
SVG_IRI *iri = gf_list_get(sg->xlink_hrefs, i);
652
if (iri->target == (SVGElement *)old_node) {
653
iri->target = (SVGElement *)newNode;
655
gf_list_rem(sg->xlink_hrefs, i);
663
/*replace or remove node instance in the given node (eg in all IRI)*/
664
static void ReplaceIRINode(GF_Node *FromNode, GF_Node *old_node, GF_Node *newNode)
669
container = ((SVGElement *)FromNode)->children;
670
count = gf_list_count(container);
671
for (i=0; i<count; i++) {
672
GF_Node *p = gf_list_get(container, i);
673
if (old_node!=p) continue;
674
gf_list_rem(container, i);
675
if (newNode) gf_list_insert(container, newNode, i);
565
681
/*get all parents of the node and replace, the instance of the node and finally destroy the node*/
566
682
GF_Err gf_node_replace(GF_Node *node, GF_Node *new_node, Bool updateOrderedGroup)
569
685
Bool replace_root;
571
687
GF_SceneGraph *pSG = node->sgprivate->scenegraph;
573
689
/*if this is a proto its is registered in its parent graph, not the current*/
574
690
if (node == (GF_Node*)pSG->pOwningProto) pSG = pSG->parent_scene;
575
if (!SG_SearchForNodeIndex(pSG, node, &i)) return GF_BAD_PARAM;
576
assert(node == pSG->node_registry[i]);
691
// if (!SG_SearchForNodeIndex(pSG, node, &i)) return GF_BAD_PARAM;
692
// assert(node == pSG->node_registry[i]);
694
type = node->sgprivate->tag;
695
#ifndef GPAC_DISABLE_SVG
696
if ((type>= GF_NODE_RANGE_FIRST_SVG) && (type<= GF_NODE_RANGE_LAST_SVG)) {
698
Replace_IRI(pSG, node, new_node);
578
703
/*first check if this is the root node*/
579
704
replace_root = (node->sgprivate->scenegraph->RootNode == node) ? 1 : 0;
581
706
#ifdef GF_ARRAY_PARENT_NODES
582
while ( (i = gf_list_count(node->sgprivate->parentNodes)) ) {
707
while ( (u32 i = gf_list_count(node->sgprivate->parentNodes)) ) {
583
708
par = gf_list_get(node->sgprivate->parentNodes, 0);
584
ReplaceDEFNode(par, node->sgprivate->NodeID, new_node, updateOrderedGroup);
709
#ifndef GPAC_DISABLE_SVG
711
ReplaceIRINode(par, node, new_node, updateOrderedGroup);
714
ReplaceDEFNode(par, node->sgprivate->NodeID, new_node, updateOrderedGroup);
586
716
/*adds the parent to the new node*/
587
717
if (new_node) gf_node_register(new_node, par);
595
725
Bool do_break = node->sgprivate->parents->next ? 0 : 1;
596
726
par = node->sgprivate->parents->node;
598
ReplaceDEFNode(par, node->sgprivate->NodeID, new_node, updateOrderedGroup);
728
#ifndef GPAC_DISABLE_SVG
730
ReplaceIRINode(par, node, new_node);
733
ReplaceDEFNode(par, node->sgprivate->NodeID, new_node, updateOrderedGroup);
599
735
if (new_node) gf_node_register(new_node, par);
600
736
gf_node_unregister(node, par);
601
737
if (do_break) break;
738
GF_ParentNode *par = (GF_ParentNode *)node;
739
for (i=0; i<gf_list_count(par->children); i++) {
740
ptr = gf_list_get(par->children, i);
741
if (ptr) gf_node_render(ptr, renderStack);
875
if (!node->sgprivate) return;
877
par = (GF_ParentNode *)node;
879
while ((ptr = gf_list_enum(par->children, &i))) {
880
gf_node_render(ptr, renderStack);
882
1016
if (!node) return;
884
if (node->sgprivate->routes) {
885
assert(gf_list_count(node->sgprivate->routes)==0);
887
while (gf_list_count(node->sgprivate->routes)) {
888
GF_Route *r = gf_list_get(node->sgprivate->routes, 0);
889
gf_list_rem(node->sgprivate->routes, 0);
894
gf_list_del(node->sgprivate->routes);
895
node->sgprivate->routes = NULL;
1018
if (node->sgprivate->events) {
1019
/*true for VRML-based graphs, not true for SVG yet*/
1020
//assert(gf_list_count(node->sgprivate->events)==0);
1021
gf_list_del(node->sgprivate->events);
1022
node->sgprivate->events = NULL;
897
1024
if (node->sgprivate->PreDestroyNode) node->sgprivate->PreDestroyNode(node);
898
1025
#ifdef GF_ARRAY_PARENT_NODES
1021
1150
GF_SceneGraph *pSG = node->sgprivate->scenegraph;
1152
/*no user-defined init, consider the scenegraph is only used for parsing/encoding/decoding*/
1153
if (!pSG->UserNodeInit) return;
1024
1155
/*internal nodes*/
1025
1156
if (gf_sg_vrml_node_init(node)) return;
1157
#ifndef GPAC_DISABLE_SVG
1158
else if (gf_sg_svg_node_init(node)) return;
1026
1160
/*user defined init*/
1027
if (pSG->UserNodeInit) pSG->UserNodeInit(pSG->NodeInitCallback, node);
1161
else pSG->UserNodeInit(pSG->NodeInitCallback, node);
1065
1192
else if (node->sgprivate->tag<=GF_NODE_RANGE_LAST_MPEG4) gf_sg_mpeg4_node_del(node);
1066
1193
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_X3D) gf_sg_x3d_node_del(node);
1067
1194
#ifndef GPAC_DISABLE_SVG
1068
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_SVG) SVGElement_Del((SVGElement *) node);
1070
#ifdef GPAC_USE_LASeR
1071
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_LASER) LASeRNode_Del(node);
1195
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_SVG) {
1196
SVGElement *elt = (SVGElement *) node;
1197
if (elt->sgprivate->animations) gf_smil_anim_delete_animations(elt);
1198
if (elt->timing) gf_smil_timing_delete_runtime_info(elt);
1199
gf_svg_element_del(elt);
1073
1202
else gf_node_free(node);
1099
1227
else if (node->sgprivate->tag==TAG_ProtoNode) return ((GF_ProtoInstance*)node)->proto_name;
1100
1228
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_MPEG4) return gf_sg_mpeg4_node_get_class_name(node->sgprivate->tag);
1101
1229
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_X3D) return gf_sg_x3d_node_get_class_name(node->sgprivate->tag);
1102
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_SVG) return SVG_GetElementName(node->sgprivate->tag);
1103
#ifdef GPAC_USE_LASeR
1104
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_LASER) return LASeR_GetNodeName(node->sgprivate->tag);
1230
#ifndef GPAC_DISABLE_SVG
1231
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_SVG) return gf_svg_get_element_name(node->sgprivate->tag);
1106
1233
else return "UnsupportedNode";
1147
1271
return gf_sg_script_get_field(node, info);
1148
1272
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_MPEG4) return gf_sg_mpeg4_node_get_field(node, info);
1149
1273
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_X3D) return gf_sg_x3d_node_get_field(node, info);
1150
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_SVG) return SVG_GetAttributeInfo(node, info);
1151
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_LASER) return GF_NOT_SUPPORTED;
1274
#ifndef GPAC_DISABLE_SVG
1275
else if (node->sgprivate->tag <= GF_NODE_RANGE_LAST_SVG) return gf_svg_get_attribute_info(node, info);
1153
1278
return GF_NOT_SUPPORTED;
1156
/*LASeR specifc, to clean up!!*/
1157
u32 gf_node_get_active(GF_Node*p)
1281
u32 gf_node_get_num_instances(GF_Node *node)
1159
#ifdef GPAC_USE_LASeR
1160
return p->sgprivate->active;
1283
return node->sgprivate->num_instances;