void opengl_tnl_set_material(material* material_info, bool set_base_map) { int shader_handle = material_info->get_shader_handle(); int base_map = material_info->get_texture_map(TM_BASE_TYPE); vec4 clr = material_info->get_color(); Assert(shader_handle >= 0); opengl_shader_set_current(shader_handle); if ( Current_shader->shader == SDR_TYPE_PASSTHROUGH_RENDER ) { opengl_shader_set_passthrough(base_map >= 0, material_info->get_texture_type() == TCACHE_TYPE_AABITMAP, &clr, material_info->get_color_scale()); } GL_state.SetAlphaBlendMode(material_info->get_blend_mode()); GL_state.SetZbufferType(material_info->get_depth_mode()); gr_set_cull(material_info->get_cull_mode() ? 1 : 0); gr_zbias(material_info->get_depth_bias()); gr_set_fill_mode(material_info->get_fill_mode()); material::fog &fog_params = material_info->get_fog(); if ( fog_params.enabled ) { gr_fog_set(GR_FOGMODE_FOG, fog_params.r, fog_params.g, fog_params.b, fog_params.dist_near, fog_params.dist_far); } else { gr_fog_set(GR_FOGMODE_NONE, 0, 0, 0); } gr_set_texture_addressing(material_info->get_texture_addressing()); material::clip_plane &clip_params = material_info->get_clip_plane(); if ( clip_params.enabled ) { gr_opengl_set_clip_plane(&clip_params.normal, &clip_params.position); } else { gr_opengl_set_clip_plane(NULL, NULL); } if ( set_base_map && base_map >= 0 ) { float u_scale, v_scale; if ( !gr_opengl_tcache_set(base_map, material_info->get_texture_type(), &u_scale, &v_scale) ) { mprintf(("WARNING: Error setting bitmap texture (%i)!\n", base_map)); } } }
void gr_opengl_update_distortion() { if (Distortion_framebuffer == 0) { // distortion is disabled return; } GR_DEBUG_SCOPE("Update distortion"); TRACE_SCOPE(tracing::UpdateDistortion); GLboolean depth = GL_state.DepthTest(GL_FALSE); GLboolean depth_mask = GL_state.DepthMask(GL_FALSE); GLboolean blend = GL_state.Blend(GL_FALSE); GLboolean cull = GL_state.CullFace(GL_FALSE); opengl_shader_set_passthrough(true); GL_state.PushFramebufferState(); GL_state.BindFrameBuffer(Distortion_framebuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Distortion_texture[!Distortion_switch], 0); glDrawBuffer(GL_COLOR_ATTACHMENT0); glViewport(0,0,32,32); GL_state.Texture.Enable(0, GL_TEXTURE_2D, Distortion_texture[Distortion_switch]); glClearColor(0.5f, 0.5f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); vertex vertices[4]; vertices[0].texture_position.u = 0.0f; vertices[0].texture_position.v = 0.0f; vertices[1].texture_position.u = 0.96875f; vertices[1].texture_position.v = 0.0f; vertices[2].texture_position.u = 0.0f; vertices[2].texture_position.v = 1.0f; vertices[3].texture_position.u = 0.96875f; vertices[3].texture_position.v = 1.0f; vertices[0].screen.xyw.x = 0.03f*(float)gr_screen.max_w; vertices[0].screen.xyw.y = (float)gr_screen.max_h; vertices[1].screen.xyw.x = (float)gr_screen.max_w; vertices[1].screen.xyw.y = (float)gr_screen.max_h; vertices[2].screen.xyw.x = 0.03f*(float)gr_screen.max_w; vertices[2].screen.xyw.y = 0.0f; vertices[3].screen.xyw.x = (float)gr_screen.max_w; vertices[3].screen.xyw.y = 0.0f; vertex_layout vert_def; vert_def.add_vertex_component(vertex_format_data::POSITION2, sizeof(vertex), offsetof(vertex, screen)); vert_def.add_vertex_component(vertex_format_data::TEX_COORD2, sizeof(vertex), offsetof(vertex, texture_position)); opengl_render_primitives_immediate(PRIM_TYPE_TRISTRIP, &vert_def, 4, vertices, sizeof(vertex) * 4); opengl_shader_set_passthrough(false); vertex distortion_verts[33]; for(int i = 0; i < 33; i++) { distortion_verts[i].r = (ubyte)rand() % 256; distortion_verts[i].g = (ubyte)rand() % 256; distortion_verts[i].b = 255; distortion_verts[i].a = 255; distortion_verts[i].screen.xyw.x = 1.f; distortion_verts[i].screen.xyw.y = (float)gr_screen.max_h*0.03125f*i; } vert_def = vertex_layout(); vert_def.add_vertex_component(vertex_format_data::POSITION2, sizeof(vertex), offsetof(vertex, screen)); vert_def.add_vertex_component(vertex_format_data::COLOR4, sizeof(vertex), offsetof(vertex, r)); opengl_render_primitives_immediate(PRIM_TYPE_POINTS, &vert_def, 33, distortion_verts, 33 * sizeof(vertex)); Distortion_switch = !Distortion_switch; // reset state GL_state.PopFramebufferState(); glViewport(0,0,gr_screen.max_w,gr_screen.max_h); GL_state.DepthTest(depth); GL_state.DepthMask(depth_mask); GL_state.Blend(blend); GL_state.CullFace(cull); }
void gr_opengl_scene_texture_end() { if ( !Scene_framebuffer_in_frame ) { return; } GR_DEBUG_SCOPE("End scene texture"); TRACE_SCOPE(tracing::SceneTextureEnd); time_buffer+=flFrametime; if(time_buffer>0.03f) { gr_opengl_update_distortion(); time_buffer = 0.0f; } if ( Gr_post_processing_enabled && !PostProcessing_override ) { gr_post_process_end(); } else { GR_DEBUG_SCOPE("Draw scene texture"); TRACE_SCOPE(tracing::DrawSceneTexture); GLboolean depth = GL_state.DepthTest(GL_FALSE); GLboolean depth_mask = GL_state.DepthMask(GL_FALSE); GLboolean blend = GL_state.Blend(GL_FALSE); GLboolean cull = GL_state.CullFace(GL_FALSE); GL_state.PopFramebufferState(); GL_state.Texture.Enable(0, GL_TEXTURE_2D, Scene_color_texture); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); opengl_shader_set_passthrough(true); GL_state.Array.BindArrayBuffer(0); if (GL_rendering_to_texture) { opengl_draw_textured_quad(0.0f, 0.0f, 0.0f, 0.0f, (float)gr_screen.max_w, (float)gr_screen.max_h, Scene_texture_u_scale, Scene_texture_v_scale); } else { opengl_draw_textured_quad(0.0f, 0.0f, 0.0f, Scene_texture_v_scale, (float)gr_screen.max_w, (float)gr_screen.max_h, Scene_texture_u_scale, 0.0f); } // reset state GL_state.DepthTest(depth); GL_state.DepthMask(depth_mask); GL_state.Blend(blend); GL_state.CullFace(cull); } // Reset the UV scale values Scene_texture_u_scale = 1.0f; Scene_texture_v_scale = 1.0f; Scene_framebuffer_in_frame = false; High_dynamic_range = false; }