From 5c375dd24f5e5ba66ee7293fba7a4d900d95d011 Mon Sep 17 00:00:00 2001 From: h4570 Date: Wed, 24 Aug 2022 18:51:46 +0200 Subject: [PATCH] finish 8 tutorial --- ROADMAP.txt | 4 +- tutorials/05-animation/src/tutorial_05.cpp | 5 +- tutorials/07-lighting/src/tutorial_07.cpp | 8 ++ tutorials/08-skybox-debug/inc/tutorial_08.hpp | 13 +++ tutorials/08-skybox-debug/src/tutorial_08.cpp | 86 ++++++++++++++++++- 5 files changed, 108 insertions(+), 8 deletions(-) diff --git a/ROADMAP.txt b/ROADMAP.txt index b022f86..c0385ba 100644 --- a/ROADMAP.txt +++ b/ROADMAP.txt @@ -1,7 +1,5 @@ ------------ Tyra's v2.0 roadmap to publish on GitHub ------------ -- [Renderer] Add decimate to de_dust2 -- [Tutorials] 8 - [Tutorials] 9. - [General] Check all left TODOs -> Github issues @@ -22,7 +20,7 @@ - [General] CI in Github via docker image - [MD2] Refactor - [2D] Add zbuffer support (z-index) -- [3DUtility] Add zbuffer support (z-index) +- [3DUtility] Add zbuffer support (z-index), cupMesh->translation.translateZ(10.0F) - wylaczyc zeby widziec problem - [2D] Fixed font support - [File] Async file loading - [tyrdat] Custom 3D data file with precalculated bboxes with support of async loading diff --git a/tutorials/05-animation/src/tutorial_05.cpp b/tutorials/05-animation/src/tutorial_05.cpp index 6394a0f..0161720 100644 --- a/tutorials/05-animation/src/tutorial_05.cpp +++ b/tutorials/05-animation/src/tutorial_05.cpp @@ -15,7 +15,10 @@ namespace Tyra { Tutorial05::Tutorial05(Engine* t_engine) : engine(t_engine) {} -Tutorial05::~Tutorial05() {} +Tutorial05::~Tutorial05() { + engine->renderer.getTextureRepository().freeByMesh(zombieMesh.get()); + engine->renderer.getTextureRepository().freeByMesh(warriorMesh.get()); +} void Tutorial05::init() { dynpip.setRenderer(&engine->renderer.core); diff --git a/tutorials/07-lighting/src/tutorial_07.cpp b/tutorials/07-lighting/src/tutorial_07.cpp index 7b4b6db..b9f82be 100644 --- a/tutorials/07-lighting/src/tutorial_07.cpp +++ b/tutorials/07-lighting/src/tutorial_07.cpp @@ -65,6 +65,14 @@ void Tutorial07::loadMeshWithLightmap() { ObjLoaderOptions options; options.scale = 2.0F; + /** + * Material colors are automatically fetched from .mtl file + * (Kd field) + * + * If you want to change it manually, just try to change + * mesh.materials[].ambient + */ + auto data = ObjLoader::load(FileUtils::fromCwd("cup.obj"), options); /** diff --git a/tutorials/08-skybox-debug/inc/tutorial_08.hpp b/tutorials/08-skybox-debug/inc/tutorial_08.hpp index 51c83d3..4cbc834 100644 --- a/tutorials/08-skybox-debug/inc/tutorial_08.hpp +++ b/tutorials/08-skybox-debug/inc/tutorial_08.hpp @@ -23,7 +23,20 @@ class Tutorial08 : public Game { void loop(); private: + void loadCupMesh(); + void loadSkyboxMesh(); + + Vec4 cameraPosition, cameraLookAt; + Engine* engine; + + u8 fpsCounter; + + StaticPipeline stapip; + StaPipOptions skyboxRenderOptions; + StaPipOptions cupRenderOptions; + std::unique_ptr skyboxMesh; + std::unique_ptr cupMesh; }; } // namespace Tyra diff --git a/tutorials/08-skybox-debug/src/tutorial_08.cpp b/tutorials/08-skybox-debug/src/tutorial_08.cpp index 36fd1c9..f7d0049 100644 --- a/tutorials/08-skybox-debug/src/tutorial_08.cpp +++ b/tutorials/08-skybox-debug/src/tutorial_08.cpp @@ -13,12 +13,90 @@ namespace Tyra { -Tutorial08::Tutorial08(Engine* t_engine) : engine(t_engine) {} +Tutorial08::Tutorial08(Engine* t_engine) : engine(t_engine), fpsCounter(0) {} -Tutorial08::~Tutorial08() {} +Tutorial08::~Tutorial08() { + engine->renderer.getTextureRepository().freeByMesh(skyboxMesh.get()); +} -void Tutorial08::init() {} +void Tutorial08::init() { + stapip.setRenderer(&engine->renderer.core); -void Tutorial08::loop() {} + cameraPosition = Vec4(0.0F, 0.0F, -10.0F); + cameraLookAt.unit(); + + loadSkyboxMesh(); + loadCupMesh(); + + /** Uncomment this, to disable vsync */ + // engine->renderer.setFrameLimit(false); +} + +void Tutorial08::loop() { + if (fpsCounter++ > 50) { + fpsCounter = 0; + TYRA_LOG("FPS: ", engine->info.getFps(), + " RAM: ", engine->info.getAvailableRAM()); + } + + cupMesh->rotation.rotate(Vec4(0.03F, 0.03F, 0.03F)); + + auto& utilityTools = engine->renderer.renderer3D.utility; + + engine->renderer.beginFrame(CameraInfo3D(&cameraPosition, &cameraLookAt)); + { + engine->renderer.renderer3D.usePipeline(stapip); + stapip.render(skyboxMesh.get(), skyboxRenderOptions); + stapip.render(cupMesh.get(), cupRenderOptions); + + /** Utility drawing should be done AFTER pipeline rendering */ + + /** Draw cup bbox */ + utilityTools.drawBBox( + cupMesh->frame->bbox->getTransformed(cupMesh->getModelMatrix())); + + /** Draw line */ + utilityTools.drawLine(Vec4(50.0F, 50.0F, 50.0F), *cupMesh->getPosition(), + Color(0.0F, 128.0F, 0.0F)); + + /** Draw box at origin */ + utilityTools.drawBox(Vec4(0.0F, 0.0F, 0.0F), 0.2F, + Color(0.0F, 0.0F, 255.0F)); + } + engine->renderer.endFrame(); +} + +void Tutorial08::loadSkyboxMesh() { + ObjLoaderOptions options; + options.scale = 200.0F; + options.flipUVs = true; + + auto data = ObjLoader::load(FileUtils::fromCwd("skybox/skybox.obj"), options); + + skyboxMesh = std::make_unique(data.get()); + + skyboxRenderOptions.frustumCulling = Tyra::PipelineFrustumCulling_None; + + /** + * We need to put the skybox at infinite Z, so this options + * will help us to do that. + */ + skyboxRenderOptions.zTestType = Tyra::PipelineZTest_AllPass; + + engine->renderer.getTextureRepository().addByMesh( + skyboxMesh.get(), FileUtils::fromCwd("skybox/"), "png"); +} + +void Tutorial08::loadCupMesh() { + ObjLoaderOptions options; + options.scale = 3.0F; + + auto data = ObjLoader::load(FileUtils::fromCwd("cup/cup.obj"), options); + data->textureCoordsEnabled = false; + + cupMesh = std::make_unique(data.get()); + + cupMesh->translation.translateZ(10.0F); +} } // namespace Tyra