From 70b7233043074301a64198b286e0795fbfa1be31 Mon Sep 17 00:00:00 2001 From: Andreas Ortmann Date: Thu, 29 Sep 2016 09:05:35 +0200 Subject: [PATCH] nicer explosion effects --- game/renderer_polygon_3d/particle.frag | 3 ++ game/renderer_polygon_3d/particle.vert | 5 ++- game/renderer_polygon_3d/particle_batch.cpp | 4 +-- .../renderer_polygon_3d.cpp | 31 +++++++++++++------ 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/game/renderer_polygon_3d/particle.frag b/game/renderer_polygon_3d/particle.frag index 5a50944..558dc62 100644 --- a/game/renderer_polygon_3d/particle.frag +++ b/game/renderer_polygon_3d/particle.frag @@ -1,6 +1,7 @@ R"raw_string( #version 120 varying vec2 vertex; +varying vec2 velocity; uniform float maxAge; uniform float time; void main() @@ -10,6 +11,8 @@ void main() discard; } float decay = time / maxAge; + decay = 5.0*decay*decay; + // (length(10.0*velocity)); gl_FragColor = vec4(1.0/max(1.0, decay), 1.0/max(1.0, 6.0*decay), 0.0, 1.0); } )raw_string" \ No newline at end of file diff --git a/game/renderer_polygon_3d/particle.vert b/game/renderer_polygon_3d/particle.vert index e994997..9894d7b 100644 --- a/game/renderer_polygon_3d/particle.vert +++ b/game/renderer_polygon_3d/particle.vert @@ -3,15 +3,18 @@ R"raw_string( attribute vec2 in_vertex; attribute vec2 in_position; attribute vec2 in_velocity; +varying vec2 velocity; varying vec2 vertex; uniform float time; uniform float size; void main() { vec2 p = size*in_vertex; - p += time * in_velocity; + p += log(1.0+time) * in_velocity; p += in_position; gl_Position = vec4(p, 0.0, 1.0); + vertex = in_vertex; + velocity = in_velocity; } )raw_string" \ No newline at end of file diff --git a/game/renderer_polygon_3d/particle_batch.cpp b/game/renderer_polygon_3d/particle_batch.cpp index 3b44f1b..3a5b2d6 100644 --- a/game/renderer_polygon_3d/particle_batch.cpp +++ b/game/renderer_polygon_3d/particle_batch.cpp @@ -23,7 +23,7 @@ namespace endofthejedi { -1.0f, 1.0f, -1.0f, -1.0f}) { - std::cout<<"[ParticleBatch] create for " << numParticles << " num particles" << std::endl; + //std::cout<<"[ParticleBatch] create for " << numParticles << " num particles" << std::endl; m_data_position.resize(m_numParticles); m_data_velocity.resize(m_numParticles); @@ -88,7 +88,7 @@ namespace endofthejedi { void ParticleBatch::upload() { - std::cout<<"[ParticleBatch] upload to vbo's " << std::endl; + //std::cout<<"[ParticleBatch] upload to vbo's " << std::endl; glGenBuffers(4, m_data_vbos); // Generate buffer diff --git a/game/renderer_polygon_3d/renderer_polygon_3d.cpp b/game/renderer_polygon_3d/renderer_polygon_3d.cpp index f2eba30..75828e6 100644 --- a/game/renderer_polygon_3d/renderer_polygon_3d.cpp +++ b/game/renderer_polygon_3d/renderer_polygon_3d.cpp @@ -69,13 +69,13 @@ namespace endofthejedi { m_shader.bind(); - // TODO :Z? - renderPlanets(); renderShips(); renderMissiles(); + //glDisable(GL_DEPTH_TEST); renderParticles(); + //glEnable(GL_DEPTH_TEST); //glColor3f(1.0, 0.0, 0.0); //glBegin(GL_QUADS); @@ -102,11 +102,12 @@ namespace endofthejedi { for (size_t i=0; isetParticle(i, pos, v); } @@ -118,15 +119,25 @@ namespace endofthejedi { void RendererPolygon3d::advanceGraphicObjects(float dt) { + for (const game::Explosion *expl : m_state->explosions) { + if (expl->age == 0.0) { + addExplosionEffect(expl->position, 200, 3.0); + } + } + + std::vector rm; + for (ParticleBatch *batch : m_particles) { batch->tick(dt); if (batch->done()) { - m_particles.remove(batch); - delete(batch); - - std::cout<<"particle batch done!" << std::endl; + rm.push_back(batch); } } + + for (ParticleBatch *batch : rm) { + m_particles.remove(batch); + delete(batch); + } } void RendererPolygon3d::renderPlanets() @@ -203,15 +214,15 @@ namespace endofthejedi { // TODO: which visual size has the rocket? in game its just a point with // no size because all others have size. - return computeModelMatrix(missile->position, 0.05f, a); + return computeModelMatrix(missile->position, 0.03f, a); } glm::mat4 RendererPolygon3d::computeModelMatrix(const game::Ship *ship) { // TODO: rotate them before shooting, that looks better - //return computeModelMatrix(ship->position, m_state->shipRadius()); + glm::mat4 mat = computeModelMatrix(ship->position, m_state->shipRadius()); // XXX model is flipped - glm::mat4 mat = computeModelMatrix(ship->position, 0.3); + //glm::mat4 mat = computeModelMatrix(ship->position, 0.3); mat = glm::rotate(mat, (float) M_PI, glm::vec3(0.0f, 1.0f, 0.0f)); return mat; }