- OBJ file reading

- VBO memory management
- Lighting
This commit is contained in:
2014-11-17 18:19:46 +01:00
parent ba8e07aa4e
commit 5f388a1723
16 changed files with 578 additions and 135 deletions

96
main.cc
View File

@@ -5,8 +5,9 @@
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <glbinding/gl/gl.h>
#include <glbinding/Binding.h>
#include <glbinding/callbacks.h>
#define GLM_FORCE_RADIANS
#include <glm/glm.hpp>
@@ -17,13 +18,28 @@
#include "common.hh"
#include "shaders.hh"
#include "texture.hh"
#include "VBOManager.hh"
#include "objectParser.hh"
#include "Object.hh"
using namespace gl;
void glAfterCallback(glbinding::FunctionCall const& fc)
{
glbinding::setCallbackMask(glbinding::CallbackMask::None);
GLenum error = glGetError();
glbinding::setCallbackMask(glbinding::CallbackMask::After);
if (error != GL_NO_ERROR)
throw GLException(error);
}
int main(int argc, char *argv[])
{
SDL_Window *window;
int retcode = 0;
glbinding::Binding::initialize();
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::printf("Could not init SDL: %s\n", SDL_GetError());
return 1;
@@ -49,7 +65,7 @@ int main(int argc, char *argv[])
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_OPENGL);
/*SDL_WINDOW_FULLSCREEN_DESKTOP |*/ SDL_WINDOW_OPENGL);
if (!window) {
std::printf("Could not create window: %s\n", SDL_GetError());
@@ -64,9 +80,13 @@ int main(int argc, char *argv[])
SDL_Quit();
return 1;
}
// Clear GL errors
while(glGetError() != GL_NO_ERROR);
try {
while(glGetError() != GL_NO_ERROR);
glbinding::setCallbackMask(glbinding::CallbackMask::After);
glbinding::setAfterCallback(glAfterCallback);
{
int depth, stencil, aa, major, minor;
@@ -84,8 +104,8 @@ int main(int argc, char *argv[])
SDL_GetWindowSize(window, &width, &height);
glm::mat4 proj = glm::perspectiveFov(75.0f, static_cast<float>(width), static_cast<float>(height),
0.1f, 100.0f);
glm::mat4 view = glm::lookAt(glm::vec3(0, 0, 10),
glm::vec3(0, 0, 0),
glm::mat4 view = glm::lookAt(glm::vec3(2.0f, 2.0f, 10),
glm::vec3(0.0f, 0.0f, 0),
glm::vec3(0, 1, 0));
// sf::Font font;
// if (!font.loadFromFile("DejaVuSans.ttf")) {
@@ -101,55 +121,33 @@ int main(int argc, char *argv[])
// sf::Clock clock;
// sf::Time last = clock.getElapsedTime();
VBOManager vboManager;
Texture2D cubeTex("textures/Wood_Box_Texture.jpg");
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, static_cast<int>(GL_LINEAR_MIPMAP_LINEAR));
if (SDL_GL_ExtensionSupported("GL_EXT_texture_filter_anisotropic"))
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 4.0f);
else
std::printf("Warning: extension GL_EXT_texture_filter_anisotropic not supported\n");
auto box = readObject("objects/woodbox.obj");
Texture2D redTex("textures/red.png");
Texture2D whiteTex("textures/white.png");
VertexShader vs{fileToString("shaders/textured.vs")};
FragmentShader fs{fileToString("shaders/textured.fs")};
Program prog(vs, fs);
checkGlError();
prog.use();
glUniformMatrix4fv(prog.getUniformLocation("projection_matrix"), 1, GL_FALSE,
glm::value_ptr(proj));
glUniformMatrix4fv(prog.getUniformLocation("view_matrix"), 1, GL_FALSE,
glm::value_ptr(view));
glUniform1i(prog.getUniformLocation("texBase"), 0);
int vertexAL = prog.getAttribLocation("vertex");
int vertexTCAL = prog.getAttribLocation("vertexTC");
checkGlError();
GLuint buf;
glGenBuffers(1, &buf);
glBindBuffer(GL_ARRAY_BUFFER, buf);
checkGlError();
glBufferData(GL_ARRAY_BUFFER, sizeof(objVertexAttribs)*std::get<0>(box).size(), NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(objVertexAttribs)*std::get<0>(box).size(),
(void*)std::get<0>(box).data());
GLuint arr[2];
glGenVertexArrays(2, arr);
checkGlError();
glBindVertexArray(arr[0]);
glEnableVertexAttribArray(vertexAL);
glEnableVertexAttribArray(vertexTCAL);
glVertexAttribPointer(vertexAL, 3, GL_FLOAT, GL_FALSE, sizeof(objVertexAttribs),
(void*)offsetof(objVertexAttribs, vertex));
glVertexAttribPointer(vertexTCAL, 2, GL_UNSIGNED_SHORT, GL_TRUE, sizeof(objVertexAttribs),
(void*)offsetof(objVertexAttribs, texCoords));
checkGlError();
Object box(vboManager, "objects/woodbox.obj", prog);
Object pyramid(vboManager, "objects/pyramid.obj", prog);
Object plane(vboManager, "objects/plane.obj", prog);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnable(GL_DEPTH_TEST);
checkGlError();
bool close = false;
@@ -169,15 +167,19 @@ int main(int argc, char *argv[])
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
checkGlError();
glEnable(GL_CULL_FACE);
glm::mat4 model = glm::translate(glm::vec3(0.5f, 0.5f, -0.5f)) *
glm::rotate(SDL_GetTicks()*0.001f, glm::vec3(1.0f, 0.0f, 0.0f)) *
glm::translate(glm::vec3(-0.5f, -0.5f, 0.5f));
cubeTex.bind();
box.draw(model);
whiteTex.bind();
plane.draw(glm::translate(glm::vec3(2.0f, -2.5f, 0.0f))*
glm::rotate(0.35f, glm::vec3(0.0f, 1.0f, 0.0f)));
redTex.bind();
pyramid.draw(glm::translate(glm::vec3(-2.0f, 0.0f, 0.0f)));
prog.use();
glm::mat4 model = glm::rotate(SDL_GetTicks()*0.001f, glm::vec3(1.0f, 0.0f, 0.0f));
glUniformMatrix4fv(prog.getUniformLocation("modelview_matrix"), 1, GL_FALSE,
glm::value_ptr(view*model));
glDrawElements(GL_TRIANGLES, std::get<1>(box).size(), GL_UNSIGNED_SHORT, std::get<1>(box).data());
checkGlError();
// glUseProgram(0);
// sf::Time now = clock.getElapsedTime();
// sf::Time elapsed = now - last;