You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

264 lines
8.2 KiB

#include "esTransform.h"
#include "cube-gles2.h"
#include "cube.h"
#include <kms++util/kms++util.h>
using namespace std;
GlScene::GlScene()
{
GLuint vertex_shader, fragment_shader;
GLint ret;
static const GLfloat vVertices[] = {
// front
-1.0f, -1.0f, +1.0f, // point blue
+1.0f, -1.0f, +1.0f, // point magenta
-1.0f, +1.0f, +1.0f, // point cyan
+1.0f, +1.0f, +1.0f, // point white
// back
+1.0f, -1.0f, -1.0f, // point red
-1.0f, -1.0f, -1.0f, // point black
+1.0f, +1.0f, -1.0f, // point yellow
-1.0f, +1.0f, -1.0f, // point green
// right
+1.0f, -1.0f, +1.0f, // point magenta
+1.0f, -1.0f, -1.0f, // point red
+1.0f, +1.0f, +1.0f, // point white
+1.0f, +1.0f, -1.0f, // point yellow
// left
-1.0f, -1.0f, -1.0f, // point black
-1.0f, -1.0f, +1.0f, // point blue
-1.0f, +1.0f, -1.0f, // point green
-1.0f, +1.0f, +1.0f, // point cyan
// top
-1.0f, +1.0f, +1.0f, // point cyan
+1.0f, +1.0f, +1.0f, // point white
-1.0f, +1.0f, -1.0f, // point green
+1.0f, +1.0f, -1.0f, // point yellow
// bottom
-1.0f, -1.0f, -1.0f, // point black
+1.0f, -1.0f, -1.0f, // point red
-1.0f, -1.0f, +1.0f, // point blue
+1.0f, -1.0f, +1.0f // point magenta
};
static const GLfloat vColors[] = {
// front
0.0f, 0.0f, 1.0f, // blue
1.0f, 0.0f, 1.0f, // magenta
0.0f, 1.0f, 1.0f, // cyan
1.0f, 1.0f, 1.0f, // white
// back
1.0f, 0.0f, 0.0f, // red
0.0f, 0.0f, 0.0f, // black
1.0f, 1.0f, 0.0f, // yellow
0.0f, 1.0f, 0.0f, // green
// right
1.0f, 0.0f, 1.0f, // magenta
1.0f, 0.0f, 0.0f, // red
1.0f, 1.0f, 1.0f, // white
1.0f, 1.0f, 0.0f, // yellow
// left
0.0f, 0.0f, 0.0f, // black
0.0f, 0.0f, 1.0f, // blue
0.0f, 1.0f, 0.0f, // green
0.0f, 1.0f, 1.0f, // cyan
// top
0.0f, 1.0f, 1.0f, // cyan
1.0f, 1.0f, 1.0f, // white
0.0f, 1.0f, 0.0f, // green
1.0f, 1.0f, 0.0f, // yellow
// bottom
0.0f, 0.0f, 0.0f, // black
1.0f, 0.0f, 0.0f, // red
0.0f, 0.0f, 1.0f, // blue
1.0f, 0.0f, 1.0f // magenta
};
static const GLfloat vNormals[] = {
// front
+0.0f, +0.0f, +1.0f, // forward
+0.0f, +0.0f, +1.0f, // forward
+0.0f, +0.0f, +1.0f, // forward
+0.0f, +0.0f, +1.0f, // forward
// back
+0.0f, +0.0f, -1.0f, // backbard
+0.0f, +0.0f, -1.0f, // backbard
+0.0f, +0.0f, -1.0f, // backbard
+0.0f, +0.0f, -1.0f, // backbard
// right
+1.0f, +0.0f, +0.0f, // right
+1.0f, +0.0f, +0.0f, // right
+1.0f, +0.0f, +0.0f, // right
+1.0f, +0.0f, +0.0f, // right
// left
-1.0f, +0.0f, +0.0f, // left
-1.0f, +0.0f, +0.0f, // left
-1.0f, +0.0f, +0.0f, // left
-1.0f, +0.0f, +0.0f, // left
// top
+0.0f, +1.0f, +0.0f, // up
+0.0f, +1.0f, +0.0f, // up
+0.0f, +1.0f, +0.0f, // up
+0.0f, +1.0f, +0.0f, // up
// bottom
+0.0f, -1.0f, +0.0f, // down
+0.0f, -1.0f, +0.0f, // down
+0.0f, -1.0f, +0.0f, // down
+0.0f, -1.0f, +0.0f // down
};
static const char* vertex_shader_source =
"uniform mat4 modelviewMatrix; \n"
"uniform mat4 modelviewprojectionMatrix;\n"
"uniform mat3 normalMatrix; \n"
" \n"
"attribute vec4 in_position; \n"
"attribute vec3 in_normal; \n"
"attribute vec4 in_color; \n"
"\n"
"vec4 lightSource = vec4(2.0, 2.0, 20.0, 0.0);\n"
" \n"
"varying vec4 vVaryingColor; \n"
" \n"
"void main() \n"
"{ \n"
" gl_Position = modelviewprojectionMatrix * in_position;\n"
" vec3 vEyeNormal = normalMatrix * in_normal;\n"
" vec4 vPosition4 = modelviewMatrix * in_position;\n"
" vec3 vPosition3 = vPosition4.xyz / vPosition4.w;\n"
" vec3 vLightDir = normalize(lightSource.xyz - vPosition3);\n"
" float diff = max(0.0, dot(vEyeNormal, vLightDir));\n"
" vVaryingColor = vec4(diff * in_color.rgb, 1.0);\n"
"} \n";
static const char* fragment_shader_source =
"precision mediump float; \n"
" \n"
"varying vec4 vVaryingColor; \n"
" \n"
"void main() \n"
"{ \n"
" gl_FragColor = vVaryingColor; \n"
"} \n";
if (s_verbose) {
printf("GL_VENDOR: %s\n", glGetString(GL_VENDOR));
printf("GL_VERSION: %s\n", glGetString(GL_VERSION));
printf("GL_RENDERER: %s\n", glGetString(GL_RENDERER));
printf("GL_EXTENSIONS: %s\n", glGetString(GL_EXTENSIONS));
}
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
glCompileShader(vertex_shader);
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &ret);
FAIL_IF(!ret, "vertex shader compilation failed!");
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
glCompileShader(fragment_shader);
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &ret);
FAIL_IF(!ret, "fragment shader compilation failed!");
GLuint program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glBindAttribLocation(program, 0, "in_position");
glBindAttribLocation(program, 1, "in_normal");
glBindAttribLocation(program, 2, "in_color");
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &ret);
FAIL_IF(!ret, "program linking failed!");
glUseProgram(program);
m_modelviewmatrix = glGetUniformLocation(program, "modelviewMatrix");
m_modelviewprojectionmatrix = glGetUniformLocation(program, "modelviewprojectionMatrix");
m_normalmatrix = glGetUniformLocation(program, "normalMatrix");
glEnable(GL_CULL_FACE);
GLintptr positionsoffset = 0;
GLintptr colorsoffset = sizeof(vVertices);
GLintptr normalsoffset = sizeof(vVertices) + sizeof(vColors);
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices) + sizeof(vColors) + sizeof(vNormals), 0, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, positionsoffset, sizeof(vVertices), &vVertices[0]);
glBufferSubData(GL_ARRAY_BUFFER, colorsoffset, sizeof(vColors), &vColors[0]);
glBufferSubData(GL_ARRAY_BUFFER, normalsoffset, sizeof(vNormals), &vNormals[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)positionsoffset);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)normalsoffset);
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)colorsoffset);
glEnableVertexAttribArray(2);
}
void GlScene::set_viewport(uint32_t width, uint32_t height)
{
m_width = width;
m_height = height;
}
void GlScene::draw(uint32_t framenum)
{
glViewport(0, 0, m_width, m_height);
glClearColor(0.5, 0.5, 0.5, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
ESMatrix modelview;
esMatrixLoadIdentity(&modelview);
esTranslate(&modelview, 0.0f, 0.0f, -8.0f);
esRotate(&modelview, 45.0f + (0.75f * framenum), 1.0f, 0.0f, 0.0f);
esRotate(&modelview, 45.0f - (0.5f * framenum), 0.0f, 1.0f, 0.0f);
esRotate(&modelview, 10.0f + (0.45f * framenum), 0.0f, 0.0f, 1.0f);
GLfloat aspect = (float)m_height / m_width;
ESMatrix projection;
esMatrixLoadIdentity(&projection);
esFrustum(&projection, -2.8f, +2.8f, -2.8f * aspect, +2.8f * aspect, 6.0f, 10.0f);
ESMatrix modelviewprojection;
esMatrixLoadIdentity(&modelviewprojection);
esMatrixMultiply(&modelviewprojection, &modelview, &projection);
float normal[9];
normal[0] = modelview.m[0][0];
normal[1] = modelview.m[0][1];
normal[2] = modelview.m[0][2];
normal[3] = modelview.m[1][0];
normal[4] = modelview.m[1][1];
normal[5] = modelview.m[1][2];
normal[6] = modelview.m[2][0];
normal[7] = modelview.m[2][1];
normal[8] = modelview.m[2][2];
glUniformMatrix4fv(m_modelviewmatrix, 1, GL_FALSE, &modelview.m[0][0]);
glUniformMatrix4fv(m_modelviewprojectionmatrix, 1, GL_FALSE, &modelviewprojection.m[0][0]);
glUniformMatrix3fv(m_normalmatrix, 1, GL_FALSE, normal);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 12, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 16, 4);
glDrawArrays(GL_TRIANGLE_STRIP, 20, 4);
}