diff --git a/resources/loading.png b/resources/loading.png new file mode 100644 index 0000000..76fa26a --- /dev/null +++ b/resources/loading.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb69fc16814ff0db507965e95df225f1316917b802998e8517242b8ef534e3ea +size 5861 diff --git a/src/Game.cpp b/src/Game.cpp index 8cb8f5e..d6c28c0 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -60,10 +60,31 @@ namespace ZL ZL::BindOpenGlFunctions(); ZL::CheckGlError(); + renderer.InitOpenGL(); #ifdef EMSCRIPTEN renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_web.fragment", CONST_ZIP_FILE); + +#else + renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE); + renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE); +#endif + + loadingTexture = std::make_unique(CreateTextureDataFromPng("resources/loading.png", CONST_ZIP_FILE)); + loadingMesh.data = CreateRect2D({ Environment::width * 0.5, Environment::height * 0.5 }, { Environment::width * 0.5, Environment::height*0.5 }, 3); + loadingMesh.RefreshVBO(); + + mainThreadHandler.EnqueueMainThreadTask([this]() { + this->setupPart2(); + }); + } + + + void Game::setupPart2() + { + +#ifdef EMSCRIPTEN renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "resources/shaders/defaultAtmosphere.vertex", "resources/shaders/defaultAtmosphere_web.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetBake", "resources/shaders/planet_bake.vertex", "resources/shaders/planet_bake_web.fragment", CONST_ZIP_FILE); @@ -72,8 +93,6 @@ namespace ZL renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_web.fragment", CONST_ZIP_FILE); #else - renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE); - renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultAtmosphere", "resources/shaders/defaultAtmosphere.vertex", "resources/shaders/defaultAtmosphere_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("planetBake", "resources/shaders/planet_bake.vertex", "resources/shaders/planet_bake_desktop.fragment", CONST_ZIP_FILE); @@ -88,7 +107,7 @@ namespace ZL networkClient = std::make_unique(); networkClient->Connect("", 0); spaceGameStarted = 1; - }; + }; menuManager.onMultiplayerPressed = [this]() { @@ -105,10 +124,11 @@ namespace ZL spaceGameStarted = 1; }; - renderer.InitOpenGL(); - space.setup(); - } + space.setup(); + + loadingCompleted = true; + } void Game::drawUI() @@ -143,14 +163,58 @@ namespace ZL } void Game::drawScene() { - if (spaceGameStarted) { - space.drawScene(); + if (!loadingCompleted) { + drawLoading(); } else { - drawUnderMainMenu(); + + if (spaceGameStarted) { + space.drawScene(); + } + else + { + drawUnderMainMenu(); + } + drawUI(); } - drawUI(); + CheckGlError(); + } + + void Game::drawLoading() + { + static const std::string defaultShaderName = "default"; + static const std::string vPositionName = "vPosition"; + static const std::string vTexCoordName = "vTexCoord"; + static const std::string textureUniformName = "Texture"; + + glClear(GL_DEPTH_BUFFER_BIT); + + renderer.shaderManager.PushShader(defaultShaderName); + renderer.RenderUniform1i(textureUniformName, 0); + renderer.EnableVertexAttribArray(vPositionName); + renderer.EnableVertexAttribArray(vTexCoordName); + + float width = Environment::width; + float height = Environment::height; + + renderer.PushProjectionMatrix( + 0, width, + 0, height, + -10, 10); + + renderer.PushMatrix(); + renderer.LoadIdentity(); + + glBindTexture(GL_TEXTURE_2D, loadingTexture->getTexID()); + renderer.DrawVertexRenderStruct(loadingMesh); + + renderer.PopMatrix(); + renderer.PopProjectionMatrix(); + + renderer.DisableVertexAttribArray(vPositionName); + renderer.DisableVertexAttribArray(vTexCoordName); + renderer.shaderManager.PopShader(); CheckGlError(); } diff --git a/src/Game.h b/src/Game.h index a37ef82..6e0da91 100644 --- a/src/Game.h +++ b/src/Game.h @@ -27,6 +27,7 @@ namespace ZL { ~Game(); void setup(); + void setupPart2(); void update(); void render(); @@ -36,12 +37,19 @@ namespace ZL { TaskManager taskManager; MainThreadHandler mainThreadHandler; std::unique_ptr networkClient; + + + std::shared_ptr loadingTexture; + VertexRenderStruct loadingMesh; + bool loadingCompleted = false; + private: int64_t getSyncTimeMs(); void processTickCount(); void drawScene(); void drawUI(); void drawUnderMainMenu(); + void drawLoading(); void handleDown(int mx, int my); void handleUp(int mx, int my); void handleMotion(int mx, int my);