This commit is contained in:
Branimir Karadžić 2018-11-16 20:31:57 -08:00
Родитель 7639c5688c
Коммит b1752bc630
3 изменённых файлов: 42 добавлений и 53 удалений

Просмотреть файл

@ -416,7 +416,7 @@ public:
m_emitter[currentEmitter].update();
psUpdate(deltaTime * timeScale);
psRender(0, view, eye);
psRender(0, view, bx::load(eye) );
if (showBounds)
{

Просмотреть файл

@ -98,8 +98,8 @@ namespace ps
{
struct Particle
{
float start[3];
float end[2][3];
bx::Vec3 start;
bx::Vec3 end[2];
float blendStart;
float blendEnd;
float scaleStart;
@ -237,6 +237,8 @@ namespace ps
const uint32_t numParticles = uint32_t(m_dt / timePerParticle);
m_dt -= numParticles * timePerParticle;
constexpr bx::Vec3 up = { 0.0f, 1.0f, 0.0f };
float time = 0.0f;
for (uint32_t ii = 0
; ii < numParticles && m_num < m_max
@ -246,70 +248,67 @@ namespace ps
Particle& particle = m_particles[m_num];
m_num++;
const float up[3] = { 0.0f, 1.0f, 0.0f };
float pos[3];
bx::Vec3 pos;
switch (m_shape)
{
default:
case EmitterShape::Sphere:
bx::randUnitSphere(pos, &m_rng);
pos = bx::randUnitSphere(&m_rng);
break;
case EmitterShape::Hemisphere:
bx::randUnitHemisphere(pos, &m_rng, up);
pos = bx::randUnitHemisphere(&m_rng, up);
break;
case EmitterShape::Circle:
bx::randUnitCircle(pos, &m_rng);
pos = bx::randUnitCircle(&m_rng);
break;
case EmitterShape::Disc:
{
float tmp[3];
bx::randUnitCircle(tmp, &m_rng);
bx::vec3Mul(pos, tmp, bx::frnd(&m_rng) );
const bx::Vec3 tmp = bx::randUnitCircle(&m_rng);
pos = bx::mul(tmp, bx::frnd(&m_rng) );
}
break;
case EmitterShape::Rect:
pos[0] = bx::frndh(&m_rng);
pos[1] = 0.0f;
pos[2] = bx::frndh(&m_rng);
pos =
{
bx::frndh(&m_rng),
0.0f,
bx::frndh(&m_rng),
};
break;
}
float dir[3];
bx::Vec3 dir;
switch (m_direction)
{
default:
case EmitterDirection::Up:
bx::vec3Move(dir, up);
dir = up;
break;
case EmitterDirection::Outward:
bx::vec3Norm(dir, pos);
dir = bx::normalize(pos);
break;
}
float start[3];
float end[3];
const float startOffset = bx::lerp(m_uniforms.m_offsetStart[0], m_uniforms.m_offsetStart[1], bx::frnd(&m_rng) );
bx::vec3Mul(start, pos, startOffset);
const bx::Vec3 start = bx::mul(pos, startOffset);
const float endOffset = bx::lerp(m_uniforms.m_offsetEnd[0], m_uniforms.m_offsetEnd[1], bx::frnd(&m_rng) );
float tmp1[3];
bx::vec3Mul(tmp1, dir, endOffset);
bx::vec3Add(end, tmp1, start);
const bx::Vec3 tmp1 = bx::mul(dir, endOffset);
const bx::Vec3 end = bx::add(tmp1, start);
particle.life = time;
particle.lifeSpan = bx::lerp(m_uniforms.m_lifeSpan[0], m_uniforms.m_lifeSpan[1], bx::frnd(&m_rng) );
float gravity[3] = { 0.0f, -9.81f * m_uniforms.m_gravityScale * bx::square(particle.lifeSpan), 0.0f };
const bx::Vec3 gravity = { 0.0f, -9.81f * m_uniforms.m_gravityScale * bx::square(particle.lifeSpan), 0.0f };
bx::vec3MulMtx(particle.start, start, mtx);
bx::vec3MulMtx(particle.end[0], end, mtx);
bx::vec3Add(particle.end[1], particle.end[0], gravity);
particle.start = bx::mul(start, mtx);
particle.end[0] = bx::mul(end, mtx);
particle.end[1] = bx::add(particle.end[0], gravity);
bx::memCopy(particle.rgba, m_uniforms.m_rgba, BX_COUNTOF(m_uniforms.m_rgba)*sizeof(uint32_t) );
@ -323,7 +322,7 @@ namespace ps
}
}
uint32_t render(const float _uv[4], const float* _mtxView, const float* _eye, uint32_t _first, uint32_t _max, ParticleSort* _outSort, PosColorTexCoord0Vertex* _outVertices)
uint32_t render(const float _uv[4], const float* _mtxView, const bx::Vec3& _eye, uint32_t _first, uint32_t _max, ParticleSort* _outSort, PosColorTexCoord0Vertex* _outVertices)
{
bx::EaseFn easeRgba = bx::getEaseFunc(m_uniforms.m_easeRgba);
bx::EaseFn easePos = bx::getEaseFunc(m_uniforms.m_easePos);
@ -348,19 +347,13 @@ namespace ps
const float ttBlend = bx::clamp(easeBlend(particle.life), 0.0f, 1.0f);
const float ttRgba = bx::clamp(easeRgba(particle.life), 0.0f, 1.0f);
float p0[3];
bx::vec3Lerp(p0, particle.start, particle.end[0], ttPos);
float p1[3];
bx::vec3Lerp(p1, particle.end[0], particle.end[1], ttPos);
float pos[3];
bx::vec3Lerp(pos, p0, p1, ttPos);
const bx::Vec3 p0 = bx::lerp(particle.start, particle.end[0], ttPos);
const bx::Vec3 p1 = bx::lerp(particle.end[0], particle.end[1], ttPos);
const bx::Vec3 pos = bx::lerp(p0, p1, ttPos);
ParticleSort& sort = _outSort[current];
float tmp[3];
bx::vec3Sub(tmp, _eye, pos);
sort.dist = bx::sqrt(bx::vec3Dot(tmp, tmp) );
const bx::Vec3 tmp0 = bx::sub(_eye, pos);
sort.dist = bx::length(tmp0);
sort.idx = current;
uint32_t idx = uint32_t(ttRgba*4);
@ -378,12 +371,11 @@ namespace ps
uint32_t abgr = toAbgr(rr, gg, bb, aa);
float udir[3] = { _mtxView[0]*scale, _mtxView[4]*scale, _mtxView[8]*scale };
float vdir[3] = { _mtxView[1]*scale, _mtxView[5]*scale, _mtxView[9]*scale };
const bx::Vec3 udir = { _mtxView[0]*scale, _mtxView[4]*scale, _mtxView[8]*scale };
const bx::Vec3 vdir = { _mtxView[1]*scale, _mtxView[5]*scale, _mtxView[9]*scale };
PosColorTexCoord0Vertex* vertex = &_outVertices[current*4];
bx::vec3Sub(tmp, pos, udir);
bx::vec3Sub(&vertex->m_x, tmp, vdir);
bx::store(&vertex->m_x, bx::sub(bx::sub(pos, udir), vdir) );
aabbExpand(aabb, &vertex->m_x);
vertex->m_abgr = abgr;
vertex->m_u = _uv[0];
@ -391,8 +383,7 @@ namespace ps
vertex->m_blend = blend;
++vertex;
bx::vec3Add(tmp, pos, udir);
bx::vec3Sub(&vertex->m_x, tmp, vdir);
bx::store(&vertex->m_x, bx::sub(bx::add(pos, udir), vdir) );
aabbExpand(aabb, &vertex->m_x);
vertex->m_abgr = abgr;
vertex->m_u = _uv[2];
@ -400,8 +391,7 @@ namespace ps
vertex->m_blend = blend;
++vertex;
bx::vec3Add(tmp, pos, udir);
bx::vec3Add(&vertex->m_x, tmp, vdir);
bx::store(&vertex->m_x, bx::add(bx::add(pos, udir), vdir) );
aabbExpand(aabb, &vertex->m_x);
vertex->m_abgr = abgr;
vertex->m_u = _uv[2];
@ -409,8 +399,7 @@ namespace ps
vertex->m_blend = blend;
++vertex;
bx::vec3Sub(tmp, pos, udir);
bx::vec3Add(&vertex->m_x, tmp, vdir);
bx::store(&vertex->m_x, bx::add(bx::sub(pos, udir), vdir) );
aabbExpand(aabb, &vertex->m_x);
vertex->m_abgr = abgr;
vertex->m_u = _uv[0];
@ -534,7 +523,7 @@ namespace ps
m_num = numParticles;
}
void render(uint8_t _view, const float* _mtxView, const float* _eye)
void render(uint8_t _view, const float* _mtxView, const bx::Vec3& _eye)
{
if (0 != m_num)
{
@ -751,7 +740,7 @@ void psUpdate(float _dt)
s_ctx.update(_dt);
}
void psRender(uint8_t _view, const float* _mtxView, const float* _eye)
void psRender(uint8_t _view, const float* _mtxView, const bx::Vec3& _eye)
{
s_ctx.render(_view, _mtxView, _eye);
}

Просмотреть файл

@ -101,6 +101,6 @@ void psDestroyEmitter(EmitterHandle _handle);
void psUpdate(float _dt);
///
void psRender(uint8_t _view, const float* _mtxView, const float* _eye);
void psRender(uint8_t _view, const float* _mtxView, const bx::Vec3& _eye);
#endif // PARTICLE_SYSTEM_H_HEADER_GUARD