📄 scene_dump.c
字号:
GF_Err DumpNodeReplace(GF_SceneDumper *sdump, GF_Command *com){ GF_CommandField *inf; if (!gf_list_count(com->command_fields)) return GF_OK; inf = (GF_CommandField *) gf_list_get(com->command_fields, 0); DUMP_IND(sdump); if (sdump->XMLDump) { fprintf(sdump->trace, "<Replace atNode=\""); DumpNodeID(sdump, com->node); fprintf(sdump->trace, "\">"); DumpNode(sdump, inf->new_node, 0, NULL); fprintf(sdump->trace, "</Replace>\n"); } else { fprintf(sdump->trace, "REPLACE "); DumpNodeID(sdump, com->node); fprintf(sdump->trace, " BY "); DumpNode(sdump, inf->new_node, 0, NULL); fprintf(sdump->trace, "\n"); } return GF_OK;}GF_Err DumpFieldReplace(GF_SceneDumper *sdump, GF_Command *com){ GF_Err e; GF_FieldInfo field; GF_CommandField *inf; if (!gf_list_count(com->command_fields)) return GF_OK; inf = (GF_CommandField *) gf_list_get(com->command_fields, 0); e = gf_node_get_field(com->node, inf->fieldIndex, &field); DUMP_IND(sdump); if (sdump->XMLDump) { fprintf(sdump->trace, "<Replace atNode=\""); DumpNodeID(sdump, com->node); fprintf(sdump->trace, "\" atField=\"%s\" ", field.name); } else { fprintf(sdump->trace, "REPLACE "); DumpNodeID(sdump, com->node); fprintf(sdump->trace, ".%s BY ", field.name); } switch (field.fieldType) { case GF_SG_VRML_SFNODE: if (sdump->XMLDump) fprintf(sdump->trace, ">"); DumpNode(sdump, inf->new_node, 0, NULL); if (sdump->XMLDump) fprintf(sdump->trace, "</Replace>"); else fprintf(sdump->trace, "\n"); break; case GF_SG_VRML_MFNODE: { GF_ChildNodeItem *tmp; if (sdump->XMLDump) { fprintf(sdump->trace, ">"); } else { fprintf(sdump->trace, " [\n"); } sdump->indent++; tmp = inf->node_list; while (tmp) { DumpNode(sdump, tmp->node, 1, NULL); tmp = tmp->next; } sdump->indent--; if (sdump->XMLDump) { fprintf(sdump->trace, "</Replace>"); } else { EndList(sdump, NULL); } } break; case GF_SG_VRML_SFCOMMANDBUFFER: if (sdump->XMLDump) { SFCommandBuffer *cb = (SFCommandBuffer*)inf->field_ptr; fprintf(sdump->trace, ">\n"); gf_sm_dump_command_list(sdump, cb->commandList, sdump->indent+1, 0); DUMP_IND(sdump); fprintf(sdump->trace, "</Replace>\n"); } else { SFCommandBuffer *cb = (SFCommandBuffer*)inf->field_ptr; fprintf(sdump->trace, " {\n"); gf_sm_dump_command_list(sdump, cb->commandList, sdump->indent+1, 0); DUMP_IND(sdump); fprintf(sdump->trace, "}\n"); } break; default: field.far_ptr = inf->field_ptr; DumpFieldValue(sdump, field); if (sdump->XMLDump) fprintf(sdump->trace, "/>"); fprintf(sdump->trace, "\n"); } return e;}GF_Err DumpIndexReplace(GF_SceneDumper *sdump, GF_Command *com){ char posname[20]; GF_Err e; GF_FieldInfo field; GF_CommandField *inf; if (!gf_list_count(com->command_fields)) return GF_OK; inf = (GF_CommandField *) gf_list_get(com->command_fields, 0); e = gf_node_get_field(com->node, inf->fieldIndex, &field); if (e) return e; if (gf_sg_vrml_is_sf_field(field.fieldType)) return GF_NON_COMPLIANT_BITSTREAM; switch (inf->pos) { case 0: strcpy(posname, "BEGIN"); break; case -1: strcpy(posname, sdump->XMLDump ? "END" : "LAST"); break; default: sprintf(posname, "%d", inf->pos); break; } DUMP_IND(sdump); if (sdump->XMLDump) { fprintf(sdump->trace, "<Replace atNode=\""); DumpNodeID(sdump, com->node); fprintf(sdump->trace, "\" atField=\"%s\" position=\"%s\"", field.name, posname); } else { fprintf(sdump->trace, "REPLACE "); if (inf->pos==-1) fprintf(sdump->trace, "%s ", posname); DumpNodeID(sdump, com->node); fprintf(sdump->trace, ".%s", field.name); if (inf->pos!=-1) fprintf(sdump->trace, "[%d]", inf->pos); fprintf(sdump->trace, " BY "); } if (field.fieldType == GF_SG_VRML_MFNODE) { if (sdump->XMLDump) fprintf(sdump->trace, ">\n"); DumpNode(sdump, inf->new_node, 0, NULL); fprintf(sdump->trace, (sdump->XMLDump) ? "</Replace>\n" : "\n"); } else { field.fieldType = gf_sg_vrml_get_sf_type(field.fieldType); field.far_ptr = inf->field_ptr; DumpFieldValue(sdump, field); fprintf(sdump->trace, sdump->XMLDump ? "/>\n" : "\n"); } return GF_OK;}GF_Err DumpRouteReplace(GF_SceneDumper *sdump, GF_Command *com){ const char *name; GF_Route r2; if (!DumpFindRouteName(sdump, com->RouteID, &name)) return GF_BAD_PARAM; memset(&r2, 0, sizeof(GF_Route)); r2.FromNode = SD_FindNode(sdump, com->fromNodeID); r2.FromField.fieldIndex = com->fromFieldIndex; r2.ToNode = SD_FindNode(sdump, com->toNodeID); r2.ToField.fieldIndex = com->toFieldIndex; DUMP_IND(sdump); if (sdump->XMLDump) { fprintf(sdump->trace, "<Replace atRoute=\""); DumpRouteID(sdump, com->RouteID, (char *) name); fprintf(sdump->trace, "\">\n"); } else { fprintf(sdump->trace, "REPLACE ROUTE "); DumpRouteID(sdump, com->RouteID, (char *) name); fprintf(sdump->trace, " BY "); } DumpRoute(sdump, &r2, 1); if (sdump->XMLDump ) fprintf(sdump->trace, "</Replace>"); return GF_OK;}GF_Err DumpRoute(GF_SceneDumper *sdump, GF_Route *r, u32 dump_type){ char toNode[512], fromNode[512]; const char *node_name; u32 id; if (!r->is_setup) { gf_node_get_field(r->FromNode, r->FromField.fieldIndex, &r->FromField); gf_node_get_field(r->ToNode, r->ToField.fieldIndex, &r->ToField); r->is_setup = 1; } if (!r->FromNode || !r->ToNode) return GF_BAD_PARAM; if (sdump->XMLDump || !dump_type) DUMP_IND(sdump); node_name = gf_node_get_name_and_id(r->FromNode, &id); if (node_name) { strcpy(fromNode, node_name); strcpy(toNode, gf_node_get_name(r->ToNode)); } else { sprintf(fromNode, "N%d", id-1); sprintf(toNode, "N%d", gf_node_get_id(r->ToNode) - 1); } if (sdump->XMLDump) { fprintf(sdump->trace, "<ROUTE"); if (r->ID) { StartAttribute(sdump, "DEF"); DumpRouteID(sdump, r->ID, r->name); EndAttribute(sdump); } fprintf(sdump->trace, " fromNode=\"%s\" fromField=\"%s\" toNode=\"%s\" toField=\"%s\"/>\n", fromNode, r->FromField.name, toNode, r->ToField.name); } else { if (dump_type==2) fprintf(sdump->trace, "ROUTE "); if (r->ID) { fprintf(sdump->trace, "DEF "); DumpRouteID(sdump, r->ID, r->name); fprintf(sdump->trace, " "); } if (dump_type==1) { fprintf(sdump->trace, "%s.%s TO %s.%s\n", fromNode, r->FromField.name, toNode, r->ToField.name); } else { if (dump_type!=2) fprintf(sdump->trace, "ROUTE "); fprintf(sdump->trace, "%s.%s TO %s.%s\n", fromNode, r->FromField.name, toNode, r->ToField.name); } } return GF_OK;}GF_Err DumpProtos(GF_SceneDumper *sdump, GF_List *protoList){ u32 i, j, count; GF_FieldInfo field; GF_Err e; GF_SceneGraph *prev_sg; GF_Proto *proto, *prev_proto; prev_proto = sdump->current_proto; i=0; while ((proto = (GF_Proto*)gf_list_enum(protoList, &i))) { sdump->current_proto = proto; DUMP_IND(sdump); if (!sdump->XMLDump) { fprintf(sdump->trace, proto->ExternProto.count ? "EXTERNPROTO " : "PROTO "); fprintf(sdump->trace, "%s [\n", proto->Name); } else { fprintf(sdump->trace, "<ProtoDeclare name=\"%s\" protoID=\"%d\"", proto->Name, proto->ID); if (proto->ExternProto.count) { fprintf(sdump->trace, " locations=\""); DumpSFField(sdump, GF_SG_VRML_SFURL, &proto->ExternProto.vals[0], 0); fprintf(sdump->trace, "\""); } fprintf(sdump->trace, ">\n"); } if (sdump->XMLDump && sdump->X3DDump) fprintf(sdump->trace, "<ProtoInterface>"); sdump->indent++; count = gf_list_count(proto->proto_fields); for (j=0; j<count; j++) { GF_ProtoFieldInterface *pf = (GF_ProtoFieldInterface *)gf_list_get(proto->proto_fields, j); field.fieldIndex = pf->ALL_index; field.eventType = pf->EventType; field.far_ptr = pf->def_value; field.fieldType = pf->FieldType; field.name = pf->FieldName; field.NDTtype = NDT_SFWorldNode; field.on_event_in = NULL; DumpDynField(sdump, NULL, field, pf->QP_Type ? 1 : 0); if (!pf->QP_Type) continue; /*dump interface coding - BT/TXT extensions, not supported by any other tool*/ sdump->indent++; DUMP_IND(sdump); if (sdump->XMLDump) { fprintf(sdump->trace, "<InterfaceCodingParameters quantCategoy=\"%s\"", SD_GetQuantCatName(pf->QP_Type)); } else { fprintf(sdump->trace, "{QP %d", pf->QP_Type); } if (pf->QP_Type==QC_LINEAR_SCALAR) fprintf(sdump->trace, sdump->XMLDump ? " nbBits=\"%d\"" : " nbBits %d", pf->NumBits); if (pf->hasMinMax) { switch (pf->QP_Type) { case QC_LINEAR_SCALAR: case QC_COORD_INDEX: if (sdump->XMLDump) { fprintf(sdump->trace, " intMin=\"%d\" intMax=\"%d\"", *((SFInt32 *)pf->qp_min_value), *((SFInt32 *)pf->qp_max_value)); } else { fprintf(sdump->trace, " b {%d %d}", *((SFInt32 *)pf->qp_min_value), *((SFInt32 *)pf->qp_max_value)); } break; default: if (sdump->XMLDump) { fprintf(sdump->trace, " floatMin=\"%g\" floatMax=\"%g\"", FIX2FLT( *((SFFloat *)pf->qp_min_value) ), FIX2FLT( *((SFFloat *)pf->qp_max_value) )); } else { fprintf(sdump->trace, " b {%g %g}", FIX2FLT( *((SFFloat *)pf->qp_min_value) ), FIX2FLT( *((SFFloat *)pf->qp_max_value) ) ); } break; } } fprintf(sdump->trace, sdump->XMLDump ? "/>\n" : "}\n"); sdump->indent--; if (sdump->XMLDump) { DUMP_IND(sdump); fprintf(sdump->trace, "</field>\n"); } } sdump->indent--; DUMP_IND(sdump); if (!sdump->XMLDump) { fprintf(sdump->trace, "]"); } else if (sdump->X3DDump) fprintf(sdump->trace, "</ProtoInterface>\n"); if (proto->ExternProto.count) { if (!sdump->XMLDump) { fprintf(sdump->trace, " \""); DumpSFField(sdump, GF_SG_VRML_SFURL, &proto->ExternProto.vals[0], 0); fprintf(sdump->trace, "\"\n\n"); } else { fprintf(sdump->trace, "</ProtoDeclare>\n"); } continue; } if (!sdump->XMLDump) fprintf(sdump->trace, " {\n"); sdump->indent++; if (sdump->XMLDump && sdump->X3DDump) fprintf(sdump->trace, "<ProtoBody>\n"); e = DumpProtos(sdump, proto->sub_graph->protos); if (e) return e; /*set namespace to the proto one*/ prev_sg = sdump->sg; sdump->sg = gf_sg_proto_get_graph(proto); count = gf_list_count(proto->node_code); for (j=0; j<count; j++) { GF_Node *n = (GF_Node*)gf_list_get(proto->node_code, j); DumpNode(sdump, n, 1, NULL); } count = gf_list_count(proto->sub_graph->Routes); for (j=0; j<count; j++) { GF_Route *r = (GF_Route *)gf_list_get(proto->sub_graph->Routes, j); if (r->IS_route) continue; DumpRoute(sdump, r, 0); } if (sdump->XMLDump && sdump->X3DDump) fprintf(sdump->trace, "</ProtoBody>\n"); /*restore namespace*/ sdump->sg = prev_sg; sdump->indent--; DUMP_IND(sdump); if (!sdump->XMLDump) { fprintf(sdump->trace, "}\n"); } else { fprintf(sdump->trace, "</ProtoDeclare>\n"); } } sdump->current_proto = prev_proto; return GF_OK;}GF_Err DumpSceneReplace(GF_SceneDumper *sdump, GF_Command *com){ if (sdump->XMLDump) { if (!sdump->X3DDump) { StartElement(sdump, "Replace"); EndElementHeader(sdump, 1); sdump->indent++; } StartElement(sdump, "Scene"); if (!sdump->X3DDump && com->use_names) DumpBool(sdump, "USENAMES", com->use_names); EndElementHeader(sdump, 1); sdump->indent++; } else { if (!sdump->skip_scene_replace) { DUMP_IND(sdump); fprintf(sdump->trace, "REPLACE SCENE BY "); } } DumpProtos(sdump, com->new_proto_list); DumpNode(sdump, com->node, 0, NULL); if (!sdump->XMLDump) fprintf(sdump->trace, "\n\n"); return GF_OK;}GF_Err DumpProtoInsert(GF_SceneDumper *sdump, GF_Command *com){ DUMP_IND(sdump); if (sdump->XMLDump) { fprintf(sdump->trace, "<Insert extended=\"proto\">\n"); } else { fprintf(sdump->trace, "INSERTPROTO [\n"); } sdump->indent++; DumpProtos(sdump, com->new_proto_list); sdump->indent--; DUMP_IND(sdump); if (sdump->XMLDump) { fprintf(sdump->trace, "</Insert>\n"); } else { fprintf(sdump->trace, "]\n"); } return GF_OK;}#ifndef GPAC_DISABLE_SVGstatic char *lsr_format_node_id(GF_Node *n, u32 NodeID, char *str){ if (!n) sprintf(str, "N%d", NodeID-1); else { const char *name = gf_node_get_name_and_id(n, &NodeID); if (name) sprintf(str, "%s", name); else sprintf(str, "N%d", NodeID - 1); } return str;}GF_Err DumpLSRNewScene(GF_SceneDumper *sdump, GF_Command *com){ fprintf(sdump->trace, "<lsr:NewScene>\n"); SD_DumpSVG_Element(sdump, com->node, NULL, 0); fprintf(sdump->trace, "</lsr:NewScene>\n"); return GF_OK;}GF_Err DumpLSRAddReplaceInsert(GF_SceneDumper *sdump, GF_Command *com){ char szAtt[80000]; Bool is_text = 0; GF_CommandField *f; const char *com_name = (com->tag==GF_SG_LSR_REPLACE) ? "Replace" : ( (com->tag==GF_SG_LSR_ADD) ? "Add" : "Insert" ); DUMP_IND(sdump); fprintf(sdump->trace, "<lsr:%s ref=\"%s\" ", com_name, lsr_format_node_id(com->node, com->RouteID, szAtt)); f = (GF_CommandField *) gf_list_get(com->command_fields, 0); if (f && (f->pos>=0) ) fprintf(sdump->trace, "index=\"%d\" ", f->pos); if (f) { GF_FieldInfo info; if (!f->new_node && !f->node_list) { char *att_name = NULL; if (f->fieldType==SVG_Transform_Scale_datatype) att_name = "scale
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -