mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
A few more fixes to the heightfield tesselator
This commit is contained in:
parent
e399531009
commit
eb2aa16c66
@ -66,6 +66,42 @@ fix_heightfield(int size) {
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: HeightfieldTesselator::get_elevation
|
||||
// Access: Private
|
||||
// Description: Fetches the elevation at (x,y), where the input
|
||||
// coordinate is specified in pixels. This ignores the
|
||||
// current tesselation level and instead provides an
|
||||
// accurate number. Linear blending is used for
|
||||
// non-integral coordinates. The current vertical
|
||||
// scale is taken into account.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
double HeightfieldTesselator::
|
||||
get_elevation(double x, double y) {
|
||||
int scale = 7;
|
||||
int size = 1 << scale;
|
||||
fix_heightfield(size);
|
||||
int xlo = (int)x;
|
||||
int ylo = (int)y;
|
||||
if (xlo < 0) xlo = 0;
|
||||
if (ylo < 0) ylo = 0;
|
||||
if (xlo > _heightfield.get_x_size()-2)
|
||||
xlo = _heightfield.get_x_size()-2;
|
||||
if (ylo > _heightfield.get_y_size()-2)
|
||||
ylo = _heightfield.get_y_size()-2;
|
||||
int xhi = xlo+1;
|
||||
int yhi = ylo+1;
|
||||
double xoffs = x - xlo;
|
||||
double yoffs = y - ylo;
|
||||
double grayxlyl = _heightfield.get_gray(xlo,ylo);
|
||||
double grayxhyl = _heightfield.get_gray(xhi,ylo);
|
||||
double grayxlyh = _heightfield.get_gray(xlo,yhi);
|
||||
double grayxhyh = _heightfield.get_gray(xhi,yhi);
|
||||
double lerpyl = grayxhyl * xoffs + grayxlyl * (1.0 - xoffs);
|
||||
double lerpyh = grayxhyh * xoffs + grayxlyh * (1.0 - xoffs);
|
||||
return lerpyh * yoffs + lerpyl * (1.0 - yoffs);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: HeightfieldTesselator::get_vertex
|
||||
// Access: Private
|
||||
@ -342,10 +378,10 @@ count_triangles(int scale, int x, int y) {
|
||||
void HeightfieldTesselator::
|
||||
add_quad_to_strip(int v1, int v2, int v3, int v4) {
|
||||
if ((v1 != v2)&&(v2 != v3)&&(v1 != v3)) {
|
||||
_triangles->add_vertices(v1,v2,v3);
|
||||
_triangles->add_vertices(v1,v3,v2);
|
||||
}
|
||||
if ((v3 != v2)&&(v2 != v4)&&(v4 != v3)) {
|
||||
_triangles->add_vertices(v3,v2,v4);
|
||||
_triangles->add_vertices(v3,v4,v2);
|
||||
}
|
||||
// if ((v1 == _last_vertex_a)&&(v2 == _last_vertex_b)) {
|
||||
// _tristrip->add_vertices(v3,v4);
|
||||
|
@ -82,6 +82,8 @@ PUBLISHED:
|
||||
INLINE void set_horizontal_scale(double h);
|
||||
INLINE void set_vertical_scale(double v);
|
||||
INLINE void set_max_triangles(int n);
|
||||
|
||||
double get_elevation(double x, double y);
|
||||
|
||||
NodePath generate();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user