void compositor_init_layer3d(GF_Compositor *compositor, GF_Node *node) { Layer3DStack *stack; GF_SAFEALLOC(stack, Layer3DStack); if (!stack) { GF_LOG(GF_LOG_ERROR, GF_LOG_COMPOSE, ("[Compositor] Failed to allocate layer 3d stack\n")); return; } stack->visual = visual_new(compositor); stack->visual->type_3d = 2; stack->visual->camera.is_3D = 1; stack->visual->camera.visibility = 0; stack->visual->camera.speed = FIX_ONE; camera_invalidate(&stack->visual->camera); stack->first = 1; stack->txh.compositor = compositor; stack->drawable = drawable_new(); stack->drawable->node = node; stack->drawable->flags = DRAWABLE_USE_TRAVERSE_DRAW; gf_node_set_private(node, stack); gf_node_set_callback_function(node, TraverseLayer3D); }
void compositor_init_compositetexture3d(GF_Compositor *compositor, GF_Node *node) { M_CompositeTexture3D *c3d = (M_CompositeTexture3D *)node; CompositeTextureStack *st; GF_SAFEALLOC(st, CompositeTextureStack); st->sensors = gf_list_new(); st->previous_sensors = gf_list_new(); gf_sc_texture_setup(&st->txh, compositor, node); /*remove texture from compositor and add it at the end, so that any sub-textures are handled before*/ gf_list_del_item(compositor->textures, &st->txh); gf_list_add(compositor->textures, &st->txh); st->txh.update_texture_fcnt = composite_update; if (c3d->repeatS) st->txh.flags |= GF_SR_TEXTURE_REPEAT_S; if (c3d->repeatT) st->txh.flags |= GF_SR_TEXTURE_REPEAT_T; /*create composite visual*/ st->visual = visual_new(compositor); st->visual->offscreen = node; st->visual->GetSurfaceAccess = composite_get_video_access; st->visual->ReleaseSurfaceAccess = composite_release_video_access; st->first = 1; st->visual->compositor = compositor; gf_node_set_private(node, st); gf_node_set_callback_function(node, composite_traverse); gf_sc_visual_register(compositor, st->visual); #ifdef GPAC_USE_TINYGL st->visual->type_3d = 2; st->visual->camera.is_3D = 1; #else if (! (compositor->video_out->hw_caps & GF_VIDEO_HW_OPENGL_OFFSCREEN)) { st->visual->type_3d = 0; st->visual->camera.is_3D = 0; } else { st->visual->type_3d = 2; st->visual->camera.is_3D = 1; } #endif camera_invalidate(&st->visual->camera); }
static void TraverseUntransform(GF_Node *node, void *rs, Bool is_destroy) { UntransformStack *stack = (UntransformStack *)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)) { Untransform_GetNode(node, &stack->untr); /*lets place it below*/ gf_node_dirty_clear(node, GF_SG_NODE_DIRTY); } } #ifndef GPAC_DISABLE_3D if (tr_state->visual->type_3d) { GF_Matrix mx_model; GF_Camera backup_cam; if (!tr_state->camera) return; gf_mx_copy(mx_model, tr_state->model_matrix); gf_mx_init(tr_state->model_matrix); memcpy(&backup_cam, tr_state->camera, sizeof(GF_Camera)); camera_invalidate(tr_state->camera); tr_state->camera->is_3D=0; tr_state->camera->flags |= CAM_NO_LOOKAT; tr_state->camera->end_zoom = FIX_ONE; camera_update(tr_state->camera, NULL, 1); if (tr_state->traversing_mode == TRAVERSE_SORT) { visual_3d_set_matrix_mode(tr_state->visual, V3D_MATRIX_PROJECTION); visual_3d_matrix_load(tr_state->visual, tr_state->camera->projection.m); visual_3d_set_matrix_mode(tr_state->visual, V3D_MATRIX_MODELVIEW); visual_3d_matrix_load(tr_state->visual, tr_state->camera->modelview.m); visual_3d_set_viewport(tr_state->visual, tr_state->camera->vp); gf_node_traverse_children((GF_Node *)&stack->untr, tr_state); gf_mx_copy(tr_state->model_matrix, mx_model); memcpy(tr_state->camera, &backup_cam, sizeof(GF_Camera)); visual_3d_set_matrix_mode(tr_state->visual, V3D_MATRIX_PROJECTION); visual_3d_matrix_load(tr_state->visual, tr_state->camera->projection.m); visual_3d_set_matrix_mode(tr_state->visual, V3D_MATRIX_MODELVIEW); visual_3d_matrix_load(tr_state->visual, tr_state->camera->modelview.m); visual_3d_set_viewport(tr_state->visual, tr_state->camera->vp); } else if (tr_state->traversing_mode == TRAVERSE_PICK) { Fixed prev_dist = tr_state->visual->compositor->hit_square_dist; GF_Ray r = tr_state->ray; tr_state->ray.orig.x = INT2FIX(tr_state->pick_x); tr_state->ray.orig.y = INT2FIX(tr_state->pick_y); tr_state->ray.orig.z = 0; tr_state->ray.dir.x = 0; tr_state->ray.dir.y = 0; tr_state->ray.dir.z = -FIX_ONE; tr_state->visual->compositor->hit_square_dist=0; gf_node_traverse_children((GF_Node *)&stack->untr, tr_state); gf_mx_copy(tr_state->model_matrix, mx_model); memcpy(tr_state->camera, &backup_cam, sizeof(GF_Camera)); tr_state->ray = r; /*nothing picked, restore previous pick*/ if (!tr_state->visual->compositor->hit_square_dist) tr_state->visual->compositor->hit_square_dist = prev_dist; } else { gf_node_traverse_children((GF_Node *)&stack->untr, tr_state); gf_mx_copy(tr_state->model_matrix, mx_model); memcpy(tr_state->camera, &backup_cam, sizeof(GF_Camera)); } } else #endif { GF_Matrix2D mx2d_backup; gf_mx2d_copy(mx2d_backup, tr_state->transform); gf_mx2d_init(tr_state->transform); group_2d_traverse((GF_Node *)&stack->untr, (GroupingNode2D *)stack, tr_state); gf_mx2d_copy(tr_state->transform, mx2d_backup); } }