void drawable_3d_base_traverse(GF_Node *n, void *rs, Bool is_destroy, void (*build_shape)(GF_Node*,Drawable3D *,GF_TraverseState *) ) { GF_TraverseState *tr_state = (GF_TraverseState *)rs; Drawable3D *stack = (Drawable3D*)gf_node_get_private(n); if (is_destroy) { drawable_3d_del(n); return; } if (gf_node_dirty_get(n)) { mesh_reset(stack->mesh); GF_LOG(GF_LOG_DEBUG, GF_LOG_COMPOSE, ("[Compositor] Rebuilding mesh %s\n", gf_node_get_class_name(n))); build_shape(n, stack, tr_state); gf_node_dirty_clear(n, 0); } switch (tr_state->traversing_mode) { case TRAVERSE_DRAW_3D: visual_3d_draw(tr_state, stack->mesh); drawable3d_check_focus_highlight(n, tr_state, &stack->mesh->bounds); break; case TRAVERSE_GET_BOUNDS: tr_state->bbox = stack->mesh->bounds; break; case TRAVERSE_PICK: visual_3d_vrml_drawable_pick(n, tr_state, stack->mesh, NULL); return; } }
static void FS_Render(SFNode *node, void *rs) { Bool build; DrawableContext *ctx; FSStack *st = (FSStack *) Node_GetPrivate(node); RenderEffect2D *eff = (RenderEffect2D *)rs; /*check for geometry change*/ build = 0; if (Node_GetDirty(node)) { /*build*/ clean_paths(st, st->graph->compositor->g_hw); build_shape(st, node); Node_ClearDirty(node); st->graph->node_changed = 1; } /*finalize*/ ctx = drawable_init_context(st->graph, eff); if (!ctx) return; ctx->original = st->bounds; /*force width to maw width used for clipper compute*/ if (st->max_width) { ctx->aspect.has_line = 1; ctx->aspect.pen_props.width = st->max_width; } drawable_finalize_render(ctx, eff); }
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; } }