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:
historic_bruno 2012-09-28 18:20:36 +00:00
parent 9fadd9017f
commit 7d8dc05c68
13 changed files with 101 additions and 34 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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

View File

@ -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;

View File

@ -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();

View File

@ -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)
{

View File

@ -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);

View File

@ -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);
}

View File

@ -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.
*

View File

@ -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)

View File

@ -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();

View File

@ -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);

View File

@ -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")