📄 loader_bt.c
字号:
} } else { GF_Node *n = gf_bt_sf_node(parser, str, NULL, isDEF ? szDefName : NULL); isDEF = 0; if (!n) goto err; if (0 && isDEF) { u32 ID = gf_bt_get_def_id(parser, szDefName); isDEF = 0; gf_node_set_id(n, ID, szDefName); } gf_sg_proto_add_node_code(proto, n); } } gf_bt_resolve_routes(parser, 1); gf_bt_check_unresolved_nodes(parser); parser->load->scene_graph = sg; parser->parsing_proto = prevproto; return parser->last_error;err: if (proto_list) gf_list_del_item(proto_list, proto); gf_sg_proto_del(proto); return parser->last_error;}GF_Route *gf_bt_parse_route(GF_BTParser *parser, Bool skip_def, Bool is_insert, GF_Command *com){ GF_Route *r; char *str, nstr[1000], rName[1000]; u32 rID; GF_Node *orig, *dest; GF_FieldInfo orig_field, dest_field; GF_Err e; rID = 0; strcpy(nstr, gf_bt_get_next(parser, 1)); if (!skip_def && !strcmp(nstr, "DEF")) { str = gf_bt_get_next(parser, 0); strcpy(rName, str); rID = gf_bt_get_route(parser, rName); if (!rID && (str[0]=='R') ) { rID = atoi(&str[1]); if (rID) { rID++; if (gf_bt_route_id_used(parser, rID)) rID = 0; } } if (!rID) rID = gf_bt_get_next_route_id(parser); strcpy(nstr, gf_bt_get_next(parser, 1)); } orig = gf_bt_peek_node(parser, nstr); if (!orig) { gf_bt_report(parser, GF_BAD_PARAM, "cannot find node %s", nstr); return NULL; } if (!gf_bt_check_code(parser, '.')) { gf_bt_report(parser, GF_BAD_PARAM, ". expected in route decl"); return NULL; } str = gf_bt_get_next(parser, 0); e = gf_node_get_field_by_name(orig, str, &orig_field); /*VRML loosy syntax*/ if ((e != GF_OK) && parser->is_wrl && !strnicmp(str, "set_", 4)) e = gf_node_get_field_by_name(orig, &str[4], &orig_field); if ((e != GF_OK) && parser->is_wrl && strstr(str, "_changed")) { char *s = strstr(str, "_changed"); s[0] = 0; e = gf_node_get_field_by_name(orig, str, &orig_field); } if (e != GF_OK) { gf_bt_report(parser, GF_BAD_PARAM, "%s not a field of node %s (%s)", str, gf_node_get_name(orig), gf_node_get_class_name(orig)); return NULL; } str = gf_bt_get_next(parser, 0); if (strcmp(str, "TO")) { gf_bt_report(parser, GF_BAD_PARAM, "TO expected in route declaration - got \"%s\"", str); return NULL; } strcpy(nstr, gf_bt_get_next(parser, 1)); dest = gf_bt_peek_node(parser, nstr); if (!dest) { gf_bt_report(parser, GF_BAD_PARAM, "cannot find node %s", nstr); return NULL; } if (!gf_bt_check_code(parser, '.')) { gf_bt_report(parser, GF_BAD_PARAM, ". expected in route decl"); return NULL; } str = gf_bt_get_next(parser, 0); e = gf_node_get_field_by_name(dest, str, &dest_field); /*VRML loosy syntax*/ if ((e != GF_OK) && parser->is_wrl && !strnicmp(str, "set_", 4)) e = gf_node_get_field_by_name(dest, &str[4], &dest_field); if ((e != GF_OK) && parser->is_wrl && strstr(str, "_changed")) { char *s = strstr(str, "_changed"); s[0] = 0; e = gf_node_get_field_by_name(dest, str, &dest_field); } if (e != GF_OK) { gf_bt_report(parser, GF_BAD_PARAM, "%s not a field of node %s (%s)", str, gf_node_get_name(dest), gf_node_get_class_name(dest)); return NULL; } if (com) { com->fromNodeID = gf_node_get_id(orig); com->fromFieldIndex = orig_field.fieldIndex; com->toNodeID = gf_node_get_id(dest); com->toFieldIndex = dest_field.fieldIndex; if (rID) { com->RouteID = rID; com->def_name = strdup(rName); /*whenever inserting routes, keep track of max defined ID*/ if (is_insert) { gf_sg_set_max_defined_route_id(parser->load->scene_graph, rID); if (parser->load->ctx && (rID>parser->load->ctx->max_route_id)) parser->load->ctx->max_route_id = rID; } } return NULL; } r = gf_sg_route_new(parser->load->scene_graph, orig, orig_field.fieldIndex, dest, dest_field.fieldIndex); if (r && rID) { gf_sg_route_set_id(r, rID); gf_sg_route_set_name(r, rName); } return r;}void gf_bt_resolve_routes(GF_BTParser *parser, Bool clean){ GF_Command *com; /*resolve all commands*/ while(gf_list_count(parser->unresolved_routes) ) { com = (GF_Command *)gf_list_get(parser->unresolved_routes, 0); gf_list_rem(parser->unresolved_routes, 0); switch (com->tag) { case GF_SG_ROUTE_DELETE: case GF_SG_ROUTE_REPLACE: com->RouteID = gf_bt_get_route(parser, com->unres_name); if (!com->RouteID) gf_bt_report(parser, GF_BAD_PARAM, "Cannot resolve Route %s", com->unres_name); free(com->unres_name); com->unres_name = NULL; com->unresolved = 0; break; } } if (!clean) return; while (gf_list_count(parser->inserted_routes)) gf_list_rem(parser->inserted_routes, 0);}static void bd_set_com_node(GF_Command *com, GF_Node *node){ com->node = node; gf_node_register(com->node, NULL);}GF_Err gf_bt_parse_bifs_command(GF_BTParser *parser, char *name, GF_List *cmdList){ s32 pos; GF_Route *r; GF_Node *n, *newnode; GF_Command *com; GF_CommandField *inf; GF_FieldInfo info; char *str, field[1000]; if (!name) { str = gf_bt_get_next(parser, 0); } else { str = name; } com = NULL; pos = -2; /*REPLACE commands*/ if (!strcmp(str, "REPLACE")) { str = gf_bt_get_next(parser, 1); if (!strcmp(str, "ROUTE")) { str = gf_bt_get_next(parser, 0); r = gf_sg_route_find_by_name(parser->load->scene_graph, str); if (!r) strcpy(field, str); str = gf_bt_get_next(parser, 0); if (strcmp(str, "BY")) { return gf_bt_report(parser, GF_BAD_PARAM, "BY expected got %s", str); } com = gf_sg_command_new(parser->load->scene_graph, GF_SG_ROUTE_REPLACE); if (r) { com->RouteID = r->ID; } else { com->unres_name = strdup(field); com->unresolved = 1; gf_list_add(parser->unresolved_routes, com); } gf_bt_parse_route(parser, 1, 0, com); gf_list_add(cmdList, com); return parser->last_error; } /*scene replace*/ if (!strcmp(str, "SCENE")) { str = gf_bt_get_next(parser, 0); if (strcmp(str, "BY")) { return gf_bt_report(parser, GF_BAD_PARAM, "BY expected got %s", str); } gf_bt_resolve_routes(parser, 1); com = gf_sg_command_new(parser->load->scene_graph, GF_SG_SCENE_REPLACE); while (gf_list_count(parser->def_nodes)) gf_list_rem(parser->def_nodes, 0); /*note we're extremely lucky in BT, REPLACE SCENE can't use protos, it's just a top scene*/ n = gf_bt_sf_node(parser, NULL, NULL, NULL); if (parser->last_error) goto err; com->node = n; gf_list_add(cmdList, com); parser->cur_com = com; return GF_OK; } if (!strcmp(str, "LAST")) pos = -1; else if (!strcmp(str, "BEGIN")) pos = 0; gf_bt_check_code(parser, '.'); strcpy(field, str); n = gf_bt_peek_node(parser, str); if (!n) return gf_bt_report(parser, GF_BAD_PARAM, "%s: unknown node", field); str = gf_bt_get_next(parser, 0); strcpy(field, str); if (gf_bt_check_code(parser, '[')) { if ( (parser->last_error = gf_bt_parse_int(parser, "index", &pos)) ) return parser->last_error; if (!gf_bt_check_code(parser, ']')) return gf_bt_report(parser, GF_BAD_PARAM, "] expected"); } /*node replace*/ if (!strcmp(field, "BY")) { com = gf_sg_command_new(parser->load->scene_graph, GF_SG_NODE_REPLACE); bd_set_com_node(com, n); inf = gf_sg_command_field_new(com); inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL); inf->fieldType = GF_SG_VRML_SFNODE; inf->field_ptr = &inf->new_node; gf_list_add(cmdList, com); parser->cur_com = com; return parser->last_error; } str = gf_bt_get_next(parser, 0); if (strcmp(str, "BY")) return gf_bt_report(parser, GF_BAD_PARAM, "BY expected got %s", str); parser->last_error = gf_node_get_field_by_name(n, field, &info); if (parser->last_error) return gf_bt_report(parser, parser->last_error, "%s: Unknown node field", field); /*field replace*/ if (pos==-2) { com = gf_sg_command_new(parser->load->scene_graph, GF_SG_FIELD_REPLACE); bd_set_com_node(com, n); inf = gf_sg_command_field_new(com); inf->fieldIndex = info.fieldIndex; inf->fieldType = info.fieldType; switch (info.fieldType) { case GF_SG_VRML_SFNODE: inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL); inf->field_ptr = &inf->new_node; if (!gf_bt_check_ndt(parser, &info, inf->new_node, n)) goto err; break; case GF_SG_VRML_MFNODE: { GF_ChildNodeItem *last = NULL; if (!gf_bt_check_code(parser, '[')) break; inf->field_ptr = &inf->node_list; while (!gf_bt_check_code(parser, ']')) { newnode = gf_bt_sf_node(parser, NULL, NULL, NULL); if (!newnode) goto err; if (parser->last_error!=GF_OK) goto err; if (!gf_bt_check_ndt(parser, &info, newnode, n)) goto err; gf_node_list_add_child_last(& inf->node_list, newnode, &last); } } break; default: inf->field_ptr = gf_sg_vrml_field_pointer_new(info.fieldType); info.far_ptr = inf->field_ptr; if (gf_sg_vrml_is_sf_field(info.fieldType)) { gf_bt_sffield(parser, &info, n); } else { gf_bt_mffield(parser, &info, n); } if (parser->last_error) goto err; break; } gf_list_add(cmdList, com); parser->cur_com = com; return parser->last_error; } /*indexed field replace*/ com = gf_sg_command_new(parser->load->scene_graph, GF_SG_INDEXED_REPLACE); bd_set_com_node(com, n); inf = gf_sg_command_field_new(com); inf->pos = pos; inf->fieldIndex = info.fieldIndex; if (gf_sg_vrml_is_sf_field(info.fieldType)) { gf_bt_report(parser, GF_BAD_PARAM, "%s: MF type field expected", info.name); goto err; } inf->fieldType = gf_sg_vrml_get_sf_type(info.fieldType); switch (info.fieldType) { case GF_SG_VRML_MFNODE: inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL); inf->field_ptr = &inf->new_node; break; default: info.fieldType = inf->fieldType; info.far_ptr = inf->field_ptr = gf_sg_vrml_field_pointer_new(inf->fieldType); gf_bt_sffield(parser, &info, n); break; } if (parser->last_error) goto err; gf_list_add(cmdList, com); parser->cur_com = com; return parser->last_error; } /*INSERT commands*/ if (!strcmp(str, "INSERT") || !strcmp(str, "APPEND")) { Bool is_append = !strcmp(str, "APPEND") ? 1 : 0; str = gf_bt_get_next(parser, 0); if (!strcmp(str, "ROUTE")) { com = gf_sg_command_new(parser->load->scene_graph, GF_SG_ROUTE_INSERT); gf_bt_parse_route(parser, 0, 1, com); if (parser->last_error) goto err; gf_list_add(cmdList, com); gf_list_add(parser->inserted_routes, com); parser->cur_com = com; return GF_OK; } if (strcmp(str, "AT") && strcmp(str, "TO")) { return gf_bt_report(parser, GF_BAD_PARAM, (char*) (is_append ? "TO expected got %s" : "AT expected got %s"), str); } str = gf_bt_get_next(parser, 1); strcpy(field, str); n = gf_bt_peek_node(parser, str); if (!n) { return gf_bt_report(parser, GF_BAD_PARAM, "%s: Unknown node", field); } if (!gf_bt_check_code(parser, '.')) { return gf_bt_report(parser, GF_BAD_PARAM, ". expected"); } str = gf_bt_get_next(parser, 1); strcpy(field, str); if (!is_append) { if (!gf_bt_check_code(parser, '[')) { return gf_bt_report(parser, GF_BAD_PARAM, "[ expected"); } gf_bt_parse_int(parser, "index", &pos); if (!gf_bt_check_code(parser, ']')) { return gf_bt_report(parser, GF_BAD_PARAM, "] expected"); } } else { if (gf_bt_check_code(parser, '[')) { return gf_bt_report(parser, GF_BAD_PARAM, "[ unexpected in Append command"); } pos = -1; } if (!strcmp(field, "children")) { com = gf_sg_command_new(parser->load->scene_graph, GF_SG_NODE_INSERT); bd_set_com_node(com, n); inf = gf_sg_command_field_new(com); inf->pos = pos; inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL); inf->fieldType = GF_SG_VRML_SFNODE; inf->field_ptr = &inf->new_node; if (parser->last_error) goto err; parser->cur_com = com; return gf_list_add(cmdList, com); } gf_node_get_field_by_name(n, field, &info); if (gf_sg_vrml_is_sf_field(info.fieldType)) { gf_bt_report(parser, GF_BAD_PARAM, "%s: MF type field expected", info.name); goto err; } com = gf_sg_command_new(parser->load->scene_graph, GF_SG_INDEXED_INSERT); bd_set_com_node(com, n); inf = gf_sg_command_field_new(com); inf->pos = pos; inf->fieldIndex = info.fieldIndex; inf->fieldType = gf_sg_vrml_get_sf_type(info.fieldType); switch (info.fieldType) { case GF_SG_VRML_MFNODE: inf->new_node = gf_bt_sf_node(parser, NULL, NULL, NULL); inf->field_ptr = &inf->new_node; break; default: info.fieldType = inf->fieldType; inf->field_ptr = gf_sg_vrml_field_pointer_new(inf->fieldType); info.far_ptr = inf->field_ptr; gf_bt_sffield(parser, &info, n); break; } if (parser->last_error) goto err; gf_list_add(cmdList, com); parser->cur_com = com; return parser->last_error; } /*DELETE commands*/ if (!strcmp(str, "DELETE")) { str = gf_bt_get_next(parser, 1); if (!strcmp(str, "ROUTE")) { str = gf_bt_get_next(parser, 0); com = gf_sg_command_new(parser->load->scene_graph, GF_SG_ROUTE_DELETE); com->RouteID = gf_bt_get_route(parser, str); if (!com->RouteID) { com->unres_name = strdup(str); com->unresolved = 1; gf_list_add(parser->unresolved_routes, com); } /*for bt<->xmt conversions*/ com->def_name = strdup(str); return gf_list_add(cmdList, com); } strcpy(field, str); n = gf_bt_peek_node(parser, str); if (!n) { return gf_bt_report(parser, GF_BAD_PARAM, "DELETE %s: Unknown Node", field); } if (!gf_bt_check_code(parser, '.')) { com = gf_sg_command_new(parser->load->scene_graph, GF_SG_NODE_DELETE); bd_set_com_node(com, n); return gf_list_add(cmdList
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -