diff options
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/draw.cc | 84 | ||||
-rw-r--r-- | src/render/draw.h | 3 |
2 files changed, 55 insertions, 32 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc index 2efa411..3b7acad 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -46,14 +46,15 @@ math::Vector3f v6(-1, 1, -1); math::Vector3f v7(-1, -1, -1); core::Zone *zone = 0; -float zone_light[4]; // locaton of the zone light +float zone_light[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // location of the zone light math::Color zone_color; // color of the zone light bool has_zone_light = false; bool draw_particles = true; bool draw_lights = true; +size_t max_lights = 8; -GLenum zone_gllight = GL_LIGHT0 + 6; //FIXME super magic number bros +GLenum zone_gllight = GL_LIGHT0; typedef std::map<float, core::EntityGlobe *> Globes; Globes globes_list; @@ -63,10 +64,56 @@ Globes globes_list; void pass_reset_lights() { // reset light state - for (size_t i = 0; i < 8; i++) + for (size_t i = 0; i < max_lights; i++) gl::disable(GL_LIGHT0 + i); } +// Lights +int create_light(float* location, float attenuation, math::Color color) +{ + int gllight; + + // check if a light is available + for (size_t i = 0; i < max_lights; i++) { + if (!glIsEnabled(GL_LIGHT0 + i)) { + gllight = GL_LIGHT0 + i; + break; + } + else { + gllight = GL_LIGHT0; + return gllight; + } + } + + // set up color and location + GLfloat gllight_location[4]; + GLfloat diffuse_light[4]; + GLfloat ambient_light[4]; + GLfloat specular_light[4]; + + for (size_t i = 0; i < 3; i++) { + gllight_location[i] = location[i]; + ambient_light[i] = color[i] * 0.1; + diffuse_light[i] = color[i] * 0.75; + specular_light[i] = color[i] * 0.75; + } + gllight_location[3] = 1.0f; + ambient_light[3] = 1.0f; + diffuse_light[3] = 1.0f; + specular_light[3] = 1.0f; + + // set up the light + // we use a simple averaging of the color times the specified attenuation value(such as 0.00025f). + // FIXME: use a more standardized and realistic way of doing this. + glLightf(gllight, GL_LINEAR_ATTENUATION, ((color[0] + color[1] + color[2]) / 3.0f) * attenuation); + + glLightfv(gllight, GL_POSITION, gllight_location); + glLightfv(gllight, GL_AMBIENT, ambient_light); + glLightfv(gllight, GL_DIFFUSE, diffuse_light); + glLightfv(gllight, GL_SPECULAR, specular_light); + return gllight; +} + void pass_prepare(float seconds) { using namespace model; @@ -116,41 +163,14 @@ void pass_prepare(float seconds) } // add level lights + if (globe->flag_is_set(core::Entity::Bright)) { - for (size_t i = 0; i < 8; i++) { - // check if a light is available - if (!glIsEnabled(GL_LIGHT0 + i)) { - zone_gllight = GL_LIGHT0 + i; - break; - } - } - - // bright globes set level light - GLfloat diffuse_light[4]; - GLfloat ambient_light[4]; - GLfloat specular_light[4]; - for (size_t i = 0; i < 3; i++) { zone_light[i] = globe->location()[i]; zone_color[i] = globe->color()[i]; - ambient_light[i] = globe->color()[i] * 0.1; - diffuse_light[i] = globe->color()[i] * 0.75; - specular_light[i] = globe->color()[i] * 0.75; } - zone_light[3] = 1.0f; - ambient_light[3] = 1.0f; - diffuse_light[3] = 1.0f; - specular_light[3] = 1.0f; - - glLightf(zone_gllight, GL_LINEAR_ATTENUATION, ((globe->color()[0] + globe->color()[1] + globe->color()[2]) / 3.0f) * 0.00025f); - - glLightfv(zone_gllight, GL_POSITION, zone_light); - glLightfv(zone_gllight, GL_AMBIENT, ambient_light); - glLightfv(zone_gllight, GL_DIFFUSE, diffuse_light); - glLightfv(zone_gllight, GL_SPECULAR, specular_light); - + GLenum zone_gllight = create_light(zone_light, 0.00025f, globe->color()); gl::enable(zone_gllight); - has_zone_light = true; } diff --git a/src/render/draw.h b/src/render/draw.h index bc02bf5..e35c7c5 100644 --- a/src/render/draw.h +++ b/src/render/draw.h @@ -26,6 +26,9 @@ void draw_target(const core::Entity *entity); /// reset void reset(); +/// create light +int create_light(float* location, float attenuation, math::Color color); + /// draw a sphere void draw_sphere(math::Color const & color, float radius); |