--- libgender/view.C 2004/10/29 23:27:02 1.66 +++ libgender/view.C 2004/11/04 04:46:58 1.71 @@ -7,6 +7,8 @@ using namespace gl; +pass pass_depth (0); + vector occ_query_objects; static GLuint begin_occ_query () @@ -130,7 +132,6 @@ diagfact = sqrtf (3.);//D WHY??? glMultMatrixf (m); - glTranslatef (-p.x, -p.y, -p.z); glGetFloatv (GL_PROJECTION_MATRIX, m); @@ -159,6 +160,7 @@ glMatrixMode (GL_MODELVIEW); glLoadIdentity (); + glTranslatef (-p.x, -p.y, -p.z); } void view::begin () @@ -184,11 +186,12 @@ #define DEPTH_OFFSET (1. / (GLdouble)(1L << 16)) -void view::render (enum pass p) +void view::render (enum pass_type p, pass &data) { - pass = p; + pass_type = p; + pass_data = &data; - switch (pass) + switch (pass_type) { case DEPTH: glColorMask (1, 1, 1, 1); @@ -248,7 +251,7 @@ for (vector::iterator i = vislist.begin (); i != vislist.end (); ++i) (*i)->display (*this); - if (pass == LIGHTED) + if (pass_type == DEPTH) printf ("fps %f NF %f:%f vis %d CAM (%d,%d,%d)\n", timer.fps, z_near, z_far, drawn.size (), orig.x, orig.y, orig.z);//D drawn.clear (); @@ -272,4 +275,34 @@ #endif } +void light::enable () +{ + lightpos->set (p); +} + +void light::disable () +{ +} + +static shader::varying_1f camdist; +static shader::varying_3f lightvec; + +void linear_light::vsh () +{ + using namespace shader::compile; + + lightvec = xyz (lightpos - model_view_matrix * vin.vertex); + camdist = max (1 - length (lightvec) / radius, 0); +} + +shader::temp_3f linear_light::operator ()() +{ + using namespace shader::compile; + + temp_3f res; + res = float3 (c.r / 255.F, c.g / 255.F, c.b / 255.F) * (min (intensity * camdist * 0.6F + 0.9F, 1.F)); + + return res; +} +