remove charles' projection matrix adjustments, they arent correct

This commit is contained in:
georges 2001-02-09 01:47:07 +00:00
parent 49d65e117b
commit 9847efb688

View File

@ -925,6 +925,7 @@ draw_sprite(const GeomSprite *geom) {
// get the array traversal set up. // get the array traversal set up.
int nprims = geom->get_num_prims(); int nprims = geom->get_num_prims();
Geom::VertexIterator vi = geom->make_vertex_iterator(); Geom::VertexIterator vi = geom->make_vertex_iterator();
Geom::ColorIterator ci = geom->make_color_iterator(); Geom::ColorIterator ci = geom->make_color_iterator();
@ -944,27 +945,35 @@ draw_sprite(const GeomSprite *geom) {
hfov = _actual_display_region->get_camera()->get_hfov(); hfov = _actual_display_region->get_camera()->get_hfov();
aspect_ratio = _actual_display_region->get_camera()->get_aspect(); aspect_ratio = _actual_display_region->get_camera()->get_aspect();
// to assure that the scale between the two frustra stays the same
// (if they are different, sprites move at different speeds than the world),
// we have to apply the frustum inverse to the point, then render it in our
// own frustum. Since the z values are identical and 1:1, we only need
// concern ourselves with the x and y mappings, which are conveniently linear.
float x_frustum_scale, y_frustum_scale;
float recip_x_frustum_scale, recip_y_frustum_scale;
// extract the left and top bounds of the current camera
x_frustum_scale = tanf(hfov * 0.5f * (3.1415926f / 180.0f)) * tnear;
recip_x_frustum_scale = 1.0f / x_frustum_scale;
y_frustum_scale = x_frustum_scale / aspect_ratio;
recip_y_frustum_scale = 1.0f / y_frustum_scale;
// load up our own matrices // load up our own matrices
// Note on DO_CHARLES_PROJECTION_MAT
// apparently adjusting the projection as done below is incorrect
// as long as the camera points forward at the view plane, no distortion/warping
// will be apparent, which is what this special projection was supposed to correct
#ifdef DO_CHARLES_PROJECTION_MAT
// to assure that the scale between the two frustra stays the same
// (if they are different, sprites move at different speeds than the world),
// we have to apply the frustum inverse to the point, then render it in our
// own frustum. Since the z values are identical and 1:1, we only need
// concern ourselves with the x and y mappings, which are conveniently linear.
float x_frustum_scale, y_frustum_scale;
float recip_x_frustum_scale, recip_y_frustum_scale;
// extract the left and top bounds of the current camera
x_frustum_scale = tanf(hfov * 0.5f * (3.1415926f / 180.0f)) * tnear;
recip_x_frustum_scale = 1.0f / x_frustum_scale;
y_frustum_scale = x_frustum_scale / aspect_ratio;
recip_y_frustum_scale = 1.0f / y_frustum_scale;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, tnear, tfar);
#endif
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(LMatrix4f::ident_mat().get_data());
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, tnear, tfar);
// precomputation stuff // precomputation stuff
float half_width = 0.5f * (float) tex->_pbuffer->get_xsize(); float half_width = 0.5f * (float) tex->_pbuffer->get_xsize();
@ -1001,7 +1010,7 @@ draw_sprite(const GeomSprite *geom) {
// inner loop vars // inner loop vars
int i; int i;
Vertexf source_vert, cameraspace_vert; Vertexf source_vert, cameraspace_vert;
float x, y, z, *x_walk, *y_walk, *theta_walk; float *x_walk, *y_walk, *theta_walk;
float theta; float theta;
nassertv(geom->get_x_bind_type() != G_PER_VERTEX); nassertv(geom->get_x_bind_type() != G_PER_VERTEX);
@ -1049,19 +1058,27 @@ draw_sprite(const GeomSprite *geom) {
// the state is set, start running the prims // the state is set, start running the prims
for (i = 0; i < nprims; i++) { for (i = 0; i < nprims; i++) {
WrappedSprite ws;
source_vert = geom->get_next_vertex(vi); source_vert = geom->get_next_vertex(vi);
// this mult converts to y-up cameraspace. // this mult converts to y-up cameraspace.
cameraspace_vert = modelview_mat * source_vert; cameraspace_vert = modelview_mat * source_vert;
z = cameraspace_vert[2];
#ifdef DO_CHARLES_PROJECTION_MAT
float x,y,z;
// do the inverse transform on the cameraspace point. // do the inverse transform on the cameraspace point.
x = cameraspace_vert[0] * recip_x_frustum_scale; x = cameraspace_vert[0] ;//* recip_x_frustum_scale;
y = cameraspace_vert[1] * recip_y_frustum_scale; y = cameraspace_vert[1] ;//* recip_y_frustum_scale;
z = cameraspace_vert[2];
// build the final object that will go into the vector. // build the final object that will go into the vector.
WrappedSprite ws;
ws._v.set(x, y, z); ws._v.set(x, y, z);
#else
// build the final object that will go into the vector.
ws._v.set(cameraspace_vert[0],cameraspace_vert[1],cameraspace_vert[2]);
#endif
if (color_overall == false) if (color_overall == false)
ws._c = geom->get_next_color(ci); ws._c = geom->get_next_color(ci);
@ -1088,9 +1105,6 @@ draw_sprite(const GeomSprite *geom) {
int tex_bottom = 0, tex_top = 1, tex_right = 1, tex_left = 0; int tex_bottom = 0, tex_top = 1, tex_right = 1, tex_left = 0;
Vertexf ul, ur, ll, lr; Vertexf ul, ur, ll, lr;
// float top, bottom, left, right;
// float sin_theta, cos_theta, radians;
// float final_left, final_right, final_top, final_bottom;
if (color_overall == true) if (color_overall == true)
glColor4fv(geom->get_next_color(ci).get_data()); glColor4fv(geom->get_next_color(ci).get_data());
@ -1155,11 +1169,12 @@ draw_sprite(const GeomSprite *geom) {
} }
// restore the matrices // restore the matrices
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(modelview_mat.get_data()); glLoadMatrixf(modelview_mat.get_data());
glMatrixMode(GL_PROJECTION); #ifdef DO_CHARLES_PROJECTION_MAT
glLoadMatrixf(_current_projection_mat.get_data()); glMatrixMode(GL_PROJECTION);
glLoadMatrixf(_current_projection_mat.get_data());
#endif
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////