Merge branch 'master' of github.com:supertuxkart/stk-code

This commit is contained in:
hiker
2014-11-27 23:06:12 +11:00
9 changed files with 50 additions and 31 deletions

View File

@@ -60,17 +60,16 @@
<!-- The title music. -->
<music title="main_theme.music"/>
<!-- Mostly for debugging: maximum number of history entries -->
<history max-frames="10000"/>
<!-- Replay related values, mostly concerned with saving less data
and using interpolation instead.
max-time: Maximum race time that can be saved in a replay/history file.
delta-t Minumum time between saving consecutive transform events.
delta-pos If the interpolated position is within this delta, a
transform event is not generated.
delta-angle If the interpolated angle is within this delta,
a transform event is not generated. -->
<replay delta-t="0.05" delta-pos="0.1" delta-angle="0.5" />
<replay max-time="600" delta-t="0.05" delta-pos="0.1"
delta-angle="0.5" />
<!-- Skidmark data: maximum number of skid marks, and
time for skidmarks to fade out. -->

View File

@@ -135,6 +135,15 @@ namespace irr
return ReferenceCounter;
}
//! Sets the reference count.
/** Use with extreme caution, since using it incorrectly results in memory
corruption or memory leaks. This method is only implemented for 'hollow'
copies of ScalableFont (an STK extention). */
void setReferenceCount(s32 n)
{
ReferenceCounter = n;
}
//! Returns the debug name of the object.
/** The Debugname may only be set and changed by the object
itself. This method should only be used in Debug mode.

View File

@@ -133,7 +133,6 @@ void STKConfig::load(const std::string &filename)
CHECK_NEG(m_bubblegum_counter, "bubblegum disappear counter");
CHECK_NEG(m_bubblegum_shield_time, "bubblegum shield-time" );
CHECK_NEG(m_explosion_impulse_objects, "explosion-impulse-objects" );
CHECK_NEG(m_max_history, "max-history" );
CHECK_NEG(m_max_skidmarks, "max-skidmarks" );
CHECK_NEG(m_min_kart_version, "<kart-version min...>" );
CHECK_NEG(m_max_kart_version, "<kart-version max=...>" );
@@ -146,6 +145,7 @@ void STKConfig::load(const std::string &filename)
CHECK_NEG(m_leader_time_per_kart, "leader time-per-kart" );
CHECK_NEG(m_penalty_time, "penalty-time" );
CHECK_NEG(m_max_display_news, "max-display-news" );
CHECK_NEG(m_replay_max_time, "replay max-time" );
CHECK_NEG(m_replay_delta_angle, "replay delta-angle" );
CHECK_NEG(m_replay_delta_pos2, "replay delta-position" );
CHECK_NEG(m_replay_dt, "replay delta-t" );
@@ -177,13 +177,13 @@ void STKConfig::init_defaults()
m_bubblegum_shield_time = -100;
m_shield_restrict_weapos = false;
m_max_karts = -100;
m_max_history = -100;
m_max_skidmarks = -100;
m_min_kart_version = -100;
m_max_kart_version = -100;
m_min_track_version = -100;
m_max_track_version = -100;
m_max_display_news = -100;
m_replay_max_time = -100;
m_replay_delta_angle = -100;
m_replay_delta_pos2 = -100;
m_replay_dt = -100;
@@ -286,9 +286,6 @@ void STKConfig::getAllData(const XMLNode * root)
Log::error("StkConfig", "Cannot load title music : %s", title_music.c_str());
}
if(const XMLNode *history_node = root->getNode("history"))
history_node->get("max-frames", &m_max_history);
if(const XMLNode *skidmarks_node = root->getNode("skid-marks"))
{
skidmarks_node->get("max-number", &m_max_skidmarks );
@@ -376,6 +373,8 @@ void STKConfig::getAllData(const XMLNode * root)
replay_node->get("delta-angle", &m_replay_delta_angle);
replay_node->get("delta-pos", &m_replay_delta_pos2 );
replay_node->get("delta-t", &m_replay_dt );
replay_node->get("max-time", &m_replay_max_time );
}
// Get the default KartProperties

View File

@@ -96,8 +96,6 @@ public:
float m_music_credit_time; /**<Time the music credits are
displayed. */
int m_max_karts; /**<Maximum number of karts. */
int m_max_history; /**<Maximum number of frames to save in
a history files. */
bool m_smooth_normals; /**< If normals for raycasts for wheels
should be interpolated. */
/** If the angle between a normal on a vertex and the normal of the
@@ -145,6 +143,9 @@ public:
/** Filename of the title music to play.*/
MusicInformation *m_title_music;
/** Maximum time of a replay. */
int m_replay_max_time;
/** Minimum time between consecutive saved tranform events. */
float m_replay_dt;

View File

@@ -97,9 +97,7 @@ public:
{
ScalableFont* out = new ScalableFont(*this);
out->m_is_hollow_copy = true;
//FIXME: test only. Reset the reference counter of the copy to 1
while (out->getReferenceCount() > 1)
out->drop();
out->setReferenceCount(1);
return out;
}

