diff options
author | Karl Berry <karl@freefriends.org> | 2021-02-25 19:22:25 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-02-25 19:22:25 +0000 |
commit | ad547a6b5986815fda458221149728d9d9ab1d87 (patch) | |
tree | 16296910eb3eca724371474ea9aea3994dc69614 /Build/source/utils/asymptote/shaders.cc | |
parent | 947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff) |
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/shaders.cc')
-rw-r--r-- | Build/source/utils/asymptote/shaders.cc | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/shaders.cc b/Build/source/utils/asymptote/shaders.cc new file mode 100644 index 00000000000..a9c038c2299 --- /dev/null +++ b/Build/source/utils/asymptote/shaders.cc @@ -0,0 +1,113 @@ +// shader handling +// Author: Supakorn "Jamie" Rassameemasmuang + +#include "common.h" + +#ifdef HAVE_GL + +#include <fstream> +#include <sstream> +#include <vector> +#include <string> +#include <iostream> + +#include "shaders.h" + +GLuint compileAndLinkShader(std::vector<ShaderfileModePair> const& shaders, + size_t Nlights, size_t NMaterials, + std::vector<std::string> const& defineflags) +{ + GLuint shader = glCreateProgram(); + std::vector<GLuint> compiledShaders; + + size_t n=shaders.size(); + for(size_t i=0; i < n; ++i) { + GLint newshader=createShaderFile(shaders[i].first,shaders[i].second, + Nlights,NMaterials,defineflags); + glAttachShader(shader,newshader); + compiledShaders.push_back(newshader); + } + + glBindAttribLocation(shader,positionAttrib,"position"); + glBindAttribLocation(shader,normalAttrib,"normal"); + glBindAttribLocation(shader,materialAttrib,"material"); + glBindAttribLocation(shader,colorAttrib,"color"); + glBindAttribLocation(shader,widthAttrib,"width"); + + glLinkProgram(shader); + + for(size_t i=0; i < n; ++i) { + glDetachShader(shader,compiledShaders[i]); + glDeleteShader(compiledShaders[i]); + } + + return shader; +} + +GLuint createShaders(GLchar const* src, int shaderType, + std::string const& filename) +{ + GLuint shader=glCreateShader(shaderType); + glShaderSource(shader, 1, &src, NULL); + glCompileShader(shader); + + GLint status; + glGetShaderiv(shader, GL_COMPILE_STATUS, &status); + + if(status != GL_TRUE) { + GLint length; + + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); + + std::vector<GLchar> msg(length); + + glGetShaderInfoLog(shader, length, &length, msg.data()); + + size_t n=msg.size(); + for(size_t i=0; i < n; ++i) { + std::cerr << msg[i]; + } + + std::cerr << std::endl << "GL Compile error" << std::endl; + std::cerr << src << std::endl; + throw 1; + } + return shader; +} + +GLuint createShaderFile(std::string file, int shaderType, size_t Nlights, + size_t Nmaterials, + std::vector<std::string> const& defineflags) +{ + std::ifstream shaderFile; + shaderFile.open(file.c_str()); + std::stringstream shaderSrc; + +#ifdef __APPLE__ +#define GLSL_VERSION "410" +#else +#define GLSL_VERSION "130" +#endif + + shaderSrc << "#version " << GLSL_VERSION << "\n"; + shaderSrc << "#extension GL_ARB_uniform_buffer_object : enable" + << "\n"; + + size_t n=defineflags.size(); + for(size_t i=0; i < n; ++i) { + shaderSrc << "#define " << defineflags[i] << "\n"; + } + + shaderSrc << "#define Nlights " << Nlights << "\n"; + shaderSrc << "const int Nmaterials=" << Nmaterials << ";\n"; + + if(shaderFile) { + shaderSrc << shaderFile.rdbuf(); + shaderFile.close(); + } else { + throw 1; + } + + return createShaders(shaderSrc.str().data(), shaderType, file); +} +#endif |