@@ -725,6 +725,34 @@ namespace RTE {
725
725
return 0 ;
726
726
}
727
727
728
+ // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
729
+
730
+ void FrameMan::UpdateScreenOffsetForSplitScreen (char playerScreen, Vector &screenOffset) {
731
+ switch (playerScreen) {
732
+ case 1 :
733
+ // If both splits, or just VSplit, then in upper right quadrant
734
+ if ((m_VSplit && !m_HSplit) || (m_VSplit && m_HSplit)) {
735
+ screenOffset.SetIntXY (GetResX () / 2 , 0 );
736
+ } else {
737
+ // If only HSplit, then lower left quadrant
738
+ screenOffset.SetIntXY (0 , GetResY () / 2 );
739
+ }
740
+ break ;
741
+ case 2 :
742
+ // Always lower left quadrant
743
+ screenOffset.SetIntXY (0 , GetResY () / 2 );
744
+ break ;
745
+ case 3 :
746
+ // Always lower right quadrant
747
+ screenOffset.SetIntXY (GetResX () / 2 , GetResY () / 2 );
748
+ break ;
749
+ default :
750
+ // Always upper left corner
751
+ screenOffset.SetIntXY (0 , 0 );
752
+ break ;
753
+ }
754
+ }
755
+
728
756
// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
729
757
730
758
void FrameMan::Draw () {
@@ -800,65 +828,21 @@ namespace RTE {
800
828
// Enable clipping on the draw bitmap
801
829
set_clip_state (pDrawScreen, 1 );
802
830
803
- DrawScreenText (whichScreen, pPlayerGUIBitmap);
804
-
805
- // If we are dealing with split screens, then deal with the fact that we need to draw the player screens to different locations on the final buffer
806
- // The position of the current draw screen on the final screen
831
+ DrawScreenText (playerScreen, playerGUIBitmap);
832
+
833
+ // The position of the current draw screen on the backbuffer
807
834
Vector screenOffset;
808
835
809
- if (screenCount > 1 ) {
810
- switch (whichScreen) {
811
- case 1 :
812
- // If both splits, or just VSplit, then in upper right quadrant
813
- if ((m_VSplit && !m_HSplit) || (m_VSplit && m_HSplit)) {
814
- screenOffset.SetIntXY (GetResX () / 2 , 0 );
815
- } else {
816
- // If only HSplit, then lower left quadrant
817
- screenOffset.SetIntXY (0 , GetResY () / 2 );
818
- }
819
- break ;
820
- case 2 :
821
- // Always lower left quadrant
822
- screenOffset.SetIntXY (0 , GetResY () / 2 );
823
- break ;
824
- case 3 :
825
- // Always lower right quadrant
826
- screenOffset.SetIntXY (GetResX () / 2 , GetResY () / 2 );
827
- break ;
828
- default :
829
- // Always upper left corner
830
- screenOffset.SetIntXY (0 , 0 );
831
- break ;
832
- }
833
- }
834
-
835
- DrawScreenFlash (whichScreen, pDrawScreenGUI);
836
-
837
- // Draw the intermediate draw splitscreen to the appropriate spot on the back buffer
838
- if (!IsInMultiplayerMode ()) { blit (pDrawScreen, m_BackBuffer8, 0 , 0 , screenOffset.GetFloorIntX (), screenOffset.GetFloorIntY (), pDrawScreen->w , pDrawScreen->h ); }
839
-
840
- // Add the player screen's effects to the total screen effects list so they can be drawn in post processing
841
- if (!IsInMultiplayerMode ()) {
842
- int occX = g_SceneMan.GetScreenOcclusion (whichScreen).GetFloorIntX ();
843
- int occY = g_SceneMan.GetScreenOcclusion (whichScreen).GetFloorIntY ();
844
-
845
- // Copy post effects received by client if in network mode
846
- if (m_DrawNetworkBackBuffer) { g_PostProcessMan.GetNetworkPostEffectsList (0 , screenRelativeEffects); }
847
-
848
- // Adjust for the player screen's position on the final buffer
849
- for (list<PostEffect>::iterator eItr = screenRelativeEffects.begin (); eItr != screenRelativeEffects.end (); ++eItr) {
850
- // Make sure we won't be adding any effects to a part of the screen that is occluded by menus and such
851
- if ((*eItr).m_Pos .m_X > occX && (*eItr).m_Pos .m_Y > occY && (*eItr).m_Pos .m_X < pDrawScreen->w + occX && (*eItr).m_Pos .m_Y < pDrawScreen->h + occY) {
852
- g_PostProcessMan.GetPostScreenEffectsList ()->push_back (PostEffect ((*eItr).m_Pos + screenOffset, (*eItr).m_Bitmap , (*eItr).m_BitmapHash , (*eItr).m_Strength , (*eItr).m_Angle ));
853
- }
854
- }
836
+ // If we are dealing with split screens, then deal with the fact that we need to draw the player screens to different locations on the final buffer
837
+ if (screenCount > 1 ) { UpdateScreenOffsetForSplitScreen (playerScreen, screenOffset); }
855
838
856
- // Adjust glow areas for the player screen's position on the final buffer
857
- for (list<Box>::iterator bItr = screenRelativeGlowBoxes.begin (); bItr != screenRelativeGlowBoxes.end (); ++bItr) {
858
- g_PostProcessMan.GetPostScreenGlowBoxesList ()->push_back (*bItr);
859
- // Adjust each added glow area for the player screen's position on the final buffer
860
- g_PostProcessMan.GetPostScreenGlowBoxesList ()->back ().m_Corner += screenOffset;
861
- }
839
+ DrawScreenFlash (playerScreen, drawScreenGUI);
840
+
841
+ if (!IsInMultiplayerMode ()) {
842
+ // Draw the intermediate draw splitscreen to the appropriate spot on the back buffer
843
+ blit (drawScreen, m_BackBuffer8, 0 , 0 , screenOffset.GetFloorIntX (), screenOffset.GetFloorIntY (), drawScreen->w , drawScreen->h );
844
+
845
+ g_PostProcessMan.AdjustEffectsPosToPlayerScreen (playerScreen, drawScreen, screenOffset, screenRelativeEffects, screenRelativeGlowBoxes);
862
846
}
863
847
}
864
848
@@ -867,7 +851,6 @@ namespace RTE {
867
851
868
852
if (!IsInMultiplayerMode ()) {
869
853
// Draw separating lines for split-screens
870
- acquire_bitmap (m_BackBuffer8);
871
854
if (m_HSplit) {
872
855
hline (m_BackBuffer8, 0 , (m_BackBuffer8->h / 2 ) - 1 , m_BackBuffer8->w - 1 , m_AlmostBlackColor);
873
856
hline (m_BackBuffer8, 0 , (m_BackBuffer8->h / 2 ), m_BackBuffer8->w - 1 , m_AlmostBlackColor);
@@ -889,62 +872,7 @@ namespace RTE {
889
872
}
890
873
}
891
874
892
- if (IsInMultiplayerMode ()) {
893
- // Blit all four internal player screens onto the backbuffer
894
- for (short i = 0 ; i < c_MaxScreenCount; i++) {
895
- int dx = 0 ;
896
- int dy = 0 ;
897
- int dw = m_BackBuffer8->w / 2 ;
898
- int dh = m_BackBuffer8->h / 2 ;
899
-
900
- switch (i) {
901
- case 1 :
902
- dx = dw;
903
- break ;
904
- case 2 :
905
- dy = dh;
906
- break ;
907
- case 3 :
908
- dx = dw;
909
- dy = dh;
910
- break ;
911
- default :
912
- break ;
913
- }
914
-
915
- m_NetworkBitmapIsLocked[i] = true ;
916
- blit (m_NetworkBackBufferIntermediate8[m_NetworkFrameCurrent][i], m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i], 0 , 0 , 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i]->w , m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i]->h );
917
- blit (m_NetworkBackBufferIntermediateGUI8[m_NetworkFrameCurrent][i], m_NetworkBackBufferFinalGUI8[m_NetworkFrameCurrent][i], 0 , 0 , 0 , 0 , m_NetworkBackBufferFinalGUI8[m_NetworkFrameCurrent][i]->w , m_NetworkBackBufferFinalGUI8[m_NetworkFrameCurrent][i]->h );
918
- m_NetworkBitmapIsLocked[i] = false ;
919
-
920
- #if defined DEBUG_BUILD || defined MIN_DEBUG_BUILD
921
- // Draw all player's screen into one
922
- if (g_UInputMan.KeyHeld (KEY_5)) {
923
- stretch_blit (m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][i]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][i]->h , dx, dy, dw, dh);
924
- }
925
- #endif
926
- }
927
-
928
- #if defined DEBUG_BUILD || defined MIN_DEBUG_BUILD
929
- if (g_UInputMan.KeyHeld (KEY_1)) {
930
- stretch_blit (m_NetworkBackBufferFinal8[0 ][0 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][0 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][0 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
931
- }
932
- if (g_UInputMan.KeyHeld (KEY_2)) {
933
- stretch_blit (m_NetworkBackBufferFinal8[1 ][0 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][1 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][1 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
934
- }
935
- if (g_UInputMan.KeyHeld (KEY_3)) {
936
- stretch_blit (m_NetworkBackBufferFinal8[m_NetworkFrameReady][2 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][2 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][2 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
937
- }
938
- if (g_UInputMan.KeyHeld (KEY_4)) {
939
- stretch_blit (m_NetworkBackBufferFinal8[m_NetworkFrameReady][3 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][3 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][3 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
940
- }
941
- #endif
942
-
943
- // Rendering complete, we can finally mark current frame as ready
944
- // This is needed to make rendering look totally atomic for the server pulling data in separate threads
945
- m_NetworkFrameReady = m_NetworkFrameCurrent;
946
- m_NetworkFrameCurrent = (m_NetworkFrameCurrent == 0 ) ? 1 : 0 ;
947
- }
875
+ if (IsInMultiplayerMode ()) { PrepareFrameForNetwork (); }
948
876
949
877
if (g_InActivity) { g_PostProcessMan.PostProcess (); }
950
878
@@ -956,8 +884,6 @@ namespace RTE {
956
884
vline (m_BackBuffer8, 0 , 0 , g_SceneMan.GetSceneHeight (), 5 );
957
885
#endif
958
886
959
- release_bitmap (m_BackBuffer8);
960
-
961
887
// Reset the frame timer so we can measure how much it takes until next frame being drawn
962
888
g_PerformanceMan.ResetFrameTimer ();
963
889
}
@@ -1094,4 +1020,61 @@ namespace RTE {
1094
1020
}
1095
1021
}
1096
1022
}
1023
+
1024
+ // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1025
+
1026
+ void FrameMan::PrepareFrameForNetwork () {
1027
+ unsigned short dx = 0 ;
1028
+ unsigned short dy = 0 ;
1029
+ unsigned short dw = m_BackBuffer8->w / 2 ;
1030
+ unsigned short dh = m_BackBuffer8->h / 2 ;
1031
+
1032
+ // Blit all four internal player screens onto the backbuffer
1033
+ for (unsigned char i = 0 ; i < c_MaxScreenCount; i++) {
1034
+ switch (i) {
1035
+ case 1 :
1036
+ dx = dw;
1037
+ break ;
1038
+ case 2 :
1039
+ dy = dh;
1040
+ break ;
1041
+ case 3 :
1042
+ dx = dw;
1043
+ dy = dh;
1044
+ break ;
1045
+ default :
1046
+ break ;
1047
+ }
1048
+
1049
+ m_NetworkBitmapIsLocked[i] = true ;
1050
+ blit (m_NetworkBackBufferIntermediate8[m_NetworkFrameCurrent][i], m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i], 0 , 0 , 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i]->w , m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i]->h );
1051
+ blit (m_NetworkBackBufferIntermediateGUI8[m_NetworkFrameCurrent][i], m_NetworkBackBufferFinalGUI8[m_NetworkFrameCurrent][i], 0 , 0 , 0 , 0 , m_NetworkBackBufferFinalGUI8[m_NetworkFrameCurrent][i]->w , m_NetworkBackBufferFinalGUI8[m_NetworkFrameCurrent][i]->h );
1052
+ m_NetworkBitmapIsLocked[i] = false ;
1053
+
1054
+ #if defined DEBUG_BUILD || defined MIN_DEBUG_BUILD
1055
+ // Draw all player's screen into one
1056
+ if (g_UInputMan.KeyHeld (KEY_5)) {
1057
+ stretch_blit (m_NetworkBackBufferFinal8[m_NetworkFrameCurrent][i], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][i]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][i]->h , dx, dy, dw, dh);
1058
+ }
1059
+ #endif
1060
+ }
1061
+
1062
+ #if defined DEBUG_BUILD || defined MIN_DEBUG_BUILD
1063
+ if (g_UInputMan.KeyHeld (KEY_1)) {
1064
+ stretch_blit (m_NetworkBackBufferFinal8[0 ][0 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][0 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][0 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
1065
+ }
1066
+ if (g_UInputMan.KeyHeld (KEY_2)) {
1067
+ stretch_blit (m_NetworkBackBufferFinal8[1 ][0 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][1 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][1 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
1068
+ }
1069
+ if (g_UInputMan.KeyHeld (KEY_3)) {
1070
+ stretch_blit (m_NetworkBackBufferFinal8[m_NetworkFrameReady][2 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][2 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][2 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
1071
+ }
1072
+ if (g_UInputMan.KeyHeld (KEY_4)) {
1073
+ stretch_blit (m_NetworkBackBufferFinal8[m_NetworkFrameReady][3 ], m_BackBuffer8, 0 , 0 , m_NetworkBackBufferFinal8[m_NetworkFrameReady][3 ]->w , m_NetworkBackBufferFinal8[m_NetworkFrameReady][3 ]->h , 0 , 0 , m_BackBuffer8->w , m_BackBuffer8->h );
1074
+ }
1075
+ #endif
1076
+ // Rendering complete, we can finally mark current frame as ready. This is needed to make rendering look totally atomic for the server pulling data in separate threads.
1077
+ m_NetworkFrameReady = m_NetworkFrameCurrent;
1078
+ m_NetworkFrameCurrent = (m_NetworkFrameCurrent == 0 ) ? 1 : 0 ;
1079
+ }
1097
1080
}
0 commit comments