|
|
@ -3,6 +3,11 @@ |
|
|
|
#include <NSWrapper.hpp> |
|
|
|
#include <png.hpp> |
|
|
|
|
|
|
|
#include <moggle/core/gl.hpp> |
|
|
|
#include <moggle/core/shader.hpp> |
|
|
|
#include <moggle/core/vao.hpp> |
|
|
|
#include <moggle/core/vbo.hpp> |
|
|
|
|
|
|
|
#include <OpenGL/gl3.h> |
|
|
|
|
|
|
|
#include <vector> |
|
|
@ -16,12 +21,17 @@ using namespace std; |
|
|
|
|
|
|
|
#define BUFFER_OFFSET(i) ((char *)NULL + (i)) |
|
|
|
|
|
|
|
const GLfloat quad[] = { |
|
|
|
struct Vertex{ |
|
|
|
moggle::vector3<GLfloat> position; |
|
|
|
moggle::vector3<GLfloat> color; |
|
|
|
}; |
|
|
|
|
|
|
|
const Vertex quad[] = { |
|
|
|
// x y z, r g b
|
|
|
|
1, -1, 0, 1, 0, 0, |
|
|
|
-1, -1, 0, 0, 1, 0, |
|
|
|
1, 1, 0, 0, 0, 1, |
|
|
|
-1, 1, 0, 1, 1, 1 |
|
|
|
{{1, -1, 0}, {1, 0, 0}}, |
|
|
|
{{-1, -1, 0}, {0, 1, 0}}, |
|
|
|
{{1, 1, 0}, {0, 0, 1}}, |
|
|
|
{{-1, 1, 0}, {1, 1, 1}} |
|
|
|
}; |
|
|
|
|
|
|
|
static void check_shader(GLuint s){ |
|
|
@ -43,70 +53,50 @@ string slurp(string filename) { |
|
|
|
} |
|
|
|
|
|
|
|
struct App { |
|
|
|
float time; |
|
|
|
GLuint program; |
|
|
|
GLint uniform; |
|
|
|
GLuint vao; |
|
|
|
GLuint posBufferName; |
|
|
|
|
|
|
|
void initialize(){ |
|
|
|
time = 0; |
|
|
|
program = glCreateProgram(); |
|
|
|
float time = 0; |
|
|
|
moggle::shader_program program; |
|
|
|
moggle::vao v; |
|
|
|
moggle::vbo<Vertex> quad_vbo; |
|
|
|
|
|
|
|
auto v_source_str = slurp("Fractal.vsh"); |
|
|
|
auto v_source = v_source_str.c_str(); |
|
|
|
GLuint v = glCreateShader(GL_VERTEX_SHADER); |
|
|
|
glShaderSource(v, 1, &v_source, NULL); |
|
|
|
glCompileShader(v); |
|
|
|
check_shader(v); |
|
|
|
enum { |
|
|
|
POS_ATTR, |
|
|
|
COL_ATTR |
|
|
|
}; |
|
|
|
|
|
|
|
auto f_source_str = slurp("Fractal.fsh"); |
|
|
|
auto f_source = f_source_str.c_str(); |
|
|
|
GLuint f = glCreateShader(GL_FRAGMENT_SHADER); |
|
|
|
glShaderSource(f, 1, &f_source, NULL); |
|
|
|
glCompileShader(f); |
|
|
|
check_shader(f); |
|
|
|
|
|
|
|
glAttachShader(program, v); |
|
|
|
glAttachShader(program, f); |
|
|
|
|
|
|
|
glBindAttribLocation(program, 0, "position"); |
|
|
|
glBindAttribLocation(program, 1, "color"); |
|
|
|
|
|
|
|
glLinkProgram(program); |
|
|
|
void initialize(){ |
|
|
|
auto vs = moggle::shader::from_file(moggle::shader_type::vertex, "Fractal.vsh"); |
|
|
|
auto fs = moggle::shader::from_file(moggle::shader_type::fragment, "Fractal.fsh"); |
|
|
|
|
|
|
|
uniform = glGetUniformLocation(program, "rotation"); |
|
|
|
program.attach(vs); |
|
|
|
program.attach(fs); |
|
|
|
|
|
|
|
glDetachShader(program, v); |
|
|
|
glDeleteShader(v); |
|
|
|
glDetachShader(program, f); |
|
|
|
glDeleteShader(f); |
|
|
|
program.bind_attribute(POS_ATTR, "position"); |
|
|
|
program.bind_attribute(COL_ATTR, "color"); |
|
|
|
|
|
|
|
glGenVertexArrays(1, &vao); |
|
|
|
glBindVertexArray(vao); |
|
|
|
program.link(); |
|
|
|
|
|
|
|
glGenBuffers(1, &posBufferName); |
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, posBufferName); |
|
|
|
glBufferData(GL_ARRAY_BUFFER, 4*6*4, quad, GL_STATIC_DRAW); |
|
|
|
v.bind(); |
|
|
|
quad_vbo.bind(GL_ARRAY_BUFFER); |
|
|
|
quad_vbo.data(quad); |
|
|
|
|
|
|
|
glEnableVertexAttribArray(0); |
|
|
|
glEnableVertexAttribArray(1); |
|
|
|
moggle::gl::enable_vertex_attribute_array(POS_ATTR); |
|
|
|
moggle::gl::enable_vertex_attribute_array(COL_ATTR); |
|
|
|
|
|
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*4, BUFFER_OFFSET(0)); |
|
|
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*4, BUFFER_OFFSET(3*4)); |
|
|
|
v.attribute(POS_ATTR, quad_vbo, &Vertex::position); |
|
|
|
v.attribute(COL_ATTR, quad_vbo, &Vertex::color); |
|
|
|
} |
|
|
|
|
|
|
|
void draw(){ |
|
|
|
time += 1/60.0f; |
|
|
|
|
|
|
|
glClearColor(0.65f, 0.65f, 0.65f, 1.0f); |
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
|
|
|
moggle::gl::clear_color(0.65f, 0.65f, 0.65f, 1.0f); |
|
|
|
moggle::gl::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
|
|
|
|
|
|
|
glUseProgram(program); |
|
|
|
glUniform1f(uniform, time); |
|
|
|
glBindVertexArray(vao); |
|
|
|
program.use(); |
|
|
|
program.uniform<GLfloat>("rotation").set(time); |
|
|
|
v.bind(); |
|
|
|
|
|
|
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); |
|
|
|
moggle::gl::draw_arrays(GL_TRIANGLE_STRIP, 0, 4); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
@ -195,7 +185,7 @@ int main() { |
|
|
|
app.create_window({ |
|
|
|
[&](ContextParameters){ |
|
|
|
a.initialize(); |
|
|
|
b.initialize(); |
|
|
|
// b.initialize();
|
|
|
|
}, |
|
|
|
[&](ContextParameters){ |
|
|
|
a.draw(); |
|
|
|