fixing crash issue

This commit is contained in:
2025-05-22 15:18:18 +02:00
parent 01f2aaacde
commit 92967aac1f
8 changed files with 36 additions and 11 deletions

View File

@@ -7,6 +7,8 @@
std::memset(data.data(), static_cast<std::uint32_t>(BlockType::Air), data.size() * sizeof(std::uint32_t));
std::uint32_t height = std::abs(std::sin((float)pos.x / 20.0f) * std::cos((float)pos.y / 20.0f) * 60.0f) + 1;
// Must not exceed CHUNK_SIZE.y
for(std::uint32_t y = 0; y < std::min(height, CHUNK_SIZE.y); y++)
{
if(y > std::min(height, CHUNK_SIZE.y) - 2)

View File

@@ -2,16 +2,16 @@
#include <ScopGraphics.h>
#include <thread>
std::shared_ptr<Scop::Scene> SplashScreen()
Scop::Scene& SplashScreen()
{
Scop::SceneDescriptor scene_desc;
scene_desc.fragment_shader = Scop::RenderCore::Get().GetDefaultFragmentShader();
scene_desc.render_3D_enabled = false;
scene_desc.render_skybox_enabled = false;
std::shared_ptr<Scop::Scene> scene = std::make_shared<Scop::Scene>("splash", std::move(scene_desc));
Scop::Scene& scene = Scop::ScopEngine::Get().CreateMainScene("splash", std::move(scene_desc));
Scop::Vec2ui32 splash_size;
Scop::Sprite& splash = scene->CreateSprite(std::make_shared<Scop::Texture>(Scop::LoadBMPFile(Scop::ScopEngine::Get().GetAssetsPath() / "Images/splashscreen.bmp", splash_size), splash_size.x, splash_size.y));
Scop::Sprite& splash = scene.CreateSprite(std::make_shared<Scop::Texture>(Scop::LoadBMPFile(Scop::ScopEngine::Get().GetAssetsPath() / "Images/splashscreen.bmp", splash_size), splash_size.x, splash_size.y));
splash.SetPosition(Scop::Vec2ui{ Scop::ScopEngine::Get().GetWindow().GetWidth() / 2 - splash_size.x / 2, Scop::ScopEngine::Get().GetWindow().GetHeight() / 2 - splash_size.y / 2 });
auto splash_update = [splash_size](Scop::NonOwningPtr<Scop::Scene> scene, Scop::NonOwningPtr<Scop::Sprite> sprite, Scop::Inputs& input, float delta)

View File

@@ -3,6 +3,6 @@
#include <ScopGraphics.h>
std::shared_ptr<Scop::Scene> SplashScreen();
Scop::Scene& SplashScreen();
#endif

View File

@@ -52,6 +52,16 @@ World::World(Scop::Scene& scene) : m_scene(scene), m_previous_chunk_position(-10
m_scene.CreateNarrator().AttachScript(std::make_shared<Scop::NativeNarratorScript>(std::function<void()>{}, narrator_update, std::function<void()>{}));
}
void World::Quit() noexcept
{
m_generation_status = GenerationState::Quitting;
while(m_generation_status != GenerationState::Finished)
{
using namespace std::chrono_literals;
std::this_thread::sleep_for(16ms);
}
}
[[nodiscard]] Scop::NonOwningPtr<Chunk> World::GetChunk(Scop::Vec2i position)
{
auto it = m_chunks.find(position);
@@ -78,12 +88,15 @@ void World::UnloadChunks()
}
}
#define QUIT_CHECK() if(m_generation_status == GenerationState::Quitting) goto quit
void World::GenerateWorld()
{
for(;;)
{
QUIT_CHECK();
if(m_generation_status != GenerationState::Working)
{
QUIT_CHECK();
using namespace std::chrono_literals;
std::this_thread::sleep_for(16ms);
continue;
@@ -94,6 +107,7 @@ void World::GenerateWorld()
{
for(std::int32_t z = m_current_chunk_position.y - RENDER_DISTANCE; z <= m_current_chunk_position.y + RENDER_DISTANCE; z++)
{
QUIT_CHECK();
auto res = m_chunks.try_emplace(Scop::Vec2i{ x, z }, *this, Scop::Vec2i{ x, z });
if(res.second)
{
@@ -107,6 +121,7 @@ void World::GenerateWorld()
}
while(!mesh_generation_queue.empty())
{
QUIT_CHECK();
auto chunk = mesh_generation_queue.front();
mesh_generation_queue.pop();
chunk.get().GenerateMesh();
@@ -114,6 +129,9 @@ void World::GenerateWorld()
}
m_generation_status = GenerationState::Finished;
}
quit:
m_generation_status = GenerationState::Finished;
}
void World::Upload()

View File

@@ -17,6 +17,7 @@ enum class GenerationState: std::uint8_t
{
Ready,
Working,
Quitting,
Finished,
};
@@ -25,6 +26,8 @@ class World
public:
World(Scop::Scene& scene);
void Quit() noexcept;
[[nodiscard]] inline Scop::Scene& GetScene() noexcept { return m_scene; }
[[nodiscard]] inline std::shared_ptr<Scop::Material> GetBlockMaterial() const { return p_block_material; }
[[nodiscard]] Scop::NonOwningPtr<Chunk> GetChunk(Scop::Vec2i position);

View File

@@ -9,7 +9,7 @@ int main(int ac, char** av)
{
Scop::ScopEngine engine(ac, av, "Vox", 0, 0, GetExecutablePath().parent_path().parent_path() / "ScopEngine/Assets");
std::shared_ptr<Scop::Scene> splash_scene = SplashScreen();
Scop::Scene& splash_scene = SplashScreen();
Scop::ShaderLayout shader_layout(
{
@@ -27,14 +27,15 @@ int main(int ac, char** av)
main_scene_desc.fragment_shader = shader;
main_scene_desc.camera = std::make_shared<Scop::FirstPerson3D>(Scop::Vec3f{ 0.0f, 20.0f, 0.0f }, 80.f);
main_scene_desc.culling = Scop::CullMode::Front;
Scop::Scene& main_scene = splash_scene->AddChildScene("main", std::move(main_scene_desc));
Scop::Scene& main_scene = splash_scene.AddChildScene("main", std::move(main_scene_desc));
Scop::Vec2ui32 skybox_size;
main_scene.AddSkybox(std::make_shared<Scop::CubeTexture>(Scop::LoadBMPFile(GetResourcesPath() / "skybox.bmp", skybox_size), skybox_size.x, skybox_size.y));
World world(main_scene);
engine.RegisterMainScene(splash_scene.get());
engine.Run();
world.Quit();
return 0;
}

View File

@@ -31,8 +31,8 @@ namespace Scop
[[nodiscard]] inline const Window& GetWindow() const noexcept { return m_window; }
[[nodiscard]] inline std::filesystem::path GetAssetsPath() const { return m_assets_path; }
inline void RegisterMainScene(NonOwningPtr<Scene> scene) noexcept { m_main_scene = scene; p_current_scene = m_main_scene; }
inline NonOwningPtr<Scene> GetRootScene() const noexcept { return m_main_scene; }
inline Scene& CreateMainScene(std::string_view name, SceneDescriptor desc) noexcept { p_main_scene = std::make_unique<Scene>(name, std::move(desc)); p_current_scene = p_main_scene.get(); return *p_main_scene; }
inline NonOwningPtr<Scene> GetRootScene() const noexcept { return p_main_scene.get(); }
constexpr void Quit() noexcept { m_running = false; }
@@ -54,10 +54,10 @@ namespace Scop
#endif
CommandLineInterface m_cli;
Window m_window;
NonOwningPtr<Scene> m_main_scene;
SceneRenderer m_scene_renderer;
std::filesystem::path m_assets_path;
std::unique_ptr<RenderCore> p_renderer_core;
std::unique_ptr<Scene> p_main_scene;
NonOwningPtr<Scene> p_current_scene;
bool m_running = true;
bool m_scene_changed = false;

View File

@@ -109,7 +109,8 @@ namespace Scop
ScopEngine::~ScopEngine()
{
RenderCore::Get().WaitDeviceIdle();
m_main_scene->Destroy();
p_main_scene->Destroy();
p_main_scene.reset();
m_window.Destroy();
#ifdef DEBUG
m_imgui.Destroy();