View File

@@ -29,6 +29,7 @@
#include "io/file_manager.hpp"
#include "io/xml_node.hpp"
#include "karts/abstract_kart.hpp"
#include "karts/ghost_kart.hpp"
#include "karts/kart_properties.hpp"
#include "physics/btKart.hpp"
#include "utils/constants.hpp"
@@ -779,17 +780,21 @@ void KartModel::update(float dt, float rotation_dt, float steer, float speed)
for(unsigned int i=0; i<4; i++)
{
if (!m_kart || !m_wheel_node[i]) continue;
const btWheelInfo &wi = m_kart->getVehicle()->getWheelInfo(i);
#ifdef DEBUG
if(UserConfigParams::m_physics_debug)
if(!m_kart || !m_wheel_node[i]) continue;
float rel_suspension = 0;
if (!dynamic_cast<GhostKart*>(m_kart))
{
// Make wheels that are not touching the ground invisible
m_wheel_node[i]->setVisible(wi.m_raycastInfo.m_isInContact);
}
const btWheelInfo &wi = m_kart->getVehicle()->getWheelInfo(i);
#ifdef DEBUG
if (UserConfigParams::m_physics_debug && m_kart)
{
// Make wheels that are not touching the ground invisible
m_wheel_node[i]->setVisible(wi.m_raycastInfo.m_isInContact);
}
#endif
float rel_suspension = wi.m_raycastInfo.m_suspensionLength
- m_default_physics_suspension[i];
rel_suspension = wi.m_raycastInfo.m_suspensionLength
- m_default_physics_suspension[i];
}
// If the suspension is too compressed
if(rel_suspension< m_min_suspension[i])
rel_suspension = m_min_suspension[i];

View File

@@ -23,6 +23,7 @@
#endif
#include "achievements/achievement_info.hpp"
#include "config/player_manager.hpp"
#include "karts/ghost_kart.hpp"
#include "karts/kart.hpp"
#include "karts/kart_gfx.hpp"
#include "karts/kart_properties.hpp"
@@ -79,7 +80,9 @@ void Skidding::reset()
m_kart->getControls().m_skid = KartControl::SC_NONE;
btVector3 rot(0, 0, 0);
m_kart->getVehicle()->setTimedRotation(0, rot);
// Only access the vehicle if the kart is not a ghost
if (dynamic_cast<GhostKart*>(m_kart)==NULL)
m_kart->getVehicle()->setTimedRotation(0, rot);
} // reset
// ----------------------------------------------------------------------------

View File

@@ -52,7 +52,9 @@ void History::startReplay()
*/
void History::initRecording()
{
allocateMemory(stk_config->m_max_history);
unsigned int max_frames = unsigned int( stk_config->m_replay_max_time
/ stk_config->m_replay_dt );
allocateMemory(max_frames);
m_current = -1;
m_wrapped = false;
m_size = 0;

View File

@@ -55,11 +55,13 @@ void ReplayRecorder::init()
m_transform_events.resize(race_manager->getNumberOfKarts());
m_skid_control.resize(race_manager->getNumberOfKarts());
m_kart_replay_event.resize(race_manager->getNumberOfKarts());
unsigned int max_frames = unsigned int( stk_config->m_replay_max_time
/ stk_config->m_replay_dt);
for(unsigned int i=0; i<race_manager->getNumberOfKarts(); i++)
{
m_transform_events[i].resize(stk_config->m_max_history);
m_transform_events[i].resize(max_frames);
// Rather arbitraritly sized, it will be added with push_back
m_kart_replay_event[i].reserve(100);
m_kart_replay_event[i].reserve(500);
}
m_count_transforms.clear();
m_count_transforms.resize(race_manager->getNumberOfKarts(), 0);
@@ -124,7 +126,7 @@ void ReplayRecorder::update(float dt)
#endif
continue;
}
m_last_saved_time[i] = time;
m_count_transforms[i]++;
if(m_count_transforms[i]>=m_transform_events[i].size())
{
@@ -171,14 +173,15 @@ void ReplayRecorder::Save()
fprintf(fd, "track: %s\n", world->getTrack()->getIdent().c_str());
fprintf(fd, "Laps: %d\n", race_manager->getNumLaps());
unsigned int max_frames = unsigned int( stk_config->m_replay_max_time
/ stk_config->m_replay_dt );
for(unsigned int k=0; k<num_karts; k++)
{
fprintf(fd, "model: %s\n", world->getKart(k)->getIdent().c_str());
fprintf(fd, "size: %d\n", m_count_transforms[k]);
unsigned int num_transforms =
std::min((unsigned int)stk_config->m_max_history,
m_count_transforms[k] );
unsigned int num_transforms = std::min(max_frames,
m_count_transforms[k]);
for(unsigned int i=0; i<num_transforms; i++)
{
const TransformEvent *p=&(m_transform_events[k][i]);