From 808007e7eef95427292f9aa2bb63541ddef020ec Mon Sep 17 00:00:00 2001
From: mogguh <mogguh@b956fd51-792f-4845-bead-9b4dfca2ff2c>
Date: Mon, 5 May 2008 13:02:28 +0000
Subject: Added text reflection as new property in the theme

git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@1060 b956fd51-792f-4845-bead-9b4dfca2ff2c
---
 Game/Code/Classes/TextGL.pas  | 70 ++++++++++++++++++++++++++++++++++++++-----
 Game/Code/Classes/UThemes.pas | 12 +++++++-
 2 files changed, 74 insertions(+), 8 deletions(-)

(limited to 'Game/Code/Classes')

diff --git a/Game/Code/Classes/TextGL.pas b/Game/Code/Classes/TextGL.pas
index 5b114669..e00388a4 100644
--- a/Game/Code/Classes/TextGL.pas
+++ b/Game/Code/Classes/TextGL.pas
@@ -33,7 +33,7 @@ procedure SetFontSize(Size: real);
 procedure SetFontStyle(Style: integer); // sets active font style (normal, bold, etc)
 procedure SetFontItalic(Enable: boolean); // sets italic type letter (works for all fonts)
 procedure SetFontAspectW(Aspect: real);
-
+procedure SetFontReflection(Enable:boolean;Spacing: real); // Enables/Disables text reflection
 // Start of SDL_ttf
 function NextPowerOfTwo(Value: Integer): Integer;
 //Checks if the ttf exists, if yes then a SDL_ttf is returned
@@ -63,6 +63,8 @@ type
     Done:     real;
     Outline:  real;
     Italic:   boolean;
+    Reflection: boolean;
+    ReflectionSpacing: real;
   end;
 
 
@@ -74,6 +76,9 @@ var
   PColG:      real;
   PColB:      real;
 
+  // Colours for the reflection
+  TempColor:    Array[0..3] of GLfloat;
+  PTempColor:   PGLfloat;
 implementation
 
 uses
@@ -208,24 +213,27 @@ procedure glPrintLetter(Letter: char);
 var
   TexX, TexY:   real;
   TexR, TexB:   real;
+  TestHeight: real;
   FWidth:       real;
   PL, PT:       real;
   PR, PB:       real;
   XItal:        real; // X shift for italic type letter
+  ReflectionSpacing:real; // Distance of the reflection
 begin
   with Fonts[ActFont].Tex do
   begin
     FWidth := Fonts[ActFont].Width[Ord(Letter)];
 
     W := FWidth * (H/30) * Fonts[ActFont].AspectW;
-  //  H := 30;
 
     // set texture positions
     TexX := (ord(Letter) mod 16) * 1/16 + 1/32 - FWidth/1024 - Fonts[ActFont].Outline/1024;
-    TexY := (ord(Letter) div 16) * 1/16 + 2/1024; // 2/1024
+    TexY := (ord(Letter) div 16) * 1/16 + 2/1024;
     TexR := (ord(Letter) mod 16) * 1/16 + 1/32 + FWidth/1024 + Fonts[ActFont].Outline/1024;
     TexB := (1 + ord(Letter) div 16) * 1/16 - 2/1024;
 
+    TestHeight := TexB - TexY;
+
     // set vector positions
     PL := X - Fonts[ActFont].Outline * (H/30) * Fonts[ActFont].AspectW /2;
     PT := Y;
@@ -252,10 +260,47 @@ begin
       glEnd;
     end;
 
