light/Mirror/src/MirrorLayer.h
Light aab0c7b958 CameraComponent, SceneCamera
- Added CameraComponent
- Added SceneCamera
- Renamed the previous Camera to OrthographicCamera
- Added Camera
- Renderer now takes a Camera* for projection and mat4& for view
- Scene::OnRender now takes in an optional Framebuffer to render to
- Minor tidying
2021-07-30 14:40:34 +04:30

98 lines
No EOL
2.8 KiB
C++

#include <LightEngine.h>
#include <glm/gtc/matrix_transform.hpp>
namespace Light {
class MirrorLayer : public Layer
{
private:
Ref<Texture> m_AwesomefaceTexture;
glm::vec2 m_Direction;
float m_Speed = 1000.0f;
Ref<Framebuffer> m_Framebuffer;
Scene m_Scene;
Entity m_CameraEntity;
public:
MirrorLayer(const std::string& name)
: Layer(name), m_Direction(glm::vec2(0.0f, 0.0f))
{
ResourceManager::LoadTexture("awesomeface", "res/Textures/awesomeface.png");
m_AwesomefaceTexture = ResourceManager::GetTexture("awesomeface");
m_Framebuffer = std::shared_ptr<Framebuffer>(Framebuffer::Create({ 800u, 600u, 1, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f) }, GraphicsContext::GetSharedContext()));
m_CameraEntity = m_Scene.CreateEntity("camera", glm::mat4(1.0f));
m_CameraEntity.AddComponent<CameraComponent>(SceneCamera(), true);
for (int i = 0; i < 250; i++)
{
glm::vec3 position = glm::vec3(rand() % 3000 - 1400.0f, rand() % 3000 - 1400.0f, 0.0f);
glm::vec2 size = glm::vec2(250.0f, 250.0f);
m_Scene.CreateEntity("quad", glm::translate(glm::mat4(1.0f), { position.x, position.y, 0.0f }) *
glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f})).AddComponent<SpriteRendererComponent>(m_AwesomefaceTexture);
}
}
void OnRender() override
{
m_Scene.OnRender(m_Framebuffer);
}
void OnUserInterfaceUpdate()
{
if (ImGui::Begin("GameView"))
{
// #todo: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Input::ReceiveGameEvents(ImGui::IsWindowFocused());
static ImVec2 regionAvailPrev = { 0, 0 };
ImVec2 regionAvail = ImGui::GetContentRegionAvail();
if (regionAvail.x != regionAvailPrev.x || regionAvail.y != regionAvailPrev.y)
{
m_Framebuffer->Resize({ regionAvail.x, regionAvail.y });
auto& cameraComp = m_CameraEntity.GetComponent<CameraComponent>();
cameraComp.camera.SetViewportSize(regionAvail.x, regionAvail.y);
regionAvailPrev = regionAvail;
}
if (GraphicsContext::GetGraphicsAPI() == GraphicsAPI::DirectX)
ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail);
else
ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail, ImVec2(0, 1), ImVec2(1, 0));
}
ImGui::End();
}
void OnUpdate(float deltaTime) override
{
if (Input::GetKeyboardKey(Key::A))
m_Direction.x = -1.0f;
else if (Input::GetKeyboardKey(Key::D))
m_Direction.x = 1.0f;
else
m_Direction.x = 0.0f;
if (Input::GetKeyboardKey(Key::W))
m_Direction.y = 1.0f;
else if (Input::GetKeyboardKey(Key::S))
m_Direction.y = -1.0f;
else
m_Direction.y = 0.0f;
auto& transform = m_CameraEntity.GetComponent<TransformComponent>();
transform = glm::translate(transform.transform, glm::vec3(m_Direction * m_Speed * deltaTime, 0.0));
}
};
}