1
0
Fork 0
Univerxel/src/client/render/gl/pass/VoxelProgram.cpp

107 lines
3.4 KiB
C++
Raw Normal View History

2020-08-30 16:35:45 +00:00
#include "VoxelProgram.hpp"
2020-07-10 17:49:16 +00:00
2020-09-26 22:05:43 +00:00
#include "../Renderer.hpp"
2020-07-10 17:49:16 +00:00
2020-07-25 16:45:03 +00:00
using namespace pass;
2020-08-30 16:35:45 +00:00
VoxelProgram::VoxelProgram(const VoxelProgram::options& opts, std::vector<std::string> flags): Program() {
2020-07-10 17:49:16 +00:00
if (opts.pbr)
2020-07-31 17:09:44 +00:00
flags.emplace_back("PBR");
if (opts.triplanar)
2020-07-31 17:09:44 +00:00
flags.emplace_back("TRIPLANAR");
if (opts.stochastic)
flags.emplace_back("STOCHASTIC");
2020-07-10 19:37:49 +00:00
if (opts.fog)
2020-07-31 17:09:44 +00:00
flags.emplace_back("FOG");
2020-08-05 13:14:57 +00:00
if (opts.geometry) {
flags.emplace_back("GEOMETRY");
if (opts.blend)
flags.emplace_back("BLEND");
}
2020-08-14 16:56:28 +00:00
if (opts.curvature) {
flags.emplace_back("CURVATURE");
if (opts.curv_depth)
flags.emplace_back("CURV_DEPTH");
}
2020-07-10 17:49:16 +00:00
std::vector<Shader*> shaders;
shaders.push_back(loadShader(GL_VERTEX_SHADER, flags));
shaders.push_back(loadShader(GL_FRAGMENT_SHADER, flags));
2020-08-05 13:14:57 +00:00
if (opts.geometry)
2020-07-24 19:42:47 +00:00
shaders.push_back(loadShader(GL_GEOMETRY_SHADER, flags));
2020-07-10 17:49:16 +00:00
load(shaders);
ViewMatrixID = glGetUniformLocation(ProgramID, "View");
2020-08-14 16:56:28 +00:00
ProjMatrixID = glGetUniformLocation(ProgramID, "Proj");
2020-07-10 17:49:16 +00:00
TextureID = glGetUniformLocation(ProgramID, "TextureAtlas");
NormalID = glGetUniformLocation(ProgramID, "NormalAtlas");
HOSID = glGetUniformLocation(ProgramID, "HOSAtlas");
LightInvDirID = glGetUniformLocation(ProgramID, "LightInvDirection_worldspace");
2020-07-10 19:37:49 +00:00
2020-08-30 16:35:45 +00:00
FogDepthID = glGetUniformLocation(ProgramID, "FogDepth"); //MAYBE: merge as vec4
2020-07-10 19:37:49 +00:00
FogColorID = glGetUniformLocation(ProgramID, "FogColor");
2020-08-14 16:56:28 +00:00
SphereProjID = glGetUniformLocation(ProgramID, "SphereProj");
CurvatureID = glGetUniformLocation(ProgramID, "Curvature");
2020-07-10 17:49:16 +00:00
}
2020-08-30 16:35:45 +00:00
VoxelProgram::~VoxelProgram() { }
2020-07-10 17:49:16 +00:00
2020-08-30 16:35:45 +00:00
std::string VoxelProgram::getName() const {
return "Voxel";
2020-07-10 17:49:16 +00:00
}
2020-09-26 22:05:43 +00:00
void VoxelProgram::start(render::gl::Renderer *renderer) {
2020-07-10 17:49:16 +00:00
bindTexture(renderer->getTextureAtlas());
bindNormal(renderer->getNormalAtlas());
bindHOS(renderer->getHOSAtlas());
setLightInvDir(&renderer->LightInvDir[0]);
2020-07-10 19:37:49 +00:00
setFog(&renderer->FogColor[0], renderer->FogDepth);
2020-08-14 16:56:28 +00:00
setView(&renderer->getViewMatrix()[0][0]);
setProj(&renderer->getProjectionMatrix()[0][0]);
2020-07-10 17:49:16 +00:00
}
2020-09-26 22:05:43 +00:00
buffer::params VoxelProgram::setup(render::gl::Renderer *renderer) {
setSphereProj(&renderer->getSphereProj()[0]);
setCurvature(renderer->getCurvature());
2020-07-25 16:45:03 +00:00
return buffer::params{.vertexOnly = false};
2020-07-10 17:49:16 +00:00
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::setProj(const GLfloat *matrix) {
2020-08-14 16:56:28 +00:00
glUniformMatrix4fv(ProjMatrixID, 1, GL_FALSE, matrix);
2020-07-10 17:49:16 +00:00
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::setView(const GLfloat *matrix) {
2020-07-10 17:49:16 +00:00
glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, matrix);
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::bindTexture(GLuint textureID) {
2020-07-10 17:49:16 +00:00
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, textureID);
glUniform1i(TextureID, 0);
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::bindNormal(GLuint textureID) {
2020-07-10 17:49:16 +00:00
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D_ARRAY, textureID);
glUniform1i(NormalID, 1);
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::bindHOS(GLuint textureID) {
2020-07-10 17:49:16 +00:00
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D_ARRAY, textureID);
glUniform1i(HOSID, 2);
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::setLightInvDir(const GLfloat *pos) {
2020-07-10 17:49:16 +00:00
glUniform3fv(LightInvDirID, 1, pos);
2020-07-10 19:37:49 +00:00
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::setFog(const GLfloat *color, const GLfloat depth) {
2020-07-10 19:37:49 +00:00
glUniform3fv(FogColorID, 1, color);
glUniform1f(FogDepthID, depth);
2020-08-14 16:56:28 +00:00
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::setSphereProj(const GLfloat *posRad) {
2020-08-14 16:56:28 +00:00
glUniform4fv(SphereProjID, 1, posRad);
}
2020-08-30 16:35:45 +00:00
void VoxelProgram::setCurvature(GLfloat ratio) {
2020-08-14 16:56:28 +00:00
glUniform1f(CurvatureID, ratio);
2020-07-10 17:49:16 +00:00
}