Skip to content

Commit 7e2c0bd

Browse files
author
Cheng Xie
committed
Started on terrain, created a plane
1 parent 699f5f8 commit 7e2c0bd

File tree

6 files changed

+110
-1
lines changed

6 files changed

+110
-1
lines changed

src/meshutility.cpp

+76
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,79 @@ Mesh *MeshUtility::loadObjModel(string filename)
8181

8282
return mesh;
8383
}
84+
85+
Mesh *MeshUtility::createPlane(int tessellationLevel, float size)
86+
{
87+
assert(tessellationLevel > 0);
88+
assert(size > 0);
89+
90+
vector<SimpleVertex> vertexBuffer;
91+
IndexBuffer indexBuffer;
92+
93+
vec3 normal = {0, 1, 0};
94+
95+
vec3 upperleft = {-size, 0, -size};
96+
vec3 lowerleft = {-size, 0, size};
97+
vec3 lowerright = {size, 0, size};
98+
99+
vec3 dy = (upperleft - lowerleft) / tessellationLevel;
100+
101+
float width = (lowerright - lowerleft).length();
102+
float height = (upperleft - lowerleft).length();
103+
104+
// build vertices
105+
for (int row = 0; row <= tessellationLevel; row++) {
106+
vector<vec3> result;
107+
tessellate(lowerleft + dy * row, lowerright + dy * row, tessellationLevel, result);
108+
for (const vec3& point : result) {
109+
SimpleVertex v;
110+
v.position = point;
111+
v.normal = normal;
112+
v.uv.setX(vec3::dotProduct(point - lowerleft, (lowerright - lowerleft).normalized()) / width);
113+
v.uv.setY(vec3::dotProduct(point - lowerleft, (upperleft - lowerleft).normalized()) / height);
114+
vertexBuffer.push_back(v);
115+
}
116+
}
117+
118+
// build faces
119+
for (int l = 0; l < tessellationLevel; l++) {
120+
for (int s = 0; s < tessellationLevel; s++) {
121+
uint16_t i1 = l * (tessellationLevel+1) + s;
122+
uint16_t i2 = i1 + 1;
123+
uint16_t i3 = i1 + tessellationLevel+1;
124+
uint16_t i4 = i2 + tessellationLevel+1;
125+
126+
indexBuffer.push_back(i1);
127+
indexBuffer.push_back(i2);
128+
indexBuffer.push_back(i3);
129+
130+
indexBuffer.push_back(i4);
131+
indexBuffer.push_back(i3);
132+
indexBuffer.push_back(i2);
133+
}
134+
}
135+
136+
Mesh* mesh = new Mesh;
137+
VertexBufferDesc desc;
138+
desc.bufferData = vertexBuffer.data();
139+
desc.bufferSize = vertexBuffer.size() * sizeof(SimpleVertex);
140+
desc.vertexElementSizes = {3, 3, 2};
141+
desc.stride = sizeof(SimpleVertex);
142+
143+
mesh->setVertexBuffer(desc, PrimitiveType::Triangles);
144+
mesh->setIndexBuffer(indexBuffer);
145+
146+
return mesh;
147+
148+
}
149+
150+
void MeshUtility::tessellate(vec3 p1, vec3 p2, int level, vector<vec3> &result)
151+
{
152+
assert(level > 0);
153+
154+
auto delta = (p2 - p1) / level;
155+
for (int i = 0; i <= level; i++)
156+
{
157+
result.push_back(p1 + delta * i);
158+
}
159+
}

src/meshutility.h

+5
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22
#define MESHUTILITY_H
33

44
#include "common.h"
5+
#include "geometry.h"
56

67
class MeshUtility
78
{
89
public:
910
static Mesh* loadObjModel(string filename);
11+
12+
static Mesh* createPlane(int tessellationLevel, float size);
13+
14+
static void tessellate(vec3 p1, vec3 p2, int level, vector<vec3>& result);
1015
};
1116

1217
#endif // MESHUTILITY_H

src/scene.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "particlesystem.h"
1111
#include "skybox.h"
1212
#include "skyboxmaterial.h"
13+
#include "terrain.h"
1314

1415
Scene::Scene()
1516
{
@@ -88,6 +89,10 @@ void Scene::initialize()
8889

8990
// Skybox
9091
skybox_ = new Skybox("cloudy");
92+
93+
// Terrain
94+
Terrain* terrain = new Terrain();
95+
sceneObjects_.push_back(terrain);
9196
}
9297

9398
void Scene::render(DrawContext &context)

src/terrain.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,27 @@
11
#include "terrain.h"
2+
#include "meshutility.h"
3+
#include "phongmaterial.h"
4+
#include "mesh.h"
25

36
Terrain::Terrain()
47
{
8+
buildMesh();
9+
}
10+
11+
Terrain::~Terrain()
12+
{
13+
delete mesh_;
14+
}
15+
16+
void Terrain::buildMesh()
17+
{
18+
mesh_ = MeshUtility::createPlane(200, 500);
19+
20+
PhongMaterial* material = new PhongMaterial;
21+
material->setAmbient({0.2, 0.2, 0.2});
22+
material->setDiffuse({0.7, 0.7, 0.2});
23+
24+
setMaterial(material);
25+
26+
transform().translate(0, -20, 0);
527
}

src/terrain.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ class Terrain : public SceneObject
77
{
88
public:
99
Terrain();
10+
virtual ~Terrain();
1011

1112
private:
12-
void buildMesh() {}
13+
void buildMesh();
1314
};
1415

1516
#endif // TERRAIN_H

src/textures/heightmap.png

36.3 KB
Loading

0 commit comments

Comments
 (0)