More preparation for the legendary triangle. Currently working on Batch.h
to specify the batch pipeline specified at StackOverflow See https://stackoverflow.com/questions/8923174/opengl-vao-best-practices#8923298
This commit is contained in:
parent
34ba510e43
commit
40617c8953
@ -1,14 +1,11 @@
|
|||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
|
||||||
#include <Windows.h>
|
#include "Exception.h"
|
||||||
#include <glew/glew.h>
|
|
||||||
#include <gl/GL.h>
|
|
||||||
|
|
||||||
#pragma comment(lib, "opengl32.lib")
|
|
||||||
|
|
||||||
Application::Application(const char* class_name, HINSTANCE h_instance)
|
Application::Application(const char* class_name, HINSTANCE h_instance)
|
||||||
: m_window(class_name, h_instance), m_input_manager(&m_window.get_input_manager()), m_client_size(1280, 720)
|
: m_window(class_name, h_instance), m_input_manager(&m_window.get_input_manager()), m_client_size(1280, 720)
|
||||||
{
|
{
|
||||||
|
base_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -25,8 +22,7 @@ Application::~Application()
|
|||||||
|
|
||||||
int Application::run()
|
int Application::run()
|
||||||
{
|
{
|
||||||
if (!base_init()) return 1;
|
init();
|
||||||
|
|
||||||
MessageResponse resp(UNSET);
|
MessageResponse resp(UNSET);
|
||||||
while (resp != QUIT_MESSAGE) {
|
while (resp != QUIT_MESSAGE) {
|
||||||
// Handle all messages
|
// Handle all messages
|
||||||
@ -45,10 +41,10 @@ void Application::close()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::base_init()
|
void Application::base_init()
|
||||||
{
|
{
|
||||||
if (!m_window.register_class()) return false;
|
if (!m_window.register_class()) throw EXCEPTION("Unable to register window class.");
|
||||||
if (!m_window.create_window("OpenGLEngine", -1, -1, m_client_size.x, m_client_size.y)) return false;
|
if (!m_window.create_window("OpenGLEngine", -1, -1, m_client_size.x, m_client_size.y)) throw EXCEPTION("Unable to create window");
|
||||||
|
|
||||||
// Initialize window with OpenGL (May want to move this into MyApplication to allow application customization)
|
// Initialize window with OpenGL (May want to move this into MyApplication to allow application customization)
|
||||||
// https://www.khronos.org/opengl/wiki/Creating_an_OpenGL_Context_(WGL)
|
// https://www.khronos.org/opengl/wiki/Creating_an_OpenGL_Context_(WGL)
|
||||||
@ -70,12 +66,23 @@ bool Application::base_init()
|
|||||||
|
|
||||||
SetPixelFormat(device_context, pixel_format, &pfd);
|
SetPixelFormat(device_context, pixel_format, &pfd);
|
||||||
|
|
||||||
m_window.set_h_glrc(wglCreateContext(m_window.get_h_dc()));
|
HGLRC glrc = wglCreateContext(m_window.get_h_dc());
|
||||||
|
|
||||||
|
wglMakeCurrent(device_context, glrc);
|
||||||
|
|
||||||
|
m_window.set_h_glrc(glrc);
|
||||||
|
|
||||||
|
GLenum glewErr = glewInit();
|
||||||
|
if (glewErr != GLEW_OK)
|
||||||
|
{
|
||||||
|
OutputDebugString("Glew Init Failed: ");
|
||||||
|
OutputDebugString((char*)glewGetErrorString(glewErr));
|
||||||
|
OutputDebugString("\n");
|
||||||
|
throw EXCEPTION("GLEW Init Failure");
|
||||||
|
}
|
||||||
|
|
||||||
m_window.show(SW_NORMAL);
|
m_window.show(SW_NORMAL);
|
||||||
m_fps.prepare();
|
m_fps.prepare();
|
||||||
|
|
||||||
return init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::base_close()
|
void Application::base_close()
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Windows.h>
|
#include "stdafx.h"
|
||||||
|
|
||||||
#include "vec2.h"
|
#include "vec2.h"
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Called on initialization of the application (called by base_init)
|
// Called on initialization of the application (called by base_init)
|
||||||
virtual bool init() = 0;
|
virtual void init() = 0;
|
||||||
|
|
||||||
virtual void update(float delta_time, clock_t clock) = 0;
|
virtual void update(float delta_time, clock_t clock) = 0;
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ protected:
|
|||||||
// The FPS counter of this application
|
// The FPS counter of this application
|
||||||
FPS m_fps;
|
FPS m_fps;
|
||||||
private:
|
private:
|
||||||
bool base_init();
|
void base_init();
|
||||||
void base_close();
|
void base_close();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
20
OpenGLEngine/Batch.h
Normal file
20
OpenGLEngine/Batch.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "ShaderProgram.h"
|
||||||
|
#include "Renderable.h"
|
||||||
|
|
||||||
|
template <typename VertexType, typename IndexType>
|
||||||
|
class Batch
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Batch(ShaderProgram* p_shader_program, const std::vector<Renderable<VertexType, IndexType>*>& p_renderables);
|
||||||
|
|
||||||
|
virtual void init() = 0; // Maybe make this automatic? Or in the constructor?
|
||||||
|
virtual void render() = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
ShaderProgram* m_p_shader_program;
|
||||||
|
std::vector<Renderable<VertexType, IndexType>*> m_p_renderables;
|
||||||
|
};
|
16
OpenGLEngine/Exception.cpp
Normal file
16
OpenGLEngine/Exception.cpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
Exception::Exception(const std::string& message, const std::string& class_name)
|
||||||
|
: m_message(message), m_class_name(class_name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& Exception::get_message()
|
||||||
|
{
|
||||||
|
return m_message;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& Exception::get_class_name()
|
||||||
|
{
|
||||||
|
return m_class_name;
|
||||||
|
}
|
19
OpenGLEngine/Exception.h
Normal file
19
OpenGLEngine/Exception.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
// TODO: This MUST be changed to something less generic
|
||||||
|
#define EXCEPTION(message) Exception(message, typeid(*this).name())
|
||||||
|
|
||||||
|
class Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Exception(const std::string& message, const std::string& class_name);
|
||||||
|
|
||||||
|
const std::string& get_message();
|
||||||
|
const std::string& get_class_name();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_message;
|
||||||
|
std::string m_class_name;
|
||||||
|
};
|
10
OpenGLEngine/Mesh.h
Normal file
10
OpenGLEngine/Mesh.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
template <typename VertexType, typename IndexType>
|
||||||
|
struct Mesh
|
||||||
|
{
|
||||||
|
VertexType* vertices = nullptr;
|
||||||
|
unsigned int vertex_count = 0;
|
||||||
|
IndexType* indices = nullptr;
|
||||||
|
unsigned int index_count = 0;
|
||||||
|
};
|
@ -10,10 +10,10 @@ MyApplication::~MyApplication()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MyApplication::init()
|
void MyApplication::init()
|
||||||
{
|
{
|
||||||
|
m_scene.init();
|
||||||
m_scene.use();
|
m_scene.use();
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyApplication::update(float delta_time, clock_t clock)
|
void MyApplication::update(float delta_time, clock_t clock)
|
||||||
|
@ -10,7 +10,7 @@ public:
|
|||||||
MyApplication(const char* class_name, HINSTANCE h_instance);
|
MyApplication(const char* class_name, HINSTANCE h_instance);
|
||||||
~MyApplication();
|
~MyApplication();
|
||||||
|
|
||||||
bool init() override;
|
void init() override;
|
||||||
|
|
||||||
void update(float delta_time, clock_t clock) override;
|
void update(float delta_time, clock_t clock) override;
|
||||||
|
|
||||||
|
11
OpenGLEngine/MyBatch.cpp
Normal file
11
OpenGLEngine/MyBatch.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include "MyBatch.h"
|
||||||
|
|
||||||
|
void MyBatch::init()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void MyBatch::render()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
9
OpenGLEngine/MyBatch.h
Normal file
9
OpenGLEngine/MyBatch.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Batch.h"
|
||||||
|
|
||||||
|
class MyBatch : public Batch
|
||||||
|
{
|
||||||
|
void init() override;
|
||||||
|
void render() override;
|
||||||
|
};
|
@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
MyShaderProgram::MyShaderProgram()
|
MyShaderProgram::MyShaderProgram()
|
||||||
// TEMP Hardcode in the path
|
// TEMP Hardcode in the path
|
||||||
: m_vertex_shader(Util::load_file("D:\\Development\\C++\\OpenGLEngine\\OpenGLEngine\\MyVertexShader.glsl").data(), VERTEX_SHADER),
|
: m_vertex_shader(Util::load_file("D:\\Development\\C++\\OpenGLEngine\\OpenGLEngine\\MyVertexShader.glsl"), VERTEX_SHADER),
|
||||||
m_fragment_shader(Util::load_file("D:\\Development\\C++\\OpenGLEngine\\OpenGLEngine\\MyFragmentShader.glsl").data(), FRAGMENT_SHADER)
|
m_fragment_shader(Util::load_file("D:\\Development\\C++\\OpenGLEngine\\OpenGLEngine\\MyFragmentShader.glsl"), FRAGMENT_SHADER)
|
||||||
{
|
{
|
||||||
attach_shader(m_vertex_shader);
|
attach_shader(m_vertex_shader);
|
||||||
attach_shader(m_fragment_shader);
|
attach_shader(m_fragment_shader);
|
||||||
|
@ -13,6 +13,8 @@ public:
|
|||||||
float z;
|
float z;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef unsigned int Index;
|
||||||
|
|
||||||
MyShaderProgram();
|
MyShaderProgram();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -9,6 +9,12 @@ MySimpleScene::~MySimpleScene()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MySimpleScene::init()
|
||||||
|
{
|
||||||
|
m_shader_program.init();
|
||||||
|
m_triangle.init();
|
||||||
|
}
|
||||||
|
|
||||||
void MySimpleScene::use()
|
void MySimpleScene::use()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -25,5 +31,5 @@ void MySimpleScene::render()
|
|||||||
{
|
{
|
||||||
m_shader_program.use();
|
m_shader_program.use();
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, m_triangle.get_vbo());
|
glBindBuffer(GL_ARRAY_BUFFER, m_triangle.get_vbo());
|
||||||
glDrawArrays(GL_TRIANGLES, 0, m_triangle.get_vertex_count());
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@ public:
|
|||||||
MySimpleScene();
|
MySimpleScene();
|
||||||
~MySimpleScene();
|
~MySimpleScene();
|
||||||
|
|
||||||
|
void init() override;
|
||||||
|
|
||||||
void use() override;
|
void use() override;
|
||||||
|
|
||||||
void unuse() override;
|
void unuse() override;
|
||||||
|
@ -1,31 +1,37 @@
|
|||||||
#include "MyTriangle.h"
|
#include "MyTriangle.h"
|
||||||
|
|
||||||
|
#include "Mesh.h"
|
||||||
|
|
||||||
MyTriangle::MyTriangle()
|
MyTriangle::MyTriangle()
|
||||||
{
|
{
|
||||||
|
MeshType* mesh = new MeshType();
|
||||||
|
mesh->vertices = new VertexType[3]
|
||||||
|
{
|
||||||
|
{ 0.0, 0.5, 1.0 },
|
||||||
|
{ 0.5, -0.5, 1.0 },
|
||||||
|
{ -0.5, -0.5, 1.0 },
|
||||||
|
};
|
||||||
|
mesh->vertex_count = 3;
|
||||||
|
mesh->indices = new unsigned int[3] { 0, 1, 2, };
|
||||||
|
mesh->index_count = 3;
|
||||||
|
m_p_mesh = mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
MyTriangle::~MyTriangle()
|
MyTriangle::~MyTriangle()
|
||||||
{
|
{
|
||||||
}
|
if (m_p_mesh != nullptr)
|
||||||
|
{
|
||||||
const MyTriangle::VertexType* MyTriangle::get_vertices() const
|
if (m_p_mesh->vertices != nullptr)
|
||||||
{
|
{
|
||||||
return m_vertices;
|
delete[] m_p_mesh->vertices;
|
||||||
}
|
}
|
||||||
|
if (m_p_mesh->indices != nullptr)
|
||||||
const unsigned int MyTriangle::get_vertex_count() const
|
{
|
||||||
{
|
delete[] m_p_mesh->indices;
|
||||||
return m_vertex_count;
|
}
|
||||||
}
|
delete m_p_mesh;
|
||||||
|
m_p_mesh = nullptr;
|
||||||
const MyTriangle::IndexType* MyTriangle::get_indices() const
|
}
|
||||||
{
|
|
||||||
return m_indices;
|
|
||||||
}
|
|
||||||
|
|
||||||
const unsigned int MyTriangle::get_index_count() const
|
|
||||||
{
|
|
||||||
return m_index_count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint MyTriangle::gen_vbo() const
|
GLuint MyTriangle::gen_vbo() const
|
||||||
@ -33,7 +39,7 @@ GLuint MyTriangle::gen_vbo() const
|
|||||||
GLuint vbo;
|
GLuint vbo;
|
||||||
glGenBuffers(1, &vbo);
|
glGenBuffers(1, &vbo);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
glBufferData(GL_ARRAY_BUFFER, m_vertex_count * sizeof(VertexType), m_vertices, GL_STATIC_DRAW); // TODO: Optimise Usage
|
glBufferData(GL_ARRAY_BUFFER, m_p_mesh->vertex_count * sizeof(VertexType), m_p_mesh->vertices, GL_STATIC_DRAW); // TODO: Optimise Usage
|
||||||
return vbo;
|
return vbo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,33 +4,16 @@
|
|||||||
|
|
||||||
#include "MyShaderProgram.h"
|
#include "MyShaderProgram.h"
|
||||||
|
|
||||||
class MyTriangle : public Renderable<MyShaderProgram::Vertex>
|
class MyTriangle : public Renderable<MyShaderProgram::Vertex, MyShaderProgram::Index>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MyTriangle();
|
MyTriangle();
|
||||||
~MyTriangle();
|
~MyTriangle();
|
||||||
|
|
||||||
const VertexType* get_vertices() const override;
|
|
||||||
const unsigned int get_vertex_count() const override;
|
|
||||||
const IndexType* get_indices() const override;
|
|
||||||
const unsigned int get_index_count() const override;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
GLuint gen_vbo() const override;
|
GLuint gen_vbo() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const unsigned int m_vertex_count = 3;
|
|
||||||
const VertexType m_vertices[3] =
|
|
||||||
{
|
|
||||||
{ 0.0f, 0.5f, 0.0f },
|
|
||||||
{ 0.5f, -0.5f, 0.0f },
|
|
||||||
{ -0.5f, -0.5f, 0.0f },
|
|
||||||
};
|
|
||||||
|
|
||||||
const unsigned int m_index_count = 3;
|
|
||||||
const IndexType m_indices[3] =
|
|
||||||
{
|
|
||||||
0, 1, 2,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -69,7 +69,12 @@
|
|||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup />
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LibraryPath>D:\Development\C++\OpenGLEngine\lib;$(LibraryPath)</LibraryPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LibraryPath>D:\Development\C++\OpenGLEngine\lib;$(LibraryPath)</LibraryPath>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
@ -85,10 +90,9 @@
|
|||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>$(ProjectDir)..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(ProjectDir)..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link />
|
||||||
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
@ -112,7 +116,8 @@
|
|||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>C:\Users\peterm8\source\repos\OpenGLEngine\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(ProjectDir)..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
@ -121,6 +126,7 @@
|
|||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Application.cpp" />
|
<ClCompile Include="Application.cpp" />
|
||||||
|
<ClCompile Include="Exception.cpp" />
|
||||||
<ClCompile Include="FPS.cpp" />
|
<ClCompile Include="FPS.cpp" />
|
||||||
<ClCompile Include="InputManager.cpp" />
|
<ClCompile Include="InputManager.cpp" />
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
@ -130,14 +136,20 @@
|
|||||||
<ClCompile Include="MyTriangle.cpp" />
|
<ClCompile Include="MyTriangle.cpp" />
|
||||||
<ClCompile Include="Shader.cpp" />
|
<ClCompile Include="Shader.cpp" />
|
||||||
<ClCompile Include="ShaderProgram.cpp" />
|
<ClCompile Include="ShaderProgram.cpp" />
|
||||||
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="Util.cpp" />
|
<ClCompile Include="Util.cpp" />
|
||||||
<ClCompile Include="Window.cpp" />
|
<ClCompile Include="Window.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Application.h" />
|
<ClInclude Include="Application.h" />
|
||||||
|
<ClInclude Include="Exception.h" />
|
||||||
<ClInclude Include="FPS.h" />
|
<ClInclude Include="FPS.h" />
|
||||||
<ClInclude Include="InputManager.h" />
|
<ClInclude Include="InputManager.h" />
|
||||||
<ClInclude Include="mat4x4.h" />
|
<ClInclude Include="mat4x4.h" />
|
||||||
|
<ClInclude Include="Mesh.h" />
|
||||||
<ClInclude Include="MyApplication.h" />
|
<ClInclude Include="MyApplication.h" />
|
||||||
<ClInclude Include="MyShaderProgram.h" />
|
<ClInclude Include="MyShaderProgram.h" />
|
||||||
<ClInclude Include="MySimpleScene.h" />
|
<ClInclude Include="MySimpleScene.h" />
|
||||||
@ -146,6 +158,7 @@
|
|||||||
<ClInclude Include="Scene.h" />
|
<ClInclude Include="Scene.h" />
|
||||||
<ClInclude Include="Shader.h" />
|
<ClInclude Include="Shader.h" />
|
||||||
<ClInclude Include="ShaderProgram.h" />
|
<ClInclude Include="ShaderProgram.h" />
|
||||||
|
<ClInclude Include="stdafx.h" />
|
||||||
<ClInclude Include="Util.h" />
|
<ClInclude Include="Util.h" />
|
||||||
<ClInclude Include="vec2.h" />
|
<ClInclude Include="vec2.h" />
|
||||||
<ClInclude Include="vec3.h" />
|
<ClInclude Include="vec3.h" />
|
||||||
|
@ -63,6 +63,12 @@
|
|||||||
<ClCompile Include="MyShaderProgram.cpp">
|
<ClCompile Include="MyShaderProgram.cpp">
|
||||||
<Filter>Source Files\Example</Filter>
|
<Filter>Source Files\Example</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Exception.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Window.h">
|
<ClInclude Include="Window.h">
|
||||||
@ -116,6 +122,15 @@
|
|||||||
<ClInclude Include="MyShaderProgram.h">
|
<ClInclude Include="MyShaderProgram.h">
|
||||||
<Filter>Header Files\Example</Filter>
|
<Filter>Header Files\Example</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="stdafx.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Exception.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Mesh.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="MyVertexShader.glsl">
|
<None Include="MyVertexShader.glsl">
|
||||||
|
@ -1,31 +1,30 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include <Windows.h>
|
#include "Mesh.h"
|
||||||
#include <glew/glew.h>
|
|
||||||
#include <gl/GL.h>
|
|
||||||
|
|
||||||
#pragma comment(lib, "opengl32.lib")
|
template <typename VertexType, typename IndexType>
|
||||||
|
|
||||||
template <typename VertexType>
|
|
||||||
class Renderable
|
class Renderable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef VertexType VertexType;
|
typedef VertexType VertexType;
|
||||||
typedef unsigned int IndexType;
|
typedef IndexType IndexType;
|
||||||
|
typedef Mesh<VertexType, IndexType> MeshType;
|
||||||
|
|
||||||
Renderable()
|
virtual ~Renderable() { };
|
||||||
|
|
||||||
|
void init()
|
||||||
{
|
{
|
||||||
m_vbo = gen_vbo();
|
m_vbo = gen_vbo();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~Renderable() { };
|
const MeshType* get_mesh() const
|
||||||
|
{
|
||||||
virtual const VertexType* get_vertices() const = 0;
|
return m_p_mesh;
|
||||||
virtual const unsigned int get_vertex_count() const = 0;
|
}
|
||||||
virtual const IndexType* get_indices() const = 0;
|
|
||||||
virtual const unsigned int get_index_count() const = 0;
|
|
||||||
|
|
||||||
GLuint get_vbo() const
|
GLuint get_vbo() const
|
||||||
{
|
{
|
||||||
@ -35,5 +34,6 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
virtual GLuint gen_vbo() const = 0;// TODO: A VBO for every object?
|
virtual GLuint gen_vbo() const = 0;// TODO: A VBO for every object?
|
||||||
|
|
||||||
GLuint m_vbo;
|
const MeshType* m_p_mesh = nullptr;
|
||||||
|
GLuint m_vbo = 0;
|
||||||
};
|
};
|
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
class Scene
|
class Scene
|
||||||
@ -7,6 +9,9 @@ class Scene
|
|||||||
public:
|
public:
|
||||||
virtual ~Scene() { };
|
virtual ~Scene() { };
|
||||||
|
|
||||||
|
// Called when the scene is ready to be initialized
|
||||||
|
virtual void init() = 0;
|
||||||
|
|
||||||
// Called when the scene is going to be used
|
// Called when the scene is going to be used
|
||||||
// Should allocate all graphics memory.
|
// Should allocate all graphics memory.
|
||||||
virtual void use() = 0;
|
virtual void use() = 0;
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
#include "Shader.h"
|
#include "Shader.h"
|
||||||
|
|
||||||
Shader::Shader(const char* source, ShaderType type)
|
#include <Windows.h>
|
||||||
: m_type(type)
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
Shader::Shader(const std::string& source, ShaderType type)
|
||||||
{
|
{
|
||||||
GLenum gl_shader_type;
|
GLenum gl_shader_type;
|
||||||
switch (type)
|
switch (type)
|
||||||
@ -18,7 +21,9 @@ Shader::Shader(const char* source, ShaderType type)
|
|||||||
|
|
||||||
m_shader = glCreateShader(gl_shader_type);
|
m_shader = glCreateShader(gl_shader_type);
|
||||||
|
|
||||||
glShaderSource(m_shader, 1, &source, NULL);
|
const char* c_str = source.c_str();
|
||||||
|
|
||||||
|
glShaderSource(m_shader, 1, &c_str, NULL);
|
||||||
glCompileShader(m_shader);
|
glCompileShader(m_shader);
|
||||||
|
|
||||||
// Make sure that the shader has been compiled successfully
|
// Make sure that the shader has been compiled successfully
|
||||||
@ -32,8 +37,11 @@ Shader::Shader(const char* source, ShaderType type)
|
|||||||
buffer[log_length] = '\0'; // Add null terminator
|
buffer[log_length] = '\0'; // Add null terminator
|
||||||
OutputDebugString("Error Compiling Shader:\n");
|
OutputDebugString("Error Compiling Shader:\n");
|
||||||
OutputDebugString(buffer);
|
OutputDebugString(buffer);
|
||||||
|
OutputDebugString("\nSource:\n");
|
||||||
|
OutputDebugString(source.c_str());
|
||||||
|
OutputDebugString("\n");
|
||||||
m_shader = 0;
|
m_shader = 0;
|
||||||
throw "Error compiling shader.";
|
throw EXCEPTION("Error compiling shader.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Windows.h>
|
#include "stdafx.h"
|
||||||
#include <glew/glew.h>
|
|
||||||
#include <gl/GL.h>
|
|
||||||
|
|
||||||
#pragma comment(lib, "opengl32.lib")
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -17,13 +13,12 @@ enum ShaderType
|
|||||||
class Shader
|
class Shader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Shader(const char* source, ShaderType type);
|
Shader(const std::string& source, ShaderType type);
|
||||||
~Shader();
|
~Shader();
|
||||||
|
|
||||||
GLuint get_shader() const;
|
GLuint get_shader() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLuint m_shader;
|
GLuint m_shader;
|
||||||
ShaderType m_type;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
ShaderProgram::ShaderProgram()
|
ShaderProgram::ShaderProgram()
|
||||||
{
|
{
|
||||||
m_program = glCreateProgram();
|
m_program = glCreateProgram();
|
||||||
m_vao = gen_vao();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderProgram::~ShaderProgram()
|
ShaderProgram::~ShaderProgram()
|
||||||
@ -11,6 +10,11 @@ ShaderProgram::~ShaderProgram()
|
|||||||
glDeleteProgram(m_program);
|
glDeleteProgram(m_program);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ShaderProgram::init()
|
||||||
|
{
|
||||||
|
m_vao = gen_vao();
|
||||||
|
}
|
||||||
|
|
||||||
void ShaderProgram::attach_shader(const Shader& shader)
|
void ShaderProgram::attach_shader(const Shader& shader)
|
||||||
{
|
{
|
||||||
glAttachShader(m_program, shader.get_shader());
|
glAttachShader(m_program, shader.get_shader());
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Windows.h>
|
#include "stdafx.h"
|
||||||
#include <glew/glew.h>
|
|
||||||
#include <gl/GL.h>
|
|
||||||
|
|
||||||
#pragma comment(lib, "opengl32.lib")
|
#include "Exception.h"
|
||||||
|
|
||||||
#include "Shader.h"
|
#include "Shader.h"
|
||||||
|
|
||||||
@ -14,6 +12,7 @@ public:
|
|||||||
ShaderProgram();
|
ShaderProgram();
|
||||||
virtual ~ShaderProgram();
|
virtual ~ShaderProgram();
|
||||||
|
|
||||||
|
void init();
|
||||||
void use();
|
void use();
|
||||||
|
|
||||||
GLuint get_program() const;
|
GLuint get_program() const;
|
||||||
@ -27,6 +26,6 @@ protected:
|
|||||||
virtual GLuint gen_vao() const = 0;
|
virtual GLuint gen_vao() const = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLuint m_program;
|
GLuint m_program = 0;
|
||||||
GLuint m_vao;
|
GLuint m_vao = 0;
|
||||||
};
|
};
|
@ -1,17 +1,32 @@
|
|||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
std::vector<char> Util::load_file(const std::string& path)
|
#include "Exception.h"
|
||||||
|
|
||||||
|
std::string Util::load_file(const std::string& path)
|
||||||
{
|
{
|
||||||
std::ifstream input_stream(path, std::ios::binary | std::ios::in | std::ios::ate);
|
std::ifstream input_stream;
|
||||||
if (input_stream)
|
try
|
||||||
{
|
{
|
||||||
std::streampos size = input_stream.tellg();
|
input_stream.open(path);
|
||||||
input_stream.seekg(std::ios::beg);
|
}
|
||||||
std::vector<char> buffer(size);
|
catch (std::ios::failure& e)
|
||||||
input_stream.read(buffer.data(), size);
|
{
|
||||||
input_stream.close();
|
throw Exception(std::string("Error Opening File: ") + e.what(), "class Util");
|
||||||
|
}
|
||||||
|
if (input_stream.is_open())
|
||||||
|
{
|
||||||
|
input_stream.seekg(0, std::ios::end);
|
||||||
|
size_t size = input_stream.tellg();
|
||||||
|
std::string buffer(size, ' ');
|
||||||
|
input_stream.seekg(std::ios::beg);
|
||||||
|
input_stream.read(&buffer[0], size);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw Exception("Unable to access file: " + path, "class Util");
|
||||||
}
|
}
|
||||||
throw "Unable to access file.";
|
|
||||||
}
|
}
|
@ -6,5 +6,5 @@
|
|||||||
class Util
|
class Util
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static std::vector<char> load_file(const std::string& path);
|
static std::string load_file(const std::string& path);
|
||||||
};
|
};
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Windows.h>
|
#include "stdafx.h"
|
||||||
|
|
||||||
#include "InputManager.h"
|
#include "InputManager.h"
|
||||||
|
|
||||||
|
@ -1,7 +1,27 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
#include "MyApplication.h"
|
#include "MyApplication.h"
|
||||||
|
|
||||||
int WINAPI WinMain(HINSTANCE h_instance, HINSTANCE h_prev_instance, LPSTR cmd_line, int n_cmd_show)
|
int WINAPI WinMain(HINSTANCE h_instance, HINSTANCE h_prev_instance, LPSTR cmd_line, int n_cmd_show)
|
||||||
{
|
{
|
||||||
MyApplication my_app("my_app", h_instance);
|
try
|
||||||
return my_app.run();
|
{
|
||||||
|
MyApplication my_app("my_app", h_instance);
|
||||||
|
return my_app.run();
|
||||||
|
}
|
||||||
|
catch (Exception& e)
|
||||||
|
{
|
||||||
|
OutputDebugString("Caught Exception: [");
|
||||||
|
OutputDebugString(e.get_class_name().c_str());
|
||||||
|
OutputDebugString("]: ");
|
||||||
|
OutputDebugString(e.get_message().c_str());
|
||||||
|
OutputDebugString("\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
2
OpenGLEngine/stdafx.cpp
Normal file
2
OpenGLEngine/stdafx.cpp
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
#include "stdafx.h"
|
6
OpenGLEngine/stdafx.h
Normal file
6
OpenGLEngine/stdafx.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glew/glew.h>
|
||||||
|
|
||||||
|
#pragma comment(lib, "glew32.lib")
|
||||||
|
#pragma comment(lib, "opengl32.lib")
|
BIN
lib/glew32.lib
Normal file
BIN
lib/glew32.lib
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user