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.