📄 scene_dump.c
字号:
void DumpSFField(GF_SceneDumper *sdump, u32 type, void *ptr, Bool is_mf){ switch (type) { case GF_SG_VRML_SFBOOL: fprintf(sdump->trace, "%s", * ((SFBool *)ptr) ? "TRUE" : "FALSE"); break; case GF_SG_VRML_SFINT32: fprintf(sdump->trace, "%d", * ((SFInt32 *)ptr) ); break; case GF_SG_VRML_SFFLOAT: fprintf(sdump->trace, "%g", FIX2FLT( * ((SFFloat *)ptr) ) ); break; case GF_SG_VRML_SFDOUBLE: fprintf(sdump->trace, "%g", * ((SFDouble *)ptr) ); break; case GF_SG_VRML_SFTIME: fprintf(sdump->trace, "%g", * ((SFTime *)ptr) ); break; case GF_SG_VRML_SFCOLOR: fprintf(sdump->trace, "%g %g %g", FIX2FLT( ((SFColor *)ptr)->red ), FIX2FLT( ((SFColor *)ptr)->green ), FIX2FLT( ((SFColor *)ptr)->blue )); break; case GF_SG_VRML_SFCOLORRGBA: fprintf(sdump->trace, "%g %g %g %g", FIX2FLT( ((SFColorRGBA *)ptr)->red ), FIX2FLT( ((SFColorRGBA *)ptr)->green ), FIX2FLT( ((SFColorRGBA *)ptr)->blue ), FIX2FLT( ((SFColorRGBA *)ptr)->alpha )); break; case GF_SG_VRML_SFVEC2F: fprintf(sdump->trace, "%g %g", FIX2FLT( ((SFVec2f *)ptr)->x ), FIX2FLT( ((SFVec2f *)ptr)->y )); break; case GF_SG_VRML_SFVEC2D: fprintf(sdump->trace, "%g %g", ((SFVec2d *)ptr)->x, ((SFVec2d *)ptr)->y); break; case GF_SG_VRML_SFVEC3F: fprintf(sdump->trace, "%g %g %g", FIX2FLT( ((SFVec3f *)ptr)->x ), FIX2FLT( ((SFVec3f *)ptr)->y ), FIX2FLT( ((SFVec3f *)ptr)->z )); break; case GF_SG_VRML_SFVEC3D: fprintf(sdump->trace, "%g %g %g", ((SFVec3d *)ptr)->x, ((SFVec3d *)ptr)->y, ((SFVec3d *)ptr)->z); break; case GF_SG_VRML_SFROTATION: fprintf(sdump->trace, "%g %g %g %g", FIX2FLT( ((SFRotation *)ptr)->x ), FIX2FLT( ((SFRotation *)ptr)->y ), FIX2FLT( ((SFRotation *)ptr)->z ), FIX2FLT( ((SFRotation *)ptr)->q ) ); break; case GF_SG_VRML_SFSCRIPT: { u32 len, i; char *str; u16 *uniLine; str = (char*)((SFScript *)ptr)->script_text; len = strlen(str); uniLine = (u16*)malloc(sizeof(short) * len); len = gf_utf8_mbstowcs(uniLine, len, (const char **) &str); if (len != (size_t) -1) { if (!sdump->XMLDump) fputc('\"', sdump->trace); for (i=0; i<len; i++) { if (!sdump->XMLDump) {#ifndef __SYMBIAN32__ fputwc(uniLine[i], sdump->trace);#else fputc(uniLine[i], sdump->trace);#endif } else { switch (uniLine[i]) { case '&': fprintf(sdump->trace, "&"); break; case '<': fprintf(sdump->trace, "<"); break; case '>': fprintf(sdump->trace, ">"); break; case '\'': case '"': fprintf(sdump->trace, "'"); break; case 0: break; /*FIXME: how the heck can we preserve newlines and spaces of JavaScript in an XML attribute in any viewer ? */ default: if (uniLine[i]<128) { fprintf(sdump->trace, "%c", (u8) uniLine[i]); } else { fprintf(sdump->trace, "&#%d;", uniLine[i]); } break; } } } if (!sdump->XMLDump) fprintf(sdump->trace, "\"\n"); } free(uniLine); DUMP_IND(sdump); } break; case GF_SG_VRML_SFSTRING: { char *str; if (sdump->XMLDump) { if (is_mf) fprintf(sdump->trace, sdump->X3DDump ? "\"" : """); } else { fprintf(sdump->trace, "\""); } /*dump in unicode*/ str = ((SFString *)ptr)->buffer; if (str && str[0]) { if (sdump->XMLDump) { DumpUTFString(sdump, str); } else if (!strchr(str, '\"')) { fprintf(sdump->trace, "%s", str); } else { u32 i, len = strlen(str); for (i=0; i<len; i++) { if (str[i]=='\"') fputc('\\', sdump->trace); fputc(str[i], sdump->trace); } } } if (sdump->XMLDump) { if (is_mf) fprintf(sdump->trace, sdump->X3DDump ? "\"" : """); } else { fprintf(sdump->trace, "\""); } } break; case GF_SG_VRML_SFURL: if (((SFURL *)ptr)->url) {#if 0 u32 len; char *str; short uniLine[5000]; str = ((SFURL *)ptr)->url; len = gf_utf8_mbstowcs(uniLine, 5000, (const char **) &str); if (len != (size_t) -1) { fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ? "'" : """) : "\""); fwprintf(sdump->trace, (unsigned short *) uniLine); fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ? "'" : """) : "\""); }#else fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ? "'" : """) : "\""); fprintf(sdump->trace, ((SFURL *)ptr)->url); fprintf(sdump->trace, sdump->XMLDump ? (sdump->X3DDump ? "'" : """) : "\"");#endif } else { if (sdump->XMLDump) { fprintf(sdump->trace, ""od://od%d"", ((SFURL *)ptr)->OD_ID); } else { fprintf(sdump->trace, "od:%d", ((SFURL *)ptr)->OD_ID); } } break; case GF_SG_VRML_SFIMAGE: { u32 i, count; SFImage *img = (SFImage *)ptr; fprintf(sdump->trace, "%d %d %d", img->width, img->height, img->numComponents); count = img->width * img->height * img->numComponents; for (i=0; i<count; ) { switch (img->numComponents) { case 1: fprintf(sdump->trace, " 0x%02X", img->pixels[i]); i++; break; case 2: fprintf(sdump->trace, " 0x%02X%02X", img->pixels[i], img->pixels[i+1]); i+=2; break; case 3: fprintf(sdump->trace, " 0x%02X%02X%02X", img->pixels[i], img->pixels[i+1], img->pixels[i+2]); i+=3; break; case 4: fprintf(sdump->trace, " 0x%02X%02X%02X%02X", img->pixels[i], img->pixels[i+1], img->pixels[i+2], img->pixels[i+3]); i+=4; break; } } } break; }}void DumpFieldValue(GF_SceneDumper *sdump, GF_FieldInfo field){ GenMFField *mffield; u32 i, sf_type; GF_ChildNodeItem *list; void *slot_ptr; switch (field.fieldType) { case GF_SG_VRML_SFNODE: assert ( *(GF_Node **)field.far_ptr); DumpNode(sdump, *(GF_Node **)field.far_ptr, 0, NULL); return; case GF_SG_VRML_MFNODE: list = * ((GF_ChildNodeItem **) field.far_ptr); assert( list ); sdump->indent++; while (list) { DumpNode(sdump, list->node, 1, NULL); list = list->next; } sdump->indent--; return; case GF_SG_VRML_SFCOMMANDBUFFER: { } return; } if (gf_sg_vrml_is_sf_field(field.fieldType)) { if (sdump->XMLDump) StartAttribute(sdump, "value"); DumpSFField(sdump, field.fieldType, field.far_ptr, 0); if (sdump->XMLDump) EndAttribute(sdump); } else { mffield = (GenMFField *) field.far_ptr; sf_type = gf_sg_vrml_get_sf_type(field.fieldType); if (!sdump->XMLDump) { fprintf(sdump->trace, "["); } else if (sf_type==GF_SG_VRML_SFSTRING) { fprintf(sdump->trace, " value=\'"); } else { StartAttribute(sdump, "value"); } for (i=0; i<mffield->count; i++) { if (i) fprintf(sdump->trace, " "); gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &slot_ptr, i); /*this is to cope with single MFString which shall appear as SF in XMT*/ DumpSFField(sdump, sf_type, slot_ptr, 1); } if (!sdump->XMLDump) { fprintf(sdump->trace, "]"); } else if (sf_type==GF_SG_VRML_SFSTRING) { fprintf(sdump->trace, "\'"); } else { EndAttribute(sdump); } }}Bool SD_NeedsFieldContainer(GF_Node *node, GF_FieldInfo *fi){ u32 i, count, nb_ndt; GF_FieldInfo info; if (!strcmp(fi->name, "children")) return 0; nb_ndt = 0; count = gf_node_get_field_count(node); for (i=0; i<count; i++) { gf_node_get_field(node, i, &info); if ((info.eventType==GF_SG_EVENT_IN) || (info.eventType==GF_SG_EVENT_OUT)) continue; if (info.NDTtype==fi->NDTtype) nb_ndt++; } return (nb_ndt>1) ? 1 : 0;}void DumpField(GF_SceneDumper *sdump, GF_Node *node, GF_FieldInfo field){ GenMFField *mffield; u32 i, sf_type; Bool needs_field_container; GF_ChildNodeItem *list; void *slot_ptr; switch (field.fieldType) { case GF_SG_VRML_SFNODE: assert ( *(GF_Node **)field.far_ptr); if (sdump->XMLDump) { if (!sdump->X3DDump) { StartElement(sdump, (char *) field.name); EndElementHeader(sdump, 1); sdump->indent++; } } else { StartAttribute(sdump, (char *)field.name); } DumpNode(sdump, *(GF_Node **)field.far_ptr, 0, NULL); if (sdump->XMLDump) { if (!sdump->X3DDump) { sdump->indent--; EndElement(sdump, (char *) field.name, 1); } } else { EndAttribute(sdump); } return; case GF_SG_VRML_MFNODE: needs_field_container = 0; if (sdump->XMLDump && sdump->X3DDump) needs_field_container = SD_NeedsFieldContainer(node, &field); if (!sdump->X3DDump) { if (gf_node_get_tag(node)==TAG_X3D_Switch) field.name = "choice"; } list = * ((GF_ChildNodeItem **) field.far_ptr); assert(list); if (!sdump->XMLDump || !sdump->X3DDump) StartList(sdump, (char *) field.name); sdump->indent++; while (list) { DumpNode(sdump, list->node, 1, needs_field_container ? (char *) field.name : NULL); list = list->next; } sdump->indent--; if (!sdump->XMLDump || !sdump->X3DDump) EndList(sdump, (char *) field.name); return; case GF_SG_VRML_SFCOMMANDBUFFER: { SFCommandBuffer *cb = (SFCommandBuffer *)field.far_ptr; StartElement(sdump, (char *) field.name); EndElementHeader(sdump, 1); sdump->indent++; if (!gf_list_count(cb->commandList)) { /*the arch does not allow for that (we would need a codec and so on, or decompress the command list in all cases...)*/ if (sdump->trace && cb->bufferSize) { if (sdump->XMLDump) fprintf(sdump->trace, "<!--SFCommandBuffer cannot be dumped while playing - use MP4Box instead-->\n"); else fprintf(sdump->trace, "#SFCommandBuffer cannot be dumped while playing - use MP4Box instead\n"); } } else { gf_sm_dump_command_list(sdump, cb->commandList, sdump->indent, 0); } sdump->indent--; EndElement(sdump, (char *) field.name, 1); } return; } if (gf_sg_vrml_is_sf_field(field.fieldType)) { StartAttribute(sdump, (char *) field.name); DumpSFField(sdump, field.fieldType, field.far_ptr, 0); EndAttribute(sdump); } else { mffield = (GenMFField *) field.far_ptr; sf_type = gf_sg_vrml_get_sf_type(field.fieldType); if (sdump->XMLDump && sdump->X3DDump) { switch (sf_type) { case GF_SG_VRML_SFSTRING: case GF_SG_VRML_SFSCRIPT: case GF_SG_VRML_SFURL: fprintf(sdump->trace, " %s=\'", (char *) field.name); break; default: StartAttribute(sdump, (char *) field.name); break; } } else { StartAttribute(sdump, (char *) field.name); } if (!sdump->XMLDump) fprintf(sdump->trace, "["); for (i=0; i<mffield->count; i++) { if (i) fprintf(sdump->trace, " "); gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &slot_ptr, i); DumpSFField(sdump, sf_type, slot_ptr, 1); } if (!sdump->XMLDump) fprintf(sdump->trace, "]"); if (sdump->XMLDump && sdump->X3DDump) { switch (sf_type) { case GF_SG_VRML_SFSTRING: case GF_SG_VRML_SFSCRIPT: case GF_SG_VRML_SFURL: fprintf(sdump->trace, "\'"); break; default: EndAttribute(sdump); break; } } else { EndAttribute(sdump); } }}const char * GetXMTFieldTypeName(u32 fieldType){ switch (fieldType) { case GF_SG_VRML_SFBOOL: return "Boolean"; case GF_SG_VRML_SFINT32: return "Integer"; case GF_SG_VRML_SFCOLOR: return "Color"; case GF_SG_VRML_SFVEC2F: return "Vector2"; case GF_SG_VRML_SFIMAGE: return "Image"; case GF_SG_VRML_SFTIME: return "Time"; case GF_SG_VRML_SFFLOAT: return "Float"; case GF_SG_VRML_SFVEC3F: return "Vector3"; case GF_SG_VRML_SFROTATION: return "Rotation"; case GF_SG_VRML_SFSTRING: return "String"; case GF_SG_VRML_SFNODE: return "Node"; case GF_SG_VRML_MFBOOL: return "Booleans"; case GF_SG_VRML_MFINT32: return "Integers"; case GF_SG_VRML_MFCOLOR: return "Colors"; case GF_SG_VRML_MFVEC2F: return "Vector2s"; case GF_SG_VRML_MFIMAGE: return "Images"; case GF_SG_VRML_MFTIME: return "Times"; case GF_SG_VRML_MFFLOAT: return "Floats"; case GF_SG_VRML_MFVEC3F: return "Vector3s"; case GF_SG_VRML_MFROTATION: return "Rotations"; case GF_SG_VRML_MFSTRING: return "Strings"; case GF_SG_VRML_MFNODE: return "Nodes"; default: return "unknown"; }}const char * GetXMTFieldTypeValueName(u32 fieldType){ switch (fieldType) { case GF_SG_VRML_SFBOOL: return "booleanValue"; case GF_SG_VRML_SFINT32: return "integerValue"; case GF_SG_VRML_SFCOLOR: return "colorValue"; case GF_SG_VRML_SFVEC2F: return "vector2Value"; case GF_SG_VRML_SFIMAGE: return "imageValue"; case GF_SG_VRML_SFTIME: return "timeValue"; case GF_SG_VRML_SFFLOAT: return "floatValue"; case GF_SG_VRML_SFVEC3F: return "vector3Value"; case GF_SG_VRML_SFROTATION: return "rotationValue"; case GF_SG_VRML_SFSTRING: return "stringValue"; case GF_SG_VRML_MFBOOL: return "booleanArrayValue"; case GF_SG_VRML_MFINT32: return "integerArrayValue"; case GF_SG_VRML_MFCOLOR: return "colorArrayValue"; case GF_SG_VRML_MFVEC2F: return "vector2ArrayValue"; case GF_SG_VRML_MFIMAGE: return "imageArrayValue"; case GF_SG_VRML_MFTIME: return "timeArrayValue"; case GF_SG_VRML_MFFLOAT: return "floatArrayValue"; case GF_SG_VRML_MFVEC3F: return "vector3ArrayValue"; case GF_SG_VRML_MFROTATION: return "rotationArrayValue"; case GF_SG_VRML_MFSTRING: return "stringArrayValue"; default: return "unknown"; }}const char *SD_GetQuantCatName(u32 QP_Type){ switch (QP_Type) { case QC_3DPOS: return "position3D"; case QC_2DPOS: return "position2D"; case QC_ORDER: return "drawingOrder"; case QC_COLOR: return "color"; case QC_TEXTURE_COORD: return "textureCoordinate"; case QC_ANGLE: return "angle"; case QC_SCALE: return "scale"; case QC_INTERPOL_KEYS: return "keys"; case QC_NORMALS: return "normals"; case QC_ROTATION: return "rotations"; case QC_SIZE_3D: return "size3D"; case QC_SIZE_2D: return "size2D"; case QC_LINEAR_SCALAR: return "linear"; case QC_COORD_INDEX: return "coordIndex"; default: return "unknown"; }}/*field dumping for proto declaration and Script*/void DumpDynField(GF_SceneDumper *sdump, GF_Node *node, GF_FieldInfo field, Bool has_sublist){ GenMFField *mffield; u32 i, sf_type; void *slot_ptr; if (gf_sg_vrml_is_sf_field(field.fieldType)) { DUMP_IND(sdump);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -