示例#1
0
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);
    }
}
示例#2
0
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--;
	}

}