Blame |
Last modification |
View Log
| RSS feed
unit app_entity_trail;
interface
uses sux_constant, sux_object, app_constant, app_entity_main,
app_game_player, resource_list, app_entity_trail_element;
type
TTrail=record
end;
SAETrail=class(SAEntity)
trail:TTrail;
elements:SRList;
procedure onRender; override;
procedure addElement(pos:SXVertex2D);
procedure onTimer; override;
procedure initialize; override;
constructor Create(parent:TObject);
destructor Destroy; override;
end;
implementation
uses main, gl_main, OpenGL;
// --- SAETrail
procedure SAETrail.onRender;
var e:SXInt;
element:SAETElement;
begin
gl.material.resetMaterial;
gl.material.setMaterial2D;
gl.material.setMaterialBlending(SX_GL_BLEND_ADDITIVE,sx.convert.ColorRGBOf(1,1,1),1);
gl.material.setMaterialTexture(app.scene.board.settings.trail);
gl.material.renderMaterial;
app.scene.stencilbuffer.enableStencilTest;
app.scene.stencilbuffer.clearStencilBuffer;
app.scene.stencilbuffer.setStencilBehavior(SX_GLSTENCIL_RENDEREACHPIXELONCE);
glBegin(GL_QUAD_STRIP);
for e:=elements.getMax downto 0 do
begin
element:=SAETElement(elements.getObject(e));
glColor4f(0.3,0.3,0.3,element.density);
glVertex2f(element.pos1.x,element.pos1.y);
glTexCoord2f(0,0);
glVertex2f(element.pos2.x,element.pos2.y);
glTexCoord2f(0,1);
end;
glEnd;
app.scene.stencilbuffer.disableStencilTest;
end;
procedure SAETrail.addElement(pos:SXVertex2D);
var element:SAETElement;
lastpos:SXVertex2D;
max:SXInt;
begin
max:=elements.getMax;
if (max<0) then lastpos:=pos else lastpos:=SAETElement(elements.getObject(max)).pos;
element:=SAETElement.Create(pos,lastpos);
elements.addObject(element);
end;
procedure SAETrail.onTimer;
var e:SXInt;
element:SAETElement;
timer:SXFloat;
begin
timer:=sx.timer.getTimer;
// Update density for all elements.
// Delete the entity if no elements are left.
for e:=elements.getMax downto 0 do
begin
element:=SAETElement(elements.getObject(e));
element.density:=element.density-timer;
if (element.density<=0) then elements.deleteObject(element);
end;
if (elements.getMax<0) then delete;
end;
procedure SAETrail.initialize;
begin
end;
constructor SAETrail.Create(parent:TObject);
begin
inherited Create(parent);
elements:=SRList.Create(self,false,true,true);
end;
destructor SAETrail.Destroy;
begin
elements.Free;
inherited;
end;
end.