summaryrefslogtreecommitdiff
path: root/src/glwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/glwidget.cpp')
-rwxr-xr-xsrc/glwidget.cpp122
1 files changed, 120 insertions, 2 deletions
diff --git a/src/glwidget.cpp b/src/glwidget.cpp
index 8a35a4f..6466e24 100755
--- a/src/glwidget.cpp
+++ b/src/glwidget.cpp
@@ -3,6 +3,11 @@
#include <QApplication>
#include <QKeyEvent>
#include <iostream>
+#define STB_IMAGE_IMPLEMENTATION
+
+#include "stb/stb_image.h"
+
+
#define SPEED 1.5
#define ROTATE_SPEED 0.0025
@@ -45,12 +50,20 @@ GLWidget::GLWidget(QWidget *parent) :
// Function tick() will be called once per interva
connect(&m_intervalTimer, SIGNAL(timeout()), this, SLOT(tick()));
+
+ //m_skybox = new skybox();
}
GLWidget::~GLWidget()
{
if (m_defaultShader != nullptr) delete m_defaultShader;
if (m_pointShader != nullptr) delete m_pointShader;
+ if (m_foamShader != nullptr) delete m_foamShader;
+
+ if (m_skyboxShader != nullptr) delete m_skyboxShader;
+ //if (m_skybox != nullptr) delete m_skybox;
+
+
}
// ================== Basic OpenGL Overrides
@@ -64,9 +77,13 @@ void GLWidget::initializeGL()
fprintf(stdout, "Successfully initialized GLEW %s\n", glewGetString(GLEW_VERSION));
// Set clear color to white
- glClearColor(1, 0.98f, 0.85f, 1);
+ glClearColor(0, 0, 0, 1);
+// glEnable(GL_DEPTH_TEST);
+// glEnable(GL_CULL_FACE);
+// glEnable(GL_BLEND);
+// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- // Enable depth-testing and backface culling
+// // Enable depth-testing and backface culling
glEnable(GL_DEPTH_TEST);
// glEnable(GL_CULL_FACE);
// glCullFace(GL_BACK);
@@ -78,9 +95,21 @@ void GLWidget::initializeGL()
m_pointShader = new Shader(":resources/shaders/anchorPoint.vert", ":resources/shaders/anchorPoint.geom", ":resources/shaders/anchorPoint.frag");
// m_texture_shader = new Shader(":/resources/shaders/texture.vert", ":/resources/shaders/texture.frag");
m_colorShader = new Shader(":resources/shaders/color.vert", ":resources/shaders/color.frag");
+ m_foamShader = new Shader(":resources/shaders/foam.vert", ":resources/shaders/foam.frag");
+ m_skyboxShader = new Shader(":resources/shaders/skybox.vert", ":resources/shaders/skybox.frag");
+
+
+ m_halftone_tex = loadTextureFromFile(":resources/images/halftone.png").textureID;
+ m_foam_tex = loadTextureFromFile(":resources/images/foam3.png").textureID;
+
+
m_causticsShader = new Shader(":resources/shaders/caustics.vert", ":resources/shaders/caustics.frag");
initCaustics();
+
+ // init skybox stuff
+ m_skybox.initializeVAO();
+
// INITIALIZE TEXTURE STUFF
// Prepare filepath
@@ -162,6 +191,9 @@ void GLWidget::initializeGL()
m_camera.lookAt(eye, target);
m_camera.setOrbitPoint(target);
m_camera.setPerspective(120, width() / static_cast<float>(height()), nearPlane, farPlane);
+ m_camera.setPosition(Eigen::Vector3f( 0,
+ 0,
+ 0));
m_deltaTimeProvider.start();
m_intervalTimer.start(1000 / 60);
@@ -398,8 +430,91 @@ void GLWidget::paintGL()
// m_pointShader->setUniform("height", height());
// m_arap.draw(m_pointShader, GL_POINTS);
// m_pointShader->unbind();
+
+ m_foamShader->bind();
+ m_foamShader->setUniform("proj", m_camera.getProjection());
+ m_foamShader->setUniform("view", m_camera.getView());
+ glUniform1f(glGetUniformLocation(m_foamShader->id(), "time"), m_arap.getTime());
+ glUniform1f(glGetUniformLocation(m_foamShader->id(), "phaseC"), 1.f);
+ m_foamShader->setUniform("widthBounds", m_arap.minCorner[0], m_arap.maxCorner[0]);
+ m_foamShader->setUniform("lengthBounds", m_arap.minCorner[2], m_arap.maxCorner[2]);
+
+ glActiveTexture(GL_TEXTURE5);
+ glBindTexture(GL_TEXTURE_2D, m_halftone_tex);
+ glUniform1i(glGetUniformLocation(m_foamShader->id(), "halftone_texture"), 5);
+
+ glActiveTexture(GL_TEXTURE6);
+ glBindTexture(GL_TEXTURE_2D, m_foam_tex);
+ glUniform1i(glGetUniformLocation(m_foamShader->id(), "foam_texture"), 6);
+
+
+
+
+ m_arap.drawFoam(m_foamShader, GL_TRIANGLES);
+ m_foamShader->unbind();
+
+ // skybox
+
+
+
+ m_skybox.draw(m_skyboxShader, m_camera);
+
+
+
}
+TextureData GLWidget::loadTextureFromFile(const char *path)
+{
+ std::string filename = std::string(path);
+
+ QString filepath = QString(filename.c_str());
+ QImage tex_image = QImage(filepath);
+ tex_image = tex_image.convertToFormat(QImage::Format_RGBA8888);
+ auto data = tex_image.bits();
+ int width = tex_image.width();
+ int height = tex_image.height();
+
+ GLuint textureID;
+ glGenTextures(1, &textureID);
+
+// int width, height, nrComponents;
+// stbi_set_flip_vertically_on_load(true);
+// unsigned char *data = stbi_load(filename.c_str(), &width, &height, &nrComponents, 0);
+// stbi_set_flip_vertically_on_load(false);
+ if (data)
+ {
+// GLenum format;
+// if (nrComponents == 1)
+// format = GL_RED;
+// else if (nrComponents == 3)
+// format = GL_RGB;
+// else if (nrComponents == 4)
+// format = GL_RGBA;
+
+ glBindTexture(GL_TEXTURE_2D, textureID);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+ glGenerateMipmap(GL_TEXTURE_2D);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+// stbi_image_free(data);
+
+ }
+ else
+ {
+ std::cout << "Texture failed to load at path: " << path << std::endl;
+// stbi_image_free(data);
+ }
+
+ TextureData newtex;
+ newtex.textureID = textureID;
+ newtex.height = height;
+ newtex.width = width;
+ return newtex;
+}
void GLWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w, h);
@@ -568,6 +683,8 @@ void GLWidget::tick()
{
float deltaSeconds = m_deltaTimeProvider.restart() / 1000.f;
m_arap.update(deltaSeconds);
+ // rotate skybox
+ m_skybox.update(deltaSeconds);
// Move camera
auto look = m_camera.getLook();
@@ -579,6 +696,7 @@ void GLWidget::tick()
moveVec *= deltaSeconds;
m_camera.move(moveVec);
+
// Flag this view for repainting (Qt will call paintGL() soon after)
update();
}