Skip to content
Snippets Groups Projects
Commit 30b9fe9b authored by BATON Theau's avatar BATON Theau
Browse files

Starting a new rendering system

parent ad9344f3
No related branches found
No related tags found
No related merge requests found
#pragma once
#include <engine/io/Window.hpp>
#include <engine/graphics/utility/module.hpp>
#include <engine/graphics/front/engine/TextureArray.hpp>
namespace megu {
class Renderable {
public:
template <class T>
void accept(const Window & window, const Camera & camera, Module<T> & modul, const TextureArray & array) {
modul.render(window, camera, *static_cast<T *>(this), array);
}
};
}
\ No newline at end of file
#include "Sprite.hpp"
namespace megu {
Sprite::Sprite(const Texture & texture)
: _frame(0, 0, texture.width(), texture.height()), _texture(texture) {
this->_transformation.scale(static_cast<float>(texture.width()), static_cast<float>(texture.height()));
}
Sprite::Sprite(const Texture & texture, const glm::vec4 & frame)
: _frame(frame), _texture(texture) {
this->_transformation.move(frame.x, frame.y);
this->_transformation.scale(frame.z, frame.w);
}
}
\ No newline at end of file
#pragma once
#include <engine/graphics/back/geometry/Transformable.hpp>
#include <engine/graphics/back/textures/Texture.hpp>
#include <engine/graphics/front/geometry/Quads.hpp>
namespace megu {
class Sprite {
public:
Sprite(const Texture &);
Sprite(const Texture &, const glm::vec4 &);
inline void setFrame(const glm::vec4 & frame) {this->_frame = frame;}
inline const glm::vec4 & frame() const {return this->_frame;}
inline const Texture & texture() const {return this->_texture;}
inline const Quads & geometry() const {return this->_geometry;}
inline const Transformable & transformation() const {return this->_transformation;}
private:
glm::vec4 _frame;
Texture _texture;
Quads _geometry;
Transformable _transformation;
};
}
\ No newline at end of file
#include "isometric_sorter.hpp" #include "isometric_sorter.hpp"
#include <engine/graphics/front/object/Image.hpp> #include <engine/graphics/front/object/Image.hpp>
#include <engine/graphics/front/object/Sprite.hpp>
namespace megu { namespace megu {
bool isometric_sorter::operator()(const Image & img1, const Image & img2) const { bool isometric_sorter::operator()(const Image & img1, const Image & img2) const {
...@@ -18,4 +19,20 @@ namespace megu { ...@@ -18,4 +19,20 @@ namespace megu {
return &img1 > &img2; return &img1 > &img2;
} }
bool isometric_sorter_sprite::operator()(const Sprite & img1, const Sprite & img2) const {
if(img1.transformation().z() != img2.transformation().z()) {
return img1.transformation().z() > img2.transformation().z();
}
if(img1.transformation().y() != img2.transformation().y()) {
return img1.transformation().y() > img2.transformation().y();
}
if(img1.transformation().x() != img2.transformation().x()) {
return img1.transformation().x() > img2.transformation().x();
}
return &img1 > &img2;
}
} }
\ No newline at end of file
...@@ -2,9 +2,15 @@ ...@@ -2,9 +2,15 @@
namespace megu { namespace megu {
class Image; class Image;
class Sprite;
class isometric_sorter { class isometric_sorter {
public: public:
bool operator()(const Image & img1, const Image & img2) const; bool operator()(const Image & img1, const Image & img2) const;
}; };
class isometric_sorter_sprite {
public:
bool operator()(const Sprite & img1, const Sprite & img2) const;
};
} }
\ No newline at end of file
...@@ -5,8 +5,12 @@ ...@@ -5,8 +5,12 @@
#include <engine/io/Window.hpp> #include <engine/io/Window.hpp>
namespace megu { namespace megu {
class DrawGroup { template <class T>
class Module {
public: public:
virtual void draw(const Window &, const Camera &, const TextureArray &) const = 0; virtual void render(const Window &, const Camera &, T &, const TextureArray &) = 0;
}; };
template <class ... Ts>
class Multi_Module : public Module<Ts> ... {};
} }
\ No newline at end of file
#pragma once
#include <set>
#include "reference_sorter.hpp"
namespace megu {
template <class T>
using ref_set = std::set<std::reference_wrapper<T>, reference_sorter<T>>;
}
\ No newline at end of file
#include <iostream> #include <iostream>
#include <thread>
#include <GL/glew.h> #include <GL/glew.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
...@@ -13,10 +14,8 @@ ...@@ -13,10 +14,8 @@
#include <engine/io/Window.hpp> #include <engine/io/Window.hpp>
#include <engine/graphics/back/cameras/View.hpp> #include <engine/graphics/back/cameras/View.hpp>
#include <engine/graphics/front/object/Image.hpp> #include <engine/graphics/front/object/Image.hpp>
#include <engine/graphics/front/group/ImageGroup.hpp>
#include <engine/graphics/front/engine/Renderer.hpp> #include <engine/graphics/front/engine/Renderer.hpp>
#include <engine/graphics/front/engine/Engine.hpp> #include <engine/graphics/front/engine/Engine.hpp>
#include <engine/graphics/front/group/VertexArrayGroup.hpp>
#include <engine/graphics/errors.hpp> #include <engine/graphics/errors.hpp>
const float i_x = 1.f; const float i_x = 1.f;
...@@ -31,12 +30,14 @@ glm::vec2 to_screen_coordinate(const glm::vec2 & tile, float w, float h, float l ...@@ -31,12 +30,14 @@ glm::vec2 to_screen_coordinate(const glm::vec2 & tile, float w, float h, float l
}; };
} }
/*
megu::Vertex to_screen_coordinate(int x, int y, unsigned int u, unsigned int v, const megu::Texture & texture) { megu::Vertex to_screen_coordinate(int x, int y, unsigned int u, unsigned int v, const megu::Texture & texture) {
return {{x, y}, {static_cast<float>(u) / static_cast<float>(texture.width()), static_cast<float>(v) / static_cast<float>(texture.height())}}; return {{x, y}, {static_cast<float>(u) / static_cast<float>(texture.width()), static_cast<float>(v) / static_cast<float>(texture.height())}};
} }
*/
//* Isometric : //* Isometric :
/*
int main(int argc, const char * argv[]) { int main(int argc, const char * argv[]) {
try { try {
//? Window //? Window
...@@ -46,10 +47,6 @@ int main(int argc, const char * argv[]) { ...@@ -46,10 +47,6 @@ int main(int argc, const char * argv[]) {
std::cout << "Window Inited" << std::endl; std::cout << "Window Inited" << std::endl;
//? Group
megu::ImageGroup group;
megu::ImageGroup group_2;
std::cout << "Group Inited" << std::endl; std::cout << "Group Inited" << std::endl;
//? Image 1 //? Image 1
...@@ -117,10 +114,10 @@ int main(int argc, const char * argv[]) { ...@@ -117,10 +114,10 @@ int main(int argc, const char * argv[]) {
++x; ++x;
} }
for(auto & i : images) { /*for(auto & i : images) {
group.add(*i); group.add(*i);
i.get()->setSize({32.f, 32.f}); i.get()->setSize({32.f, 32.f});
} }*/
std::cout << "Images 1 Inited" << std::endl; std::cout << "Images 1 Inited" << std::endl;
...@@ -159,26 +156,20 @@ int main(int argc, const char * argv[]) { ...@@ -159,26 +156,20 @@ int main(int argc, const char * argv[]) {
++x_2; ++x_2;
} }
for(auto & i : images_2) { /*for(auto & i : images_2) {
group_2.add(*i); group_2.add(*i);
i.get()->setSize({32.f, 32.f}); i.get()->setSize({32.f, 32.f});
} }*/
std::cout << "Images 2 Inited" << std::endl; std::cout << "Images 2 Inited" << std::endl;
//? ImGui
//ImGui::CreateContext();
//ImGui_ImplOpenGL3_Init();
//ImGui_ImplGlfw_InitForOpenGL(window.ptr(), true);
//? Engines //? Engines
megu::GraphicEngine engine(window); megu::GraphicEngine engine(window);
megu::Renderer basic_renderer(360, 360); megu::Renderer basic_renderer(360, 360);
engine.push(0, basic_renderer); engine.push(0, basic_renderer);
engine.push(0, 0, *images.front());
engine.push(0, 0, group);
//engine.push(0, 0, group_2);
//? Render Loop //? Render Loop
std::cout << "Render Loop Begin !" << std::endl; std::cout << "Render Loop Begin !" << std::endl;
...@@ -209,8 +200,10 @@ int main(int argc, const char * argv[]) { ...@@ -209,8 +200,10 @@ int main(int argc, const char * argv[]) {
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
*/
//* Tilemap
/*
int main(int argc, const char * argv[]) { int main(int argc, const char * argv[]) {
try { try {
//? Window //? Window
...@@ -232,10 +225,10 @@ int main(int argc, const char * argv[]) { ...@@ -232,10 +225,10 @@ int main(int argc, const char * argv[]) {
megu::VerticesArray grid_1(megu::Quads::Primitive(), 4); megu::VerticesArray grid_1(megu::Quads::Primitive(), 4);
/*grid_1[0] = {{0.f, 0.f}, {0.0f, 0.0f}}; //grid_1[0] = {{0.f, 0.f}, {0.0f, 0.0f}};
grid_1[1] = {{16.f, 0.f}, {0.5f, 0.0f}}; //grid_1[1] = {{16.f, 0.f}, {0.5f, 0.0f}};
grid_1[2] = {{16.f, 16.f}, {0.5f, 0.5f}}; //grid_1[2] = {{16.f, 16.f}, {0.5f, 0.5f}};
grid_1[3] = {{0.f, 16.f}, {0.0f, 0.5f}};*/ //grid_1[3] = {{0.f, 16.f}, {0.0f, 0.5f}};
...@@ -291,6 +284,96 @@ int main(int argc, const char * argv[]) { ...@@ -291,6 +284,96 @@ int main(int argc, const char * argv[]) {
std::cerr << error.what() << std::endl; std::cerr << error.what() << std::endl;
} }
return EXIT_SUCCESS;
}*/
//* Sprite
/*
int main(int argc, const char * argv[]) {
try {
//? Window
megu::Window window;
window.open("Sprite Window", 360, 360);
megu::error::opengl_error::check();
std::cout << "Window Inited" << std::endl;
//? Group
megu::SpriteGroup group;
megu::ImageGroup group_2;
std::cout << "Group Inited" << std::endl;
//? Grids
megu::Texture texture_1;
texture_1.store(megu::TextureBuffer("assets/textures/Neera.png"));
std::vector<glm::vec4> frames;
frames.push_back({0, 0, 51, 98});
frames.push_back({51, 0, 51, 98});
frames.push_back({102, 0, 51, 98});
frames.push_back({0, 98, 51, 98});
frames.push_back({51, 98, 51, 98});
frames.push_back({102, 98, 51, 98});
megu::Sprite neera(texture_1, frames[0]);
megu::Image image(texture_1);
//neera.scale(1.f, 1.f);
group.add(neera);
group_2.add(image);
std::cout << "Sprite created" << std::endl;
//? Engines
megu::GraphicEngine engine(window);
megu::Renderer basic_renderer(128, 128);
engine.push(0, basic_renderer);
engine.push(0, 0, group);
//? Render Loop
std::cout << "Render Loop Begin !" << std::endl;
double previousTime = megu::Window::Time();
int frameCount = 0;
std::thread t([&frames, &window, &neera](){
size_t i = 0;
while(window.isOpen()) {
std::this_thread::sleep_for(std::chrono::milliseconds(30));
neera.setFrame(frames[i%frames.size()]);
++i;
}
});
while(window.isOpen()) {
double currentTime = megu::Window::Time();
frameCount++;
if(currentTime - previousTime >= 1.0) {
window.setTitle(std::to_string(frameCount));
frameCount = 0;
previousTime = currentTime;
}
window.pollEvents();
engine.step();
}
t.join();
std::cout << "Render Loop End !" << std::endl;
}
catch(std::exception & error) {
std::cerr << error.what() << std::endl;
}
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
*/
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment