Blame |
Last modification |
View Log
| RSS feed
unit app_glscene_main;
interface
uses OpenGL, GLaux, glExt, sux_constant, sux_object, app_constant,
gl_scene_generic, gl_rendertotexture, resource_texture, resource_shader,
app_glscene_blur, app_glscene_glow, app_glscene_board,
gl_stencilbuffer, app_glscene_flash, gl_vsync, gl_gammacorrection,
app_glscene_menu, app_glscene_helpscreen, app_glscene_highscore,
app_glscene_postprocess;
type
TScene=record
framebuffer:SRTexture;
particle: SRShader;
end;
SAGLScene=class(GLScene)
scene: TScene;
r2t: GLRenderToTexture;
stencilbuffer: GLStencilBuffer;
blur: SAGLSBlur;
glow: SAGLSGlow;
board: SAGLSBoard;
flash: SAGLSFlash;
vsync: GLVSync;
gamma: GLGammaCorrection;
menu: SAGLSMenu;
helpscreen: SAGLSHelpScreen;
highscore: SAGLSHighScore;
postprocess: SAGLSPostProcess;
procedure renderOutlineText(const x, y: SXFloat; const align: SXState; const size: SXFloat; const text: SXStringL);
procedure grabFrameBufferTexture;
function getFrameBufferTextureSize: SXVertex2D;
procedure renderFrameBufferQuadOverScreen;
procedure renderPressButtonToEnterGame(const x, y: SXFloat; const align: SXState; const text: SXStringL);
procedure renderScore;
procedure renderPause;
procedure renderPink;
procedure onTimer; override;
procedure initialize; override;
constructor Create(parent:TObject;name:SXStringS);
destructor Destroy; override;
end;
implementation
uses sux_main, gl_main, main;
// --- SAGLScene
procedure SAGLScene.renderOutlineText(const x, y: SXFloat; const align: SXState; const size: SXFloat; const text: SXStringL);
var color: SXColorRGB;
offsetx, offsety: SXInt;
begin
color := sx.math.random.getRandomColorInterpolation(
sx.convert.ColorRGBOf(0.4, 0.4, 0.4),
sx.convert.ColorRGBOf(1.0, 1.0, 1.0));
gl.gl2D.font.getFont('Default').setFontStyle(SX_GLFONT_STYLE_ADDITIVE);
for offsetx := -3 to 3 do
for offsety := -1 to 1 do
begin
gl.gl2D.renderText('Default', x + offsetx * 2.9, y + offsety * 2.9, align, color, 0.07, size, text);
end;
gl.gl2D.renderText('Default', x, y, align, sx.convert.ColorRGBOf(1, 1, 1), 1, size, text);
gl.gl2D.font.getFont('Default').setFontStyle(SX_GLFONT_STYLE_AVERAGE);
end;
procedure SAGLScene.grabFrameBufferTexture;
begin
r2t.grabScreenToTexture(scene.framebuffer);
end;
function SAGLScene.getFrameBufferTextureSize: SXVertex2D;
begin
result.x := gl.getCurrentRenderingContext.screen.width/scene.framebuffer.texture.width;
result.y := gl.getCurrentRenderingContext.screen.height/scene.framebuffer.texture.height;
end;
procedure SAGLScene.renderFrameBufferQuadOverScreen;
var size: SXVertex2D;
begin
size := getFrameBufferTextureSize;
glBegin(GL_QUADS);
glTexCoord2f(0,0); gl.texture.setTexCoord(1, 0, 0); glVertex2f(0,480);
glTexCoord2f(size.x,0); gl.texture.setTexCoord(1, 1, 0); glVertex2f(640,480);
glTexCoord2f(size.x,size.y); gl.texture.setTexCoord(1, 1, 1); glVertex2f(640,0);
glTexCoord2f(0, size.y); gl.texture.setTexCoord(1, 0, 1); glVertex2f(0,0);
glEnd;
end;
procedure SAGLScene.renderPressButtonToEnterGame(const x, y: SXFloat; const align: SXState; const text: SXStringL);
begin
gl.gl2D.renderText('Default', x, y, align, sx.convert.ColorRGBOf(0.6, 0.6, 0.6),
1, 1.2, text);
end;
procedure SAGLScene.renderScore;
var height:SXInt;
timer: SXFloat;
begin
height:=30;
timer := sx.timer.getWorldTimer;
if (frac(timer) < 0.5) or (app.game.getPlayer1.isHumanPlayer) then
begin
gl.gl2D.renderText('Default', 270, height, SX_GLFONT_ALIGN_RIGHT,
sx.convert.ColorRGBOf(1,1,1), 1, 1.3, app.game.getPlayer1.settings.name);
end else renderPressButtonToEnterGame(270, height, SX_GLFONT_ALIGN_RIGHT,
app.ini.settings.player1.texttoentergame);
gl.gl2D.renderText('Default', 315, height, SX_GLFONT_ALIGN_RIGHT,
sx.convert.ColorRGBOf(1,1,1), 1, 1.6, sx.convert.intToStr(app.game.getPlayer1.settings.score));
gl.gl2D.renderText('Default', 320, height, SX_GLFONT_ALIGN_CENTER,
sx.convert.ColorRGBOf(1,1,1), 1, 1.6, ':');
gl.gl2D.renderText('Default', 325, height, SX_GLFONT_ALIGN_LEFT,
sx.convert.ColorRGBOf(1,1,1), 1, 1.6, sx.convert.intToStr(app.game.getPlayer2.settings.score));
if (frac(timer) < 0.5) or (app.game.getPlayer2.isHumanPlayer) then
begin
gl.gl2D.renderText('Default', 370, height, SX_GLFONT_ALIGN_LEFT,
sx.convert.ColorRGBOf(1,1,1), 1, 1.3, app.game.getPlayer2.settings.name);
end else renderPressButtonToEnterGame(370, height, SX_GLFONT_ALIGN_LEFT,
app.ini.settings.player1.texttoentergame);
end;
procedure SAGLScene.renderPause;
begin
gl.gl2D.renderText('Default', 320, 240, SX_GLFONT_ALIGN_CENTER,
sx.convert.ColorRGBOf(1,1,1), 1, 3, 'Game Paused');
end;
procedure SAGLScene.renderPink;
begin
gl.gl2D.screen.renderColoredScreen(app.ini.settings.pingk.color,1);
end;
procedure SAGLScene.onTimer;
begin
gl.gl2D.set2DMode;
case app.game.settings.state.state of
SX_GAME_STATE_PLAY : begin
board.onTimer;
renderScore;
if (app.game.settings.state.paused) then renderPause;
end;
SX_GAME_STATE_WAITFORBALL : begin
board.onTimer;
renderScore;
if (app.game.settings.state.paused) then renderPause;
end;
SX_GAME_STATE_MENU : begin
menu.onTimer;
end;
SX_GAME_STATE_HELPSCREEN,
SX_GAME_STATE_HINTSCREEN : begin
helpscreen.onTimer;
end;
SX_GAME_STATE_VIEWHIGHSCORE:begin
highscore.onTimerView;
end;
SX_GAME_STATE_ENTERHIGHSCORE:begin
highscore.onTimerEnter;
end;
end;
{grabFrameBufferTexture;
gl.material.resetMaterial;
gl.material.setMaterial2D;
gl.material.setMaterialTexture(scene.framebuffer);
gl.material.setMaterialColor(sx.convert.ColorRGBOf(1,0,1));
gl.material.renderMaterial;
renderFrameBufferQuadOverScreen;}
flash.onTimer;
renderPink;
blur.onTimer;
glow.onTimer;
gl.gl2D.setPerspectiveMode;
end;
procedure SAGLScene.initialize;
begin
inherited;
gl.gl2D.font.addFont('textures\fonts\emulator','Default');
r2t.generateScreenGrabTexture(scene.framebuffer);
stencilbuffer.initialize;
vsync.initialize(app.ini.settings.display.vsync);
gamma.initialize(app.ini.settings.display.gamma);
blur.initialize;
glow.initialize;
board.initialize;
flash.initialize;
menu.initialize;
helpscreen.initialize;
highscore.initialize;
postprocess.initialize;
scene.particle := SRShader.Create('shaders\particle', self);
end;
constructor SAGLScene.Create(parent:TObject;name:SXStringS);
begin
inherited Create(parent,name);
r2t := GLRenderToTexture.Create(self);
stencilbuffer := GLStencilBuffer.Create(self);
vsync := GLVSync.Create(self);
gamma := GLGammaCorrection.Create(self);
blur := SAGLSBlur.Create(self);
glow := SAGLSGlow.Create(self);
board := SAGLSBoard.Create(self);
flash := SAGLSFlash.Create(self);
menu := SAGLSMenu.Create(self);
helpscreen := SAGLSHelpScreen.Create(self);
highscore := SAGLSHighScore.Create(self);
postprocess := SAGLSPostProcess.Create(self);
end;
destructor SAGLScene.Destroy;
begin
scene.particle.Free;
scene.framebuffer.Free;
blur.Free;
glow.Free;
board.Free;
flash.Free;
menu.Free;
helpscreen.Free;
highscore.Free;
r2t.Free;
stencilbuffer.Free;
vsync.Free;
gamma.Free;
postprocess.Free;
inherited;
end;
end.