Fix #186
Display win animation as jymis suggests in kart selection screen
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
#include <IMeshSceneNode.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include "../../lib/irrlicht/source/Irrlicht/os.h"
|
||||
|
||||
using namespace GUIEngine;
|
||||
using namespace irr::core;
|
||||
@@ -89,6 +90,7 @@ void ModelViewWidget::clearModels()
|
||||
m_model_scale.clear();
|
||||
m_model_frames.clear();
|
||||
m_model_render_info_affected.clear();
|
||||
m_model_animation_speed.clear();
|
||||
|
||||
if (m_rtt_main_node != NULL) m_rtt_main_node->remove();
|
||||
if (m_light != NULL) m_light->remove();
|
||||
@@ -103,16 +105,18 @@ void ModelViewWidget::clearModels()
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
void ModelViewWidget::addModel(irr::scene::IMesh* mesh, const Vec3& location,
|
||||
const Vec3& scale, const int frame,
|
||||
bool all_parts_colorized)
|
||||
const Vec3& scale, const int start_loop_frame,
|
||||
const int end_loop_frame,
|
||||
bool all_parts_colorized, float animation_speed)
|
||||
{
|
||||
if(!mesh) return;
|
||||
|
||||
m_models.push_back(mesh);
|
||||
m_model_location.push_back(location);
|
||||
m_model_scale.push_back(scale);
|
||||
m_model_frames.push_back(frame);
|
||||
m_model_frames.emplace_back(start_loop_frame, end_loop_frame);
|
||||
m_model_render_info_affected.push_back(all_parts_colorized);
|
||||
m_model_animation_speed.push_back(animation_speed);
|
||||
#ifndef SERVER_ONLY
|
||||
if (!CVS->isGLSL())
|
||||
m_render_target = NULL;
|
||||
@@ -187,6 +191,8 @@ void ModelViewWidget::update(float delta)
|
||||
m_rtt_main_node->setRotation(core::vector3df(0.0f, m_angle, 0.0f));
|
||||
|
||||
m_rtt_main_node->setVisible(true);
|
||||
if (UserConfigParams::m_show_steering_animations != 0)
|
||||
m_rtt_main_node->OnAnimate(os::Timer::getTime());
|
||||
|
||||
m_render_target->renderToTexture(m_camera, GUIEngine::getLatestDt());
|
||||
|
||||
@@ -210,7 +216,7 @@ void ModelViewWidget::setupRTTScene()
|
||||
|
||||
irr_driver->clearLights();
|
||||
|
||||
if (m_model_frames[0] == -1)
|
||||
if (m_model_frames[0].first == -1)
|
||||
{
|
||||
scene::ISceneNode* node = irr_driver->addMesh(m_models.get(0), "rtt_mesh",
|
||||
NULL, m_render_info, m_model_render_info_affected[0]);
|
||||
@@ -225,8 +231,8 @@ void ModelViewWidget::setupRTTScene()
|
||||
irr_driver->addAnimatedMesh((scene::IAnimatedMesh*)m_models.get(0), "rtt_mesh",
|
||||
NULL, m_render_info, m_model_render_info_affected[0]);
|
||||
node->setPosition(m_model_location[0].toIrrVector());
|
||||
node->setFrameLoop(m_model_frames[0], m_model_frames[0]);
|
||||
node->setAnimationSpeed(0);
|
||||
node->setFrameLoop(m_model_frames[0].first, m_model_frames[0].second);
|
||||
node->setAnimationSpeed(m_model_animation_speed[0]);
|
||||
node->setScale(m_model_scale[0].toIrrVector());
|
||||
node->setMaterialFlag(video::EMF_FOG_ENABLE, false);
|
||||
m_rtt_main_node = node;
|
||||
@@ -237,11 +243,12 @@ void ModelViewWidget::setupRTTScene()
|
||||
assert(m_models.size() == m_model_frames.size());
|
||||
assert(m_models.size() == m_model_scale.size());
|
||||
assert(m_models.size() == m_model_render_info_affected.size());
|
||||
assert(m_models.size() == m_model_animation_speed.size());
|
||||
|
||||
const int mesh_amount = m_models.size();
|
||||
for (int n = 1; n<mesh_amount; n++)
|
||||
{
|
||||
if (m_model_frames[n] == -1)
|
||||
if (m_model_frames[n].first == -1)
|
||||
{
|
||||
scene::ISceneNode* node =
|
||||
irr_driver->addMesh(m_models.get(n), "rtt_node", m_rtt_main_node,
|
||||
@@ -257,8 +264,8 @@ void ModelViewWidget::setupRTTScene()
|
||||
"modelviewrtt", m_rtt_main_node, m_render_info,
|
||||
m_model_render_info_affected[n]);
|
||||
node->setPosition(m_model_location[n].toIrrVector());
|
||||
node->setFrameLoop(m_model_frames[n], m_model_frames[n]);
|
||||
node->setAnimationSpeed(0);
|
||||
node->setFrameLoop(m_model_frames[n].first, m_model_frames[n].second);
|
||||
node->setAnimationSpeed(m_model_animation_speed[0]);
|
||||
node->updateAbsolutePosition();
|
||||
node->setScale(m_model_scale[n].toIrrVector());
|
||||
//Log::info("ModelViewWidget", "Set frame %d", m_model_frames[n]);
|
||||
|
||||
@@ -50,8 +50,9 @@ namespace GUIEngine
|
||||
PtrVector<scene::IMesh, REF> m_models;
|
||||
AlignedArray<Vec3> m_model_location;
|
||||
AlignedArray<Vec3> m_model_scale;
|
||||
std::vector<int> m_model_frames;
|
||||
std::vector<std::pair<int, int> > m_model_frames;
|
||||
std::vector<bool> m_model_render_info_affected;
|
||||
std::vector<float> m_model_animation_speed;
|
||||
std::unique_ptr<RenderTarget> m_render_target;
|
||||
float m_angle;
|
||||
|
||||
@@ -77,8 +78,10 @@ namespace GUIEngine
|
||||
void addModel(irr::scene::IMesh* mesh,
|
||||
const Vec3& location = Vec3(0,0,0),
|
||||
const Vec3& scale = Vec3(1,1,1),
|
||||
const int frame=-1,
|
||||
bool all_parts_colorized = false);
|
||||
const int start_loop_frame=-1,
|
||||
const int end_loop_frame=-1,
|
||||
bool all_parts_colorized = false,
|
||||
float animation_speed=0.0f);
|
||||
|
||||
void update(float delta);
|
||||
|
||||
|
||||
@@ -195,6 +195,7 @@ PlayerKartWidget::PlayerKartWidget(KartSelectionScreen* parent,
|
||||
|
||||
m_model_view->addModel( kart_model.getModel(), Vec3(0,0,0),
|
||||
Vec3(scale, scale, scale),
|
||||
kart_model.getBaseFrame(),
|
||||
kart_model.getBaseFrame() );
|
||||
m_model_view->addModel( kart_model.getWheelModel(0),
|
||||
kart_model.getWheelGraphicsPosition(0) );
|
||||
|
||||
@@ -271,6 +271,10 @@ public:
|
||||
* to use. */
|
||||
int getBaseFrame() const { return m_animation_frame[AF_STRAIGHT]; }
|
||||
// ------------------------------------------------------------------------
|
||||
int getFrame(AnimationFrameType f) const { return m_animation_frame[f]; }
|
||||
// ------------------------------------------------------------------------
|
||||
float getAnimationSpeed() const { return m_animation_speed; }
|
||||
// ------------------------------------------------------------------------
|
||||
/** 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. */
|
||||
|
||||
@@ -875,9 +875,22 @@ void KartSelectionScreen::updateKartWidgetModel(int widget_id,
|
||||
}
|
||||
|
||||
w3->clearModels();
|
||||
const bool has_win_anime =
|
||||
UserConfigParams::m_show_steering_animations != 0 &&
|
||||
(kart_model.getFrame(KartModel::AF_WIN_LOOP_START) > -1 ||
|
||||
kart_model.getFrame(KartModel::AF_WIN_START) > -1) &&
|
||||
kart_model.getFrame(KartModel::AF_WIN_END) > -1;
|
||||
w3->addModel( kart_model.getModel(), Vec3(0,0,0),
|
||||
Vec3(scale, scale, scale),
|
||||
kart_model.getBaseFrame() );
|
||||
has_win_anime ?
|
||||
kart_model.getFrame(KartModel::AF_WIN_LOOP_START) > -1 ?
|
||||
kart_model.getFrame(KartModel::AF_WIN_LOOP_START) :
|
||||
kart_model.getFrame(KartModel::AF_WIN_START) :
|
||||
kart_model.getBaseFrame(),
|
||||
has_win_anime ? kart_model.getFrame(KartModel::AF_WIN_END) :
|
||||
kart_model.getBaseFrame(),
|
||||
false/*all_parts_colorized*/,
|
||||
kart_model.getAnimationSpeed());
|
||||
w3->addModel( kart_model.getWheelModel(0),
|
||||
kart_model.getWheelGraphicsPosition(0) );
|
||||
w3->addModel( kart_model.getWheelModel(1),
|
||||
|
||||
@@ -155,31 +155,35 @@ void SoccerSetupScreen::beforeAddingWidget()
|
||||
}
|
||||
|
||||
// Add the kart model (including wheels and speed weight objects)
|
||||
kart_view->addModel( kart_model.getModel(), Vec3(0,0,0),
|
||||
Vec3(35.0f, 35.0f, 35.0f),
|
||||
kart_model.getBaseFrame() );
|
||||
kart_view->addModel(kart_model.getModel(), Vec3(0, 0, 0),
|
||||
Vec3(35.0f, 35.0f, 35.0f), kart_model.getBaseFrame(),
|
||||
kart_model.getBaseFrame());
|
||||
|
||||
kart_view->addModel( kart_model.getWheelModel(0),
|
||||
kart_model.getWheelGraphicsPosition(0),
|
||||
Vec3(1, 1, 1), /*scale*/
|
||||
-1, /*frame*/
|
||||
-1, /*start_loop_frame*/
|
||||
-1, /*end_loop_frame*/
|
||||
true /*all_parts_colorized*/);
|
||||
|
||||
kart_view->addModel( kart_model.getWheelModel(1),
|
||||
kart_model.getWheelGraphicsPosition(1),
|
||||
Vec3(1, 1, 1), /*scale*/
|
||||
-1, /*frame*/
|
||||
-1, /*start_loop_frame*/
|
||||
-1, /*end_loop_frame*/
|
||||
true /*all_parts_colorized*/);
|
||||
kart_view->addModel( kart_model.getWheelModel(2),
|
||||
kart_model.getWheelGraphicsPosition(2),
|
||||
Vec3(1, 1, 1), /*scale*/
|
||||
-1, /*frame*/
|
||||
-1, /*start_loop_frame*/
|
||||
-1, /*end_loop_frame*/
|
||||
true /*all_parts_colorized*/);
|
||||
|
||||
kart_view->addModel( kart_model.getWheelModel(3),
|
||||
kart_model.getWheelGraphicsPosition(3),
|
||||
Vec3(1, 1, 1), /*scale*/
|
||||
-1, /*frame*/
|
||||
-1, /*start_loop_frame*/
|
||||
-1, /*end_loop_frame*/
|
||||
true /*all_parts_colorized*/);
|
||||
|
||||
for (size_t i = 0; i < kart_model.getSpeedWeightedObjectsCount(); i++)
|
||||
@@ -187,7 +191,8 @@ void SoccerSetupScreen::beforeAddingWidget()
|
||||
const SpeedWeightedObject& obj = kart_model.getSpeedWeightedObject((int)i);
|
||||
kart_view->addModel(obj.m_model, obj.m_position,
|
||||
Vec3(1, 1, 1), /*scale*/
|
||||
-1, /*frame*/
|
||||
-1, /*start_loop_frame*/
|
||||
-1, /*end_loop_frame*/
|
||||
true /*all_parts_colorized*/);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user