/****************************************************************************** * File - simple_render_scene.cpp * Author - Joey Pollack * Date - 2021/10/27 (y/m/d) * Mod Date - 2021/10/27 (y/m/d) * Description - Displays a simple scene that tests basic render features. ******************************************************************************/ #include "simple_render_scene.h" #include #include #include #include #include #include #include #include #include #include namespace lunarium { SimpleRenderScene::SimpleRenderScene(uint32_t logCat) : BaseScene(logCat) { } SimpleRenderScene::~SimpleRenderScene() { delete mpTestImageLoad; } void SimpleRenderScene::OnLoad() { Logger::Info(mLogCat, "Running Simple Render Test Scene"); mTextBoxWidth = 500; // Currently the full default window size mImageSize.Width = 1280; mImageSize.Height = 720; // Create the render textures mFrameBufferOne = FrameBuffer::Create(mImageSize.Width, mImageSize.Height); //Core::Graphics().CreateRenderTexture(mImageSize.Width, mImageSize.Height, 4); mFrameBufferTwo = FrameBuffer::Create(1024, 1024); //Core::Graphics().CreateRenderTexture(1024, 1024, 4); // Load test image // int w, h, n; // stbi_set_flip_vertically_on_load(1); // unsigned char* buffer = stbi_load("LinkToThePast1_sized.png", &w, &h, &n, 0); // TextureFormat format = TextureFormat::RGBA; // if (n == 3) // { // format = TextureFormat::RGB; // } // mpTestImageLoad = Texture::Create(buffer, w, h, format); // mSrcWidth = w; // mSrcHeight = h; angle = 0.0f; box_angle = 0.0f; } void SimpleRenderScene::OnTick(double delta) { if (Core::Input().IsKeyDown(KeyCode::ESCAPE)) { Core::GetInstance().SignalShutdown(); } // Textbox size adjustment if (Core::Input().IsKeyDown(KeyCode::LEFT)) { mTextBoxWidth -= 10; } if (Core::Input().IsKeyDown(KeyCode::RIGHT)) { mTextBoxWidth += 10; } if (Core::Input().IsKeyDown(KeyCode::R)) { mSrcWidth -= 10.0f; mSrcHeight -= 10.0f; } if (Core::Input().IsKeyDown(KeyCode::F)) { mSrcWidth += 10.0f; mSrcHeight += 10.0f; } mTextBoxWidth = Math::ClampI(mTextBoxWidth, 20, 500); // Image Size adjustment if (Core::Input().IsKeyDown(KeyCode::DOWN)) { mImageSize.Width -= 10; mImageSize.Height -= 10; } if (Core::Input().IsKeyDown(KeyCode::UP)) { mImageSize.Width += 10; mImageSize.Height += 10; } if (Core::Input().IsKeyDown(KeyCode::PAGE_UP)) { angle += 0.1f; } if (Core::Input().IsKeyDown(KeyCode::PAGE_DOWN)) { angle -= 0.1f; } if (Core::Input().IsKeyPressed(KeyCode::Q)) { // Test writing out a rendered image with transparency Renderer2D& g = Core::Graphics(); Color prev = g.GetClearColor(); g.SetClearColor(Color(0.0f, 0.0f, 0.0f, 0.0f)); mFrameBufferTwo->Bind(); OrthographicCamera cam(Vec2f{0.0f, 0.0f}, Sizef{(float)mFrameBufferTwo->GetTexture()->GetWidth(), (float)mFrameBufferTwo->GetTexture()->GetHeight()}); g.BeginDraw(&cam); // if (Failed(result)) // { // Logger::Warn(mLogCat, "Unable to render to texture: %s", result.Description.c_str()); // return; // } Logger::Info(mLogCat, "Running transparent image test"); g.DrawQuad(Rectangle(500, 400, 300, 300), Color(0.5f, 0.0f, 0.75f, 1.0f)); g.DrawString("This is a test of rendering an image with transparency", Rectangle::MakeFromTopLeft(50, 50, 600, 200), Color(0.0f, 1.0f, 0.2f, 1.0f), 0.5f); g.EndDraw(); mpRenderedImage = mFrameBufferTwo->GetTexture(); //mpRenderedImage = Core::GetInstance().EndRenderToTexture(); g.SetClearColor(prev); stbi_flip_vertically_on_write(1); stbi_write_png("lunarium_test_image.png", mpRenderedImage->GetWidth(), mpRenderedImage->GetHeight(), 4, mpRenderedImage->GetPixels(), mpRenderedImage->GetWidth() * 4); } mImageSize.Width = Math::ClampI(mImageSize.Width, 320, 1280); mImageSize.Height = Math::ClampI(mImageSize.Height, 180, 720); // Render to texture testing // mFrameBufferOne->Bind(); // OrthographicCamera cam(Vec2f{0.0f, 0.0f}, Sizef{(float)mFrameBufferOne->GetTexture()->GetWidth(), (float)mFrameBufferOne->GetTexture()->GetHeight()}); // Renderer2D& g = Core::Graphics(); // g.BeginDraw(&cam); // // OpRes result = Core::GetInstance().BeginRenderToTexture(mFrameBufferOne); // // if (Failed(result)) // // { // // Logger::Error(mLogCat, "Unable to render to texture: %s", result.Description.c_str()); // // return; // // } // g.DrawQuad(Rectangle(300, 300, 150, 150), Color::Red()); // //g.DrawFilledEllipse(glm::vec2(600, 300), glm::vec2(100, 150), Color(1.0f, 0.0f, 1.0f, 1.0f), 100); // // g.DrawString("This is a test of the text renderer!", Rectangle::MakeFromTopLeft(100, 200, mTextBoxWidth, 300), // // Color(0.0f, 1.0f, 1.0f, 1.0f), 0.5f, g.DefaultFont()); // //mpRenderedImage = Core::GetInstance().EndRenderToTexture(); // g.EndDraw(); mpRenderedImage = mFrameBufferOne->GetTexture(); box_angle += 0.01f; int w, h; Core::MainWindow().GetFramebufferSize(&w, &h); OrthographicCamera main_cam(Vec2f { 0.0f, 0.0f }, Sizef { (float)w, (float)h }); Core::Graphics().BeginDraw(&main_cam); RenderScene(Core::Graphics()); Core::GUI().NewFrame(); DrawStatsGUI(); Core::GUI().EndFrame(); Core::Graphics().EndDraw(); Core::MainWindow().SwapBuffers(); mRenderStats = Core::Graphics().GetFrameStats(); Core::Graphics().ResetFrameStats(); } void SimpleRenderScene::RenderScene(Renderer2D& g) { // g.DrawImage(*mpRenderedImage, Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mpRenderedImage->GetWidth(), (float)mpRenderedImage->GetHeight()), // Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mImageSize.Width, (float)mImageSize.Height), Color(1.0f, 1.0f, 1.0f, 1.0f), angle); //g.DrawQuad(Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mImageSize.Width, (float)mImageSize.Height), Color(1.0f, 1.0f, 0.0f, 1.0f), nullptr, angle); g.DrawQuad(Rectangle(200, 200, 128.0f, 128.0f), Color(0.0f, 1.0f, 0.0f, 1.0f));//, nullptr, box_angle); g.DrawQuad(Rectangle(400, 300, 64.0f, 64.0f), Color(0.0f, 1.0f, 1.0f, 1.0f), nullptr, box_angle); //g->DrawImage(*mpTestImageLoad, glm::vec2(0.0f, 0.0f), Color::White()); //Rectangle src = Rectangle::MakeFromTopLeft(0.0f, 0.0f, (float)mpTestImageLoad->GetWidth(), (float)mpTestImageLoad->GetHeight()); //Rectangle src = Rectangle::MakeFromTopLeft(0.0f, 0.0f, mSrcWidth, mSrcHeight); Rectangle src = Rectangle::MakeFromTopLeft(0.0f, 0.0f, 16, 16); Rectangle dest = Rectangle::MakeFromTopLeft(100.0f, 100.0f, 512.0f, 512.0f); //g.DrawImage(*mpTestImageLoad, src, dest, Color(1.0f, 1.0f, 1.0f, 0.9f)); // g->DrawImage(*mpTestImageLoad, src, // dest, Color(1.0f, 1.0f, 1.0f, 0.8f)); } void SimpleRenderScene::DrawStatsGUI() { ImGui::SetNextWindowSize(ImVec2(400, 300)); ImGui::Begin("RENDER INFO"); ImGui::BeginChild("Per Frame", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 3.5f), true); ImGui::Text("Per Frame"); ImGui::Separator(); ImGui::Text("Number of triangles: %d", mRenderStats.NumTris); ImGui::Text("Draw calls: %d", mRenderStats.DrawCalls); ImGui::EndChild(); ImGui::BeginChild("General", ImVec2(ImGui::GetWindowSize().x - 15, ImGui::GetFrameHeightWithSpacing() * 2.5f), true); ImGui::Text("General Info"); ImGui::Separator(); ImGui::Text("General render info..."); ImGui::EndChild(); ImGui::End(); } }