Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Goers <mega@osirion.org>2012-01-24 06:44:19 +0000
committerEvan Goers <mega@osirion.org>2012-01-24 06:44:19 +0000
commit5d4e993e485ae3432eabb45caf4e4d43c9bc54e6 (patch)
tree2369f024c56e9211d95d10bc86d3220f21443137 /src/render
parentd20adb868fe02e9e7aa8a262b3cd4c5dd01d5eea (diff)
Added a 'specular' material parameter. Defaults to 'color' values.
Tweaked lighting a bit.
Diffstat (limited to 'src/render')
-rw-r--r--src/render/draw.cc6
-rw-r--r--src/render/gl.cc5
-rw-r--r--src/render/gl.h3
-rw-r--r--src/render/state.cc34
4 files changed, 27 insertions, 21 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc
index e40e3cc..ec4f386 100644
--- a/src/render/draw.cc
+++ b/src/render/draw.cc
@@ -124,15 +124,15 @@ void pass_prepare(float seconds)
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.8;
- specular_light[i] = globe->color()[i] * 0.4;
+ 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(GL_LIGHT0, GL_LINEAR_ATTENUATION, ((globe->color()[0] + globe->color()[1] + globe->color()[2]) / 3.0f) * 0.0001f);
+ glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, ((globe->color()[0] + globe->color()[1] + globe->color()[2]) / 3.0f) * 0.00025f);
glLightfv(GL_LIGHT0, GL_POSITION, zone_light);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light);
diff --git a/src/render/gl.cc b/src/render/gl.cc
index 3c672cd..48b9b52 100644
--- a/src/render/gl.cc
+++ b/src/render/gl.cc
@@ -223,6 +223,11 @@ void color(Color const & color)
glColor4fv(color.ptr());
}
+void specular(Color const & specular)
+{
+ glMaterialfv(GL_FRONT, GL_SPECULAR, specular.ptr());
+}
+
void matrixmode(GLenum mode)
{
glMatrixMode(mode);
diff --git a/src/render/gl.h b/src/render/gl.h
index 31609ad..4dea544 100644
--- a/src/render/gl.h
+++ b/src/render/gl.h
@@ -235,6 +235,9 @@ void color(math::Color const & color);
*/
void color(const float r, const float g, const float b, const float a = 1.0f);
+/// specify the specular reflectivity color
+void specular(math::Color const & specular);
+
/// Push the current transformation matrix to the stack
void push();
diff --git a/src/render/state.cc b/src/render/state.cc
index dcf62f3..8d1f3b0 100644
--- a/src/render/state.cc
+++ b/src/render/state.cc
@@ -207,16 +207,18 @@ void State::set_power(const bool power)
void State::use_material(const model::Material * material) {
math::Color color;
+ math::Color specular;
reset();
- // material settings
+ // default specular shininess setting
glMateriali(GL_FRONT, GL_SHININESS, 8);
- GLfloat specular_reflectance[3];
if (!material) {
color.assign(1.0f, 0.0f, 1.0f);
+ specular.assign(1.0f, 0.0f, 1.0f);
gl::color(color);
+ gl::specular(specular);
return;
}
@@ -233,28 +235,37 @@ void State::use_material(const model::Material * material) {
// use current engine color
color.assign(state_color_engine);
+ specular.assign(0.0f);
} else if (material->flags() & model::Material::Tertiary) {
// use entity colors
if ((material->flags() & model::Material::Tertiary) == model::Material::Tertiary) {
- for (size_t i = 0; i < 3; i++)
+ for (size_t i = 0; i < 3; i++) {
color[i] = (state_color_primary[i] + state_color_secondary[i]) / 2;
+ specular[i] = (state_color_primary[i] + state_color_secondary[i]) / 2;
+ }
} else if ((material->flags() & model::Material::Secondary) == model::Material::Secondary) {
color.assign(state_color_secondary);
+ specular.assign(state_color_secondary);
} else if ((material->flags() & model::Material::Primary) == model::Material::Primary) {
color.assign(state_color_primary);
+ specular.assign(state_color_primary);
}
color.r *= material->color().r;
color.g *= material->color().g;
color.b *= material->color().b;
-
+ specular.r *= material->specular().r;
+ specular.g *= material->specular().g;
+ specular.b *= material->specular().b;
+
} else {
// use material color
color.assign(material->color());
+ specular.assign(material->specular());
}
// lighted or fullbright
@@ -298,25 +309,12 @@ void State::use_material(const model::Material * material) {
} else {
color.assign(0.0f, 0.0f, 0.0f);
}
- specular_reflectance[0] = 1.0f;
- specular_reflectance[1] = 1.0f;
- specular_reflectance[2] = 1.0f;
-
glMateriali(GL_FRONT, GL_SHININESS, 4);
- glMaterialfv(GL_FRONT, GL_SPECULAR, specular_reflectance);
-
- gl::color(color);
- return;
}
}
- specular_reflectance[0] = color.r;
- specular_reflectance[1] = color.g;
- specular_reflectance[2] = color.b;
-
- glMaterialfv(GL_FRONT, GL_SPECULAR, specular_reflectance);
-
gl::color(color);
+ gl::specular(specular);
}
void State::reset() {