summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/shaders.cc
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/utils/asymptote/shaders.cc
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (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.cc113
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