2019-12-09 05:22 EST


View Issue Details Jump to Notes ] Related Changesets ]
IDProjectCategoryView StatusLast Update
0001768FSSCPcutscenespublic2012-01-15 19:27
ReporterTolwyn 
Assigned ToThe_E 
PriorityhighSeverityminorReproducibilityalways
StatusresolvedResolutionreopened 
Product Version3.6.11 
Target Version3.7.2Fixed in Version3.6.12 RC1 
Summary0001768: cutscene bars do not work
DescriptionThe summary says it all: in recent builds cutscene bars do not show up.
Additional InformationI noticed this first time with the very first normal maps public build
TagsNo tags attached.
Attached Files
  • patch file icon cutscene_bars_fix.patch (5,640 bytes) 2008-09-25 14:11 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 4831)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -6283,21 +6283,23 @@
     		else
     			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
     
    -		//Set rectangles
    -		gr_set_color(0,0,0);
    -		gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -		gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		//Set teh clipping
    -		//gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    +		//Set scissors
    +		gr_set_scissor(0, 0, gr_screen.max_w, yborder);
    +		gr_clear();
    +		gr_set_scissor(0, gr_screen.max_h - yborder, gr_screen.max_w, gr_screen.max_h);
    +		gr_clear();
    +		gr_unset_scissor();
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
     		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
     
    -		gr_set_color(0,0,0);
    -		gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -		gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		//gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );	
    +		//Set scissors
    +		gr_set_scissor(0, 0, gr_screen.max_w, yborder);
    +		gr_clear();
    +		gr_set_scissor(0, gr_screen.max_h - yborder, gr_screen.max_w, gr_screen.max_h);
    +		gr_clear();
    +		gr_unset_scissor();
     	}
     }
     
    Index: code/graphics/2d.h
    ===================================================================
    --- code/graphics/2d.h	(revision 4831)
    +++ code/graphics/2d.h	(working copy)
    @@ -928,7 +928,13 @@
     
     	// resets the clipping region to entire screen
     	void (*gf_reset_clip)();
    + 
    +	// sets the scissor region
    +	void (*gf_set_scissor)(int x, int y, int w, int h);
     
    +	// resets the scissor region to entire screen
    +	void (*gf_unset_scissor)();
    +
     	//void (*gf_set_color)( int r, int g, int b );
     	//void (*gf_get_color)( int * r, int * g, int * b );
     	//void (*gf_init_color)( color * dst, int r, int g, int b );
    @@ -1229,6 +1235,12 @@
     	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
     }
     #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
    +
    +__inline void gr_set_scissor(int x, int y, int w, int h)
    +{
    +	(*gr_screen.gf_set_scissor)(x,y,w,h);
    +}
    +#define gr_unset_scissor		GR_CALL(gr_screen.gf_unset_scissor)
     //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
     
     //#define gr_init_color		GR_CALL(gr_screen.gf_init_color)
    Index: code/graphics/grd3d.cpp
    ===================================================================
    --- code/graphics/grd3d.cpp	(revision 4831)
    +++ code/graphics/grd3d.cpp	(working copy)
    @@ -1582,6 +1582,48 @@
     
     }
     
    +void gr_d3d_set_scissor(int x, int y, int w, int h)
    +{
    +	// check for sanity of parameters
    +	if (x < 0)
    +		x = 0;
    +	if (y < 0)
    +		y = 0;
    +
    +	int max_w = gr_screen.max_w;
    +	int max_h = gr_screen.max_h;
    +
    +	if (x >= max_w)
    +		x = max_w - 1;
    +	if (y >= max_h)
    +		y = max_h - 1;
    +
    +	if (x + w > max_w)
    +		w = max_w - x;
    +	if (y + h > max_h)
    +		h = max_h - y;
    +
    +	if (w > max_w)
    +		w = max_w;
    +	if (h > max_h)
    +		h = max_h;
    +
    +	// just return early if we aren't actually going to need the scissor test
    +	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
    +		GlobalD3DVars::lpD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE , FALSE);
    +		return;
    +	}
    +
    +	RECT rect = {x, y, w, h};
    +	GlobalD3DVars::lpD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE);
    +	GlobalD3DVars::lpD3DDevice->SetScissorRect(&rect);
    +}
    +
    +void gr_d3d_unset_scissor()
    +{
    +	GlobalD3DVars::lpD3DDevice->SetRenderState(D3DRS_SCISSORTESTENABLE , FALSE);
    +}
    +
     void gr_d3d_flip_cleanup()
     {
     	d3d_stop_frame();
    Index: code/graphics/grd3dsetup.cpp
    ===================================================================
    --- code/graphics/grd3dsetup.cpp	(revision 4831)
    +++ code/graphics/grd3dsetup.cpp	(working copy)
    @@ -799,6 +799,8 @@
     {
     		// Set all the pointer to functions to the correct D3D functions
     	gr_screen.gf_flip = gr_d3d_flip;
    +	gr_screen.gf_set_scissor = gr_d3d_set_scissor;
    +	gr_screen.gf_unset_scissor = gr_d3d_unset_scissor;
     	gr_screen.gf_set_clip = gr_d3d_set_clip;
     	gr_screen.gf_reset_clip = gr_d3d_reset_clip;
     
    Index: code/graphics/gropengl.cpp
    ===================================================================
    --- code/graphics/gropengl.cpp	(revision 4831)
    +++ code/graphics/gropengl.cpp	(working copy)
    @@ -1510,6 +1510,47 @@
     #endif
     }
     
    +void gr_opengl_set_scissor(int x, int y, int w, int h)
    +{
    +	// check for sanity of parameters
    +	if (x < 0)
    +		x = 0;
    +	if (y < 0)
    +		y = 0;
    +
    +	int max_w = gr_screen.max_w;
    +	int max_h = gr_screen.max_h;
    +
    +	if (x >= max_w)
    +		x = max_w - 1;
    +	if (y >= max_h)
    +		y = max_h - 1;
    +
    +	if (x + w > max_w)
    +		w = max_w - x;
    +	if (y + h > max_h)
    +		h = max_h - y;
    +
    +	if (w > max_w)
    +		w = max_w;
    +	if (h > max_h)
    +		h = max_h;
    +
    +	// just return early if we aren't actually going to need the scissor test
    +	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
    +		glDisable(GL_SCISSOR_TEST);
    +		return;
    +	}
    +
    +	glEnable(GL_SCISSOR_TEST);
    +	glScissor(x, gr_screen.max_h - y - h, w, h);
    +}
    +
    +void gr_opengl_unset_scissor()
    +{
    +	glDisable(GL_SCISSOR_TEST);
    +}
    +
     void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
     {
     	// check for sanity of parameters
    @@ -2824,6 +2865,8 @@
     	//       if they shouldn't be run in non-HTL mode, Don't keep separate entries.
     
     	gr_screen.gf_flip				= gr_opengl_flip;
    +	gr_screen.gf_set_scissor        = gr_opengl_set_scissor;
    +	gr_screen.gf_unset_scissor      = gr_opengl_unset_scissor;
     	gr_screen.gf_set_clip			= gr_opengl_set_clip;
     	gr_screen.gf_reset_clip			= gr_opengl_reset_clip;
     	
    
    patch file icon cutscene_bars_fix.patch (5,640 bytes) 2008-09-25 14:11 +
  • jpg file icon screen0030.jpg (85,226 bytes) 2009-02-20 07:47 -
    jpg file icon screen0030.jpg (85,226 bytes) 2009-02-20 07:47 +
  • ? file icon skybox_default.pof (3,483 bytes) 2009-03-07 06:29
  • jpg file icon screen0211.jpg (47,939 bytes) 2009-05-31 12:49 -
    jpg file icon screen0211.jpg (47,939 bytes) 2009-05-31 12:49 +
  • jpg file icon screen0210.jpg (105,109 bytes) 2009-05-31 12:49 -
    jpg file icon screen0210.jpg (105,109 bytes) 2009-05-31 12:49 +
  • patch file icon cutscene_bars_rtt.patch (1,627 bytes) 2009-11-17 11:58 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 5660)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -3818,11 +3818,6 @@
     	// setup neb2 rendering
     	neb2_render_setup(Main_camera);
     
    -	if(!Time_compression_locked)
    -		game_set_view_clip(flFrametime);
    -	else
    -		game_set_view_clip(flRealframetime);
    -
     	return Main_camera;
     }
     
    @@ -3833,6 +3828,8 @@
     int Game_subspace_effect = 0;
     DCF_BOOL( subspace, Game_subspace_effect )
     
    +void clip_frame_view();
    +
     // Does everything needed to render a frame
     void game_render_frame( camid cid )
     {
    @@ -3885,6 +3882,8 @@
     			Env_cubemap_drawn = true;
     		}
     	}
    +	gr_zbuffer_clear(TRUE);
    +	clip_frame_view();
     
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
    @@ -4564,6 +4563,22 @@
     	}
     }
     
    +void clip_frame_view() {
    +	if(!Time_compression_locked) {
    +		// Player is dead
    +		game_set_view_clip(flFrametime);
    +
    +		// Cutscene bars
    +		bars_do_frame(flRealframetime);
    +	} else {
    +		// Player is dead
    +		game_set_view_clip(flRealframetime);
    +
    +		// Cutscene bars
    +		bars_do_frame(flRealframetime);
    +	}
    +}
    +
     //WMC - This does stuff like fading in and out and subtitles. Special FX?
     //Basically stuff you need rendered after everything else (including HUD)
     void game_render_post_frame()
    @@ -4708,9 +4723,6 @@
     			DEBUG_GET_TIME( render3_time1 )
     			camid cid = game_render_frame_setup();
     
    -			// WMC's cutscene bars function
    -			bars_do_frame(Time_compression_locked ? flRealframetime : flFrametime);
    -
     			game_render_frame( cid );
     
     			// save the eye position and orientation
    
    patch file icon cutscene_bars_rtt.patch (1,627 bytes) 2009-11-17 11:58 +
  • patch file icon 1768_patch_18122009.patch (4,782 bytes) 2009-12-18 12:06 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 5725)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -2824,11 +2824,10 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    -			// J.S. I've changed my ways!! See the new "no constants" code!!!
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    -		}
    +		} 
    +		//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    +		// J.S. I've changed my ways!! See the new "no constants" code!!!
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
     	}
     	else {
     		// Set the clip region for normal view
    @@ -3863,6 +3862,26 @@
     
     	g3_start_frame(game_zbuffer);
     
    +	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    +	if ( Cmdline_env && !Env_cubemap_drawn ) {
    +		setup_environment_mapping(cid);
    +
    +		if ( !Dynamic_environment ) {
    +			Env_cubemap_drawn = true;
    +		}
    +
    +	}
    +
    +	gr_zbuffer_clear(TRUE);
    +
    +	gr_reset_clip();
    +
    +	gr_screen.gf_post_process_before();
    +
    +	clip_frame_view();
    +
    +	neb2_render_setup(cid);
    +
     	camera *cam = cid.getCamera();
     	matrix eye_no_jitter = vmd_identity_matrix;
     	if(cam != NULL)
    @@ -3902,22 +3921,6 @@
     		shield_point_multi_setup();
     	}
     
    -	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    -	if ( Cmdline_env && !Env_cubemap_drawn ) {
    -		setup_environment_mapping(cid);
    -
    -		if ( !Dynamic_environment ) {
    -			Env_cubemap_drawn = true;
    -		}
    -	}
    -	gr_zbuffer_clear(TRUE);
    -
    -	gr_screen.gf_post_process_before();
    -
    -	clip_frame_view();
    -
    -	neb2_set_frame_backg();
    -
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
     		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
    @@ -4585,11 +4588,10 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//Set clipping
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
     		}
    +		//Set clipping
    +		gr_reset_clip();
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
    @@ -4599,10 +4601,10 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
     		}
    +
    +		gr_reset_clip();
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
     	}
     }
     
    Index: code/nebula/neb.cpp
    ===================================================================
    --- code/nebula/neb.cpp	(revision 5725)
    +++ code/nebula/neb.cpp	(working copy)
    @@ -470,23 +470,6 @@
     	}
     }
     
    -void neb2_set_frame_backg() {
    -	ubyte tr = gr_screen.current_clear_color.red;  
    -	ubyte tg = gr_screen.current_clear_color.green;
    -	ubyte tb = gr_screen.current_clear_color.blue; 
    -
    -	neb2_get_fog_color(
    -		&gr_screen.current_clear_color.red,
    -		&gr_screen.current_clear_color.green,
    -		&gr_screen.current_clear_color.blue);
    -	
    -	gr_clear();
    -	
    -	gr_screen.current_clear_color.red   = tr;
    -	gr_screen.current_clear_color.green = tg;
    -	gr_screen.current_clear_color.blue  = tb;
    -}
    -
     // call before beginning all rendering
     void neb2_render_setup(camid cid)
     {
    @@ -502,8 +485,21 @@
     	if (Neb2_render_mode == NEB2_RENDER_HTL) {
     		// RT The background needs to be the same colour as the fog and this seems
     		// to be the ideal place to do it
    -		neb2_set_frame_backg();
    +		ubyte tr = gr_screen.current_clear_color.red;  
    +		ubyte tg = gr_screen.current_clear_color.green;
    +		ubyte tb = gr_screen.current_clear_color.blue; 
     
    +		neb2_get_fog_color(
    +			&gr_screen.current_clear_color.red,
    +			&gr_screen.current_clear_color.green,
    +			&gr_screen.current_clear_color.blue);
    +		
    +		gr_clear();
    +		
    +		gr_screen.current_clear_color.red   = tr;
    +		gr_screen.current_clear_color.green = tg;
    +		gr_screen.current_clear_color.blue  = tb;
    +
     		return;	 
     	}
     
    Index: code/nebula/neb.h
    ===================================================================
    --- code/nebula/neb.h	(revision 5725)
    +++ code/nebula/neb.h	(working copy)
    @@ -140,8 +140,5 @@
     
     void neb2_get_fog_color(ubyte *r, ubyte *g, ubyte *b);
     
    -// set frame background color
    -void neb2_set_frame_backg();
     
    -
     #endif
    
    patch file icon 1768_patch_18122009.patch (4,782 bytes) 2009-12-18 12:06 +
  • patch file icon cutscene_bars.patch (8,652 bytes) 2009-12-18 15:36 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 5726)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -198,6 +198,7 @@
     
     bool Env_cubemap_drawn = false;
     
    +void bars_do_frame(float frametime);
     void game_reset_view_clip();
     void game_reset_shade_frame();
     void game_post_level_init();
    @@ -2812,48 +2813,6 @@
     	Cutscene_bars_progress = 1.0f;
     }
     
    -void game_set_view_clip(float frametime)
    -{
    -	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
    -	{
    -		// Set the clip region for the letterbox "dead view"
    -		int yborder = gr_screen.max_h/4;
    -
    -		if (g3_in_frame() == 0) {
    -			// Ensure that the bars are black
    -			gr_set_color(0,0,0);
    -			gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    -			// J.S. I've changed my ways!! See the new "no constants" code!!!
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    -		}
    -	}
    -	else {
    -		// Set the clip region for normal view
    -		if ( View_percent >= 100 )	{
    -			gr_reset_clip();
    -		} else {
    -			int xborder, yborder;
    -
    -			if ( View_percent < 5 )	{
    -				View_percent = 5;
    -			}
    -
    -			float fp = i2fl(View_percent)/100.0f;
    -			int fi = fl2i(fl_sqrt(fp)*100.0f);
    -			if ( fi > 100 ) fi=100;
    -			
    -			xborder = ( gr_screen.max_w*(100-fi) )/200;
    -			yborder = ( gr_screen.max_h*(100-fi) )/200;
    -
    -			gr_set_clip(xborder, yborder, gr_screen.max_w-xborder*2,gr_screen.max_h-yborder*2, false );
    -		}
    -	}
    -}
    -
    -
     void show_debug_stuff()
     {
     	int	i;
    @@ -3855,14 +3814,28 @@
     int Game_subspace_effect = 0;
     DCF_BOOL( subspace, Game_subspace_effect )
     
    -void clip_frame_view();
    -
     // Does everything needed to render a frame
     void game_render_frame( camid cid )
     {
     
     	g3_start_frame(game_zbuffer);
     
    +	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    +	if ( Cmdline_env && !Env_cubemap_drawn ) {
    +		setup_environment_mapping(cid);
    +
    +		if ( !Dynamic_environment ) {
    +			Env_cubemap_drawn = true;
    +		}
    +	}
    +	gr_zbuffer_clear(TRUE);
    +
    +	gr_screen.gf_post_process_before();
    +
    +	bars_do_frame(flRealframetime);
    +
    +	neb2_render_setup(cid);
    +
     	camera *cam = cid.getCamera();
     	matrix eye_no_jitter = vmd_identity_matrix;
     	if(cam != NULL)
    @@ -3902,22 +3875,6 @@
     		shield_point_multi_setup();
     	}
     
    -	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    -	if ( Cmdline_env && !Env_cubemap_drawn ) {
    -		setup_environment_mapping(cid);
    -
    -		if ( !Dynamic_environment ) {
    -			Env_cubemap_drawn = true;
    -		}
    -	}
    -	gr_zbuffer_clear(TRUE);
    -
    -	gr_screen.gf_post_process_before();
    -
    -	clip_frame_view();
    -
    -	neb2_set_frame_backg();
    -
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
     		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
    @@ -4557,11 +4514,19 @@
     	gr_flash_alpha(Viewer_shader.r, Viewer_shader.g, Viewer_shader.b, Viewer_shader.c);
     }
     
    +const static int DEAD_VIEW_DIVISOR = 4;
     const static int CUTSCENE_BAR_DIVISOR = 8;
     void bars_do_frame(float frametime)
     {
    -	if((Cutscene_bar_flags & CUB_GRADUAL) && Cutscene_bars_progress < 1.0f)
    +	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
     	{
    +		// Set the clip region for the letterbox "dead view"
    +		int yborder = gr_screen.max_h/DEAD_VIEW_DIVISOR;
    +
    +		gr_scissor(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2);
    +	}
    +	else if((Cutscene_bar_flags & CUB_GRADUAL) && Cutscene_bars_progress < 1.0f)
    +	{
     		//Determine how far along we are
     		Assert(Cutscene_delta_time > 0.0f);
     
    @@ -4574,51 +4539,42 @@
     		}
     
     		//Figure out where the bars should be
    -		int yborder;
    -		if(Cutscene_bar_flags & CUB_CUTSCENE)
    +		int yborder = 0;
    +		if(Cutscene_bar_flags & CUB_CUTSCENE) {
     			yborder = fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
    -		else
    -			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
    -
    -		if (g3_in_frame() == 0) {
    -			//Set rectangles
    -			gr_set_color(0,0,0);
    -			gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
     		} else {
    -			//Set clipping
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
    +			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
     		}
    +
    +		gr_scissor(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2);
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
     		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
     
    -		if (g3_in_frame() == 0) {
    -			gr_set_color(0,0,0);
    -			gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
    -		}
    +		gr_scissor(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2);
     	}
    -}
    +	else
    +	{
    +		// Set the clip region for normal view
    +		if ( View_percent >= 100 )	{
    +			gr_no_scissor();
    +		} else {
    +			int xborder, yborder;
     
    -void clip_frame_view() {
    -	if(!Time_compression_locked) {
    -		// Player is dead
    -		game_set_view_clip(flFrametime);
    +			if ( View_percent < 5 )	{
    +				View_percent = 5;
    +			}
     
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    -	} else {
    -		// Player is dead
    -		game_set_view_clip(flRealframetime);
    +			float fp = i2fl(View_percent)/100.0f;
    +			int fi = fl2i(fl_sqrt(fp)*100.0f);
    +			if ( fi > 100 ) fi=100;
    +			
    +			xborder = ( gr_screen.max_w*(100-fi) )/200;
    +			yborder = ( gr_screen.max_h*(100-fi) )/200;
     
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    +			gr_scissor(xborder, yborder, gr_screen.max_w-xborder*2,gr_screen.max_h-yborder*2);
    +		}
     	}
     }
     
    @@ -4766,7 +4722,7 @@
     			DEBUG_GET_TIME( render3_time1 )
     			camid cid = game_render_frame_setup();
     
    -			clip_frame_view();
    +			bars_do_frame(flRealframetime);
     
     			game_render_frame( cid );
     
    Index: code/graphics/2d.h
    ===================================================================
    --- code/graphics/2d.h	(revision 5726)
    +++ code/graphics/2d.h	(working copy)
    @@ -229,6 +229,12 @@
     	// resets the clipping region to entire screen
     	void (*gf_reset_clip)();
     
    +	// sets the scissor region
    +	void (*gf_scissor)(int x, int y, int w, int h);
    +
    +	// resets the scissor region to entire screen
    +	void (*gf_no_scissor)();
    +
     	//void (*gf_set_color)( int r, int g, int b );
     	//void (*gf_get_color)( int * r, int * g, int * b );
     	//void (*gf_init_color)( color * dst, int r, int g, int b );
    @@ -537,6 +543,13 @@
     	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
     }
     #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
    +
    +__inline void gr_scissor(int x, int y, int w, int h)
    +{
    +	(*gr_screen.gf_scissor)(x,y,w,h);
    +}
    +#define gr_no_scissor		GR_CALL(gr_screen.gf_no_scissor)
    +
     //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
     
     //#define gr_init_color		GR_CALL(gr_screen.gf_init_color)
    Index: code/graphics/gropengl.cpp
    ===================================================================
    --- code/graphics/gropengl.cpp	(revision 5726)
    +++ code/graphics/gropengl.cpp	(working copy)
    @@ -375,6 +375,47 @@
     #endif
     }
     
    +void gr_opengl_scissor(int x, int y, int w, int h)
    +{
    +	// Check for sanity of parameters
    +	if (x < 0)
    +		x = 0;
    +	if (y < 0)
    +		y = 0;
    +
    +	int max_w = gr_screen.max_w;
    +	int max_h = gr_screen.max_h;
    +
    +	if (x >= max_w)
    +		x = max_w - 1;
    +	if (y >= max_h)
    +		y = max_h - 1;
    +
    +	if (x + w > max_w)
    +		w = max_w - x;
    +	if (y + h > max_h)
    +		h = max_h - y;
    +
    +	if (w > max_w)
    +		w = max_w;
    +	if (h > max_h)
    +		h = max_h;
    +
    +	// Disable scissor test if we're rendering the full screen again
    +	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
    +		glDisable(GL_SCISSOR_TEST);
    +		return;
    +	}
    +
    +	glEnable(GL_SCISSOR_TEST);
    +	glScissor(x, gr_screen.max_h - y - h, w, h);
    +}
    +
    +void gr_opengl_no_scissor()
    +{
    +	glDisable(GL_SCISSOR_TEST);
    +}
    +
     void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
     {
     	// check for sanity of parameters
    @@ -1702,6 +1743,8 @@
     	gr_screen.gf_flip				= gr_opengl_flip;
     	gr_screen.gf_set_clip			= gr_opengl_set_clip;
     	gr_screen.gf_reset_clip			= gr_opengl_reset_clip;
    +	gr_screen.gf_scissor			= gr_opengl_scissor;
    +	gr_screen.gf_no_scissor			= gr_opengl_no_scissor;
     	
     	gr_screen.gf_clear				= gr_opengl_clear;
     //	gr_screen.gf_bitmap				= gr_opengl_bitmap;
    
    patch file icon cutscene_bars.patch (8,652 bytes) 2009-12-18 15:36 +
  • patch file icon 1768_patch_fov_change.patch (14,591 bytes) 2009-12-18 17:14 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 5726)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -2812,6 +2812,8 @@
     	Cutscene_bars_progress = 1.0f;
     }
     
    +void bars_do_frame(float frametime);
    +
     void game_set_view_clip(float frametime)
     {
     	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
    @@ -2824,16 +2826,15 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    -			// J.S. I've changed my ways!! See the new "no constants" code!!!
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    -		}
    +		} 
    +		//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    +		// J.S. I've changed my ways!! See the new "no constants" code!!!
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
     	}
     	else {
     		// Set the clip region for normal view
     		if ( View_percent >= 100 )	{
    -			gr_reset_clip();
    +			bars_do_frame(frametime);
     		} else {
     			int xborder, yborder;
     
    @@ -3855,14 +3856,35 @@
     int Game_subspace_effect = 0;
     DCF_BOOL( subspace, Game_subspace_effect )
     
    -void clip_frame_view();
    -
     // Does everything needed to render a frame
     void game_render_frame( camid cid )
     {
     
     	g3_start_frame(game_zbuffer);
     
    +	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    +	if ( Cmdline_env && !Env_cubemap_drawn ) {
    +		setup_environment_mapping(cid);
    +
    +		if ( !Dynamic_environment ) {
    +			Env_cubemap_drawn = true;
    +		}
    +
    +	}
    +
    +	gr_zbuffer_clear(TRUE);
    +
    +	gr_reset_clip();
    +
    +	gr_screen.gf_post_process_before();
    +
    +	if(!Time_compression_locked)
    +		game_set_view_clip(flFrametime);
    +	else
    +		game_set_view_clip(flRealframetime);
    +
    +	neb2_render_setup(cid);
    +
     	camera *cam = cid.getCamera();
     	matrix eye_no_jitter = vmd_identity_matrix;
     	if(cam != NULL)
    @@ -3902,22 +3924,6 @@
     		shield_point_multi_setup();
     	}
     
    -	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    -	if ( Cmdline_env && !Env_cubemap_drawn ) {
    -		setup_environment_mapping(cid);
    -
    -		if ( !Dynamic_environment ) {
    -			Env_cubemap_drawn = true;
    -		}
    -	}
    -	gr_zbuffer_clear(TRUE);
    -
    -	gr_screen.gf_post_process_before();
    -
    -	clip_frame_view();
    -
    -	neb2_set_frame_backg();
    -
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
     		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
    @@ -4580,46 +4586,37 @@
     		else
     			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			//Set rectangles
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//Set clipping
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
     		}
    +		//Set clipping
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false, Cutscene_fov_change );
    +
    +		Cutscene_bar_size = yborder;
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
     		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
    +			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false );
     		}
    -	}
    -}
    +		
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false, Cutscene_fov_change );
     
    -void clip_frame_view() {
    -	if(!Time_compression_locked) {
    -		// Player is dead
    -		game_set_view_clip(flFrametime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    -	} else {
    -		// Player is dead
    -		game_set_view_clip(flRealframetime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    +		Cutscene_bar_size = yborder;
     	}
    +	else if(Cutscene_bar_size)
    +		Cutscene_bar_size = 0;
     }
     
     //WMC - This does stuff like fading in and out and subtitles. Special FX?
    @@ -4766,7 +4763,10 @@
     			DEBUG_GET_TIME( render3_time1 )
     			camid cid = game_render_frame_setup();
     
    -			clip_frame_view();
    +			if(!Time_compression_locked)
    +				game_set_view_clip(flFrametime);
    +			else
    +				game_set_view_clip(flRealframetime);
     
     			game_render_frame( cid );
     
    Index: code/globalincs/systemvars.cpp
    ===================================================================
    --- code/globalincs/systemvars.cpp	(revision 5726)
    +++ code/globalincs/systemvars.cpp	(working copy)
    @@ -33,6 +33,10 @@
     float Cutscene_delta_time = 1.0f;
     //How far along a change is (0 to 1)
     float Cutscene_bars_progress = 1.0f;
    +//Change FOV?
    +bool Cutscene_fov_change = true;
    +//Size of the bar
    +int Cutscene_bar_size = 0;
     
     //FADEIN STUFF
     shader Viewer_shader;
    Index: code/globalincs/systemvars.h
    ===================================================================
    --- code/globalincs/systemvars.h	(revision 5726)
    +++ code/globalincs/systemvars.h	(working copy)
    @@ -57,7 +57,8 @@
     //Styles to get to bars
     #define CUB_GRADUAL			(1<<15)
     extern float Cutscene_bars_progress, Cutscene_delta_time;
    -extern int Cutscene_bar_flags;
    +extern int Cutscene_bar_flags, Cutscene_bar_size;
    +extern bool Cutscene_fov_change;
     
     //-----Fadein stuff
     struct shader;
    Index: code/graphics/2d.h
    ===================================================================
    --- code/graphics/2d.h	(revision 5726)
    +++ code/graphics/2d.h	(working copy)
    @@ -224,7 +224,7 @@
     	void (*gf_flash_alpha)(int r, int g, int b, int a);
     
     	// sets the clipping region
    -	void (*gf_set_clip)(int x, int y, int w, int h, bool resize);
    +	void (*gf_set_clip)(int x, int y, int w, int h, bool resize, bool change_fov);
     
     	// resets the clipping region to entire screen
     	void (*gf_reset_clip)();
    @@ -532,9 +532,9 @@
     void gr_flip();
     
     //#define gr_set_clip			GR_CALL(gr_screen.gf_set_clip)
    -__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true)
    +__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true, bool change_fov=true)
     {
    -	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
    +	(*gr_screen.gf_set_clip)(x,y,w,h,resize,change_fov);
     }
     #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
     //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
    Index: code/graphics/gropengl.cpp
    ===================================================================
    --- code/graphics/gropengl.cpp	(revision 5726)
    +++ code/graphics/gropengl.cpp	(working copy)
    @@ -375,7 +375,7 @@
     #endif
     }
     
    -void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_opengl_set_clip(int x, int y, int w, int h, bool resize, bool change_fov)
     {
     	// check for sanity of parameters
     	if (x < 0) {
    @@ -415,37 +415,39 @@
     		h = max_h;
     	}
     
    -	gr_screen.offset_x_unscaled = x;
    -	gr_screen.offset_y_unscaled = y;
    -	gr_screen.clip_left_unscaled = 0;
    -	gr_screen.clip_right_unscaled = w-1;
    -	gr_screen.clip_top_unscaled = 0;
    -	gr_screen.clip_bottom_unscaled = h-1;
    -	gr_screen.clip_width_unscaled = w;
    -	gr_screen.clip_height_unscaled = h;
    +	if (change_fov) {
    +		gr_screen.offset_x_unscaled = x;
    +		gr_screen.offset_y_unscaled = y;
    +		gr_screen.clip_left_unscaled = 0;
    +		gr_screen.clip_right_unscaled = w-1;
    +		gr_screen.clip_top_unscaled = 0;
    +		gr_screen.clip_bottom_unscaled = h-1;
    +		gr_screen.clip_width_unscaled = w;
    +		gr_screen.clip_height_unscaled = h;
    +		
     
    -	if (to_resize) {
    -		gr_resize_screen_pos(&x, &y);
    -		gr_resize_screen_pos(&w, &h);
    -	} else {
    -		gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    -	}
    +		if (to_resize) {
    +			gr_resize_screen_pos(&x, &y);
    +			gr_resize_screen_pos(&w, &h);
    +		} else {
    +			gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    +		}
     
    -	gr_screen.offset_x = x;
    -	gr_screen.offset_y = y;
    -	gr_screen.clip_left = 0;
    -	gr_screen.clip_right = w-1;
    -	gr_screen.clip_top = 0;
    -	gr_screen.clip_bottom = h-1;
    -	gr_screen.clip_width = w;
    -	gr_screen.clip_height = h;
    +		gr_screen.offset_x = x;
    +		gr_screen.offset_y = y;
    +		gr_screen.clip_left = 0;
    +		gr_screen.clip_right = w-1;
    +		gr_screen.clip_top = 0;
    +		gr_screen.clip_bottom = h-1;
    +		gr_screen.clip_width = w;
    +		gr_screen.clip_height = h;
     
    -	gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    -	gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    -	gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    -
    +		gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    +		gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    +		gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    +	}
     	// just return early if we aren't actually going to need the scissor test
     	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
     		GL_state.ScissorTest(GL_FALSE);
    Index: code/graphics/gropenglpostprocessing.cpp
    ===================================================================
    --- code/graphics/gropenglpostprocessing.cpp	(revision 5726)
    +++ code/graphics/gropenglpostprocessing.cpp	(working copy)
    @@ -1,6 +1,7 @@
     #include "graphics/gropenglpostprocessing.h"
     #include "graphics/gropenglshader.h"
     
    +#include "globalincs/systemvars.h"
     #include "io/timer.h"
     #include "nebula/neb.h"
     #include "parse/parselo.h"
    @@ -367,8 +368,13 @@
     	}
     
     	// Fix problems when player is dead and the screen is clipped.
    -	glEnable(GL_SCISSOR_TEST);
    -	glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	if (gr_screen.max_h != gr_screen.clip_height) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	} else if (Cutscene_bar_size) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, Cutscene_bar_size, gr_screen.max_w, gr_screen.max_h - Cutscene_bar_size * 2);
    +	}
     
     	// Main post-processing render
     	render_target::apply_default();
    Index: code/graphics/grstub.cpp
    ===================================================================
    --- code/graphics/grstub.cpp	(revision 5726)
    +++ code/graphics/grstub.cpp	(working copy)
    @@ -256,7 +256,7 @@
     {
     }
     
    -void gr_stub_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_stub_set_clip(int x, int y, int w, int h, bool resize,bool fov_change)
     {
     }
     
    Index: code/nebula/neb.cpp
    ===================================================================
    --- code/nebula/neb.cpp	(revision 5726)
    +++ code/nebula/neb.cpp	(working copy)
    @@ -470,23 +470,6 @@
     	}
     }
     
    -void neb2_set_frame_backg() {
    -	ubyte tr = gr_screen.current_clear_color.red;  
    -	ubyte tg = gr_screen.current_clear_color.green;
    -	ubyte tb = gr_screen.current_clear_color.blue; 
    -
    -	neb2_get_fog_color(
    -		&gr_screen.current_clear_color.red,
    -		&gr_screen.current_clear_color.green,
    -		&gr_screen.current_clear_color.blue);
    -	
    -	gr_clear();
    -	
    -	gr_screen.current_clear_color.red   = tr;
    -	gr_screen.current_clear_color.green = tg;
    -	gr_screen.current_clear_color.blue  = tb;
    -}
    -
     // call before beginning all rendering
     void neb2_render_setup(camid cid)
     {
    @@ -502,8 +485,21 @@
     	if (Neb2_render_mode == NEB2_RENDER_HTL) {
     		// RT The background needs to be the same colour as the fog and this seems
     		// to be the ideal place to do it
    -		neb2_set_frame_backg();
    +		ubyte tr = gr_screen.current_clear_color.red;  
    +		ubyte tg = gr_screen.current_clear_color.green;
    +		ubyte tb = gr_screen.current_clear_color.blue; 
     
    +		neb2_get_fog_color(
    +			&gr_screen.current_clear_color.red,
    +			&gr_screen.current_clear_color.green,
    +			&gr_screen.current_clear_color.blue);
    +		
    +		gr_clear();
    +		
    +		gr_screen.current_clear_color.red   = tr;
    +		gr_screen.current_clear_color.green = tg;
    +		gr_screen.current_clear_color.blue  = tb;
    +
     		return;	 
     	}
     
    Index: code/nebula/neb.h
    ===================================================================
    --- code/nebula/neb.h	(revision 5726)
    +++ code/nebula/neb.h	(working copy)
    @@ -140,8 +140,5 @@
     
     void neb2_get_fog_color(ubyte *r, ubyte *g, ubyte *b);
     
    -// set frame background color
    -void neb2_set_frame_backg();
     
    -
     #endif
    Index: code/parse/sexp.cpp
    ===================================================================
    --- code/parse/sexp.cpp	(revision 5726)
    +++ code/parse/sexp.cpp	(working copy)
    @@ -529,7 +529,7 @@
     	{ "set-training-context-speed",		OP_SET_TRAINING_CONTEXT_SPEED,		2, 2, },
     
     	//Cutscene stuff
    -	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 1, },
    +	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 2, },
     	{ "unset-cutscene-bars",		OP_CUTSCENES_UNSET_CUTSCENE_BARS,		0, 1, },
     	{ "fade-in",					OP_CUTSCENES_FADE_IN,					0, 1, },
     	{ "fade-out",					OP_CUTSCENES_FADE_OUT,					0, 2, },
    @@ -15546,8 +15546,10 @@
     
     	float delta_speed = 0.0f;
     
    -	if(node != -1)
    +	if(node != -1) {
     		delta_speed = eval_num(node)/1000.0f;
    +		node = CDR(node);
    +	}
     
     	if(delta_speed > 0.0f)
     	{
    @@ -15559,6 +15561,10 @@
     	{
     		Cutscene_bar_flags &= ~CUB_GRADUAL;
     	}
    +
    +	Cutscene_fov_change = true;
    +	if(node != -1)
    +		Cutscene_fov_change = is_sexp_true(node);
     }
     
     void sexp_unset_cutscene_bars(int node)
    @@ -20146,6 +20152,11 @@
     			return OPF_NONE;
     
     		case OP_CUTSCENES_SET_CUTSCENE_BARS:
    +			if (argnum==0)
    +				return OPF_POSITIVE;
    +			else
    +				return OPF_BOOL;
    +
     		case OP_CUTSCENES_UNSET_CUTSCENE_BARS:
     		case OP_CUTSCENES_FADE_IN:
     		case OP_CUTSCENES_FADE_OUT:
    @@ -24212,8 +24223,9 @@
     
     	{ OP_CUTSCENES_SET_CUTSCENE_BARS, "set-cutscene-bars\r\n"
     		"\tShows bars at the top and bottom of screen  "
    -		"Takes 0 or 1 arguments...\r\n"
    +		"Takes 0, 1 or 2 arguments...\r\n"
     		"\t1:\tMilliseconds for bars to slide in\r\n"
    +		"\t2:\tWhether FOV should be changed (defaults to true)\r\n"
     	},
     
     	{ OP_CUTSCENES_UNSET_CUTSCENE_BARS, "unset-cutscene-bars\r\n"
    
    patch file icon 1768_patch_fov_change.patch (14,591 bytes) 2009-12-18 17:14 +
  • patch file icon 1768_patch_19122009.patch (14,596 bytes) 2009-12-19 06:22 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 5726)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -2812,6 +2812,8 @@
     	Cutscene_bars_progress = 1.0f;
     }
     
    +void bars_do_frame(float frametime);
    +
     void game_set_view_clip(float frametime)
     {
     	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
    @@ -2824,16 +2826,16 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    -			// J.S. I've changed my ways!! See the new "no constants" code!!!
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    -		}
    +		} 
    +		//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    +		// J.S. I've changed my ways!! See the new "no constants" code!!!
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
     	}
     	else {
     		// Set the clip region for normal view
     		if ( View_percent >= 100 )	{
     			gr_reset_clip();
    +			bars_do_frame(frametime);
     		} else {
     			int xborder, yborder;
     
    @@ -3855,14 +3857,35 @@
     int Game_subspace_effect = 0;
     DCF_BOOL( subspace, Game_subspace_effect )
     
    -void clip_frame_view();
    -
     // Does everything needed to render a frame
     void game_render_frame( camid cid )
     {
     
     	g3_start_frame(game_zbuffer);
     
    +	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    +	if ( Cmdline_env && !Env_cubemap_drawn ) {
    +		setup_environment_mapping(cid);
    +
    +		if ( !Dynamic_environment ) {
    +			Env_cubemap_drawn = true;
    +		}
    +
    +	}
    +
    +	gr_zbuffer_clear(TRUE);
    +
    +	gr_reset_clip();
    +
    +	gr_screen.gf_post_process_before();
    +
    +	if(!Time_compression_locked)
    +		game_set_view_clip(flFrametime);
    +	else
    +		game_set_view_clip(flRealframetime);
    +
    +	neb2_render_setup(cid);
    +
     	camera *cam = cid.getCamera();
     	matrix eye_no_jitter = vmd_identity_matrix;
     	if(cam != NULL)
    @@ -3902,22 +3925,6 @@
     		shield_point_multi_setup();
     	}
     
    -	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    -	if ( Cmdline_env && !Env_cubemap_drawn ) {
    -		setup_environment_mapping(cid);
    -
    -		if ( !Dynamic_environment ) {
    -			Env_cubemap_drawn = true;
    -		}
    -	}
    -	gr_zbuffer_clear(TRUE);
    -
    -	gr_screen.gf_post_process_before();
    -
    -	clip_frame_view();
    -
    -	neb2_set_frame_backg();
    -
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
     		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
    @@ -4580,46 +4587,37 @@
     		else
     			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			//Set rectangles
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//Set clipping
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
     		}
    +		//Set clipping
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false, Cutscene_fov_change );
    +
    +		Cutscene_bar_size = yborder;
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
     		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
    +			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false );
     		}
    -	}
    -}
    +		
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false, Cutscene_fov_change );
     
    -void clip_frame_view() {
    -	if(!Time_compression_locked) {
    -		// Player is dead
    -		game_set_view_clip(flFrametime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    -	} else {
    -		// Player is dead
    -		game_set_view_clip(flRealframetime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    +		Cutscene_bar_size = yborder;
     	}
    +	else if(Cutscene_bar_size)
    +		Cutscene_bar_size = 0;
     }
     
     //WMC - This does stuff like fading in and out and subtitles. Special FX?
    @@ -4766,7 +4764,10 @@
     			DEBUG_GET_TIME( render3_time1 )
     			camid cid = game_render_frame_setup();
     
    -			clip_frame_view();
    +			if(!Time_compression_locked)
    +				game_set_view_clip(flFrametime);
    +			else
    +				game_set_view_clip(flRealframetime);
     
     			game_render_frame( cid );
     
    Index: code/globalincs/systemvars.cpp
    ===================================================================
    --- code/globalincs/systemvars.cpp	(revision 5726)
    +++ code/globalincs/systemvars.cpp	(working copy)
    @@ -33,6 +33,10 @@
     float Cutscene_delta_time = 1.0f;
     //How far along a change is (0 to 1)
     float Cutscene_bars_progress = 1.0f;
    +//Change FOV?
    +bool Cutscene_fov_change = true;
    +//Size of the bar
    +int Cutscene_bar_size = 0;
     
     //FADEIN STUFF
     shader Viewer_shader;
    Index: code/globalincs/systemvars.h
    ===================================================================
    --- code/globalincs/systemvars.h	(revision 5726)
    +++ code/globalincs/systemvars.h	(working copy)
    @@ -57,7 +57,8 @@
     //Styles to get to bars
     #define CUB_GRADUAL			(1<<15)
     extern float Cutscene_bars_progress, Cutscene_delta_time;
    -extern int Cutscene_bar_flags;
    +extern int Cutscene_bar_flags, Cutscene_bar_size;
    +extern bool Cutscene_fov_change;
     
     //-----Fadein stuff
     struct shader;
    Index: code/graphics/2d.h
    ===================================================================
    --- code/graphics/2d.h	(revision 5726)
    +++ code/graphics/2d.h	(working copy)
    @@ -224,7 +224,7 @@
     	void (*gf_flash_alpha)(int r, int g, int b, int a);
     
     	// sets the clipping region
    -	void (*gf_set_clip)(int x, int y, int w, int h, bool resize);
    +	void (*gf_set_clip)(int x, int y, int w, int h, bool resize, bool change_fov);
     
     	// resets the clipping region to entire screen
     	void (*gf_reset_clip)();
    @@ -532,9 +532,9 @@
     void gr_flip();
     
     //#define gr_set_clip			GR_CALL(gr_screen.gf_set_clip)
    -__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true)
    +__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true, bool change_fov=true)
     {
    -	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
    +	(*gr_screen.gf_set_clip)(x,y,w,h,resize,change_fov);
     }
     #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
     //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
    Index: code/graphics/gropengl.cpp
    ===================================================================
    --- code/graphics/gropengl.cpp	(revision 5726)
    +++ code/graphics/gropengl.cpp	(working copy)
    @@ -375,7 +375,7 @@
     #endif
     }
     
    -void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_opengl_set_clip(int x, int y, int w, int h, bool resize, bool change_fov)
     {
     	// check for sanity of parameters
     	if (x < 0) {
    @@ -415,37 +415,39 @@
     		h = max_h;
     	}
     
    -	gr_screen.offset_x_unscaled = x;
    -	gr_screen.offset_y_unscaled = y;
    -	gr_screen.clip_left_unscaled = 0;
    -	gr_screen.clip_right_unscaled = w-1;
    -	gr_screen.clip_top_unscaled = 0;
    -	gr_screen.clip_bottom_unscaled = h-1;
    -	gr_screen.clip_width_unscaled = w;
    -	gr_screen.clip_height_unscaled = h;
    +	if (change_fov) {
    +		gr_screen.offset_x_unscaled = x;
    +		gr_screen.offset_y_unscaled = y;
    +		gr_screen.clip_left_unscaled = 0;
    +		gr_screen.clip_right_unscaled = w-1;
    +		gr_screen.clip_top_unscaled = 0;
    +		gr_screen.clip_bottom_unscaled = h-1;
    +		gr_screen.clip_width_unscaled = w;
    +		gr_screen.clip_height_unscaled = h;
    +		
     
    -	if (to_resize) {
    -		gr_resize_screen_pos(&x, &y);
    -		gr_resize_screen_pos(&w, &h);
    -	} else {
    -		gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    -	}
    +		if (to_resize) {
    +			gr_resize_screen_pos(&x, &y);
    +			gr_resize_screen_pos(&w, &h);
    +		} else {
    +			gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    +		}
     
    -	gr_screen.offset_x = x;
    -	gr_screen.offset_y = y;
    -	gr_screen.clip_left = 0;
    -	gr_screen.clip_right = w-1;
    -	gr_screen.clip_top = 0;
    -	gr_screen.clip_bottom = h-1;
    -	gr_screen.clip_width = w;
    -	gr_screen.clip_height = h;
    +		gr_screen.offset_x = x;
    +		gr_screen.offset_y = y;
    +		gr_screen.clip_left = 0;
    +		gr_screen.clip_right = w-1;
    +		gr_screen.clip_top = 0;
    +		gr_screen.clip_bottom = h-1;
    +		gr_screen.clip_width = w;
    +		gr_screen.clip_height = h;
     
    -	gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    -	gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    -	gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    -
    +		gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    +		gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    +		gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    +	}
     	// just return early if we aren't actually going to need the scissor test
     	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
     		GL_state.ScissorTest(GL_FALSE);
    Index: code/graphics/gropenglpostprocessing.cpp
    ===================================================================
    --- code/graphics/gropenglpostprocessing.cpp	(revision 5726)
    +++ code/graphics/gropenglpostprocessing.cpp	(working copy)
    @@ -1,6 +1,7 @@
     #include "graphics/gropenglpostprocessing.h"
     #include "graphics/gropenglshader.h"
     
    +#include "globalincs/systemvars.h"
     #include "io/timer.h"
     #include "nebula/neb.h"
     #include "parse/parselo.h"
    @@ -367,8 +368,13 @@
     	}
     
     	// Fix problems when player is dead and the screen is clipped.
    -	glEnable(GL_SCISSOR_TEST);
    -	glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	if (gr_screen.max_h != gr_screen.clip_height) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	} else if (Cutscene_bar_size) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, Cutscene_bar_size, gr_screen.max_w, gr_screen.max_h - Cutscene_bar_size * 2);
    +	}
     
     	// Main post-processing render
     	render_target::apply_default();
    Index: code/graphics/grstub.cpp
    ===================================================================
    --- code/graphics/grstub.cpp	(revision 5726)
    +++ code/graphics/grstub.cpp	(working copy)
    @@ -256,7 +256,7 @@
     {
     }
     
    -void gr_stub_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_stub_set_clip(int x, int y, int w, int h, bool resize,bool fov_change)
     {
     }
     
    Index: code/nebula/neb.cpp
    ===================================================================
    --- code/nebula/neb.cpp	(revision 5726)
    +++ code/nebula/neb.cpp	(working copy)
    @@ -470,23 +470,6 @@
     	}
     }
     
    -void neb2_set_frame_backg() {
    -	ubyte tr = gr_screen.current_clear_color.red;  
    -	ubyte tg = gr_screen.current_clear_color.green;
    -	ubyte tb = gr_screen.current_clear_color.blue; 
    -
    -	neb2_get_fog_color(
    -		&gr_screen.current_clear_color.red,
    -		&gr_screen.current_clear_color.green,
    -		&gr_screen.current_clear_color.blue);
    -	
    -	gr_clear();
    -	
    -	gr_screen.current_clear_color.red   = tr;
    -	gr_screen.current_clear_color.green = tg;
    -	gr_screen.current_clear_color.blue  = tb;
    -}
    -
     // call before beginning all rendering
     void neb2_render_setup(camid cid)
     {
    @@ -502,8 +485,21 @@
     	if (Neb2_render_mode == NEB2_RENDER_HTL) {
     		// RT The background needs to be the same colour as the fog and this seems
     		// to be the ideal place to do it
    -		neb2_set_frame_backg();
    +		ubyte tr = gr_screen.current_clear_color.red;  
    +		ubyte tg = gr_screen.current_clear_color.green;
    +		ubyte tb = gr_screen.current_clear_color.blue; 
     
    +		neb2_get_fog_color(
    +			&gr_screen.current_clear_color.red,
    +			&gr_screen.current_clear_color.green,
    +			&gr_screen.current_clear_color.blue);
    +		
    +		gr_clear();
    +		
    +		gr_screen.current_clear_color.red   = tr;
    +		gr_screen.current_clear_color.green = tg;
    +		gr_screen.current_clear_color.blue  = tb;
    +
     		return;	 
     	}
     
    Index: code/nebula/neb.h
    ===================================================================
    --- code/nebula/neb.h	(revision 5726)
    +++ code/nebula/neb.h	(working copy)
    @@ -140,8 +140,5 @@
     
     void neb2_get_fog_color(ubyte *r, ubyte *g, ubyte *b);
     
    -// set frame background color
    -void neb2_set_frame_backg();
     
    -
     #endif
    Index: code/parse/sexp.cpp
    ===================================================================
    --- code/parse/sexp.cpp	(revision 5726)
    +++ code/parse/sexp.cpp	(working copy)
    @@ -529,7 +529,7 @@
     	{ "set-training-context-speed",		OP_SET_TRAINING_CONTEXT_SPEED,		2, 2, },
     
     	//Cutscene stuff
    -	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 1, },
    +	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 2, },
     	{ "unset-cutscene-bars",		OP_CUTSCENES_UNSET_CUTSCENE_BARS,		0, 1, },
     	{ "fade-in",					OP_CUTSCENES_FADE_IN,					0, 1, },
     	{ "fade-out",					OP_CUTSCENES_FADE_OUT,					0, 2, },
    @@ -15546,8 +15546,10 @@
     
     	float delta_speed = 0.0f;
     
    -	if(node != -1)
    +	if(node != -1) {
     		delta_speed = eval_num(node)/1000.0f;
    +		node = CDR(node);
    +	}
     
     	if(delta_speed > 0.0f)
     	{
    @@ -15559,6 +15561,10 @@
     	{
     		Cutscene_bar_flags &= ~CUB_GRADUAL;
     	}
    +
    +	Cutscene_fov_change = true;
    +	if(node != -1)
    +		Cutscene_fov_change = is_sexp_true(node) != 0;
     }
     
     void sexp_unset_cutscene_bars(int node)
    @@ -20146,6 +20152,11 @@
     			return OPF_NONE;
     
     		case OP_CUTSCENES_SET_CUTSCENE_BARS:
    +			if (argnum==0)
    +				return OPF_POSITIVE;
    +			else
    +				return OPF_BOOL;
    +
     		case OP_CUTSCENES_UNSET_CUTSCENE_BARS:
     		case OP_CUTSCENES_FADE_IN:
     		case OP_CUTSCENES_FADE_OUT:
    @@ -24212,8 +24223,9 @@
     
     	{ OP_CUTSCENES_SET_CUTSCENE_BARS, "set-cutscene-bars\r\n"
     		"\tShows bars at the top and bottom of screen  "
    -		"Takes 0 or 1 arguments...\r\n"
    +		"Takes 0, 1 or 2 arguments...\r\n"
     		"\t1:\tMilliseconds for bars to slide in\r\n"
    +		"\t2:\tWhether FOV should be changed (defaults to true)\r\n"
     	},
     
     	{ OP_CUTSCENES_UNSET_CUTSCENE_BARS, "unset-cutscene-bars\r\n"
    
    patch file icon 1768_patch_19122009.patch (14,596 bytes) 2009-12-19 06:22 +
  • patch file icon M1768_patch_31122009.patch (13,140 bytes) 2009-12-31 07:20 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 5755)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -2814,6 +2814,8 @@
     	Cutscene_bars_progress = 1.0f;
     }
     
    +void bars_do_frame(float frametime);
    +
     void game_set_view_clip(float frametime)
     {
     	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
    @@ -2826,16 +2828,16 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    -			// J.S. I've changed my ways!! See the new "no constants" code!!!
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    -		}
    +		} 
    +		//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    +		// J.S. I've changed my ways!! See the new "no constants" code!!!
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
     	}
     	else {
     		// Set the clip region for normal view
     		if ( View_percent >= 100 )	{
     			gr_reset_clip();
    +			bars_do_frame(frametime);
     		} else {
     			int xborder, yborder;
     
    @@ -3857,14 +3859,35 @@
     int Game_subspace_effect = 0;
     DCF_BOOL( subspace, Game_subspace_effect )
     
    -void clip_frame_view();
    -
     // Does everything needed to render a frame
     void game_render_frame( camid cid )
     {
     
     	g3_start_frame(game_zbuffer);
     
    +	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    +	if ( Cmdline_env && !Env_cubemap_drawn ) {
    +		setup_environment_mapping(cid);
    +
    +		if ( !Dynamic_environment ) {
    +			Env_cubemap_drawn = true;
    +		}
    +
    +	}
    +
    +	gr_zbuffer_clear(TRUE);
    +
    +	gr_reset_clip();
    +
    +	gr_screen.gf_post_process_before();
    +
    +	if(!Time_compression_locked)
    +		game_set_view_clip(flFrametime);
    +	else
    +		game_set_view_clip(flRealframetime);
    +
    +	neb2_render_setup(cid);
    +
     	camera *cam = cid.getCamera();
     	matrix eye_no_jitter = vmd_identity_matrix;
     	if(cam != NULL)
    @@ -3904,22 +3927,6 @@
     		shield_point_multi_setup();
     	}
     
    -	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    -	if ( Cmdline_env && !Env_cubemap_drawn ) {
    -		setup_environment_mapping(cid);
    -
    -		if ( !Dynamic_environment ) {
    -			Env_cubemap_drawn = true;
    -		}
    -	}
    -	gr_zbuffer_clear(TRUE);
    -
    -	gr_screen.gf_post_process_before();
    -
    -	clip_frame_view();
    -
    -	neb2_render_setup(cid);
    -
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
     		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
    @@ -4582,46 +4589,37 @@
     		else
     			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			//Set rectangles
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//Set clipping
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
     		}
    +		//Set clipping
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false, Cutscene_fov_change );
    +
    +		Cutscene_bar_size = yborder;
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
     		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
    +			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false );
     		}
    -	}
    -}
    +		
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false, Cutscene_fov_change );
     
    -void clip_frame_view() {
    -	if(!Time_compression_locked) {
    -		// Player is dead
    -		game_set_view_clip(flFrametime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    -	} else {
    -		// Player is dead
    -		game_set_view_clip(flRealframetime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    +		Cutscene_bar_size = yborder;
     	}
    +	else if(Cutscene_bar_size)
    +		Cutscene_bar_size = 0;
     }
     
     //WMC - This does stuff like fading in and out and subtitles. Special FX?
    @@ -4768,7 +4765,10 @@
     			DEBUG_GET_TIME( render3_time1 )
     			camid cid = game_render_frame_setup();
     
    -			clip_frame_view();
    +			if(!Time_compression_locked)
    +				game_set_view_clip(flFrametime);
    +			else
    +				game_set_view_clip(flRealframetime);
     
     			game_render_frame( cid );
     
    Index: code/globalincs/systemvars.cpp
    ===================================================================
    --- code/globalincs/systemvars.cpp	(revision 5755)
    +++ code/globalincs/systemvars.cpp	(working copy)
    @@ -33,6 +33,10 @@
     float Cutscene_delta_time = 1.0f;
     //How far along a change is (0 to 1)
     float Cutscene_bars_progress = 1.0f;
    +//Change FOV?
    +bool Cutscene_fov_change = true;
    +//Size of the bar
    +int Cutscene_bar_size = 0;
     
     //FADEIN STUFF
     shader Viewer_shader;
    Index: code/globalincs/systemvars.h
    ===================================================================
    --- code/globalincs/systemvars.h	(revision 5755)
    +++ code/globalincs/systemvars.h	(working copy)
    @@ -57,7 +57,8 @@
     //Styles to get to bars
     #define CUB_GRADUAL			(1<<15)
     extern float Cutscene_bars_progress, Cutscene_delta_time;
    -extern int Cutscene_bar_flags;
    +extern int Cutscene_bar_flags, Cutscene_bar_size;
    +extern bool Cutscene_fov_change;
     
     //-----Fadein stuff
     struct shader;
    Index: code/graphics/2d.h
    ===================================================================
    --- code/graphics/2d.h	(revision 5755)
    +++ code/graphics/2d.h	(working copy)
    @@ -224,7 +224,7 @@
     	void (*gf_flash_alpha)(int r, int g, int b, int a);
     
     	// sets the clipping region
    -	void (*gf_set_clip)(int x, int y, int w, int h, bool resize);
    +	void (*gf_set_clip)(int x, int y, int w, int h, bool resize, bool change_fov);
     
     	// resets the clipping region to entire screen
     	void (*gf_reset_clip)();
    @@ -525,9 +525,9 @@
     void gr_flip();
     
     //#define gr_set_clip			GR_CALL(gr_screen.gf_set_clip)
    -__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true)
    +__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true, bool change_fov=true)
     {
    -	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
    +	(*gr_screen.gf_set_clip)(x,y,w,h,resize,change_fov);
     }
     #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
     //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
    Index: code/graphics/gropengl.cpp
    ===================================================================
    --- code/graphics/gropengl.cpp	(revision 5755)
    +++ code/graphics/gropengl.cpp	(working copy)
    @@ -375,7 +375,7 @@
     #endif
     }
     
    -void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_opengl_set_clip(int x, int y, int w, int h, bool resize, bool change_fov)
     {
     	// check for sanity of parameters
     	if (x < 0) {
    @@ -415,37 +415,39 @@
     		h = max_h;
     	}
     
    -	gr_screen.offset_x_unscaled = x;
    -	gr_screen.offset_y_unscaled = y;
    -	gr_screen.clip_left_unscaled = 0;
    -	gr_screen.clip_right_unscaled = w-1;
    -	gr_screen.clip_top_unscaled = 0;
    -	gr_screen.clip_bottom_unscaled = h-1;
    -	gr_screen.clip_width_unscaled = w;
    -	gr_screen.clip_height_unscaled = h;
    +	if (change_fov) {
    +		gr_screen.offset_x_unscaled = x;
    +		gr_screen.offset_y_unscaled = y;
    +		gr_screen.clip_left_unscaled = 0;
    +		gr_screen.clip_right_unscaled = w-1;
    +		gr_screen.clip_top_unscaled = 0;
    +		gr_screen.clip_bottom_unscaled = h-1;
    +		gr_screen.clip_width_unscaled = w;
    +		gr_screen.clip_height_unscaled = h;
    +		
     
    -	if (to_resize) {
    -		gr_resize_screen_pos(&x, &y);
    -		gr_resize_screen_pos(&w, &h);
    -	} else {
    -		gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    -	}
    +		if (to_resize) {
    +			gr_resize_screen_pos(&x, &y);
    +			gr_resize_screen_pos(&w, &h);
    +		} else {
    +			gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    +		}
     
    -	gr_screen.offset_x = x;
    -	gr_screen.offset_y = y;
    -	gr_screen.clip_left = 0;
    -	gr_screen.clip_right = w-1;
    -	gr_screen.clip_top = 0;
    -	gr_screen.clip_bottom = h-1;
    -	gr_screen.clip_width = w;
    -	gr_screen.clip_height = h;
    +		gr_screen.offset_x = x;
    +		gr_screen.offset_y = y;
    +		gr_screen.clip_left = 0;
    +		gr_screen.clip_right = w-1;
    +		gr_screen.clip_top = 0;
    +		gr_screen.clip_bottom = h-1;
    +		gr_screen.clip_width = w;
    +		gr_screen.clip_height = h;
     
    -	gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    -	gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    -	gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    -
    +		gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    +		gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    +		gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    +	}
     	// just return early if we aren't actually going to need the scissor test
     	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
     		GL_state.ScissorTest(GL_FALSE);
    Index: code/graphics/gropenglpostprocessing.cpp
    ===================================================================
    --- code/graphics/gropenglpostprocessing.cpp	(revision 5755)
    +++ code/graphics/gropenglpostprocessing.cpp	(working copy)
    @@ -1,6 +1,7 @@
     #include "graphics/gropenglpostprocessing.h"
     #include "graphics/gropenglshader.h"
     
    +#include "globalincs/systemvars.h"
     #include "io/timer.h"
     #include "nebula/neb.h"
     #include "parse/parselo.h"
    @@ -367,8 +368,13 @@
     	}
     
     	// Fix problems when player is dead and the screen is clipped.
    -	glEnable(GL_SCISSOR_TEST);
    -	glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	if (gr_screen.max_h != gr_screen.clip_height) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	} else if (Cutscene_bar_size) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, Cutscene_bar_size, gr_screen.max_w, gr_screen.max_h - Cutscene_bar_size * 2);
    +	}
     
     	// Main post-processing render
     	render_target::apply_default();
    Index: code/graphics/grstub.cpp
    ===================================================================
    --- code/graphics/grstub.cpp	(revision 5755)
    +++ code/graphics/grstub.cpp	(working copy)
    @@ -256,7 +256,7 @@
     {
     }
     
    -void gr_stub_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_stub_set_clip(int x, int y, int w, int h, bool resize,bool fov_change)
     {
     }
     
    Index: code/parse/sexp.cpp
    ===================================================================
    --- code/parse/sexp.cpp	(revision 5755)
    +++ code/parse/sexp.cpp	(working copy)
    @@ -529,7 +529,7 @@
     	{ "set-training-context-speed",		OP_SET_TRAINING_CONTEXT_SPEED,		2, 2, },
     
     	//Cutscene stuff
    -	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 1, },
    +	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 2, },
     	{ "unset-cutscene-bars",		OP_CUTSCENES_UNSET_CUTSCENE_BARS,		0, 1, },
     	{ "fade-in",					OP_CUTSCENES_FADE_IN,					0, 1, },
     	{ "fade-out",					OP_CUTSCENES_FADE_OUT,					0, 2, },
    @@ -15546,8 +15546,10 @@
     
     	float delta_speed = 0.0f;
     
    -	if(node != -1)
    +	if(node != -1) {
     		delta_speed = eval_num(node)/1000.0f;
    +		node = CDR(node);
    +	}
     
     	if(delta_speed > 0.0f)
     	{
    @@ -15559,6 +15561,10 @@
     	{
     		Cutscene_bar_flags &= ~CUB_GRADUAL;
     	}
    +
    +	Cutscene_fov_change = true;
    +	if(node != -1)
    +		Cutscene_fov_change = is_sexp_true(node) != 0;
     }
     
     void sexp_unset_cutscene_bars(int node)
    @@ -20146,6 +20152,11 @@
     			return OPF_NONE;
     
     		case OP_CUTSCENES_SET_CUTSCENE_BARS:
    +			if (argnum==0)
    +				return OPF_POSITIVE;
    +			else
    +				return OPF_BOOL;
    +
     		case OP_CUTSCENES_UNSET_CUTSCENE_BARS:
     		case OP_CUTSCENES_FADE_IN:
     		case OP_CUTSCENES_FADE_OUT:
    @@ -24212,8 +24223,9 @@
     
     	{ OP_CUTSCENES_SET_CUTSCENE_BARS, "set-cutscene-bars\r\n"
     		"\tShows bars at the top and bottom of screen  "
    -		"Takes 0 or 1 arguments...\r\n"
    +		"Takes 0, 1 or 2 arguments...\r\n"
     		"\t1:\tMilliseconds for bars to slide in\r\n"
    +		"\t2:\tWhether FOV should be changed (defaults to true)\r\n"
     	},
     
     	{ OP_CUTSCENES_UNSET_CUTSCENE_BARS, "unset-cutscene-bars\r\n"
    
    patch file icon M1768_patch_31122009.patch (13,140 bytes) 2009-12-31 07:20 +
  • patch file icon M1768_patch_20100102.patch (13,140 bytes) 2010-01-02 10:36 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 5755)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -2817,6 +2817,8 @@
     	Cutscene_bars_progress = 1.0f;
     }
     
    +void bars_do_frame(float frametime);
    +
     void game_set_view_clip(float frametime)
     {
     	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
    @@ -2829,16 +2831,16 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    -			// J.S. I've changed my ways!! See the new "no constants" code!!!
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    -		}
    +		} 
    +		//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    +		// J.S. I've changed my ways!! See the new "no constants" code!!!
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
     	}
     	else {
     		// Set the clip region for normal view
     		if ( View_percent >= 100 )	{
     			gr_reset_clip();
    +			bars_do_frame(frametime);
     		} else {
     			int xborder, yborder;
     
    @@ -3860,14 +3862,35 @@
     int Game_subspace_effect = 0;
     DCF_BOOL( subspace, Game_subspace_effect )
     
    -void clip_frame_view();
    -
     // Does everything needed to render a frame
     void game_render_frame( camid cid )
     {
     
     	g3_start_frame(game_zbuffer);
     
    +	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    +	if ( Cmdline_env && !Env_cubemap_drawn ) {
    +		setup_environment_mapping(cid);
    +
    +		if ( !Dynamic_environment ) {
    +			Env_cubemap_drawn = true;
    +		}
    +
    +	}
    +
    +	gr_zbuffer_clear(TRUE);
    +
    +	gr_reset_clip();
    +
    +	gr_screen.gf_post_process_before();
    +
    +	if(!Time_compression_locked)
    +		game_set_view_clip(flFrametime);
    +	else
    +		game_set_view_clip(flRealframetime);
    +
    +	neb2_render_setup(cid);
    +
     	camera *cam = cid.getCamera();
     	matrix eye_no_jitter = vmd_identity_matrix;
     	if(cam != NULL)
    @@ -3907,22 +3930,6 @@
     		shield_point_multi_setup();
     	}
     
    -	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    -	if ( Cmdline_env && !Env_cubemap_drawn ) {
    -		setup_environment_mapping(cid);
    -
    -		if ( !Dynamic_environment ) {
    -			Env_cubemap_drawn = true;
    -		}
    -	}
    -	gr_zbuffer_clear(TRUE);
    -
    -	gr_screen.gf_post_process_before();
    -
    -	clip_frame_view();
    -
    -	neb2_render_setup(cid);
    -
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
     		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
    @@ -4585,46 +4592,37 @@
     		else
     			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			//Set rectangles
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//Set clipping
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
     		}
    +		//Set clipping
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false, Cutscene_fov_change );
    +
    +		Cutscene_bar_size = yborder;
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
     		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
    -			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
    +			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false );
     		}
    -	}
    -}
    +		
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false, Cutscene_fov_change );
     
    -void clip_frame_view() {
    -	if(!Time_compression_locked) {
    -		// Player is dead
    -		game_set_view_clip(flFrametime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    -	} else {
    -		// Player is dead
    -		game_set_view_clip(flRealframetime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    +		Cutscene_bar_size = yborder;
     	}
    +	else if(Cutscene_bar_size)
    +		Cutscene_bar_size = 0;
     }
     
     //WMC - This does stuff like fading in and out and subtitles. Special FX?
    @@ -4771,7 +4768,10 @@
     			DEBUG_GET_TIME( render3_time1 )
     			camid cid = game_render_frame_setup();
     
    -			clip_frame_view();
    +			if(!Time_compression_locked)
    +				game_set_view_clip(flFrametime);
    +			else
    +				game_set_view_clip(flRealframetime);
     
     			game_render_frame( cid );
     
    Index: code/globalincs/systemvars.cpp
    ===================================================================
    --- code/globalincs/systemvars.cpp	(revision 5755)
    +++ code/globalincs/systemvars.cpp	(working copy)
    @@ -33,6 +33,10 @@
     float Cutscene_delta_time = 1.0f;
     //How far along a change is (0 to 1)
     float Cutscene_bars_progress = 1.0f;
    +//Change FOV?
    +bool Cutscene_fov_change = true;
    +//Size of the bar
    +int Cutscene_bar_size = 0;
     
     //FADEIN STUFF
     shader Viewer_shader;
    Index: code/globalincs/systemvars.h
    ===================================================================
    --- code/globalincs/systemvars.h	(revision 5755)
    +++ code/globalincs/systemvars.h	(working copy)
    @@ -57,7 +57,8 @@
     //Styles to get to bars
     #define CUB_GRADUAL			(1<<15)
     extern float Cutscene_bars_progress, Cutscene_delta_time;
    -extern int Cutscene_bar_flags;
    +extern int Cutscene_bar_flags, Cutscene_bar_size;
    +extern bool Cutscene_fov_change;
     
     //-----Fadein stuff
     struct shader;
    Index: code/graphics/2d.h
    ===================================================================
    --- code/graphics/2d.h	(revision 5755)
    +++ code/graphics/2d.h	(working copy)
    @@ -224,7 +224,7 @@
     	void (*gf_flash_alpha)(int r, int g, int b, int a);
     
     	// sets the clipping region
    -	void (*gf_set_clip)(int x, int y, int w, int h, bool resize);
    +	void (*gf_set_clip)(int x, int y, int w, int h, bool resize, bool change_fov);
     
     	// resets the clipping region to entire screen
     	void (*gf_reset_clip)();
    @@ -525,9 +525,9 @@
     void gr_flip();
     
     //#define gr_set_clip			GR_CALL(gr_screen.gf_set_clip)
    -__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true)
    +__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true, bool change_fov=true)
     {
    -	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
    +	(*gr_screen.gf_set_clip)(x,y,w,h,resize,change_fov);
     }
     #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
     //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
    Index: code/graphics/gropengl.cpp
    ===================================================================
    --- code/graphics/gropengl.cpp	(revision 5755)
    +++ code/graphics/gropengl.cpp	(working copy)
    @@ -375,7 +375,7 @@
     #endif
     }
     
    -void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_opengl_set_clip(int x, int y, int w, int h, bool resize, bool change_fov)
     {
     	// check for sanity of parameters
     	if (x < 0) {
    @@ -415,37 +415,39 @@
     		h = max_h;
     	}
     
    -	gr_screen.offset_x_unscaled = x;
    -	gr_screen.offset_y_unscaled = y;
    -	gr_screen.clip_left_unscaled = 0;
    -	gr_screen.clip_right_unscaled = w-1;
    -	gr_screen.clip_top_unscaled = 0;
    -	gr_screen.clip_bottom_unscaled = h-1;
    -	gr_screen.clip_width_unscaled = w;
    -	gr_screen.clip_height_unscaled = h;
    +	if (change_fov) {
    +		gr_screen.offset_x_unscaled = x;
    +		gr_screen.offset_y_unscaled = y;
    +		gr_screen.clip_left_unscaled = 0;
    +		gr_screen.clip_right_unscaled = w-1;
    +		gr_screen.clip_top_unscaled = 0;
    +		gr_screen.clip_bottom_unscaled = h-1;
    +		gr_screen.clip_width_unscaled = w;
    +		gr_screen.clip_height_unscaled = h;
    +		
     
    -	if (to_resize) {
    -		gr_resize_screen_pos(&x, &y);
    -		gr_resize_screen_pos(&w, &h);
    -	} else {
    -		gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    -	}
    +		if (to_resize) {
    +			gr_resize_screen_pos(&x, &y);
    +			gr_resize_screen_pos(&w, &h);
    +		} else {
    +			gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    +		}
     
    -	gr_screen.offset_x = x;
    -	gr_screen.offset_y = y;
    -	gr_screen.clip_left = 0;
    -	gr_screen.clip_right = w-1;
    -	gr_screen.clip_top = 0;
    -	gr_screen.clip_bottom = h-1;
    -	gr_screen.clip_width = w;
    -	gr_screen.clip_height = h;
    +		gr_screen.offset_x = x;
    +		gr_screen.offset_y = y;
    +		gr_screen.clip_left = 0;
    +		gr_screen.clip_right = w-1;
    +		gr_screen.clip_top = 0;
    +		gr_screen.clip_bottom = h-1;
    +		gr_screen.clip_width = w;
    +		gr_screen.clip_height = h;
     
    -	gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    -	gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    -	gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    -
    +		gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    +		gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    +		gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    +	}
     	// just return early if we aren't actually going to need the scissor test
     	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
     		GL_state.ScissorTest(GL_FALSE);
    Index: code/graphics/gropenglpostprocessing.cpp
    ===================================================================
    --- code/graphics/gropenglpostprocessing.cpp	(revision 5755)
    +++ code/graphics/gropenglpostprocessing.cpp	(working copy)
    @@ -1,6 +1,7 @@
     #include "graphics/gropenglpostprocessing.h"
     #include "graphics/gropenglshader.h"
     
    +#include "globalincs/systemvars.h"
     #include "io/timer.h"
     #include "nebula/neb.h"
     #include "parse/parselo.h"
    @@ -367,8 +368,13 @@
     	}
     
     	// Fix problems when player is dead and the screen is clipped.
    -	glEnable(GL_SCISSOR_TEST);
    -	glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	if (gr_screen.max_h != gr_screen.clip_height) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	} else if (Cutscene_bar_size) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, Cutscene_bar_size, gr_screen.max_w, gr_screen.max_h - Cutscene_bar_size * 2);
    +	}
     
     	// Main post-processing render
     	render_target::apply_default();
    Index: code/graphics/grstub.cpp
    ===================================================================
    --- code/graphics/grstub.cpp	(revision 5755)
    +++ code/graphics/grstub.cpp	(working copy)
    @@ -256,7 +256,7 @@
     {
     }
     
    -void gr_stub_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_stub_set_clip(int x, int y, int w, int h, bool resize,bool fov_change)
     {
     }
     
    Index: code/parse/sexp.cpp
    ===================================================================
    --- code/parse/sexp.cpp	(revision 5755)
    +++ code/parse/sexp.cpp	(working copy)
    @@ -529,7 +529,7 @@
     	{ "set-training-context-speed",		OP_SET_TRAINING_CONTEXT_SPEED,		2, 2, },
     
     	//Cutscene stuff
    -	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 1, },
    +	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 2, },
     	{ "unset-cutscene-bars",		OP_CUTSCENES_UNSET_CUTSCENE_BARS,		0, 1, },
     	{ "fade-in",					OP_CUTSCENES_FADE_IN,					0, 1, },
     	{ "fade-out",					OP_CUTSCENES_FADE_OUT,					0, 2, },
    @@ -15546,8 +15546,10 @@
     
     	float delta_speed = 0.0f;
     
    -	if(node != -1)
    +	if(node != -1) {
     		delta_speed = eval_num(node)/1000.0f;
    +		node = CDR(node);
    +	}
     
     	if(delta_speed > 0.0f)
     	{
    @@ -15559,6 +15561,10 @@
     	{
     		Cutscene_bar_flags &= ~CUB_GRADUAL;
     	}
    +
    +	Cutscene_fov_change = true;
    +	if(node != -1)
    +		Cutscene_fov_change = is_sexp_true(node) != 0;
     }
     
     void sexp_unset_cutscene_bars(int node)
    @@ -20146,6 +20152,11 @@
     			return OPF_NONE;
     
     		case OP_CUTSCENES_SET_CUTSCENE_BARS:
    +			if (argnum==0)
    +				return OPF_POSITIVE;
    +			else
    +				return OPF_BOOL;
    +
     		case OP_CUTSCENES_UNSET_CUTSCENE_BARS:
     		case OP_CUTSCENES_FADE_IN:
     		case OP_CUTSCENES_FADE_OUT:
    @@ -24212,8 +24223,9 @@
     
     	{ OP_CUTSCENES_SET_CUTSCENE_BARS, "set-cutscene-bars\r\n"
     		"\tShows bars at the top and bottom of screen  "
    -		"Takes 0 or 1 arguments...\r\n"
    +		"Takes 0, 1 or 2 arguments...\r\n"
     		"\t1:\tMilliseconds for bars to slide in\r\n"
    +		"\t2:\tWhether FOV should be changed (defaults to true)\r\n"
     	},
     
     	{ OP_CUTSCENES_UNSET_CUTSCENE_BARS, "unset-cutscene-bars\r\n"
    
    patch file icon M1768_patch_20100102.patch (13,140 bytes) 2010-01-02 10:36 +
  • patch file icon M1768_patch_20100727.patch (12,714 bytes) 2010-07-27 23:22 -
    Index: code/freespace2/freespace.cpp
    ===================================================================
    --- code/freespace2/freespace.cpp	(revision 6329)
    +++ code/freespace2/freespace.cpp	(working copy)
    @@ -2780,6 +2780,8 @@
     	Cutscene_bars_progress = 1.0f;
     }
     
    +void bars_do_frame(float frametime);
    +
     void game_set_view_clip(float frametime)
     {
     	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
    @@ -2792,16 +2794,16 @@
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    -			// J.S. I've changed my ways!! See the new "no constants" code!!!
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
    -		}
    +		} 
    +		//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
    +		// J.S. I've changed my ways!! See the new "no constants" code!!!
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
     	}
     	else {
     		// Set the clip region for normal view
     		if ( View_percent >= 100 )	{
     			gr_reset_clip();
    +			bars_do_frame(frametime);
     		} else {
     			int xborder, yborder;
     
    @@ -3825,14 +3827,35 @@
     int Game_subspace_effect = 0;
     DCF_BOOL( subspace, Game_subspace_effect )
     
    -void clip_frame_view();
    -
     // Does everything needed to render a frame
     void game_render_frame( camid cid )
     {
     
     	g3_start_frame(game_zbuffer);
     
    +	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    +	if ( Cmdline_env && !Env_cubemap_drawn ) {
    +		setup_environment_mapping(cid);
    +
    +		if ( !Dynamic_environment ) {
    +			Env_cubemap_drawn = true;
    +		}
    +
    +	}
    +
    +	gr_zbuffer_clear(TRUE);
    +
    +	gr_reset_clip();
    +
    +	gr_screen.gf_post_process_before();
    +
    +	if(!Time_compression_locked)
    +		game_set_view_clip(flFrametime);
    +	else
    +		game_set_view_clip(flRealframetime);
    +
    +	neb2_render_setup(cid);
    +
     	camera *cam = cid.getCamera();
     	matrix eye_no_jitter = vmd_identity_matrix;
     	if(cam != NULL)
    @@ -3872,22 +3895,6 @@
     		shield_point_multi_setup();
     	}
     
    -	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
    -	if ( Cmdline_env && !Env_cubemap_drawn ) {
    -		setup_environment_mapping(cid);
    -
    -		if ( !Dynamic_environment ) {
    -			Env_cubemap_drawn = true;
    -		}
    -	}
    -	gr_zbuffer_clear(TRUE);
    -
    -	gr_screen.gf_post_process_before();
    -
    -	clip_frame_view();
    -
    -	neb2_render_setup(cid);
    -
     #ifndef DYN_CLIP_DIST
     	if (!Cmdline_nohtl) {
     		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
    @@ -4546,46 +4553,37 @@
     		else
     			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			//Set rectangles
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			//Set clipping
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
     		}
    +		//Set clipping
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false, Cutscene_fov_change );
    +
    +		Cutscene_bar_size = yborder;
     	}
     	else if(Cutscene_bar_flags & CUB_CUTSCENE)
     	{
     		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
     
    +		gr_reset_clip();
    +
     		if (g3_in_frame() == 0) {
     			gr_set_color(0,0,0);
     			gr_rect(0, 0, gr_screen.max_w, yborder, false);
     			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
    -		} else {
    -			gr_reset_clip();
    -			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
     		}
    -	}
    -}
    +		
    +		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false, Cutscene_fov_change );
     
    -void clip_frame_view() {
    -	if(!Time_compression_locked) {
    -		// Player is dead
    -		game_set_view_clip(flFrametime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    -	} else {
    -		// Player is dead
    -		game_set_view_clip(flRealframetime);
    -
    -		// Cutscene bars
    -		bars_do_frame(flRealframetime);
    +		Cutscene_bar_size = yborder;
     	}
    +	else if(Cutscene_bar_size)
    +		Cutscene_bar_size = 0;
     }
     
     //WMC - This does stuff like fading in and out and subtitles. Special FX?
    @@ -4732,7 +4730,10 @@
     			DEBUG_GET_TIME( render3_time1 )
     			camid cid = game_render_frame_setup();
     
    -			clip_frame_view();
    +			if(!Time_compression_locked)
    +				game_set_view_clip(flFrametime);
    +			else
    +				game_set_view_clip(flRealframetime);
     
     			game_render_frame( cid );
     
    Index: code/globalincs/systemvars.cpp
    ===================================================================
    --- code/globalincs/systemvars.cpp	(revision 6329)
    +++ code/globalincs/systemvars.cpp	(working copy)
    @@ -33,6 +33,10 @@
     float Cutscene_delta_time = 1.0f;
     //How far along a change is (0 to 1)
     float Cutscene_bars_progress = 1.0f;
    +//Change FOV?
    +bool Cutscene_fov_change = true;
    +//Size of the bar
    +int Cutscene_bar_size = 0;
     
     //FADEIN STUFF
     shader Viewer_shader;
    Index: code/globalincs/systemvars.h
    ===================================================================
    --- code/globalincs/systemvars.h	(revision 6329)
    +++ code/globalincs/systemvars.h	(working copy)
    @@ -57,7 +57,8 @@
     //Styles to get to bars
     #define CUB_GRADUAL			(1<<15)
     extern float Cutscene_bars_progress, Cutscene_delta_time;
    -extern int Cutscene_bar_flags;
    +extern int Cutscene_bar_flags, Cutscene_bar_size;
    +extern bool Cutscene_fov_change;
     
     //-----Fadein stuff
     struct shader;
    Index: code/graphics/2d.h
    ===================================================================
    --- code/graphics/2d.h	(revision 6329)
    +++ code/graphics/2d.h	(working copy)
    @@ -224,7 +224,7 @@
     	void (*gf_flash_alpha)(int r, int g, int b, int a);
     
     	// sets the clipping region
    -	void (*gf_set_clip)(int x, int y, int w, int h, bool resize);
    +	void (*gf_set_clip)(int x, int y, int w, int h, bool resize, bool change_fov);
     
     	// resets the clipping region to entire screen
     	void (*gf_reset_clip)();
    @@ -525,9 +525,9 @@
     void gr_flip();
     
     //#define gr_set_clip			GR_CALL(gr_screen.gf_set_clip)
    -__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true)
    +__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true, bool change_fov=true)
     {
    -	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
    +	(*gr_screen.gf_set_clip)(x,y,w,h,resize,change_fov);
     }
     #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
     //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
    Index: code/graphics/gropengl.cpp
    ===================================================================
    --- code/graphics/gropengl.cpp	(revision 6329)
    +++ code/graphics/gropengl.cpp	(working copy)
    @@ -375,7 +375,7 @@
     #endif
     }
     
    -void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_opengl_set_clip(int x, int y, int w, int h, bool resize, bool change_fov)
     {
     	// check for sanity of parameters
     	if (x < 0) {
    @@ -415,37 +415,39 @@
     		h = max_h;
     	}
     
    -	gr_screen.offset_x_unscaled = x;
    -	gr_screen.offset_y_unscaled = y;
    -	gr_screen.clip_left_unscaled = 0;
    -	gr_screen.clip_right_unscaled = w-1;
    -	gr_screen.clip_top_unscaled = 0;
    -	gr_screen.clip_bottom_unscaled = h-1;
    -	gr_screen.clip_width_unscaled = w;
    -	gr_screen.clip_height_unscaled = h;
    +	if (change_fov) {
    +		gr_screen.offset_x_unscaled = x;
    +		gr_screen.offset_y_unscaled = y;
    +		gr_screen.clip_left_unscaled = 0;
    +		gr_screen.clip_right_unscaled = w-1;
    +		gr_screen.clip_top_unscaled = 0;
    +		gr_screen.clip_bottom_unscaled = h-1;
    +		gr_screen.clip_width_unscaled = w;
    +		gr_screen.clip_height_unscaled = h;
    +		
     
    -	if (to_resize) {
    -		gr_resize_screen_pos(&x, &y);
    -		gr_resize_screen_pos(&w, &h);
    -	} else {
    -		gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    -		gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    -	}
    +		if (to_resize) {
    +			gr_resize_screen_pos(&x, &y);
    +			gr_resize_screen_pos(&w, &h);
    +		} else {
    +			gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
    +			gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
    +		}
     
    -	gr_screen.offset_x = x;
    -	gr_screen.offset_y = y;
    -	gr_screen.clip_left = 0;
    -	gr_screen.clip_right = w-1;
    -	gr_screen.clip_top = 0;
    -	gr_screen.clip_bottom = h-1;
    -	gr_screen.clip_width = w;
    -	gr_screen.clip_height = h;
    +		gr_screen.offset_x = x;
    +		gr_screen.offset_y = y;
    +		gr_screen.clip_left = 0;
    +		gr_screen.clip_right = w-1;
    +		gr_screen.clip_top = 0;
    +		gr_screen.clip_bottom = h-1;
    +		gr_screen.clip_width = w;
    +		gr_screen.clip_height = h;
     
    -	gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    -	gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    -	gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    -
    +		gr_screen.clip_aspect = i2fl(w) / i2fl(h);
    +		gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
    +		gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
    +	}
     	// just return early if we aren't actually going to need the scissor test
     	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
     		GL_state.ScissorTest(GL_FALSE);
    Index: code/graphics/gropenglpostprocessing.cpp
    ===================================================================
    --- code/graphics/gropenglpostprocessing.cpp	(revision 6329)
    +++ code/graphics/gropenglpostprocessing.cpp	(working copy)
    @@ -1,6 +1,7 @@
     #include "graphics/gropenglpostprocessing.h"
     #include "graphics/gropenglshader.h"
     
    +#include "globalincs/systemvars.h"
     #include "io/timer.h"
     #include "nebula/neb.h"
     #include "parse/parselo.h"
    @@ -446,8 +447,13 @@
     	}
     
     	// Fix problems when player is dead and the screen is clipped.
    -	glEnable(GL_SCISSOR_TEST);
    -	glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	if (gr_screen.max_h != gr_screen.clip_height) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
    +	} else if (Cutscene_bar_size) {
    +		glEnable(GL_SCISSOR_TEST);
    +		glScissor(0, Cutscene_bar_size, gr_screen.max_w, gr_screen.max_h - Cutscene_bar_size * 2);
    +	}
     
     	// Main post-processing render
     	render_target::apply_default();
    Index: code/graphics/grstub.cpp
    ===================================================================
    --- code/graphics/grstub.cpp	(revision 6329)
    +++ code/graphics/grstub.cpp	(working copy)
    @@ -257,7 +257,7 @@
     {
     }
     
    -void gr_stub_set_clip(int x, int y, int w, int h, bool resize)
    +void gr_stub_set_clip(int x, int y, int w, int h, bool resize,bool fov_change)
     {
     }
     
    Index: code/parse/sexp.cpp
    ===================================================================
    --- code/parse/sexp.cpp	(revision 6329)
    +++ code/parse/sexp.cpp	(working copy)
    @@ -541,7 +541,7 @@
     	{ "set-training-context-speed",		OP_SET_TRAINING_CONTEXT_SPEED,		2, 2, },
     
     	//Cutscene stuff
    -	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 1, },
    +	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 2, },
     	{ "unset-cutscene-bars",		OP_CUTSCENES_UNSET_CUTSCENE_BARS,		0, 1, },
     	{ "fade-in",					OP_CUTSCENES_FADE_IN,					0, 1, },
     	{ "fade-out",					OP_CUTSCENES_FADE_OUT,					0, 2, },
    @@ -16062,8 +16062,10 @@
     
     	float delta_speed = 0.0f;
     
    -	if(node != -1)
    +	if(node != -1) {
     		delta_speed = eval_num(node)/1000.0f;
    +		node = CDR(node);
    +	}
     
     	if(delta_speed > 0.0f)
     	{
    @@ -16075,6 +16077,10 @@
     	{
     		Cutscene_bar_flags &= ~CUB_GRADUAL;
     	}
    +
    +	Cutscene_fov_change = true;
    +	if(node != -1)
    +		Cutscene_fov_change = is_sexp_true(node) != 0;
     }
     
     void sexp_unset_cutscene_bars(int node)
    @@ -20942,6 +20948,11 @@
     			return OPF_NONE;
     
     		case OP_CUTSCENES_SET_CUTSCENE_BARS:
    +			if (argnum==0)
    +				return OPF_POSITIVE;
    +			else
    +				return OPF_BOOL;
    +
     		case OP_CUTSCENES_UNSET_CUTSCENE_BARS:
     		case OP_CUTSCENES_FADE_IN:
     		case OP_CUTSCENES_FADE_OUT:
    @@ -25026,8 +25037,9 @@
     
     	{ OP_CUTSCENES_SET_CUTSCENE_BARS, "set-cutscene-bars\r\n"
     		"\tShows bars at the top and bottom of screen.  "
    -		"Takes 0 or 1 arguments...\r\n"
    +		"Takes 0, 1 or 2 arguments...\r\n"
     		"\t1:\tMilliseconds for bars to slide in\r\n"
    +		"\t2:\tWhether FOV should be changed (defaults to true)\r\n"
     	},
     
     	{ OP_CUTSCENES_UNSET_CUTSCENE_BARS, "unset-cutscene-bars\r\n"
    
    patch file icon M1768_patch_20100727.patch (12,714 bytes) 2010-07-27 23:22 +
  • ? file icon test_cutbar.fs2 (2,389 bytes) 2011-08-09 09:19

-Relationships
has duplicate 0001864resolved Cutscenes go to full screen then back to partial 
+Relationships

-Notes

~0009691

Tolwyn (reporter)

according to KeldorKatarn, cutscene bars work on Nvidia cards, I am using a Radeon, so it might be ATI related.

~0009694

KeldorKatarn (reporter)

I correct myself, they don't work on my machine either, I just didn't notice it before.

~0009708

KeldorKatarn (reporter)

Possible fix attached

~0010512

chief1983 (administrator)

http://swc.fs2downloads.com/files/cutscene_bars_fix.7z

Try this out please and make sure it's fixed for you guys. Also this seems to have been duplicated in bug 1864.

~0010514

Tolwyn (reporter)

I played for approx. 10 minutes, everything seems to work. Thanks!

~0010515

chief1983 (administrator)

Good stuff. I posted the build in Modding on the forums, as soon as I get a few more positives I'll commit it. Thanks for patch and quick testing.

~0010519

phreak (developer)

The only thing that should be changed in the applied patch is that the glScissor call should probably go through taylor's GL_State machine instead of calling it directly. Also there is a graphics function that already does what Keldor added called gr_set_clip()

~0010524

chief1983 (administrator)

Last edited: 2009-01-12 03:18

phreak, any way you could rewrite the patch that way? I could make a build and get it tested if so. If that's more than a bit of work I can try to see if Taylor would take a look at all this to make sure it fits right. Not something I really want to do though.

~0010526

taylor (administrator)

Also remember that Keldor's patch was previously added in order to fix the distortion bug. Murleen fixed to the real problem there however and Keldor's patch was subsequently removed since we could go back to using the existing gr_set_clip() there instead.

I assume that this worked fine until WMC's 4783 commit which changed it to use gr_rect() instead of gr_set_clip() like it had been using. It would be easy enough to just change WMC's code to use gr_set_clip() again (since it was just commented out), but there may be an actual reason that he changed it to draw over the screen instead, in which case what's there just needs to be fixed rather than replacing it with something else.

~0010541

phreak (developer)

The gr_set_clip change has been put into the next nightly. works on my system, but then again, so did the old method.

~0010543

ARSPR (reporter)

Last edited: 2009-01-19 14:33

It doesn't work in my system. Tested with Warzone last mission (credits):

+ Cutscene bars fix build. It works perfectly.

+ r5039 (before phreak's fix): Cutscene bars appear when a text is being displayed. If there's no text on the screen there are no cutscene bars.

+ r5045 (after phreak's fix): Cutscene bars don't appear at all.

(nVidia 8800GTX + Vista 32-bit)

~0010573

phreak (developer)

ok i saw the issue, try again.

~0010584

ARSPR (reporter)

With 5052, it works fine.

~0010603

Tolwyn (reporter)

does not work in r5052 for me.

~0010683

Tolwyn (reporter)

added a picture showing what's exactly going wrong in 5052. Take a closer look at the Hellcat at the bottom of the screen.

~0010710

chief1983 (administrator)

Tolwyn:

Just to clarify, the original patch worked fine, then attempts were made to 'clean it up', and now it no longer functions correctly? I may just revert the existing changes and submit the original patch for now then if that's the case. I want this bug at least fixed enough to move on.

~0010711

Tolwyn (reporter)

It might be totally unrelated to the fix, it might be a bug concerning the skybox usage. I believe that the problem showed in the pic occurs only when a skybox is used instead of a skysphere.

~0010712

phreak (developer)

I will take a look with the skybox usage then. It worked fine without a skybox.

This may also be a driver issue.

~0010713

Tolwyn (reporter)

Again, I want to stress this point: a skysphere in media vp works just fine, when I use a cube instead of a sphere, this issue comes up.

~0010714

chief1983 (administrator)

This is close so I'm bumping its priority.

~0010720

Tolwyn (reporter)

I added Saga's default skybox (it is using the starmap from media vp). I believe, that the cutscene bar issue pops up when this pof is used. I am on a trip now, so I kinda have little time to do additional research on this matter. From next Thursday I could do some extensive testing though. I believe that there are other issues concerning the skybox, although, again, I can't do the required testing at the moment, so I am not going to elaborate on those right now.

~0010757

KeldorKatarn (reporter)

I do not believe this is simply skybox related. For me it sometimes works with skyboxes but doesn't with the original skysphere.. so the skybox alone is not the problem I think.

A general remark on this subject though... whoever fixes this.. remember that "animated" cutscene bars must work also.. you can specify a value in the SEXP how many seconds it takes the bars to slide in, if one choses to have that effect.

With some older code this looked horrible when using certain clipping code since instead of simply cutting off the image the entire field of view was changed hence sliding in cutscene bars somehow distorted the entire image.

So if you fix this also check if sliding in bars do look correctly as well...

~0010835

Ransom Arceihn (reporter)

Cutscene bars still aren't working right. They show up fine in the cockpit, but in an external camera using the set-camera SEXPs they're just not there.

~0010888

Goober5000 (administrator)

Taylor provided me a fix, which I am now waiting on Tolwyn to evaluate.

~0010890

Tolwyn (reporter)

Yes, I am on it. It just takes time, because there is no pattern in the behavior: in some missions they tend to work, in others they don't.

~0010895

Tolwyn (reporter)

However, there is one thing I'd like to get off my chest: why are you still working with FOV change? It distorts the perspective during camera movement, sliding in cutscene bars does not work.

~0010899

taylor (administrator)

The FOV change is how it worked before, and how "bars" have historically been added in the game (death screen does the same thing). The other method just adds black boxes to the top and bottom of the screen like fake letterbox, it's a crappy hack. I understand why the change was made, since we had that whole widescreen-alignment issue to deal with, but that has since been fixed so I don't really see much reason to go back to using a bad hack as a fix. Plus if needed we to should be able to tweak the FOV to resolve most distortions so that really isn't much of an issue.

And what do you mean by "sliding"? If it's what I thinking of then I don't really see any reason for it not to work. If you have something which doesn't work that I can test with then I'll take a look and see what I can do.

~0010900

Tolwyn (reporter)

Sorry, but you see some distortion on widescreen displays. I have a 16:9 display, and cutscenes make me feel dizzy. It's like looking through a fish glass.

~0010901

Ransom Arceihn (reporter)

Last edited: 2009-05-13 11:49

In all honesty, I would prefer fake letterboxing. When you slide the bars in and it shifts the FOV, it looks jarring and terrible. It's also inconvenient for a cutscene creator as any given shot appears differently to what you expect.

Frankly I don't see much reason to alter the FOV to begin with. Cutscene bars don't really exist to serve a technical function - in most modern games they're more to indicate a non-interactive cutscene than to actually change the aspect ratio.

~0010913

Goober5000 (administrator)

Fake letterboxing is... fake. Meh.

I am committing this to trunk and marking the issue as fixed. Assigning to Taylor since the fix was to his credit.

~0010923

Tolwyn (reporter)

maybe not related to the latest fix, but surely related to the issue as such: in nebula missions the background turns black during cutscenes. Tested with latest trunk EXE. See two pictures attached.

~0010929

Tolwyn (reporter)

And cutscene bars still don't work in some missions...

~0010930

portej05 (reporter)

Can you provide a sample mission that reproduces this bug?

~0010931

KeldorKatarn (reporter)

I could provide one that nearly always produces this, but it uses Saga data.

~0010998

KeldorKatarn (reporter)

-This is a Saga showstopper-

~0011005

Goober5000 (administrator)

Please open a separate ticket for the nebula background problem.

~0011009

KeldorKatarn (reporter)

Opened:
http://scp.indiegames.us/mantis/view.php?id=1945

~0011068

Tolwyn (reporter)

I am sorry to bring this up again, but FOV correction is really screwed on 16:9 monitors when cutscene bars are set. It might look decent on a 4:3 setup, but on a widescreen, depending on the system background used, it is like rotating a fish glass. I can record a video or two if you do not have a widescreen handy. ;)

~0011078

Goober5000 (administrator)

A video would be helpful, yes.

~0011079

chief1983 (administrator)

Could also just force a 16:9 resolution in windowed mode, usually works well enough for me. As long as you can do something like 1280x768 or 1600x900 it should be close enough.

~0011080

Tolwyn (reporter)

True, you could always enforce the resolution via windows registry (which is what I did on various netbooks)

~0011081

Tolwyn (reporter)

Also, it's not just the fish glass effect, the sun appears to move during the camera pan...

~0011207

Tolwyn (reporter)

I couldn't find the mission yet in which the fish glass effect is clearly visible so here is the showcase of what happens when cutscene bars do not work (which happens, well, more or less always)

http://www.wcsaga.net/database/tolwyn/fs2_open_3_6_11r_5610_2.avi

Pay close attention to the escort ships, as soon as they pass the cutscene bars border they become invisible except their engine glows.

~0011250

chief1983 (administrator)

This may be fixed, awaiting further input from Hery.

~0011252

chief1983 (administrator)

Assigning to Hery so he can verify if the fix for 0001945 fixed this as well.

~0011291

Hery (developer)

It looks like the cubemap rendering code was responsible for this problem.
Patch attached, debug build is available here: http://quarnos.org/dl/bars_rtt_build.zip
Please, confirm that the problem is solved.

~0011292

Tolwyn (reporter)

Seems to work. I'll do more tests later.

~0011306

Hery (developer)

chief1983 committed my patch to the trunk.

~0011425

Tolwyn (reporter)

Last edited: 2009-12-16 05:30

Still not fixed. Resolution reintroduced "ship disappearing at the edge of the screen" bug, which was fixed two years ago. Sliding cutscene bars do not work properly either and the "fish glass" effect is still there. Both can be attributed to the FOV change when cutscene bars are applied.

I captured a video showing autopilot transitions from different angles. Get it here (http://www.wcsaga.net/database/tolwyn/fs2_open_3_6_11r-20091125_r5686.avi - copy and paste the whole link). The fish glass effect affects both the sun (you need to watch the video frame by frame in this case to notice it - strength of the effect depends on multiple factors like camera speed, view angle, sun size) and any post processing effects applied. The result is very disturbing for the viewer.

Additional info here: http://scp.indiegames.us/mantis/view.php?id=1563

~0011430

Hery (developer)

The problem should be solved in this build: http://quarnos.org/dl/1768_build_18122009.zip

I had to reorder again few things to keep the fov, projection, view, etc configuration valid all the time. The patch is attached.

~0011432

KeldorKatarn (reporter)

Last edited: 2009-12-18 13:29

This fixes the moving sun and the disappearing ships, it doesn't fix the change of FOV which breaks the sliding in cutscene bars and the image distortion.

I really don't get this.. WHY do you do this with FOV.. why do cutscene bars need to change FOV.. it changes the settings for the preferred FOV for the application, meaning it zooms out, therefore totally changing the rendered image and sliding in cutscene bars will ALWAYS result in an animated zoom effect, which is not what should happen.

I really don't understand this. We've discussing this for over a year now. All games that I know which use cutscene bars simply blend in black bars and that's it. Why make it so complicated an change the field of view, distorting the entire image and break a built in feature, the sliding in cutscene bars, in the process?

As long as that doesn't work and this playing around with fixed FOV settings isn't removed this will never be fixed and remain broken.
Do you even look at the footage we provided? you can clearly see the zoom out effect, that's precisely why Tolwyn did the work of making that video.

If an already high FOV angle is set and you keep using FOV for the cutscene effect you always in effect increase the fullscreen FOV which results in a fisheye effect die to the angle being too large. What's the reasoning behind this? In breaks a feature and distorts the rendered image.
There is a functionality to simply cut off parts of the screen and not render to it while keeping the FOV as it is.. it's easier, quicker, doesn't change the viewed image and works.

I had this fixed over a year ago and you removed the patch and broke it again.
The reasoning behind it was "it's a hack and doesn't work with DirectX". Well better a hack than broken functionality and DirectX was removed now anyway.

I don't care if you do a cleaner version of my original code or whatever else, but playing around with this for over a year now when it was fixed already at one point is a bit ridiculous by now.

~0011433

KeldorKatarn (reporter)

Last edited: 2009-12-18 15:37

Alright, this patch fixes it and another bug (again...).
With the current build, if the player dies during a cutscene (i.e. while the cutscene bars are active) the entire cutscene bar system is totally screwed up. E.g. the cutscene bars suddenly start deactivating again after some time when the sexp's are still processed, but the player dead screen is still active, so you see the player dead and suddenly the FOV changes...
That's caused by the splitting up of the "player dead" and "cutscene bars" functionality. Why on earth that was ever done I don't get, since it causes exactly the just described bug.

This patch fixes that also.
Hery, you relocated some part of the code. I don't know why you did that exactly but since it works, I also moved it, copying that part of your patch.

That entire FOV functionality however is gone and replaced by scissoring the screen.
This works exactly as before only that now the black bars slide in without distoriting the FOV and the player can die during a cutscene without screwing up the entire FOV handling.

Patch attached: cutscene_bars.patch

~0011434

Hery (developer)

Discussion whether we should or not change FOV during cutscenes is entirely pointless. Changing it is a feature not a bug here and the only option is to give people a choice. Unfortunately, the previous discussion here was based on repeating the same arguments all the time.

I wonder which behaviour should be considered as correct: to show standard "player dead" bars or to use current cutscene bars instead. I opt for the former. In addition to that the situation when player dies during cutscene is a bit strange to me.

I have almost ready patch that seems to be the perfect solution to all these problems. There is still one thing to do. I'll post it here ASAP.

~0011435

KeldorKatarn (reporter)

Last edited: 2009-12-18 17:08

Using FOV for the cutscene bars will break sliding in bars! Did you even watch our video?
Sliding bars are supposed to slide over the image, not distort it in some strange zooming effect. If you keep using FOV sliding in bars is effectively broken.

Also by using FOV you increase FOV artificially. Players who use an already high FOV will get a very strong fish eye effect.

All this you call not a bug but a feature??

And this "death during a cutscene" issue had already been reported here a while ago and was fixed. So calling is a strange situation won't make it less of a bug. You're breaking functionality here and that has been broken for over a year now.

This is a Saga show stopper so until this is fixed so it works without completely distorting the rendering and without zooming anything, Saga cannot release!

~0011436

Tolwyn (reporter)

Honestly, Hery, did you ever watch the video I provided? Did you try playing the game on a widescreen? The wide screen support is barely functioning as it is (distorted HUD), but with cutscene bars applied the whole image is distorted. It becomes plainly visible on a 16:9 screen, like the one I am using.

~0011437

KeldorKatarn (reporter)

Last edited: 2009-12-18 17:12

Which is no wonder. Changing FOV just to make the screen smaller and then wondering why people complain about fisheye effects is incredibly naive. Don't you get this? You squish the image, you distort the FOV. That CANNOT work.
it might not be incredibly visible if you play with a very low FOV on a 4:3 monitor, but on a widescreen with a custom set higher FOV it become incredibly distorted and looks simply unusable.

And the sliding in cutscene bars will never work with that approach also. That will ALWAYS result in a zoom effect which is not what should happen. And that is not an opinion that is a fact. Tell me ANY game that starts zooming once cutscene bars are sliding in.

~0011438

Hery (developer)

Last edited: 2009-12-18 17:24

Hopefully, this is the last patch posted here.
It adds second optional argument to set-cutscene-bars sexp that determines whether FOV has to be changed. The default value is probably not the value that will be most often used, but we have to keep it like that for compatibility reasons.

This patch also fixes some minor issues, that might or might not be a real problem. Since it is closely connected to the patch for 1945 it also improves that fix.

Build: http://quarnos.org/dl/1768_patch_fov_change.zip
Patch attached: 1768_patch_fov_change.patch

KeldorKatarn, I won't discuss here if FOV change is a good solution. I said that it is a feature because it was used in retail, but that doesn't mean that in my opinion it is good to change FOV in cutscenes. Actually, my opinion whether it is better to change FOV or not is quite irrelevant. That's why I decided to give people the choice.

Tolwyn, I watched the video, I played the game on a widescreen. What I meant was that we can't completely change behaviour and break compatibility. However, we can make FOV change optional. This is the solution that everyone should accept.

~0011439

KeldorKatarn (reporter)

Fine... only means we have to change 60 missions by hand, but what the heck.
Yes, works. Commit please.

~0011440

Hery (developer)

I know that it is inconvenient but disabling FOV change by default might break some already released missions (ships may no longer be in view).

~0011441

KeldorKatarn (reporter)

Last edited: 2009-12-18 18:12

Fine, as long as it finally works :P
Thanks for making this final adjustment so fast.

~0011443

Ransom Arceihn (reporter)

Awesome. I've never liked the FOV change either. Thanks, Hery!

~0011445

Goober5000 (administrator)

Ack. This needs evaluation first.

I'll add it to my list of many things to do this break...

~0011446

Zacam (administrator)

Last edited: 2009-12-18 23:42

MSVC 2008 reports the following warning with the latest version posted by Hery on 12/18/2009:

This is under a Release Build btw
code\parse\sexp.cpp(15567) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

~0011447

Hery (developer)

is_sexp_true() obviously doesn't return bool value :P

This and another thing that might (under some strange circumstances) be a problem are solved.
Patch attached: 1768_patch_19122009.patch

~0011449

Zacam (administrator)

The 1768_patch_19122009.patch is confirmed under MSVC 2008 as no longer having any warnings.

~0011476

Zacam (administrator)

Last edited: 2010-01-02 10:27

Patch updated to current Trunk (5755)
M1768_patch_31122009.patch

Updated to Trunk 5763
M1768_patch_20100102.patch

~0011485

KeldorKatarn (reporter)

So what's the status on this now. I get a little confused with all the patches being committed... In the latest nightly build of 1st January, this isn't working yet, FRED doesn't contain the new SEXP.

~0011547

KeldorKatarn (reporter)

Knock knock

~0011551

portej05 (reporter)

The last comment from taylor on this (very recent, but haven't got link on hand) indicated that the fix for this is not simple. It's being thought about, but you're going to have to be patient.

~0011552

KeldorKatarn (reporter)

Last edited: 2010-01-21 10:40

What? But Hery already provided a fix that worked. THe one with the additional parameter for the SEXP.
What about that one?
Are you saying this was rejected AGAIN?
This issue is not over a year old and you're still telling us to be patient?

I mean even if the fix doesn't fix the entire issue but only covers it up... so what? If a real fix really takes that long to do, then maybe just give us something so this build can be used for a release?
This is on the roadmap for 3.6.12 after all and every day that 3.6.12 final is delayed also delays our release. We already had to delay our beta testing phase by 6 months...

~0011553

portej05 (reporter)

Keldor: Release without it. The roadmap is no longer current. If WCS can't release with out it, you're going to have to wait a long time until we fix a fair bit of code that is related to this.

~0011554

Tolwyn (reporter)

You know better than I do that the code is a dirty patch work and there are even worse hacks in it. Cutscene bars used to work, not perfectly, thanks to the fov change, but they worked somehow. Now they are fully broken. We can't release the game as it relies on the cutscene bars. Call this a temporary fix, but please put it into the repository.

~0011556

chief1983 (administrator)

He's talking about the list of bugs to fix for 3.6.12 in Mantis I think, not the 'roadmap' thread. That doesn't even have a 3.6.12 I don't think does it?

Anyway, I was under the impression that WCS had run into other slowdowns preventing them from needing this immediately.

~0011557

Tolwyn (reporter)

That is not exactly correct. We are in the process of finalizing our missions, which is the last obstacle before a closed beta test. And I'd prefer to conduct it with a more or less finalized EXE. And I am not sure if it really matters - Saga will use next SCP iteration.

~0011558

KeldorKatarn (reporter)

Last edited: 2010-01-21 15:18

We could already have started since several missions of the first episodes are already finalized except for final polishing and voiceover lines.
A preliminary beta test would already have been possible last year. The only thing that prevented this was the lack of a build that's considered stable and feature complete.

Edit: Not to mention that we are going to produce a trailer very soon. If this isn't fixed we'll have to use a custom build that we fix ourselves to record ingame scenes... that kind of stuff is simply annoying. Especially since there's been like 5 different fixes for this around already. This could have been temporarily fixed 2 years ago already. But since then we've been constantly told that a temporary fix is not ok and that it will have to be really fixed. Problem is... it's now 2 years later and it still hasn't been fixed.

~0011580

Goober5000 (administrator)

It's being worked on, behind the scenes. But if it bothers you guys this much, then do what BTRL did -- when you release your TC, make a custom build with your desired fix for this one specific issue.

~0011586

chief1983 (administrator)

Goober, I'm sorry but that sounds like a pretty terrible idea. It will get even worse to maintain with the plans we have for engine overhaul. I'm still trying to get the current suggested 'hack' working in the interim.

~0011587

Tolwyn (reporter)

I thought when we talked about this a year ago that the goal was to avoid creation of a custom build.

~0011589

Goober5000 (administrator)

The goal is to avoid a custom build if at all possible. But in this case, where you have a) an urgent WCS need; b) a strongly-supported SCP rationale for waiting; c) a well-defined WCS patch; and d) a SCP requirement for a significant rewrite; a custom build becomes a reasonable strategy.

