From 7d886f29815aedf845a5a3f8bfa5a860ca838a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20L=C3=B3pez=20Bara=C3=B1ano?= Date: Thu, 23 Sep 2021 01:13:35 +0200 Subject: [PATCH 1/2] Pantalla de carga, termina y pone pantalla negra --- LastTowerDefense/CMakelists.txt | 3 +- LastTowerDefense/include/Game.h | 3 + LastTowerDefense/include/LoadScreen.h | 43 ++++++++++++ LastTowerDefense/src/Game.cpp | 38 +++++++--- LastTowerDefense/src/LoadScreen.cpp | 84 +++++++++++++++++++++++ LastTowerDefense/src/main.cpp | 4 +- PlayEngine/Base/ResourceManager.cpp | 38 ++++++++-- PlayEngine/Base/ShaderManager.cpp | 5 ++ PlayEngine/Graphic/Texture.cpp | 1 + PlayEngine/include/Base/ResourceManager.h | 9 ++- PlayEngine/include/Physics/Physics.h | 2 - 11 files changed, 210 insertions(+), 20 deletions(-) create mode 100644 LastTowerDefense/include/LoadScreen.h create mode 100644 LastTowerDefense/src/LoadScreen.cpp diff --git a/LastTowerDefense/CMakelists.txt b/LastTowerDefense/CMakelists.txt index 032c260..47b812f 100644 --- a/LastTowerDefense/CMakelists.txt +++ b/LastTowerDefense/CMakelists.txt @@ -20,7 +20,8 @@ include_directories("../ExternalLibs/Assimp/include" set(CMAKE_BINARY_DIR "../") set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}) -add_executable(LastTowerDefense "src/Enemy.cpp" +add_executable(LastTowerDefense "src/LoadScreen.cpp" + "src/Enemy.cpp" "src/Floor.cpp" "src/Game.cpp" "src/GameObject.cpp" diff --git a/LastTowerDefense/include/Game.h b/LastTowerDefense/include/Game.h index 2a2a07e..57239fc 100644 --- a/LastTowerDefense/include/Game.h +++ b/LastTowerDefense/include/Game.h @@ -56,4 +56,7 @@ class Game : public GameState void LoadModels(const std::map& models); void LoadEnemies(const std::vector& pathFileModels); void LoadMusic(); + ShaderManager* GetShaderManagerPtr(); + Camera* GetCameraPtr(); + static void InitResources(); }; diff --git a/LastTowerDefense/include/LoadScreen.h b/LastTowerDefense/include/LoadScreen.h new file mode 100644 index 0000000..91b02a1 --- /dev/null +++ b/LastTowerDefense/include/LoadScreen.h @@ -0,0 +1,43 @@ +#pragma once +#include "Base/GameState.h" +#include "Base/GameStateManager.h" +#include "Graphic/Mesh.h" +#include "Graphic/Shader.h" +#include "Base/ShaderManager.h" +#include "Base/ResourceManager.h" +#include "Graphic/Model.h" +#include "Graphic/Skybox.h" +#include "Player.h" +#include "Enemy.h" +#include "Floor.h" +#include "Level.h" +#include "Wall.h" +#include "Physics/Physics.h" +#include "Graphic/GUI.h" +#include "Graphic/GUILine.h" +#include "Audio/AudioPlayer.h" +#include "Audio/MusicPlayer.h" +#include + +class LoadScreen : public GameState +{ +private: + static bool isFinish; + std::thread* load; + Platform* platform; + Camera* camera; + GameStateManager* manager; + ResourceManager* resourceManager; + ShaderManager* shaderManager; + Skybox *skybox; +public: + LoadScreen(); + ~LoadScreen(); + static void Loading(); + void Init() override; + void Draw() override; + bool Input(std::map keys) override; + bool MouseInput(int x, int y, bool leftbutton); + void Update(unsigned int delta) override; + void Close() override; +}; diff --git a/LastTowerDefense/src/Game.cpp b/LastTowerDefense/src/Game.cpp index 6345c00..da49dfb 100644 --- a/LastTowerDefense/src/Game.cpp +++ b/LastTowerDefense/src/Game.cpp @@ -14,21 +14,16 @@ Game::~Game() { } -void Game::Init() +void Game::InitResources() { - physics = Physics::GetPtr(); - physics->InitPhysics(); - std::cout << " Menu Init" << std::endl; - this->platform = Platform::GetPtr(); - this->manager = GameStateManager::GetPtr(); - resourceManager = ResourceManager::GetPtr(); + auto resourceManager = ResourceManager::GetPtr(); resourceManager->Add(ResourceType::Model3d, "floor"); resourceManager->Add(ResourceType::Model3d, "floor2"); resourceManager->Add(ResourceType::Model3d, "floor3"); resourceManager->Add(ResourceType::Model3d, "container"); resourceManager->Add(ResourceType::Model3d, "pina_pose"); resourceManager->Add(ResourceType::Model3d, "wall"); - + resourceManager->Add(ResourceType::Texture, "pina"); resourceManager->Add(ResourceType::Texture, "brick"); resourceManager->Add(ResourceType::Texture, "ContainerAlbedo"); @@ -36,13 +31,23 @@ void Game::Init() resourceManager->Add(ResourceType::Music, "funnysong"); resourceManager->Add(ResourceType::Sound, "laser_shot"); - resourceManager->Add(ResourceType::ImageUI, "montanas"); + resourceManager->Add(ResourceType::ImageUI, "montanas1"); resourceManager->Add(ResourceType::ImageUI, "montanas2"); resourceManager->Add(ResourceType::ImageUI, "montanas3"); resourceManager->Wait(); resourceManager->Load(); +} + +void Game::Init() +{ + resourceManager = ResourceManager::GetPtr(); + physics = Physics::GetPtr(); + physics->InitPhysics(); + std::cout << " Menu Init" << std::endl; + this->platform = Platform::GetPtr(); + this->manager = GameStateManager::GetPtr(); player = new Player(); floor = new Floor(); @@ -75,7 +80,7 @@ void Game::Init() skybox = new Skybox(skyboxFaces); weaponUI = new Graphic::GUI((Graphic::IGUILayer*)resourceManager->GetElement("montanas2"), player->GetCamera(), shaderManager); - playerUI = new Graphic::GUI((Graphic::IGUILayer*)resourceManager->GetElement("montanas"), player->GetCamera(), shaderManager); + playerUI = new Graphic::GUI((Graphic::IGUILayer*)resourceManager->GetElement("montanas1"), player->GetCamera(), shaderManager); new Graphic::GUI((Graphic::IGUILayer*)resourceManager->GetElement("montanas3"), player->GetCamera(), shaderManager); std::vector pathsEnemies = { @@ -99,7 +104,7 @@ void Game::LoadEnemies(const std::vector& pathFileModels) void Game::LoadMusic() { auto asset = (MusicPlayer*)ResourceManager::GetPtr()->GetElement("funnysong"); - asset->PlayMusic(); + //asset->PlayMusic(); } void Game::LoadShaders() @@ -145,6 +150,7 @@ void Game::DrawEnemies() void Game::Update(unsigned int delta) { + shaderManager->initShader(player->GetCamera()); floor->Update(delta); level->Update(delta); wall->Update(delta); @@ -176,6 +182,16 @@ void Game::Close() { std::cout << " Close Init" << std::endl; } + +ShaderManager* Game::GetShaderManagerPtr() +{ + return shaderManager; +} + +Camera* Game::GetCameraPtr() +{ + return player->GetCamera(); +} /* render de una imagen sobre el contexto de OpenGL HUD-- Max diff --git a/LastTowerDefense/src/LoadScreen.cpp b/LastTowerDefense/src/LoadScreen.cpp new file mode 100644 index 0000000..d611f31 --- /dev/null +++ b/LastTowerDefense/src/LoadScreen.cpp @@ -0,0 +1,84 @@ +#include "LoadScreen.h" +#include "Game.h" +#include +#include +#include +#include +#include + +bool LoadScreen::isFinish = false; +Graphic::GUI* loadGUI; +LoadScreen::LoadScreen() +{ + +} + +LoadScreen::~LoadScreen() +{ +} + +void LoadScreen::Loading() +{ + Game::InitResources(); + isFinish = true; +} + +void LoadScreen::Init() +{ + this->platform = Platform::GetPtr(); + this->manager = GameStateManager::GetPtr(); + resourceManager = ResourceManager::GetPtr(); + resourceManager->Add(ResourceType::ImageUI, "LoadingScreen"); + + resourceManager->Wait(); + + resourceManager->Load(); + + shaderManager = ShaderManager::getPtr(); + + camera = new Camera(glm::vec3(10, 10.7, 100.6f), glm::vec3(0.0f, 1.0f, 0.0f), 3.0f, 3.0f, 355.0f, 0.1f); + shaderManager->initShader(camera); + + shaderManager->LoadShaders("gui", "Assets/Shaders/gui.vert", "Assets/Shaders/gui.frag"); + loadGUI = new Graphic::GUI((Graphic::IGUILayer*)resourceManager->GetElement("LoadingScreen"), camera, shaderManager); + + std::thread* thr = new std::thread(&LoadScreen::Loading); +} + +void LoadScreen::Draw() +{ + +} + +void LoadScreen::Update(unsigned int delta) +{ + if (isFinish) + { + ShaderManager* tmpSM = shaderManager; + resourceManager->RemoveLoadResource(); + loadGUI->~GUI(); + Game* game = new Game(); + camera = game->GetCameraPtr(); + shaderManager = game->GetShaderManagerPtr(); + //delete camera; + //delete tmpSM; + manager->RealaseState(); + manager->SetState(game); + isFinish = false; + } +} + +bool LoadScreen::MouseInput(int x, int y, bool leftbutton) +{ + return false; +} + +bool LoadScreen::Input(std::map keys) +{ + return false; +} + +void LoadScreen::Close() +{ + std::cout << " Close Init" << std::endl; +} \ No newline at end of file diff --git a/LastTowerDefense/src/main.cpp b/LastTowerDefense/src/main.cpp index c84645e..763dfa8 100644 --- a/LastTowerDefense/src/main.cpp +++ b/LastTowerDefense/src/main.cpp @@ -1,10 +1,12 @@ #include "Base/GameStateManager.h" #include "Game.h" +#include "LoadScreen.h" int main(int argc, char* argv[]) { GameStateManager* manager = GameStateManager::GetPtr(); - manager->SetState(new Game()); + manager->SetState(new LoadScreen()); + //manager->SetState(new Game()); manager->GameLoop(); return 0; } diff --git a/PlayEngine/Base/ResourceManager.cpp b/PlayEngine/Base/ResourceManager.cpp index f8ee5fe..b0eb7d6 100644 --- a/PlayEngine/Base/ResourceManager.cpp +++ b/PlayEngine/Base/ResourceManager.cpp @@ -26,8 +26,21 @@ ResourceManager* ResourceManager::GetPtr() return ptr; } + +void ResourceManager::RemoveLoadResource() +{ + loadResource->~ImageUI(); + resourceMap->erase(loadResourceKey); +} + +//bool const ResourceManager::GetLoadFinish() +//{ +// return loadFinish; +//} + ResourceManager::ResourceManager() { + //loadFinish = false; resourceMap = new std::map; } @@ -83,13 +96,21 @@ Resource* ResourceManager::GetElement(const std::string& name) void ResourceManager::Wait() { - for (auto& th : pool) + //if (loadFinish) { - if (th->joinable()) + for (auto& th : pool) { - th->join(); + if (th->joinable()) + { + th->join(); + } } } + /*else if (load->joinable()) + { + load->join(); + loadFinish = true; + }*/ } void ResourceManager::PathsReader(std::string path, bool force) @@ -155,7 +176,14 @@ unsigned int ResourceManager::AddResource(ResourceType type, const std::string& } else if (type == ResourceType::ImageUI) { - resource = new Graphic::ImageUI(CounterImageUI++, name, path); + Graphic::ImageUI* image = new Graphic::ImageUI(CounterImageUI++, name, path); + //resource = new Graphic::ImageUI(CounterImageUI++, name, path); + resource = image; + if (name == "LoadingScreen") + { + loadResourceKey = handleCount; + loadResource = image; + } } else if (type == ResourceType::LineUI) { @@ -171,6 +199,8 @@ unsigned int ResourceManager::AddResource(ResourceType type, const std::string& } std::thread* thr = new std::thread(&Resource::ReadFile, resource); + /*if (name == "LoadingScreen") { + load = thr; }*/ pool.push_back(thr); resourceMap->insert(std::make_pair(handleCount, resource)); } diff --git a/PlayEngine/Base/ShaderManager.cpp b/PlayEngine/Base/ShaderManager.cpp index 7c0b033..8720b7e 100644 --- a/PlayEngine/Base/ShaderManager.cpp +++ b/PlayEngine/Base/ShaderManager.cpp @@ -7,6 +7,7 @@ ShaderManager* ShaderManager::ptr; ShaderManager::ShaderManager() : currentShader(nullptr) { + camera = nullptr; LoadShaders("default", vShaderDefault, fShaderDefault); } @@ -44,6 +45,10 @@ GLint ShaderManager::GetSpecularIntensityLocation() glm::mat4 ShaderManager::GetViewMatrix() { + if (!camera) + { + return glm::mat4(1); + } return camera->calculateViewMatrix(); } diff --git a/PlayEngine/Graphic/Texture.cpp b/PlayEngine/Graphic/Texture.cpp index f142ef5..af1a9c4 100644 --- a/PlayEngine/Graphic/Texture.cpp +++ b/PlayEngine/Graphic/Texture.cpp @@ -19,6 +19,7 @@ namespace Graphic printf("Failed to find: %s\n", path.c_str()); return false; } + return true; } Resource* Texture::Load() diff --git a/PlayEngine/include/Base/ResourceManager.h b/PlayEngine/include/Base/ResourceManager.h index e25d94a..43bd7a6 100644 --- a/PlayEngine/include/Base/ResourceManager.h +++ b/PlayEngine/include/Base/ResourceManager.h @@ -1,5 +1,6 @@ #pragma once #include "../Export.h" +#include "Graphic/GUI_IMAGE.h" #include "Graphic/Model.h" #include "Audio/AudioPlayer.h" #include "Audio/MusicPlayer.h" @@ -37,6 +38,10 @@ class PLAYENGINE ResourceManager private: static size_t handleCount; static unsigned long CounterImageUI; + size_t loadResourceKey; + Graphic::ImageUI* loadResource; + //bool loadFinish; + //std::thread* load; std::list pool; std::map* resourceMap; std::map paths; @@ -47,12 +52,14 @@ class PLAYENGINE ResourceManager void PathsReader(std::string path, bool force = false); std::string GetPath(ResourceType type,const std::string &name); public: - + bool const GetLoadFinish(); static ResourceManager* GetPtr(); + void RemoveLoadResource(); void ClearResources(); void GetSafeOpenIds(unsigned int& a); size_t GetSize(); Resource* GetElement(const std::string& name); + Graphic::ImageUI* GetLoadImage() { return loadResource; } void Wait(); void Load(); unsigned int Add(ResourceType type,const std::string& name); diff --git a/PlayEngine/include/Physics/Physics.h b/PlayEngine/include/Physics/Physics.h index 3e0717e..a7e3c27 100644 --- a/PlayEngine/include/Physics/Physics.h +++ b/PlayEngine/include/Physics/Physics.h @@ -7,7 +7,6 @@ #include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" #include "BulletCollision/CollisionShapes/btCollisionShape.h" #include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" -#include "examples/CommonGUIHelperInterface.h" #include "LinearMath/btTransform.h" #include "LinearMath/btHashMap.h" @@ -20,7 +19,6 @@ class PLAYENGINE Physics btConstraintSolver* m_solver; btDefaultCollisionConfiguration* m_collisionConfiguration; btDiscreteDynamicsWorld* m_dynamicsWorld; - GUIHelperInterface* m_guiHelper; static Physics* ptr; public: static Physics* GetPtr(); From d5925967b2219aa5fb533b72650d73fd7fd51f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juli=C3=A1n=20L=C3=B3pez=20Bara=C3=B1ano?= Date: Thu, 23 Sep 2021 12:55:22 +0200 Subject: [PATCH 2/2] Ya esta la pantalla de carga, con la funcion que deje en el (Resource Manager) se elimina el archivo de dicha imagen. Igulmente cuando pasa al ESTADO DEL (Game) funciona con normalidad --- LastTowerDefense/include/Game.h | 2 -- LastTowerDefense/include/LoadScreen.h | 6 +++-- LastTowerDefense/src/Game.cpp | 14 ++-------- LastTowerDefense/src/LoadScreen.cpp | 24 +++++++---------- PlayEngine/Base/ResourceManager.cpp | 32 ++++++----------------- PlayEngine/include/Base/ResourceManager.h | 7 ++--- 6 files changed, 25 insertions(+), 60 deletions(-) diff --git a/LastTowerDefense/include/Game.h b/LastTowerDefense/include/Game.h index 57239fc..1b8b8b3 100644 --- a/LastTowerDefense/include/Game.h +++ b/LastTowerDefense/include/Game.h @@ -56,7 +56,5 @@ class Game : public GameState void LoadModels(const std::map& models); void LoadEnemies(const std::vector& pathFileModels); void LoadMusic(); - ShaderManager* GetShaderManagerPtr(); - Camera* GetCameraPtr(); static void InitResources(); }; diff --git a/LastTowerDefense/include/LoadScreen.h b/LastTowerDefense/include/LoadScreen.h index 91b02a1..4ee4935 100644 --- a/LastTowerDefense/include/LoadScreen.h +++ b/LastTowerDefense/include/LoadScreen.h @@ -17,13 +17,15 @@ #include "Graphic/GUILine.h" #include "Audio/AudioPlayer.h" #include "Audio/MusicPlayer.h" -#include +#include +using std::thread; class LoadScreen : public GameState { private: static bool isFinish; - std::thread* load; + thread* load; + Graphic::GUI* loadGUI; Platform* platform; Camera* camera; GameStateManager* manager; diff --git a/LastTowerDefense/src/Game.cpp b/LastTowerDefense/src/Game.cpp index da49dfb..02c7eee 100644 --- a/LastTowerDefense/src/Game.cpp +++ b/LastTowerDefense/src/Game.cpp @@ -36,8 +36,6 @@ void Game::InitResources() resourceManager->Add(ResourceType::ImageUI, "montanas3"); resourceManager->Wait(); - - resourceManager->Load(); } void Game::Init() @@ -49,6 +47,8 @@ void Game::Init() this->platform = Platform::GetPtr(); this->manager = GameStateManager::GetPtr(); + resourceManager->Load(); + player = new Player(); floor = new Floor(); level = new Level(); @@ -182,16 +182,6 @@ void Game::Close() { std::cout << " Close Init" << std::endl; } - -ShaderManager* Game::GetShaderManagerPtr() -{ - return shaderManager; -} - -Camera* Game::GetCameraPtr() -{ - return player->GetCamera(); -} /* render de una imagen sobre el contexto de OpenGL HUD-- Max diff --git a/LastTowerDefense/src/LoadScreen.cpp b/LastTowerDefense/src/LoadScreen.cpp index d611f31..5626d73 100644 --- a/LastTowerDefense/src/LoadScreen.cpp +++ b/LastTowerDefense/src/LoadScreen.cpp @@ -1,13 +1,12 @@ #include "LoadScreen.h" #include "Game.h" -#include +#include #include #include #include #include bool LoadScreen::isFinish = false; -Graphic::GUI* loadGUI; LoadScreen::LoadScreen() { @@ -15,6 +14,7 @@ LoadScreen::LoadScreen() LoadScreen::~LoadScreen() { + } void LoadScreen::Loading() @@ -31,7 +31,6 @@ void LoadScreen::Init() resourceManager->Add(ResourceType::ImageUI, "LoadingScreen"); resourceManager->Wait(); - resourceManager->Load(); shaderManager = ShaderManager::getPtr(); @@ -42,29 +41,22 @@ void LoadScreen::Init() shaderManager->LoadShaders("gui", "Assets/Shaders/gui.vert", "Assets/Shaders/gui.frag"); loadGUI = new Graphic::GUI((Graphic::IGUILayer*)resourceManager->GetElement("LoadingScreen"), camera, shaderManager); - std::thread* thr = new std::thread(&LoadScreen::Loading); + load = new thread(&LoadScreen::Loading); } void LoadScreen::Draw() { - + } void LoadScreen::Update(unsigned int delta) { - if (isFinish) + if (load->joinable() && isFinish) { - ShaderManager* tmpSM = shaderManager; resourceManager->RemoveLoadResource(); - loadGUI->~GUI(); - Game* game = new Game(); - camera = game->GetCameraPtr(); - shaderManager = game->GetShaderManagerPtr(); - //delete camera; - //delete tmpSM; manager->RealaseState(); - manager->SetState(game); - isFinish = false; + manager->SetState(new Game()); + load->join(); } } @@ -80,5 +72,7 @@ bool LoadScreen::Input(std::map keys) void LoadScreen::Close() { + delete loadGUI; + //Graphic::GUIOverlay::GetPtr()->Remove(loadGUI); Error draro de Link... std::cout << " Close Init" << std::endl; } \ No newline at end of file diff --git a/PlayEngine/Base/ResourceManager.cpp b/PlayEngine/Base/ResourceManager.cpp index b0eb7d6..7a2d097 100644 --- a/PlayEngine/Base/ResourceManager.cpp +++ b/PlayEngine/Base/ResourceManager.cpp @@ -14,6 +14,7 @@ ResourceManager* ResourceManager::ptr = nullptr; unsigned long ResourceManager::CounterImageUI = 0; size_t ResourceManager::handleCount = 0; +size_t ResourceManager::loadResourceKey = 0; ResourceManager* ResourceManager::GetPtr() { @@ -29,18 +30,13 @@ ResourceManager* ResourceManager::GetPtr() void ResourceManager::RemoveLoadResource() { - loadResource->~ImageUI(); + loadResource->Clear(); resourceMap->erase(loadResourceKey); + delete loadResource; } -//bool const ResourceManager::GetLoadFinish() -//{ -// return loadFinish; -//} - ResourceManager::ResourceManager() { - //loadFinish = false; resourceMap = new std::map; } @@ -96,21 +92,13 @@ Resource* ResourceManager::GetElement(const std::string& name) void ResourceManager::Wait() { - //if (loadFinish) + for (auto& th : pool) { - for (auto& th : pool) + if (th->joinable()) { - if (th->joinable()) - { - th->join(); - } + th->join(); } } - /*else if (load->joinable()) - { - load->join(); - loadFinish = true; - }*/ } void ResourceManager::PathsReader(std::string path, bool force) @@ -176,8 +164,8 @@ unsigned int ResourceManager::AddResource(ResourceType type, const std::string& } else if (type == ResourceType::ImageUI) { - Graphic::ImageUI* image = new Graphic::ImageUI(CounterImageUI++, name, path); //resource = new Graphic::ImageUI(CounterImageUI++, name, path); + Graphic::ImageUI* image = new Graphic::ImageUI(CounterImageUI++, name, path); resource = image; if (name == "LoadingScreen") { @@ -199,8 +187,6 @@ unsigned int ResourceManager::AddResource(ResourceType type, const std::string& } std::thread* thr = new std::thread(&Resource::ReadFile, resource); - /*if (name == "LoadingScreen") { - load = thr; }*/ pool.push_back(thr); resourceMap->insert(std::make_pair(handleCount, resource)); } @@ -212,6 +198,4 @@ void ResourceManager::Load() auto model = (i->second); model->Load(); } -} - - +} \ No newline at end of file diff --git a/PlayEngine/include/Base/ResourceManager.h b/PlayEngine/include/Base/ResourceManager.h index 43bd7a6..3e60dd2 100644 --- a/PlayEngine/include/Base/ResourceManager.h +++ b/PlayEngine/include/Base/ResourceManager.h @@ -36,12 +36,10 @@ class PLAYENGINE ResourceManager public: std::mutex mu; private: - static size_t handleCount; static unsigned long CounterImageUI; - size_t loadResourceKey; + static size_t handleCount; + static size_t loadResourceKey; Graphic::ImageUI* loadResource; - //bool loadFinish; - //std::thread* load; std::list pool; std::map* resourceMap; std::map paths; @@ -59,7 +57,6 @@ class PLAYENGINE ResourceManager void GetSafeOpenIds(unsigned int& a); size_t GetSize(); Resource* GetElement(const std::string& name); - Graphic::ImageUI* GetLoadImage() { return loadResource; } void Wait(); void Load(); unsigned int Add(ResourceType type,const std::string& name);