diff --git a/Makefile b/Makefile index 95404e6..fc20af9 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,8 @@ CXX=g++ CXXOPTS=-Og -ggdb -fvar-tracking-assignments -Wall -Wextra -pedantic -std=c++14 -march=native -fstack-protector-strong --param=ssp-buffer-size=4 -flto LDOPTS=-Wl,--sort-common,--as-needed +render_CXXSRCS ::= render/Renderer.cc render/GlResource.cc + iffexplore_CXXSRCS ::= iffexplore.cc IffFile.cc util.cc exceptions.cc iffexplore_LIBS ::= @@ -11,7 +13,7 @@ treexplore_LIBS ::= font2png_CXXSRCS ::= font2png.cc font2png_LIBS ::= -lpng -mvedecode_CXXSRCS ::= mvedecode.cc TreFile.cc IffFile.cc util.cc MveDecoder.cc exceptions.cc decompress.cc +mvedecode_CXXSRCS ::= mvedecode.cc TreFile.cc IffFile.cc util.cc MveDecoder.cc exceptions.cc decompress.cc $(render_CXXSRCS) mvedecode_LIBS ::= -lSDL2 progs ::= iffexplore treexplore mvedecode diff --git a/render/GlResource.cc b/render/GlResource.cc new file mode 100644 index 0000000..37aa792 --- /dev/null +++ b/render/GlResource.cc @@ -0,0 +1,13 @@ +#include + +#include "GlResource.hh" + +using namespace gl; + +void TextureDeleter::operator()(gl::GLuint tex) const { + glDeleteTextures(1, &tex); +} + +void TextureDeleter::operator() (gl::GLsizei count, gl::GLuint tex[]) const { + glDeleteTextures(count, tex); +} diff --git a/render/GlResource.hh b/render/GlResource.hh new file mode 100644 index 0000000..3fb0ddf --- /dev/null +++ b/render/GlResource.hh @@ -0,0 +1,71 @@ +#ifndef WC3RE_RENDER_GLRESOURCE_HH__ +#define WC3RE_RENDER_GLRESOURCE_HH__ + +#include + +struct TextureDeleter { + void operator() (gl::GLuint tex) const; + void operator() (gl::GLsizei count, gl::GLuint tex[]) const; +}; + +struct FramebufferDeleter { + void operator() (gl::GLuint tex) const; +}; + +struct ShaderDeleter { + void operator() (gl::GLuint tex) const; +}; + +struct ProgramDeleter { + void operator() (gl::GLuint tex) const; +}; + +struct VertexArrayDeleter { + void operator() (gl::GLuint tex) const; +}; + +struct BufferDeleter { + void operator() (gl::GLuint tex) const; +}; + +template +class GlResource { +public: + GlResource() + : handle_() { + } + + GlResource(Handle handle) + : handle_(handle) { + } + + ~GlResource() { + if (handle_) + Deleter()(handle_); + handle_ = Handle(); + } + + operator Handle() const { + return handle_; + } + + Handle& get() { + return handle_; + } + + Handle const& get() const { + return handle_; + } + +private: + Handle handle_; +}; + +using TextureResource = GlResource; +using FramebufferResource = GlResource; +using ShaderResource = GlResource; +using ProgramResource = GlResource; +using VertexArrayResource = GlResource; +using BufferResource = GlResource; + +#endif diff --git a/render/Renderer.cc b/render/Renderer.cc new file mode 100644 index 0000000..b8b49c1 --- /dev/null +++ b/render/Renderer.cc @@ -0,0 +1,12 @@ +#include + +#include "Renderer.hh" +#include "GlResource.hh" + +using namespace gl; + +Renderer::Renderer() +{ + TextureResource testTex; + glGenTextures(1, &testTex.get()); +} diff --git a/render/Renderer.hh b/render/Renderer.hh new file mode 100644 index 0000000..a0bfae2 --- /dev/null +++ b/render/Renderer.hh @@ -0,0 +1,14 @@ +#ifndef WC3RE_RENDER_RENDERER_HH__ +#define WC3RE_RENDER_RENDERER_HH__ + +#include + +class Renderer { +public: + Renderer(); + +private: + SDL_Window *win; +}; + +#endif