Skip to content
Snippets Groups Projects
Commit 458d5754 authored by dg's avatar dg
Browse files

particles can have radial movement now

added 2 new particles effects for later use


git-svn-id: http://svn.net-core.org/repos/t-engine4@332 51575b47-30f0-44d4-a5cc-537603b46e54
parent a42de32f
No related branches found
No related tags found
No related merge requests found
......@@ -593,15 +593,15 @@ _M.particles_def = {}
function _M:particleEmitter(x, y, radius, def, fct, max)
if type(def) == "string" then
if _M.particles_def[def] then
def, fct, max = _M.particles_def[def][1], _M.particles_def[def][2], _M.particles_def[def][3]
def, fct, max = _M.particles_def[def]()
else
local odef = def
print("[PARTICLE] Loading from /data/gfx/particles/"..def..".lua")
local f = loadfile("/data/gfx/particles/"..def..".lua")
setfenv(f, {})
setfenv(f, setmetatable({}, {__index=_G}))
def, fct, max = f()
max = max or 1000
_M.particles_def[odef] = { def, fct, max }
_M.particles_def[odef] = f
end
end
......
......@@ -518,6 +518,7 @@ function _M:setupCommands()
self:registerDialog(menu)
end,
}
--[[
self.key:addCommands
{
......
return { generator = function()
local ad = rng.range(0, 360)
local a = math.rad(ad)
local dir = math.rad(ad + 90)
local r = rng.range(10, 15)
return {
life = 10,
size = 2, sizev = -0.1, sizea = 0,
x = r * math.cos(a), xv = 0, xa = 0,
y = r * math.sin(a), yv = 0, ya = 0,
dir = dir, dirv = 0, dira = 0,
vel = 1, velv = 0, vela = 0,
r = 0.8, rv = 0, ra = 0,
g = 0, gv = 0, ga = 0,
b = 0.9, bv = 0, ba = 0,
a = 1, av = 0, aa = 0,
}
end, },
function(self)
self.ps:emit(100)
end
local epi = { x=0, y=0 }
return { generator = function()
return {
life = 10,
size = rng.range(2,4), sizev = -0.2, sizea = 0,
x = epi.x+rng.avg(-15, 15, 3), xv = rng.range(-10, 10) / 20, xa = 0,
y = epi.y+rng.avg(-15, 15, 3), yv = rng.range(-10, 10) / 20, ya = 0,
dir = 0, dirv = 0, dira = 0,
vel = 0, velv = 0, vela = 0,
r = 1, rv = 0, ra = 0,
g = 0, gv = rng.range(1, 5) / 20, ga = 0,
b = 0, bv = 0, ba = 0,
a = 1, av = -0.05, aa = 0,
}
end, },
function(self)
epi.x = util.bound(epi.x + rng.range(-2, 2), -10, 10)
epi.y = util.bound(epi.y + rng.range(-2, 2), -10, 10)
self.ps:emit(30)
end, 300
No preview for this file type
......@@ -11,7 +11,7 @@
#define rng(x, y) (x + rand_div(1 + y - x))
static void getfield(lua_State *L, const char *key, int *min, int *max)
static void getinitfield(lua_State *L, const char *key, int *min, int *max)
{
lua_pushstring(L, key);
lua_gettable(L, -2);
......@@ -31,6 +31,15 @@ static void getfield(lua_State *L, const char *key, int *min, int *max)
lua_pop(L, 1);
}
static void getparticulefield(lua_State *L, const char *k, float *v)
{
lua_pushstring(L, k);
lua_gettable(L, -2);
*v = (float)lua_tonumber(L, -1);
// printf("emit %s :: %f\n", k, *v);
lua_pop(L, 1);
}
static int particles_new(lua_State *L)
{
int nb = luaL_checknumber(L, 1);
......@@ -52,36 +61,48 @@ static int particles_new(lua_State *L)
// Grab all parameters
lua_rawgeti(L, LUA_REGISTRYINDEX, p_ref);
lua_pushstring(L, "base");
lua_pushstring(L, "generator");
lua_gettable(L, -2);
ps->base = (float)lua_tonumber(L, -1);
lua_pop(L, 1);
if (lua_isnil(L, -1))
{
lua_pop(L, 1);
}
else
ps->generator_ref = luaL_ref(L, LUA_REGISTRYINDEX);
if (!ps->generator_ref)
{
lua_pushstring(L, "base");
lua_gettable(L, -2);
ps->base = (float)lua_tonumber(L, -1);
lua_pop(L, 1);
getfield(L, "life", &(ps->life_min), &(ps->life_max));
getinitfield(L, "life", &(ps->life_min), &(ps->life_max));
getfield(L, "angle", &(ps->angle_min), &(ps->angle_max));
getfield(L, "anglev", &(ps->anglev_min), &(ps->anglev_max));
getfield(L, "anglea", &(ps->anglea_min), &(ps->anglea_max));
getinitfield(L, "angle", &(ps->angle_min), &(ps->angle_max));
getinitfield(L, "anglev", &(ps->anglev_min), &(ps->anglev_max));
getinitfield(L, "anglea", &(ps->anglea_min), &(ps->anglea_max));
getfield(L, "size", &(ps->size_min), &(ps->size_max));
getfield(L, "sizev", &(ps->sizev_min), &(ps->sizev_max));
getfield(L, "sizea", &(ps->sizea_min), &(ps->sizea_max));
getinitfield(L, "size", &(ps->size_min), &(ps->size_max));
getinitfield(L, "sizev", &(ps->sizev_min), &(ps->sizev_max));
getinitfield(L, "sizea", &(ps->sizea_min), &(ps->sizea_max));
getfield(L, "r", &(ps->r_min), &(ps->r_max));
getfield(L, "rv", &(ps->rv_min), &(ps->rv_max));
getfield(L, "ra", &(ps->ra_min), &(ps->ra_max));
getinitfield(L, "r", &(ps->r_min), &(ps->r_max));
getinitfield(L, "rv", &(ps->rv_min), &(ps->rv_max));
getinitfield(L, "ra", &(ps->ra_min), &(ps->ra_max));
getfield(L, "g", &(ps->g_min), &(ps->g_max));
getfield(L, "gv", &(ps->gv_min), &(ps->gv_max));
getfield(L, "ga", &(ps->ga_min), &(ps->ga_max));
getinitfield(L, "g", &(ps->g_min), &(ps->g_max));
getinitfield(L, "gv", &(ps->gv_min), &(ps->gv_max));
getinitfield(L, "ga", &(ps->ga_min), &(ps->ga_max));
getfield(L, "b", &(ps->b_min), &(ps->b_max));
getfield(L, "bv", &(ps->bv_min), &(ps->bv_max));
getfield(L, "ba", &(ps->ba_min), &(ps->ba_max));
getinitfield(L, "b", &(ps->b_min), &(ps->b_max));
getinitfield(L, "bv", &(ps->bv_min), &(ps->bv_max));
getinitfield(L, "ba", &(ps->ba_min), &(ps->ba_max));
getfield(L, "a", &(ps->a_min), &(ps->a_max));
getfield(L, "av", &(ps->av_min), &(ps->av_max));
getfield(L, "aa", &(ps->aa_min), &(ps->aa_max));
getinitfield(L, "a", &(ps->a_min), &(ps->a_max));
getinitfield(L, "av", &(ps->av_min), &(ps->av_max));
getinitfield(L, "aa", &(ps->aa_min), &(ps->aa_max));
}
lua_pop(L, 1);
luaL_unref(L, LUA_REGISTRYINDEX, p_ref);
......@@ -95,6 +116,7 @@ static int particles_free(lua_State *L)
free(ps->particles);
luaL_unref(L, LUA_REGISTRYINDEX, ps->texture_ref);
if (ps->generator_ref) luaL_unref(L, LUA_REGISTRYINDEX, ps->generator_ref);
lua_pushnumber(L, 1);
return 1;
......@@ -112,34 +134,87 @@ static int particles_emit(lua_State *L)
if (!p->life)
{
p->life = rng(ps->life_min, ps->life_max);
p->size = rng(ps->size_min, ps->size_max);
p->sizev = rng(ps->sizev_min, ps->sizev_max);
p->sizea = rng(ps->sizea_min, ps->sizea_max);
p->x = p->y = 0;
float angle = rng(ps->angle_min, ps->angle_max) * M_PI / 180;
float v = rng(ps->anglev_min, ps->anglev_max) / ps->base;
float a = rng(ps->anglea_min, ps->anglea_max) / ps->base;
p->xa = cos(angle) * a;
p->ya = sin(angle) * a;
p->xv = cos(angle) * v;
p->yv = sin(angle) * v;
p->r = rng(ps->r_min, ps->r_max) / 255.0f;
p->g = rng(ps->g_min, ps->g_max) / 255.0f;
p->b = rng(ps->b_min, ps->b_max) / 255.0f;
p->a = rng(ps->a_min, ps->a_max) / 255.0f;
p->rv = rng(ps->rv_min, ps->rv_max) / ps->base;
p->gv = rng(ps->gv_min, ps->gv_max) / ps->base;
p->bv = rng(ps->bv_min, ps->bv_max) / ps->base;
p->av = rng(ps->av_min, ps->av_max) / ps->base;
p->ra = rng(ps->ra_min, ps->ra_max) / ps->base;
p->ga = rng(ps->ga_min, ps->ga_max) / ps->base;
p->ba = rng(ps->ba_min, ps->ba_max) / ps->base;
p->aa = rng(ps->aa_min, ps->aa_max) / ps->base;
if (!ps->generator_ref)
{
p->life = rng(ps->life_min, ps->life_max);
p->size = rng(ps->size_min, ps->size_max);
p->sizev = rng(ps->sizev_min, ps->sizev_max);
p->sizea = rng(ps->sizea_min, ps->sizea_max);
p->x = p->y = 0;
float angle = rng(ps->angle_min, ps->angle_max) * M_PI / 180;
float v = rng(ps->anglev_min, ps->anglev_max) / ps->base;
float a = rng(ps->anglea_min, ps->anglea_max) / ps->base;
p->xa = cos(angle) * a;
p->ya = sin(angle) * a;
p->xv = cos(angle) * v;
p->yv = sin(angle) * v;
p->dir = 0;
p->dirv = 0;
p->dira = 0;
p->vel = 0;
p->velv = 0;
p->vela = 0;
p->r = rng(ps->r_min, ps->r_max) / 255.0f;
p->g = rng(ps->g_min, ps->g_max) / 255.0f;
p->b = rng(ps->b_min, ps->b_max) / 255.0f;
p->a = rng(ps->a_min, ps->a_max) / 255.0f;
p->rv = rng(ps->rv_min, ps->rv_max) / ps->base;
p->gv = rng(ps->gv_min, ps->gv_max) / ps->base;
p->bv = rng(ps->bv_min, ps->bv_max) / ps->base;
p->av = rng(ps->av_min, ps->av_max) / ps->base;
p->ra = rng(ps->ra_min, ps->ra_max) / ps->base;
p->ga = rng(ps->ga_min, ps->ga_max) / ps->base;
p->ba = rng(ps->ba_min, ps->ba_max) / ps->base;
p->aa = rng(ps->aa_min, ps->aa_max) / ps->base;
}
else
{
lua_rawgeti(L, LUA_REGISTRYINDEX, ps->generator_ref);
lua_call(L, 0, 1);
float life;
getparticulefield(L, "life", &life); p->life = life;
getparticulefield(L, "size", &(p->size));
getparticulefield(L, "sizev", &(p->sizev));
getparticulefield(L, "sizea", &(p->sizea));
getparticulefield(L, "x", &(p->x));
getparticulefield(L, "xv", &(p->xv));
getparticulefield(L, "xa", &(p->xa));
getparticulefield(L, "y", &(p->y));
getparticulefield(L, "yv", &(p->yv));
getparticulefield(L, "ya", &(p->ya));
getparticulefield(L, "dir", &(p->dir));
getparticulefield(L, "dirv", &(p->dirv));
getparticulefield(L, "dira", &(p->dira));
getparticulefield(L, "vel", &(p->vel));
getparticulefield(L, "velv", &(p->velv));
getparticulefield(L, "vela", &(p->vela));
getparticulefield(L, "r", &(p->r));
getparticulefield(L, "rv", &(p->rv));
getparticulefield(L, "ra", &(p->ra));
getparticulefield(L, "g", &(p->g));
getparticulefield(L, "gv", &(p->gv));
getparticulefield(L, "ga", &(p->ga));
getparticulefield(L, "b", &(p->b));
getparticulefield(L, "bv", &(p->bv));
getparticulefield(L, "ba", &(p->ba));
getparticulefield(L, "a", &(p->a));
getparticulefield(L, "av", &(p->av));
getparticulefield(L, "aa", &(p->aa));
}
nb--;
if (!nb) break;
......@@ -183,6 +258,15 @@ static int particles_to_screen(lua_State *L)
p->x += p->xv;
p->y += p->yv;
if (p->dir && p->vel)
{
p->x += cos(p->dir) * p->vel;
p->y += sin(p->dir) * p->vel;
}
p->dir += p->dirv;
p->vel += p->velv;
p->r += p->rv;
p->g += p->gv;
p->b += p->bv;
......@@ -191,6 +275,8 @@ static int particles_to_screen(lua_State *L)
p->xv += p->xa;
p->yv += p->ya;
p->dirv += p->dira;
p->velv += p->vela;
p->rv += p->ra;
p->gv += p->ga;
p->bv += p->ba;
......
......@@ -6,6 +6,7 @@
typedef struct {
float size, sizev, sizea;
float x, y, xv, yv, xa, ya;
float dir, dirv, dira, vel, velv, vela;
float r, g, b, a, rv, gv, bv, av, ra, ga, ba, aa;
int life;
} particle_type;
......@@ -15,6 +16,7 @@ typedef struct {
particle_type *particles;
int nb;
int texture_ref;
int generator_ref;
int base;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment