Blame |
Last modification |
View Log
| RSS feed
unit app_glscene_postprocess;
interface
uses OpenGL, GLaux, glExt, sux_constant, sux_object, app_constant,
resource_texture, resource_shader;
type
TSettings=record
pixel: SRShader;
slowmotion: SRShader;
flower: SRShader;
end;
SAGLSPostProcess=class(SUXObject)
settings:TSettings;
procedure grabFrameBufferTexture;
function getFrameBufferTexture: SRTexture;
procedure renderFrameBufferTextureQuadOnScreen;
procedure onTimerPixel;
procedure onTimerSlowMotion;
procedure onTimerFlower;
procedure onTimer;
procedure initialize;
constructor Create(parent:TObject);
destructor Destroy; override;
end;
implementation
uses sux_main, gl_main, main;
// --- SAGLSPostProcess
procedure SAGLSPostProcess.grabFrameBufferTexture;
begin
app.scene.grabFrameBufferTexture;
end;
function SAGLSPostProcess.getFrameBufferTexture: SRTexture;
begin
result := app.scene.scene.framebuffer;
end;
procedure SAGLSPostProcess.renderFrameBufferTextureQuadOnScreen;
begin
app.scene.renderFrameBufferQuadOverScreen;
end;
procedure SAGLSPostProcess.onTimerPixel;
begin
if (app.game.settings.effects.pixel <= 0) then exit;
grabFrameBufferTexture;
gl.material.resetMaterial;
gl.material.setMaterial2D;
gl.material.setMaterialShader(nil, settings.pixel);
gl.material.setMaterialBlending(SX_GL_BLEND_AVERAGE, sx.convert.ColorRGBOf(1,1,1), 1);
gl.material.setMaterialTexture(getFrameBufferTexture);
gl.material.renderMaterial;
settings.pixel.setFragmentEnvParameter(0, sx.convert.Vertex3DOf(app.game.settings.effects.pixel, 0, 0));
settings.pixel.setFragmentEnvParameter(1, sx.convert.Vertex3DOf(100, 0.01, 0));
renderFrameBufferTextureQuadOnScreen;
end;
procedure SAGLSPostProcess.onTimerSlowMotion;
begin
if (app.game.settings.effects.slowmotion <= 0) then exit;
grabFrameBufferTexture;
gl.material.resetMaterial;
gl.material.setMaterial2D;
gl.material.setMaterialShader(nil, settings.slowmotion);
gl.material.setMaterialBlending(SX_GL_BLEND_AVERAGE, sx.convert.ColorRGBOf(1,1,1), 1);
gl.material.setMaterialTexture(getFrameBufferTexture);
gl.material.renderMaterial;
settings.slowmotion.setFragmentEnvParameter(0, sx.convert.Vertex3DOf(app.game.settings.effects.slowmotion, 0, 0));
settings.slowmotion.setFragmentEnvParameter(1, sx.convert.Vertex3DOf(0, 0.003, 0));
settings.slowmotion.setFragmentEnvParameter(2, sx.convert.Vertex3DOf(0, -0.003, 0));
renderFrameBufferTextureQuadOnScreen;
end;
procedure SAGLSPostProcess.onTimerFlower;
var offset: SXVertex2D;
begin
if (app.game.settings.effects.flowers <= 0) then exit;
offset.x := app.game.getGameTimer * 0.08;
offset.y := app.game.getGameTimer * 0.1;
grabFrameBufferTexture;
gl.material.resetMaterial;
gl.material.setMaterial2D;
gl.material.setMaterialShader(nil, settings.flower);
gl.material.setMaterialBlending(SX_GL_BLEND_AVERAGE, sx.convert.ColorRGBOf(1,1,1), 1);
gl.material.setMaterialTexture(getFrameBufferTexture);
gl.material.renderMaterial;
gl.texture.setTextureToTexelUnit(app.scene.board.settings.flowerpower, 1);
settings.flower.setFragmentEnvParameter(0, sx.convert.Vertex3DOf(app.game.settings.effects.flowers, 0, 0));
settings.flower.setFragmentEnvParameter(1, sx.convert.Vertex3DOf(offset.x, offset.y, 0), 0);
settings.flower.setFragmentEnvParameter(2, sx.convert.Vertex3DOf(0.08, 0.04, 0));
renderFrameBufferTextureQuadOnScreen;
end;
procedure SAGLSPostProcess.onTimer;
begin
onTimerPixel;
onTimerSlowMotion;
onTimerFlower;
end;
procedure SAGLSPostProcess.initialize;
begin
settings.pixel := SRShader.Create('shaders\pixel', self);
settings.slowmotion := SRShader.Create('shaders\slowmotion', self);
settings.flower := SRShader.Create('shaders\flowers', self);
end;
constructor SAGLSPostProcess.Create(parent:TObject);
begin
inherited Create(parent,'GL Post Process');
end;
destructor SAGLSPostProcess.Destroy;
begin
settings.pixel.Free;
settings.slowmotion.Free;
settings.flower.Free;
inherited;
end;
end.