Create normals and actually use texture
This commit is contained in:
parent
71c1b73ec3
commit
9737818f81
2 changed files with 76 additions and 29 deletions
|
@ -92,6 +92,9 @@ private:
|
|||
// Create height lines for the level "level"
|
||||
void create_level_line(int level);
|
||||
|
||||
void push_point(int x, int y);
|
||||
vec3d create_point(int x, int y);
|
||||
vec2d texture_coord(int x, int y);
|
||||
|
||||
// Load the height map from the file "filename"
|
||||
bool load_heightmap(const char *filename);
|
||||
|
|
|
@ -112,8 +112,9 @@ void terrain::render_solid_terrain()
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE0, texture_handle);
|
||||
|
||||
// Set the material color to white
|
||||
glColor3d(1, 1, 1);
|
||||
|
@ -147,7 +148,12 @@ void terrain::render_wireframe_terrain()
|
|||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
}
|
||||
|
||||
|
||||
void terrain::push_point(int x, int y)
|
||||
{
|
||||
set_normal(x, y);
|
||||
glTexCoord2dv(texture_coord(x, y));
|
||||
glVertex3dv(create_point(x, y));
|
||||
}
|
||||
|
||||
// Render the terrain
|
||||
void terrain::render_terrain()
|
||||
|
@ -214,8 +220,8 @@ void terrain::render_terrain()
|
|||
|
||||
// Draw one strip
|
||||
for (int x = 0; x < map_width; x++) {
|
||||
glVertex3f(static_cast<float>(x), get_heightmap_value(x, y), static_cast<float>(y));
|
||||
glVertex3f(static_cast<float>(x), get_heightmap_value(x, y + 1), static_cast<float>(y) + 1.0f);
|
||||
push_point(x, y);
|
||||
push_point(x, y + 1);
|
||||
}
|
||||
|
||||
glEnd();
|
||||
|
@ -224,8 +230,30 @@ void terrain::render_terrain()
|
|||
glPopMatrix();
|
||||
}
|
||||
|
||||
vec2d terrain::texture_coord(int x, int y)
|
||||
{
|
||||
return vec2d(
|
||||
static_cast<double>(x) / static_cast<double>(get_heightmap_width()),
|
||||
static_cast<double>(y) / static_cast<double>(get_heightmap_height())
|
||||
);
|
||||
}
|
||||
|
||||
vec3d terrain::create_point(int x, int y)
|
||||
{
|
||||
return vec3d(
|
||||
static_cast<double>(x),
|
||||
static_cast<double>(get_heightmap_value(x, y)),
|
||||
static_cast<double>(y)
|
||||
);
|
||||
}
|
||||
|
||||
vec3d calculate_normal(vec3d middle, vec3d p0, vec3d p1)
|
||||
{
|
||||
vec3d v0 = middle - p0;
|
||||
vec3d v1 = p1 - middle;
|
||||
|
||||
return cross(v0, v1);
|
||||
}
|
||||
|
||||
// Calculate and set the normal for height map entry (x,y)
|
||||
void terrain::set_normal(int x, int y)
|
||||
|
@ -270,6 +298,22 @@ void terrain::set_normal(int x, int y)
|
|||
double y = vec3.y();
|
||||
double z = vec3.z();
|
||||
*****************/
|
||||
|
||||
vec3d middle = create_point(x, y);
|
||||
|
||||
vec3d right = create_point(x + 1, y);
|
||||
vec3d top = create_point(x, y + 1);
|
||||
vec3d left = create_point(x - 1, y);
|
||||
vec3d bottom = create_point(x, y - 1);
|
||||
|
||||
vec3d normal0 = calculate_normal(middle, right, top);
|
||||
vec3d normal1 = calculate_normal(middle, top, left);
|
||||
vec3d normal2 = calculate_normal(middle, left, bottom);
|
||||
vec3d normal3 = calculate_normal(middle, bottom, right);
|
||||
|
||||
vec3d final_normal = (normal0 + normal1 + normal2 + normal3) / 4;
|
||||
|
||||
glNormal3dv(final_normal);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue