2 registered members (Akow, tomaslolo),
1,536
guests, and 12
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
sorting of translucent particles
#450289
04/11/15 16:49
04/11/15 16:49
|
Joined: May 2009
Posts: 5,370 Caucasus
3run
OP
Senior Expert
|
OP
Senior Expert
Joined: May 2009
Posts: 5,370
Caucasus
|
I'm having sorting problems with particles (non translucent vs translucent), and would like to know where do I dig? I've read in the manual that I could give a non transparent overlay bmap for particles, does it mean that sorting issue can be solved by having an image with alpha channel? It did not help me anyway, I use simple white .png image, and I change its color to get different particle effects (masterQ32 thank you for the idea ). I tried to use white .tga with same size and white alpha channel, didn't help. I don't want to use sprites in order to solve this sorting issue, maybe there is another way I'm missing? Best regards edit: additional question is about framerate independence for spawning particles, how does engine create/spawn particles? in the manual there is an example how to spawn particles independent to framerate (maxv(1, 40 * time_step). At first I thought it will set amount of spawning particles to a fixed value, independent to framerate, but it just adjusts value of spawning particles to keep it more or less the same. For keeping the particle number independent of the frame rate on continuous particle generation, multiply the number of generated particles with time_step (see example). Just run it, press ENTER and you'll see how how the number of particles goes up.
// fade smoke away:
function fadeSmokeTrailPar(PARTICLE* p){
// decrease alpha:
p.alpha -= p.skill_x * time_step;
// if we don't have alpha, kill particle:
if(p.alpha <= 0){ p.lifespan = 0; }
}
// smoke trail particle:
function smokeTrailPar(PARTICLE* p){
// set color to white:
vec_set(p.blue, COLOR_GREY);
// set size:
p.size = 4;
// set gravity:
p.gravity = -0.4;
// set alpha:
p.alpha = 30;
// set fading speed:
p.skill_x = 1;
// set flags:
set(p, MOVE | BRIGHT | BEAM | TRANSLUCENT);
// set event:
p.event = fadeSmokeTrailPar;
}
// main function:
void main(){
// set framerate limit:
fps_max = 500;
// empty level:
level_load("");
// wait 3 frames:
wait(3);
// set camera positions/angles:
vec_set(camera.x, vector(-140, 0, 90));
vec_set(camera.pan, vector(0, -13, 0));
// vectors:
VECTOR vectexVec;
// reset vectors:
vec_fill(vectexVec.x, 0);
// create smoke emmiter:
ENTITY* smokeEnt = ent_create(CUBE_MDL, vector(200, 0, 0), NULL);
// scale it down:
vec_fill(smokeEnt.scale_x, 0.35);
// set it's flags:
set(smokeEnt, PASSABLE | TRANSLUCENT);
// save position:
vec_set(smokeEnt.skill1, smokeEnt.x);
// loop:
while(1){
// reset framerate limit:
fps_max = 500;
// if ENTER is pressed:
if(key_enter){
// decrease framerate limit:
fps_max = 60;
}
// show framerate:
DEBUG_VAR(fps_max, 30);
DEBUG_VAR(num_particles, 50);
// show text:
draw_text("PRESS <ENTER> TO LOWER FRAMERATE!", 10, 10, COLOR_WHITE);
// rotate smoke emitter:
smokeEnt.pan = cycle(smokeEnt.pan + 30 * time_step, 0, 360);
// move it:
smokeEnt.z = smokeEnt.skill3 + fsin(total_ticks * 8, 64);
smokeEnt.y = smokeEnt.skill2 + fcos(total_ticks * 8, 64);
// get position of upper left vertex:
vec_for_vertex(vectexVec.x, smokeEnt, 3);
// create smoke trail with particles:
effect(smokeTrailPar, maxv(1, 40 * time_step), vectexVec.x, nullvector);
// wait one frame:
wait(1);
}
}
Last edited by 3run; 04/11/15 17:04. Reason: added question
|
|
|
Re: sorting of translucent particles
[Re: 3run]
#450349
04/13/15 08:32
04/13/15 08:32
|
Joined: May 2009
Posts: 5,370 Caucasus
3run
OP
Senior Expert
|
OP
Senior Expert
Joined: May 2009
Posts: 5,370
Caucasus
|
I tried to use 24 bit .tga and .pcx images, with OVERLAY flag set on, but it didn't help unfortunately. I could only fix it by using sprites instead of particles, but it's too slow for particularly this project, cause I'm going to have tons of particles (over 2000).. About interpolating particle between the new and old positions, it works only without MOVE flag set (while BEAM is on). Is there anyway to make 'gravity' work without MOVE flag set (as far as I know, no ), or maybe there is an alternative way to simulate 'fake' gravity for BEAM particles? Greets
|
|
|
Re: sorting of translucent particles
[Re: 3run]
#450356
04/13/15 10:29
04/13/15 10:29
|
Joined: Sep 2003
Posts: 6,861 Kiel (Germany)
Superku
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
|
Hm that's a pity.
I don't understand the problem with MOVE or gravity, it shouldn't make a difference. What I meant was something as follows:
k = floor(my.skill20/0.5); for(i = k; i > 0; i--) { vec_lerp(temp,old_pos,new_pos,i/k); effect(my_particle,1,temp,vec_diff(...)*1 or /k or no velocity at all) }
This could be totally wrong, untested, but should give you an idea.
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual Check out my new game: Pogostuck: Rage With Your Friends
|
|
|
Re: sorting of translucent particles
[Re: Superku]
#450364
04/13/15 11:54
04/13/15 11:54
|
Joined: May 2009
Posts: 5,370 Caucasus
3run
OP
Senior Expert
|
OP
Senior Expert
Joined: May 2009
Posts: 5,370
Caucasus
|
What I was doing, was something like this:
effect(smokeTrailPar, maxv(1, 40 * time_step), my.x, vec_sub(oldPos.x, my.x));
vec_set(oldPos.x, my.x);
It doesn't work with MOVE flag, cause it prevent BEAM from actually being 'smeared' (as the manual said) via 'velocity'. Some screens to how you what happens: Without MOVE flag: With MOVE flag: So it looks to me, that when I use MOVE flag, BEAM is 'smeared' along the p.vel_x. So it works like initial speed, instead of beam length vel - Initial speed vector or beam length.
Greets
|
|
|
Re: sorting of translucent particles
[Re: Superku]
#450372
04/13/15 13:51
04/13/15 13:51
|
Joined: May 2009
Posts: 5,370 Caucasus
3run
OP
Senior Expert
|
OP
Senior Expert
Joined: May 2009
Posts: 5,370
Caucasus
|
void p_event(PARTICLE* p) { p.skill_z += 0.25*time_step; // maybe add a maxv limit here p.z += p.skill_z*time_step; } I didn't even think about moving particle directly, thank you for a tip! As I'm toying around with the code, I'm getting some really beautiful artefacts It looks much better in motion But anyway, I just wanted to show this. Greets
|
|
|
|