- OBJ file reading
- VBO memory management - Lighting
This commit is contained in:
96
main.cc
96
main.cc
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user