106 lines
3.5 KiB
C++
106 lines
3.5 KiB
C++
|
/* _______________ ,----------------------------------------------------------------.
|
||
|
//`````````````\\ \ \
|
||
|
//~~~~~~~~~~~~~~~\\ \ by @ohsqueezy & @sleepin \
|
||
|
//=================\\ \ [ohsqueezy.itch.io] [sleepin.itch.io] \
|
||
|
// \\ \ \
|
||
|
// \\ \ code released under the zlib license [git.nugget.fun/pudding] \
|
||
|
// ☆ GUNKISS ☆ \\ \ \
|
||
|
//_________________________\\ `---------------------------------------------------------------*/
|
||
|
|
||
|
#ifndef MODEL_H_
|
||
|
#define MODEL_H_
|
||
|
|
||
|
/* GL functions */
|
||
|
#if defined(__ANDROID__) || defined(ANDROID)
|
||
|
#include <GLES3/gl3.h>
|
||
|
#include <GLES3/gl3ext.h>
|
||
|
#else
|
||
|
#include "glew/glew.h"
|
||
|
#endif
|
||
|
|
||
|
#include <iostream>
|
||
|
#include <string>
|
||
|
#include <map>
|
||
|
#include <memory>
|
||
|
#include <iterator>
|
||
|
#include "glm/glm.hpp"
|
||
|
#include "Attributes.hpp"
|
||
|
#include "Texture.hpp"
|
||
|
|
||
|
class Model
|
||
|
{
|
||
|
|
||
|
private:
|
||
|
|
||
|
inline static const std::string DEFAULT_TEXTURE_NAME = "default";
|
||
|
std::map<std::string, sb::Texture> model_textures;
|
||
|
std::map<std::string, std::shared_ptr<sb::Attributes>> model_attributes;
|
||
|
glm::mat4 model_transformation {1.0f};
|
||
|
|
||
|
public:
|
||
|
|
||
|
Model();
|
||
|
Model(const std::map<std::string, std::shared_ptr<sb::Attributes>>&);
|
||
|
Model(const std::map<std::string, sb::Attributes>&);
|
||
|
Model(const std::initializer_list<std::string>&);
|
||
|
std::map<std::string, std::shared_ptr<sb::Attributes>>& attributes();
|
||
|
std::shared_ptr<sb::Attributes>& attributes(const std::string&);
|
||
|
void attributes(const sb::Attributes&, const std::string&);
|
||
|
void attributes(const std::shared_ptr<sb::Attributes>&, const std::string&);
|
||
|
std::shared_ptr<sb::Attributes>& operator[](const std::string&);
|
||
|
void enable();
|
||
|
void disable();
|
||
|
std::map<std::string, sb::Texture>& textures();
|
||
|
sb::Texture& texture(const std::string&);
|
||
|
sb::Texture& texture();
|
||
|
void texture(const sb::Texture&, const std::string&);
|
||
|
void texture(const sb::Texture&);
|
||
|
const glm::mat4& transformation() const;
|
||
|
void transformation(const glm::mat4&);
|
||
|
std::size_t size();
|
||
|
operator glm::mat4() const;
|
||
|
|
||
|
};
|
||
|
|
||
|
class Plane : public Model
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
inline const static std::shared_ptr<sb::Attributes> position = std::make_shared<sb::Attributes>(sb::Attributes{
|
||
|
{-1.0f, 1.0f}, {1.0f, 1.0f}, {-1.0f, -1.0f},
|
||
|
{1.0f, 1.0f}, {1.0f, -1.0f}, {-1.0f, -1.0f}
|
||
|
});
|
||
|
inline const static std::shared_ptr<sb::Attributes> uv = std::make_shared<sb::Attributes>(sb::Attributes{
|
||
|
{0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 0.0f},
|
||
|
{1.0f, 1.0f}, {1.0f, 0.0f}, {0.0f, 0.0f}
|
||
|
});
|
||
|
|
||
|
Plane() : Model(std::map<std::string, std::shared_ptr<sb::Attributes>>({{"position", position}, {"uv", uv}})) {}
|
||
|
|
||
|
};
|
||
|
|
||
|
/*!
|
||
|
* A version of `Plane` which contains two texture objects, one of which is active at a time. A reference
|
||
|
* to the active `sb::Texture` object is available from `PlaneDoubleBuffer.active`, and the inactive object is
|
||
|
* available from `PlaneDoubleBuffer.inactive`. The buffers can be swapped using `PlaneDoubleBuffer.swap`.
|
||
|
*/
|
||
|
class PlaneDoubleBuffer : public Plane
|
||
|
{
|
||
|
|
||
|
private:
|
||
|
|
||
|
bool swapped = false;
|
||
|
|
||
|
public:
|
||
|
|
||
|
PlaneDoubleBuffer();
|
||
|
void generate(const glm::vec2&);
|
||
|
sb::Texture& active();
|
||
|
sb::Texture& inactive();
|
||
|
void swap();
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|