aboutsummaryrefslogtreecommitdiffstats
path: root/Game/Code/Menu/UDisplay.pas
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Game/Code/Menu/UDisplay.pas289
1 files changed, 289 insertions, 0 deletions
diff --git a/Game/Code/Menu/UDisplay.pas b/Game/Code/Menu/UDisplay.pas
new file mode 100644
index 00000000..6d0443cc
--- /dev/null
+++ b/Game/Code/Menu/UDisplay.pas
@@ -0,0 +1,289 @@
+unit UDisplay;
+
+interface
+
+uses Windows, SDL, UMenu, OpenGL12, SysUtils;
+
+type
+ TDisplay = class
+ ActualScreen: PMenu;
+ NextScreen: PMenu;
+
+ h_DC: HDC;
+ h_RC: HGLRC;
+
+// FadeType: integer;
+ FadeTex: glUInt;
+ LastFade: real;
+ Fade: real;
+ function Draw: Boolean;
+ procedure PrintScreen;
+ constructor Create;
+ procedure ScreenShot;
+ end;
+
+var
+ Display: TDisplay;
+// ActualScreen: PMenu;
+// NextScreen: PMenu;
+
+implementation
+
+uses UGraphic, UTime, Graphics, Jpeg, UPliki, UTexture;
+
+constructor TDisplay.Create;
+begin
+ inherited Create;
+// FadeType := 0;
+ Fade := 0;
+end;
+
+function TDisplay.Draw: Boolean;
+var
+ S: integer;
+ Col: real;
+ Surface: PSDL_Surface;
+begin
+ Result := True;
+
+ Col := 1;
+ if (ParamStr(1) = '-black') or (ParamStr(1) = '-fsblack') then
+ Col := 0;
+
+ glClearColor(Col, Col, Col , 1);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+
+ for S := 1 to Screens do begin
+ ScreenAct := S;
+
+// if Screens = 1 then ScreenX := 0;
+// if (Screens = 2) and (S = 1) then ScreenX := -1;
+// if (Screens = 2) and (S = 2) then ScreenX := 1;
+ ScreenX := 0;
+
+
+ if S = 2 then TimeSkip := 0; // it's easier than rewriting code
+ glViewPort((S-1) * ScreenW div Screens, 0, ScreenW div Screens, ScreenH);
+
+ ActualScreen.SetAnimationProgress(1);
+ if not assigned (NextScreen) then Result := ActualScreen.Draw
+ else begin
+ LastFade := Fade;
+ Fade := Fade + TimeSkip * 6; // * 4
+
+ {//Create Fading texture
+ if Fade = 0 then
+ begin
+ Surface := SDL_GetVideoSurface;
+ glGenTextures(1, FadeTex);
+
+ glBindTexture(GL_TEXTURE_2D, FadeTex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, Surface.pitch div Surface.format.BytesPerPixel);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, 800, 600, 0, GL_RGBA, GL_UNSIGNED_BYTE, Surface.pixels);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ end;}
+
+ ActualScreen.ShowFinish := false;
+
+ //Fade = 2 (Belnding) Mod
+ if (FadeTex > 0) then
+ begin
+ ActualScreen.SetAnimationProgress(Fade-1);
+ ActualScreen.Draw;
+ glBindTexture(GL_TEXTURE_2D, FadeTex);
+ glColor4f(Col, Col, Col, 1-Fade); // 0
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ glVertex2f(0, 0);
+ glVertex2f(0, 600);
+ glVertex2f(800, 600);
+ glVertex2f(800, 0);
+ glEnd;
+ glDisable(GL_BLEND);
+ end
+ else
+ begin
+ case ActualScreen.Fade of
+ 0: begin
+ if Fade < 1 then begin
+ ActualScreen.SetAnimationProgress(1-Fade);
+ ActualScreen.Draw;
+ glColor4f(Col, Col, Col, Fade); // 0
+ end else begin
+ ActualScreen.SetAnimationProgress(Fade-1);
+ ActualScreen.Draw;
+ glColor4f(Col, Col, Col, 1-Fade); // 0
+ end;
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ glVertex2f(0, 0);
+ glVertex2f(0, 600);
+ glVertex2f(800, 600);
+ glVertex2f(800, 0);
+ glEnd;
+ glDisable(GL_BLEND);
+ end;
+ 2: begin
+ if Fade < 1 then begin
+ ActualScreen.SetAnimationProgress(1-Fade);
+ ActualScreen.Draw;
+ //glColor4f(Col, Col, Col, Fade); // 0
+ glColor4f(1, 1, 1, 1); // 0
+ //Fade := 1
+ end;
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ glVertex2f(0, 0);
+ glVertex2f(0, 600);
+ glVertex2f(800, 600);
+ glVertex2f(800, 0);
+ glEnd;
+ glDisable(GL_BLEND);
+ end;
+ end; // case
+ end;
+
+ if (LastFade < 1 ) and (Fade >= 1) then begin
+ if (ActualScreen.Fade = 2) then
+ begin
+ ScreenShot;
+ //Create Fading Texture
+ Surface := SDL_GetVideoSurface;
+ glGenTextures(1, FadeTex);
+
+ glBindTexture(GL_TEXTURE_2D, FadeTex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, Surface.pitch div Surface.format.BytesPerPixel);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, 800, 600, 0, GL_RGBA, GL_UNSIGNED_BYTE, Surface.pixels);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ end;
+
+ // pokazuje 2 ekran, ale nie kasuje informacji o NextScreen
+ ActualScreen.onHide;
+ ActualScreen := NextScreen;
+ ActualScreen.onShow;
+ end;
+
+ if Fade >= 2 then begin
+ if (FadeTex > 0) then //Delete Fade Tex
+ begin
+ glDeleteTextures(1, @FadeTex);
+ FadeTex := 0;
+ end;
+
+ // koniec fade'a
+ ActualScreen := NextScreen;
+ NextScreen := nil;
+ ActualScreen.onShowFinish;
+ ActualScreen.ShowFinish := true;
+ end;
+ end; // if
+ end; // for
+// SwapBuffers(h_DC);
+end;
+
+{function TDisplay.Fade(FadeIn : Boolean; Steps : UInt8): UInt8;
+begin
+ Self.FadeIn := FadeIn;
+ FadeStep := (SizeOf(FadeStep) * $FF) div Steps;
+ ActualStep := $FF;
+ Result := $FF div FadeStep;
+end;}
+
+procedure TDisplay.PrintScreen;
+var
+ Bitmap: TBitmap;
+ Jpeg: TJpegImage;
+ X, Y: integer;
+ Num: integer;
+ FileName: string;
+begin
+ for Num := 1 to 9999 do begin
+ FileName := IntToStr(Num);
+ while Length(FileName) < 4 do FileName := '0' + FileName;
+ FileName := ScreenshotsPath + 'screenshot' + FileName + '.jpg';
+ if not FileExists(FileName) then break
+ end;
+
+ glReadPixels(0, 0, ScreenW, ScreenH, GL_RGBA, GL_UNSIGNED_BYTE, @PrintScreenData[0]);
+ Bitmap := TBitmap.Create;
+ Bitmap.Width := ScreenW;
+ Bitmap.Height := ScreenH;
+
+ for Y := 0 to ScreenH-1 do
+ for X := 0 to ScreenW-1 do
+ Bitmap.Canvas.Pixels[X, Y] := PrintScreenData[(ScreenH-1-Y) * ScreenW + X] and $00FFFFFF;
+
+ Jpeg := TJpegImage.Create;
+ Jpeg.Assign(Bitmap);
+ Bitmap.Free;
+ Jpeg.CompressionQuality := 95;//90;
+ ForceDirectories(ScreenshotsPath);
+ Jpeg.SaveToFile(FileName);
+ Jpeg.Free;
+end;
+
+procedure TDisplay.ScreenShot;
+ var F : file;
+ FileInfo: BITMAPINFOHEADER;
+ FileHeader : BITMAPFILEHEADER;
+ pPicData:Pointer;
+ FileName: String;
+ Num: Integer;
+begin
+ //bilddatei Suchen
+ for Num := 1 to 9999 do begin
+ FileName := IntToStr(Num);
+ while Length(FileName) < 4 do FileName := '0' + FileName;
+ FileName := {ScreenshotsPath + }'screenshot' + FileName + '.BMP';
+ if not FileExists(FileName) then break
+ end;
+
+ //Speicher für die Speicherung der Header-Informationen vorbereiten
+ ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));
+ ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));
+
+ //Initialisieren der Daten des Headers
+ FileHeader.bfType := 19778; //$4D42 = 'BM'
+ FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);
+
+ //Schreiben der Bitmap-Informationen
+ FileInfo.biSize := SizeOf(BITMAPINFOHEADER);
+ FileInfo.biWidth := ScreenH;
+ FileInfo.biHeight := ScreenW;
+ FileInfo.biPlanes := 1;
+ FileInfo.biBitCount := 32;
+ FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div 8);
+
+ //Größenangabe auch in den Header übernehmen
+ FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;
+
+ //Speicher für die Bilddaten reservieren
+ GetMem(pPicData, FileInfo.biSizeImage);
+ try
+ //Bilddaten von OpenGL anfordern (siehe oben)
+ glReadPixels(0, 0, ScreenW, ScreenH, GL_BGRA, GL_UNSIGNED_BYTE, pPicData);
+
+ //Und den ganzen Müll in die Datei schieben ;-)
+ //Moderne Leute nehmen dafür auch Streams ...
+ AssignFile(f, Filename);
+ Rewrite( f,1 );
+ try
+ BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));
+ BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));
+ BlockWrite(F, pPicData^, FileInfo.biSizeImage );
+ finally
+ CloseFile(f);
+ end;
+ finally
+ //Und den angeforderten Speicher wieder freigeben ...
+ FreeMem(pPicData, FileInfo.biSizeImage);
+ end;
+end;
+
+
+end.