static void TraverseDepthGroup(GF_Node *node, void *rs, Bool is_destroy) { #ifdef GF_SR_USE_DEPTH Fixed depth_gain, depth_offset; #endif DepthGroupStack *stack = (DepthGroupStack *)gf_node_get_private(node); GF_TraverseState *tr_state = (GF_TraverseState *) rs; if (is_destroy) { gf_free(stack); return; } if (tr_state->traversing_mode==TRAVERSE_SORT) { if (gf_node_dirty_get(node) & GF_SG_NODE_DIRTY) { gf_node_dirty_clear(node, GF_SG_NODE_DIRTY); /*flag is not set for PROTO*/ gf_node_dirty_set(node, GF_SG_CHILD_DIRTY, 0); } } DepthGroup_GetNode(node, &stack->dg); #ifdef GF_SR_USE_DEPTH depth_gain = tr_state->depth_gain; depth_offset = tr_state->depth_offset; // new offset is multiplied by parent gain and added to parent offset tr_state->depth_offset = gf_mulfix(stack->dg.depth_offset, tr_state->depth_gain) + tr_state->depth_offset; // gain is multiplied by parent gain tr_state->depth_gain = gf_mulfix(tr_state->depth_gain, stack->dg.depth_gain); #endif #ifndef GPAC_DISABLE_3D if (tr_state->visual->type_3d) { GF_Matrix mx_bckup, mx; gf_mx_copy(mx_bckup, tr_state->model_matrix); gf_mx_init(mx); mx.m[14] = gf_mulfix(stack->dg.depth_offset, tr_state->visual->compositor->depth_gl_scale); gf_mx_add_matrix(&tr_state->model_matrix, &mx); group_2d_traverse((GF_Node *)&stack->dg, (GroupingNode2D*)stack, tr_state); gf_mx_copy(tr_state->model_matrix, mx_bckup); } else #endif { group_2d_traverse((GF_Node *)&stack->dg, (GroupingNode2D*)stack, tr_state); } #ifdef GF_SR_USE_DEPTH tr_state->depth_gain = depth_gain; tr_state->depth_offset = depth_offset; #endif }
void compositor_init_depth_group(GF_Compositor *compositor, GF_Node *node) { DepthGroup dg; if (DepthGroup_GetNode(node, &dg)) { DepthGroupStack *stack; GF_SAFEALLOC(stack, DepthGroupStack); gf_node_set_private(node, stack); gf_node_set_callback_function(node, TraverseDepthGroup); stack->dg = dg; gf_node_proto_set_grouping(node); } else GF_LOG(GF_LOG_DEBUG, GF_LOG_COMPOSE, ("[Compositor2D] Unable to initialize depth group \n")); }