⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scene_dump.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -