📄 scene_dump.c
字号:
if (sdump->XMLDump) { if (sdump->X3DDump) { fprintf(sdump->trace, "<field name=\"%s\" type=\"%s\" accessType=\"%s\"", field.name, gf_sg_vrml_get_field_type_by_name(field.fieldType), gf_sg_vrml_get_event_type_name(field.eventType, 1)); } else { fprintf(sdump->trace, "<field name=\"%s\" type=\"%s\" vrml97Hint=\"%s\"", field.name, GetXMTFieldTypeName(field.fieldType), gf_sg_vrml_get_event_type_name(field.eventType, 0)); } if ((field.eventType == GF_SG_EVENT_FIELD) || (field.eventType == GF_SG_EVENT_EXPOSED_FIELD)) { if (field.fieldType == GF_SG_VRML_SFNODE) { if (!sdump->X3DDump) { fprintf(sdump->trace, ">\n"); sdump->indent++; fprintf(sdump->trace, "<node>"); DumpNode(sdump, field.far_ptr ? *(GF_Node **)field.far_ptr : NULL, 0, NULL); fprintf(sdump->trace, "</node>"); sdump->indent--; if (!has_sublist) fprintf(sdump->trace, "</field>\n"); } else { if (field.far_ptr) { fprintf(sdump->trace, ">\n"); DumpNode(sdump, *(GF_Node **)field.far_ptr, 0, NULL); fprintf(sdump->trace, "</field>\n"); } else { fprintf(sdump->trace, "/>\n"); } } DUMP_IND(sdump); } else { if (sdump->X3DDump) { fprintf(sdump->trace, " value=\""); } else { fprintf(sdump->trace, " %s=\"", GetXMTFieldTypeValueName(field.fieldType)); } DumpSFField(sdump, field.fieldType, field.far_ptr, 0); if (has_sublist) fprintf(sdump->trace, "\">\n"); else fprintf(sdump->trace, "\"/>\n"); } } else { fprintf(sdump->trace, "/>\n"); } } else { fprintf(sdump->trace, "%s %s %s", gf_sg_vrml_get_event_type_name(field.eventType, sdump->X3DDump), gf_sg_vrml_get_field_type_by_name(field.fieldType), field.name); if ((field.eventType==GF_SG_EVENT_FIELD) || (field.eventType==GF_SG_EVENT_EXPOSED_FIELD)) { fprintf(sdump->trace, " "); if (field.fieldType == GF_SG_VRML_SFNODE) { DumpNode(sdump, field.far_ptr ? *(GF_Node **)field.far_ptr : NULL, 0, NULL); } else { DumpFieldValue(sdump, field); } } fprintf(sdump->trace, "\n"); } } else { mffield = (GenMFField *) field.far_ptr; sf_type = gf_sg_vrml_get_sf_type(field.fieldType); DUMP_IND(sdump); if (!sdump->XMLDump) { fprintf(sdump->trace, "%s %s %s", gf_sg_vrml_get_event_type_name(field.eventType, sdump->X3DDump), gf_sg_vrml_get_field_type_by_name(field.fieldType), field.name); if ((field.eventType==GF_SG_EVENT_FIELD) || (field.eventType==GF_SG_EVENT_EXPOSED_FIELD)) { fprintf(sdump->trace, " ["); if (sf_type == GF_SG_VRML_SFNODE) { GF_ChildNodeItem *l = *(GF_ChildNodeItem **)field.far_ptr; fprintf(sdump->trace, "\n"); sdump->indent++; while (l) { DumpNode(sdump, l->node, 1, NULL); l = l->next; } sdump->indent--; DUMP_IND(sdump); } else { for (i=0; i<mffield->count; i++) { if (i) fprintf(sdump->trace, " "); if (field.fieldType != GF_SG_VRML_MFNODE) { gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &slot_ptr, i); DumpSFField(sdump, sf_type, slot_ptr, (mffield->count>1) ? 1 : 0); } } } fprintf(sdump->trace, "]"); } fprintf(sdump->trace, "\n"); } else { if (sdump->X3DDump) { fprintf(sdump->trace, "<field name=\"%s\" type=\"%s\" accessType=\"%s\"", field.name, gf_sg_vrml_get_field_type_by_name(field.fieldType), gf_sg_vrml_get_event_type_name(field.eventType, 1)); } else { fprintf(sdump->trace, "<field name=\"%s\" type=\"%s\" vrml97Hint=\"%s\"", field.name, GetXMTFieldTypeName(field.fieldType), gf_sg_vrml_get_event_type_name(field.eventType, 0)); } if ((field.eventType==GF_SG_EVENT_FIELD) || (field.eventType==GF_SG_EVENT_EXPOSED_FIELD)) { if (sf_type == GF_SG_VRML_SFNODE) { GF_ChildNodeItem *list = *(GF_ChildNodeItem **)field.far_ptr; fprintf(sdump->trace, ">\n"); sdump->indent++; if (!sdump->X3DDump) fprintf(sdump->trace, "<nodes>"); while (list) { DumpNode(sdump, list->node, 1, NULL); list = list->next; } if (!sdump->X3DDump) fprintf(sdump->trace, "</nodes>"); sdump->indent++; DUMP_IND(sdump); if (!has_sublist) fprintf(sdump->trace, "</field>\n"); } else { if (sdump->X3DDump) { fprintf(sdump->trace, " value=\""); } else { fprintf(sdump->trace, " %s=\"", GetXMTFieldTypeValueName(field.fieldType)); } for (i=0; i<mffield->count; i++) { if (i) fprintf(sdump->trace, " "); if (field.fieldType != GF_SG_VRML_MFNODE) { gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &slot_ptr, i); DumpSFField(sdump, sf_type, slot_ptr, (mffield->count>1) ? 1 : 0); } } if (has_sublist) fprintf(sdump->trace, "\">\n"); else fprintf(sdump->trace, "\"/>\n"); } } else { fprintf(sdump->trace, "/>\n"); } } }}/*field dumping for proto instance*/void DumpProtoField(GF_SceneDumper *sdump, GF_Node *node, GF_FieldInfo field){ GenMFField *mffield; u32 i, sf_type; void *slot_ptr; DUMP_IND(sdump); fprintf(sdump->trace, "<fieldValue name=\"%s\" ", field.name); if (gf_sg_vrml_is_sf_field(field.fieldType)) { if (field.fieldType == GF_SG_VRML_SFNODE) { fprintf(sdump->trace, ">\n"); sdump->indent++; if (!sdump->X3DDump) fprintf(sdump->trace, "<node>"); DumpNode(sdump, field.far_ptr ? *(GF_Node **)field.far_ptr : NULL, 0, NULL); if (!sdump->X3DDump) fprintf(sdump->trace, "</node>"); sdump->indent--; DUMP_IND(sdump); fprintf(sdump->trace, "</fieldValue>\n"); } else { if (sdump->X3DDump) { fprintf(sdump->trace, " value=\""); } else { fprintf(sdump->trace, " %s=\"", GetXMTFieldTypeValueName(field.fieldType)); } DumpSFField(sdump, field.fieldType, field.far_ptr, 0); fprintf(sdump->trace, "\"/>\n"); } } else { mffield = (GenMFField *) field.far_ptr; sf_type = gf_sg_vrml_get_sf_type(field.fieldType); if ((field.eventType==GF_SG_EVENT_FIELD) || (field.eventType==GF_SG_EVENT_EXPOSED_FIELD)) { if (sf_type == GF_SG_VRML_SFNODE) { GF_ChildNodeItem *list = *(GF_ChildNodeItem **)field.far_ptr; fprintf(sdump->trace, ">\n"); sdump->indent++; if (!sdump->X3DDump) fprintf(sdump->trace, "<nodes>"); while (list) { DumpNode(sdump, list->node, 1, NULL); list = list->next; } if (!sdump->X3DDump) fprintf(sdump->trace, "</nodes>"); sdump->indent--; DUMP_IND(sdump); fprintf(sdump->trace, "</fieldValue>\n"); } else { if (sdump->X3DDump) { fprintf(sdump->trace, " value=\""); } else { fprintf(sdump->trace, " %s=\"", GetXMTFieldTypeValueName(field.fieldType)); } for (i=0; i<mffield->count; i++) { if (i) fprintf(sdump->trace, " "); if (field.fieldType != GF_SG_VRML_MFNODE) { gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &slot_ptr, i); DumpSFField(sdump, sf_type, slot_ptr, (mffield->count>1) ? 1 : 0); } } fprintf(sdump->trace, "\"/>\n"); } } }}GF_Route *SD_GetISedField(GF_SceneDumper *sdump, GF_Node *node, GF_FieldInfo *field) { u32 i; GF_Route *r; i=0; while ((r = (GF_Route*)gf_list_enum(sdump->current_proto->sub_graph->Routes, &i))) { if (!r->IS_route) continue; if ((r->ToNode==node) && (r->ToField.fieldIndex==field->fieldIndex)) return r; } if (!node || !node->sgprivate->interact || !node->sgprivate->interact->events) return NULL; i=0; while ((r = (GF_Route*)gf_list_enum(node->sgprivate->interact->events, &i))) { if (!r->IS_route) continue; if (r->FromField.fieldIndex == field->fieldIndex) return r; } return NULL;}void DumpISField(GF_SceneDumper *sdump, GF_Node *node, GF_FieldInfo field, Bool isScript, Bool skip_is){ GF_FieldInfo pfield; GF_Route *r = SD_GetISedField(sdump, node, &field); if (r->FromNode) { pfield.fieldIndex = r->ToField.fieldIndex; gf_sg_proto_get_field(sdump->current_proto, NULL, &pfield); } else { pfield.fieldIndex = r->FromField.fieldIndex; gf_sg_proto_get_field(sdump->current_proto, NULL, &pfield); } if (!sdump->XMLDump) { DUMP_IND(sdump); if (isScript) fprintf(sdump->trace, "%s %s ", gf_sg_vrml_get_event_type_name(field.eventType, sdump->X3DDump), gf_sg_vrml_get_field_type_by_name(field.fieldType)); fprintf(sdump->trace, "%s IS %s\n", field.name, pfield.name); } else { if (!skip_is) { StartElement(sdump, "IS"); EndElementHeader(sdump, 1); sdump->indent++; } DUMP_IND(sdump); fprintf(sdump->trace, "<connect nodeField=\"%s\" protoField=\"%s\"/>\n", field.name, pfield.name); if (!skip_is) { sdump->indent--; EndElement(sdump, "IS", 1); } }}const char *SD_GetNodeName(GF_SceneDumper *sdump, GF_Node *node){ /*convert whatever possible*/ if (sdump->X3DDump) { if (node->sgprivate->tag == TAG_MPEG4_Circle) return "Circle2D"; else if (node->sgprivate->tag == TAG_MPEG4_Rectangle) return "Rectangle2D"; } else if (!sdump->X3DDump) { if (node->sgprivate->tag == TAG_X3D_Circle2D) return "Circle"; else if (node->sgprivate->tag == TAG_X3D_Rectangle2D) return "Rectangle"; } return gf_node_get_class_name(node);}Bool SD_CanDumpNode(GF_SceneDumper *sdump, GF_Node *node){ const char *name; u32 tag; if (node->sgprivate->tag==TAG_ProtoNode) return 1; if (sdump->X3DDump || (sdump->dump_mode==GF_SM_DUMP_VRML)) { if (node->sgprivate->tag>=GF_NODE_RANGE_FIRST_X3D) return 1; if (node->sgprivate->tag==TAG_MPEG4_Rectangle) return 1; if (node->sgprivate->tag==TAG_MPEG4_Circle) return 1; name = gf_node_get_class_name(node); tag = gf_node_x3d_type_by_class_name(name); return tag ? 1 : 0; } else { if (node->sgprivate->tag<=GF_NODE_RANGE_LAST_MPEG4) return 1; if (node->sgprivate->tag==TAG_X3D_Rectangle2D) return 1; if (node->sgprivate->tag==TAG_X3D_Circle2D) return 1; name = gf_node_get_class_name(node); tag = gf_node_mpeg4_type_by_class_name(name); return tag ? 1 : 0; }}void DumpNode(GF_SceneDumper *sdump, GF_Node *node, Bool in_list, char *fieldContainer){ u32 i, count, to_dump, sub_el, ID; u32 *def_fields; Bool isDEF, isScript, isProto, hasISed; char *name; GF_Node *base; GF_FieldInfo field, base_field; if (!node) { fprintf(sdump->trace, "NULL"); return; } /*this dumper works only for VRML like graphs*/ if (node->sgprivate->tag>GF_NODE_RANGE_LAST_X3D) return; if (!SD_CanDumpNode(sdump, node)) { GF_LOG(GF_LOG_WARNING, GF_LOG_PARSER, ("[Scene Dump] node %s not part of %s standard - removing\n", gf_node_get_class_name(node), sdump->X3DDump ? "X3D" : (sdump->dump_mode==GF_SM_DUMP_VRML) ? "VRML" : "MPEG4")); if (!in_list) fprintf(sdump->trace, "NULL"); return; } name = (char *) SD_GetNodeName(sdump, node); isProto = (gf_node_get_tag(node) == TAG_ProtoNode) ? 1 : 0; ID = gf_node_get_id(node); isDEF = 0; if (ID) { isDEF = SD_IsDEFNode(sdump, node); if (!isDEF) { if (!sdump->XMLDump) { if (in_list) DUMP_IND(sdump); fprintf(sdump->trace, "USE "); DumpNodeID(sdump, node); if (in_list) fprintf(sdump->trace, "\n"); } else { if (isProto) { StartElement(sdump, "ProtoInstance"); StartAttribute(sdump, "name"); fprintf(sdump->trace, "%s", name); EndAttribute(sdump); } else { StartElement(sdump, name); } StartAttribute(sdump, "USE"); DumpNodeID(sdump, node); EndAttribute(sdump); EndElementHeader(sdump, 0); } return; } } /*get all fields*/ count = gf_node_get_field_count(node); def_fields = (u32*)malloc(sizeof(u32) * count); base = NULL; switch (gf_node_get_tag(node)) { case TAG_X3D_Script: case TAG_MPEG4_Script: isScript = 1; break; default: isScript = 0; break; } if (!isScript) { if (isProto) { base = gf_sg_proto_create_instance(node->sgprivate->scenegraph, ((GF_ProtoInstance *)node)->proto_interface); } else { base = gf_node_new(node->sgprivate->scenegraph, node->sgprivate->tag); } } if (base) gf_node_register(base, NULL); hasISed = 0; to_dump = sub_el = 0; for (i=0;i<count; i++) { if (isScript) { /*dyn script fields are complex types*/ def_fields[i] = (i>2) ? 2 : 1; } else { def_fields[i] = 0; } gf_node_get_field(node, i, &field); if (sdump->current_proto) { if (SD_GetISedField(sdump, node, &field) != NULL) { def_fields[i] = 3; if ((field.fieldType == GF_SG_VRML_SFNODE) || (field.fieldType == GF_SG_VRML_MFNODE)) def_fields[i] = sdump->XMLDump ? 4 : 3; /*in XMT the ISed is not an attribute*/ if (sdump->XMLDump) sub_el++; to_dump++; hasISed = 1; continue; } } if (!isScript && ((field.eventType == GF_SG_EVENT_IN) || (field.eventType == GF_SG_EVENT_OUT)) ) { continue; } /*proto instance in XMT lists all fields as elements*/ if (sdump->XMLDump && isProto) { def_fields[i] = 2; to_dump++; sub_el++; continue; } switch (field.fieldType) { case GF_SG_VRML_SFNODE: if (* (GF_Node **) field.far_ptr) { def_fields[i] = 2; to_dump++; sub_el++; } break; case GF_SG_VRML_MFNODE: if (* (GF_ChildNodeItem**) field.far_ptr) { def_fields[i] = 2; to_dump++; sub_el++; } break; case GF_SG_VRML_SFCOMMANDBUFFER: { SFCommandBuffer *p = (SFCommandBuffer *)field.far_ptr; if (p->bufferSize || gf_list_count(p->commandList)) { def_fields[i] = 2; to_dump++; sub_el++; } } break; default: if (isScript) { to_dump++; } else { gf_node_get_field(base, i, &base_field); if (!gf_sg_vrml_field_equal(base_field.far_ptr, field.far_ptr, field.fieldType)) { def_fields[i] = 1; to_dump++; } } break; } } if (base) gf_node_unregister(base, NULL); if (!to_dump) { if (in_list) DUMP_IND(sdump); if (!sdump->XMLDump) { if (isDEF) { fprintf(sdump->trace, "DEF "); DumpNodeID(sdump, node); fprintf(sdump->trace, " "); } fprintf(sdump->trace, "%s {}\n", name); } else { if (isDEF) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -