static void fs_traverse(GF_Node *node, void *rs, Bool is_destroy) { u32 i; DrawableContext *ctx; FSStack *st = (FSStack *) gf_node_get_private(node); GF_TraverseState *tr_state = (GF_TraverseState*)rs; if (is_destroy) { clean_paths(st); drawable_del(st->drawable); gf_list_del(st->items); gf_free(st); return; } /*check for geometry change*/ if (gf_node_dirty_get(node)) { gf_node_dirty_clear(node, 0); /*build*/ clean_paths(st); build_shape(st, node); } switch (tr_state->traversing_mode) { case TRAVERSE_DRAW_2D: ctx = tr_state->ctx; for (i=0; i<gf_list_count(st->items); i++) { FSItem *item = gf_list_get(st->items, i); ctx->flags &= ~(CTX_PATH_FILLED | CTX_PATH_STROKE); memset(&ctx->aspect, 0, sizeof(DrawAspect2D)); if (item->fill_col) { ctx->aspect.fill_color = item->fill_col; } if (item->width) { ctx->aspect.line_color = item->line_col; ctx->aspect.pen_props.width = item->width; } visual_2d_draw_path(tr_state->visual, item->path, ctx, NULL, NULL, tr_state); } return; #ifndef GPAC_DISABLE_3D case TRAVERSE_DRAW_3D: ctx = tr_state->ctx; for (i=0; i<gf_list_count(st->items); i++) { FSItem *item = gf_list_get(st->items, i); memset(&ctx->aspect, 0, sizeof(DrawAspect2D)); if (item->fill_col) { ctx->aspect.fill_color = item->fill_col; } if (item->width) { ctx->aspect.line_color = item->line_col; ctx->aspect.pen_props.width = item->width; } if (!item->mesh) { item->mesh = new_mesh(); mesh_from_path(item->mesh, item->path); } st->drawable->mesh = item->mesh; visual_3d_draw_2d_with_aspect(st->drawable, tr_state, &ctx->aspect); st->drawable->mesh = NULL; } return; #endif case TRAVERSE_PICK: /*todo*/ return; case TRAVERSE_GET_BOUNDS: tr_state->bounds = st->bounds; return; case TRAVERSE_SORT: #ifndef GPAC_DISABLE_3D if (tr_state->visual->type_3d) return; #endif /*finalize*/ ctx = drawable_init_context_mpeg4(st->drawable, tr_state); if (!ctx) return; /*force width to max width used for clipper compute*/ if (st->max_width) { ctx->aspect.pen_props.width = st->max_width; } drawable_finalize_sort(ctx, tr_state, &st->bounds); break; } }
static void TraverseIFS2D(GF_Node *node, void *rs, Bool is_destroy) { DrawableContext *ctx; M_IndexedFaceSet2D *ifs2D = (M_IndexedFaceSet2D *)node; Drawable *stack = (Drawable *)gf_node_get_private(node); GF_TraverseState *tr_state = (GF_TraverseState *)rs; if (is_destroy) { drawable_node_del(node); return; } if (!ifs2D->coord) return; ifs2d_check_changes(node, stack, tr_state); switch (tr_state->traversing_mode) { case TRAVERSE_DRAW_2D: IFS2D_Draw(node, tr_state); return; #ifndef GPAC_DISABLE_3D case TRAVERSE_DRAW_3D: { DrawAspect2D asp; if (!stack->mesh) { stack->mesh = new_mesh(); mesh_new_ifs2d(stack->mesh, node); } memset(&asp, 0, sizeof(DrawAspect2D)); drawable_get_aspect_2d_mpeg4(node, &asp, tr_state); if (ifs2D->color && !GF_COL_A(asp.fill_color) ) { /*use special func to disable outline recompute and handle recompute ourselves*/ StrikeInfo2D *si = drawable_get_strikeinfo(tr_state->visual->compositor, stack, &asp, tr_state->appear, NULL, 0, tr_state); if (!si->mesh_outline) { si->mesh_outline = new_mesh(); mesh_new_ils(si->mesh_outline, ifs2D->coord, &ifs2D->coordIndex, ifs2D->color, &ifs2D->colorIndex, ifs2D->colorPerVertex, 1); } visual_3d_mesh_strike(tr_state, si->mesh_outline, asp.pen_props.width, asp.line_scale, asp.pen_props.dash); } else { visual_3d_draw_2d_with_aspect(stack, tr_state, &asp); } return; } #endif case TRAVERSE_PICK: vrml_drawable_pick(stack, tr_state); return; case TRAVERSE_GET_BOUNDS: gf_path_get_bounds(stack->path, &tr_state->bounds); return; case TRAVERSE_SORT: #ifndef GPAC_DISABLE_3D if (tr_state->visual->type_3d) return; #endif ctx = drawable_init_context_mpeg4(stack, tr_state); if (!ctx) return; drawable_finalize_sort(ctx, tr_state, NULL); return; } }