/* * GPAC - Multimedia Framework C SDK * * Authors: Jean Le Feuvre * Copyright (c) Telecom ParisTech 2000-2012 * All rights reserved * * This file is part of GPAC / Scene Compositor sub-project * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef _VISUAL_MANAGER_H_ #define _VISUAL_MANAGER_H_ #include "drawable.h" /*all 2D related functions and macro are locate there*/ #include "visual_manager_2d.h" /*all 3D related functions and macro are locate there*/ #include "visual_manager_3d.h" //startof GL3/ES2.0 specifics /* number of preprocessor flags for GL3/ES2.0 */ #define GF_GL_NUM_OF_FLAGS 6 #ifdef GPAC_ANDROID #define GF_GL_NB_FRAG_SHADERS (1<<(GF_GL_NUM_OF_FLAGS) ) //=2^GF_GL_NUM_OF_FLAGS #else #define GF_GL_NB_FRAG_SHADERS (1<<(GF_GL_NUM_OF_FLAGS-1) ) //=2^GF_GL_NUM_OF_FLAGS-1 ( ExternalOES ignored in fragment shader when the platform is not Android) #endif // GPAC_ANDROID #define GF_GL_NB_VERT_SHADERS (1<<(GF_GL_NUM_OF_FLAGS-2) ) //=2^GF_GL_NUM_OF_FLAGS-2 (YUV and ExternalOES ignored in vertex shader) /* setting preprocessor flags for GL3/ES2.0 shaders */ enum { GF_GL_HAS_TEXTURE = 1, GF_GL_HAS_LIGHT = (1<<1), GF_GL_HAS_COLOR = (1<<2), GF_GL_HAS_CLIP = (1<<3), //only for fragment shaders GF_GL_IS_YUV = (1<<4), GF_GL_IS_ExternalOES = (1<<5), }; //endof enum { GF_3D_CAMERA_STRAIGHT = 0, GF_3D_CAMERA_OFFAXIS, GF_3D_CAMERA_LINEAR, GF_3D_CAMERA_CIRCULAR, }; struct _visual_manager { GF_Compositor *compositor; Bool direct_flush; #ifndef GPAC_DISABLE_3D /*3D type for the visual: 0: visual is 2D 1: visual is 2D with 3D acceleration (2D camera) 2: visual is 3D MPEG-4 (with 3D camera) 3: visual is 3D X3D (with 3D camera) */ u32 type_3d; #endif #ifndef GPAC_DISABLE_VRML /*background stack*/ GF_List *back_stack; /*viewport stack*/ GF_List *view_stack; #endif /*size in pixels*/ u32 width, height; /* * Visual Manager part for 2D drawing and dirty rect */ /*the one and only dirty rect collector for this visual manager*/ GF_RectArray to_redraw; u32 draw_node_index; /*display list (list of drawable context). The first context with no drawable attached to it (ctx->drawable==NULL) marks the end of the display list*/ DrawableContext *context, *cur_context; /*keeps track of nodes drawn last frame*/ struct _drawable_store *prev_nodes, *last_prev_entry; /*pixel area in BIFS coords - eg area to fill with background*/ GF_IRect surf_rect; /*top clipper (may be different than surf_rect when a viewport is active)*/ GF_IRect top_clipper; u32 last_had_back; /*signals that the hardware surface is attached to buffer/device/stencil*/ Bool is_attached; Bool center_coords; Bool has_modif; Bool has_overlays; Bool has_text_edit; /*gets access to graphics handle (either OS-specific or raw memory)*/ GF_Err (*GetSurfaceAccess)(GF_VisualManager *); /*release graphics handle*/ void (*ReleaseSurfaceAccess)(GF_VisualManager *); /*clear given rect or all visual if no rect specified - clear color depends on visual's type: BackColor for background nodes 0x00000000 for composite, compositor clear color otherwise offscreen_clear is set to 1 when the clear targets the entire canvas buffer in hybrid GL mode (full redraw) to 2 when the clear targets a part of the canvas buffer in hybrid GL mode (dirty area clean) */ void (*ClearSurface)(GF_VisualManager *visual, GF_IRect *rc, u32 BackColor, u32 offscreen_clear); /*draws specified texture as flat bitmap*/ Bool (*DrawBitmap)(GF_VisualManager *visual, GF_TraverseState *tr_state, DrawableContext *ctx); /*checks if the visual is ready for being drawn on. Returns GF_FALSE if no draw operation can be sent*/ Bool (*CheckAttached)(GF_VisualManager *visual); /*raster surface interface*/ GF_SURFACE raster_surface; /*raster brush interface*/ GF_STENCIL raster_brush; /*node owning this visual manager (composite textures) - NULL for root visual*/ GF_Node *offscreen; /*value of the flag to use to signal any geometry changes*/ u32 bounds_tracker_modif_flag; u32 num_nodes_prev_frame, num_nodes_current_frame; /*list of video overlays sorted from first to last*/ struct _video_overlay *overlays; #ifndef GPAC_DISABLE_3D /* * Visual Manager part for 3D drawing */ #if defined( _LP64 ) && defined(CONFIG_DARWIN_GL) #define GF_SHADERID u64 #else #define GF_SHADERID u32 #endif #ifndef GPAC_DISABLE_VRML /*navigation stack*/ GF_List *navigation_stack; /*fog stack*/ GF_List *fog_stack; #endif Bool gl_setup; GF_IRect clipper_2d; Bool has_clipper_2d; /*the one and only camera associated with the visual*/ GF_Camera camera; /*list of transparent nodes to draw after TRAVERSE_SORT pass*/ GF_List *alpha_nodes_to_draw; /*lighting stuff*/ u32 num_lights; u32 max_lights; /*cliping stuff*/ u32 num_clips; u32 max_clips; //when using 2D layering in opengl, we store the bounding rect of drawn objects betwwen GL calls, so we //can flush only the minimum part of the texture GF_RectArray hybgl_drawn; u32 nb_objects_on_canvas_since_last_ogl_flush; u32 nb_views, current_view, autostereo_type, camera_layout; Bool reverse_views; GF_SHADERID base_glsl_vertex; u32 *gl_textures; u32 auto_stereo_width, auto_stereo_height; GF_Mesh *autostereo_mesh; GF_SHADERID autostereo_glsl_program; GF_SHADERID autostereo_glsl_fragment; GF_SHADERID current_texture_glsl_program; Bool needs_projection_matrix_reload; /*GL state to emulate with GLSL [ES2.0]*/ Bool has_material_2d; SFColorRGBA mat_2d; Bool has_material; SFColorRGBA materials[4]; Fixed shininess; Bool state_light_on, state_blend_on, state_color_on; GF_ClipInfo clippers[GF_MAX_GL_CLIPS]; Bool has_tx_matrix; GF_Matrix tx_matrix; GF_LightInfo lights[GF_MAX_GL_LIGHTS]; Bool has_inactive_lights; Bool has_fog; u32 fog_type; SFColor fog_color; Fixed fog_density, fog_visibility; /*end of GL state to emulate with GLSL*/ //startof GL3/ES2.0 elements /* shaders used for shader-only drawing */ GF_SHADERID glsl_program; /* Storing Compiled Shaders */ GF_SHADERID glsl_programs[GF_GL_NB_FRAG_SHADERS]; GF_SHADERID glsl_vertex_shaders[GF_GL_NB_VERT_SHADERS]; GF_SHADERID glsl_fragment_shaders[GF_GL_NB_FRAG_SHADERS]; /* If GF_TRUE the Array of Shaders is built */ Bool glsl_has_shaders; /* Compilation/Features Flags for dynamic shader */ u32 glsl_flags; //endof #endif //!GPAC_DISABLE_3D #ifdef GF_SR_USE_DEPTH Fixed depth_vp_position, depth_vp_range; #endif u32 yuv_pixelformat_type; }; /*constructor/destructor*/ GF_VisualManager *visual_new(GF_Compositor *compositor); void visual_del(GF_VisualManager *visual); /*draw cycle for the visual*/ Bool visual_draw_frame(GF_VisualManager *visual, GF_Node *root, GF_TraverseState *tr_state, Bool is_root_visual); /*executes scene event (picks node if needed) - returns FALSE if no scene event handler has been called*/ Bool visual_execute_event(GF_VisualManager *visual, GF_TraverseState *tr_state, GF_Event *ev, GF_ChildNodeItem *children); Bool visual_get_size_info(GF_TraverseState *tr_state, Fixed *surf_width, Fixed *surf_height); /*reset all appearance dirty state and visual registration info*/ void visual_clean_contexts(GF_VisualManager *visual); void visual_reset_graphics(GF_VisualManager *visual); #endif /*_VISUAL_MANAGER_H_*/