Changeset View
Changeset View
Standalone View
Standalone View
source/simulation2/components/CCmpWaterManager.cpp
Show All 11 Lines | |||||
* GNU General Public License for more details. | * GNU General Public License for more details. | ||||
* | * | ||||
* You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | ||||
*/ | */ | ||||
#include "precompiled.h" | #include "precompiled.h" | ||||
#include "CCmpWaterManager.h" | |||||
#include "simulation2/system/Component.h" | #include "simulation2/system/Component.h" | ||||
#include "ICmpWaterManager.h" | |||||
#include "graphics/RenderableObject.h" | #include "graphics/RenderableObject.h" | ||||
#include "graphics/Terrain.h" | #include "graphics/Terrain.h" | ||||
#include "renderer/Renderer.h" | #include "renderer/Renderer.h" | ||||
#include "renderer/SceneRenderer.h" | #include "renderer/SceneRenderer.h" | ||||
#include "renderer/WaterManager.h" | #include "renderer/WaterManager.h" | ||||
#include "simulation2/MessageTypes.h" | #include "simulation2/MessageTypes.h" | ||||
#include "tools/atlas/GameInterface/GameLoop.h" | #include "tools/atlas/GameInterface/GameLoop.h" | ||||
class CCmpWaterManager final : public ICmpWaterManager | void CCmpWaterManager::ClassInit(CComponentManager& componentManager) | ||||
{ | |||||
public: | |||||
static void ClassInit(CComponentManager& componentManager) | |||||
{ | { | ||||
// No need to subscribe to WaterChanged since we're actually the one sending those. | // No need to subscribe to WaterChanged since we're actually the one sending those. | ||||
componentManager.SubscribeToMessageType(MT_Interpolate); | componentManager.SubscribeToMessageType(MT_Interpolate); | ||||
componentManager.SubscribeToMessageType(MT_TerrainChanged); | componentManager.SubscribeToMessageType(MT_TerrainChanged); | ||||
} | } | ||||
DEFAULT_COMPONENT_ALLOCATOR(WaterManager) | IComponent* CCmpWaterManager::Allocate(const ScriptInterface&, JS::HandleValue) | ||||
{ | |||||
// Dynamic state: | return nullptr; | ||||
} | |||||
entity_pos_t m_WaterHeight; | void CCmpWaterManager::Deallocate(IComponent*) | ||||
{} | |||||
static std::string GetSchema() | int CCmpWaterManager::GetComponentTypeId() const | ||||
{ | { | ||||
return "<a:component type='system'/><empty/>"; | return CID_WaterManager; | ||||
} | } | ||||
void Init(const CParamNode& UNUSED(paramNode)) override | std::string CCmpWaterManager::GetSchema() | ||||
{ | { | ||||
return "<a:component type='system'/><empty/>"; | |||||
} | } | ||||
void Deinit() override | void CCmpWaterManager::Init(const CParamNode& UNUSED(paramNode)) | ||||
{} | |||||
void CCmpWaterManager::Deinit() | |||||
{ | { | ||||
// Clear the map size & data. | // Clear the map size & data. | ||||
if (CRenderer::IsInitialised()) | if (CRenderer::IsInitialised()) | ||||
g_Renderer.GetSceneRenderer().GetWaterManager().SetMapSize(0); | g_Renderer.GetSceneRenderer().GetWaterManager().SetMapSize(0); | ||||
} | } | ||||
void Serialize(ISerializer& serialize) override | void CCmpWaterManager::Serialize(ISerializer& serialize) | ||||
{ | { | ||||
serialize.NumberFixed_Unbounded("height", m_WaterHeight); | serialize.NumberFixed_Unbounded("height", m_WaterHeight); | ||||
} | } | ||||
void Deserialize(const CParamNode& paramNode, IDeserializer& deserialize) override | void CCmpWaterManager::Deserialize(const CParamNode& paramNode, IDeserializer& deserialize) | ||||
{ | { | ||||
Init(paramNode); | Init(paramNode); | ||||
deserialize.NumberFixed_Unbounded("height", m_WaterHeight); | deserialize.NumberFixed_Unbounded("height", m_WaterHeight); | ||||
if (CRenderer::IsInitialised()) | if (CRenderer::IsInitialised()) | ||||
g_Renderer.GetSceneRenderer().GetWaterManager().SetMapSize(GetSimContext().GetTerrain().GetVerticesPerSide()); | g_Renderer.GetSceneRenderer().GetWaterManager().SetMapSize(GetSimContext().GetTerrain().GetVerticesPerSide()); | ||||
RecomputeWaterData(); | RecomputeWaterData(); | ||||
} | } | ||||
void HandleMessage(const CMessage& msg, bool UNUSED(global)) override | void CCmpWaterManager::HandleMessage(const CMessage& msg, bool UNUSED(global)) | ||||
{ | { | ||||
switch (msg.GetType()) | switch (msg.GetType()) | ||||
{ | { | ||||
case MT_Interpolate: | case MT_Interpolate: | ||||
{ | { | ||||
const CMessageInterpolate& msgData = static_cast<const CMessageInterpolate&> (msg); | const CMessageInterpolate& msgData = static_cast<const CMessageInterpolate&> (msg); | ||||
if (CRenderer::IsInitialised()) | if (CRenderer::IsInitialised()) | ||||
g_Renderer.GetSceneRenderer().GetWaterManager().m_WaterTexTimer += msgData.deltaSimTime; | g_Renderer.GetSceneRenderer().GetWaterManager().m_WaterTexTimer += msgData.deltaSimTime; | ||||
break; | break; | ||||
} | } | ||||
case MT_TerrainChanged: | case MT_TerrainChanged: | ||||
{ | { | ||||
// Tell the renderer to redraw part of the map. | // Tell the renderer to redraw part of the map. | ||||
if (CRenderer::IsInitialised()) | if (CRenderer::IsInitialised()) | ||||
{ | { | ||||
const CMessageTerrainChanged& msgData = static_cast<const CMessageTerrainChanged&> (msg); | const CMessageTerrainChanged& msgData = static_cast<const CMessageTerrainChanged&> (msg); | ||||
GetSimContext().GetTerrain().MakeDirty(msgData.i0,msgData.j0,msgData.i1,msgData.j1,RENDERDATA_UPDATE_VERTICES); | GetSimContext().GetTerrain().MakeDirty(msgData.i0,msgData.j0,msgData.i1,msgData.j1,RENDERDATA_UPDATE_VERTICES); | ||||
} | } | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void RecomputeWaterData() override | void CCmpWaterManager::RecomputeWaterData() | ||||
{ | { | ||||
if (CRenderer::IsInitialised()) | if (CRenderer::IsInitialised()) | ||||
{ | { | ||||
g_Renderer.GetSceneRenderer().GetWaterManager().RecomputeWaterData(); | g_Renderer.GetSceneRenderer().GetWaterManager().RecomputeWaterData(); | ||||
g_Renderer.GetSceneRenderer().GetWaterManager().m_WaterHeight = m_WaterHeight.ToFloat(); | g_Renderer.GetSceneRenderer().GetWaterManager().m_WaterHeight = m_WaterHeight.ToFloat(); | ||||
} | } | ||||
// Tell the terrain it'll need to recompute its cached render data | // Tell the terrain it'll need to recompute its cached render data | ||||
GetSimContext().GetTerrain().MakeDirty(RENDERDATA_UPDATE_VERTICES); | GetSimContext().GetTerrain().MakeDirty(RENDERDATA_UPDATE_VERTICES); | ||||
} | } | ||||
void SetWaterLevel(entity_pos_t h) override | void CCmpWaterManager::SetWaterLevel(entity_pos_t h) | ||||
{ | { | ||||
if (m_WaterHeight == h) | if (m_WaterHeight == h) | ||||
return; | return; | ||||
m_WaterHeight = h; | m_WaterHeight = h; | ||||
RecomputeWaterData(); | RecomputeWaterData(); | ||||
CMessageWaterChanged msg; | CMessageWaterChanged msg; | ||||
GetSimContext().GetComponentManager().BroadcastMessage(msg); | GetSimContext().GetComponentManager().BroadcastMessage(msg); | ||||
} | } | ||||
entity_pos_t GetWaterLevel(entity_pos_t UNUSED(x), entity_pos_t UNUSED(z)) const override | entity_pos_t CCmpWaterManager::GetWaterLevel(entity_pos_t UNUSED(x), entity_pos_t UNUSED(z)) const | ||||
{ | { | ||||
return m_WaterHeight; | return m_WaterHeight; | ||||
} | } | ||||
float GetExactWaterLevel(float UNUSED(x), float UNUSED(z)) const override | float CCmpWaterManager::GetExactWaterLevel(float UNUSED(x), float UNUSED(z)) const | ||||
{ | { | ||||
return m_WaterHeight.ToFloat(); | return m_WaterHeight.ToFloat(); | ||||
} | } | ||||
}; | |||||
REGISTER_COMPONENT_TYPE(WaterManager) | REGISTER_COMPONENT_TYPE(WaterManager) |
Wildfire Games · Phabricator