View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001768 | FSSCP | cutscenes | public | 2008-09-17 20:22 | 2012-01-16 00:27 |
Reporter | Tolwyn | Assigned To | The_E | ||
Priority | high | Severity | minor | Reproducibility | always |
Status | resolved | Resolution | reopened | ||
Product Version | 3.6.11 | ||||
Target Version | 3.7.2 | Fixed in Version | 3.6.12 RC1 | ||
Summary | 0001768: cutscene bars do not work | ||||
Description | The summary says it all: in recent builds cutscene bars do not show up. | ||||
Additional Information | I noticed this first time with the very first normal maps public build | ||||
Tags | No tags attached. | ||||
has duplicate | 0001864 | resolved | Cutscenes go to full screen then back to partial |
|
according to KeldorKatarn, cutscene bars work on Nvidia cards, I am using a Radeon, so it might be ATI related. |
|
I correct myself, they don't work on my machine either, I just didn't notice it before. |
2008-09-25 18:11
|
cutscene_bars_fix.patch (5,640 bytes)
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; |
|
Possible fix attached |
|
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. |
|
I played for approx. 10 minutes, everything seems to work. Thanks! |
|
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. |
|
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() |
|
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. |
|
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. |
|
The gr_set_clip change has been put into the next nightly. works on my system, but then again, so did the old method. |
|
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) |
|
ok i saw the issue, try again. |
|
With 5052, it works fine. |
|
does not work in r5052 for me. |
2009-02-20 12:47
|
|
|
added a picture showing what's exactly going wrong in 5052. Take a closer look at the Hellcat at the bottom of the screen. |
|
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. |
|
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. |
|
I will take a look with the skybox usage then. It worked fine without a skybox. This may also be a driver issue. |
|
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. |
|
This is close so I'm bumping its priority. |
2009-03-07 11:29
|
|
|
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. |
|
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... |
|
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. |
|
Taylor provided me a fix, which I am now waiting on Tolwyn to evaluate. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
2009-05-31 16:49
|
|
2009-05-31 16:49
|
|
|
And cutscene bars still don't work in some missions... |
|
Can you provide a sample mission that reproduces this bug? |
|
I could provide one that nearly always produces this, but it uses Saga data. |
|
-This is a Saga showstopper- |
|
Please open a separate ticket for the nebula background problem. |
|
Opened: http://scp.indiegames.us/mantis/view.php?id=1945 |
|
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. ;) |
|
A video would be helpful, yes. |
|
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. |
|
True, you could always enforce the resolution via windows registry (which is what I did on various netbooks) |
|
Also, it's not just the fish glass effect, the sun appears to move during the camera pan... |
|
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. |
|
This may be fixed, awaiting further input from Hery. |
|
Assigning to Hery so he can verify if the fix for 0001945 fixed this as well. |
2009-11-17 16:58
|
cutscene_bars_rtt.patch (1,627 bytes)
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 |
|
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. |
|
Seems to work. I'll do more tests later. |
|
chief1983 committed my patch to the trunk. |
|
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 |
2009-12-18 17:06
|
1768_patch_18122009.patch (4,782 bytes)
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 |
|
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. |
|
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. |
|
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 |
2009-12-18 20:36
|
cutscene_bars.patch (8,652 bytes)
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; |
|
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. |
|
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! |
|
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. |
|
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. |
|
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. |
2009-12-18 22:14
|
1768_patch_fov_change.patch (14,591 bytes)
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" |
|
Fine... only means we have to change 60 missions by hand, but what the heck. Yes, works. Commit please. |
|
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). |
|
Fine, as long as it finally works :P Thanks for making this final adjustment so fast. |
|
Awesome. I've never liked the FOV change either. Thanks, Hery! |
|
Ack. This needs evaluation first. I'll add it to my list of many things to do this break... |
|
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) |
2009-12-19 11:22
|
1768_patch_19122009.patch (14,596 bytes)
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" |
|
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 |
|
The 1768_patch_19122009.patch is confirmed under MSVC 2008 as no longer having any warnings. |
2009-12-31 12:20
|
M1768_patch_31122009.patch (13,140 bytes)
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 updated to current Trunk (5755) M1768_patch_31122009.patch Updated to Trunk 5763 M1768_patch_20100102.patch |
2010-01-02 15:36
|
M1768_patch_20100102.patch (13,140 bytes)
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" |
|
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. |
|
Knock knock |
|
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. |
|
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... |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
I thought when we talked about this a year ago that the goal was to avoid creation of a custom build. |
|
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. |
|
They shouldn't need to make their own final EXE for release, the official one should be good enough. |
2010-07-28 03:22
|
M1768_patch_20100727.patch (12,714 bytes)
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" |
|
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. |
|
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. |
2011-08-09 13:19
|
|
|
Issue persists on 3.6.14 RC1... |
|
Fix committed to trunk@8231. |
|
Fix committed to fs2_open_3_6_14@8250. |
fs2open: trunk r8231 2012-01-15 08:29 The_E Ported: N/A Details Diff |
Fix for Mantis 1768: Cutscene bars do not display properly. |
Affected Issues 0001768 |
|
mod - /trunk/fs2_open/code/freespace2/freespace.cpp | Diff File | ||
fs2open: fs2_open_3_6_14 r8250 2012-01-15 19:30 Ported: N/A Details Diff |
Backport: Trunk 8231; Fix for Mantis 1768: Cutscene bars do not display properly. |
Affected Issues 0001768 |
|
mod - /branches/fs2_open_3_6_14/code/freespace2/freespace.cpp | Diff File |
Date Modified | Username | Field | Change |
---|---|---|---|
2008-09-17 20:22 | Tolwyn | New Issue | |
2008-09-17 20:30 | Tolwyn | Note Added: 0009691 | |
2008-09-18 05:19 | KeldorKatarn | Note Added: 0009694 | |
2008-09-25 18:11 | KeldorKatarn | File Added: cutscene_bars_fix.patch | |
2008-09-25 18:11 | KeldorKatarn | Note Added: 0009708 | |
2009-01-08 15:58 | chief1983 | Relationship added | has duplicate 0001864 |
2009-01-08 18:17 | chief1983 | Note Added: 0010512 | |
2009-01-08 19:41 | Tolwyn | Note Added: 0010514 | |
2009-01-09 02:20 | chief1983 | Note Added: 0010515 | |
2009-01-09 02:21 | chief1983 | Assigned To | => chief1983 |
2009-01-09 02:21 | chief1983 | Status | new => feedback |
2009-01-09 16:00 | phreak | Note Added: 0010519 | |
2009-01-12 08:17 | chief1983 | Note Added: 0010524 | |
2009-01-12 08:18 | chief1983 | Note Edited: 0010524 | |
2009-01-13 20:16 | taylor | Note Added: 0010526 | |
2009-01-19 03:49 | phreak | Note Added: 0010541 | |
2009-01-19 19:32 | ARSPR | Note Added: 0010543 | |
2009-01-19 19:33 | ARSPR | Note Edited: 0010543 | |
2009-01-20 05:20 | phreak | Note Added: 0010573 | |
2009-01-20 15:22 | ARSPR | Note Added: 0010584 | |
2009-01-24 11:07 | Tolwyn | Note Added: 0010603 | |
2009-02-20 12:47 | Tolwyn | File Added: screen0030.jpg | |
2009-02-20 12:48 | Tolwyn | Note Added: 0010683 | |
2009-03-06 17:59 | chief1983 | Note Added: 0010710 | |
2009-03-06 18:43 | Tolwyn | Note Added: 0010711 | |
2009-03-06 18:46 | phreak | Note Added: 0010712 | |
2009-03-06 19:28 | Tolwyn | Note Added: 0010713 | |
2009-03-06 20:00 | chief1983 | Note Added: 0010714 | |
2009-03-06 20:00 | chief1983 | Priority | normal => high |
2009-03-06 20:14 | chief1983 | Assigned To | chief1983 => |
2009-03-07 11:29 | Tolwyn | File Added: skybox_default.pof | |
2009-03-07 11:32 | Tolwyn | Note Added: 0010720 | |
2009-03-23 22:39 | KeldorKatarn | Note Added: 0010757 | |
2009-04-24 14:59 | Ransom Arceihn | Note Added: 0010835 | |
2009-05-13 03:26 | Goober5000 | Note Added: 0010888 | |
2009-05-13 03:26 | Goober5000 | Assigned To | => Goober5000 |
2009-05-13 06:28 | Tolwyn | Note Added: 0010890 | |
2009-05-13 10:45 | Tolwyn | Note Added: 0010895 | |
2009-05-13 15:30 | taylor | Note Added: 0010899 | |
2009-05-13 15:32 | Tolwyn | Note Added: 0010900 | |
2009-05-13 15:48 | Ransom Arceihn | Note Added: 0010901 | |
2009-05-13 15:49 | Ransom Arceihn | Note Edited: 0010901 | |
2009-05-21 08:30 | Goober5000 | Note Added: 0010913 | |
2009-05-21 08:30 | Goober5000 | Assigned To | Goober5000 => taylor |
2009-05-21 08:30 | Goober5000 | Status | feedback => resolved |
2009-05-21 08:30 | Goober5000 | Resolution | open => fixed |
2009-05-21 08:30 | Goober5000 | Fixed in Version | => 3.6.11 |
2009-05-31 16:47 | Tolwyn | Status | resolved => feedback |
2009-05-31 16:47 | Tolwyn | Resolution | fixed => reopened |
2009-05-31 16:47 | Tolwyn | Note Added: 0010923 | |
2009-05-31 16:49 | Tolwyn | File Added: screen0211.jpg | |
2009-05-31 16:49 | Tolwyn | File Added: screen0210.jpg | |
2009-06-02 07:16 | Tolwyn | Note Added: 0010929 | |
2009-06-02 08:03 | portej05 | Note Added: 0010930 | |
2009-06-02 08:15 | KeldorKatarn | Note Added: 0010931 | |
2009-06-26 17:01 | KeldorKatarn | Note Added: 0010998 | |
2009-06-26 17:45 | Goober5000 | Note Added: 0011005 | |
2009-06-29 00:06 | KeldorKatarn | Note Added: 0011009 | |
2009-07-09 11:07 | Tolwyn | Note Added: 0011068 | |
2009-07-13 02:03 | Goober5000 | Note Added: 0011078 | |
2009-07-13 02:55 | chief1983 | Note Added: 0011079 | |
2009-07-13 08:14 | Tolwyn | Note Added: 0011080 | |
2009-07-13 08:21 | Tolwyn | Note Added: 0011081 | |
2009-07-13 22:11 | taylor | Assigned To | taylor => |
2009-10-02 07:21 | Tolwyn | Note Added: 0011207 | |
2009-11-05 22:59 | chief1983 | Status | feedback => acknowledged |
2009-11-05 22:59 | chief1983 | Product Version | => 3.6.11 |
2009-11-05 22:59 | chief1983 | Fixed in Version | 3.6.11 => |
2009-11-05 22:59 | chief1983 | Target Version | => 3.6.12 RC1 |
2009-11-12 07:36 | chief1983 | Note Added: 0011250 | |
2009-11-12 21:40 | chief1983 | Note Added: 0011252 | |
2009-11-12 21:40 | chief1983 | Assigned To | => Hery |
2009-11-17 16:58 | Hery | File Added: cutscene_bars_rtt.patch | |
2009-11-17 17:00 | Hery | Note Added: 0011291 | |
2009-11-17 17:37 | Tolwyn | Note Added: 0011292 | |
2009-11-19 13:29 | Hery | Note Added: 0011306 | |
2009-11-19 13:29 | Hery | Status | acknowledged => resolved |
2009-11-19 13:29 | Hery | Fixed in Version | => 3.6.12 RC1 |
2009-11-19 13:29 | Hery | Resolution | reopened => fixed |
2009-12-16 10:26 | Tolwyn | Note Added: 0011425 | |
2009-12-16 10:26 | Tolwyn | Status | resolved => feedback |
2009-12-16 10:26 | Tolwyn | Resolution | fixed => reopened |
2009-12-16 10:27 | Tolwyn | Note Edited: 0011425 | |
2009-12-16 10:28 | Tolwyn | Note Edited: 0011425 | |
2009-12-16 10:29 | Tolwyn | Note Edited: 0011425 | |
2009-12-16 10:30 | Tolwyn | Note Edited: 0011425 | |
2009-12-18 17:06 | Hery | File Added: 1768_patch_18122009.patch | |
2009-12-18 17:09 | Hery | Note Added: 0011430 | |
2009-12-18 18:24 | KeldorKatarn | Note Added: 0011432 | |
2009-12-18 18:27 | KeldorKatarn | Note Edited: 0011432 | |
2009-12-18 18:29 | KeldorKatarn | Note Edited: 0011432 | |
2009-12-18 20:36 | KeldorKatarn | Note Added: 0011433 | |
2009-12-18 20:36 | KeldorKatarn | File Added: cutscene_bars.patch | |
2009-12-18 20:37 | KeldorKatarn | Note Edited: 0011433 | |
2009-12-18 21:19 | Hery | Note Added: 0011434 | |
2009-12-18 21:56 | KeldorKatarn | Note Added: 0011435 | |
2009-12-18 21:57 | KeldorKatarn | Note Edited: 0011435 | |
2009-12-18 22:06 | KeldorKatarn | Note Edited: 0011435 | |
2009-12-18 22:08 | KeldorKatarn | Note Edited: 0011435 | |
2009-12-18 22:08 | Tolwyn | Note Added: 0011436 | |
2009-12-18 22:08 | KeldorKatarn | Note Edited: 0011435 | |
2009-12-18 22:10 | KeldorKatarn | Note Added: 0011437 | |
2009-12-18 22:12 | KeldorKatarn | Note Edited: 0011437 | |
2009-12-18 22:13 | Hery | Note Added: 0011438 | |
2009-12-18 22:14 | Hery | File Added: 1768_patch_fov_change.patch | |
2009-12-18 22:24 | Hery | Note Edited: 0011438 | |
2009-12-18 23:04 | KeldorKatarn | Note Added: 0011439 | |
2009-12-18 23:09 | Hery | Note Added: 0011440 | |
2009-12-18 23:12 | KeldorKatarn | Note Added: 0011441 | |
2009-12-18 23:12 | KeldorKatarn | Note Edited: 0011441 | |
2009-12-19 00:54 | Ransom Arceihn | Note Added: 0011443 | |
2009-12-19 02:43 | Goober5000 | Note Added: 0011445 | |
2009-12-19 04:33 | Zacam | Note Added: 0011446 | |
2009-12-19 04:42 | Zacam | Note Edited: 0011446 | |
2009-12-19 11:22 | Hery | File Added: 1768_patch_19122009.patch | |
2009-12-19 11:23 | Hery | Note Added: 0011447 | |
2009-12-20 00:59 | Zacam | Note Added: 0011449 | |
2009-12-31 12:20 | Zacam | File Added: M1768_patch_31122009.patch | |
2009-12-31 12:20 | Zacam | Note Added: 0011476 | |
2010-01-02 15:27 | Zacam | File Added: M1768_patch_20100102.patch | |
2010-01-02 15:27 | Zacam | Note Edited: 0011476 | |
2010-01-02 15:36 | Zacam | File Deleted: M1768_patch_20100102.patch | |
2010-01-02 15:36 | Zacam | File Added: M1768_patch_20100102.patch | |
2010-01-03 17:33 | KeldorKatarn | Note Added: 0011485 | |
2010-01-21 08:46 | KeldorKatarn | Note Added: 0011547 | |
2010-01-21 15:06 | portej05 | Note Added: 0011551 | |
2010-01-21 15:19 | KeldorKatarn | Note Added: 0011552 | |
2010-01-21 15:40 | KeldorKatarn | Note Edited: 0011552 | |
2010-01-21 15:41 | portej05 | Note Added: 0011553 | |
2010-01-21 16:04 | Tolwyn | Note Added: 0011554 | |
2010-01-21 16:16 | chief1983 | Note Added: 0011556 | |
2010-01-21 16:25 | Tolwyn | Note Added: 0011557 | |
2010-01-21 16:53 | KeldorKatarn | Note Added: 0011558 | |
2010-01-21 20:18 | KeldorKatarn | Note Edited: 0011558 | |
2010-01-24 21:10 | Goober5000 | Note Added: 0011580 | |
2010-01-25 06:58 | chief1983 | Note Added: 0011586 | |
2010-01-25 07:19 | Tolwyn | Note Added: 0011587 | |
2010-01-27 01:21 | Goober5000 | Note Added: 0011589 | |
2010-01-27 01:36 | chief1983 | Note Added: 0011590 | |
2010-07-28 03:22 | chief1983 | File Added: M1768_patch_20100727.patch | |
2010-07-28 03:22 | chief1983 | Note Added: 0012277 | |
2010-08-05 20:04 | chief1983 | Target Version | 3.6.12 RC1 => 3.7.2 |
2011-08-09 13:19 | FSF | Note Added: 0012761 | |
2011-08-09 13:19 | FSF | File Added: test_cutbar.fs2 | |
2011-11-16 21:03 | FSF | Note Added: 0012971 | |
2012-01-15 12:56 | The_E | Assigned To | Hery => The_E |
2012-01-15 12:56 | The_E | Status | feedback => assigned |
2012-01-15 13:26 | Changeset attached | => fs2open trunk r8231 | |
2012-01-15 13:26 | guest | Note Added: 0013057 | |
2012-01-15 13:26 | guest | Status | assigned => resolved |
2012-01-16 00:27 | Zacam | Changeset attached | => fs2open fs2_open_3_6_14 r8250 |
2012-01-16 00:27 | Zacam | Note Added: 0013070 |