-    X := X + W;
-    glDisable(GL_BLEND);
-    glDisable(GL_TEXTURE_2D);
-  end; // with
+    // <mog> Reflection
+    // Yes it would make sense to put this in an extra procedure,
+    // but this works, doesn't take much lines, and is almost lightweight
+    if Fonts[ActFont].Reflection = true then
+      begin
+        ReflectionSpacing := Fonts[ActFont].ReflectionSpacing + H/2;
+
+        glDepthRange(0, 10);
+        glDepthFunc(GL_LEQUAL);
+        glEnable(GL_DEPTH_TEST);
+
+        glBegin(GL_QUADS);
+        try
+          glColor4f(TempColor[0], TempColor[1], TempColor[2], 0);
+          glTexCoord2f(TexX, TexY + TestHeight/2);
+          glVertex3f(PL, PB + ReflectionSpacing - H/2, z);
+
+          glColor4f(TempColor[0], TempColor[1], TempColor[2], Alpha-0.3);
+          glTexCoord2f(TexX, TexB );
+          glVertex3f(PL + XItal, PT + ReflectionSpacing, z);
+
+          glTexCoord2f(TexR, TexB );
+          glVertex3f(PR + XItal, PT + ReflectionSpacing, z);
+
+          glColor4f(TempColor[0], TempColor[1], TempColor[2], 0);
+          glTexCoord2f(TexR, TexY + TestHeight/2);
+          glVertex3f(PR, PB + ReflectionSpacing - H/2, z);
+        finally
+          glEnd;
+        end;
+          glDisable(GL_DEPTH_TEST);
+      end; // reflection
+
+      glDisable(GL_TEXTURE_2D);
+      glDisable(GL_BLEND);
+
+    X := X + W;
+  end;     // with
+
+  //write the colour back
+  glColor4fv(PTempColor);
 end;
 
 procedure glPrintLetterCut(letter: char; Start, Finish: real);
@@ -334,6 +379,11 @@ begin
   end; // while
 *)
 
+//Save the actual color and alpha (for reflection)
+  PTempColor:= @TempColor;
+//I've read that glGetFloat is quite slow, but it seems that there is no alternative
+  glGetFloatv(GL_CURRENT_COLOR, PTempColor);
+
   // This code is better, because doing a Copy of for every
   // letter in a string is a waste of CPU & Memory resources.
   // Copy operations are quite memory intensive, and this simple
@@ -536,6 +586,12 @@ begin
   Fonts[ActFont].AspectW := Aspect;
 end;
 
+procedure SetFontReflection(Enable:boolean;Spacing: real);
+begin
+  Fonts[ActFont].Reflection        := Enable;
+  Fonts[ActFont].ReflectionSpacing := Spacing;
+end;
+
 end.
 
 
diff --git a/Game/Code/Classes/UThemes.pas b/Game/Code/Classes/UThemes.pas
index dc9e2935..366e478e 100644
--- a/Game/Code/Classes/UThemes.pas
+++ b/Game/Code/Classes/UThemes.pas
@@ -46,7 +46,7 @@ type
     TexY1:  real;
     TexX2:  real;
     TexY2:  real;
-    //Reflection Mod
+    //Reflection
     Reflection:           boolean;
     Reflectionspacing:    Real;
   end;
@@ -64,6 +64,9 @@ type
     Size:   integer;
     Align:  integer;
     Text:   string;
+    //Reflection
+    Reflection:           boolean;
+    ReflectionSpacing:    Real;
   end;
   AThemeText = array of TThemeText;
 
@@ -1463,6 +1466,10 @@ begin
   ThemeText.Text  := Language.Translate(ThemeIni.ReadString(Name, 'Text', ''));
   ThemeText.Color := ThemeIni.ReadString(Name, 'Color', '');
 
+  //Reflection
+  ThemeText.Reflection         := (ThemeIni.ReadInteger(Name, 'Reflection', 0)) = 1;
+  ThemeText.Reflectionspacing  := ThemeIni.ReadFloat(Name, 'ReflectionSpacing', 15);
+
   C := ColorExists(ThemeText.Color);
   if C >= 0 then begin
     ThemeText.ColR := Color[C].RGB.R;
@@ -2125,6 +2132,9 @@ begin
 
   ThemeIni.WriteString(Name, 'Text', ThemeText.Text);
   ThemeIni.WriteString(Name, 'Color', ThemeText.Color);
+
+  ThemeIni.WriteBool(Name, 'Reflection', ThemeText.Reflection);
+  ThemeIni.WriteFloat(Name, 'ReflectionSpacing', ThemeText.ReflectionSpacing);
 end;
 
 procedure TTheme.ThemeSaveTexts(ThemeText: AThemeText; Name: string);
-- 
cgit v1.2.3