Subversion Repositories AndroidProjects

Rev

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.