Skip to content

Commit 3f16a40

Browse files
committed
feat: improve rendering and reduce visual noise significantly
1 parent f4f5892 commit 3f16a40

File tree

11 files changed

+102
-73
lines changed

11 files changed

+102
-73
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/cmake-build-*
22
/.idea
3-
/mem1.raw
3+
/*.raw
44
.DS_Store
55
*.cap
66
/.vs

extern/fmt

Submodule fmt updated 193 files

extern/glm

Submodule glm updated 1690 files

extern/json

Submodule json updated 1533 files

src/gl/ImmediateModeBuffer.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,19 @@ void ImmediateModeBuffer::addTri(const glm::vec3 &a, const glm::vec3 &b, const g
6767
.pos = a,
6868
.color = currentColor,
6969
.normal = n,
70+
.barycentric = {1, 0, 0},
7071
},
7172
Vert{
7273
.pos = b,
7374
.color = currentColor,
7475
.normal = n,
76+
.barycentric = {0, 1, 0},
7577
},
7678
Vert{
7779
.pos = c,
7880
.color = currentColor,
7981
.normal = n,
82+
.barycentric = {0, 0, 1},
8083
}
8184
);
8285
}
@@ -92,21 +95,25 @@ void ImmediateModeBuffer::addQuad(const glm::vec3 &a, const glm::vec3 &b, const
9295
.pos = a,
9396
.color = currentColor,
9497
.normal = n,
98+
.barycentric = {1, 0, 0},
9599
},
96100
Vert{
97101
.pos = b,
98102
.color = currentColor,
99103
.normal = n,
104+
.barycentric = {0, 1, 0},
100105
},
101106
Vert{
102107
.pos = c,
103108
.color = currentColor,
104109
.normal = n,
110+
.barycentric = {0, 0, 1},
105111
},
106112
Vert{
107113
.pos = d,
108114
.color = currentColor,
109115
.normal = n,
116+
.barycentric = {1, 0, 0},
110117
}
111118
);
112119
}
@@ -124,7 +131,8 @@ void ImmediateModeBuffer::addLines(const std::vector<Vert> &newLineVerts) {
124131
Vert v{
125132
.pos = glm::vec3{vt * glm::vec4{in.pos, 1.0f}},
126133
.color = in.color,
127-
.normal = glm::normalize(nt * in.normal)
134+
.normal = glm::normalize(nt * in.normal),
135+
.barycentric = in.barycentric,
128136
};
129137
return v;
130138
}
@@ -140,7 +148,8 @@ void ImmediateModeBuffer::addTris(const std::vector<Vert> &newTriVerts) {
140148
Vert v{
141149
.pos = glm::vec3{vt * glm::vec4{in.pos, 1.0f}},
142150
.color = in.color,
143-
.normal = glm::normalize(nt * in.normal)
151+
.normal = glm::normalize(nt * in.normal),
152+
.barycentric = in.barycentric,
144153
};
145154
return v;
146155
}

src/gl/OpenGLMesh.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ OpenGLMesh::OpenGLMesh(const std::vector<Vert> &vertData, RenderType mode, Buffe
1414
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vert), (void*) offsetof(Vert, pos));
1515
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vert), (void*) offsetof(Vert, color));
1616
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vert), (void*) offsetof(Vert, normal));
17+
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Vert), (void*) offsetof(Vert, barycentric));
1718
glEnableVertexAttribArray(0);
1819
glEnableVertexAttribArray(1);
1920
glEnableVertexAttribArray(2);
21+
glEnableVertexAttribArray(3);
2022

2123
bufferNewData(vertData, type);
2224
}

src/gl/OpenGLMesh.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct __attribute__ ((packed))
1313
glm::vec3 pos;
1414
glm::vec4 color;
1515
glm::vec3 normal;
16+
glm::vec3 barycentric{-1,-1,-1};
1617
};
1718
#ifdef WIN32
1819
#pragma pack(pop)

src/gl/ShapeGenerator.cpp

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <vector>
44
#include <glm/glm.hpp>
55
#include <glm/gtc/quaternion.hpp>
6+
#define GLM_ENABLE_EXPERIMENTAL
67
#include <glm/gtc/matrix_inverse.hpp>
78
#include <glm/gtc/matrix_transform.hpp>
89
#include <glm/gtx/transform.hpp>
@@ -20,53 +21,52 @@ namespace ShapeGenerator {
2021
vector<Vert> verts;
2122

2223
// -Z
23-
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {0, 0, -1},});
24-
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {0, 0, -1},});
25-
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, 0, -1},});
26-
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, 0, -1},});
27-
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {0, 0, -1},});
28-
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {0, 0, -1},});
29-
24+
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {0, 0, -1}, .barycentric = {1, 0, 0},});
25+
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {0, 0, -1}, .barycentric = {0, 1, 0},});
26+
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, 0, -1}, .barycentric = {0, 0, 1},});
27+
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, 0, -1}, .barycentric = {1, 0, 0},});
28+
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {0, 0, -1}, .barycentric = {0, 1, 0},});
29+
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {0, 0, -1}, .barycentric = {0, 0, 1},});
3030

3131
// +Z
32-
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {0, 0, 1},});
33-
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {0, 0, 1},});
34-
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 0, 1},});
35-
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 0, 1},});
36-
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {0, 0, 1},});
37-
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {0, 0, 1},});
32+
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {0, 0, 1}, .barycentric = {1, 0, 0},});
33+
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {0, 0, 1}, .barycentric = {0, 1, 0},});
34+
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 0, 1}, .barycentric = {0, 0, 1},});
35+
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 0, 1}, .barycentric = {1, 0, 0},});
36+
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {0, 0, 1}, .barycentric = {0, 1, 0},});
37+
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {0, 0, 1}, .barycentric = {0, 0, 1},});
3838

3939
// -X
40-
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {-1, 0, 0},});
41-
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {-1, 0, 0},});
42-
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {-1, 0, 0},});
43-
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {-1, 0, 0},});
44-
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {-1, 0, 0},});
45-
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {-1, 0, 0},});
40+
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {-1, 0, 0}, .barycentric = {1, 0, 0},});
41+
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {-1, 0, 0}, .barycentric = {0, 1, 0},});
42+
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {-1, 0, 0}, .barycentric = {0, 0, 1},});
43+
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {-1, 0, 0}, .barycentric = {1, 0, 0},});
44+
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {-1, 0, 0}, .barycentric = {0, 1, 0},});
45+
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {-1, 0, 0}, .barycentric = {0, 0, 1},});
4646

4747
// +X
48-
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {1, 0, 0},});
49-
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {1, 0, 0},});
50-
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {1, 0, 0},});
51-
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {1, 0, 0},});
52-
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {1, 0, 0},});
53-
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {1, 0, 0},});
48+
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {1, 0, 0}, .barycentric = {1, 0, 0},});
49+
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {1, 0, 0}, .barycentric = {0, 1, 0},});
50+
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {1, 0, 0}, .barycentric = {0, 0, 1},});
51+
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {1, 0, 0}, .barycentric = {1, 0, 0},});
52+
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {1, 0, 0}, .barycentric = {0, 1, 0},});
53+
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {1, 0, 0}, .barycentric = {0, 0, 1},});
5454

5555
// -Y
56-
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {0, -1, 0},});
57-
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {0, -1, 0},});
58-
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, -1, 0},});
59-
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, -1, 0},});
60-
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {0, -1, 0},});
61-
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {0, -1, 0},});
56+
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {0, -1, 0}, .barycentric = {1, 0, 0},});
57+
verts.emplace_back(Vert{.pos = {max.x, min.y, min.z}, .color = color, .normal = {0, -1, 0}, .barycentric = {0, 1, 0},});
58+
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, -1, 0}, .barycentric = {0, 0, 1},});
59+
verts.emplace_back(Vert{.pos = {min.x, min.y, min.z}, .color = color, .normal = {0, -1, 0}, .barycentric = {1, 0, 0},});
60+
verts.emplace_back(Vert{.pos = {min.x, min.y, max.z}, .color = color, .normal = {0, -1, 0}, .barycentric = {0, 1, 0},});
61+
verts.emplace_back(Vert{.pos = {max.x, min.y, max.z}, .color = color, .normal = {0, -1, 0}, .barycentric = {0, 0, 1},});
6262

6363
// +Y
64-
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {0, 1, 0},});
65-
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {0, 1, 0},});
66-
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 1, 0},});
67-
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 1, 0},});
68-
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {0, 1, 0},});
69-
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {0, 1, 0},});
64+
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {0, 1, 0}, .barycentric = {1, 0, 0},});
65+
verts.emplace_back(Vert{.pos = {max.x, max.y, min.z}, .color = color, .normal = {0, 1, 0}, .barycentric = {0, 1, 0},});
66+
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 1, 0}, .barycentric = {0, 0, 1},});
67+
verts.emplace_back(Vert{.pos = {max.x, max.y, max.z}, .color = color, .normal = {0, 1, 0}, .barycentric = {1, 0, 0},});
68+
verts.emplace_back(Vert{.pos = {min.x, max.y, max.z}, .color = color, .normal = {0, 1, 0}, .barycentric = {0, 1, 0},});
69+
verts.emplace_back(Vert{.pos = {min.x, max.y, min.z}, .color = color, .normal = {0, 1, 0}, .barycentric = {0, 0, 1},});
7070

7171
return verts;
7272
}
@@ -162,13 +162,13 @@ namespace ShapeGenerator {
162162
n = glm::normalize(glm::cross(topRight - bottomLeft, topRight - bottomRight));
163163
}
164164

165-
verts.emplace_back(Vert{.pos = center + topLeft * radius, .color = color, .normal = n});
166-
verts.emplace_back(Vert{.pos = center + topRight * radius, .color = color, .normal = n});
167-
verts.emplace_back(Vert{.pos = center + bottomRight * radius, .color = color, .normal = n});
165+
verts.emplace_back(Vert{.pos = center + topLeft * radius, .color = color, .normal = n, .barycentric = {1, 0, 0},});
166+
verts.emplace_back(Vert{.pos = center + topRight * radius, .color = color, .normal = n, .barycentric = {0, 1, 0},});
167+
verts.emplace_back(Vert{.pos = center + bottomRight * radius, .color = color, .normal = n, .barycentric = {0, 0, 1},});
168168

169-
verts.emplace_back(Vert{.pos = center + bottomRight * radius, .color = color, .normal = n});
170-
verts.emplace_back(Vert{.pos = center + bottomLeft * radius, .color = color, .normal = n});
171-
verts.emplace_back(Vert{.pos = center + topLeft * radius, .color = color, .normal = n});
169+
verts.emplace_back(Vert{.pos = center + bottomRight * radius, .color = color, .normal = n, .barycentric = {1, 0, 0},});
170+
verts.emplace_back(Vert{.pos = center + bottomLeft * radius, .color = color, .normal = n, .barycentric = {0, 1, 0},});
171+
verts.emplace_back(Vert{.pos = center + topLeft * radius, .color = color, .normal = n, .barycentric = {0, 0, 1},});
172172
}
173173
}
174174

@@ -199,7 +199,7 @@ namespace ShapeGenerator {
199199

200200
res.emplace_back(Vert{.pos=seg.start, .color=color});
201201
res.emplace_back(Vert{.pos=seg.end, .color=color});
202-
202+
203203
return seg;
204204
};
205205

src/world/CollisionMesh.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,31 +52,34 @@ void CollisionMesh::initGlMesh() {
5252

5353
auto n = glm::normalize(glm::cross(v1 - v3, v1 - v2));
5454

55-
glm::vec4 color{1, 1, 1, 1};
55+
glm::vec4 color{0.2f, 0.2f, 0.2f, 1};
5656

5757
// this is how the game calculates standability
5858
if (!!(polyFlags & ECollisionMaterial::FLOOR) || n.z > 0.85) {
59-
color = glm::vec4{0.5f, 1.0f, 0.5f, 1.0f};
59+
color = glm::vec4{0.4f, 0.6f, 0.4f, 1.0f};
6060
} else if (!!(polyFlags & ECollisionMaterial::WALL) || n.z > 0.85) {
61-
color = glm::vec4{0.5f, 0.5f, 1.0f, 1.0f};
61+
color = glm::vec4{0.6f, 0.6f, 0.6f, 1.0f};
6262
} else if (!!(polyFlags & ECollisionMaterial::CEILING) || n.z > 0.85) {
63-
color = glm::vec4{1.0f, 0.5f, 0.5f, 1.0f};
63+
color = glm::vec4{0.8f, 0.5f, 0.5f, 1.0f};
6464
}
6565

6666
verts.emplace_back(Vert{
6767
.pos = v1,
6868
.color = color,
69-
.normal = n
69+
.normal = n,
70+
.barycentric = {1, 0, 0},
7071
});
7172
verts.emplace_back(Vert{
7273
.pos = v2,
7374
.color = color,
74-
.normal = n
75+
.normal = n,
76+
.barycentric = {0, 1, 0},
7577
});
7678
verts.emplace_back(Vert{
7779
.pos = v3,
7880
.color = color,
79-
.normal = n
81+
.normal = n,
82+
.barycentric = {0, 0, 1},
8083
});
8184
}
8285

src/world/WorldRenderer.cpp

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <glm/gtc/matrix_transform.hpp>
1616
#include <glm/gtc/matrix_access.hpp>
17+
#define GLM_ENABLE_EXPERIMENTAL
1718
#include <glm/gtx/transform.hpp>
1819
#include <glm/gtx/matrix_decompose.hpp>
1920
#include <glm/gtc/quaternion.hpp>
@@ -28,10 +29,12 @@ const char *meshVertShader = R"src(#version 330 core
2829
layout (location = 0) in vec3 aPos;
2930
layout (location = 1) in vec4 aColor;
3031
layout (location = 2) in vec3 aNormal;
32+
layout (location = 3) in vec3 aBarycentric;
3133
3234
out vec4 vertexColor;
3335
out vec3 normal;
3436
out vec3 fragPos;
37+
out vec3 barycentric;
3538
3639
uniform mat4 model;
3740
uniform mat4 view;
@@ -42,6 +45,7 @@ void main() {
4245
vertexColor = aColor;
4346
normal = mat3(transpose(inverse(model))) * aNormal;
4447
fragPos = vec3(model * vec4(aPos, 1.0f));
48+
barycentric = aBarycentric;
4549
}
4650
)src";
4751

@@ -51,28 +55,37 @@ out vec4 FragColor;
5155
in vec4 vertexColor;
5256
in vec3 normal;
5357
in vec3 fragPos;
58+
in vec3 barycentric;
5459
5560
uniform vec3 viewPos;
5661
uniform vec3 lightDir;
5762
5863
void main() {
59-
vec3 lightColor = vec3(1,1,1);
60-
// ambient
61-
float ambientStrength = 0.2;
62-
vec3 ambient = ambientStrength * lightColor;
64+
float edgeThickness = 0.015;
65+
float minBary = min(min(barycentric.x, barycentric.y), barycentric.z);
66+
if (minBary > 0 && minBary < edgeThickness) { // draw edges
67+
float color = 0.2;
68+
FragColor = vec4(color, color, color, 1);
69+
} else {
70+
vec3 lightColor = vec3(1,1,1);
71+
// ambient
72+
float ambientStrength = 0.7;
73+
vec3 ambient = ambientStrength * lightColor;
6374
64-
// diffuse
65-
float diff = max(dot(normal, lightDir), 0.0);
66-
vec3 diffuse = diff * lightColor;
75+
// diffuse
76+
float diffStrength = 0.5;
77+
float diff = max(dot(normal, lightDir), 0.0);
78+
vec3 diffuse = diff * lightColor * diffStrength;
6779
68-
// specular
69-
float specularStrength = 0.3;
70-
vec3 viewDir = normalize(viewPos - fragPos);
71-
vec3 reflectDir = reflect(-lightDir, normal);
72-
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 256);
73-
vec3 specular = specularStrength * spec * lightColor;
80+
// specular
81+
float specularStrength = 0.2;
82+
vec3 viewDir = normalize(viewPos - fragPos);
83+
vec3 reflectDir = reflect(-lightDir, normal);
84+
float spec = pow(max(dot(viewDir, reflectDir), 0.0), 256);
85+
vec3 specular = specularStrength * spec * lightColor;
7486
75-
FragColor = vec4(ambient + diffuse + specular, 1.0) * vertexColor;
87+
FragColor = vec4(ambient + diffuse + specular, 1.0) * vertexColor;
88+
}
7689
}
7790
)src";
7891

@@ -390,7 +403,7 @@ void WorldRenderer::render(const std::map<TUniqueID, GameDefinitions::GameMember
390403
lineShader->setMat4("model", glm::mat4{1.0f});
391404
renderBuff->drawLines();
392405

393-
glDisable(GL_DEPTH_TEST);
406+
glDepthMask(GL_FALSE);
394407
glEnable(GL_BLEND);
395408
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
396409
meshShader->use();
@@ -400,7 +413,7 @@ void WorldRenderer::render(const std::map<TUniqueID, GameDefinitions::GameMember
400413
lineShader->use();
401414
lineShader->setMat4("model", glm::mat4{1.0f});
402415
translucentRenderBuff->drawLines();
403-
glEnable(GL_DEPTH_TEST);
416+
glDepthMask(GL_TRUE);
404417

405418
meshShader->use();
406419
}

0 commit comments

Comments
 (0)