void batch_render_all(int stream_buffer) { if ( stream_buffer >= 0 ) { // need to get vertex size int n_to_render = batch_get_size(); int n_verts = 0; if ( ( Batch_buffer_size < (n_to_render * sizeof(effect_vertex)) ) ) { if ( Batch_buffer != NULL ) { vm_free(Batch_buffer); } Batch_buffer_size = n_to_render * sizeof(effect_vertex); Batch_buffer = vm_malloc(Batch_buffer_size); } batch_load_buffer_lasers((effect_vertex*)Batch_buffer, &n_verts); batch_load_buffer_geometry_map_bitmaps((effect_vertex*)Batch_buffer, &n_verts); batch_load_buffer_distortion_map_bitmaps((effect_vertex*)Batch_buffer, &n_verts); gr_update_buffer_object(stream_buffer, Batch_buffer_size, Batch_buffer); Assert(n_verts <= n_to_render); batch_render_lasers(stream_buffer); batch_render_geometry_map_bitmaps(stream_buffer); //batch_render_distortion_map_bitmaps(true); } else { batch_render_lasers(); batch_render_geometry_map_bitmaps(); //batch_render_distortion_map_bitmaps(); } gr_clear_states(); }
void CJumpNode::Render(vec3d *pos, vec3d *view_pos) { draw_list scene; Render(&scene, pos, view_pos); scene.render_all(); gr_set_fill_mode(GR_FILL_MODE_SOLID); gr_clear_states(); gr_set_buffer(-1); }
void batching_render_all(bool render_distortions) { GR_DEBUG_SCOPE("Batching render all"); TRACE_SCOPE(tracing::DrawEffects); batching_load_buffers(render_distortions); SCP_map<batch_buffer_key, primitive_batch_buffer>::iterator bi; for ( bi = Batching_buffers.begin(); bi != Batching_buffers.end(); ++bi ) { batching_render_buffer(&bi->second); } gr_clear_states(); }
void shadows_render_all(float fov, matrix *eye_orient, vec3d *eye_pos) { if ( Static_light.empty() ) { return; } light *lp = *(Static_light.begin()); if( Cmdline_nohtl || !Cmdline_shadow_quality || !lp ) { return; } //shadows_debug_show_frustum(&Player_obj->orient, &Player_obj->pos, fov, gr_screen.clip_aspect, Min_draw_distance, 3000.0f); gr_end_proj_matrix(); gr_end_view_matrix(); // these cascade distances are a result of some arbitrary tuning to give a good balance of quality and banding. // maybe we could use a more programmatic algorithim? matrix light_matrix = shadows_start_render(eye_orient, eye_pos, fov, gr_screen.clip_aspect, 200.0f, 600.0f, 2500.0f, 8000.0f); draw_list scene; object *objp = Objects; for ( int i = 0; i <= Highest_object_index; i++, objp++ ) { bool cull = true; for ( int j = 0; j < MAX_SHADOW_CASCADES; ++j ) { if ( shadows_obj_in_frustum(objp, &light_matrix, &Shadow_frustums[j].min, &Shadow_frustums[j].max) ) { cull = false; break; } } if ( cull ) { continue; } switch(objp->type) { case OBJ_SHIP: { obj_queue_render(objp, &scene); } break; case OBJ_ASTEROID: { model_render_params render_info; render_info.set_object_number(OBJ_INDEX(objp)); render_info.set_flags(MR_IS_ASTEROID | MR_NO_TEXTURING | MR_NO_LIGHTING); model_clear_instance( Asteroid_info[Asteroids[objp->instance].asteroid_type].model_num[Asteroids[objp->instance].asteroid_subtype]); model_render_queue(&render_info, &scene, Asteroid_info[Asteroids[objp->instance].asteroid_type].model_num[Asteroids[objp->instance].asteroid_subtype], &objp->orient, &objp->pos); } break; case OBJ_DEBRIS: { debris *db; db = &Debris[objp->instance]; if ( !(db->flags & DEBRIS_USED)){ continue; } objp = &Objects[db->objnum]; model_render_params render_info; render_info.set_flags(MR_NO_TEXTURING | MR_NO_LIGHTING); submodel_render_queue(&render_info, &scene, db->model_num, db->submodel_num, &objp->orient, &objp->pos); } break; } } scene.init_render(); scene.render_all(GR_ZBUFF_FULL); shadows_end_render(); gr_zbias(0); gr_zbuffer_set(ZBUFFER_TYPE_READ); gr_set_cull(0); gr_clear_states(); gr_set_buffer(-1); GL_state.Texture.DisableAll(); gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance); gr_set_view_matrix(&Eye_position, &Eye_matrix); }