Started to restructure rendering loop - moved things out of rendering

loop, cleaned up code, ...


git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@12531 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2013-02-28 01:05:27 +00:00
parent e5e335f505
commit e1033ca9f7
9 changed files with 147 additions and 103 deletions

View File

@ -1353,14 +1353,66 @@ void IrrDriver::displayFPS()
font->draw( fpsString.c_str(), core::rect< s32 >(100,0,400,50), fpsColor, false );
} // updateFPS
// ----------------------------------------------------------------------------
#ifdef DEBUG
void drawJoint(bool drawline, bool drawname,
irr::scene::ISkinnedMesh::SJoint* joint,
ISkinnedMesh* mesh, int id)
void IrrDriver::drawDebugMeshes()
{
//if (joint->PositionKeys.size() == 0) return;
for (unsigned int n=0; n<m_debug_meshes.size(); n++)
{
IMesh* mesh = m_debug_meshes[n]->getMesh();
ISkinnedMesh* smesh = static_cast<ISkinnedMesh*>(mesh);
const core::array< irr::scene::ISkinnedMesh::SJoint * >& joints =
smesh->getAllJoints();
for (unsigned int j=0; j<joints.size(); j++)
{
drawJoint( false, true, joints[j], smesh, j);
}
}
video::SColor color(255,255,255,255);
video::SMaterial material;
material.Thickness = 2;
material.AmbientColor = color;
material.DiffuseColor = color;
material.EmissiveColor= color;
material.BackfaceCulling = false;
material.setFlag(video::EMF_LIGHTING, false);
getVideoDriver()->setMaterial(material);
getVideoDriver()->setTransform(video::ETS_WORLD, core::IdentityMatrix);
for (unsigned int n=0; n<m_debug_meshes.size(); n++)
{
IMesh* mesh = m_debug_meshes[n]->getMesh();
ISkinnedMesh* smesh = static_cast<ISkinnedMesh*>(mesh);
const core::array< irr::scene::ISkinnedMesh::SJoint * >& joints =
smesh->getAllJoints();
for (unsigned int j=0; j<joints.size(); j++)
{
IMesh* mesh = m_debug_meshes[n]->getMesh();
ISkinnedMesh* smesh = static_cast<ISkinnedMesh*>(mesh);
drawJoint(true, false, joints[j], smesh, j);
}
}
} // drawDebugMeshes
// ----------------------------------------------------------------------------
/** Draws a joing for debugging skeletons.
* \param drawline If true draw a line to the parent.
* \param drawname If true draw the name of the joint.
* \param joint The joint to draw.
* \param mesh The mesh whose skeleton is drawn (only used to get
* all joints to find the parent).
* \param id Index, which (%4) determines the color to use.
*/
void IrrDriver::drawJoint(bool drawline, bool drawname,
irr::scene::ISkinnedMesh::SJoint* joint,
ISkinnedMesh* mesh, int id)
{
irr::scene::ISkinnedMesh::SJoint* parent = NULL;
const core::array< irr::scene::ISkinnedMesh::SJoint * >& joints
= mesh->getAllJoints();
@ -1490,6 +1542,14 @@ void drawJoint(bool drawline, bool drawname,
*/
void IrrDriver::update(float dt)
{
// User aborted (e.g. closed window)
// =================================
if (!m_device->run())
{
main_loop->abort();
return;
}
// If the resolution should be switched, do it now. This will delete the
// old device and create a new one.
if (m_resolution_changing!=RES_CHANGE_NONE)
@ -1499,19 +1559,19 @@ void IrrDriver::update(float dt)
new ConfirmResolutionDialog();
m_resolution_changing = RES_CHANGE_NONE;
}
if (!m_device->run())
{
main_loop->abort();
}
if (UserConfigParams::m_gamepad_debug)
{
// Print a dividing line so that it's easier to see which events
// get received in which order in the one frame.
Log::debug("irr_driver", "-------------------------------------\n");
}
World *world = World::getWorld();
// Handle cut scenes (which do not have any karts in it)
// =====================================================
if (world && world->getNumKarts() == 0)
{
m_video_driver->beginScene(/*backBuffer clear*/false, /*zBuffer*/true,
world->getClearColor());
m_scene_manager->drawAll();
m_video_driver->endScene();
return;
}
const bool inRace = world!=NULL;
@ -1525,34 +1585,14 @@ void IrrDriver::update(float dt)
// Start the RTT for post-processing.
// We do this before beginScene() because we want to capture the glClear()
// because of tracks that do not have skyboxes (generally add-on tracks)
m_post_processing.beginCapture();
m_video_driver->beginScene(back_buffer_clear,
true, world->getClearColor());
m_post_processing.beginCapture();
}
else
m_video_driver->beginScene(back_buffer_clear, /*zBuffer*/ true,
world ? world->getClearColor()
: video::SColor(255,100,101,140));
{
m_video_driver->beginScene(back_buffer_clear,
true, video::SColor(255,100,101,140));
}
{
PROFILER_PUSH_CPU_MARKER("Update GUI widgets", 0x7F, 0x7F, 0x00);
// Just to mark the begin/end scene block
GUIEngine::GameState state = StateManager::get()->getGameState();
if (state != GUIEngine::GAME)
{
// This code needs to go outside beginScene() / endScene() since
// the model view widget will do off-screen rendering there
GUIEngine::Widget* widget;
for_in (widget, GUIEngine::needsUpdate)
{
widget->update(dt);
}
}
PROFILER_POP_CPU_MARKER();
if (inRace)
{
@ -1561,11 +1601,6 @@ void IrrDriver::update(float dt)
RaceGUIBase *rg = world->getRaceGUI();
if (rg) rg->update(dt);
// No kart, this must be a cutscene
if (world->getNumKarts() == 0)
{
m_scene_manager->drawAll();
}
for(unsigned int i=0; i<world->getNumKarts(); i++)
{
@ -1648,48 +1683,8 @@ void IrrDriver::update(float dt)
} // just to mark the begin/end scene block
#ifdef DEBUG
for (unsigned int n=0; n<debug_meshes.size(); n++)
{
IMesh* mesh = debug_meshes[n]->getMesh();
ISkinnedMesh* smesh = static_cast<ISkinnedMesh*>(mesh);
const core::array< irr::scene::ISkinnedMesh::SJoint * >& joints =
smesh->getAllJoints();
drawDebugMeshes();
for (unsigned int j=0; j<joints.size(); j++)
{
//drawJoint(debug_meshes[n]->getFrameNr(), joints[j]);
drawJoint( false, true, joints[j], smesh, j);
}
}
video::SColor color(255,255,255,255);
video::SMaterial material;
material.Thickness = 2;
material.AmbientColor = color;
material.DiffuseColor = color;
material.EmissiveColor= color;
material.BackfaceCulling = false;
material.setFlag(video::EMF_LIGHTING, false);
getVideoDriver()->setMaterial(material);
getVideoDriver()->setTransform(video::ETS_WORLD, core::IdentityMatrix);
for (unsigned int n=0; n<debug_meshes.size(); n++)
{
IMesh* mesh = debug_meshes[n]->getMesh();
ISkinnedMesh* smesh = static_cast<ISkinnedMesh*>(mesh);
const core::array< irr::scene::ISkinnedMesh::SJoint * >& joints =
smesh->getAllJoints();
for (unsigned int j=0; j<joints.size(); j++)
{
IMesh* mesh = debug_meshes[n]->getMesh();
ISkinnedMesh* smesh = static_cast<ISkinnedMesh*>(mesh);
drawJoint(true, false, joints[j], smesh, j);
}
}
#endif
m_video_driver->endScene();

View File

@ -34,7 +34,8 @@
#include <vector2d.h>
#include <dimension2d.h>
#include <SColor.h>
#include <IrrlichtDevice.h>
#include "IrrlichtDevice.h"
#include "ISkinnedMesh.h"
namespace irr
{
namespace scene { class ISceneManager; class IMesh; class IAnimatedMeshSceneNode; class IAnimatedMesh;
@ -109,6 +110,17 @@ private:
bool m_request_screenshot;
#ifdef DEBUG
/** Used to visualise skeletons. */
std::vector<irr::scene::IAnimatedMeshSceneNode*> m_debug_meshes;
void drawDebugMeshes();
void drawJoint(bool drawline, bool drawname,
irr::scene::ISkinnedMesh::SJoint* joint,
irr::scene::ISkinnedMesh* mesh, int id);
#endif
public:
IrrDriver();
~IrrDriver();
@ -218,7 +230,17 @@ public:
bool supportsSplatting();
void requestScreenshot();
#ifdef DEBUG
/** Removes debug meshes. */
void clearDebugMesh() { m_debug_meshes.clear(); }
// ------------------------------------------------------------------------
/** Adds a debug mesh to be displaed. */
void addDebugMesh(scene::IAnimatedMeshSceneNode *node)
{
m_debug_meshes.push_back(node);
} // addDebugMesh
#endif
// --------------------- RTT --------------------
/**
* Class that provides RTT (currently, only when no other 3D rendering
@ -285,10 +307,6 @@ public:
};
#ifdef DEBUG
std::vector<irr::scene::IAnimatedMeshSceneNode*> debug_meshes;
#endif
}; // IrrDriver

View File

@ -803,6 +803,26 @@ namespace GUIEngine
gui_messages.clear();
} // clear
// ------------------------------------------------------------------------
/** Updates all widgets that need to be updated.
* \param dt Time step size.
*/
void update(float dt)
{
// Just to mark the begin/end scene block
GUIEngine::GameState state = StateManager::get()->getGameState();
if (state != GUIEngine::GAME)
{
// This code needs to go outside beginScene() / endScene() since
// the model view widget will do off-screen rendering there
GUIEngine::Widget* widget;
for_in (widget, GUIEngine::needsUpdate)
{
widget->update(dt);
}
}
}
// ------------------------------------------------------------------------
void cleanForGame()

View File

@ -199,6 +199,8 @@ namespace GUIEngine
* \note Do not use directly. Use a state manager instead to get higher-level functionnality.
*/
void clear();
void update(float dt);
/** \brief like GUIEngine::clear, but to be called before going into game */
void cleanForGame();

View File

@ -306,6 +306,13 @@ void PlayerController::skidBonusTriggered()
*/
void PlayerController::update(float dt)
{
if (UserConfigParams::m_gamepad_debug)
{
// Print a dividing line so that it's easier to see which events
// get received in which order in the one frame.
Log::debug("irr_driver", "-------------------------------------\n");
}
// Don't do steering if it's replay. In position only replay it doesn't
// matter, but if it's physics replay the gradual steering causes
// incorrect results, since the stored values are already adjusted.

View File

@ -183,7 +183,7 @@ KartModel::~KartModel()
#ifdef DEBUG
#if SKELETON_DEBUG
irr_driver->debug_meshes.clear();
irr_driver->clearDebugMeshes();
#endif
#endif
@ -297,7 +297,7 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models)
std::string debug_name = m_model_filename+" (animated-kart-model)";
node->setName(debug_name.c_str());
#if SKELETON_DEBUG
irr_driver->debug_meshes.push_back(m_animated_node);
irr_driber->addDebugMesh(m_animated_node);
#endif
#endif
m_animated_node->setLoopMode(false);

View File

@ -155,7 +155,10 @@ void MainLoop::run()
#ifdef ENABLE_WIIUSE
wiimote_manager->update();
#endif
PROFILER_PUSH_CPU_MARKER("Update GUI widgets", 0x7F, 0x7F, 0x00);
GUIEngine::update(dt);
PROFILER_POP_CPU_MARKER();
PROFILER_PUSH_CPU_MARKER("IrrDriver update", 0x00, 0x00, 0x7F);
irr_driver->update(dt);
PROFILER_POP_CPU_MARKER();

View File

@ -299,12 +299,12 @@ public:
/** Returns the color to clear the back buffer. */
const irr::video::SColor& getClearColor() const { return m_clear_color; }
// ------------------------------------------------------------------------
/** Forces clearing of the back buffer. */
void setClearBackBuffer(bool enabled) { m_clear_back_buffer = enabled; }
// ------------------------------------------------------------------------
/** Sets the color to use when clearing the back buffer. */
void setClearbackBufferColor(irr::video::SColor color)
{ m_clear_color = color; }
{
m_clear_color = color;
m_clear_back_buffer = true;
}
// ------------------------------------------------------------------------
/** Override if you want to know when a kart presses fire */
virtual void onFirePressed(Controller* who) {}

View File

@ -1640,7 +1640,6 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
}
else if(m_sky_type==SKY_COLOR)
{
World::getWorld()->setClearBackBuffer(true);
World::getWorld()->setClearbackBufferColor(m_sky_color);
}