explosions make light now.
This commit is contained in:
parent
544282dd84
commit
fc2d4c5028
7 changed files with 81 additions and 13 deletions
|
@ -10,6 +10,10 @@ uniform vec3 materialColor;
|
|||
uniform int materialKind;
|
||||
uniform int materialSeed;
|
||||
|
||||
uniform int explLightsNum;
|
||||
uniform vec3 explLightsPos[10];
|
||||
uniform float explLightsIntensities[10];
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 Eye = normalize(-vertex);
|
||||
|
@ -27,7 +31,31 @@ void main()
|
|||
vec3 color = materialColor;
|
||||
color = max(vec3(0.0), min(vec3(1.0), color));
|
||||
|
||||
vec3 IDiffuse = vec3(color) * lightColor * max(dot(normal, lightDirection), 0.0);
|
||||
//vec3 light = lightColor * max(dot(normal, lightDirection), 0.0);
|
||||
vec3 light = vec3(0.0);
|
||||
|
||||
int i;
|
||||
for (i=0; i<explLightsNum; i++) {
|
||||
vec3 explLightColor = vec3(1.0, 0.8, 0.3);
|
||||
vec3 diff = vertex - explLightsPos[i];
|
||||
float l = 10.0*length(diff);
|
||||
float dir = max(0.0, -dot(normal, diff));
|
||||
float dp = max(0.0, 1.0-l);
|
||||
|
||||
float intensity = 10.0;
|
||||
if (dp == 0.0) {
|
||||
intensity *= dir;
|
||||
} else {
|
||||
intensity *= dp;
|
||||
}
|
||||
intensity /= 1.0 + 0.5*l*l;
|
||||
|
||||
light += intensity * pow(explLightsIntensities[i], 2.0) * explLightColor;
|
||||
}
|
||||
|
||||
light = max(vec3(0.0), light);
|
||||
|
||||
vec3 IDiffuse = vec3(color) * light;
|
||||
|
||||
// TODO make instensity/exponent as parameter
|
||||
//vec3 ISpecular = lightColor * 5.0 * pow(max(dot(Reflected, Eye), 0.0), 2.0);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#version 120
|
||||
varying vec3 position;
|
||||
varying vec2 vertex;
|
||||
varying vec3 velocity;
|
||||
varying float decay;
|
||||
|
|
|
@ -14,7 +14,6 @@ varying float decay;
|
|||
varying vec3 velocity;
|
||||
varying vec2 vertex;
|
||||
varying float explCenterDist;
|
||||
varying vec3 position;
|
||||
|
||||
uniform float aspectRatio;
|
||||
|
||||
|
@ -47,7 +46,6 @@ void main()
|
|||
|
||||
vertex = base.xy;
|
||||
velocity = in_velocity;
|
||||
position = in_position;
|
||||
|
||||
explCenterDist = length(explCenter - offset);
|
||||
}
|
|
@ -15,8 +15,13 @@ namespace endofthejedi {
|
|||
: m_id(id)
|
||||
, m_numParticles(numParticles)
|
||||
, m_particleRadius(particleSize)
|
||||
, m_halfAge(halfAge)
|
||||
, m_age(0.0)
|
||||
, m_halfAge(halfAge)
|
||||
|
||||
// XXX this is used in some places in the shader.
|
||||
// set it via uniform too
|
||||
, m_maxNumHalfAges(5.0)
|
||||
|
||||
, m_maxVelocity(1.0)
|
||||
, m_center(glm::vec3(0.0f, 0.0f, 0.0f))
|
||||
|
||||
|
@ -207,6 +212,6 @@ namespace endofthejedi {
|
|||
|
||||
bool ParticleBatch::done() const
|
||||
{
|
||||
return m_age >= 5.0*m_halfAge;
|
||||
return m_age >= m_maxNumHalfAges*m_halfAge;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,10 +36,15 @@ namespace endofthejedi {
|
|||
void render(Shader *shader);
|
||||
|
||||
void tick(float dt);
|
||||
float ageNormalized() const { return m_age / (m_maxNumHalfAges*m_halfAge); }
|
||||
float age() const { return m_age; }
|
||||
bool done() const;
|
||||
|
||||
size_t id() const { return m_id; }
|
||||
|
||||
|
||||
const glm::vec3 &explosionCenter() const { return m_center; }
|
||||
|
||||
private:
|
||||
size_t dataSizeForIndex(size_t index);
|
||||
void *dataSourceForIndex(size_t index);
|
||||
|
@ -51,8 +56,9 @@ namespace endofthejedi {
|
|||
// uniforms for the shader
|
||||
size_t m_numParticles;
|
||||
float m_particleRadius;
|
||||
const float m_halfAge;
|
||||
float m_age;
|
||||
const float m_halfAge;
|
||||
const float m_maxNumHalfAges;
|
||||
float m_maxVelocity;
|
||||
glm::vec3 m_center;
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ namespace endofthejedi {
|
|||
|
||||
//addModel("../data/mesh/small_atomic_bomb.stl", &m_missileModel);
|
||||
addModel("../data/mesh/rocket.stl", &m_missileModel);
|
||||
addModel("../data/mesh/planet_12.stl", &m_planetModel);
|
||||
addModel("../data/mesh/planet_128.stl", &m_planetModel);
|
||||
addModel("../data/mesh/ship_ufo.stl", &m_shipModel);
|
||||
}
|
||||
|
||||
|
@ -60,7 +60,7 @@ namespace endofthejedi {
|
|||
// TODO: add ONE sun planet
|
||||
// TODO: add lights for explosions
|
||||
|
||||
configureLightningInShader();
|
||||
configureLightningInShader(&m_shader_game_objects);
|
||||
|
||||
//std::cout<<"setting aspect ratio: " << m_aspectRatio << std::endl;
|
||||
glUniform1f(m_shader_game_objects.location("aspectRatio"), m_aspectRatio);
|
||||
|
@ -452,7 +452,7 @@ namespace endofthejedi {
|
|||
glPolygonMode(GL_FRONT, GL_FILL);
|
||||
}
|
||||
|
||||
void RendererPolygon3d::configureLightningInShader()
|
||||
void RendererPolygon3d::configureLightningInShader(Shader *shader) const
|
||||
{
|
||||
// TODO: add a few small lights for explosions so they lit the
|
||||
// surroundsings
|
||||
|
@ -469,8 +469,40 @@ namespace endofthejedi {
|
|||
}
|
||||
}
|
||||
|
||||
glUniform3f(m_shader_game_objects.location("lightPosition"), p.x, p.y, p.z);
|
||||
glUniform3f(m_shader_game_objects.location("lightColor"), c.x, c.y, c.z);
|
||||
glUniform3f(shader->location("lightPosition"), p.x, p.y, p.z);
|
||||
glUniform3f(shader->location("lightColor"), c.x, c.y, c.z);
|
||||
|
||||
std::vector<glm::vec3> positions;
|
||||
std::vector<float> intensities;
|
||||
|
||||
size_t numExplLights = 0;
|
||||
|
||||
for (ParticleBatch *batch : m_particles) {
|
||||
float age = batch->ageNormalized();
|
||||
// TODO: use function with a peak for this:
|
||||
//
|
||||
// /\__
|
||||
// _/ \--____
|
||||
|
||||
float intensity = 1.0-age;
|
||||
glm::vec3 p = batch->explosionCenter();
|
||||
|
||||
intensities.push_back(intensity);
|
||||
positions.push_back(p);
|
||||
|
||||
numExplLights++;
|
||||
|
||||
if (numExplLights == 10) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
glUniform1i( shader->location("explLightsNum"), numExplLights);
|
||||
|
||||
if (numExplLights != 0) {
|
||||
glUniform3fv(shader->location("explLightsPos"), numExplLights, glm::value_ptr(positions[0]));
|
||||
glUniform1fv(shader->location("explLightsIntensities"), numExplLights, intensities.data());
|
||||
}
|
||||
}
|
||||
|
||||
void RendererPolygon3d::setWindowSize(int px, int py)
|
||||
|
|
|
@ -59,7 +59,7 @@ namespace endofthejedi {
|
|||
|
||||
void renderTraces();
|
||||
|
||||
void configureLightningInShader();
|
||||
void configureLightningInShader(Shader *shader) const;
|
||||
|
||||
private:
|
||||
// all models are also here (for easy reloading etc.)
|
||||
|
|
Loading…
Reference in a new issue