Fixes actor viewer bug where view was obstructed by map's water level. Fixes #1562.
Adds water plane option to actor viewer. This was SVN commit r12715.
This commit is contained in:
parent
9fadd9017f
commit
7d8dc05c68
@ -211,6 +211,9 @@ void Render()
|
||||
if (g_Game && g_Game->IsGameStarted())
|
||||
g_Game->GetView()->BeginFrame();
|
||||
|
||||
if (g_Game)
|
||||
g_Renderer.SetSimulation(g_Game->GetSimulation2());
|
||||
|
||||
// start new frame
|
||||
g_Renderer.BeginFrame();
|
||||
|
||||
|
@ -38,8 +38,8 @@
|
||||
// case we should probably redesign this to batch them all together for more
|
||||
// efficient rendering.
|
||||
|
||||
CDecalRData::CDecalRData(CModelDecal* decal)
|
||||
: m_Decal(decal), m_IndexArray(GL_STATIC_DRAW), m_Array(GL_STATIC_DRAW)
|
||||
CDecalRData::CDecalRData(CModelDecal* decal, CSimulation2* simulation)
|
||||
: m_Decal(decal), m_IndexArray(GL_STATIC_DRAW), m_Array(GL_STATIC_DRAW), m_Simulation(simulation)
|
||||
{
|
||||
m_Position.type = GL_FLOAT;
|
||||
m_Position.elems = 3;
|
||||
@ -60,8 +60,9 @@ CDecalRData::~CDecalRData()
|
||||
{
|
||||
}
|
||||
|
||||
void CDecalRData::Update()
|
||||
void CDecalRData::Update(CSimulation2* simulation)
|
||||
{
|
||||
m_Simulation = simulation;
|
||||
if (m_UpdateFlags != 0)
|
||||
{
|
||||
BuildArrays();
|
||||
@ -201,7 +202,7 @@ void CDecalRData::BuildArrays()
|
||||
|
||||
// Construct vertex data arrays
|
||||
|
||||
CmpPtr<ICmpWaterManager> cmpWaterManager(*g_Game->GetSimulation2(), SYSTEM_ENTITY);
|
||||
CmpPtr<ICmpWaterManager> cmpWaterManager(*m_Simulation, SYSTEM_ENTITY);
|
||||
|
||||
m_Array.SetNumVertices((i1-i0+1)*(j1-j0+1));
|
||||
m_Array.Layout();
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2011 Wildfire Games.
|
||||
/* Copyright (C) 2012 Wildfire Games.
|
||||
* This file is part of 0 A.D.
|
||||
*
|
||||
* 0 A.D. is free software: you can redistribute it and/or modify
|
||||
@ -25,14 +25,15 @@
|
||||
#include "renderer/VertexArray.h"
|
||||
|
||||
class CModelDecal;
|
||||
class CSimulation2;
|
||||
|
||||
class CDecalRData : public CRenderData
|
||||
{
|
||||
public:
|
||||
CDecalRData(CModelDecal* decal);
|
||||
CDecalRData(CModelDecal* decal, CSimulation2* simulation);
|
||||
~CDecalRData();
|
||||
|
||||
void Update();
|
||||
void Update(CSimulation2* simulation);
|
||||
|
||||
static void RenderDecals(std::vector<CDecalRData*>& decals, const CShaderDefines& context,
|
||||
ShadowMap* shadow, bool isDummyShader=false, const CShaderProgramPtr& dummy=CShaderProgramPtr());
|
||||
@ -50,6 +51,8 @@ private:
|
||||
VertexArray::Attribute m_UV;
|
||||
|
||||
CModelDecal* m_Decal;
|
||||
|
||||
CSimulation2* m_Simulation;
|
||||
};
|
||||
|
||||
#endif // INCLUDED_DECALRDATA
|
||||
|
@ -59,11 +59,12 @@ const ssize_t BlendOffsets[9][2] = {
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// CPatchRData constructor
|
||||
CPatchRData::CPatchRData(CPatch* patch) :
|
||||
CPatchRData::CPatchRData(CPatch* patch, CSimulation2* simulation) :
|
||||
m_Patch(patch), m_VBSides(0),
|
||||
m_VBBase(0), m_VBBaseIndices(0),
|
||||
m_VBBlends(0), m_VBBlendIndices(0),
|
||||
m_VBWater(0), m_VBWaterIndices(0)
|
||||
m_VBWater(0), m_VBWaterIndices(0),
|
||||
m_Simulation(simulation)
|
||||
{
|
||||
ENSURE(patch);
|
||||
Build();
|
||||
@ -572,7 +573,7 @@ void CPatchRData::BuildSide(std::vector<SSideVertex>& vertices, CPatchSideFlags
|
||||
{
|
||||
ssize_t vsize = PATCH_SIZE + 1;
|
||||
CTerrain* terrain = m_Patch->m_Parent;
|
||||
CmpPtr<ICmpWaterManager> cmpWaterManager(*g_Game->GetSimulation2(), SYSTEM_ENTITY);
|
||||
CmpPtr<ICmpWaterManager> cmpWaterManager(*m_Simulation, SYSTEM_ENTITY);
|
||||
|
||||
for (ssize_t k = 0; k < vsize; k++)
|
||||
{
|
||||
@ -658,8 +659,9 @@ void CPatchRData::Build()
|
||||
BuildWater();
|
||||
}
|
||||
|
||||
void CPatchRData::Update()
|
||||
void CPatchRData::Update(CSimulation2* simulation)
|
||||
{
|
||||
m_Simulation = simulation;
|
||||
if (m_UpdateFlags!=0) {
|
||||
// TODO,RC 11/04/04 - need to only rebuild necessary bits of renderdata rather
|
||||
// than everything; it's complicated slightly because the blends are dependent
|
||||
@ -1292,7 +1294,7 @@ void CPatchRData::BuildWater()
|
||||
|
||||
// We need to use this to access the water manager or we may not have the
|
||||
// actual values but some compiled-in defaults
|
||||
CmpPtr<ICmpWaterManager> cmpWaterManager(*g_Game->GetSimulation2(), SYSTEM_ENTITY);
|
||||
CmpPtr<ICmpWaterManager> cmpWaterManager(*m_Simulation, SYSTEM_ENTITY);
|
||||
if (!cmpWaterManager)
|
||||
return;
|
||||
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "VertexBufferManager.h"
|
||||
|
||||
class CPatch;
|
||||
class CSimulation2;
|
||||
class CTerrainTextureEntry;
|
||||
class CTextRenderer;
|
||||
|
||||
@ -36,10 +37,10 @@ class CTextRenderer;
|
||||
class CPatchRData : public CRenderData
|
||||
{
|
||||
public:
|
||||
CPatchRData(CPatch* patch);
|
||||
CPatchRData(CPatch* patch, CSimulation2* simulation);
|
||||
~CPatchRData();
|
||||
|
||||
void Update();
|
||||
void Update(CSimulation2* simulation);
|
||||
void RenderOutline();
|
||||
void RenderSides(CShaderProgramPtr& shader);
|
||||
void RenderPriorities(CTextRenderer& textRenderer);
|
||||
@ -157,6 +158,8 @@ private:
|
||||
// Water indices buffer
|
||||
CVertexBuffer::VBChunk* m_VBWaterIndices;
|
||||
|
||||
CSimulation2* m_Simulation;
|
||||
|
||||
// Build water vertices and indices (vertex buffer and data vector)
|
||||
void BuildWater();
|
||||
|
||||
|
@ -801,6 +801,12 @@ void CRenderer::BeginFrame()
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CRenderer::SetSimulation(CSimulation2* simulation)
|
||||
{
|
||||
// set current simulation context for terrain renderer
|
||||
m->terrainRenderer.SetSimulation(simulation);
|
||||
}
|
||||
|
||||
// SetClearColor: set color used to clear screen in BeginFrame()
|
||||
void CRenderer::SetClearColor(SColor4ub color)
|
||||
{
|
||||
|
@ -34,21 +34,21 @@
|
||||
#include "renderer/TimeManager.h"
|
||||
|
||||
// necessary declarations
|
||||
class CPatch;
|
||||
class CMaterial;
|
||||
class CModel;
|
||||
class CLightEnv;
|
||||
class CShaderDefines;
|
||||
|
||||
class RenderPathVertexShader;
|
||||
class WaterManager;
|
||||
class SkyManager;
|
||||
class CTextureManager;
|
||||
class CShaderManager;
|
||||
class CParticleManager;
|
||||
class TerrainRenderer;
|
||||
class CTimeManager;
|
||||
class CMaterial;
|
||||
class CMaterialManager;
|
||||
class CModel;
|
||||
class CParticleManager;
|
||||
class CPatch;
|
||||
class CShaderDefines;
|
||||
class CShaderManager;
|
||||
class CSimulation2;
|
||||
class CTextureManager;
|
||||
class CTimeManager;
|
||||
class RenderPathVertexShader;
|
||||
class SkyManager;
|
||||
class TerrainRenderer;
|
||||
class WaterManager;
|
||||
|
||||
// rendering modes
|
||||
enum ERenderMode { WIREFRAME, SOLID, EDGED_FACES };
|
||||
@ -177,6 +177,13 @@ public:
|
||||
// signal frame end
|
||||
void EndFrame();
|
||||
|
||||
/**
|
||||
* Set simulation context for rendering purposes.
|
||||
* Must be called at least once when the game has started and before
|
||||
* frames are rendered.
|
||||
*/
|
||||
void SetSimulation(CSimulation2* simulation);
|
||||
|
||||
// set color used to clear screen in BeginFrame()
|
||||
void SetClearColor(SColor4ub color);
|
||||
|
||||
|
@ -84,6 +84,8 @@ struct TerrainRendererInternals
|
||||
|
||||
/// Fancy water shader
|
||||
CShaderProgramPtr fancyWaterShader;
|
||||
|
||||
CSimulation2* simulation;
|
||||
};
|
||||
|
||||
|
||||
@ -101,6 +103,10 @@ TerrainRenderer::~TerrainRenderer()
|
||||
delete m;
|
||||
}
|
||||
|
||||
void TerrainRenderer::SetSimulation(CSimulation2* simulation)
|
||||
{
|
||||
m->simulation = simulation;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Submit a patch for rendering
|
||||
@ -112,10 +118,10 @@ void TerrainRenderer::Submit(CPatch* patch)
|
||||
if (data == 0)
|
||||
{
|
||||
// no renderdata for patch, create it now
|
||||
data = new CPatchRData(patch);
|
||||
data = new CPatchRData(patch, m->simulation);
|
||||
patch->SetRenderData(data);
|
||||
}
|
||||
data->Update();
|
||||
data->Update(m->simulation);
|
||||
|
||||
m->visiblePatches.push_back(data);
|
||||
}
|
||||
@ -130,10 +136,10 @@ void TerrainRenderer::Submit(CModelDecal* decal)
|
||||
if (data == 0)
|
||||
{
|
||||
// no renderdata for decal, create it now
|
||||
data = new CDecalRData(decal);
|
||||
data = new CDecalRData(decal, m->simulation);
|
||||
decal->SetRenderData(data);
|
||||
}
|
||||
data->Update();
|
||||
data->Update(m->simulation);
|
||||
|
||||
m->visibleDecals.push_back(data);
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
#define INCLUDED_TERRAINRENDERER
|
||||
|
||||
class CPatch;
|
||||
class CSimulation2;
|
||||
class ShadowMap;
|
||||
class WaterManager;
|
||||
|
||||
@ -42,6 +43,12 @@ public:
|
||||
TerrainRenderer();
|
||||
~TerrainRenderer();
|
||||
|
||||
/**
|
||||
* Set the simulation context for this frame.
|
||||
* Call at start of frame, before any other Submits.
|
||||
*/
|
||||
void SetSimulation(CSimulation2* simulation);
|
||||
|
||||
/**
|
||||
* Submit: Add a patch for rendering in this frame.
|
||||
*
|
||||
|
@ -41,6 +41,7 @@ enum
|
||||
ID_ViewerWireframe,
|
||||
ID_ViewerMove,
|
||||
ID_ViewerGround,
|
||||
ID_ViewerWater,
|
||||
ID_ViewerShadows,
|
||||
ID_ViewerPolyCount,
|
||||
ID_ViewerAnimation,
|
||||
@ -81,6 +82,7 @@ private:
|
||||
bool m_ViewerWireframe;
|
||||
bool m_ViewerMove;
|
||||
bool m_ViewerGround;
|
||||
bool m_ViewerWater;
|
||||
bool m_ViewerShadows;
|
||||
bool m_ViewerPolyCount;
|
||||
bool m_ViewerBoundingBox;
|
||||
@ -371,6 +373,7 @@ ObjectBottomBar::ObjectBottomBar(
|
||||
m_ViewerWireframe = false;
|
||||
m_ViewerMove = false;
|
||||
m_ViewerGround = true;
|
||||
m_ViewerWater = false;
|
||||
m_ViewerShadows = true;
|
||||
m_ViewerPolyCount = false;
|
||||
m_ViewerBoundingBox = false;
|
||||
@ -391,12 +394,13 @@ ObjectBottomBar::ObjectBottomBar(
|
||||
viewerButtonsLeft->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerWireframe, _("Wireframe")), _("Toggle wireframe / solid rendering")), wxSizerFlags().Expand());
|
||||
viewerButtonsLeft->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerMove, _("Move")), _("Toggle movement along ground when playing walk/run animations")), wxSizerFlags().Expand());
|
||||
viewerButtonsLeft->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerGround, _("Ground")), _("Toggle the ground plane")), wxSizerFlags().Expand());
|
||||
viewerButtonsLeft->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerWater, _("Water")), _("Toggle the water plane")), wxSizerFlags().Expand());
|
||||
viewerButtonsLeft->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerShadows, _("Shadows")), _("Toggle shadow rendering")), wxSizerFlags().Expand());
|
||||
viewerButtonsLeft->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerPolyCount, _("Poly count")), _("Toggle polygon-count statistics - turn off ground and shadows for more useful data")), wxSizerFlags().Expand());
|
||||
viewerButtonsLeft->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerBoundingBox, _("Bounding Boxes")), _("Toggle bounding boxes")), wxSizerFlags().Expand());
|
||||
|
||||
wxSizer* viewerButtonsRight = new wxBoxSizer(wxVERTICAL);
|
||||
viewerButtonsRight->SetMinSize(110,-1);
|
||||
viewerButtonsRight->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerBoundingBox, _("Bounding Boxes")), _("Toggle bounding boxes")), wxSizerFlags().Expand());
|
||||
viewerButtonsRight->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerAxesMarker, _("Axes Marker")), _("Toggle the axes marker (R=X, G=Y, B=Z)")), wxSizerFlags().Expand());
|
||||
viewerButtonsRight->Add(Tooltipped(new wxButton(m_ViewerPanel, ID_ViewerPropPoints, _("Prop Points")), _("Toggle prop points (works best in wireframe mode)")), wxSizerFlags().Expand());
|
||||
|
||||
@ -487,6 +491,7 @@ void ObjectBottomBar::OnFirstDisplay()
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"wireframe", m_ViewerWireframe));
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"walk", m_ViewerMove));
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"ground", m_ViewerGround));
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"water", m_ViewerWater));
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"shadows", m_ViewerShadows));
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"stats", m_ViewerPolyCount));
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"bounding_box", m_ViewerBoundingBox));
|
||||
@ -515,6 +520,10 @@ void ObjectBottomBar::OnViewerSetting(wxCommandEvent& evt)
|
||||
m_ViewerGround = !m_ViewerGround;
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"ground", m_ViewerGround));
|
||||
break;
|
||||
case ID_ViewerWater:
|
||||
m_ViewerWater = !m_ViewerWater;
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"water", m_ViewerWater));
|
||||
break;
|
||||
case ID_ViewerShadows:
|
||||
m_ViewerShadows = !m_ViewerShadows;
|
||||
POST_MESSAGE(SetViewParamB, (AtlasMessage::eRenderView::ACTOR, L"shadows", m_ViewerShadows));
|
||||
@ -559,6 +568,7 @@ BEGIN_EVENT_TABLE(ObjectBottomBar, wxPanel)
|
||||
EVT_BUTTON(ID_ViewerWireframe, ObjectBottomBar::OnViewerSetting)
|
||||
EVT_BUTTON(ID_ViewerMove, ObjectBottomBar::OnViewerSetting)
|
||||
EVT_BUTTON(ID_ViewerGround, ObjectBottomBar::OnViewerSetting)
|
||||
EVT_BUTTON(ID_ViewerWater, ObjectBottomBar::OnViewerSetting)
|
||||
EVT_BUTTON(ID_ViewerShadows, ObjectBottomBar::OnViewerSetting)
|
||||
EVT_BUTTON(ID_ViewerPolyCount, ObjectBottomBar::OnViewerSetting)
|
||||
EVT_CHOICE(ID_ViewerAnimation, ObjectBottomBar::OnSelectAnim)
|
||||
|
@ -54,6 +54,7 @@
|
||||
#include "simulation2/components/ICmpTerrain.h"
|
||||
#include "simulation2/components/ICmpUnitMotion.h"
|
||||
#include "simulation2/components/ICmpVisual.h"
|
||||
#include "simulation2/components/ICmpWaterManager.h"
|
||||
#include "simulation2/helpers/Render.h"
|
||||
|
||||
struct ActorViewerImpl : public Scene
|
||||
@ -81,6 +82,7 @@ public:
|
||||
float CurrentSpeed;
|
||||
bool WalkEnabled;
|
||||
bool GroundEnabled;
|
||||
bool WaterEnabled;
|
||||
bool ShadowsEnabled;
|
||||
bool SelectionBoxEnabled;
|
||||
bool AxesMarkerEnabled;
|
||||
@ -247,6 +249,7 @@ ActorViewer::ActorViewer()
|
||||
{
|
||||
m.WalkEnabled = false;
|
||||
m.GroundEnabled = true;
|
||||
m.WaterEnabled = false;
|
||||
m.ShadowsEnabled = g_Renderer.GetOptionBool(CRenderer::OPT_SHADOWS);
|
||||
m.SelectionBoxEnabled = false;
|
||||
m.AxesMarkerEnabled = false;
|
||||
@ -290,6 +293,7 @@ ActorViewer::ActorViewer()
|
||||
if (cmpTerrain)
|
||||
cmpTerrain->ReloadTerrain();
|
||||
|
||||
// Remove FOW since we're in Atlas
|
||||
CmpPtr<ICmpRangeManager> cmpRangeManager(m.Simulation2, SYSTEM_ENTITY);
|
||||
if (cmpRangeManager)
|
||||
cmpRangeManager->SetLosRevealAll(-1, true);
|
||||
@ -445,6 +449,15 @@ void ActorViewer::SetBackgroundColour(const SColor4ub& colour)
|
||||
|
||||
void ActorViewer::SetWalkEnabled(bool enabled) { m.WalkEnabled = enabled; }
|
||||
void ActorViewer::SetGroundEnabled(bool enabled) { m.GroundEnabled = enabled; }
|
||||
void ActorViewer::SetWaterEnabled(bool enabled)
|
||||
{
|
||||
m.WaterEnabled = enabled;
|
||||
// Adjust water level
|
||||
entity_pos_t waterLevel = entity_pos_t::FromFloat(enabled ? 10.f : 0.f);
|
||||
CmpPtr<ICmpWaterManager> cmpWaterManager(m.Simulation2, SYSTEM_ENTITY);
|
||||
if (cmpWaterManager)
|
||||
cmpWaterManager->SetWaterLevel(waterLevel);
|
||||
}
|
||||
void ActorViewer::SetShadowsEnabled(bool enabled) { m.ShadowsEnabled = enabled; }
|
||||
void ActorViewer::SetBoundingBoxesEnabled(bool enabled) { m.SelectionBoxEnabled = enabled; }
|
||||
void ActorViewer::SetAxesMarkerEnabled(bool enabled) { m.AxesMarkerEnabled = enabled; }
|
||||
@ -464,7 +477,7 @@ void ActorViewer::Render()
|
||||
|
||||
g_Renderer.SetClearColor(m.Background);
|
||||
|
||||
// Disable shadows locally (avoid clobbering global state)
|
||||
// Set shadows, sky and water locally (avoid clobbering global state)
|
||||
bool oldShadows = g_Renderer.GetOptionBool(CRenderer::OPT_SHADOWS);
|
||||
g_Renderer.SetOptionBool(CRenderer::OPT_SHADOWS, m.ShadowsEnabled);
|
||||
|
||||
@ -472,7 +485,10 @@ void ActorViewer::Render()
|
||||
g_Renderer.GetSkyManager()->m_RenderSky = false;
|
||||
|
||||
bool oldWater = g_Renderer.GetWaterManager()->m_RenderWater;
|
||||
g_Renderer.GetWaterManager()->m_RenderWater = false;
|
||||
g_Renderer.GetWaterManager()->m_RenderWater = m.WaterEnabled;
|
||||
|
||||
// Set simulation context for rendering purposes
|
||||
g_Renderer.SetSimulation(&m.Simulation2);
|
||||
|
||||
g_Renderer.BeginFrame();
|
||||
|
||||
|
@ -40,6 +40,7 @@ public:
|
||||
void SetBackgroundColour(const SColor4ub& colour);
|
||||
void SetWalkEnabled(bool enabled);
|
||||
void SetGroundEnabled(bool enabled);
|
||||
void SetWaterEnabled(bool enabled);
|
||||
void SetShadowsEnabled(bool enabled);
|
||||
void SetStatsEnabled(bool enabled);
|
||||
void SetBoundingBoxesEnabled(bool enabled);
|
||||
|
@ -132,6 +132,8 @@ void AtlasViewActor::SetParam(const std::wstring& name, bool value)
|
||||
m_ActorViewer->SetWalkEnabled(value);
|
||||
else if (name == L"ground")
|
||||
m_ActorViewer->SetGroundEnabled(value);
|
||||
else if (name == L"water")
|
||||
m_ActorViewer->SetWaterEnabled(value);
|
||||
else if (name == L"shadows")
|
||||
m_ActorViewer->SetShadowsEnabled(value);
|
||||
else if (name == L"stats")
|
||||
|
Loading…
Reference in New Issue
Block a user