Add basic adapter
This commit is contained in:
parent
008b4ef12e
commit
2c303581fe
10 changed files with 73 additions and 35 deletions
|
@ -1,4 +1,4 @@
|
||||||
#include "../src/store.hpp"
|
#include "../src/adapters/adapter.hpp"
|
||||||
#include "../src/scene.hpp"
|
#include "../src/scene.hpp"
|
||||||
#include "../src/camera.hpp"
|
#include "../src/camera.hpp"
|
||||||
#include "../src/lights/sun.hpp"
|
#include "../src/lights/sun.hpp"
|
||||||
|
@ -15,6 +15,7 @@
|
||||||
#include <emscripten/html5.h>
|
#include <emscripten/html5.h>
|
||||||
|
|
||||||
static Store store;
|
static Store store;
|
||||||
|
static const Adapter adapter(store);
|
||||||
|
|
||||||
static void iterate();
|
static void iterate();
|
||||||
|
|
||||||
|
@ -78,12 +79,12 @@ int main()
|
||||||
|
|
||||||
camera.projection = glm::perspective(45.0f, (float)640 / (float)480, 0.1f, 100.0f);
|
camera.projection = glm::perspective(45.0f, (float)640 / (float)480, 0.1f, 100.0f);
|
||||||
|
|
||||||
protagonist = store.load<Models::Static>("protagonist.obj");
|
protagonist = adapter.load<Models::Static>("protagonist.obj");
|
||||||
car = store.load<Models::Static>("car.obj");
|
car = adapter.load<Models::Static>("car.obj");
|
||||||
suzanne = store.load<Models::Static>("suzanne.obj");
|
suzanne = adapter.load<Models::Static>("suzanne.obj");
|
||||||
teapot = store.load<Models::Static>("teapot.obj");
|
teapot = adapter.load<Models::Static>("teapot.obj");
|
||||||
bunny = store.load<Models::Static>("bunny.obj");
|
bunny = adapter.load<Models::Static>("bunny.obj");
|
||||||
untitled = store.load<Models::Raw>("untitled.raw");
|
untitled = adapter.load<Models::Raw>("untitled.raw");
|
||||||
|
|
||||||
protagonist1 = new Objects::WithModel(*protagonist);
|
protagonist1 = new Objects::WithModel(*protagonist);
|
||||||
protagonist1->position.z = 4;
|
protagonist1->position.z = 4;
|
||||||
|
|
36
src/adapters/adapter.hpp
Normal file
36
src/adapters/adapter.hpp
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#ifndef _ADAPTER_HPP_
|
||||||
|
#define _ADAPTER_HPP_
|
||||||
|
|
||||||
|
#include "../store.hpp"
|
||||||
|
|
||||||
|
struct Adapter
|
||||||
|
{
|
||||||
|
Adapter(Store &store): _store(store) {};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
const T *load(const std::string &name) const;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
const std::string filename(const std::string &name) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Store &_store;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
const T *Adapter::load(const std::string &name) const
|
||||||
|
{
|
||||||
|
static_assert(std::is_convertible<T, Resource>::value
|
||||||
|
&& !std::is_same<T, Resource>::value,
|
||||||
|
"Adapter can deal with only Resource's children");
|
||||||
|
|
||||||
|
return _store.load<T>(*this, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
const std::string Adapter::filename(const std::string &name) const
|
||||||
|
{
|
||||||
|
return "/data" + T::filename(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _ADAPTER_HPP_
|
|
@ -21,17 +21,17 @@ const GLchar *const Raw::uniforms[] = {
|
||||||
|
|
||||||
const std::string Raw::filename(const std::string &name)
|
const std::string Raw::filename(const std::string &name)
|
||||||
{
|
{
|
||||||
return "/data/models/" + name;
|
return "/models/" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Raw::Raw(__attribute__((unused)) Store &store, const std::string &name)
|
Raw::Raw(const Adapter &adapter, const std::string &name)
|
||||||
{
|
{
|
||||||
exe = store.load<Program>("normal")->build(
|
exe = adapter.load<Program>("normal")->build(
|
||||||
__attrib_count, attribs,
|
__attrib_count, attribs,
|
||||||
__uniform_count, uniforms
|
__uniform_count, uniforms
|
||||||
);
|
);
|
||||||
|
|
||||||
FILE *file = fopen(filename(name).c_str(), "r");
|
FILE *file = fopen(adapter.filename<Raw>(name).c_str(), "r");
|
||||||
|
|
||||||
while (!feof(file))
|
while (!feof(file))
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,17 +27,17 @@ const GLchar *const Static::uniforms[] = {
|
||||||
|
|
||||||
const std::string Static::filename(const std::string &name)
|
const std::string Static::filename(const std::string &name)
|
||||||
{
|
{
|
||||||
return "/data/models/" + name;
|
return "/models/" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Static::Static(Store &store, const std::string &name)
|
Static::Static(const Adapter &adapter, const std::string &name)
|
||||||
{
|
{
|
||||||
exe = store.load<Program>("textured")->build(
|
exe = adapter.load<Program>("textured")->build(
|
||||||
__attrib_count, attribs,
|
__attrib_count, attribs,
|
||||||
__uniform_count, uniforms
|
__uniform_count, uniforms
|
||||||
);
|
);
|
||||||
|
|
||||||
std::ifstream file(filename(name), std::ios::in);
|
std::ifstream file(adapter.filename<Static>(name), std::ios::in);
|
||||||
|
|
||||||
const Mtllib *mtllib = nullptr;
|
const Mtllib *mtllib = nullptr;
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ Static::Static(Store &store, const std::string &name)
|
||||||
else
|
else
|
||||||
if (line.substr(0, 7) == "mtllib ")
|
if (line.substr(0, 7) == "mtllib ")
|
||||||
{
|
{
|
||||||
mtllib = (Mtllib*)store.load<Mtllib>(line.substr(7));
|
mtllib = adapter.load<Mtllib>(line.substr(7));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (line.substr(0, 7) == "usemtl ")
|
if (line.substr(0, 7) == "usemtl ")
|
||||||
|
|
|
@ -5,12 +5,12 @@
|
||||||
|
|
||||||
const std::string Mtllib::filename(const std::string &name)
|
const std::string Mtllib::filename(const std::string &name)
|
||||||
{
|
{
|
||||||
return "/data/materials/" + name;
|
return "/materials/" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mtllib::Mtllib(Store &store, const std::string &name)
|
Mtllib::Mtllib(const Adapter &adapter, const std::string &name)
|
||||||
{
|
{
|
||||||
std::ifstream file(filename(name), std::ios::in);
|
std::ifstream file(adapter.filename<Mtllib>(name), std::ios::in);
|
||||||
|
|
||||||
Material *material = nullptr;
|
Material *material = nullptr;
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ Mtllib::Mtllib(Store &store, const std::string &name)
|
||||||
else
|
else
|
||||||
if (line.substr(0, 7) == "map_Kd ")
|
if (line.substr(0, 7) == "map_Kd ")
|
||||||
{
|
{
|
||||||
material->texture = store.load<Texture>(line.substr(7));
|
material->texture = adapter.load<Texture>(line.substr(7));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,12 @@
|
||||||
|
|
||||||
const std::string Program::filename(const std::string &name)
|
const std::string Program::filename(const std::string &name)
|
||||||
{
|
{
|
||||||
return "/data/programs/" + name;
|
return "/programs/" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Program::Program(Store &store, const std::string &name):
|
Program::Program(const Adapter &adapter, const std::string &name):
|
||||||
vertex_shader(store.load<Shader>(name + ".vert")),
|
vertex_shader(adapter.load<Shader>(name + ".vert")),
|
||||||
fragment_shader(store.load<Shader>(name + ".frag"))
|
fragment_shader(adapter.load<Shader>(name + ".frag"))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
const Executable *Program::build(
|
const Executable *Program::build(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _RESOURCE_HPP_
|
#ifndef _RESOURCE_HPP_
|
||||||
#define _RESOURCE_HPP_
|
#define _RESOURCE_HPP_
|
||||||
|
|
||||||
#include "store.hpp"
|
#include "adapters/adapter.hpp"
|
||||||
|
|
||||||
struct Resource
|
struct Resource
|
||||||
{
|
{
|
||||||
|
@ -14,7 +14,7 @@ private:
|
||||||
|
|
||||||
#define RESOURCE(T) \
|
#define RESOURCE(T) \
|
||||||
friend struct ::Store; \
|
friend struct ::Store; \
|
||||||
T(Store &store, const std::string &name); \
|
T(const Adapter &adapter, const std::string &name); \
|
||||||
static const std::string filename(const std::string &name);
|
static const std::string filename(const std::string &name);
|
||||||
|
|
||||||
#endif // _RESOURCE_HPP_
|
#endif // _RESOURCE_HPP_
|
||||||
|
|
|
@ -5,14 +5,14 @@
|
||||||
|
|
||||||
const std::string Shader::filename(const std::string &name)
|
const std::string Shader::filename(const std::string &name)
|
||||||
{
|
{
|
||||||
return "/data/shaders/" + name;
|
return "/shaders/" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader::Shader(__attribute__((unused)) Store &store, const std::string &name)
|
Shader::Shader(const Adapter &adapter, const std::string &name)
|
||||||
{
|
{
|
||||||
const GLuint type = name.substr(name.size() - 5) == ".vert" ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER;
|
const GLuint type = name.substr(name.size() - 5) == ".vert" ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER;
|
||||||
|
|
||||||
FILE *file = fopen(filename(name).c_str(), "r");
|
FILE *file = fopen(adapter.filename<Shader>(name).c_str(), "r");
|
||||||
|
|
||||||
fseek(file, 0, SEEK_END);
|
fseek(file, 0, SEEK_END);
|
||||||
const long size = ftell(file);
|
const long size = ftell(file);
|
||||||
|
|
|
@ -5,26 +5,27 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
struct Adapter;
|
||||||
struct Resource;
|
struct Resource;
|
||||||
|
|
||||||
struct Store
|
struct Store
|
||||||
{
|
{
|
||||||
template <class T>
|
template <class T>
|
||||||
const T *load(const std::string &name);
|
const T *load(const Adapter &adapter, const std::string &name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<std::string, Resource*> _resources;
|
std::map<std::string, Resource*> _resources;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
const T *Store::load(const std::string &name)
|
const T *Store::load(const Adapter &adapter, const std::string &name)
|
||||||
{
|
{
|
||||||
static_assert(std::is_convertible<T, Resource>::value
|
static_assert(std::is_convertible<T, Resource>::value
|
||||||
&& !std::is_same<T, Resource>::value,
|
&& !std::is_same<T, Resource>::value,
|
||||||
"Store can load only Resource's children");
|
"Store can load only Resource's children");
|
||||||
|
|
||||||
if (_resources.find(T::filename(name)) == _resources.end())
|
if (_resources.find(T::filename(name)) == _resources.end())
|
||||||
_resources[T::filename(name)] = new T(*this, name);
|
_resources[T::filename(name)] = new T(adapter, name);
|
||||||
|
|
||||||
_resources[T::filename(name)]->_ref_count++;
|
_resources[T::filename(name)]->_ref_count++;
|
||||||
return (T*)_resources[T::filename(name)];
|
return (T*)_resources[T::filename(name)];
|
||||||
|
|
|
@ -6,12 +6,12 @@
|
||||||
|
|
||||||
const std::string Texture::filename(const std::string &name)
|
const std::string Texture::filename(const std::string &name)
|
||||||
{
|
{
|
||||||
return "/data/textures/" + name;
|
return "/textures/" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
Texture::Texture(__attribute__((unused)) Store &store, const std::string &name)
|
Texture::Texture(const Adapter &adapter, const std::string &name)
|
||||||
{
|
{
|
||||||
SDL_Surface *surface = IMG_Load(filename(name).c_str());
|
SDL_Surface *surface = IMG_Load(adapter.filename<Texture>(name).c_str());
|
||||||
|
|
||||||
glGenTextures(1, &_id);
|
glGenTextures(1, &_id);
|
||||||
glBindTexture(GL_TEXTURE_2D, _id);
|
glBindTexture(GL_TEXTURE_2D, _id);
|
||||||
|
|
Reference in a new issue