indexing description: "Objects that ..." author: "" date: "$Date: 2007-05-29 23:38:00 +0200 (Tue, 29 May 2007) $" revision: "$Revision: 2595 $" class REFLECTION_PLANE inherit EM3D_ENTITY redefine render_opengl, make end GLEW_FUNCTIONS export {NONE} all undefine copy, is_equal end GLEXT_FUNCTIONS export {NONE} all undefine copy, is_equal end EMGL_BASIC_RENDERER export {NONE} all undefine copy, is_equal end EMGL_DRAW export {NONE} all undefine copy, is_equal end EMGL_SETTINGS export {NONE} all undefine copy, is_equal end EMGL_VIEW export {NONE} all undefine copy, is_equal end GL_CONSTANTS export {NONE} all undefine copy, is_equal end EM_SHARED_BITMAP_FACTORY export {NONE} all undefine copy, is_equal end EM_TIME_SINGLETON export {NONE} all undefine copy, is_equal end create make feature -- Initilization make ( a_scene_manager: like scene_manager ) is -- Create the REFLECTION_PLANE local vertex_shader: EMGL_VERTEX_SHADER fragment_shader: EMGL_FRAGMENT_SHADER -- Handle to the vertex and fragment shader do Precursor( a_scene_manager ) create refleciton_texture.make_empty(1024, 1024) -- Create the TexCoord Generator create tcg -- Create the shader if not (is_supported( "GL_ARB_vertex_program" ) and is_supported( "GL_ARB_fragment_program" ) ) then io.put_string ( " Your system does NOT support shaders!! " ) io.new_line else -- create the shaders create vertex_shader.make_and_compile_from_file( "data/water.vert" ) create fragment_shader.make_and_compile_from_file( "data/water.frag" ) create shader_program.make shader_program.add_fragment_shader ( fragment_shader ) shader_program.add_vertex_shader ( vertex_shader ) shader_program.link io.put_string ( shader_program.log ) bitmap_factory.create_bitmap_from_image ( "data/ripple.png" ) create ripple.make_from_surface ( bitmap_factory.last_bitmap ) end end feature -- Rendering refleciton_texture: EM3D_RENDER_TEXTURE_2D[ EMGL_FORMAT_RGBA ] ripple: EM3D_TEXTURE_2D[ EMGL_FORMAT_RGBA ] tcg: EM3D_EYE_TCG -- Texture Coordinate Generator update_texture( a_render_function: PROCEDURE[ ANY, TUPLE ] ) is -- Recalculate the texture do -- Change the aspect for all render to texture operations emgl_matrix_mode (Em_gl_projection) emgl_push_matrix emgl_matrix_mode (Em_gl_modelview) -- Change the clear_color emgl_push_attrib ( em_gl_color_buffer_bit ) emgl_clear_color ( 0.1,0.1,0.1, 1.0 ) emgl_clear ( em_gl_color_buffer_bit ) refleciton_texture.begin_render_to_texture emgl_finish a_render_function.call( [] ) refleciton_texture.end_render_to_texture -- reset the clear color emgl_pop_attrib -- Reset the aspect emgl_matrix_mode (Em_gl_projection) emgl_pop_matrix emgl_matrix_mode (Em_gl_modelview) end shader_program: EMGL_SHADER_PROGRAM render_opengl is -- Render the plane do -- Bind the shader emgl_push_attrib ( em_gl_enable_bit ) emgl_enable( em_gl_texture_2d ) if shader_program=void then -- Just mirror the scene tcg.enable_generation refleciton_texture.bind emgl_begin (Em_gl_quads) emgl_color3f (1, 1, 1) -- White emgl_tex_coord2d( 0, 0 ) emgl_vertex3d ( 10, 0, 10) emgl_tex_coord2d( 0, 1 ) emgl_vertex3d ( 10, 0,-10) emgl_tex_coord2d( 1, 1 ) emgl_vertex3d (-10, 0,-10) emgl_tex_coord2d( 1, 0 ) emgl_vertex3d (-10, 0, 10) emgl_end refleciton_texture.unbind tcg.disable_generation else gl_enable( em_gl_blend ) gl_blend_func( em_gl_one, em_gl_src_alpha ) shader_program.use shader_program.uniform1i ( "time", time.TICKS ) shader_program.uniform1i ( "reflection", 0 ) shader_program.uniform1i ( "ripple", 1 ) gl_active_texture_arb( em_gl_texture0_arb ) refleciton_texture.bind gl_active_texture_arb( em_gl_texture1_arb ) ripple.bind gl_active_texture_arb( em_gl_texture0_arb ) gl_matrix_mode( em_gl_texture ) gl_load_identity gl_translatef(0.5,0.5,0) gl_scalef(0.5,0.5,0) gl_mult_matrixd(emgl_get_projection_matrix) gl_mult_matrixd(emgl_get_modelview_matrix) emgl_begin (Em_gl_quads) emgl_vertex3d ( 10, 0, 10) emgl_vertex3d ( 10, 0,-10) emgl_vertex3d (-10, 0,-10) emgl_vertex3d (-10, 0, 10) emgl_end gl_load_identity gl_matrix_mode( em_gl_modelview ) shader_program.unuse gl_active_texture_arb( em_gl_texture1_arb ) ripple.unbind gl_active_texture_arb( em_gl_texture0_arb ) end emgl_pop_attrib end end