void compositor_init_plane_clipper(GF_Compositor *compositor, GF_Node *node) { PlaneClipper pc; if (PlaneClipper_GetNode(node, &pc)) { PlaneClipperStack *stack; GF_SAFEALLOC(stack, PlaneClipperStack); //SetupGroupingNode(stack, compositor->compositor, node, & pc.children); gf_node_set_private(node, stack); gf_node_set_callback_function(node, TraversePlaneClipper); /*we're a grouping node, force bounds rebuild as soon as loaded*/ gf_node_dirty_set(node, GF_SG_CHILD_DIRTY, 0); stack->pc = pc; gf_node_proto_set_grouping(node); } }
static void TraversePlaneClipper(GF_Node *node, void *rs, Bool is_destroy) { PlaneClipperStack *stack = (PlaneClipperStack *)gf_node_get_private(node); GF_TraverseState *tr_state = (GF_TraverseState *) rs; if (is_destroy) { group_3d_delete(node); return; } if (gf_node_dirty_get(node)) { PlaneClipper_GetNode(node, &stack->pc); } if (tr_state->num_clip_planes==MAX_USER_CLIP_PLANES) { group_3d_traverse((GF_Node*)&stack->pc, (GroupingNode*)stack, tr_state); return; } if (tr_state->traversing_mode == TRAVERSE_SORT) { GF_Matrix mx; gf_mx_copy(mx, tr_state->model_matrix); visual_3d_set_clip_plane(tr_state->visual, stack->pc.plane, &mx, 0); tr_state->num_clip_planes++; group_3d_traverse((GF_Node*)&stack->pc, (GroupingNode*)stack, tr_state); visual_3d_reset_clip_plane(tr_state->visual); tr_state->num_clip_planes--; } else { tr_state->clip_planes[tr_state->num_clip_planes] = stack->pc.plane; gf_mx_apply_plane(&tr_state->model_matrix, &tr_state->clip_planes[tr_state->num_clip_planes]); tr_state->num_clip_planes++; group_3d_traverse((GF_Node*)&stack->pc, (GroupingNode*)stack, tr_state); tr_state->num_clip_planes--; } }