Add uniforms
[wasm.git] / test.cpp
1 #include <GLES3/gl32.h>
2 #include <string>
3 #include <vector>
4 #include <glm/glm.hpp>
5 #include <glm/ext.hpp>
6 #include <glm/gtc/type_ptr.hpp>
7
8 const char* vertShaderSrc = R"(
9 attribute vec4 vertPos;
10 uniform mat4 model;
11 void main() {
12         gl_Position = model * vertPos;
13 }
14 )";
15
16 const char *fragShaderSrc = R"(
17 void main() {
18         gl_FragColor = vec4(1, 0, 1, 1);
19 }
20 )";
21
22 GLuint program;
23
24 extern "C" void setup() {
25         GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
26         const char* sources[1] = { vertShaderSrc };
27         const GLint lengths[1] = { (GLint)strlen(vertShaderSrc) };
28         glShaderSource(vertShader, 1, sources, lengths);
29         glCompileShader(vertShader);
30
31         GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);
32         glShaderSource(fragShader, 1,
33                         new const char*[1] { fragShaderSrc },
34                         new const GLint[1] { (GLint)strlen(fragShaderSrc) });
35         glCompileShader(fragShader);
36
37         program = glCreateProgram();
38         glAttachShader(program, vertShader);
39         glAttachShader(program, fragShader);
40         glLinkProgram(program);
41         glUseProgram(program);
42
43         GLuint vertPosBuffer;
44         glGenBuffers(1, &vertPosBuffer);
45         glBindBuffer(GL_ARRAY_BUFFER, vertPosBuffer);
46         std::vector<float> vertPositions = {
47                 0, 1, 0,
48                 1, -1, 0,
49                 -1, -1, 0
50         };
51         glBufferData(GL_ARRAY_BUFFER, vertPositions.size(), vertPositions.data(), GL_STATIC_DRAW);
52
53         GLuint vertPosLoc = glGetAttribLocation(program, "vertPos");
54         glEnableVertexAttribArray(vertPosLoc);
55         glVertexAttribPointer(vertPosLoc, 3, GL_FLOAT, false, 0, 0);
56 }
57
58 extern "C" void update(int tick) {
59         GLuint modelLoc = glGetUniformLocation(program, "model");
60         const glm::mat4 model = glm::rotate(glm::mat4(1), (float)tick * 0.001f, glm::vec3(0, 0, 1));
61         glUniformMatrix4fv(modelLoc, 1, false, glm::value_ptr(model));
62 }