I am not suggesting that WCS fork off its codebase from the SCP; that would benefit neither of us. What I am suggesting is that WCS apply this one patch when they make their final EXE for release. BTRL did the same thing when they released their demo. Later on, the required feature was added to trunk, and the BTRL custom build was no longer needed. Once the cutscene bar problem is fixed properly, the WCS custom build will no longer be needed either.

~0011590

chief1983 (administrator)

They shouldn't need to make their own final EXE for release, the official one should be good enough.

~0012277

chief1983 (administrator)

In case cutscene bars are still an issue, I updated the patch against current trunk again. We still may want to include these changes at some point.

~0012761

FSF (reporter)

Since this is still unresolved, I'll just bump it... Cutscene bars are not working in cutscenes! When using a cutscene camera (e.g. with set-camera-position) the cutscene bars won't show up. Nightly 7430, I'm attaching a test mission.

~0012971

FSF (reporter)

Issue persists on 3.6.14 RC1...

~0013057

guest (viewer)

Fix committed to trunk@8231.

~0013070

Zacam (administrator)

Fix committed to fs2_open_3_6_14@8250.
+Notes

+Related Changesets

-Issue History
Date Modified Username Field Change
2008-09-17 16:22 Tolwyn New Issue
2008-09-17 16:30 Tolwyn Note Added: 0009691
2008-09-18 01:19 KeldorKatarn Note Added: 0009694
2008-09-25 14:11 KeldorKatarn File Added: cutscene_bars_fix.patch
2008-09-25 14:11 KeldorKatarn Note Added: 0009708
2009-01-08 10:58 chief1983 Relationship added has duplicate 0001864
2009-01-08 13:17 chief1983 Note Added: 0010512
2009-01-08 14:41 Tolwyn Note Added: 0010514
2009-01-08 21:20 chief1983 Note Added: 0010515
2009-01-08 21:21 chief1983 Assigned To => chief1983
2009-01-08 21:21 chief1983 Status new => feedback
2009-01-09 11:00 phreak Note Added: 0010519
2009-01-12 03:17 chief1983 Note Added: 0010524
2009-01-12 03:18 chief1983 Note Edited: 0010524
2009-01-13 15:16 taylor Note Added: 0010526
2009-01-18 22:49 phreak Note Added: 0010541
2009-01-19 14:32 ARSPR Note Added: 0010543
2009-01-19 14:33 ARSPR Note Edited: 0010543
2009-01-20 00:20 phreak Note Added: 0010573
2009-01-20 10:22 ARSPR Note Added: 0010584
2009-01-24 06:07 Tolwyn Note Added: 0010603
2009-02-20 07:47 Tolwyn File Added: screen0030.jpg
2009-02-20 07:48 Tolwyn Note Added: 0010683
2009-03-06 12:59 chief1983 Note Added: 0010710
2009-03-06 13:43 Tolwyn Note Added: 0010711
2009-03-06 13:46 phreak Note Added: 0010712
2009-03-06 14:28 Tolwyn Note Added: 0010713
2009-03-06 15:00 chief1983 Note Added: 0010714
2009-03-06 15:00 chief1983 Priority normal => high
2009-03-06 15:14 chief1983 Assigned To chief1983 =>
2009-03-07 06:29 Tolwyn File Added: skybox_default.pof
2009-03-07 06:32 Tolwyn Note Added: 0010720
2009-03-23 18:39 KeldorKatarn Note Added: 0010757
2009-04-24 10:59 Ransom Arceihn Note Added: 0010835
2009-05-12 23:26 Goober5000 Note Added: 0010888
2009-05-12 23:26 Goober5000 Assigned To => Goober5000
2009-05-13 02:28 Tolwyn Note Added: 0010890
2009-05-13 06:45 Tolwyn Note Added: 0010895
2009-05-13 11:30 taylor Note Added: 0010899
2009-05-13 11:32 Tolwyn Note Added: 0010900
2009-05-13 11:48 Ransom Arceihn Note Added: 0010901
2009-05-13 11:49 Ransom Arceihn Note Edited: 0010901
2009-05-21 04:30 Goober5000 Note Added: 0010913
2009-05-21 04:30 Goober5000 Assigned To Goober5000 => taylor
2009-05-21 04:30 Goober5000 Status feedback => resolved
2009-05-21 04:30 Goober5000 Resolution open => fixed
2009-05-21 04:30 Goober5000 Fixed in Version => 3.6.11
2009-05-31 12:47 Tolwyn Status resolved => feedback
2009-05-31 12:47 Tolwyn Resolution fixed => reopened
2009-05-31 12:47 Tolwyn Note Added: 0010923
2009-05-31 12:49 Tolwyn File Added: screen0211.jpg
2009-05-31 12:49 Tolwyn File Added: screen0210.jpg
2009-06-02 03:16 Tolwyn Note Added: 0010929
2009-06-02 04:03 portej05 Note Added: 0010930
2009-06-02 04:15 KeldorKatarn Note Added: 0010931
2009-06-26 13:01 KeldorKatarn Note Added: 0010998
2009-06-26 13:45 Goober5000 Note Added: 0011005
2009-06-28 20:06 KeldorKatarn Note Added: 0011009
2009-07-09 07:07 Tolwyn Note Added: 0011068
2009-07-12 22:03 Goober5000 Note Added: 0011078
2009-07-12 22:55 chief1983 Note Added: 0011079
2009-07-13 04:14 Tolwyn Note Added: 0011080
2009-07-13 04:21 Tolwyn Note Added: 0011081
2009-07-13 18:11 taylor Assigned To taylor =>
2009-10-02 03:21 Tolwyn Note Added: 0011207
2009-11-05 17:59 chief1983 Status feedback => acknowledged
2009-11-05 17:59 chief1983 Product Version => 3.6.11
2009-11-05 17:59 chief1983 Fixed in Version 3.6.11 =>
2009-11-05 17:59 chief1983 Target Version => 3.6.12 RC1
2009-11-12 02:36 chief1983 Note Added: 0011250
2009-11-12 16:40 chief1983 Note Added: 0011252
2009-11-12 16:40 chief1983 Assigned To => Hery
2009-11-17 11:58 Hery File Added: cutscene_bars_rtt.patch
2009-11-17 12:00 Hery Note Added: 0011291
2009-11-17 12:37 Tolwyn Note Added: 0011292
2009-11-19 08:29 Hery Note Added: 0011306
2009-11-19 08:29 Hery Status acknowledged => resolved
2009-11-19 08:29 Hery Fixed in Version => 3.6.12 RC1
2009-11-19 08:29 Hery Resolution reopened => fixed
2009-12-16 05:26 Tolwyn Note Added: 0011425
2009-12-16 05:26 Tolwyn Status resolved => feedback
2009-12-16 05:26 Tolwyn Resolution fixed => reopened
2009-12-16 05:27 Tolwyn Note Edited: 0011425
2009-12-16 05:28 Tolwyn Note Edited: 0011425
2009-12-16 05:29 Tolwyn Note Edited: 0011425
2009-12-16 05:30 Tolwyn Note Edited: 0011425
2009-12-18 12:06 Hery File Added: 1768_patch_18122009.patch
2009-12-18 12:09 Hery Note Added: 0011430
2009-12-18 13:24 KeldorKatarn Note Added: 0011432
2009-12-18 13:27 KeldorKatarn Note Edited: 0011432
2009-12-18 13:29 KeldorKatarn Note Edited: 0011432
2009-12-18 15:36 KeldorKatarn Note Added: 0011433
2009-12-18 15:36 KeldorKatarn File Added: cutscene_bars.patch
2009-12-18 15:37 KeldorKatarn Note Edited: 0011433
2009-12-18 16:19 Hery Note Added: 0011434
2009-12-18 16:56 KeldorKatarn Note Added: 0011435
2009-12-18 16:57 KeldorKatarn Note Edited: 0011435
2009-12-18 17:06 KeldorKatarn Note Edited: 0011435
2009-12-18 17:08 KeldorKatarn Note Edited: 0011435
2009-12-18 17:08 Tolwyn Note Added: 0011436
2009-12-18 17:08 KeldorKatarn Note Edited: 0011435
2009-12-18 17:10 KeldorKatarn Note Added: 0011437
2009-12-18 17:12 KeldorKatarn Note Edited: 0011437
2009-12-18 17:13 Hery Note Added: 0011438
2009-12-18 17:14 Hery File Added: 1768_patch_fov_change.patch
2009-12-18 17:24 Hery Note Edited: 0011438
2009-12-18 18:04 KeldorKatarn Note Added: 0011439
2009-12-18 18:09 Hery Note Added: 0011440
2009-12-18 18:12 KeldorKatarn Note Added: 0011441
2009-12-18 18:12 KeldorKatarn Note Edited: 0011441
2009-12-18 19:54 Ransom Arceihn Note Added: 0011443
2009-12-18 21:43 Goober5000 Note Added: 0011445
2009-12-18 23:33 Zacam Note Added: 0011446
2009-12-18 23:42 Zacam Note Edited: 0011446
2009-12-19 06:22 Hery File Added: 1768_patch_19122009.patch
2009-12-19 06:23 Hery Note Added: 0011447
2009-12-19 19:59 Zacam Note Added: 0011449
2009-12-31 07:20 Zacam File Added: M1768_patch_31122009.patch
2009-12-31 07:20 Zacam Note Added: 0011476
2010-01-02 10:27 Zacam File Added: M1768_patch_20100102.patch
2010-01-02 10:27 Zacam Note Edited: 0011476
2010-01-02 10:36 Zacam File Deleted: M1768_patch_20100102.patch
2010-01-02 10:36 Zacam File Added: M1768_patch_20100102.patch
2010-01-03 12:33 KeldorKatarn Note Added: 0011485
2010-01-21 03:46 KeldorKatarn Note Added: 0011547
2010-01-21 10:06 portej05 Note Added: 0011551
2010-01-21 10:19 KeldorKatarn Note Added: 0011552
2010-01-21 10:40 KeldorKatarn Note Edited: 0011552
2010-01-21 10:41 portej05 Note Added: 0011553
2010-01-21 11:04 Tolwyn Note Added: 0011554
2010-01-21 11:16 chief1983 Note Added: 0011556
2010-01-21 11:25 Tolwyn Note Added: 0011557
2010-01-21 11:53 KeldorKatarn Note Added: 0011558
2010-01-21 15:18 KeldorKatarn Note Edited: 0011558
2010-01-24 16:10 Goober5000 Note Added: 0011580
2010-01-25 01:58 chief1983 Note Added: 0011586
2010-01-25 02:19 Tolwyn Note Added: 0011587
2010-01-26 20:21 Goober5000 Note Added: 0011589
2010-01-26 20:36 chief1983 Note Added: 0011590
2010-07-27 23:22 chief1983 File Added: M1768_patch_20100727.patch
2010-07-27 23:22 chief1983 Note Added: 0012277
2010-08-05 16:04 chief1983 Target Version 3.6.12 RC1 => 3.7.2
2011-08-09 09:19 FSF Note Added: 0012761
2011-08-09 09:19 FSF File Added: test_cutbar.fs2
2011-11-16 16:03 FSF Note Added: 0012971
2012-01-15 07:56 The_E Assigned To Hery => The_E
2012-01-15 07:56 The_E Status feedback => assigned
2012-01-15 08:26 Changeset attached => fs2open trunk r8231
2012-01-15 08:26 guest Note Added: 0013057
2012-01-15 08:26 guest Status assigned => resolved
2012-01-15 19:27 Zacam Changeset attached => fs2open fs2_open_3_6_14 r8250
2012-01-15 19:27 Zacam Note Added: 0013070
+Issue History