Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
35 chris 1
unit app_particle_main;
2
 
3
interface
4
 
5
uses sux_constant, sux_object, app_constant, resource_texture,
6
     resource_list, app_particle_part, app_particle_vertexbuffer;
7
 
8
type
9
  TSettings=record
10
    typus: SXState;
11
    pos: SXVertex2D;
12
    texture: SRTexture;
13
    size: SXFloat;
14
    blendingmode: SXState;
15
  end;
16
  SAParticle=class(SUXObject)
17
    settings: TSettings;
18
    parts: SRList;
19
 
20
    procedure onRender;
21
 
22
    function addParticle(const typus: SXState; const pos: SXVertex2D; const rot, size: SXFloat): SAPPart;
23
    function getParticle(const index: SXInt): SAPPart;
24
    procedure deleteParticle(const part: SAPPart);
25
    procedure deleteAllParticles;
26
 
27
    procedure setupAppearance(const texture: SRTexture; const size: SXFloat);
28
    procedure setBlending(const blendingmode: SXState);
29
    procedure setPosition(const pos: SXVertex2D);
30
    function getPos: SXVertex2D;
31
    function getTexture: SRTexture;
32
    function getSize: SXFloat;
33
 
34
    procedure deleteIfEmpty;
35
 
36
    procedure onTimerParts;
37
    procedure onTimer; virtual;
38
 
39
    procedure delete;
40
    procedure initialize; virtual;
41
    constructor Create(const parent: TObject);
42
    destructor Destroy; override;
43
  end;
44
 
45
implementation
46
 
47
uses main, gl_main, OpenGL;
48
 
49
 
50
// --- SAParticle
51
 
52
 
53
procedure SAParticle.onRender;
54
var p: SXInt;
55
    vertexbuffer: SAPVertexBuffer;
56
begin
57
  // Default rendering method
58
  glPushMatrix;
59
 
60
  gl.material.resetMaterial;
61
  gl.material.setMaterial2D;
62
  gl.material.setMaterialTexture(settings.texture);
63
  gl.material.setMaterialBlending(settings.blendingmode,sx.convert.ColorRGBOf(1,1,1), 1);
64
  gl.material.setMaterialShader(app.scene.scene.particle, nil);
65
  gl.material.renderMaterial;
66
 
67
  glTranslatef(settings.pos.x,settings.pos.y,0);
68
  glScalef(settings.size,settings.size,1);
69
 
70
  // Render parts
71
  glPushMatrix;
72
 
73
  vertexbuffer := SAPVertexBuffer.Create;
74
  vertexbuffer.setVertexCount((parts.getMax + 1) * 4);
75
 
76
  for p := 0 to parts.getMax do
77
  begin
78
    SAPPart(parts.getObject(p)).onRender(vertexbuffer, p);
79
  end;
80
 
81
  vertexbuffer.onRender;
82
  vertexbuffer.Free;
83
 
84
  glPopMatrix;
85
 
86
  glPopMatrix;
87
end;
88
 
89
 
90
 
91
 
92
function SAParticle.addParticle(const typus: SXState; const pos: SXVertex2D; const rot, size: SXFloat): SAPPart;
93
var part: SAPPart;
94
begin
95
  part := SAPPart.Create(self);
96
  part.setTypus(typus);
97
  part.setPosition(pos);
98
  part.setRotation(rot);
99
  part.setSize(size);
100
  parts.addObject(part);
101
  result := part;
102
end;
103
 
104
 
105
function SAParticle.getParticle(const index: SXInt): SAPPart;
106
begin
107
  result := SAPPart(parts.getObject(index));
108
end;
109
 
110
 
111
procedure SAParticle.deleteParticle(const part: SAPPart);
112
begin
113
  parts.deleteObject(part);
114
end;
115
 
116
 
117
procedure SAParticle.deleteAllParticles;
118
begin
119
  parts.deleteAllObjects;
120
end;
121
 
122
 
123
 
124
 
125
procedure SAParticle.setupAppearance(const texture: SRTexture; const size: SXFloat);
126
begin
127
  settings.texture := texture;
128
  settings.size := size;
129
end;
130
 
131
 
132
procedure SAParticle.setBlending(const blendingmode: SXState);
133
begin
134
  settings.blendingmode := blendingmode;
135
end;
136
 
137
 
138
procedure SAParticle.setPosition(const pos:SXVertex2D);
139
begin
140
  settings.pos := pos;
141
end;
142
 
143
 
144
function SAParticle.getPos: SXVertex2D;
145
begin
146
  result := settings.pos;
147
end;
148
 
149
 
150
function SAParticle.getTexture: SRTexture;
151
begin
152
  result := settings.texture;
153
end;
154
 
155
 
156
function SAParticle.getSize: SXFloat;
157
begin
158
  result := settings.size;
159
end;
160
 
161
 
162
 
163
 
164
procedure SAParticle.deleteIfEmpty;
165
begin
166
  if (parts.getMax < 0) then delete;
167
end;
168
 
169
 
170
 
171
 
172
procedure SAParticle.onTimerParts;
173
var p: SXInt;
174
begin
175
  for p := parts.getMax downto 0 do
176
  begin
177
    SAPPart(parts.getObject(p)).onTimer;
178
  end;
179
end;
180
 
181
 
182
procedure SAParticle.onTimer;
183
begin
184
  // Virtual base method.
185
end;
186
 
187
 
188
 
189
 
190
procedure SAParticle.delete;
191
begin
192
  app.game.deleteParticleSystem(self);
193
end;
194
 
195
 
196
procedure SAParticle.initialize;
197
begin
198
end;
199
 
200
 
201
constructor SAParticle.Create(const parent: TObject);
202
begin
203
  inherited Create(parent, 'Particle');
204
 
205
  setupAppearance(nil,1);
206
  setBlending(SX_GL_BLEND_ADDITIVE);
207
  setPosition(sx.convert.Vertex2DOf(0,0));
208
 
209
  parts := SRList.Create(self, false, true, true);
210
end;
211
 
212
 
213
destructor SAParticle.Destroy;
214
begin
215
  parts.Free;
216
 
217
  inherited;
218
end;
219
 
220
 
221
end.