|
Heightfield.CPP File:
The first change here that you will need to pay attention to, is the incorporation of jpeg.h. Just like in the 'Loading a JPEG texture' tutorial (coming soon), we will be using the IJG jpeg library to load our textures. So after we add the line:
// include "jpeg.h"
We need to load in our texture. I am doing this after we load in our heightfield, in our Create function. So I am adding the line:
// SwiftTextureJpeg(tID, "texture.jpg", 0);
Where texture.jpg is the texture that will stretch over our terrain. Next is where our texturing comes into play. Just like texturing any other primitive shape in OpenGL, we need to enable texturing and bind our texture. So in our Render function, right before anything else, I am adding the lines:
// glEnable(GL_TEXTURE_2D);
// glBindTexture(GL_TEXTURE_2D, tID[0]);
Which will enable texturing and then bind are texture respectively. To finish off this, we need to disable texturing when we are done with our terrain, so we call:
// glDisable(GL_TEXTURE_2D);
At the end of our Render function. Now we need to take a look at our texture coordinates. At the moment, we have no texture coordinates, so in this tutorial we are going to dynamically compute them on the fly. This sounds really technical but it isn't really. At the X = 0 coordinate on the map, our U coordinate for our texture is 0, and at the X = Width coordinate, our U coordinate for our texture is X / Width.
So at:
X = 0, U = 0;
Z = 0, V = 0;
X = 1024, U = 1; (X / Width = 1024 / 1024 = 1)
Z = 1024, V = 1; (Z / Height = 1024 / 1024 = 1)
Taking this into practice, our rendering code will now look like this:
// glTexCoord2f((float)hMapX / hmWidth, (float)hMapZ / hmHeight);
// glVertex3f(hMapX, hHeightField[hMapX][hMapZ], hMapZ);
// glTexCoord2f((float)hMapX / hmWidth, (float)(hMapZ + 1) / hmHeight);
// glVertex3f(hMapX, hHeightField[hMapX][hMapZ + 1], hMapZ + 1);
// glTexCoord2f((float)(hMapX + 1) / hmWidth, (float)hMapZ / hmHeight);
// glVertex3f(hMapX + 1, hHeightField[hMapX + 1][hMapZ], hMapZ);
// glTexCoord2f((float)(hMapX + 1) / hmWidth, (float)(hMapZ + 1) / hmHeight);
// glVertex3f(hMapX + 1, hHeightField[hMapX + 1][hMapZ + 1], hMapZ + 1);
And that is all we need to change in our heightfield.cpp file. :-)
#include <stdio.h>
#include <gl\gl.h>
#include "jpeg.h"
#include "heightfield.h"
bool SwiftHeightField::Create(char *hFileName, const int hWidth, const int hHeight){
hmHeight = hHeight;
hmWidth = hWidth;
FILE *fp;
fp = fopen(hFileName, "rb");
fread(hHeightField, 1, hWidth * hHeight, fp);
fclose(fp);
SwiftTextureJpeg(tID, "texture.jpg", 0);
return true;
}
void SwiftHeightField::Render(void){
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tID[0]);
for (int hMapX = 0; hMapX < hmWidth; hMapX++){
for (int hMapZ = 0; hMapZ < hmHeight; hMapZ++){
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f((float)hMapX / hmWidth, (float)hMapZ / hmHeight);
glVertex3f(hMapX, hHeightField[hMapX][hMapZ], hMapZ);
glTexCoord2f((float)hMapX / hmWidth, (float)(hMapZ + 1) / hmHeight);
glVertex3f(hMapX, hHeightField[hMapX][hMapZ + 1], hMapZ + 1);
glTexCoord2f((float)(hMapX + 1) / hmWidth, (float)hMapZ / hmHeight);
glVertex3f(hMapX + 1, hHeightField[hMapX + 1][hMapZ], hMapZ);
glTexCoord2f((float)(hMapX + 1) / hmWidth, (float)(hMapZ + 1) / hmHeight);
glVertex3f(hMapX + 1, hHeightField[hMapX + 1][hMapZ + 1], hMapZ + 1);
glEnd();
}
}
glDisable(GL_TEXTURE_2D);
} |