Tux now has wheels in the kart selection screen

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3655 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2009-06-26 01:19:57 +00:00
parent 708b65b0af
commit 7a2e67505f
6 changed files with 55 additions and 28 deletions

View File

@ -277,14 +277,30 @@ 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();
void IrrDriver::renderToTexture(ptr_vector<scene::IMesh, REF>& mesh, std::vector<Vec3>& mesh_location, ITexture* target, float angle)
{
scene::ISceneNode* main_node = NULL;
const int mesh_amount = mesh.size();
for(int n=0; n<mesh_amount; n++)
{
scene::ISceneNode* node = addMesh(mesh.get(n));
if(main_node == NULL)
{
main_node = node;
}
else
{
node->setParent(main_node);
}
node->setPosition( mesh_location[n].toIrrVector() );
node->updateAbsolutePosition();
}
node->setRotation( core::vector3df(0, angle, 0) );
main_node->setScale( core::vector3df(50.0f, 50.0f, 50.0f) );
main_node->setRotation( core::vector3df(0, angle, 0) );
//vector3d< f32 > modelsize = mesh->getBoundingBox().getExtent();
//std::cout << "box size " << modelsize.X*50.0 << ", " << modelsize.Y*50.0 << ", " << modelsize.Z*50.0 << std::endl;
@ -299,22 +315,22 @@ void IrrDriver::renderToTexture(scene::IMesh *mesh, ITexture* target, float angl
light->getLightData().DiffuseColor = irr::video::SColorf(1.0f, 1.0f, 1.0f, 1.0f);
light->getLightData().SpecularColor = irr::video::SColorf(1.0f, 1.0f, 1.0f, 1.0f);
node->setMaterialFlag(EMF_GOURAUD_SHADING , true);
node->setMaterialFlag(EMF_LIGHTING, true);
main_node->setMaterialFlag(EMF_GOURAUD_SHADING , true);
main_node->setMaterialFlag(EMF_LIGHTING, true);
// node->setMaterialFlag(EMF_LIGHTING, true);
const int materials = node->getMaterialCount();
const int materials = main_node->getMaterialCount();
for(int n=0; n<materials; n++)
{
node->getMaterial(n).setFlag(EMF_LIGHTING, true);
main_node->getMaterial(n).setFlag(EMF_LIGHTING, true);
node->getMaterial(n).Shininess = 200.0f; // set size of specular highlights
node->getMaterial(n).SpecularColor.set(255,150,150,150);
node->getMaterial(n).DiffuseColor.set(255,150,150,150);
main_node->getMaterial(n).Shininess = 200.0f; // set size of specular highlights
main_node->getMaterial(n).SpecularColor.set(255,150,150,150);
main_node->getMaterial(n).DiffuseColor.set(255,150,150,150);
//node->getMaterial(n).setFlag(EMF_NORMALIZE_NORMALS , true);
node->getMaterial(n).setFlag(EMF_GOURAUD_SHADING , true);
node->getMaterial(n).GouraudShading = true;
main_node->getMaterial(n).setFlag(EMF_GOURAUD_SHADING , true);
main_node->getMaterial(n).GouraudShading = true;
}
ICameraSceneNode* camera = m_scene_manager->addCameraSceneNode();
@ -329,7 +345,7 @@ void IrrDriver::renderToTexture(scene::IMesh *mesh, ITexture* target, float angl
m_scene_manager->drawAll();
//m_device->getVideoDriver()->endScene();
removeNode(node);
removeNode(main_node);
removeNode(camera);
removeNode(light);

View File

@ -23,6 +23,9 @@
#include <string>
#include <vector>
#include "utils/ptr_vector.hpp"
#include "utils/vec3.hpp"
#include "irrlicht.h"
using namespace irr;
@ -86,7 +89,7 @@ public:
void showPointer();
void hidePointer();
void renderToTexture(scene::IMesh *mesh, irr::video::ITexture* target, float angle);
void renderToTexture(ptr_vector<scene::IMesh, REF>& mesh, std::vector<Vec3>& mesh_location, video::ITexture* target, float angle);
}; // IrrDriver
extern IrrDriver *irr_driver;

View File

@ -128,12 +128,13 @@ namespace StateManager
assert( w3 != NULL );
// set kart model - FIXME - doesn't work very much
IMesh* mesh = kart_properties_manager->getKart("tux")->getKartModel()->getModel();
SAnimatedMesh* test = new SAnimatedMesh(); // FIXME - memory management
test->addMesh(mesh);
//test->setMaterialFlag(EMF_LIGHTING , false);
KartModel* kartModel = kart_properties_manager->getKart("tux")->getKartModel();
w3->setModel(test);
w3->addModel( kartModel->getModel() );
w3->addModel( kartModel->getWheelModel(0), kartModel->getWheelGraphicsPosition(0) );
w3->addModel( kartModel->getWheelModel(1), kartModel->getWheelGraphicsPosition(1) );
w3->addModel( kartModel->getWheelModel(2), kartModel->getWheelGraphicsPosition(2) );
w3->addModel( kartModel->getWheelModel(3), kartModel->getWheelGraphicsPosition(3) );
w3->update(0);
getCurrentScreen()->m_inited = true;

View File

@ -1273,9 +1273,10 @@ void ModelViewWidget::add()
m_texture = GUIEngine::getDriver()->addTexture( core::dimension2d< s32 >(512, 512), name.c_str() );
}
// -----------------------------------------------------------------------------
void ModelViewWidget::setModel(IMesh* mesh)
void ModelViewWidget::addModel(irr::scene::IMesh* mesh, const Vec3& location)
{
m_model = mesh;
m_models.push_back(mesh);
m_model_location.push_back(location);
/*
((IGUIMeshViewer*)m_element)->setMesh( mesh );
@ -1292,7 +1293,7 @@ void ModelViewWidget::update(float delta)
angle += delta*10;
if(angle > 360) angle -= 360;
irr_driver->renderToTexture(m_model, m_texture, angle);
irr_driver->renderToTexture(m_models, m_model_location, m_texture, angle);
((IGUIImage*)m_element)->setImage(m_texture);
}

View File

@ -23,6 +23,7 @@
#include <map>
#include "utils/ptr_vector.hpp"
#include "utils/vec3.hpp"
using namespace irr;
using namespace gui;
@ -344,14 +345,17 @@ namespace GUIEngine
class ModelViewWidget : public Widget
{
scene::IMesh* m_model;
ptr_vector<scene::IMesh, REF> m_models;
std::vector<Vec3> m_model_location;
video::ITexture* m_texture;
float angle;
public:
~ModelViewWidget();
void add();
void setModel(irr::scene::IMesh* mesh);
void addModel(irr::scene::IMesh* mesh, const Vec3& location = Vec3(0,0,0));
void update(float delta);
};

View File

@ -105,6 +105,8 @@ public:
void attachModel(scene::IAnimatedMeshSceneNode **node);
scene::IAnimatedMesh* getModel() const { return m_mesh; }
scene::IMesh* getWheelModel(const int wheelID) const { return m_wheel_model[wheelID]; }
/** Returns the position of a wheel relative to the kart.
* \param i Index of the wheel: 0=front right, 1 = front left, 2 = rear
* right, 3 = rear left. */