remove old transform and velocity components and replace with new decomposed components

focus on 2D for now
This commit is contained in:
2022-01-04 22:33:59 +01:00
parent c36fa30cbc
commit 12b0a90ad0
71 changed files with 1114 additions and 528 deletions

View File

@ -1,7 +1,5 @@
#include "./batched_spritesheet.hpp"
#include <memory>
#include <mm/opengl/shader.hpp>
#include <mm/opengl/buffer.hpp>
#include <mm/opengl/vertex_array_object.hpp>
@ -13,11 +11,9 @@
#include <mm/services/scene_service_interface.hpp>
#include <entt/entity/registry.hpp>
#include <mm/components/transform2d.hpp>
#include <mm/components/transform4x4.hpp>
#include <mm/components/color.hpp>
#include "./spritesheet_renderable.hpp"
#include <mm/services/opengl_renderer.hpp>
#include <tracy/Tracy.hpp>
#ifndef MM_OPENGL_3_GLES
@ -67,18 +63,17 @@ BatchedSpriteSheet::~BatchedSpriteSheet(void) {
void BatchedSpriteSheet::render(Services::OpenGLRenderer& rs, Engine& engine) {
ZoneScopedN("MM::OpenGL::RenderTasks::BatchedSpriteSheet::render");
auto* scene_ss = engine.tryService<MM::Services::SceneServiceInterface>();
// no scene
if (scene_ss == nullptr) {
return;
auto* ssi = engine.tryService<MM::Services::SceneServiceInterface>();
if (ssi == nullptr) {
return; // nothing to draw
}
auto& scene = scene_ss->getScene();
auto& scene = ssi->getScene();
struct sp_data {
SpriteSheet sp;
struct instance_data {
MM::Components::Transform2D* trans = nullptr;
const MM::Components::Transform4x4* trans = nullptr;
glm::vec4* color = nullptr;
uint32_t tile_index = 0;
};
@ -87,13 +82,11 @@ void BatchedSpriteSheet::render(Services::OpenGLRenderer& rs, Engine& engine) {
// HACK: assume same sp for same texture
std::unordered_map<MM::OpenGL::Texture::handle_t, sp_data> batch_map;
auto view = scene.view<Components::Transform2D, SpriteSheetRenderable>();
view.each([&](auto e, Components::Transform2D& t, SpriteSheetRenderable& spr) {
// if off screen, early out
if (false) { // TODO:
return;
}
scene.view<const Components::Transform4x4, SpriteSheetRenderable>().each([this, &scene, &batch_map](entt::entity e, const auto& t, auto& spr) {
//// if off screen, early out
//if (false) { // TODO:
//return;
//}
assert(spr.sp.tex); // debug
@ -139,7 +132,8 @@ void BatchedSpriteSheet::render(Services::OpenGLRenderer& rs, Engine& engine) {
auto* inst_memory = gl_inst_buffer->map(sp_ent.second.instances.size(), GL_DYNAMIC_DRAW);
for (auto& inst : sp_ent.second.instances) {
inst_memory->pos_trans = inst.trans->getTransform4(inst.trans->position.y/10.f + 500.f);
//inst_memory->pos_trans = inst.trans->getTransform4(inst.trans->position.y/10.f + 500.f);
inst_memory->pos_trans = inst.trans->trans; // TODO: this is ugly
inst_memory->color = *inst.color;
inst_memory->tile_index = inst.tile_index;
@ -149,6 +143,8 @@ void BatchedSpriteSheet::render(Services::OpenGLRenderer& rs, Engine& engine) {
static_assert(std::is_standard_layout<gl_instance_data>::value); // check if offsetof() is usable
// TODO: optimize, dont call attrib pointer each draw
// mat4, oof
// attptr 1-4
for (size_t i = 0; i < 4; i++) {

View File

@ -11,7 +11,7 @@
#include <mm/services/scene_service_interface.hpp>
#include <entt/entity/registry.hpp>
#include <mm/components/transform2d.hpp>
#include <mm/components/transform4x4.hpp>
#include <mm/components/color.hpp>
#include <tracy/Tracy.hpp>
@ -56,6 +56,13 @@ SimpleRect::~SimpleRect(void) {
void SimpleRect::render(Services::OpenGLRenderer& rs, Engine& engine) {
ZoneScopedN("MM::OpenGL::RenderTasks::SimpleRect::render");
auto* ssi = engine.tryService<MM::Services::SceneServiceInterface>();
if (ssi == nullptr) {
return; // nothing to draw
}
auto& scene = ssi->getScene();
rs.targets[target_fbo]->bind(FrameBufferObject::RW);
glEnable(GL_DEPTH_TEST);
@ -64,8 +71,6 @@ void SimpleRect::render(Services::OpenGLRenderer& rs, Engine& engine) {
_shader->bind();
_vao->bind();
auto& scene = engine.tryService<MM::Services::SceneServiceInterface>()->getScene();
Camera3D* cam = scene.try_ctx<Camera3D>();
if (!cam) {
cam = &default_cam;
@ -73,12 +78,8 @@ void SimpleRect::render(Services::OpenGLRenderer& rs, Engine& engine) {
auto vp = cam->getViewProjection();
auto view = scene.view<MM::Components::Transform2D>();
for (auto& e : view) {
auto& t = view.get<Components::Transform2D>(e);
_shader->setUniformMat4f("_WVP", vp * t.getTransform4(t.position.y/10.f + 500.f));
scene.view<const Components::Transform4x4>().each([this, &scene, &vp](entt::entity e, const auto& t) {
_shader->setUniformMat4f("_WVP", vp * t.trans);
if (scene.all_of<Components::Color>(e)) {
_shader->setUniform4f("_color", scene.get<Components::Color>(e).color);
@ -86,9 +87,8 @@ void SimpleRect::render(Services::OpenGLRenderer& rs, Engine& engine) {
_shader->setUniform4f("_color", default_color);
}
glDrawArrays(GL_TRIANGLES, 0, 6);
}
});
_vao->unbind();
_shader->unbind();
@ -106,7 +106,7 @@ in vec2 _vertexPosition;
uniform mat4 _WVP;
void main() {
gl_Position = _WVP * vec4(_vertexPosition, 0, 1);
gl_Position = _WVP * vec4(_vertexPosition, 0.0, 1.0);
})")
FS_CONST_MOUNT_FILE(fragmentPath,

View File

@ -11,7 +11,7 @@
#include <mm/services/scene_service_interface.hpp>
#include <entt/entity/registry.hpp>
#include <mm/components/transform2d.hpp>
#include <mm/components/transform4x4.hpp>
#include <mm/opengl/components/texture.hpp>
#include <mm/components/color.hpp>
@ -62,6 +62,13 @@ SimpleSprite::~SimpleSprite(void) {
void SimpleSprite::render(Services::OpenGLRenderer& rs, Engine& engine) {
ZoneScopedN("MM::OpenGL::RenderTasks::SimpleSprite::render");
auto* ssi = engine.tryService<MM::Services::SceneServiceInterface>();
if (ssi == nullptr) {
return; // nothing to draw
}
auto& scene = ssi->getScene();
rs.targets[target_fbo]->bind(FrameBufferObject::W);
glEnable(GL_DEPTH_TEST);
@ -72,8 +79,6 @@ void SimpleSprite::render(Services::OpenGLRenderer& rs, Engine& engine) {
_vao->bind();
auto& scene = engine.tryService<MM::Services::SceneServiceInterface>()->getScene();
auto* cam = scene.try_ctx<Camera3D>();
if (!cam) {
cam = &default_cam;
@ -81,14 +86,12 @@ void SimpleSprite::render(Services::OpenGLRenderer& rs, Engine& engine) {
auto vp = cam->getViewProjection();
auto view = scene.view<Components::Transform2D, Components::OpenGL::Texture>();
view.each([&](auto e, Components::Transform2D& t, Components::OpenGL::Texture& tex) {
scene.view<const Components::Transform4x4, Components::OpenGL::Texture>().each([this, &scene, &vp](entt::entity e, const auto& t, auto& tex) {
assert(tex.tex); // debug
tex.tex->bind(0);
_shader->setUniformMat4f("_WVP", vp * t.getTransform4(t.position.y/10.f + 500.f));
_shader->setUniformMat4f("_WVP", vp * t.trans);
if (scene.all_of<Components::Color>(e)) {
_shader->setUniform4f("_color", scene.get<Components::Color>(e).color);

View File

@ -11,7 +11,7 @@
#include <mm/services/scene_service_interface.hpp>
#include <entt/entity/registry.hpp>
#include <mm/components/transform2d.hpp>
#include <mm/components/transform4x4.hpp>
#include <mm/components/color.hpp>
#include "./spritesheet_renderable.hpp"
@ -69,6 +69,13 @@ SimpleSpriteSheet::~SimpleSpriteSheet(void) {
void SimpleSpriteSheet::render(Services::OpenGLRenderer& rs, Engine& engine) {
ZoneScopedN("MM::OpenGL::RenderTasks::SimpleSpriteSheet::render");
auto* ssi = engine.tryService<MM::Services::SceneServiceInterface>();
if (ssi == nullptr) {
return; // nothing to draw
}
auto& scene = ssi->getScene();
rs.targets[target_fbo]->bind(FrameBufferObject::W);
glEnable(GL_DEPTH_TEST);
@ -78,9 +85,6 @@ void SimpleSpriteSheet::render(Services::OpenGLRenderer& rs, Engine& engine) {
_vertexBuffer->bind(GL_ARRAY_BUFFER);
_vao->bind();
auto& scene = engine.tryService<MM::Services::SceneServiceInterface>()->getScene();
auto* cam = scene.try_ctx<Camera3D>();
if (!cam) {
cam = &default_cam;
@ -88,16 +92,14 @@ void SimpleSpriteSheet::render(Services::OpenGLRenderer& rs, Engine& engine) {
auto vp = cam->getViewProjection();
auto view = scene.view<Components::Transform2D, SpriteSheetRenderable>();
view.each([&](auto e, Components::Transform2D& t, SpriteSheetRenderable& spr) {
scene.view<const Components::Transform4x4, SpriteSheetRenderable>().each([this, &scene, &vp](entt::entity e, const auto& t, auto& spr) {
assert(spr.sp.tex); // debug
TracyGpuZone("MM::OpenGL::Renderers::SimpleSpriteSheetRenderer::render.each");
spr.sp.tex->bind(0);
_shader->setUniformMat4f("_WVP", vp * t.getTransform4(t.position.y/10.f + 500.f));
_shader->setUniformMat4f("_WVP", vp * t.trans);
_shader->setUniform2ui("_tileCount", spr.sp.tile_count.x, spr.sp.tile_count.y);
_shader->setUniform1ui("_atlasIndex", spr.tile_index);

View File

@ -1,3 +1,5 @@
#pragma once
#include <mm/opengl/spritesheet.hpp>
namespace MM::OpenGL {

View File

@ -11,7 +11,7 @@
#include <mm/services/scene_service_interface.hpp>
#include <entt/entity/registry.hpp>
#include <mm/components/transform2d.hpp>
#include <mm/components/transform4x4.hpp>
#include <mm/opengl/components/texture.hpp>
#include <mm/components/color.hpp>
@ -87,9 +87,10 @@ void Tilemap::render(MM::Services::OpenGLRenderer& rs, MM::Engine& engine) {
_shader->setUniform3f("_ambient_color", ambient_color);
auto view = scene.view<MM::Components::Transform2D, OpenGL::TilemapRenderable>();
view.each([&](auto, MM::Components::Transform2D& t, OpenGL::TilemapRenderable& tilemap) {
_shader->setUniformMat4f("_WVP", vp * t.getTransform4(tilemap.z + 500.f));
scene.view<MM::Components::Transform4x4, OpenGL::TilemapRenderable>()
.each([&](auto, MM::Components::Transform4x4& t, OpenGL::TilemapRenderable& tilemap) {
//_shader->setUniformMat4f("_WVP", vp * t.getTransform4(tilemap.z + 500.f));
_shader->setUniformMat4f("_WVP", vp * t.trans);
// for each sprite layer
for (auto& sp_layer : tilemap.sprite_layer) {

View File

@ -42,7 +42,7 @@ struct TilemapRenderable {
};
std::vector<SpriteLayer> sprite_layer;
float z = 0.f;
//float z = 0.f; // TODO: use Components::Position2D_ZOffset instead
};
} // MM::OpenGL