tesseract frame

This commit is contained in:
2018-12-20 21:12:39 -05:00
parent 7211e9fc1a
commit 5580899074
5 changed files with 85 additions and 36 deletions

View File

@@ -11,9 +11,10 @@ vec3 hsv2rgb(vec3 c) {
}
void main() {
float h = pos.w / 3 + .6;
float s = 1;
float v = smoothstep(2, -2, pos.z);
// float h = pos.w / 3 + .6;
float h = 0;
float s = 0;
float v = smoothstep(4, -4, pos.z);
fcolor = vec4(hsv2rgb(vec3(h, s, v)), 1);
}

View File

@@ -19,7 +19,7 @@ out vec4 pos;
void emit(vec4 v) {
pos = v;
gl_Position = proj * view * vec4(v.xyz, -v.w + 2);
gl_Position = proj * view * vec4(v.xyz, -v.w + 3);
EmitVertex();
}

View File

@@ -13,7 +13,7 @@ vec3 hsv2rgb(vec3 c) {
void main() {
float h = pos.w / 3 + .6;
float s = 1;
float v = smoothstep(2, -2, pos.z);
float v = smoothstep(3, -3, pos.z) / 2;
fcolor = vec4(hsv2rgb(vec3(h, s, v)), 1);
}

View File

@@ -19,7 +19,7 @@ out vec4 pos;
void emit(vec4 v) {
pos = v;
gl_Position = proj * view * vec4(v.xyz, -v.w + 2);
gl_Position = proj * view * vec4(v.xyz, -v.w + 3);
EmitVertex();
}

View File

@@ -22,7 +22,7 @@ struct Matrices {
glm::mat4 proj;
};
void push_tetrahedron(std::vector<unsigned> *inds, const std::vector<unsigned> & tetra) {
void push_tetrahedron(std::vector<unsigned> *inds, const std::vector<unsigned> &tetra) {
for (int i = 0; i < 4; ++i) {
inds->push_back(tetra[i]);
}
@@ -47,6 +47,36 @@ void push_tesseract(std::vector<unsigned> *inds, const std::vector<unsigned> &te
push_cube(inds, {tess[1], tess[3], tess[5], tess[7], tess[9], tess[11], tess[13], tess[15]});
}
void build_tesseract(std::vector<unsigned> *inds, std::vector<glm::vec4> *verts, const glm::vec4 center,
const glm::vec4 size) {
const glm::vec4 rad = size / 2.f;
std::vector<glm::vec4> new_verts = {
{center.x + size.x, center.y + size.y, center.z + size.z, center.w + size.w},
{center.x + size.x, center.y + size.y, center.z + size.z, center.w - size.w},
{center.x + size.x, center.y + size.y, center.z - size.z, center.w + size.w},
{center.x + size.x, center.y + size.y, center.z - size.z, center.w - size.w},
{center.x + size.x, center.y - size.y, center.z + size.z, center.w + size.w},
{center.x + size.x, center.y - size.y, center.z + size.z, center.w - size.w},
{center.x + size.x, center.y - size.y, center.z - size.z, center.w + size.w},
{center.x + size.x, center.y - size.y, center.z - size.z, center.w - size.w},
{center.x - size.x, center.y + size.y, center.z + size.z, center.w + size.w},
{center.x - size.x, center.y + size.y, center.z + size.z, center.w - size.w},
{center.x - size.x, center.y + size.y, center.z - size.z, center.w + size.w},
{center.x - size.x, center.y + size.y, center.z - size.z, center.w - size.w},
{center.x - size.x, center.y - size.y, center.z + size.z, center.w + size.w},
{center.x - size.x, center.y - size.y, center.z + size.z, center.w - size.w},
{center.x - size.x, center.y - size.y, center.z - size.z, center.w + size.w},
{center.x - size.x, center.y - size.y, center.z - size.z, center.w - size.w},
};
std::vector<unsigned> new_inds;
for (int i = 0; i < 16; i++) new_inds.push_back((unsigned) verts->size() + i);
for (auto vert: new_verts) verts->push_back(vert);
push_tesseract(inds, new_inds);
}
class GLApp : public App {
std::vector<glm::vec4> cell_verts{};
std::vector<unsigned> cell_elems{};
@@ -61,28 +91,44 @@ class GLApp : public App {
GLuint wire_prog{}, sect_prog{};
void init() override {
cell_verts = {
glm::vec4(+1, +1, +1, +1) / 2.f,
glm::vec4(+1, +1, +1, -1) / 2.f,
glm::vec4(+1, +1, -1, +1) / 2.f,
glm::vec4(+1, +1, -1, -1) / 2.f,
glm::vec4(+1, -1, +1, +1) / 2.f,
glm::vec4(+1, -1, +1, -1) / 2.f,
glm::vec4(+1, -1, -1, +1) / 2.f,
glm::vec4(+1, -1, -1, -1) / 2.f,
glm::vec4(-1, +1, +1, +1) / 2.f,
glm::vec4(-1, +1, +1, -1) / 2.f,
glm::vec4(-1, +1, -1, +1) / 2.f,
glm::vec4(-1, +1, -1, -1) / 2.f,
glm::vec4(-1, -1, +1, +1) / 2.f,
glm::vec4(-1, -1, +1, -1) / 2.f,
glm::vec4(-1, -1, -1, +1) / 2.f,
glm::vec4(-1, -1, -1, -1) / 2.f,
};
bool DRAW_WIRE = true;
cell_elems = {};
push_tesseract(&cell_elems, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15});
void init() override {
build_tesseract(&cell_elems, &cell_verts, {-1, -1, -1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {-1, -1, +1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +1, -1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +1, +1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {+1, -1, -1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {+1, -1, +1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +1, -1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +1, +1, +0}, {0.125, 0.125, 0.125, 1.125});
build_tesseract(&cell_elems, &cell_verts, {-1, -1, +0, -1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {-1, -1, +0, +1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +1, +0, -1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +1, +0, +1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, -1, +0, -1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, -1, +0, +1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +1, +0, -1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +1, +0, +1}, {0.125, 0.125, 0.875, 0.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +0, -1, -1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +0, -1, +1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +0, +1, -1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {-1, +0, +1, +1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +0, -1, -1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +0, -1, +1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +0, +1, -1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+1, +0, +1, +1}, {0.125, 0.875, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, -1, -1, -1}, {0.875, 0.125, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, -1, -1, +1}, {0.875, 0.125, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, -1, +1, -1}, {0.875, 0.125, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, -1, +1, +1}, {0.875, 0.125, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, +1, -1, -1}, {0.875, 0.125, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, +1, -1, +1}, {0.875, 0.125, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, +1, +1, -1}, {0.875, 0.125, 0.125, 0.125});
build_tesseract(&cell_elems, &cell_verts, {+0, +1, +1, +1}, {0.875, 0.125, 0.125, 0.125});
matrices = {
glm::identity<glm::mat4>(),
@@ -149,8 +195,8 @@ class GLApp : public App {
rotor(glm::vec4(0, 1, 0, 0), glm::vec4(0, 0, 1, 0), getTime() / 4) *
rotor(glm::vec4(1, 1, 1, 0), glm::vec4(0, 0, 0, 1), getTime() / 5);
matrices.view = glm::lookAt(glm::vec3(0, 0, -2), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
matrices.proj = glm::perspective(1.f, ratio, 0.1f, 10.0f);
matrices.view = glm::lookAt(glm::vec3(0, 0, -4), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
matrices.proj = glm::perspective(1.f, ratio, 0.1f, 20.0f);
glBindBuffer(GL_UNIFORM_BUFFER, matrix_buffer);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(Matrices), &matrices);
@@ -171,15 +217,13 @@ class GLApp : public App {
glBindVertexArray(cell_array);
glUseProgram(wire_prog);
glDrawArrays(GL_POINTS, 0, (GLsizei) cell_elems.size() / 4);
glClear(GL_DEPTH_BUFFER_BIT);
glUseProgram(sect_prog);
glDrawArrays(GL_POINTS, 0, (GLsizei) cell_elems.size() / 4);
glUseProgram(wire_prog);
glDrawArrays(GL_POINTS, 0, (GLsizei) cell_elems.size() / 4);
if (DRAW_WIRE) {
glUseProgram(wire_prog);
glDrawArrays(GL_POINTS, 0, (GLsizei) cell_elems.size() / 4);
}
glBindVertexArray(0);
@@ -191,6 +235,10 @@ class GLApp : public App {
if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE) {
glfwSetWindowShouldClose(getWindow(), true);
}
if (action == GLFW_PRESS && key == GLFW_KEY_SPACE) {
DRAW_WIRE = !DRAW_WIRE;
}
}
public: