diff options
Diffstat (limited to 'src/render/draw.cc')
-rw-r--r-- | src/render/draw.cc | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc index 71b8631..5d960fe 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -46,8 +46,10 @@ math::Vector3f v6(-1, 1, -1); math::Vector3f v7(-1, -1, -1); core::Zone *zone = 0; -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 + +math::Vector3f zone_light_location; // location of the zone light +math::Color zone_light_color; // color of the zone light + bool has_zone_light = false; bool draw_particles = true; @@ -66,14 +68,17 @@ Globes globes_list; /* ---- Prepare the renderer state --------------------------------- */ void pass_reset_lights() -{ +{ // reset light state + has_zone_light = false; + zone_light_color.assign(1.0); + for (size_t i = 0; i < max_lights; i++) gl::disable(GL_LIGHT0 + i); } -// Lights -int add_light(float* location, float attenuation, math::Color color) +// setup an OpenGL light +int add_light(const math::Vector3f & location, float attenuation, const math::Color & color) { int gllight; @@ -135,8 +140,6 @@ void pass_prepare(float seconds) // initialize lights pass_reset_lights(); - has_zone_light = false; - zone_color.assign(1.0); // clear current list of globes globes_list.clear(); @@ -166,14 +169,13 @@ void pass_prepare(float seconds) globes_list[ext_render(globe)->distance()] = globe; } - // add level lights - + // add zone lights if (globe->flag_is_set(core::Entity::Bright)) { for (size_t i = 0; i < 3; i++) { - zone_light[i] = globe->location()[i]; - zone_color[i] = globe->color()[i]; + zone_light_location[i] = globe->location()[i]; + zone_light_color[i] = globe->color()[i]; } - GLenum zone_gllight = add_light(zone_light, 0.00025f, globe->color()); + GLenum zone_gllight = add_light(zone_light_location, 0.00025f, globe->color()); gl::enable(zone_gllight); has_zone_light = true; } @@ -268,7 +270,7 @@ void draw_pass_sky() /* ---- Globes ----------------------------------------------------- */ -void draw_sphere(math::Color const & color, float radius) +void draw_sphere(const math::Color & color, float radius) { gl::scale(radius, radius, radius); gl::color(color); @@ -345,13 +347,14 @@ void draw_pass_globes() gl::depthmask(GL_FALSE); if (has_zone_light) { - // move zone light - float fake_light[4]; + // nudge zone light + // FIXME doesn't work correctly with multiple zone lights + float fake_light_location[4]; for (size_t i = 0; i < 3; i++) { - fake_light[i] = zone_light[i] + location[i] - globe->location()[i]; + fake_light_location[i] = zone_light_location[i] + location[i] - globe->location()[i]; } - fake_light[3] = 1.0f; - glLightfv(zone_gllight, GL_POSITION, fake_light); + fake_light_location[3] = 1.0f; + glLightfv(zone_gllight, GL_POSITION, fake_light_location); } } @@ -398,7 +401,7 @@ void draw_pass_globes() if (has_zone_light) { // restore zone light - glLightfv(zone_gllight, GL_POSITION, zone_light); + glLightfv(zone_gllight, GL_POSITION, zone_light_location.ptr()); } } } @@ -1222,7 +1225,7 @@ void draw(float seconds) draw_pass_spacegrid(); // draw the blue spacegrid if (!core::localplayer()->view()) { - Dust::draw(zone_color); // draw spacedust + Dust::draw(zone_light_color); // draw spacedust } // draw entity lights, flares and particles @@ -1282,6 +1285,9 @@ void draw(float seconds) // GL_BLEND and GL_COLOR_MATERIAL must be enabled for the GUI //gl::disable(GL_COLOR_MATERIAL); // disable color tracking + + // reset light state + pass_reset_lights(); } // draw HUD target world space geometry, like dock indicators |