From 808007e7eef95427292f9aa2bb63541ddef020ec Mon Sep 17 00:00:00 2001 From: mogguh 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 + // 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