Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

unit app_particle_main;

interface

uses sux_constant, sux_object, app_constant, resource_texture,
     resource_list, app_particle_part, app_particle_vertexbuffer;

type
  TSettings=record
    typus: SXState;
    pos: SXVertex2D;
    texture: SRTexture;
    size: SXFloat;
    blendingmode: SXState;
  end;
  SAParticle=class(SUXObject)
    settings: TSettings;
    parts: SRList;

    procedure onRender;

    function addParticle(const typus: SXState; const pos: SXVertex2D; const rot, size: SXFloat): SAPPart;
    function getParticle(const index: SXInt): SAPPart;
    procedure deleteParticle(const part: SAPPart);
    procedure deleteAllParticles;

    procedure setupAppearance(const texture: SRTexture; const size: SXFloat);
    procedure setBlending(const blendingmode: SXState);
    procedure setPosition(const pos: SXVertex2D);
    function getPos: SXVertex2D;
    function getTexture: SRTexture;
    function getSize: SXFloat;

    procedure deleteIfEmpty;

    procedure onTimerParts;
    procedure onTimer; virtual;

    procedure delete;
    procedure initialize; virtual;
    constructor Create(const parent: TObject);
    destructor Destroy; override;
  end;

implementation

uses main, gl_main, OpenGL;


// --- SAParticle


procedure SAParticle.onRender;
var p: SXInt;
    vertexbuffer: SAPVertexBuffer;
begin
  // Default rendering method
  glPushMatrix;

  gl.material.resetMaterial;
  gl.material.setMaterial2D;
  gl.material.setMaterialTexture(settings.texture);
  gl.material.setMaterialBlending(settings.blendingmode,sx.convert.ColorRGBOf(1,1,1), 1);
  gl.material.setMaterialShader(app.scene.scene.particle, nil);
  gl.material.renderMaterial;

  glTranslatef(settings.pos.x,settings.pos.y,0);
  glScalef(settings.size,settings.size,1);

  // Render parts
  glPushMatrix;

  vertexbuffer := SAPVertexBuffer.Create;
  vertexbuffer.setVertexCount((parts.getMax + 1) * 4);

  for p := 0 to parts.getMax do
  begin
    SAPPart(parts.getObject(p)).onRender(vertexbuffer, p);
  end;

  vertexbuffer.onRender;
  vertexbuffer.Free;

  glPopMatrix;

  glPopMatrix;
end;




function SAParticle.addParticle(const typus: SXState; const pos: SXVertex2D; const rot, size: SXFloat): SAPPart;
var part: SAPPart;
begin
  part := SAPPart.Create(self);
  part.setTypus(typus);
  part.setPosition(pos);
  part.setRotation(rot);
  part.setSize(size);
  parts.addObject(part);
  result := part;
end;


function SAParticle.getParticle(const index: SXInt): SAPPart;
begin
  result := SAPPart(parts.getObject(index));
end;


procedure SAParticle.deleteParticle(const part: SAPPart);
begin
  parts.deleteObject(part);
end;


procedure SAParticle.deleteAllParticles;
begin
  parts.deleteAllObjects;
end;




procedure SAParticle.setupAppearance(const texture: SRTexture; const size: SXFloat);
begin
  settings.texture := texture;
  settings.size := size;
end;


procedure SAParticle.setBlending(const blendingmode: SXState);
begin
  settings.blendingmode := blendingmode;
end;


procedure SAParticle.setPosition(const pos:SXVertex2D);
begin
  settings.pos := pos;
end;


function SAParticle.getPos: SXVertex2D;
begin
  result := settings.pos;
end;


function SAParticle.getTexture: SRTexture;
begin
  result := settings.texture;
end;


function SAParticle.getSize: SXFloat;
begin
  result := settings.size;
end;




procedure SAParticle.deleteIfEmpty;
begin
  if (parts.getMax < 0) then delete;
end;




procedure SAParticle.onTimerParts;
var p: SXInt;
begin
  for p := parts.getMax downto 0 do
  begin
    SAPPart(parts.getObject(p)).onTimer;
  end;
end;


procedure SAParticle.onTimer;
begin
  // Virtual base method.
end;




procedure SAParticle.delete;
begin
  app.game.deleteParticleSystem(self);
end;


procedure SAParticle.initialize;
begin
end;


constructor SAParticle.Create(const parent: TObject);
begin
  inherited Create(parent, 'Particle');

  setupAppearance(nil,1);
  setBlending(SX_GL_BLEND_ADDITIVE);
  setPosition(sx.convert.Vertex2DOf(0,0));

  parts := SRList.Create(self, false, true, true);
end;


destructor SAParticle.Destroy;
begin
  parts.Free;

  inherited;
end;


end.