Improved the kart model view
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3646 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -277,6 +277,41 @@ scene::ISceneNode *IrrDriver::addMesh(scene::IMesh *mesh)
|
||||
return m_scene_manager->addMeshSceneNode(mesh);
|
||||
} // addMesh
|
||||
|
||||
void IrrDriver::renderToTexture(scene::IMesh *mesh, ITexture* target, float angle)
|
||||
{
|
||||
scene::ISceneNode* node = addMesh(mesh);
|
||||
node->setScale( core::vector3df(50.0f, 50.0f, 50.0f) );
|
||||
node->setPosition( core::vector3df(0,0,0) );
|
||||
node->updateAbsolutePosition();
|
||||
|
||||
node->setRotation( core::vector3df(0, angle, 0) );
|
||||
|
||||
const core::vector3df &sun_pos = core::vector3df( 500.0f, 500.0f, 500.0f );
|
||||
scene::ILightSceneNode* light = irr_driver->getSceneManager()->addLightSceneNode(0, sun_pos);
|
||||
video::SLight lightColor;
|
||||
lightColor.AmbientColor = irr::video::SColorf(0.666666f, 0.666666f, 0.666666f, 0.0f);
|
||||
light->setLightData(lightColor);
|
||||
|
||||
|
||||
ICameraSceneNode* camera = m_scene_manager->addCameraSceneNode();
|
||||
|
||||
camera->setPosition( core::vector3df(0.0, 25.0f, 70.0f) );
|
||||
camera->setUpVector( core::vector3df(0.0, -1.0, 0.0) );
|
||||
camera->setTarget( core::vector3df(0, 0 ,0) );
|
||||
camera->updateAbsolutePosition();
|
||||
|
||||
m_device->getVideoDriver()->setRenderTarget(target);
|
||||
//m_device->getVideoDriver()->beginScene(true, true, video::SColor(0,0,0,0));
|
||||
m_scene_manager->drawAll();
|
||||
//m_device->getVideoDriver()->endScene();
|
||||
|
||||
removeNode(node);
|
||||
removeNode(camera);
|
||||
removeNode(light);
|
||||
|
||||
m_device->getVideoDriver()->setRenderTarget(0, false, false);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Creates a quad mesh buffer and adds it to the scene graph.
|
||||
*/
|
||||
@@ -424,7 +459,22 @@ void IrrDriver::setAmbientLight(const video::SColor &light)
|
||||
void IrrDriver::update(float dt)
|
||||
{
|
||||
if(!m_device->run()) return;
|
||||
|
||||
m_device->getVideoDriver()->beginScene(true, true, video::SColor(255,100,101,140));
|
||||
|
||||
// FIXME : flickers
|
||||
if(!StateManager::isGameState())
|
||||
{
|
||||
// this code needs to go outside beginScene() / endScene() since
|
||||
// the model view widget will do off-screen rendering there
|
||||
const int updateAmount = GUIEngine::needsUpdate.size();
|
||||
for(int n=0; n<updateAmount; n++)
|
||||
{
|
||||
GUIEngine::needsUpdate[n].update(dt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_GLUT
|
||||
if(UserConfigParams::m_bullet_debug && race_manager->raceIsActive())
|
||||
{
|
||||
@@ -484,6 +534,8 @@ void IrrDriver::update(float dt)
|
||||
}
|
||||
|
||||
m_device->getVideoDriver()->endScene();
|
||||
|
||||
|
||||
} // update
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -85,6 +85,8 @@ public:
|
||||
void changeResolution();
|
||||
void showPointer();
|
||||
void hidePointer();
|
||||
|
||||
void renderToTexture(scene::IMesh *mesh, irr::video::ITexture* target, float angle);
|
||||
}; // IrrDriver
|
||||
|
||||
extern IrrDriver *irr_driver;
|
||||
|
||||
@@ -38,6 +38,7 @@ namespace GUIEngine
|
||||
|
||||
ptr_vector<Screen, HOLD> g_loaded_screens;
|
||||
Screen* g_current_screen = NULL;
|
||||
ptr_vector<Widget, REF> needsUpdate;
|
||||
|
||||
|
||||
float dt = 0;
|
||||
@@ -101,12 +102,15 @@ void clear()
|
||||
void cleanForGame()
|
||||
{
|
||||
clear();
|
||||
needsUpdate.clearWithoutDeleting();
|
||||
if(g_irrlicht_event_core == NULL) g_irrlicht_event_core = new IrrlichtEventCore();
|
||||
g_device->setEventReceiver(g_irrlicht_event_core);
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
void switchToScreen(const char* screen_name)
|
||||
{
|
||||
needsUpdate.clearWithoutDeleting();
|
||||
|
||||
// clean what was left by the previous screen
|
||||
g_env->clear();
|
||||
if(g_current_screen != NULL) g_current_screen->elementsWereDeleted();
|
||||
@@ -146,6 +150,7 @@ void switchToScreen(const char* screen_name)
|
||||
/** to be called after e.g. a resolution switch */
|
||||
void reshowCurrentScreen()
|
||||
{
|
||||
needsUpdate.clearWithoutDeleting();
|
||||
StateManager::reshowTopMostMenu();
|
||||
//g_current_screen->addWidgets();
|
||||
}
|
||||
@@ -163,7 +168,7 @@ void cleanUp()
|
||||
g_loaded_screens.clearAndDeleteAll();
|
||||
|
||||
g_current_screen = NULL;
|
||||
|
||||
needsUpdate.clearWithoutDeleting();
|
||||
// nothing else to delete for now AFAIK, irrlicht will automatically kill everything along the device
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -218,6 +223,7 @@ void render(float elapsed_time)
|
||||
{
|
||||
Credits::getInstance()->render(elapsed_time);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -183,6 +183,9 @@ use rectangular icons (this will affect the type of focus/highlighting used)
|
||||
#include <irrlicht.h>
|
||||
#include <string>
|
||||
|
||||
#include "gui/widget.hpp"
|
||||
#include "utils/ptr_vector.hpp"
|
||||
|
||||
using namespace irr;
|
||||
using namespace core;
|
||||
using namespace scene;
|
||||
@@ -203,6 +206,9 @@ namespace GUIEngine
|
||||
|
||||
float getLatestDt();
|
||||
|
||||
// Widgets that need to be notified at every frame can add themselves there
|
||||
extern ptr_vector<Widget, REF> needsUpdate;
|
||||
|
||||
void init(irr::IrrlichtDevice* device, irr::video::IVideoDriver* driver, void (*eventCallback)(Widget* widget, std::string& name) );
|
||||
void cleanUp();
|
||||
void switchToScreen(const char* );
|
||||
|
||||
@@ -134,6 +134,7 @@ namespace StateManager
|
||||
//test->setMaterialFlag(EMF_LIGHTING , false);
|
||||
|
||||
w3->setModel(test);
|
||||
w3->update(0);
|
||||
|
||||
getCurrentScreen()->m_inited = true;
|
||||
} // end if init
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
|
||||
#include "graphics/irr_driver.hpp"
|
||||
#include "gui/screen.hpp"
|
||||
#include "gui/engine.hpp"
|
||||
#include "gui/my_button.hpp"
|
||||
@@ -1242,21 +1243,41 @@ RibbonWidget* RibbonGridWidget::getSelectedRibbon() const
|
||||
#endif
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
ModelViewWidget::~ModelViewWidget()
|
||||
{
|
||||
GUIEngine::needsUpdate.remove(this);
|
||||
}
|
||||
void ModelViewWidget::add()
|
||||
{
|
||||
rect<s32> widget_size = rect<s32>(x, y, x + w, y + h);
|
||||
stringw message = m_properties[PROP_TEXT].c_str();
|
||||
|
||||
m_element = GUIEngine::getGUIEnv()->addMeshViewer(widget_size, NULL, ++id_counter_2);
|
||||
IGUIImage* btn = GUIEngine::getGUIEnv()->addImage(widget_size, m_parent, ++id_counter_2);
|
||||
m_element = btn;
|
||||
btn->setUseAlphaChannel(true);
|
||||
btn->setTabStop(false);
|
||||
btn->setScaleImage(true);
|
||||
|
||||
//m_element = GUIEngine::getGUIEnv()->addMeshViewer(widget_size, NULL, ++id_counter_2);
|
||||
|
||||
GUIEngine::needsUpdate.push_back(this);
|
||||
|
||||
angle = 0;
|
||||
|
||||
id = m_element->getID();
|
||||
//m_element->setTabOrder(id);
|
||||
m_element->setTabGroup(false);
|
||||
m_element->setTabStop(false);
|
||||
|
||||
std::string name = "model view "; name += m_properties[PROP_ID].c_str();
|
||||
m_texture = GUIEngine::getDriver()->addTexture( core::dimension2d< s32 >(512, 512), name.c_str() );
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
void ModelViewWidget::setModel(SAnimatedMesh* mesh)
|
||||
void ModelViewWidget::setModel(IMesh* mesh)
|
||||
{
|
||||
m_model = mesh;
|
||||
|
||||
/*
|
||||
((IGUIMeshViewer*)m_element)->setMesh( mesh );
|
||||
|
||||
video::SMaterial mat = mesh->getMeshBuffer(0)->getMaterial(); //mesh_view->getMaterial();
|
||||
@@ -1264,6 +1285,15 @@ void ModelViewWidget::setModel(SAnimatedMesh* mesh)
|
||||
//mat.setFlag(EMF_GOURAUD_SHADING, false);
|
||||
//mat.setFlag(EMF_NORMALIZE_NORMALS, true);
|
||||
((IGUIMeshViewer*)m_element)->setMaterial(mat);
|
||||
*/
|
||||
}
|
||||
void ModelViewWidget::update(float delta)
|
||||
{
|
||||
angle += delta*10;
|
||||
if(angle > 360) angle -= 360;
|
||||
|
||||
irr_driver->renderToTexture(m_model, m_texture, angle);
|
||||
((IGUIImage*)m_element)->setImage(m_texture);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
@@ -128,6 +128,8 @@ namespace GUIEngine
|
||||
|
||||
bool m_show_bounding_box;
|
||||
|
||||
virtual void update(float delta) { }
|
||||
|
||||
/**
|
||||
* Create and add the irrLicht widget(s) associated with this object.
|
||||
* Call after Widget was read from XML file and laid out.
|
||||
@@ -342,9 +344,15 @@ namespace GUIEngine
|
||||
|
||||
class ModelViewWidget : public Widget
|
||||
{
|
||||
scene::IMesh* m_model;
|
||||
video::ITexture* m_texture;
|
||||
float angle;
|
||||
public:
|
||||
~ModelViewWidget();
|
||||
|
||||
void add();
|
||||
void setModel(SAnimatedMesh* mesh);
|
||||
void setModel(irr::scene::IMesh* mesh);
|
||||
void update(float delta);
|
||||
};
|
||||
|
||||
class ListWidget : public Widget
|
||||
@@ -363,7 +371,7 @@ namespace GUIEngine
|
||||
void add();
|
||||
void addItem(const char* item);
|
||||
|
||||
stringw getText() const;
|
||||
core::stringw getText() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -1001,10 +1001,10 @@
|
||||
9505577D0F696A900056E88C /* my_button.hpp */,
|
||||
95D1F6180FC8CDBB00FF6968 /* options_screen.cpp */,
|
||||
95D1F6170FC8CDBB00FF6968 /* options_screen.hpp */,
|
||||
950557800F696A900056E88C /* screen.hpp */,
|
||||
95C1E3F10F699079005D33E6 /* race_gui.cpp */,
|
||||
95C1E3EB0F698F23005D33E6 /* race_gui.hpp */,
|
||||
9505577F0F696A900056E88C /* screen.cpp */,
|
||||
950557800F696A900056E88C /* screen.hpp */,
|
||||
950557810F696A900056E88C /* screen_loader.cpp */,
|
||||
953F038B0F6C880D00C77FE2 /* state_manager.cpp */,
|
||||
953F038E0F6C8AD800C77FE2 /* state_manager.hpp */,
|
||||
@@ -1543,8 +1543,6 @@
|
||||
95C2AE870F296542000D3E5D /* graphics */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
95D950D70FE4741D002E10AD /* water_splash.hpp */,
|
||||
95D950D80FE4741D002E10AD /* water_splash.cpp */,
|
||||
95C65D980F532FD400BE7BA7 /* camera.cpp */,
|
||||
95C65D960F532FCE00BE7BA7 /* camera.hpp */,
|
||||
9540E2490FD5F8A8002985B8 /* explosion.cpp */,
|
||||
@@ -1569,6 +1567,8 @@
|
||||
95C65D970F532FD400BE7BA7 /* smoke.hpp */,
|
||||
95C65DA00F532FD400BE7BA7 /* shadow.cpp */,
|
||||
95C65D8F0F532FCE00BE7BA7 /* shadow.hpp */,
|
||||
95D950D80FE4741D002E10AD /* water_splash.cpp */,
|
||||
95D950D70FE4741D002E10AD /* water_splash.hpp */,
|
||||
);
|
||||
name = graphics;
|
||||
path = ../../graphics;
|
||||
|
||||
Reference in New Issue
Block a user