Starsector API
Loading...
Searching...
No Matches
TurbulenceEntityPlugin.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.velfield;
2
3import java.awt.Color;
4import java.util.ArrayList;
5import java.util.Iterator;
6import java.util.List;
7
8import org.lwjgl.input.Keyboard;
9import org.lwjgl.input.Mouse;
10import org.lwjgl.opengl.GL11;
11import org.lwjgl.opengl.GL14;
12import org.lwjgl.util.vector.Vector2f;
13
14import com.fs.starfarer.api.Global;
15import com.fs.starfarer.api.campaign.CampaignEngineLayers;
16import com.fs.starfarer.api.campaign.SectorEntityToken;
17import com.fs.starfarer.api.combat.ViewportAPI;
18import com.fs.starfarer.api.graphics.SpriteAPI;
19import com.fs.starfarer.api.impl.campaign.BaseCustomEntityPlugin;
20import com.fs.starfarer.api.impl.campaign.velfield.TurbulenceCalc2.TurbulenceParams;
21import com.fs.starfarer.api.util.FaderUtil;
22import com.fs.starfarer.api.util.Misc;
23
25
26 public static class PointParticle {
27 float size = 6f;
28 float mass = 0.0001f;
29 Vector2f loc = new Vector2f();
30 Vector2f vel = new Vector2f();
31 Color color;
32 float remaining;
33 float elapsed;
34 }
35
36 public static class ParticleData {
37 public SpriteAPI sprite;
38 public Vector2f offset = new Vector2f();
39 public Vector2f vel = new Vector2f();
40 public float scale = 1f;
41 public float scaleIncreaseRate = 1f;
42 public float turnDir = 1f;
43 public float angle = 1f;
44
45 public float maxDur;
46 public FaderUtil fader;
47 public float elapsed = 0f;
48 public float baseSize;
49 public float mass;
50 protected Color color;
51
52 public ParticleData(float baseSize, float mass, float durIn, float durOut, float endSizeMult, float maxAngVel, Color color, String spriteSheetKey) {
53 this.color = color;
54 if (spriteSheetKey == null) {
55 spriteSheetKey = "nebula_particles";
56 }
57 sprite = Global.getSettings().getSprite("misc", spriteSheetKey);
58 //sprite = Global.getSettings().getSprite("graphics/fx/hit_glow.png");
59 //sprite = Global.getSettings().getSprite("graphics/fx/particlealpha32sq.png");
60 //sprite = Global.getSettings().getSprite("graphics/fx/particlealpha64linear.png");
61// queueResource(Type.TEXTURE, "graphics/fx/particlealpha32sq.png", 1);
62// queueResource(Type.TEXTURE, "graphics/fx/particleline32ln.png", 1);
63 //sprite = Global.getSettings().getSprite("misc", "dust_particles");
64 float i = Misc.random.nextInt(4);
65 float j = Misc.random.nextInt(4);
66 sprite.setTexWidth(0.25f);
67 sprite.setTexHeight(0.25f);
68 sprite.setTexX(i * 0.25f);
69 sprite.setTexY(j * 0.25f);
70 sprite.setAdditiveBlend();
71
72 this.mass = mass;
73 angle = (float) Math.random() * 360f;
74
75 this.maxDur = durIn + durOut;
76 scaleIncreaseRate = endSizeMult / maxDur;
77 if (endSizeMult < 1f) {
78 scaleIncreaseRate = -1f * endSizeMult;
79 }
80 scale = 1f;
81
82 this.baseSize = baseSize;
83 turnDir = Math.signum((float) Math.random() - 0.5f) * maxAngVel * (float) Math.random();
84
85 fader = new FaderUtil(0f, durIn, durOut);
86 fader.setBounceDown(true);
87 fader.forceOut();
88 fader.fadeIn();
89 }
90
91 public void advance(float amount, VelocityField field, float fieldX, float fieldY, float fieldFacing) {
92 if (field.isInsideField(offset.x, offset.y, new Vector2f(fieldX, fieldY), fieldFacing)) {
93 Vector2f fVel = field.getVelocity(offset.x, offset.y, new Vector2f(fieldX, fieldY), fieldFacing);
94 float accelAmount = 1f / mass;
95 if (accelAmount > 1f) accelAmount = 1f;
96 accelAmount *= 60f;
97 //p.vel.set(vel);
98 Vector2f diff = Vector2f.sub(fVel, vel, new Vector2f());
99 vel.x += diff.x * accelAmount * amount;
100 vel.y += diff.y * accelAmount * amount;
101 } else {
102 fader.fadeOut();
103// if (p.elapsed > 0.5f) {
104// p.remaining = Math.min(p.remaining, 0.5f);
105// }
106 }
107
108 scale += scaleIncreaseRate * amount;
109
110 offset.x += vel.x * amount;
111 offset.y += vel.y * amount;
112
113 angle += turnDir * amount;
114
115 elapsed += amount;
116// if (maxDur - elapsed <= fader.getDurationOut() + 0.1f) {
117// fader.fadeOut();
118// }
119 fader.advance(amount);
120 }
121 }
122
123 protected List<ParticleData> particles = new ArrayList<ParticleData>();
124 protected List<ParticleData> darkParticles = new ArrayList<ParticleData>();
125
127 protected List<PointParticle> testParticles = new ArrayList<PointParticle>();
128
129 protected int frame = 0;
130 protected float distanceTravelled;
131
133 return field;
134 }
135
137 this.field = field;
138 }
139
140 public void init(SectorEntityToken entity, Object pluginParams) {
141 super.init(entity, pluginParams);
142 readResolve();
143 }
144
145 Object readResolve() {
146 return this;
147 }
148
149 public float getRenderRange() {
150 float cells = Math.max(field.field.length, field.field[0].length);
151 return cells * 1.5f * field.cellSize;
152 }
153
154 public void advance(float amount) {
155 //float days = Global.getSector().getClock().convertToDays(amount);
156
157 //field.getField()[10][10].set(0, 1000f);
158 //if (field.getField()[10][0].y == 0) {
159 if (Keyboard.isKeyDown(Keyboard.KEY_P) || true) {
160 //field.getField()[10][0].set(0, 21f * 21f * 100f);
161 //field.getField()[10][10].set(0, 100f);
162
163 for (int i = 0; i < field.getField()[0].length; i++) {
164 //field.getField()[5][i].set((float) Math.random() * 20f - 10f, 100f + i * 10);
165 //field.getField()[5][i].set((float) Math.random() * 20f - 10f, 1000f);
166// field.getField()[4][i].set(500f, 500f);
167// field.getField()[6][i].set(-500f, 500f);
168 //field.getField()[5][i].set(0, 1000f);
169 //field.getField()[10][i].set(0, 1000f);
170
171// if (i % 4 == 0) {
172// field.getField()[4][i].set(200f, 500f + (20 - i) * 10f);
173// } else if (i % 4 == 2){
174// field.getField()[6][i].set(-200f, 500f + (20 - i) * 10f);
175// } else {
176// field.getField()[5][i].set(0, 500f + (20 - i) * 10f);
177// }
178 //field.getField()[5][i].set(0, 500f + (20 - i) * 10f);
179 int x = field.getField().length / 2;
180 field.getField()[x][i].set(0, 500f);
181
182
183// field.getField()[4][i].set(500f, 500f);
184// field.getField()[6][i].set(-500f, 500f);
185 //field.getField()[5][i].y += 2000f * amount;
186
187// field.getField()[1][i].set(-200f, -200f);
188// field.getField()[9][i].set(200f, -200f);
189// field.getField()[3][i].set((float) Math.random() * 20f - 10f - 0, 100f + i * 20);
190// field.getField()[7][i].set((float) Math.random() * 20f - 10f + 0, 100f + i * 20);
191 }
192
193// for (int i = 1; i < 20; i++) {
194// if (i % 2 == 0) {
195// field.getField()[0][i].set(200f, 0);
196// } else {
197// field.getField()[10][i].set(-200f, 0);
198// }
199// }
200
201// for (int i = 15; i <= 20; i++) {
202// field.getField()[8][i].set((float) Math.random() * 20f - 10f - 20, -100f);
203// field.getField()[12][i].set((float) Math.random() * 20f - 10f + 20, -100f);
204// }
205// field.getField()[10][1].set(0, 1000f);
206// field.getField()[10][2].set(0, 1000f);
207// field.getField()[9][0].set(0, 1000f);
208// field.getField()[11][0].set(0, 1000f);
209 }
210
211 frame++;
212
213 TurbulenceParams params = new TurbulenceParams();
214 params.field = field;
215 params.effectWidth = 210f;
216 params.effectLength = 410f;
217 params.maxDispersionAngle = 120f;
218 params.energyTransferMult = 5f;
219 params.dampenFactor = 0.2f;
220 params.maxVelocity = 1000f;
221
222// params.maxDispersionAngle = 180f;
223// params.maxDispersionAngle = 160f;
224 params.maxDispersionAngle = 0f;
225 params.maxVelocity = 1000f;
226 params.energyTransferMult = 6f;
227// params.effectWidth = 410f;
228// params.effectLength = 810f;
229
230 params.propagationAmount = 6f * amount;
231// if (frame % 2 == 0) {
232// params.propagationAmount = 12f * amount;
233 TurbulenceCalc2.advance(params);
234// }
235
236// for (int i = 0; i < 10; i++) {
237// TurbulenceCalc2.advance(field, 210f, 410f, 6f * amount);
238// }
239 //TurbulenceCalc2.advance(field, 410f, 620f, 1f);
240
241
242 float facing = entity.getFacing();
243 float x = entity.getLocation().x;
244 float y = entity.getLocation().y;
245 float w = field.getCellSize() * (field.getField().length - 1);
246 float h = field.getCellSize() * (field.getField()[0].length - 1);
247
248 //while (testParticles.size() < 5000) {
249 while (testParticles.size() < 500) {
250 Vector2f loc = new Vector2f();
251 //loc.x = w * (float) Math.random() + x;
252 loc.x = w * 0.4f + w * 0.2f * (float) Math.random() ;
253 loc.y = h * (1f - (float) Math.random()) ;
254 loc = Misc.rotateAroundOrigin(loc, entity.getFacing());
255 loc.x += x;
256 loc.y += y;
257 //float size = 3f + 2f * (float) Math.random();
258 float size = 2f;
259 float mass = 0.0001f;
260 //mass = (float) Math.random() * 10f;
261 mass = (float) Math.random() * 10f;
262 //mass = 100f;
263 float dur = 0f + 4f * Misc.random.nextFloat();
264 addTestParticle(loc, getRandomColor(), size, mass, dur);
265
266 }
267
268// while (particles.size() < 1000) {
269// Vector2f loc = new Vector2f();
270// //loc.x = w * (float) Math.random() + x;
271// loc.x = w * 0.49f + w * 0.02f * (float) Math.random() + x;
272// loc.x = w * 0.4f + w * 0.2f * (float) Math.random() + x;
273// loc.x = w * 0.2f + w * 0.6f * (float) Math.random() + x;
274// //loc.y = h * (1f - (float) Math.random() * (float) Math.random()) + y;
275// loc.y = h * (1f - (float) Math.random()) + y;
276// float size = 250f + 20f * (float) Math.random();
277// size = 6f + 2f * (float) Math.random();
278// size = 12f;
279// size = 100f;
280// float mass = 0.0001f;
281// mass = (float) Math.random() * 10f;
282// //mass = 100f;
283// float dur = 0.5f + 3.5f * Misc.random.nextFloat();
284// Color c = getRandomColor();
285// //c = Misc.scaleAlpha(c, 0.25f);
286// addTexturedParticle(loc, c, mass, size, 10f, 0.5f, dur - 0.5f);
287// }
288
289 Iterator<PointParticle> iter = testParticles.iterator();
290 while (iter.hasNext()) {
291 PointParticle p = iter.next();
292 p.remaining -= amount;
293 p.elapsed += amount;
294 if (p.remaining <= 0) {
295 iter.remove();
296 continue;
297 }
298
299 if (field.isInsideField(p.loc.x, p.loc.y, new Vector2f(x, y), facing)) {
300 Vector2f vel = field.getVelocity(p.loc.x, p.loc.y, new Vector2f(x, y), facing);
301 float accelAmount = 1f / p.mass;
302 if (accelAmount > 1f) accelAmount = 1f;
303 accelAmount *= 60f;
304 //p.vel.set(vel);
305 Vector2f diff = Vector2f.sub(vel, p.vel, new Vector2f());
306 p.vel.x += diff.x * accelAmount * amount;
307 p.vel.y += diff.y * accelAmount * amount;
308 } else {
309 if (p.elapsed > 0.5f) {
310 p.remaining = Math.min(p.remaining, 0.5f);
311 }
312// iter.remove();
313// continue;
314 }
315
316 p.loc.x += p.vel.x * amount;
317 p.loc.y += p.vel.y * amount;
318 }
319
320
321 List<ParticleData> remove = new ArrayList<ParticleData>();
322 for (ParticleData p : particles) {
323 p.advance(amount, field, x, y, facing);
324 if (p.elapsed >= p.maxDur) {
325 remove.add(p);
326 }
327 }
328 particles.removeAll(remove);
329
330 remove = new ArrayList<ParticleData>();
331 for (ParticleData p : darkParticles) {
332 p.advance(amount, field, x, y, facing);
333 if (p.elapsed >= p.maxDur) {
334 remove.add(p);
335 }
336 }
337 darkParticles.removeAll(remove);
338
339
340 Vector2f vel = new Vector2f(0f, Misc.getSpeedForBurnLevel(30f));
341 Vector2f dv = new Vector2f(vel.x * amount, vel.y * amount);
342
343 distanceTravelled += dv.length();
344
345// while (distanceTravelled > field.getCellSize()) {
346// dv = Misc.normalise(dv);
347// dv.scale(distanceTravelled);
350// field.shiftDown();
351//
352// distanceTravelled -= field.getCellSize();
353// }
354 }
355
356 public void render(CampaignEngineLayers layer, ViewportAPI viewport) {
357
358 float mx = Mouse.getX();
359 float my = Mouse.getY();
360
361 float wmx = Global.getSector().getViewport().convertScreenXToWorldX(mx);
362 float wmy = Global.getSector().getViewport().convertScreenYToWorldY(my);
363
364 entity.setFacing(0f);
365
366 float facing = entity.getFacing();
367 float x = entity.getLocation().x;
368 float y = entity.getLocation().y;
369
370 GL11.glDisable(GL11.GL_TEXTURE_2D);
371 GL11.glEnable(GL11.GL_BLEND);
372 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
373
374 if (false || Keyboard.isKeyDown(Keyboard.KEY_O)) {
375 GL11.glPushMatrix();
376 GL11.glTranslatef(x, y, 0);
377 GL11.glRotatef(facing, 0, 0, 1);
378
379 GL11.glPointSize(20f);
380 GL11.glEnable(GL11.GL_POINT_SMOOTH);
381 GL11.glBegin(GL11.GL_POINTS);
382 GL11.glColor4f(1f,0,0,0.75f);
383 for (int i = 0; i < field.field.length; i++) {
384 for (int j = 0; j < field.field[0].length; j++) {
385 float cx = i * field.cellSize;
386 float cy = j * field.cellSize;
387 GL11.glVertex2f(cx, cy);
388 }
389 }
390 GL11.glEnd();
391
392 GL11.glLineWidth(1);
393 GL11.glEnable(GL11.GL_LINE_SMOOTH);
394 GL11.glDisable(GL11.GL_BLEND);
395 GL11.glBegin(GL11.GL_LINES);
396
397 GL11.glColor4f(1f,1f,0,1f);
398 float scale = 1f;
399 for (int i = 0; i < field.field.length; i++) {
400 for (int j = 0; j < field.field[0].length; j++) {
401 Vector2f vel = field.field[i][j];
402
403 // float cx = x + i * field.cellSize;
404 // float cy = y + j * field.cellSize;
405 float cx = i * field.cellSize;
406 float cy = j * field.cellSize;
407
408 GL11.glVertex2f(cx, cy);
409 GL11.glVertex2f(cx + vel.x * scale, cy + vel.y * scale);
410 }
411 }
412
413 GL11.glEnd();
414
415
416 GL11.glPopMatrix();
417
418
419
420 GL11.glPointSize(6f);
421 GL11.glEnable(GL11.GL_POINT_SMOOTH);
422 GL11.glBegin(GL11.GL_POINTS);
423 GL11.glColor4f(1,1,0,1);
424 GL11.glVertex2f(wmx, wmy);
425 GL11.glEnd();
426 GL11.glLineWidth(1);
427 GL11.glEnable(GL11.GL_LINE_SMOOTH);
428 GL11.glBegin(GL11.GL_LINES);
429
430 GL11.glColor4f(1,1,0,1);
431 Vector2f vel = field.getVelocity(wmx, wmy, new Vector2f(x, y), facing);
432 GL11.glVertex2f(wmx, wmy);
433 GL11.glVertex2f(wmx + vel.x, wmy + vel.y);
434
435 GL11.glEnd();
436 }
437
438
439
440 GL11.glEnable(GL11.GL_POINT_SMOOTH);
441 GL11.glEnable(GL11.GL_BLEND);
442 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
443 float zoom = Global.getSector().getViewport().getViewMult();
444 //System.out.println(zoom);
445 GL11.glPointSize(2f / zoom);
446 GL11.glBegin(GL11.GL_POINTS);
447 for (PointParticle p : testParticles) {
448 if (true) break;
449 if (!viewport.isNearViewport(p.loc, 5)) continue;
450 float a = 1f;
451 if (p.remaining <= 0.5f) {
452 a = p.remaining / 0.5f;
453 } else if (p.elapsed < 0.5f) {
454 a = p.elapsed / 0.5f;
455 }
456 //a *= 0.5f;
457 Misc.setColor(p.color, a);
458 GL11.glVertex2f(p.loc.x, p.loc.y);
459
460 float zf = 1f;
461 if (zoom < 1.75f && false) {
462// float zf = (1.75f - zoom) / 0.25f;
463// if (zf < 0) zf = 0;
464// if (zf > 1) zf = 1;
465 Vector2f dir = Misc.normalise(new Vector2f(p.vel));
466 float spread = 0.5f;
467 //spread = 1f;
468 a *= 0.65f;
469 Misc.setColor(p.color, a * zf);
470 GL11.glVertex2f(p.loc.x + dir.x * spread, p.loc.y + dir.y * spread);
471 if (zoom < 1.5f) {
472// zf = (1.5f - zoom) / 0.25f;
473// if (zf < 0) zf = 0;
474// if (zf > 1) zf = 1;
475 Misc.setColor(p.color, a * zf);
476 GL11.glVertex2f(p.loc.x - dir.x * spread, p.loc.y - dir.y * spread);
477 }
478
479 if (zoom < 1.25f) {
480 spread *= 2f;
481 a *= 0.65f;
482// zf = (1.25f - zoom) / 0.25f;
483// if (zf < 0) zf = 0;
484// if (zf > 1) zf = 1;
485 Misc.setColor(p.color, a * zf);
486 GL11.glVertex2f(p.loc.x + dir.x * spread, p.loc.y + dir.y * spread);
487 if (zoom < 1f) {
488// zf = (1f - zoom) / 0.25f;
489// if (zf < 0) zf = 0;
490// if (zf > 1) zf = 1;
491 Misc.setColor(p.color, a * zf);
492 GL11.glVertex2f(p.loc.x - dir.x * spread, p.loc.y - dir.y * spread);
493 }
494 }
495 }
496
497// for (int i = 0; i < 4; i++) {
498// a *= 0.75f;
499// Misc.setColor(p.color, a);
500// GL11.glVertex2f(p.loc.x - dir.x * spread/zoom, p.loc.y - dir.y * spread/zoom);
501// spread += 0.5f;
502// }
503
504 }
505 GL11.glEnd();
506
507 GL11.glLineWidth(3.5f);
508 GL11.glLineWidth(2f);
509 //GL11.glLineWidth(1.5f);
510 GL11.glEnable(GL11.GL_LINE_SMOOTH);
511 GL11.glBegin(GL11.GL_LINES);
512 for (PointParticle p : testParticles) {
513 //if (true) break;
514 if (!viewport.isNearViewport(p.loc, 500)) continue;
515 float a = 1f;
516 if (p.remaining <= 0.5f) {
517 a = p.remaining / 0.5f;
518 } else if (p.elapsed < 0.5f) {
519 a = p.elapsed / 0.5f;
520 }
521
522// Vector2f currVel = new Vector2f(p.loc);
523// Vector2f currLoc = new Vector2f(p.vel);
524 //Vector2f prevVel = new Vector2f(p.vel);
525 Vector2f prev = new Vector2f(p.loc);
526 float prevAlpha = 0f;
527 float interval = 1/60f;
528 float iter = 15f;
529
530 for (int i = 0; i < iter; i++) {
531 //boolean inField = field.isInsideField(p.loc.x, p.loc.y, new Vector2f(x, y), facing);
532 //boolean inField = true;
533 Vector2f vel = field.getVelocity(prev.x, prev.y, new Vector2f(x, y), facing);
534 //Vector2f vel = new Vector2f(100f, 0f);
535 Vector2f loc = new Vector2f(prev);
536 loc.x -= vel.x * interval;
537 loc.y -= vel.y * interval;
538
539// float velDelta = Vector2f.sub(vel, prevVel, new Vector2f()).length();
540// float baseAlpha = 1f;
541 float baseAlpha = 0.5f;
542// baseAlpha += 0.5f * velDelta / 50f;
543// baseAlpha *= 0.5f;
544// //baseAlpha = 0.5f;
545// if (baseAlpha > 1f) baseAlpha = 1f;
546
547 float alpha = baseAlpha * a * (iter - i) / iter;
548 //if (!inField) alpha = 0f;
549
550 Misc.setColor(p.color, prevAlpha);
551 GL11.glVertex2f(prev.x, prev.y);
552 Misc.setColor(p.color, alpha);
553 GL11.glVertex2f(loc.x, loc.y);
554
555 prevAlpha = alpha;
556 prev = loc;
557 //prevVel = vel;
558 }
559
560// Vector2f dir = Misc.normalise(new Vector2f(p.vel));
561// float len = 5f;
562// len = p.vel.length() / 10f;
563// if (len > 30) len = 30;
564// //a *= 0.75f;
565// Misc.setColor(p.color, a);
566// GL11.glVertex2f(p.loc.x, p.loc.y);
567// Misc.setColor(p.color, 0f);
568// GL11.glVertex2f(p.loc.x - dir.x * len, p.loc.y - dir.y * len);
569 }
570 GL11.glEnd();
571
572 renderTextureParticles(layer, viewport);
573 }
574
575 public void renderTextureParticles(CampaignEngineLayers layer, ViewportAPI viewport) {
576 float b = viewport.getAlphaMult();
577
578 CampaignEngineLayers normalLayer = layer;
579 CampaignEngineLayers darkLayer = layer;
580 if (layer == normalLayer) {
581 for (ParticleData p : particles) {
582 float size = p.baseSize * p.scale;
583 Vector2f loc = p.offset;
584
585 float alphaMult = 1f;
586
587 p.sprite.setAngle(p.angle);
588 p.sprite.setSize(size, size);
589 p.sprite.setAlphaMult(b * alphaMult * p.fader.getBrightness());
590 p.sprite.setColor(p.color);
591 p.sprite.renderAtCenter(loc.x, loc.y);
592 }
593 }
594 if (layer == darkLayer) {
595 GL14.glBlendEquation(GL14.GL_FUNC_REVERSE_SUBTRACT);
596
597 for (ParticleData p : darkParticles) {
598 //float size = proj.getProjectileSpec().getWidth() * 0.6f;
599 float size = p.baseSize * p.scale;
600
601 Vector2f loc = p.offset;
602
603 float alphaMult = 1f;
604
605 p.sprite.setAngle(p.angle);
606 p.sprite.setSize(size, size);
607 p.sprite.setAlphaMult(b * alphaMult * p.fader.getBrightness());
608 p.sprite.setColor(p.color);
609 p.sprite.renderAtCenter(loc.x, loc.y);
610 }
611
612 GL14.glBlendEquation(GL14.GL_FUNC_ADD);
613 }
614 }
615 public void addTestParticle(Vector2f loc, Color color, float size, float mass, float dur) {
616 PointParticle p = new PointParticle();
617 p.loc.set(loc);
618 p.mass = mass;
619 p.remaining = dur;
620 p.size = size;
621 p.color = color;
622 testParticles.add(p);
623 }
624
625 public void addTexturedParticle(Vector2f loc, Color color, float mass, float size, float endSizeMult, float durIn, float durOut) {
626 ParticleData p = new ParticleData(size, mass, durIn, durOut, endSizeMult, 30f, color, null);
627 p.offset.set(loc);
628 particles.add(p);
629// p = new ParticleData(size * 0.8f, mass, durIn, durOut, endSizeMult, 30f, color, null);
630// p.offset.set(loc);
631// darkParticles.add(p);
632 }
633
634 public Color getRandomColor() {
635// if (true) {
636// return new Color(0.5f, 1f, 0.8f, 1f);
637// }
638 float r = 0.5f;
639 float g = 0.3f + 0.3f * (float) Math.random();
640 float b = 0.75f + 0.25f * (float) Math.random();
641 float a = 0.85f + 0.15f * (float) Math.random();
642 if (r < 0) r = 0;
643 if (r > 1) r = 1;
644 if (g < 0) g = 0;
645 if (g > 1) g = 1;
646 if (b < 0) b = 0;
647 if (b > 1) b = 1;
648 if (a < 0) a = 0;
649 if (a > 1) a = 1;
650 a *= 0.33f;
651 a = 1f;
652 Color c = new Color(r, g, b, a);
653 return c;
654 }
655}
656
657
658
659
660
661
662
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
void addTestParticle(Vector2f loc, Color color, float size, float mass, float dur)
void renderTextureParticles(CampaignEngineLayers layer, ViewportAPI viewport)
void render(CampaignEngineLayers layer, ViewportAPI viewport)
void addTexturedParticle(Vector2f loc, Color color, float mass, float size, float endSizeMult, float durIn, float durOut)
boolean isInsideField(float x, float y, Vector2f bottomLeft, float angle)
Vector2f getVelocity(float x, float y, Vector2f bottomLeft, float angle)
SpriteAPI getSprite(String filename)