Merge remote-tracking branch 'upstream/master'
@@ -105,7 +105,6 @@ when the border that intersect at this corner are enabled.
|
||||
left_border="75" right_border="75" top_border="0" bottom_border="15"
|
||||
hborder_out_portion="0.2" />
|
||||
|
||||
|
||||
<!-- Stateless -->
|
||||
<element type="squareFocusHalo" image="ocean/glass_square_focused.png"
|
||||
left_border="6" right_border ="6" top_border="6" bottom_border="6"
|
||||
@@ -132,6 +131,21 @@ when the border that intersect at this corner are enabled.
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
|
||||
<!-- player name spinner color in multiplayer-->
|
||||
<element type="spinner1" state="neutral" image="ocean/glass_square1.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
<element type="spinner2" state="neutral" image="ocean/glass_square2.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
<element type="spinner3" state="neutral" image="ocean/glass_square3.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
<element type="spinner4" state="neutral" image="ocean/glass_square4.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
|
||||
|
||||
<!-- This one is a bit special. Only area(s) LEFT and/or RIGHT will be rendered. They will be overlaid
|
||||
on top of the spinner's background -->
|
||||
<element type="spinner" state="down" image="ocean/glassspinner_down.png"
|
||||
|
||||
@@ -132,6 +132,19 @@ when the border that intersect at this corner are enabled.
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
|
||||
<element type="spinner1" state="neutral" image="peach/glass_square1.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
<element type="spinner2" state="neutral" image="peach/glass_square2.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
<element type="spinner3" state="neutral" image="peach/glass_square3.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
<element type="spinner4" state="neutral" image="peach/glass_square4.png"
|
||||
left_border="110" right_border="110" top_border="0" bottom_border="36"
|
||||
preserve_h_aspect_ratios="true" hborder_out_portion="0.0" />
|
||||
|
||||
<!-- This one is a bit special. Only area(s) LEFT and/or RIGHT will be rendered. They will be overlaid
|
||||
on top of the spinner's background -->
|
||||
<element type="spinner" state="down" image="peach/glassspinner_down.png"
|
||||
|
||||
BIN
data/skins/ocean/glass_square1.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
data/skins/ocean/glass_square2.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
data/skins/ocean/glass_square3.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
data/skins/ocean/glass_square4.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
data/skins/peach/glass_square1.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
data/skins/peach/glass_square2.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
data/skins/peach/glass_square3.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
data/skins/peach/glass_square4.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
@@ -144,6 +144,48 @@ void PlayerManager::deletePlayer(PlayerProfile *player)
|
||||
m_all_players.erase(player);
|
||||
} // deletePlayer
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** This function makes sure that a current player is defined. This is called
|
||||
* when a screen skipping command line option is given (-N, -R, ...), in
|
||||
* which case there might not be a current player (if no default player is
|
||||
* set in players.xml, i.e. the 'remember be' option was not picked ). Since
|
||||
* a lot of code depends on having a local player, just set the most
|
||||
* frequently used non-guest to be the current player.
|
||||
*/
|
||||
void PlayerManager::enforceCurrentPlayer()
|
||||
{
|
||||
if (m_current_player) return;
|
||||
|
||||
PlayerProfile *player;
|
||||
for_in(player, m_all_players)
|
||||
{
|
||||
if (!player->isGuestAccount())
|
||||
{
|
||||
Log::info("PlayerManager", "Enfocring current player '%ls'.",
|
||||
player->getName().c_str() );
|
||||
m_current_player = player;
|
||||
return;
|
||||
}
|
||||
} // for player in m_all_players
|
||||
|
||||
// This shouldn't happen - but just in case: add the default players
|
||||
// again, and search again for a non-guest player.
|
||||
addDefaultPlayer();
|
||||
for_in(player, m_all_players)
|
||||
{
|
||||
if (!player->isGuestAccount())
|
||||
{
|
||||
Log::info("PlayerManager", "Enfocring current player '%s'.",
|
||||
player->getName().c_str());
|
||||
m_current_player = player;
|
||||
return;
|
||||
}
|
||||
} // for player in m_all_players
|
||||
|
||||
// Now this really really should not happen.
|
||||
Log::fatal("PlayerManager", "Failed to find a non-guest player.");
|
||||
} // enforceCurrentPlayer
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Called when no player profiles exists. It creates two players: one
|
||||
* guest player, and one non-guest player for whic hit tries to guess a
|
||||
|
||||
@@ -78,6 +78,7 @@ public:
|
||||
void deletePlayer(PlayerProfile *player);
|
||||
void setCurrentPlayer(PlayerProfile *player, bool remember_me);
|
||||
const PlayerProfile *getPlayerById(unsigned int id);
|
||||
void enforceCurrentPlayer();
|
||||
// ------------------------------------------------------------------------
|
||||
/** Returns the current player. */
|
||||
PlayerProfile* getCurrentPlayer() { return m_current_player; }
|
||||
|
||||
@@ -290,7 +290,7 @@ void Shaders::check(const int num) const
|
||||
{
|
||||
if (m_shaders[num] == -1)
|
||||
{
|
||||
Log::fatal("shaders", "Shader %s failed to load. Update your drivers, if the issue "
|
||||
Log::error("shaders", "Shader %s failed to load. Update your drivers, if the issue "
|
||||
"persists, report a bug to us.", shader_names[num] + 3);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1226,7 +1226,42 @@ void Skin::drawSpinnerBody(const core::recti &rect, Widget* widget,
|
||||
? SkinConfig::m_render_params["spinner::focused"]
|
||||
: SkinConfig::m_render_params["spinner::neutral"];
|
||||
|
||||
if (widget->isFocusedForPlayer(1))
|
||||
// defining a spinner widget to use the spinner widget class property(getBackgroundColor)
|
||||
SpinnerWidget* q = dynamic_cast<SpinnerWidget*>(widget);
|
||||
if(q->getUseBackgroundColor())
|
||||
{
|
||||
int player_id=q->getSpinnerWidgetPlayerID();
|
||||
if(player_id==0)
|
||||
params=SkinConfig::m_render_params["spinner1::neutral"];
|
||||
else if(player_id==1)
|
||||
params=SkinConfig::m_render_params["spinner2::neutral"];
|
||||
else if(player_id==2)
|
||||
params=SkinConfig::m_render_params["spinner3::neutral"];
|
||||
else if(player_id==3)
|
||||
params=SkinConfig::m_render_params["spinner4::neutral"];
|
||||
}
|
||||
else if (focused|| pressed)
|
||||
{
|
||||
params=SkinConfig::m_render_params["spinner::focused"];
|
||||
}
|
||||
else
|
||||
{
|
||||
params=SkinConfig::m_render_params["spinner::neutral"];
|
||||
}
|
||||
|
||||
if (widget->isFocusedForPlayer(0))
|
||||
{
|
||||
core::recti rect2 = rect;
|
||||
rect2.UpperLeftCorner.X += 2;
|
||||
rect2.UpperLeftCorner.Y -= 3;
|
||||
rect2.LowerRightCorner.X -= 2;
|
||||
rect2.LowerRightCorner.Y += 5;
|
||||
drawBoxFromStretchableTexture(widget, rect2,
|
||||
SkinConfig::m_render_params["squareFocusHalo::neutral"]);
|
||||
|
||||
|
||||
}
|
||||
else if (widget->isFocusedForPlayer(1))
|
||||
{
|
||||
core::recti rect2 = rect;
|
||||
rect2.UpperLeftCorner.X += 2;
|
||||
@@ -1284,6 +1319,7 @@ void Skin::drawSpinnerBody(const core::recti &rect, Widget* widget,
|
||||
|
||||
// ---- If this spinner is of "gauge" type, draw filling
|
||||
const SpinnerWidget* w = dynamic_cast<const SpinnerWidget*>(widget);
|
||||
|
||||
if (w->isGauge() && !w->m_deactivated)
|
||||
{
|
||||
const int handle_size = (int)( widget->m_h*params.m_left_border
|
||||
|
||||
@@ -132,7 +132,6 @@ using namespace irr;
|
||||
*/
|
||||
namespace GUIEngine
|
||||
{
|
||||
|
||||
/**
|
||||
* In order to avoid calculating render information every frame, it's
|
||||
* stored in a SkinWidgetContainer for each widget (or each widget part
|
||||
@@ -269,11 +268,8 @@ namespace GUIEngine
|
||||
|
||||
|
||||
video::ITexture* bg_image;
|
||||
|
||||
|
||||
std::vector<Widget*> m_tooltips;
|
||||
std::vector<bool> m_tooltip_at_mouse;
|
||||
|
||||
#ifdef USE_PER_LINE_BACKGROUND
|
||||
public:
|
||||
#endif
|
||||
@@ -323,12 +319,12 @@ namespace GUIEngine
|
||||
|
||||
void drawTooltip(Widget* widget, bool atMouse);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
// dirty way to have dialogs that zoom in
|
||||
bool m_dialog;
|
||||
float m_dialog_size;
|
||||
|
||||
/**
|
||||
* \brief load a skin from the file specified in the user configuration file
|
||||
* \throw std::runtime_error if file cannot be read
|
||||
|
||||
@@ -45,7 +45,8 @@ SpinnerWidget::SpinnerWidget(const bool gauge) : Widget(WTYPE_SPINNER)
|
||||
m_check_inside_me = true; //FIXME: not sure this is necessary
|
||||
m_supports_multiplayer = true;
|
||||
m_value = -1;
|
||||
|
||||
m_use_background_color=false;
|
||||
m_spinner_widget_player_id=-1;
|
||||
m_min = 0;
|
||||
m_max = 999;
|
||||
}
|
||||
@@ -160,6 +161,7 @@ void SpinnerWidget::add()
|
||||
{
|
||||
label->setText(m_labels[m_value].c_str() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -173,9 +175,10 @@ void SpinnerWidget::add()
|
||||
m_children[2].m_id = m_children[2].m_element->getID();
|
||||
|
||||
// refresh display
|
||||
|
||||
|
||||
setValue(m_value);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
ITexture* SpinnerWidget::getTexture()
|
||||
|
||||
@@ -68,6 +68,10 @@ namespace GUIEngine
|
||||
* it displays how close the value is to the maximum by filling a line
|
||||
*/
|
||||
bool m_gauge;
|
||||
|
||||
//for setting background
|
||||
bool m_use_background_color;
|
||||
int m_spinner_widget_player_id;
|
||||
|
||||
/** \brief Whether to wrap back to the first value when going "beyond" the last value */
|
||||
bool m_wrap_around;
|
||||
@@ -93,7 +97,7 @@ namespace GUIEngine
|
||||
|
||||
/** Call only if this spinner is graphical. Returns the current texture to display */
|
||||
irr::video::ITexture* getTexture();
|
||||
|
||||
|
||||
public:
|
||||
|
||||
LEAK_CHECK()
|
||||
@@ -104,7 +108,15 @@ namespace GUIEngine
|
||||
|
||||
void addLabel(irr::core::stringw label);
|
||||
void clearLabels();
|
||||
|
||||
|
||||
// next four functions are for background colour behind playername in multikart screen selection
|
||||
void setUseBackgroundColor() {m_use_background_color=true;}
|
||||
bool getUseBackgroundColor() {return m_use_background_color;}
|
||||
void setSpinnerWidgetPlayerID(int playerID) {m_spinner_widget_player_id=playerID;}
|
||||
int getSpinnerWidgetPlayerID() {return m_spinner_widget_player_id;}
|
||||
|
||||
|
||||
|
||||
void setListener(ISpinnerConfirmListener* listener) { m_listener = listener; }
|
||||
|
||||
/** \brief implement method from base class Widget */
|
||||
@@ -166,7 +178,7 @@ namespace GUIEngine
|
||||
/** Display custom text in spinner */
|
||||
void setCustomText(const core::stringw& text);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -160,12 +160,16 @@ FileManager::FileManager()
|
||||
root_dir = "../data/" ;
|
||||
else if(m_file_system->existFile("../../data"))
|
||||
root_dir = "../../data/" ;
|
||||
// Test for old style build environment, with executable in root of stk
|
||||
else if(m_file_system->existFile(exe_path+"data"))
|
||||
root_dir = (exe_path+"data/").c_str();
|
||||
else if(m_file_system->existFile(exe_path+"/../data"))
|
||||
// Check for windows cmake style: bld/Debug/bin/supertuxkart.exe
|
||||
else if (m_file_system->existFile(exe_path + "../../../data"))
|
||||
root_dir = (exe_path + "../../../data/").c_str();
|
||||
else if (m_file_system->existFile(exe_path + "../data"))
|
||||
{
|
||||
root_dir = exe_path.c_str();
|
||||
root_dir += "/../data/";
|
||||
root_dir += "../data/";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -351,7 +355,7 @@ FileManager::~FileManager()
|
||||
*/
|
||||
void FileManager::addRootDirs(const std::string &roots)
|
||||
{
|
||||
std::vector<std::string> all = StringUtils::split(roots, ':');
|
||||
std::vector<std::string> all = StringUtils::splitPath(roots);
|
||||
for(unsigned int i=0; i<all.size(); i++)
|
||||
{
|
||||
if(all[i].size()==0 || all[i][all[i].size()-1]!='/')
|
||||
|
||||
88
src/main.cpp
@@ -1061,18 +1061,43 @@ void initRest()
|
||||
} // initRest
|
||||
|
||||
//=============================================================================
|
||||
#ifdef BREAKPAD
|
||||
bool ShowDumpResults(const wchar_t* dump_path,
|
||||
const wchar_t* minidump_id,
|
||||
void* context,
|
||||
EXCEPTION_POINTERS* exinfo,
|
||||
MDRawAssertionInfo* assertion,
|
||||
bool succeeded)
|
||||
void askForInternetPermission()
|
||||
{
|
||||
wprintf(L"Path: %s id %s.\n", dump_path, minidump_id);
|
||||
return succeeded;
|
||||
}
|
||||
#endif
|
||||
if (UserConfigParams::m_internet_status ==
|
||||
Online::RequestManager::IPERM_NOT_ASKED)
|
||||
{
|
||||
class ConfirmServer :
|
||||
public MessageDialog::IConfirmDialogListener
|
||||
{
|
||||
public:
|
||||
virtual void onConfirm()
|
||||
{
|
||||
UserConfigParams::m_internet_status =
|
||||
Online::RequestManager::IPERM_ALLOWED;
|
||||
GUIEngine::ModalDialog::dismiss();
|
||||
} // onConfirm
|
||||
// --------------------------------------------------------
|
||||
virtual void onCancel()
|
||||
{
|
||||
UserConfigParams::m_internet_status =
|
||||
Online::RequestManager::IPERM_NOT_ALLOWED;
|
||||
GUIEngine::ModalDialog::dismiss();
|
||||
} // onCancel
|
||||
}; // ConfirmServer
|
||||
|
||||
new MessageDialog(_("SuperTuxKart may connect to a server "
|
||||
"to download add-ons and notify you of updates. Would you "
|
||||
"like this feature to be enabled? (To change this setting "
|
||||
"at a later time, go to options, select tab "
|
||||
"'User Interface', and edit \"Allow STK to connect to the "
|
||||
"Internet\")."),
|
||||
MessageDialog::MESSAGE_DIALOG_CONFIRM,
|
||||
new ConfirmServer(), true);
|
||||
}
|
||||
|
||||
} // askForInternetPermission
|
||||
|
||||
//=============================================================================
|
||||
|
||||
#if defined(DEBUG) && defined(WIN32) && !defined(__CYGWIN__)
|
||||
#pragma comment(linker, "/SUBSYSTEM:console")
|
||||
@@ -1081,10 +1106,6 @@ bool ShowDumpResults(const wchar_t* dump_path,
|
||||
// ----------------------------------------------------------------------------
|
||||
int main(int argc, char *argv[] )
|
||||
{
|
||||
#ifdef BREAKPAD
|
||||
google_breakpad::ExceptionHandler eh(L"C:\\Temp", NULL, ShowDumpResults,
|
||||
NULL, google_breakpad::ExceptionHandler::HANDLER_ALL);
|
||||
#endif
|
||||
CommandLine::init(argc, argv);
|
||||
|
||||
CrashReporting::installHandlers();
|
||||
@@ -1209,40 +1230,15 @@ int main(int argc, char *argv[] )
|
||||
wiimote_manager->askUserToConnectWiimotes();
|
||||
}
|
||||
#endif
|
||||
if(UserConfigParams::m_internet_status ==
|
||||
Online::RequestManager::IPERM_NOT_ASKED)
|
||||
{
|
||||
class ConfirmServer :
|
||||
public MessageDialog::IConfirmDialogListener
|
||||
{
|
||||
public:
|
||||
virtual void onConfirm()
|
||||
{
|
||||
UserConfigParams::m_internet_status =
|
||||
Online::RequestManager::IPERM_ALLOWED;
|
||||
GUIEngine::ModalDialog::dismiss();
|
||||
} // onConfirm
|
||||
// --------------------------------------------------------
|
||||
virtual void onCancel()
|
||||
{
|
||||
UserConfigParams::m_internet_status =
|
||||
Online::RequestManager::IPERM_NOT_ALLOWED;
|
||||
GUIEngine::ModalDialog::dismiss();
|
||||
} // onCancel
|
||||
}; // ConfirmServer
|
||||
|
||||
new MessageDialog(_("SuperTuxKart may connect to a server "
|
||||
"to download add-ons and notify you of updates. Would you "
|
||||
"like this feature to be enabled? (To change this setting "
|
||||
"at a later time, go to options, select tab "
|
||||
"'User Interface', and edit \"Allow STK to connect to the "
|
||||
"Internet\")."),
|
||||
MessageDialog::MESSAGE_DIALOG_CONFIRM,
|
||||
new ConfirmServer(), true);
|
||||
}
|
||||
askForInternetPermission();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Skip the start screen. This esp. means that no login screen is
|
||||
// displayed (if necessary), so we have to make sure there is
|
||||
// a current player
|
||||
PlayerManager::get()->enforceCurrentPlayer();
|
||||
|
||||
InputDevice *device;
|
||||
|
||||
// Use keyboard 0 by default in --no-start-screen
|
||||
|
||||
@@ -134,6 +134,10 @@ PlayerNameSpinner::PlayerNameSpinner(KartSelectionScreen* parent,
|
||||
m_incorrect = false;
|
||||
m_red_mark_widget = NULL;
|
||||
m_parent = parent;
|
||||
m_use_background_color = true;
|
||||
|
||||
setUseBackgroundColor();//except for multiplayer kart selection, this is false
|
||||
setSpinnerWidgetPlayerID(m_player_id);
|
||||
} // PlayerNameSpinner
|
||||
// ------------------------------------------------------------------------
|
||||
void PlayerNameSpinner::setID(const int m_player_id)
|
||||
@@ -270,6 +274,7 @@ PlayerKartWidget::PlayerKartWidget(KartSelectionScreen* parent,
|
||||
|
||||
//m_player_ident_spinner->m_event_handler = this;
|
||||
m_children.push_back(m_player_ident_spinner);
|
||||
|
||||
|
||||
|
||||
// ----- Kart model view
|
||||
@@ -410,12 +415,13 @@ void PlayerKartWidget::setPlayerID(const int newPlayerID)
|
||||
|
||||
// Change the player ID
|
||||
m_player_id = newPlayerID;
|
||||
|
||||
// restore previous focus, but with new player ID
|
||||
if (focus != NULL) focus->setFocusForPlayer(m_player_id);
|
||||
|
||||
if (m_player_ident_spinner != NULL)
|
||||
{
|
||||
m_player_ident_spinner->setID(m_player_id);
|
||||
}
|
||||
} // setPlayerID
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
@@ -481,7 +487,7 @@ void PlayerKartWidget::add()
|
||||
const int player_amount = PlayerManager::get()->getNumPlayers();
|
||||
for (int n=0; n<player_amount; n++)
|
||||
{
|
||||
core::stringw name = PlayerManager::get()->getPlayer(n)->getName();
|
||||
core::stringw name = PlayerManager::get()->getPlayer(n)->getName();
|
||||
m_player_ident_spinner->addLabel( translations->fribidize(name) );
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ namespace GUIEngine
|
||||
class Widget;
|
||||
class BubbleWidget;
|
||||
enum EventPropagation;
|
||||
|
||||
}
|
||||
namespace Online
|
||||
{
|
||||
@@ -203,7 +204,6 @@ class PlayerNameSpinner : public GUIEngine::SpinnerWidget
|
||||
bool m_incorrect;
|
||||
irr::gui::IGUIImage* m_red_mark_widget;
|
||||
KartSelectionScreen* m_parent;
|
||||
|
||||
//virtual EventPropagation focused(const int m_playerID) ;
|
||||
|
||||
public:
|
||||
|
||||
@@ -251,12 +251,14 @@ TrackObjectPresentationMesh::TrackObjectPresentationMesh(
|
||||
void TrackObjectPresentationMesh::init(const XMLNode* xml_node, scene::ISceneNode* parent, bool enabled)
|
||||
{
|
||||
bool skeletal_animation = true; // for backwards compatibility, if unspecified assume there is
|
||||
xml_node->get("skeletal-animation", &skeletal_animation);
|
||||
if(xml_node)
|
||||
xml_node->get("skeletal-animation", &skeletal_animation);
|
||||
|
||||
bool animated = skeletal_animation && (UserConfigParams::m_graphical_effects ||
|
||||
World::getWorld()->getIdent() == IDENT_CUTSCENE);
|
||||
bool displacing = false;
|
||||
xml_node->get("displacing", &displacing);
|
||||
if(xml_node)
|
||||
xml_node->get("displacing", &displacing);
|
||||
animated &= !displacing;
|
||||
|
||||
m_mesh->grab();
|
||||
@@ -281,11 +283,11 @@ void TrackObjectPresentationMesh::init(const XMLNode* xml_node, scene::ISceneNod
|
||||
m_node = node;
|
||||
|
||||
m_frame_start = node->getStartFrame();
|
||||
if (xml_node != NULL)
|
||||
if (xml_node)
|
||||
xml_node->get("frame-start", &m_frame_start);
|
||||
|
||||
m_frame_end = node->getEndFrame();
|
||||
if (xml_node != NULL)
|
||||
if (xml_node)
|
||||
xml_node->get("frame-end", &m_frame_end);
|
||||
}
|
||||
else
|
||||
|
||||