--- libgender/view.C 2004/10/18 12:24:29 1.60 +++ 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 () @@ -19,22 +21,22 @@ occ_query_objects.pop_back (); } else - glGenQueriesARB (1, &id); + glGenQueries (1, &id); - glBeginQueryARB (GL_SAMPLES_PASSED, id); + glBeginQuery (GL_SAMPLES_PASSED, id); return id; } inline void end_occ_query () { - glEndQueryARB (GL_SAMPLES_PASSED); + glEndQuery (GL_SAMPLES_PASSED); } static GLuint occ_query_result (GLuint id) { GLuint count; - glGetQueryObjectuivARB (id, GL_QUERY_RESULT, &count); + glGetQueryObjectuiv (id, GL_QUERY_RESULT, &count); occ_query_objects.push_back (id); return count; @@ -92,7 +94,6 @@ } return vs; - } void view::reset_projection () @@ -131,8 +132,7 @@ diagfact = sqrtf (3.);//D WHY??? glMultMatrixf (m); - glTranslatef (-p.x, -p.y, -p.z); - + glGetFloatv (GL_PROJECTION_MATRIX, m); frustum.l = plane ( m(3,0) + m(0,0), m(3,1) + m(0,1), m(3,2) + m(0,2), m(3,3) + m(0,3) ); @@ -160,16 +160,13 @@ glMatrixMode (GL_MODELVIEW); glLoadIdentity (); + glTranslatef (-p.x, -p.y, -p.z); } void view::begin () { generation++; - glColorMask (1, 1, 1, 1); - glDepthMask (1); - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - vislist.clear (); z_near = max (nz_near, 1.F); @@ -178,7 +175,7 @@ reset_projection (); - nz_near = 1e37; + nz_near = 100.; nc_far = nz_far = 1.F; } @@ -189,13 +186,23 @@ #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); + glDepthMask (1); + + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + //glEnable (GL_STENCIL_TEST); // for depth-passes + //glStencilOp (GL_KEEP, GL_KEEP, GL_REPLACE); + //glStencilFunc (GL_LESS, 1, 255); + //glEnable (GL_POLYGON_OFFSET_FILL); //glPolygonOffset (0, 5); glDisable (GL_MINMAX); @@ -203,12 +210,10 @@ glDepthFunc (GL_LESS); glEnable (GL_DEPTH_TEST); glColorMask (0, 0, 0, 0); - glDepthMask (1); glDisable (GL_DEPTH_CLAMP_NV); - world.depth_pass (*this); + world.detect_visibility (*this); - 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 break; case POSTDEPTH: @@ -217,6 +222,7 @@ glColorMask (0, 0, 0, 0); glDepthMask (0); glEnable (GL_DEPTH_CLAMP_NV); + glDisable (GL_STENCIL_TEST); // check occlusion queries for (vector::iterator i = occ_queries.begin (); i != occ_queries.end (); ++i) @@ -227,12 +233,11 @@ occ_queries.clear (); - for (vector::iterator i = vislist.begin (); i != vislist.end (); ++i) - (*i)->display (*this); - break; case LIGHTED: + glClear (GL_STENCIL_BUFFER_BIT); + //glEnable (GL_STENCIL_TEST); glEnable (GL_MINMAX); glDepthRange (0., 1. - DEPTH_OFFSET); glDepthFunc (GL_LESS); @@ -240,12 +245,15 @@ glDepthMask (0); glDisable (GL_DEPTH_CLAMP_NV); - for (vector::iterator i = vislist.begin (); i != vislist.end (); ++i) - (*i)->display (*this); - break; } + for (vector::iterator i = vislist.begin (); i != vislist.end (); ++i) + (*i)->display (*this); + + 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 (); #if 0 @@ -267,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; +} +