Subversion Repositories AndroidProjects

Rev

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.