diff --git a/CMakeLists.txt b/CMakeLists.txt index 9eff55b..4facd23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,9 +26,7 @@ set(SRC_FILES "src/scene_manager.cpp" "src/systems/collisions.cpp" "src/systems/render.cpp" - "src/systems/render2d.cpp" "src/systems/transform.cpp" - "src/systems/ui.cpp" "src/util/files.cpp" "src/util/model_loader.cpp" "src/vulkan/device.cpp" @@ -45,10 +43,8 @@ set(SRC_FILES set(INCLUDE_FILES "include/application.h" "include/components/collider.h" - "include/components/renderable_text.h" "include/components/renderable.h" "include/components/transform.h" - "include/components/ui_element.h" "include/ecs_system.h" "include/engine_api.h" "include/event_system.h" @@ -69,9 +65,7 @@ set(INCLUDE_FILES "include/scene_manager.h" "include/systems/collisions.h" "include/systems/render.h" - "include/systems/render2d.h" "include/systems/transform.h" - "include/systems/ui.h" "include/util.h" "include/util/files.h" "include/util/model_loader.h" diff --git a/include/components/renderable_text.h b/include/components/renderable_text.h deleted file mode 100644 index ac61243..0000000 --- a/include/components/renderable_text.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef ENGINE_INCLUDE_COMPONENTS_RENDERABLE_TEXT_H_ -#define ENGINE_INCLUDE_COMPONENTS_RENDERABLE_TEXT_H_ - -#include -#include - -#include "resources/texture.h" - -namespace engine { - -struct RenderableTextComponent { - void SetText(const std::string& text) { - text_ = text; - invalidated_ = true; - } - - private: - std::string text_{"hello world"}; - bool invalidated_ = - true; // text has been changed, texture must be regenerated - std::unique_ptr texture_{}; -}; - -} // namespace engine - -#endif \ No newline at end of file diff --git a/include/components/ui_element.h b/include/components/ui_element.h deleted file mode 100644 index c0b118f..0000000 --- a/include/components/ui_element.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef ENGINE_INCLUDE_COMPONENTS_UI_ELEMENT_H_ -#define ENGINE_INCLUDE_COMPONENTS_UI_ELEMENT_H_ - -namespace engine { - -struct UIElementComponent { - int n; -}; - -} // namespace engine - -#endif \ No newline at end of file diff --git a/include/systems/render2d.h b/include/systems/render2d.h deleted file mode 100644 index 6279d51..0000000 --- a/include/systems/render2d.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef ENGINE_INCLUDE_SYSTEMS_RENDER2D_H_ -#define ENGINE_INCLUDE_SYSTEMS_RENDER2D_H_ - -#include "ecs_system.h" - -namespace engine { - -class Render2DSystem : public System { - public: - Render2DSystem(Scene* scene); - ~Render2DSystem(); - - void OnUpdate(float ts) override; - - private: -}; - -} // namespace engine - -#endif \ No newline at end of file diff --git a/include/systems/ui.h b/include/systems/ui.h deleted file mode 100644 index e988d96..0000000 --- a/include/systems/ui.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef ENGINE_INCLUDE_SYSTEMS_UI_H_ -#define ENGINE_INCLUDE_SYSTEMS_UI_H_ - -#include "ecs_system.h" - -namespace engine { - -class UISystem : public System { - public: - UISystem(Scene* scene); - - void OnUpdate(float ts) override; - - private: -}; - -} // namespace engine - -#endif \ No newline at end of file diff --git a/res/engine/shaders/font.frag b/res/engine/shaders/font.frag deleted file mode 100644 index 54248f7..0000000 --- a/res/engine/shaders/font.frag +++ /dev/null @@ -1,12 +0,0 @@ -#version 450 - -layout(location = 0) in vec2 fragUV; - -layout(location = 0) out vec4 outColor; - -layout(set = 1, binding = 0) uniform sampler2D texSampler; - -void main() { - outColor = texture(texSampler, fragUV); -} - diff --git a/res/engine/shaders/font.vert b/res/engine/shaders/font.vert deleted file mode 100644 index 718b3fa..0000000 --- a/res/engine/shaders/font.vert +++ /dev/null @@ -1,22 +0,0 @@ -#version 450 - -layout( push_constant ) uniform Constants { - mat4 model; - vec2 atlas_top_left; - vec2 atlas_bottom_right; - vec2 offset; - vec2 size; -} constants; - -layout(location = 0) in vec3 inPosition; -layout(location = 1) in vec3 inNorm; -layout(location = 2) in vec2 inUV; - -layout(location = 0) out vec2 fragUV; - -void main() { - vec2 position = inPosition.xy * constants.size + constants.offset; - position *= 0.001; - gl_Position = constants.model * vec4(position, 0.0, 1.0); - fragUV = constants.atlas_top_left + (inUV * (constants.atlas_bottom_right - constants.atlas_top_left)); -} \ No newline at end of file diff --git a/res/engine/shaders/quad.frag b/res/engine/shaders/quad.frag new file mode 100644 index 0000000..a635654 --- /dev/null +++ b/res/engine/shaders/quad.frag @@ -0,0 +1,13 @@ +#version 450 + +layout(set = 2, binding = 0) uniform sampler2D materialSetSampler; + +layout(location = 0) in vec2 fragUV; + +layout(location = 0) out vec4 outColor; + +void main() { + + outColor = texture(materialSetSampler, fragUV); +} + diff --git a/res/engine/shaders/quad.vert b/res/engine/shaders/quad.vert new file mode 100644 index 0000000..d20efd2 --- /dev/null +++ b/res/engine/shaders/quad.vert @@ -0,0 +1,42 @@ +#version 450 + +layout(set = 0, binding = 0) uniform GlobalSetUniformBuffer { + mat4 proj; +} globalSetUniformBuffer; + +layout(set = 1, binding = 0) uniform FrameSetUniformBuffer { + mat4 view; +} frameSetUniformBuffer; + +layout( push_constant ) uniform Constants { + mat4 model; +} constants; + +layout(location = 0) in vec3 inPosition; +layout(location = 1) in vec3 inNorm; +layout(location = 2) in vec2 inUV; + +layout(location = 0) out vec2 fragUV; + +vec2 positions[6] = vec2[]( + vec2( 1.0, 1.0), + vec2(-1.0, 1.0), + vec2(-1.0, -1.0), + vec2( 1.0, 1.0), + vec2(-1.0, -1.0), + vec2( 1.0, -1.0) +); + +vec2 uvs[6] = vec2[]( + vec2(1.0, 0.0), + vec2(0.0, 0.0), + vec2(0.0, 1.0), + vec2(1.0, 0.0), + vec2(0.0, 1.0), + vec2(1.0, 1.0) +); + +void main() { + gl_Position = constants.model * vec4(positions[gl_VertexIndex], 0.0, 1.0); + fragUV = uvs[gl_VertexIndex]; +} diff --git a/src/application.cpp b/src/application.cpp index 268066c..e4cbfb0 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -29,193 +29,212 @@ namespace engine { - static std::filesystem::path getResourcesPath() - { - std::filesystem::path resourcesPath{}; +static std::filesystem::path getResourcesPath() { + std::filesystem::path resourcesPath{}; #ifdef _MSC_VER - CHAR exeDirBuf[MAX_PATH + 1]; - GetModuleFileNameA(NULL, exeDirBuf, WIN_MAX_PATH + 1); - std::filesystem::path cwd = std::filesystem::path(exeDirBuf).parent_path(); - (void)_chdir((const char*)std::filesystem::absolute(cwd).c_str()); + CHAR exeDirBuf[MAX_PATH + 1]; + GetModuleFileNameA(NULL, exeDirBuf, WIN_MAX_PATH + 1); + std::filesystem::path cwd = std::filesystem::path(exeDirBuf).parent_path(); + (void)_chdir((const char*)std::filesystem::absolute(cwd).c_str()); #else - std::filesystem::path cwd = std::filesystem::current_path(); + std::filesystem::path cwd = std::filesystem::current_path(); #endif - if (std::filesystem::is_directory(cwd / "res")) { - resourcesPath = cwd / "res"; - } - else { - resourcesPath = cwd.parent_path() / "share" / "sdltest"; - } + if (std::filesystem::is_directory(cwd / "res")) { + resourcesPath = cwd / "res"; + } else { + resourcesPath = cwd.parent_path() / "share" / "sdltest"; + } - if (std::filesystem::is_directory(resourcesPath) == false) { - resourcesPath = cwd.root_path() / "usr" / "local" / "share" / "sdltest"; - } + if (std::filesystem::is_directory(resourcesPath) == false) { + resourcesPath = cwd.root_path() / "usr" / "local" / "share" / "sdltest"; + } - if (std::filesystem::is_directory(resourcesPath) == false) { - throw std::runtime_error("Unable to determine resources location. CWD: " + cwd.string()); - } - - return resourcesPath; - } - - Application::Application(const char* appName, const char* appVersion, gfx::GraphicsSettings graphicsSettings) - { - window_ = std::make_unique(appName, true, false); - input_manager_ = std::make_unique(window_.get()); - scene_manager_ = std::make_unique(this); - - // get base path for resources - resources_path_ = getResourcesPath(); - - // register resource managers - RegisterResourceManager(); - RegisterResourceManager(); - RegisterResourceManager(); - RegisterResourceManager(); - RegisterResourceManager(); - - // initialise the render data - render_data_.gfxdev = std::make_unique(appName, appVersion, window_->GetHandle(), graphicsSettings); - - std::vector globalSetBindings; - { - auto& binding0 = globalSetBindings.emplace_back(); - binding0.descriptor_type = gfx::DescriptorType::kUniformBuffer; - binding0.stage_flags = gfx::ShaderStageFlags::kVertex; - } - render_data_.global_set_layout = gfxdev()->CreateDescriptorSetLayout(globalSetBindings); - render_data_.global_set = gfxdev()->AllocateDescriptorSet(render_data_.global_set_layout); - RenderData::GlobalSetUniformBuffer globalSetUniformBufferData{ - .proj = glm::mat4{ 1.0f }, - }; - render_data_.global_set_uniform_buffer = gfxdev()->CreateUniformBuffer(sizeof(RenderData::GlobalSetUniformBuffer), &globalSetUniformBufferData); - gfxdev()->UpdateDescriptorUniformBuffer(render_data_.global_set, 0, render_data_.global_set_uniform_buffer, 0, sizeof(RenderData::GlobalSetUniformBuffer)); - - std::vector frameSetBindings; - { - auto& binding0 = frameSetBindings.emplace_back(); - binding0.descriptor_type = gfx::DescriptorType::kUniformBuffer; - binding0.stage_flags = gfx::ShaderStageFlags::kVertex; - } - render_data_.frame_set_layout = gfxdev()->CreateDescriptorSetLayout(frameSetBindings); - render_data_.frame_set = gfxdev()->AllocateDescriptorSet(render_data_.frame_set_layout); - RenderData::FrameSetUniformBuffer initialSetOneData{ - .view = glm::mat4{ 1.0f }, - }; - render_data_.frame_set_uniform_buffer = gfxdev()->CreateUniformBuffer(sizeof(RenderData::FrameSetUniformBuffer), &initialSetOneData); - gfxdev()->UpdateDescriptorUniformBuffer(render_data_.frame_set, 0, render_data_.frame_set_uniform_buffer, 0, sizeof(RenderData::FrameSetUniformBuffer)); - - std::vector materialSetBindings; - { - auto& binding0 = materialSetBindings.emplace_back(); - binding0.descriptor_type = gfx::DescriptorType::kCombinedImageSampler; - binding0.stage_flags = gfx::ShaderStageFlags::kFragment; - } - render_data_.material_set_layout = gfxdev()->CreateDescriptorSetLayout(materialSetBindings); - - // default resources - { - auto monoFont = std::make_unique( - GetResourcePath("engine/fonts/mono.ttf") - ); - GetResourceManager()->AddPersistent("builtin.mono", std::move(monoFont)); - } - { - resources::Shader::VertexParams vertParams{}; - vertParams.has_normal = true; - vertParams.has_uv0 = true; - auto texturedShader = std::make_unique( - &render_data_, - GetResourcePath("engine/shaders/standard.vert").c_str(), - GetResourcePath("engine/shaders/standard.frag").c_str(), - vertParams, - false, - true - ); - GetResourceManager()->AddPersistent("builtin.standard", std::move(texturedShader)); - } - { - resources::Shader::VertexParams vertParams{}; - vertParams.has_normal = true; - vertParams.has_uv0 = true; - auto skyboxShader = std::make_unique( - &render_data_, - GetResourcePath("engine/shaders/skybox.vert").c_str(), - GetResourcePath("engine/shaders/skybox.frag").c_str(), - vertParams, - false, - true - ); - GetResourceManager()->AddPersistent("builtin.skybox", std::move(skyboxShader)); - } - { - auto whiteTexture = std::make_unique( - &render_data_, - GetResourcePath("engine/textures/white.png"), - resources::Texture::Filtering::kOff - ); - GetResourceManager()->AddPersistent("builtin.white", std::move(whiteTexture)); - } - } - - Application::~Application() - { - for (const auto& [info, sampler] : render_data_.samplers) { - gfxdev()->DestroySampler(sampler); - } - gfxdev()->DestroyDescriptorSetLayout(render_data_.material_set_layout); - - gfxdev()->DestroyUniformBuffer(render_data_.frame_set_uniform_buffer); - gfxdev()->DestroyDescriptorSetLayout(render_data_.frame_set_layout); - - gfxdev()->DestroyUniformBuffer(render_data_.global_set_uniform_buffer); - gfxdev()->DestroyDescriptorSetLayout(render_data_.global_set_layout); - } - - void Application::GameLoop() - { - LOG_TRACE("Begin game loop..."); - - constexpr int FPS_LIMIT = 240; - constexpr auto FRAMETIME_LIMIT = std::chrono::nanoseconds(1000000000 / FPS_LIMIT); - auto beginFrame = std::chrono::steady_clock::now(); - auto endFrame = beginFrame + FRAMETIME_LIMIT; - - auto lastTick = window_->GetNanos(); - - // single-threaded game loop - while (window_->IsRunning()) { - - /* logic */ - scene_manager_->UpdateActiveScene(window_->dt()); - - if(window_->GetKeyPress(inputs::Key::K_F)) [[unlikely]] { - window_->InfoBox("fps", std::to_string(window_->GetFPS()) + " fps " + std::to_string(window_->dt() * 1000.0f) + " ms"); - } - - uint64_t now = window_->GetNanos(); - if (now - lastTick >= 1000000000LL * 5LL) [[unlikely]] { - lastTick = now; - LOG_INFO("fps: {}", window_->GetAvgFPS()); - gfxdev()->LogPerformanceInfo(); - window_->ResetAvgFPS(); - } - - /* poll events */ - window_->GetInputAndEvents(); - - /* fps limiter */ - if (enable_frame_limiter_) { - std::this_thread::sleep_until(endFrame); - } - beginFrame = endFrame; - endFrame = beginFrame + FRAMETIME_LIMIT; - - } - - gfxdev()->WaitIdle(); - } + if (std::filesystem::is_directory(resourcesPath) == false) { + throw std::runtime_error("Unable to determine resources location. CWD: " + + cwd.string()); + } + return resourcesPath; } + +Application::Application(const char* appName, const char* appVersion, + gfx::GraphicsSettings graphicsSettings) { + window_ = std::make_unique(appName, true, false); + input_manager_ = std::make_unique(window_.get()); + scene_manager_ = std::make_unique(this); + + // get base path for resources + resources_path_ = getResourcesPath(); + + // register resource managers + RegisterResourceManager(); + RegisterResourceManager(); + RegisterResourceManager(); + RegisterResourceManager(); + RegisterResourceManager(); + + // initialise the render data + render_data_.gfxdev = std::make_unique( + appName, appVersion, window_->GetHandle(), graphicsSettings); + + std::vector globalSetBindings; + { + auto& binding0 = globalSetBindings.emplace_back(); + binding0.descriptor_type = gfx::DescriptorType::kUniformBuffer; + binding0.stage_flags = gfx::ShaderStageFlags::kVertex; + } + render_data_.global_set_layout = + gfxdev()->CreateDescriptorSetLayout(globalSetBindings); + render_data_.global_set = + gfxdev()->AllocateDescriptorSet(render_data_.global_set_layout); + RenderData::GlobalSetUniformBuffer globalSetUniformBufferData{ + .proj = glm::mat4{1.0f}, + }; + render_data_.global_set_uniform_buffer = gfxdev()->CreateUniformBuffer( + sizeof(RenderData::GlobalSetUniformBuffer), &globalSetUniformBufferData); + gfxdev()->UpdateDescriptorUniformBuffer( + render_data_.global_set, 0, render_data_.global_set_uniform_buffer, 0, + sizeof(RenderData::GlobalSetUniformBuffer)); + + std::vector frameSetBindings; + { + auto& binding0 = frameSetBindings.emplace_back(); + binding0.descriptor_type = gfx::DescriptorType::kUniformBuffer; + binding0.stage_flags = gfx::ShaderStageFlags::kVertex; + } + render_data_.frame_set_layout = + gfxdev()->CreateDescriptorSetLayout(frameSetBindings); + render_data_.frame_set = + gfxdev()->AllocateDescriptorSet(render_data_.frame_set_layout); + RenderData::FrameSetUniformBuffer initialSetOneData{ + .view = glm::mat4{1.0f}, + }; + render_data_.frame_set_uniform_buffer = gfxdev()->CreateUniformBuffer( + sizeof(RenderData::FrameSetUniformBuffer), &initialSetOneData); + gfxdev()->UpdateDescriptorUniformBuffer( + render_data_.frame_set, 0, render_data_.frame_set_uniform_buffer, 0, + sizeof(RenderData::FrameSetUniformBuffer)); + + std::vector materialSetBindings; + { + auto& binding0 = materialSetBindings.emplace_back(); + binding0.descriptor_type = gfx::DescriptorType::kCombinedImageSampler; + binding0.stage_flags = gfx::ShaderStageFlags::kFragment; + } + render_data_.material_set_layout = + gfxdev()->CreateDescriptorSetLayout(materialSetBindings); + + /* default fonts */ + { + auto monoFont = std::make_unique( + GetResourcePath("engine/fonts/mono.ttf")); + GetResourceManager()->AddPersistent("builtin.mono", + std::move(monoFont)); + } + + /* default shaders */ + { + resources::Shader::VertexParams vertParams{}; + vertParams.has_normal = true; + vertParams.has_uv0 = true; + auto texturedShader = std::make_unique( + &render_data_, GetResourcePath("engine/shaders/standard.vert").c_str(), + GetResourcePath("engine/shaders/standard.frag").c_str(), vertParams, + false, true); + GetResourceManager()->AddPersistent( + "builtin.standard", std::move(texturedShader)); + } + { + resources::Shader::VertexParams vertParams{}; + vertParams.has_normal = true; + vertParams.has_uv0 = true; + auto skyboxShader = std::make_unique( + &render_data_, GetResourcePath("engine/shaders/skybox.vert").c_str(), + GetResourcePath("engine/shaders/skybox.frag").c_str(), vertParams, + false, true); + GetResourceManager()->AddPersistent( + "builtin.skybox", std::move(skyboxShader)); + } + { + resources::Shader::VertexParams vertParams{}; + vertParams.has_normal = true; + vertParams.has_uv0 = true; + auto quadShader = std::make_unique( + &render_data_, GetResourcePath("engine/shaders/quad.vert").c_str(), + GetResourcePath("engine/shaders/quad.frag").c_str(), vertParams, + true, true); + GetResourceManager()->AddPersistent( + "builtin.quad", std::move(quadShader)); + } + + + /* default textures */ + { + auto whiteTexture = std::make_unique( + &render_data_, GetResourcePath("engine/textures/white.png"), + resources::Texture::Filtering::kOff); + GetResourceManager()->AddPersistent( + "builtin.white", std::move(whiteTexture)); + } +} + +Application::~Application() { + for (const auto& [info, sampler] : render_data_.samplers) { + gfxdev()->DestroySampler(sampler); + } + gfxdev()->DestroyDescriptorSetLayout(render_data_.material_set_layout); + + gfxdev()->DestroyUniformBuffer(render_data_.frame_set_uniform_buffer); + gfxdev()->DestroyDescriptorSetLayout(render_data_.frame_set_layout); + + gfxdev()->DestroyUniformBuffer(render_data_.global_set_uniform_buffer); + gfxdev()->DestroyDescriptorSetLayout(render_data_.global_set_layout); +} + +void Application::GameLoop() { + LOG_TRACE("Begin game loop..."); + + constexpr int FPS_LIMIT = 240; + constexpr auto FRAMETIME_LIMIT = + std::chrono::nanoseconds(1000000000 / FPS_LIMIT); + auto beginFrame = std::chrono::steady_clock::now(); + auto endFrame = beginFrame + FRAMETIME_LIMIT; + + auto lastTick = window_->GetNanos(); + + // single-threaded game loop + while (window_->IsRunning()) { + /* logic */ + scene_manager_->UpdateActiveScene(window_->dt()); + + if (window_->GetKeyPress(inputs::Key::K_F)) [[unlikely]] { + window_->InfoBox("fps", std::to_string(window_->GetFPS()) + " fps " + + std::to_string(window_->dt() * 1000.0f) + + " ms"); + } + + uint64_t now = window_->GetNanos(); + if (now - lastTick >= 1000000000LL * 5LL) [[unlikely]] { + lastTick = now; + LOG_INFO("fps: {}", window_->GetAvgFPS()); + gfxdev()->LogPerformanceInfo(); + window_->ResetAvgFPS(); + } + + /* poll events */ + window_->GetInputAndEvents(); + + /* fps limiter */ + if (enable_frame_limiter_) { + std::this_thread::sleep_until(endFrame); + } + beginFrame = endFrame; + endFrame = beginFrame + FRAMETIME_LIMIT; + } + + gfxdev()->WaitIdle(); +} + +} // namespace engine diff --git a/src/resources/font.cpp b/src/resources/font.cpp index 0b8a360..1c5e120 100644 --- a/src/resources/font.cpp +++ b/src/resources/font.cpp @@ -78,6 +78,13 @@ std::unique_ptr> Font::GetTextBitmap( auto bitmap = std::make_unique>(bitmap_width * bitmap_height * 4); + for (size_t i = 0; i < bitmap->size() / 4; i++) { + bitmap->at(i * 4 + 0) = 0x00; + bitmap->at(i * 4 + 1) = 0x00; + bitmap->at(i * 4 + 2) = 0x00; + bitmap->at(i * 4 + 3) = 0xFF; + } + int top_left_x = 0; for (const auto& renderInfo : characterRenderInfos) { if (renderInfo.isEmpty == false) { diff --git a/src/systems/render2d.cpp b/src/systems/render2d.cpp deleted file mode 100644 index a15cdb9..0000000 --- a/src/systems/render2d.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "systems/render2d.h" - -#include - -#include "components/transform.h" - -namespace engine { - -Render2DSystem::Render2DSystem(Scene* scene) - : System(scene, {typeid(TransformComponent).hash_code()}) {} - -Render2DSystem::~Render2DSystem() {} - -void Render2DSystem::OnUpdate(float ts) { (void)ts; } - -} // namespace engine diff --git a/src/systems/ui.cpp b/src/systems/ui.cpp deleted file mode 100644 index a2c43c2..0000000 --- a/src/systems/ui.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "systems/ui.h" - -#include "components/ui_element.h" - -#include - -namespace engine { - - UISystem::UISystem(Scene* scene) - : System(scene, { typeid(UIElementComponent).hash_code() }) - { - - } - - void UISystem::OnUpdate(float ts) - { - (void)ts; - - } - -} diff --git a/test/src/game.cpp b/test/src/game.cpp index 9bb812b..082607f 100644 --- a/test/src/game.cpp +++ b/test/src/game.cpp @@ -102,7 +102,7 @@ void PlayGame(GameSettings settings) { cube_renderable->material = std::make_shared( app.GetResource("builtin.standard")); cube_renderable->material->texture_ = grass_texture; -// app.GetResource("builtin.white"); + // app.GetResource("builtin.white"); cube_renderable->mesh = GenCuboidMesh(app.gfxdev(), 1.0f, 1.0f, 1.0f, 1); auto cube_collider = my_scene->AddComponent(cube); @@ -129,8 +129,8 @@ void PlayGame(GameSettings settings) { floor_collider->aabb = {{0.0f, 0.0f, 0.0f}, {10000.0f, 1.0f, 10000.0f}}; } - //engine::util::LoadMeshFromFile( - // my_scene, app.GetResourcePath("models/astronaut/astronaut.dae")); + // engine::util::LoadMeshFromFile( + // my_scene, app.GetResourcePath("models/astronaut/astronaut.dae")); /* skybox */ { @@ -146,5 +146,24 @@ void PlayGame(GameSettings settings) { -5.0f, -5.0f, -5.0f}; } + /* some text */ + { + int width, height; + auto bitmap = app.GetResource("builtin.mono") + ->GetTextBitmap("The", 768.0f, width, height); + + uint32_t textbox = my_scene->CreateEntity("textbox"); + auto textbox_renderable = + my_scene->AddComponent(textbox); + textbox_renderable->material = + std::make_unique( + app.GetResource("builtin.quad")); + textbox_renderable->material->texture_ = + std::make_unique( + &app.render_data_, bitmap->data(), width, height, + engine::resources::Texture::Filtering::kOff); + textbox_renderable->mesh = GenSphereMesh(app.gfxdev(), 1.0f, 8); + } + app.GameLoop(); }