This commit is contained in:
deve 2016-08-26 10:36:09 +02:00
commit 6c9050f47a
56 changed files with 505 additions and 232 deletions

View File

@ -3,6 +3,7 @@
<card is="Intel(R) HD Graphics 3000" os="windows" disable="UniformBufferObject"/>
<card is="Intel(R) HD Graphics 3000" os="windows" disable="AdvancedPipeline"/>
<card is="Intel(R) HD Graphics 3000" os="windows" disable="FramebufferSRGBWorking"/>
<card is="Intel(R) HD Graphics" os="windows" disable="ForceLegacyDevice"/>
<card contains="Intel" os="osx" disable="GI"/>
<card contains="Intel" os="linux" version="<11.2" disable="ComputeShader"/>
<card contains="Intel" os="linux" version="<11.2" disable="GeometryShader"/>
@ -27,5 +28,5 @@
<card contains="Radeon" os="linux" version="<14.300" disable="DriverRecentEnough"/>
<card contains="Radeon" os="windows" version="<14.300" disable="DriverRecentEnough"/>
<card contains="ATI" os="windows" version="<14.300" disable="DriverRecentEnough"/>
<card contains="ATI" os="windows" version="<=3.1.8787" disable="ForceLegacyDevice"/>
</graphical-restrictions>

View File

@ -33,5 +33,8 @@
<box proportion="1" width="98%" align="center" layout="vertical-row" padding="6">
<list id="list_addons" x="0" y="0" width="100%" height="100%"/>
</box>
<bright width="97%" id="tips_label" text="" align="center"/>
</div>
</stkgui>

View File

@ -1,15 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<stkgui>
<div x="2%" y="10%" width="96%" height="80%" layout="vertical-row" >
<label id="title" width="100%" text_align="center" word_wrap="true" proportion="1" />
<label id="title" width="100%" text_align="top" word_wrap="true" proportion="1" />
<spacer height="25" width="10" />
<button id="confirm" I18N="In a 'are you sure?' dialog" text="Yes" align="center"/>
<buttonbar id="buttons" height="30%" width="30%" align="center">
<spacer height="15" width="10" />
<icon-button id="confirm" icon="gui/green_check.png" I18N="In a 'are you sure?' dialog"
text="Yes" align="center"/>
<button id="cancel" I18N="In a 'are you sure?' dialog" text="Cancel" align="center"/>
<icon-button id="cancel" icon="gui/remove.png" I18N="In a 'are you sure?' dialog"
text="Cancel" align="center"/>
</buttonbar>
<spacer height="10" width="10" />
</div>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: supertuxkart\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-30 18:52-0400\n"
"POT-Creation-Date: 2016-08-23 20:00-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -437,7 +437,7 @@ msgstr ""
#. I18N: ./data/gui/user_screen_tab.stkgui
#. I18N: In the user screen
#: src/states_screens/dialogs/message_dialog.cpp:123
#: src/states_screens/dialogs/message_dialog.cpp:136
#: src/states_screens/dialogs/message_dialog.cpp:135
msgid "OK"
msgstr ""
@ -825,7 +825,7 @@ msgstr ""
#. I18N: ./data/gui/main_menu.stkgui
#. I18N: In the main screen
#: src/states_screens/race_gui_overworld.cpp:462
#: src/states_screens/race_gui_overworld.cpp:465
msgid "Tutorial"
msgstr ""
@ -996,7 +996,8 @@ msgstr ""
#. I18N: ./data/gui/online/guest_login.stkgui
#. I18N: ./data/gui/user_screen.stkgui
#: src/states_screens/main_menu_screen.cpp:79
#. I18N: Used as a verb, appears on the main menu (login button)
#: src/states_screens/main_menu_screen.cpp:80
msgid "Login"
msgstr ""
@ -1317,7 +1318,7 @@ msgstr ""
#. I18N: Section in the settings menu
#: src/states_screens/options_screen_device.cpp:86
#: src/states_screens/options_screen_input.cpp:140
#: src/states_screens/options_screen_ui.cpp:119
#: src/states_screens/options_screen_ui.cpp:122
#: src/states_screens/options_screen_video.cpp:172
#: src/states_screens/user_screen.cpp:660
msgid "Audio"
@ -1351,7 +1352,7 @@ msgstr ""
#. I18N: ./data/gui/options_input.stkgui
#. I18N: Section in the settings menu
#: src/states_screens/options_screen_audio.cpp:68
#: src/states_screens/options_screen_ui.cpp:121
#: src/states_screens/options_screen_ui.cpp:124
#: src/states_screens/options_screen_video.cpp:175
#: src/states_screens/user_screen.cpp:662
msgid "Controls"
@ -1393,7 +1394,7 @@ msgstr ""
#: src/states_screens/options_screen_audio.cpp:67
#: src/states_screens/options_screen_device.cpp:88
#: src/states_screens/options_screen_input.cpp:142
#: src/states_screens/options_screen_ui.cpp:120
#: src/states_screens/options_screen_ui.cpp:123
#: src/states_screens/options_screen_video.cpp:174
#: src/states_screens/server_selection.cpp:103
msgid "Players"
@ -1405,7 +1406,7 @@ msgstr ""
#. I18N: ./data/gui/options_players.stkgui
#. I18N: In the player configuration screen
msgid "Press enter or double-click on a player to edit him/her"
msgid "Press enter or double-click on a player to edit their settings"
msgstr ""
#. I18N: ./data/gui/options_players.stkgui
@ -1458,7 +1459,7 @@ msgstr ""
#: src/states_screens/options_screen_audio.cpp:65
#: src/states_screens/options_screen_device.cpp:85
#: src/states_screens/options_screen_input.cpp:139
#: src/states_screens/options_screen_ui.cpp:118
#: src/states_screens/options_screen_ui.cpp:121
#: src/states_screens/user_screen.cpp:659
msgid "Graphics"
msgstr ""
@ -1871,46 +1872,47 @@ msgstr ""
msgid "Completed achievement \"%s\"."
msgstr ""
#: src/addons/addons_manager.cpp:97 src/addons/news_manager.cpp:317
#: src/addons/addons_manager.cpp:104 src/addons/news_manager.cpp:325
msgid "Can't access stkaddons server..."
msgstr ""
#: src/addons/news_manager.cpp:174
#: src/addons/news_manager.cpp:182
#, c-format
msgid "Error downloading news: '%s'."
msgstr ""
#. I18N: number of laps to race in a challenge
#: src/challenges/challenge_data.cpp:259
#: src/challenges/challenge_data.cpp:266
#: src/states_screens/race_result_gui.cpp:1422
#, c-format
msgid "Laps : %i"
msgid "Laps: %i"
msgstr ""
#: src/challenges/challenge_data.cpp:265
#: src/challenges/challenge_data.cpp:272
msgid "Follow the leader"
msgstr ""
#: src/challenges/challenge_data.cpp:511
#: src/challenges/challenge_data.cpp:518
#, c-format
msgid "New track '%s' now available"
msgstr ""
#: src/challenges/challenge_data.cpp:516
#: src/challenges/challenge_data.cpp:523
#, c-format
msgid "New game mode '%s' now available"
msgstr ""
#: src/challenges/challenge_data.cpp:526
#: src/challenges/challenge_data.cpp:533
#, c-format
msgid "New Grand Prix '%s' now available"
msgstr ""
#: src/challenges/challenge_data.cpp:530
#: src/challenges/challenge_data.cpp:537
#, c-format
msgid "New difficulty '%s' now available"
msgstr ""
#: src/challenges/challenge_data.cpp:540
#: src/challenges/challenge_data.cpp:547
#, c-format
msgid "New kart '%s' now available"
msgstr ""
@ -1942,17 +1944,17 @@ msgid ""
"created."
msgstr ""
#: src/graphics/irr_driver.cpp:1896
#: src/graphics/irr_driver.cpp:1950
#, c-format
msgid "FPS: %d/%d/%d - PolyCount: %d Solid, %d Shadows - LightDist : %d"
msgstr ""
#: src/graphics/irr_driver.cpp:1907
#: src/graphics/irr_driver.cpp:1961
#, c-format
msgid "FPS: %d/%d/%d - %d KTris"
msgstr ""
#: src/guiengine/engine.cpp:1346
#: src/guiengine/engine.cpp:1289
msgid "Loading"
msgstr ""
@ -2467,11 +2469,11 @@ msgid "Mouse axis %d %s"
msgstr ""
#. I18N: shown when config file is too old
#: src/input/device_manager.cpp:500
#: src/input/device_manager.cpp:501
msgid "Please re-configure your key bindings."
msgstr ""
#: src/input/device_manager.cpp:501
#: src/input/device_manager.cpp:502
msgid "Your input config file is not compatible with this version of STK."
msgstr ""
@ -2586,25 +2588,25 @@ msgstr ""
msgid "Left thumb up"
msgstr ""
#: src/input/input_manager.cpp:776
#: src/input/input_manager.cpp:768
#, c-format
msgid "Ignoring '%s'. You needed to join earlier to play!"
msgstr ""
#: src/input/input_manager.cpp:806
#: src/input/input_manager.cpp:798
msgid "Only the Game Master may act at this point!"
msgstr ""
#: src/input/wiimote_manager.cpp:389
msgid ""
"Connect your wiimote to the Bluetooth manager, then click on Ok.Detailed "
"Connect your wiimote to the Bluetooth manager, then click on Ok. Detailed "
"instructions at supertuxkart.net/Wiimote"
msgstr ""
#: src/input/wiimote_manager.cpp:392
msgid ""
"Press the buttons 1+2 simultaneously on your wiimote to put it in discovery "
"mode, then click on Ok.Detailed instructions at supertuxkart.net/Wiimote"
"mode, then click on Ok. Detailed instructions at supertuxkart.net/Wiimote"
msgstr ""
#: src/input/wiimote_manager.cpp:415
@ -2618,23 +2620,23 @@ msgstr[1] ""
msgid "Could not detect any wiimote :/"
msgstr ""
#: src/karts/controller/local_player_controller.cpp:204
#: src/karts/controller/local_player_controller.cpp:206
msgid "Penalty time!!"
msgstr ""
#: src/karts/controller/local_player_controller.cpp:206
#: src/karts/controller/local_player_controller.cpp:208
msgid "Don't accelerate before go"
msgstr ""
#: src/karts/kart.cpp:867 src/karts/kart.cpp:872
#: src/karts/kart.cpp:852 src/karts/kart.cpp:857
msgid "You won the race!"
msgstr ""
#: src/karts/kart.cpp:872
#: src/karts/kart.cpp:857
msgid "You finished the race!"
msgstr ""
#: src/main.cpp:1296
#: src/main.cpp:1413
msgid ""
"SuperTuxKart may connect to a server to download add-ons and notify you of "
"updates. We also collect anonymous hardware statistics to help with the "
@ -2644,15 +2646,16 @@ msgid ""
"edit \"Connect to the Internet\" and \"Send anonymous HW statistics\")."
msgstr ""
#: src/main.cpp:1446
#: src/main.cpp:1563
msgid ""
"Your driver version is too old. Please install the latest video drivers."
msgstr ""
#: src/main.cpp:1458
#: src/main.cpp:1580
#, c-format
msgid ""
"Your OpenGL version appears to be too old. Please verify if an update for "
"your video driver is available. SuperTuxKart requires OpenGL 3.1 or better."
"your video driver is available. SuperTuxKart requires %s or better."
msgstr ""
#: src/modes/easter_egg_hunt.cpp:202
@ -2660,7 +2663,7 @@ msgstr ""
msgid "Eggs: %d / %d"
msgstr ""
#: src/modes/follow_the_leader.cpp:61 src/modes/follow_the_leader.cpp:293
#: src/modes/follow_the_leader.cpp:61 src/modes/follow_the_leader.cpp:284
msgid "Leader"
msgstr ""
@ -2687,11 +2690,11 @@ msgstr ""
msgid "WRONG WAY!"
msgstr ""
#: src/modes/world.cpp:1208
#: src/modes/world.cpp:1207
msgid "You have been eliminated!"
msgstr ""
#: src/modes/world.cpp:1211
#: src/modes/world.cpp:1210
#, c-format
msgid "'%s' has been eliminated."
msgstr ""
@ -2700,7 +2703,7 @@ msgstr ""
msgid "Failed to register server"
msgstr ""
#: src/network/servers_manager.cpp:195
#: src/network/servers_manager.cpp:197
msgid "No LAN server detected"
msgstr ""
@ -2815,27 +2818,33 @@ msgstr ""
msgid "2 years"
msgstr ""
#: src/states_screens/addons_screen.cpp:110
#: src/states_screens/addons_screen.cpp:115
msgid "Add-on name"
msgstr ""
#: src/states_screens/addons_screen.cpp:111
#: src/states_screens/addons_screen.cpp:116
msgid "Updated date"
msgstr ""
#: src/states_screens/addons_screen.cpp:147
msgid ""
"Access to the Internet is disabled. (To enable it, go to options and select "
"tab 'User Interface')"
msgstr ""
#. I18N: as in: The Old Island by Johannes Sjolund
#: src/states_screens/addons_screen.cpp:304
#: src/states_screens/addons_screen.cpp:343
#, c-format
msgctxt "addons"
msgid "%s by %s"
msgstr ""
#: src/states_screens/addons_screen.cpp:435
#: src/states_screens/addons_screen.cpp:474
msgid "Please wait while addons are updated"
msgstr ""
#: src/states_screens/addons_screen.cpp:512
#: src/states_screens/main_menu_screen.cpp:553
#: src/states_screens/addons_screen.cpp:551
#: src/states_screens/main_menu_screen.cpp:554
msgid ""
"Sorry, an error occurred while contacting the add-ons website. Make sure you "
"are connected to the Internet and that SuperTuxKart is not blocked by a "
@ -3210,32 +3219,32 @@ msgstr ""
msgid "Select a track"
msgstr ""
#: src/states_screens/feature_unlocked.cpp:199
#: src/states_screens/feature_unlocked.cpp:200
#, c-format
msgid "You completed the easy challenge! Points earned on this level: %i/%i"
msgstr ""
#: src/states_screens/feature_unlocked.cpp:203
#: src/states_screens/feature_unlocked.cpp:204
#, c-format
msgid ""
"You completed the intermediate challenge! Points earned on this level: %i/%i"
msgstr ""
#: src/states_screens/feature_unlocked.cpp:207
#: src/states_screens/feature_unlocked.cpp:208
#, c-format
msgid ""
"You completed the difficult challenge! Points earned on this level: %i/%i"
msgstr ""
#: src/states_screens/feature_unlocked.cpp:492
#: src/states_screens/feature_unlocked.cpp:493
msgid "Challenge Completed"
msgstr ""
#: src/states_screens/feature_unlocked.cpp:529
#: src/states_screens/feature_unlocked.cpp:530
msgid "You unlocked track %0"
msgstr ""
#: src/states_screens/feature_unlocked.cpp:567
#: src/states_screens/feature_unlocked.cpp:568
msgid "You unlocked grand prix %0"
msgstr ""
@ -3271,16 +3280,16 @@ msgid "User defined"
msgstr ""
#. I18N: when failing a GP
#: src/states_screens/grand_prix_lose.cpp:153
#: src/states_screens/grand_prix_lose.cpp:154
msgid "Better luck next time!"
msgstr ""
#: src/states_screens/grand_prix_win.cpp:126
#: src/states_screens/grand_prix_win.cpp:127
#: src/states_screens/race_result_gui.cpp:194
msgid "You completed a challenge!"
msgstr ""
#: src/states_screens/grand_prix_win.cpp:283
#: src/states_screens/grand_prix_win.cpp:284
msgid "You completed the Grand Prix!"
msgstr ""
@ -3299,25 +3308,25 @@ msgid ""
"Press the 'Select' button to join the game"
msgstr ""
#: src/states_screens/main_menu_screen.cpp:492
#: src/states_screens/main_menu_screen.cpp:493
msgid ""
"You can not play online without internet access. If you want to play online, "
"go to options, select tab 'User Interface', and edit \"Connect to the "
"Internet\"."
msgstr ""
#: src/states_screens/main_menu_screen.cpp:516
#: src/states_screens/main_menu_screen.cpp:517
msgid ""
"You can not download addons without internet access. If you want to download "
"addons, go to options, select tab 'User Interface', and edit \"Connect to "
"the Internet\"."
msgstr ""
#: src/states_screens/main_menu_screen.cpp:548
#: src/states_screens/main_menu_screen.cpp:549
msgid "The add-ons module is currently disabled in the Options screen"
msgstr ""
#: src/states_screens/main_menu_screen.cpp:560
#: src/states_screens/main_menu_screen.cpp:561
msgid "Please wait while the add-ons are loading"
msgstr ""
@ -3505,14 +3514,14 @@ msgstr ""
msgid "Keyboard %i"
msgstr ""
#: src/states_screens/options_screen_ui.cpp:155
#: src/states_screens/options_screen_ui.cpp:158
msgid ""
"In multiplayer mode, players can select handicapped (more difficult) "
"profiles on the kart selection screen"
msgstr ""
#. I18N: in the language choice, to select the same language as the OS
#: src/states_screens/options_screen_ui.cpp:187
#: src/states_screens/options_screen_ui.cpp:190
msgid "System Language"
msgstr ""
@ -3642,20 +3651,20 @@ msgid "GOAL!"
msgstr ""
#. I18N: string used to show the author of the music. (e.g. "Sunny Song" by "John Doe")
#: src/states_screens/race_gui_base.cpp:504
#: src/states_screens/race_gui_base.cpp:496
msgid "by"
msgstr ""
#: src/states_screens/race_gui_base.cpp:612
#: src/states_screens/race_gui_base.cpp:604
msgid "Collect nitro!"
msgstr ""
#: src/states_screens/race_gui_base.cpp:614
#: src/states_screens/race_gui_base.cpp:606
msgid "Follow the leader!"
msgstr ""
#. I18N: When some GlobalPlayerIcons are hidden, write "Top 10" to show it
#: src/states_screens/race_gui_base.cpp:780
#: src/states_screens/race_gui_base.cpp:772
#, c-format
msgid "Top %i"
msgstr ""
@ -3669,15 +3678,15 @@ msgstr ""
msgid "Rank"
msgstr ""
#: src/states_screens/race_gui_overworld.cpp:469
#: src/states_screens/race_gui_overworld.cpp:472
msgid "Press fire to play the tutorial"
msgstr ""
#: src/states_screens/race_gui_overworld.cpp:508
#: src/states_screens/race_gui_overworld.cpp:511
msgid "Type: Grand Prix"
msgstr ""
#: src/states_screens/race_gui_overworld.cpp:539
#: src/states_screens/race_gui_overworld.cpp:548
msgid "Press fire to start the challenge"
msgstr ""
@ -3745,10 +3754,20 @@ msgstr ""
msgid "Grand Prix progress:"
msgstr ""
#: src/states_screens/race_result_gui.cpp:1341
#: src/states_screens/race_result_gui.cpp:1344
msgid "Highscores"
msgstr ""
#: src/states_screens/race_result_gui.cpp:1430
#, c-format
msgid "Difficulty: %s"
msgstr ""
#: src/states_screens/race_result_gui.cpp:1438
#, c-format
msgid "Best lap time: %s"
msgstr ""
#: src/states_screens/race_setup_screen.cpp:87
msgid "All blows allowed, so catch weapons and make clever use of them!"
msgstr ""
@ -3767,7 +3786,7 @@ msgid "Hit others with weapons until they lose all their lives."
msgstr ""
#: src/states_screens/race_setup_screen.cpp:119
msgid "Push the ball to the opposite cage to score goals."
msgid "Push the ball into the opposite cage to score goals."
msgstr ""
#: src/states_screens/race_setup_screen.cpp:129

View File

@ -123,13 +123,6 @@ namespace video
EGL_NONE, 0
#endif
};
EGLint contextAttrib[] =
{
#ifdef EGL_VERSION_1_3
EGL_CONTEXT_CLIENT_VERSION, 2,
#endif
EGL_NONE, 0
};
EGLConfig config;
EGLint num_configs;
@ -242,11 +235,41 @@ namespace video
eglBindAPI(EGL_OPENGL_ES_API);
#endif
os::Printer::log("Creating EglContext...");
EglContext = eglCreateContext(EglDisplay, config, EGL_NO_CONTEXT, contextAttrib);
EglContext = EGL_NO_CONTEXT;
if (!Params.ForceLegacyDevice)
{
os::Printer::log("Trying to create Context for OpenGL-ES3.");
EGLint contextAttrib[] =
{
#ifdef EGL_VERSION_1_3
EGL_CONTEXT_CLIENT_VERSION, 3,
#endif
EGL_NONE, 0
};
EglContext = eglCreateContext(EglDisplay, config, EGL_NO_CONTEXT, contextAttrib);
}
if (EGL_NO_CONTEXT == EglContext)
{
os::Printer::log("FAILED\n");
os::Printer::log("Could not create Context for OpenGL-ES2 display.");
os::Printer::log("Trying to create Context for OpenGL-ES2.");
EGLint contextAttrib[] =
{
#ifdef EGL_VERSION_1_3
EGL_CONTEXT_CLIENT_VERSION, 2,
#endif
EGL_NONE, 0
};
EglContext = eglCreateContext(EglDisplay, config, EGL_NO_CONTEXT, contextAttrib);
if (EGL_NO_CONTEXT == EglContext)
{
os::Printer::log("FAILED\n");
os::Printer::log("Could not create Context for OpenGL-ES2 display.");
}
}
eglMakeCurrent(EglDisplay, EglSurface, EglSurface, EglContext);

View File

@ -678,7 +678,7 @@ namespace UserConfigParams
"Enable Screen Space Ambient Occlusion") );
PARAM_PREFIX IntUserConfigParam m_shadows_resolution
PARAM_DEFAULT( IntUserConfigParam(0,
"shadows_resoltion", &m_graphics_quality,
"shadows_resolution", &m_graphics_quality,
"Shadow resolution (0 = disabled") );
PARAM_PREFIX BoolUserConfigParam m_degraded_IBL
PARAM_DEFAULT(BoolUserConfigParam(true,

View File

@ -63,6 +63,7 @@ namespace GraphicsRestrictions
"FramebufferSRGBWorking",
"FramebufferSRGBCapable",
"GI",
"ForceLegacyDevice"
};
} // namespace Private
using namespace Private;

View File

@ -57,6 +57,7 @@ namespace GraphicsRestrictions
GR_FRAMEBUFFER_SRGB_WORKING,
GR_FRAMEBUFFER_SRGB_CAPABLE,
GR_GI,
GR_FORCE_LEGACY_DEVICE,
GR_COUNT /** MUST be last entry. */
} ;

View File

@ -528,20 +528,40 @@ void IrrDriver::initDevice()
}
CVS->init();
bool recreate_device = false;
// Some drivers are able to create OpenGL 3.1 context, but shader-based
// pipeline doesn't work for them. For example some radeon drivers
// support only GLSL 1.3 and it causes STK to crash. We should force to use
// fixed pipeline in this case.
if (GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_FORCE_LEGACY_DEVICE))
{
Log::warn("irr_driver", "Driver doesn't support shader-based pipeline. "
"Re-creating device to workaround the issue.");
params.ForceLegacyDevice = true;
recreate_device = true;
}
// This is the ugly hack for intel driver on linux, which doesn't
// use sRGB-capable visual, even if we request it. This causes
// the screen to be darker than expected. It affects mesa 10.6 and newer.
// Though we are able to force to use the proper format on mesa side by
// setting WithAlphaChannel parameter.
if (!ProfileWorld::isNoGraphics() && CVS->needsSRGBCapableVisualWorkaround())
else if (CVS->needsSRGBCapableVisualWorkaround())
{
Log::warn("irr_driver", "Created visual is not sRGB-capable. "
"Re-creating device to workaround the issue.");
m_device->closeDevice();
m_device->drop();
params.WithAlphaChannel = true;
recreate_device = true;
}
if (!ProfileWorld::isNoGraphics() && recreate_device)
{
m_device->closeDevice();
m_device->drop();
m_device = createDeviceEx(params);
@ -549,6 +569,8 @@ void IrrDriver::initDevice()
{
Log::fatal("irr_driver", "Couldn't initialise irrlicht device. Quitting.\n");
}
CVS->init();
}
m_scene_manager = m_device->getSceneManager();

View File

@ -143,6 +143,7 @@ Material::Material(const XMLNode *node, bool deprecated)
node->get("disable-z-write", &m_disable_z_write );
node->get("colorizable", &m_colorizable );
node->get("colorization-factor", &m_colorization_factor);
node->get("hue-settings", &m_hue_settings );
node->get("fog", &m_fog );
node->get("mask", &m_mask );

View File

@ -21,6 +21,7 @@
#define HEADER_MATERIAL_HPP
#include "utils/no_copy.hpp"
#include "utils/random_generator.hpp"
#include <assert.h>
#include <map>
@ -181,6 +182,12 @@ private:
/** Minimum resulting saturation when colorized (from 0 to 1) */
float m_colorization_factor;
/** List of hue pre-defined for colorization (from 0 to 1) */
std::vector<float> m_hue_settings;
/** Random generator for getting pre-defined hue */
RandomGenerator m_random_hue;
/** Some textures need to be pre-multiplied, some divided to give
* the intended effect. */
//enum {ADJ_NONE, ADJ_PREMUL, ADJ_DIV}
@ -291,7 +298,7 @@ public:
* is driving on it. */
bool isDriveReset () const { return m_drive_reset; }
// ------------------------------------------------------------------------
/** Returns if this material can be colorized (like red/blue in team game).
/** Returns if this material can be colorized.
*/
bool isColorizable () const { return m_colorizable; }
// ------------------------------------------------------------------------
@ -299,6 +306,17 @@ public:
*/
float getColorizationFactor () const { return m_colorization_factor; }
// ------------------------------------------------------------------------
/** Returns a random hue when colorized.
*/
float getRandomHue()
{
if (m_hue_settings.empty())
return 0.0f;
const unsigned int hue = m_random_hue.get(m_hue_settings.size());
assert(hue < m_hue_settings.size());
return m_hue_settings[hue];
}
// ------------------------------------------------------------------------
/** Returns if this material should trigger a rescue if a kart
* crashes against it. */
CollisionReaction getCollisionReaction() const { return m_collision_reaction; }

View File

@ -26,6 +26,19 @@
// ----------------------------------------------------------------------------
RenderInfo::RenderInfo(float hue, bool transparent)
{
m_hue = hue;
m_static_hue = hue;
m_transparent = transparent;
} // RenderInfo
// ----------------------------------------------------------------------------
void RenderInfo::setDynamicHue(irr::scene::IMesh* mesh)
{
unsigned int n = mesh->getMeshBufferCount();
for (unsigned int i = 0; i < n; i++)
{
scene::IMeshBuffer *mb = mesh->getMeshBuffer(i);
Material* m = material_manager->getMaterialFor(mb
->getMaterial().getTexture(0), mb);
m_dynamic_hue.push_back(m->getRandomHue());
}
} // setDynamicHue

View File

@ -20,31 +20,36 @@
#define HEADER_RENDER_INFO_HPP
#include "utils/leak_check.hpp"
#include "utils/no_copy.hpp"
#include <assert.h>
#include <vector>
namespace irr
{
namespace scene { class IMesh; }
}
enum KartRenderType: unsigned int
{
KRT_DEFAULT,
KRT_RED,
KRT_BLUE,
KRT_TRANSPARENT,
};
/**
* \ingroup graphics
*/
class RenderInfo
class RenderInfo : public NoCopy
{
public:
enum KartRenderType
{
KRT_DEFAULT,
KRT_RED,
KRT_BLUE,
KRT_TRANSPARENT,
};
private:
float m_hue;
float m_static_hue;
bool m_transparent;
std::vector<float> m_dynamic_hue;
public:
LEAK_CHECK();
// ------------------------------------------------------------------------
@ -52,23 +57,34 @@ public:
// ------------------------------------------------------------------------
~RenderInfo() {}
// ------------------------------------------------------------------------
void setHue(float hue) { m_hue = hue; }
void setHue(float hue) { m_static_hue = hue; }
// ------------------------------------------------------------------------
void setTransparent(bool transparent) { m_transparent = transparent; }
// ------------------------------------------------------------------------
float getHue() const { return m_hue; }
float getHue() const { return m_static_hue; }
// ------------------------------------------------------------------------
bool isTransparent() const { return m_transparent; }
// ------------------------------------------------------------------------
void setKartModelRenderInfo(KartRenderType krt)
{
setHue(krt == RenderInfo::KRT_BLUE ? 0.66f :
krt == RenderInfo::KRT_RED ? 1.0f : 0.0f);
setTransparent(krt == RenderInfo::KRT_TRANSPARENT ? true : false);
setHue(krt == KRT_BLUE ? 0.66f : krt == KRT_RED ? 1.0f : 0.0f);
setTransparent(krt == KRT_TRANSPARENT ? true : false);
}
// ------------------------------------------------------------------------
void setRenderInfo(const RenderInfo* other) { *this = *other; }
/** Returns true if this render info is static. ie affect all material
* using the same hue. (like the kart colorization in soccer game)
*/
bool isStatic() const { return m_dynamic_hue.empty(); }
// ------------------------------------------------------------------------
unsigned int getNumberOfHue() const { return m_dynamic_hue.size(); }
// ------------------------------------------------------------------------
float getDynamicHue(unsigned int hue) const
{
assert(hue < m_dynamic_hue.size());
return m_dynamic_hue[hue];
}
// ------------------------------------------------------------------------
void setDynamicHue(irr::scene::IMesh* mesh);
}; // RenderInfo

View File

@ -244,7 +244,7 @@ RTT::RTT(size_t width, size_t height)
somevector.clear();
somevector.push_back(RSM_Color);
somevector.push_back(RSM_Normal);
m_RSM = new FrameBuffer(somevector, RSM_Depth, 1024, 1024, true);
m_RSM = new FrameBuffer(somevector, RSM_Depth, shadowsize0.Width, shadowsize0.Height, true);
RH_Red = generateRTT3D(GL_TEXTURE_3D, 32, 16, 32, GL_RGBA16F, GL_RGBA, GL_FLOAT);
RH_Green = generateRTT3D(GL_TEXTURE_3D, 32, 16, 32, GL_RGBA16F, GL_RGBA, GL_FLOAT);

View File

@ -100,22 +100,44 @@ void STKAnimatedMesh::updateNoGL()
if (!isMaterialInitialized)
{
video::IVideoDriver* driver = SceneManager->getVideoDriver();
for (u32 i = 0; i < m->getMeshBufferCount(); ++i)
const u32 mb_count = m->getMeshBufferCount();
for (u32 i = 0; i < mb_count; ++i)
{
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
bool affected = false;
if (!m_all_parts_colorized && mb && m_mesh_render_info)
RenderInfo* cur_ri = m_mesh_render_info;
if (!m_all_parts_colorized && mb && cur_ri)
{
// Test if material is affected by hue change
Material* m = material_manager->getMaterialFor(mb
->getMaterial().getTexture(0), mb);
if (m->isColorizable())
affected = true;
if (m_mesh_render_info && !m_mesh_render_info->isStatic())
{
// Convert to static render info for each mesh buffer
assert(m_mesh_render_info->getNumberOfHue() == mb_count);
const float hue = m_mesh_render_info->getDynamicHue(i);
if (hue > 0.0f)
{
cur_ri = new RenderInfo(hue);
m_static_render_info.push_back(cur_ri);
affected = true;
}
else
{
cur_ri = NULL;
}
}
else
{
// Test if material is affected by static hue change
Material* m = material_manager->getMaterialFor(mb
->getMaterial().getTexture(0), mb);
if (m->isColorizable())
affected = true;
}
}
assert(cur_ri ? cur_ri->isStatic() : true);
GLmeshes.push_back(allocateMeshBuffer(mb, m_debug_name,
affected || m_all_parts_colorized || (m_mesh_render_info
&& m_mesh_render_info->isTransparent()) ? m_mesh_render_info : NULL));
affected || m_all_parts_colorized || (cur_ri
&& cur_ri->isTransparent()) ? cur_ri : NULL));
}
for (u32 i = 0; i < m->getMeshBufferCount(); ++i)

View File

@ -32,6 +32,7 @@ class STKAnimatedMesh : public irr::scene::CAnimatedMeshSceneNode, public STKMes
protected:
bool isMaterialInitialized;
bool isGLInitialized;
PtrVector<RenderInfo> m_static_render_info;
std::vector<GLMesh> GLmeshes;
core::matrix4 ModelViewProjectionMatrix;
void cleanGLMeshes();

View File

@ -77,22 +77,44 @@ void STKMeshSceneNode::setReloadEachFrame(bool val)
void STKMeshSceneNode::createGLMeshes(RenderInfo* render_info, bool all_parts_colorized)
{
for (u32 i = 0; i<Mesh->getMeshBufferCount(); ++i)
const u32 mb_count = Mesh->getMeshBufferCount();
for (u32 i = 0; i < mb_count; ++i)
{
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
bool affected = false;
RenderInfo* cur_ri = render_info;
if (!all_parts_colorized && mb && render_info)
{
// Test if material is affected by hue change
Material* m = material_manager->getMaterialFor(mb
->getMaterial().getTexture(0), mb);
if (m->isColorizable())
affected = true;
if (render_info && !render_info->isStatic())
{
// Convert to static render info for each mesh buffer
assert(render_info->getNumberOfHue() == mb_count);
const float hue = render_info->getDynamicHue(i);
if (hue > 0.0f)
{
cur_ri = new RenderInfo(hue);
m_static_render_info.push_back(cur_ri);
affected = true;
}
else
{
cur_ri = NULL;
}
}
else
{
// Test if material is affected by static hue change
Material* m = material_manager->getMaterialFor(mb
->getMaterial().getTexture(0), mb);
if (m->isColorizable())
affected = true;
}
}
assert(cur_ri ? cur_ri->isStatic() : true);
GLmeshes.push_back(allocateMeshBuffer(mb, m_debug_name,
affected || all_parts_colorized || (render_info &&
render_info->isTransparent()) ? render_info : NULL));
affected || all_parts_colorized || (cur_ri &&
cur_ri->isTransparent()) ? cur_ri : NULL));
}
isMaterialInitialized = false;
isGLInitialized = false;

View File

@ -28,6 +28,7 @@ class RenderInfo;
class STKMeshSceneNode : public irr::scene::CMeshSceneNode, public STKMeshCommon
{
protected:
PtrVector<RenderInfo> m_static_render_info;
std::vector<GLMesh> GLmeshes;
core::matrix4 ModelViewProjectionMatrix;
core::vector3df windDir;

View File

@ -654,10 +654,13 @@ PROFILER_POP_CPU_MARKER();
PROFILER_PUSH_CPU_MARKER("- Sync Stall", 0xFF, 0x0, 0x0);
GLenum reason = glClientWaitSync(m_sync, GL_SYNC_FLUSH_COMMANDS_BIT, 0);
while (reason != GL_ALREADY_SIGNALED)
if (reason != GL_ALREADY_SIGNALED)
{
if (reason == GL_WAIT_FAILED) break;
reason = glClientWaitSync(m_sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000);
do
{
reason = glClientWaitSync(m_sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000);
}
while (reason == GL_TIMEOUT_EXPIRED);
}
glDeleteSync(m_sync);
PROFILER_POP_CPU_MARKER();

View File

@ -17,6 +17,7 @@
#include "config/user_config.hpp"
#include "graphics/central_settings.hpp"
#include "graphics/render_info.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/widgets/model_view_widget.hpp"
#include "graphics/irr_driver.hpp"
@ -48,6 +49,7 @@ IconButtonWidget(IconButtonWidget::SCALE_MODE_KEEP_TEXTURE_ASPECT_RATIO, false,
m_rtt_provider = NULL;
m_old_rtt_provider = NULL;
m_rotation_mode = ROTATE_OFF;
m_render_info = new RenderInfo();
// so that the base class doesn't complain there is no icon defined
m_properties[PROP_ICON]="gui/main_help.png";
@ -65,6 +67,8 @@ ModelViewWidget::~ModelViewWidget()
delete m_old_rtt_provider;
m_old_rtt_provider = NULL;
m_texture = NULL;
delete m_render_info;
}
// -----------------------------------------------------------------------------
void ModelViewWidget::add()
@ -228,7 +232,7 @@ void ModelViewWidget::setupRTTScene()
if (m_model_frames[0] == -1)
{
scene::ISceneNode* node = irr_driver->addMesh(m_models.get(0), "rtt_mesh",
NULL, &m_render_info, m_model_render_info_affected[0]);
NULL, m_render_info, m_model_render_info_affected[0]);
node->setPosition(m_model_location[0].toIrrVector());
node->setScale(m_model_scale[0].toIrrVector());
node->setMaterialFlag(video::EMF_FOG_ENABLE, false);
@ -238,7 +242,7 @@ void ModelViewWidget::setupRTTScene()
{
scene::IAnimatedMeshSceneNode* node =
irr_driver->addAnimatedMesh((scene::IAnimatedMesh*)m_models.get(0), "rtt_mesh",
NULL, &m_render_info, m_model_render_info_affected[0]);
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);
@ -260,7 +264,7 @@ void ModelViewWidget::setupRTTScene()
{
scene::ISceneNode* node =
irr_driver->addMesh(m_models.get(n), "rtt_node", m_rtt_main_node,
&m_render_info, m_model_render_info_affected[n]);
m_render_info, m_model_render_info_affected[n]);
node->setPosition(m_model_location[n].toIrrVector());
node->updateAbsolutePosition();
node->setScale(m_model_scale[n].toIrrVector());
@ -269,7 +273,7 @@ void ModelViewWidget::setupRTTScene()
{
scene::IAnimatedMeshSceneNode* node =
irr_driver->addAnimatedMesh((scene::IAnimatedMesh*)m_models.get(n),
"modelviewrtt", m_rtt_main_node, &m_render_info,
"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]);

View File

@ -23,12 +23,13 @@
#include <IMesh.h>
#include "graphics/irr_driver.hpp"
#include "graphics/render_info.hpp"
#include "guiengine/widgets/icon_button_widget.hpp"
#include "utils/aligned_array.hpp"
#include "utils/leak_check.hpp"
#include "utils/ptr_vector.hpp"
class RenderInfo;
namespace GUIEngine
{
/** \brief A model view widget.
@ -68,7 +69,7 @@ namespace GUIEngine
FrameBuffer *m_frame_buffer;
video::ITexture *m_texture;
RenderInfo m_render_info;
RenderInfo *m_render_info;
public:
@ -107,7 +108,7 @@ namespace GUIEngine
FrameBuffer* getFrameBuffer() { return m_frame_buffer; }
video::ITexture* getTexture() { return m_texture; }
RenderInfo& getModelViewRenderInfo() { return m_render_info; }
RenderInfo* getModelViewRenderInfo() { return m_render_info; }
};
}

View File

@ -19,6 +19,7 @@
#include "karts/abstract_kart.hpp"
#include "graphics/render_info.hpp"
#include "items/powerup.hpp"
#include "karts/abstract_kart_animation.hpp"
#include "karts/kart_properties.hpp"
@ -34,8 +35,7 @@
AbstractKart::AbstractKart(const std::string& ident,
int world_kart_id, int position,
const btTransform& init_transform,
PerPlayerDifficulty difficulty,
RenderInfo::KartRenderType krt)
PerPlayerDifficulty difficulty, KartRenderType krt)
: Moveable()
{
m_world_kart_id = world_kart_id;

View File

@ -22,7 +22,6 @@
#include <memory>
#include "items/powerup_manager.hpp"
#include "graphics/render_info.hpp"
#include "karts/moveable.hpp"
#include "karts/controller/kart_control.hpp"
#include "race/race_manager.hpp"
@ -50,6 +49,8 @@ class Skidding;
class SlipStream;
class TerrainInfo;
enum KartRenderType: unsigned int;
/** An abstract interface for the actual karts. Some functions are actually
* implemented here in order to allow inlining.
* \ingroup karts
@ -100,7 +101,7 @@ public:
int world_kart_id,
int position, const btTransform& init_transform,
PerPlayerDifficulty difficulty,
RenderInfo::KartRenderType krt);
KartRenderType krt);
virtual ~AbstractKart();
virtual core::stringw getName() const;
virtual void reset();

View File

@ -20,6 +20,7 @@
#include "karts/controller/ghost_controller.hpp"
#include "karts/kart_gfx.hpp"
#include "karts/kart_model.hpp"
#include "graphics/render_info.hpp"
#include "modes/world.hpp"
#include "LinearMath/btQuaternion.h"
@ -28,7 +29,7 @@ GhostKart::GhostKart(const std::string& ident, unsigned int world_kart_id,
int position)
: Kart(ident, world_kart_id,
position, btTransform(btQuaternion(0, 0, 0, 1)),
PLAYER_DIFFICULTY_NORMAL, RenderInfo::KRT_TRANSPARENT)
PLAYER_DIFFICULTY_NORMAL, KRT_TRANSPARENT)
{
} // GhostKart

View File

@ -33,6 +33,7 @@
#include "graphics/particle_emitter.hpp"
#include "graphics/particle_kind.hpp"
#include "graphics/particle_kind_manager.hpp"
#include "graphics/render_info.hpp"
#include "graphics/shadow.hpp"
#include "graphics/skid_marks.hpp"
#include "graphics/slip_stream.hpp"
@ -91,8 +92,7 @@
*/
Kart::Kart (const std::string& ident, unsigned int world_kart_id,
int position, const btTransform& init_transform,
PerPlayerDifficulty difficulty,
RenderInfo::KartRenderType krt)
PerPlayerDifficulty difficulty, KartRenderType krt)
: AbstractKart(ident, world_kart_id, position, init_transform,
difficulty, krt)

View File

@ -52,6 +52,8 @@ class SlipStream;
class Stars;
class TerrainInfo;
enum KartRenderType: unsigned int;
/** The main kart class. All type of karts are of this object, but with
* different controllers. The controllers are what turn a kart into a
* player kart (i.e. the controller handle input), or an AI kart (the
@ -232,7 +234,7 @@ public:
Kart(const std::string& ident, unsigned int world_kart_id,
int position, const btTransform& init_transform,
PerPlayerDifficulty difficulty,
RenderInfo::KartRenderType krt = RenderInfo::KRT_DEFAULT);
KartRenderType krt);
virtual ~Kart();
virtual void init(RaceManager::KartType type);
virtual void kartIsInRestNow();

View File

@ -30,6 +30,7 @@
#include "graphics/material.hpp"
#include "graphics/material_manager.hpp"
#include "graphics/mesh_tools.hpp"
#include "graphics/render_info.hpp"
#include "io/file_manager.hpp"
#include "io/xml_node.hpp"
#include "karts/abstract_kart.hpp"
@ -116,6 +117,7 @@ KartModel::KartModel(bool is_master)
m_hat_name = "";
m_hat_node = NULL;
m_hat_offset = core::vector3df(0,0,0);
m_render_info = NULL;
for(unsigned int i=0; i<4; i++)
{
@ -141,7 +143,7 @@ KartModel::KartModel(bool is_master)
m_animation_speed = 25;
m_current_animation = AF_DEFAULT;
m_play_non_loop = false;
m_krt = RenderInfo::KRT_DEFAULT;
m_krt = KRT_DEFAULT;
m_support_colorization = false;
} // KartModel
@ -246,7 +248,7 @@ KartModel::~KartModel()
assert(!m_is_master);
// Drop the cloned transparent model if created
if (m_krt == RenderInfo::KRT_TRANSPARENT)
if (m_krt == KRT_TRANSPARENT)
{
m_speed_weighted_objects[i].m_model->drop();
}
@ -275,6 +277,8 @@ KartModel::~KartModel()
}
}
}
delete m_render_info;
#ifdef DEBUG
#if SKELETON_DEBUG
irr_driver->clearDebugMeshes();
@ -289,12 +293,13 @@ KartModel::~KartModel()
* It is also marked not to be a master copy, so attachModel can be called
* for this instance.
*/
KartModel* KartModel::makeCopy(RenderInfo::KartRenderType krt)
KartModel* KartModel::makeCopy(KartRenderType krt)
{
// Make sure that we are copying from a master objects, and
// that there is indeed no animated node defined here ...
// just in case.
assert(m_is_master);
assert(m_render_info == NULL);
assert(!m_animated_node);
KartModel *km = new KartModel(/*is master*/ false);
km->m_kart_width = m_kart_width;
@ -311,6 +316,8 @@ KartModel* KartModel::makeCopy(RenderInfo::KartRenderType krt)
km->m_hat_name = m_hat_name;
km->m_krt = krt;
km->m_support_colorization = m_support_colorization;
km->m_render_info = new RenderInfo();
km->m_render_info->setKartModelRenderInfo(krt);
km->m_nitro_emitter_position[0] = m_nitro_emitter_position[0];
km->m_nitro_emitter_position[1] = m_nitro_emitter_position[1];
@ -335,7 +342,7 @@ KartModel* KartModel::makeCopy(RenderInfo::KartRenderType krt)
// Master should not have any speed weighted nodes.
assert(!m_speed_weighted_objects[i].m_node);
km->m_speed_weighted_objects[i] = m_speed_weighted_objects[i];
if (krt == RenderInfo::KRT_TRANSPARENT)
if (krt == KRT_TRANSPARENT)
{
// Only clone the mesh if transparent type is used, see #2445
km->m_speed_weighted_objects[i].m_model = irr_driver
@ -359,7 +366,6 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool always_anim
assert(!m_is_master);
scene::ISceneNode* node = NULL;
m_render_info.setKartModelRenderInfo(m_krt);
if (animated_models)
{
@ -1031,3 +1037,10 @@ void KartModel::attachHat()
} // if bone
} // if(m_hat_name)
} // attachHat
//-----------------------------------------------------------------------------
RenderInfo* KartModel::getRenderInfo()
{
return m_support_colorization || m_krt == KRT_TRANSPARENT ?
m_render_info : NULL;
} // getRenderInfo

View File

@ -30,14 +30,16 @@ namespace irr
}
using namespace irr;
#include "graphics/render_info.hpp"
#include "utils/no_copy.hpp"
#include "utils/vec3.hpp"
class AbstractKart;
class KartProperties;
class RenderInfo;
class XMLNode;
enum KartRenderType: unsigned int;
/** A speed-weighted object is an object whose characteristics are influenced by the kart's speed */
struct SpeedWeightedObject
{
@ -231,16 +233,16 @@ private:
/** Pointer to the kart object belonging to this kart model. */
AbstractKart* m_kart;
RenderInfo::KartRenderType m_krt;
KartRenderType m_krt;
RenderInfo m_render_info;
RenderInfo* m_render_info;
bool m_support_colorization;
public:
KartModel(bool is_master);
~KartModel();
KartModel* makeCopy(RenderInfo::KartRenderType krt);
KartModel* makeCopy(KartRenderType krt);
void reset();
void loadInfo(const XMLNode &node);
bool loadModels(const KartProperties &kart_properties);
@ -338,17 +340,7 @@ public:
// ------------------------------------------------------------------------
core::vector3df getHatOffset() { return m_hat_offset; }
// ------------------------------------------------------------------------
RenderInfo* getRenderInfo()
{
return m_support_colorization || m_krt == RenderInfo::KRT_TRANSPARENT ?
&m_render_info : NULL;
}
// ------------------------------------------------------------------------
const RenderInfo* getRenderInfo() const
{
return m_support_colorization || m_krt == RenderInfo::KRT_TRANSPARENT ?
&m_render_info : NULL;
}
RenderInfo* getRenderInfo();
// ------------------------------------------------------------------------
bool supportColorization() const { return m_support_colorization; }

View File

@ -45,6 +45,8 @@ class CombinedCharacteristic;
class Material;
class XMLNode;
enum KartRenderType: unsigned int;
/**
* \brief This class stores the properties of a kart.
* This includes size, name, identifier, physical properties etc.
@ -242,9 +244,11 @@ public:
video::ITexture *getMinimapIcon () const {return m_minimap_icon; }
// ------------------------------------------------------------------------
/** Returns a pointer to the KartModel object. */
KartModel* getKartModelCopy
(RenderInfo::KartRenderType krt = RenderInfo::KRT_DEFAULT) const
/** Returns a pointer to the KartModel object.
* \param krt The KartRenderType, like default, red, blue or transparent.
* see the RenderInfo include for details
*/
KartModel* getKartModelCopy(KartRenderType krt) const
{return m_kart_model->makeCopy(krt); }
// ------------------------------------------------------------------------

View File

@ -18,6 +18,7 @@
#include "karts/kart_with_stats.hpp"
#include "graphics/render_info.hpp"
#include "karts/explosion_animation.hpp"
#include "karts/rescue_animation.hpp"
#include "items/item.hpp"
@ -28,7 +29,7 @@ KartWithStats::KartWithStats(const std::string& ident,
int position, const btTransform& init_transform,
PerPlayerDifficulty difficulty)
: Kart(ident, world_kart_id, position,
init_transform, difficulty)
init_transform, difficulty, KRT_DEFAULT)
{
} // KartWithStats

View File

@ -396,8 +396,7 @@ AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
m_kart_position_map[index] = (unsigned)(pos_index - 1);
AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
difficulty, team == SOCCER_TEAM_BLUE ?
RenderInfo::KRT_BLUE : RenderInfo::KRT_RED);
difficulty, team == SOCCER_TEAM_BLUE ? KRT_BLUE : KRT_RED);
new_kart->init(race_manager->getKartType(index));
Controller *controller = NULL;

View File

@ -27,6 +27,7 @@
#include "config/user_config.hpp"
#include "graphics/camera.hpp"
#include "graphics/irr_driver.hpp"
#include "graphics/render_info.hpp"
#include "io/file_manager.hpp"
#include "input/device_manager.hpp"
#include "input/keyboard_device.hpp"
@ -334,7 +335,7 @@ AbstractKart *World::createKart(const std::string &kart_ident, int index,
int position = index+1;
btTransform init_pos = getStartTransform(index - gk);
AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
difficulty);
difficulty, KRT_DEFAULT);
new_kart->init(race_manager->getKartType(index));
Controller *controller = NULL;
switch(kart_type)

View File

@ -23,7 +23,6 @@
#include "graphics/central_settings.hpp"
#include "graphics/irr_driver.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/scalable_font.hpp"
#include "modes/world.hpp"
#include "config/player_manager.hpp"
#include "states_screens/dialogs/tutorial_message_dialog.hpp"

View File

@ -65,6 +65,7 @@ AddonsScreen::AddonsScreen() : Screen("addons_screen.stkgui")
m_date_filters.push_back(filter_1y);
m_date_filters.push_back(filter_2y);
m_show_tips = true;
} // AddonsScreen
// ----------------------------------------------------------------------------
@ -95,7 +96,11 @@ void AddonsScreen::loadedFromFile()
GUIEngine::ListWidget* w_list =
getWidget<GUIEngine::ListWidget>("list_addons");
w_list->setColumnListener(this);
GUIEngine::LabelWidget* w_tips =
getWidget<GUIEngine::LabelWidget>("tips_label");
w_tips->setScrollSpeed(15);
} // loadedFromFile
@ -130,6 +135,26 @@ void AddonsScreen::beforeAddingWidget()
{
w_filter_rating->addLabel(StringUtils::toWString(n / 2.0));
}
GUIEngine::LabelWidget *w_tips =
getWidget<GUIEngine::LabelWidget>("tips_label");
bool ip = UserConfigParams::m_internet_status == RequestManager::IPERM_ALLOWED;
if(!ip)
{
w_tips->setVisible(true);
w_tips->setText( _("Access to the Internet is disabled. "
"(To enable it, go to options and "
"select tab 'User Interface')"),
false);
w_tips->m_properties[GUIEngine::PROP_HEIGHT] = "fit";
calculateLayout();
m_show_tips = true;
}
}
// ----------------------------------------------------------------------------
@ -157,7 +182,21 @@ void AddonsScreen::init()
w_list->setIcons(m_icon_bank, (int)(m_icon_height));
m_type = "kart";
bool ip = UserConfigParams::m_internet_status == RequestManager::IPERM_ALLOWED;
if(ip)
{
// Nothing to show in the tips label, disable it.
GUIEngine::LabelWidget *w_tips =
getWidget<GUIEngine::LabelWidget>("tips_label");
w_tips->setVisible(false);
w_tips->m_properties[GUIEngine::PROP_HEIGHT] = "0";
calculateLayout();
m_show_tips = false;
} // ip
getWidget<GUIEngine::IconButtonWidget>("reload")->setActive(ip);
// Reset filter.
@ -525,4 +564,22 @@ void AddonsScreen::onUpdate(float dt)
// Addons manager is still initialising/downloading.
}
}
if(m_show_tips)
{
GUIEngine::LabelWidget *w_tips =
getWidget<GUIEngine::LabelWidget>("tips_label");
w_tips->update(dt);
if(w_tips->scrolledOff())
{
// Tips have been shown once. Disable tips_label.
w_tips->setVisible(false);
w_tips->m_properties[GUIEngine::PROP_HEIGHT] = "0";
calculateLayout();
m_show_tips = false;
}
}
} // onUpdate

View File

@ -84,6 +84,8 @@ private:
/** List of date filters **/
std::vector<DateFilter> m_date_filters;
bool m_show_tips;
public:
/** Load the addons into the main list.*/

View File

@ -17,10 +17,8 @@
#include "states_screens/dialogs/message_dialog.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/screen.hpp"
#include "guiengine/widgets/button_widget.hpp"
#include "guiengine/widgets/label_widget.hpp"
#include "guiengine/widgets/ribbon_widget.hpp"
#include "modes/world.hpp"
#include "states_screens/state_manager.hpp"
#include "utils/translation.hpp"
@ -97,7 +95,7 @@ void MessageDialog::doInit(bool from_queue)
MessageDialog::~MessageDialog()
{
if (m_own_listener) delete m_listener;
if (m_own_listener) delete m_listener;
m_listener = NULL;
if (StateManager::get()->getGameState() == GUIEngine::GAME)
@ -111,28 +109,29 @@ void MessageDialog::loadedFromFile()
{
LabelWidget* message = getWidget<LabelWidget>("title");
message->setText( m_msg, false );
RibbonWidget* ribbon = getWidget<RibbonWidget>("buttons");
ribbon->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
// If the dialog is a simple 'OK' dialog, then hide the "Yes" button and
// change "Cancel" to "OK"
if (m_type == MessageDialog::MESSAGE_DIALOG_OK)
{
ButtonWidget* yesbtn = getWidget<ButtonWidget>("confirm");
IconButtonWidget* yesbtn = getWidget<IconButtonWidget>("cancel");
yesbtn->setVisible(false);
ButtonWidget* cancelbtn = getWidget<ButtonWidget>("cancel");
IconButtonWidget* cancelbtn = getWidget<IconButtonWidget>("confirm");
cancelbtn->setText(_("OK"));
cancelbtn->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
}
else if (m_type == MessageDialog::MESSAGE_DIALOG_YESNO)
{
ButtonWidget* cancelbtn = getWidget<ButtonWidget>("cancel");
IconButtonWidget* cancelbtn = getWidget<IconButtonWidget>("cancel");
cancelbtn->setText(_("No"));
}
else if (m_type == MessageDialog::MESSAGE_DIALOG_OK_CANCEL)
{
// In case of a OK_CANCEL dialog, change the text from 'Yes' to 'Ok'
ButtonWidget* yesbtn = getWidget<ButtonWidget>("confirm");
IconButtonWidget* yesbtn = getWidget<IconButtonWidget>("confirm");
yesbtn->setText(_("OK"));
}
}
@ -147,8 +146,9 @@ void MessageDialog::onEnterPressedInternal()
GUIEngine::EventPropagation MessageDialog::processEvent(const std::string& eventSource)
{
if (eventSource == "cancel")
RibbonWidget* ribbon = getWidget<RibbonWidget>(eventSource.c_str());
if (ribbon->getSelectionIDString(PLAYER_ID_GAME_MASTER) == "cancel")
{
if (m_listener == NULL)
{
@ -161,7 +161,7 @@ GUIEngine::EventPropagation MessageDialog::processEvent(const std::string& event
return GUIEngine::EVENT_BLOCK;
}
else if (eventSource == "confirm")
else if (ribbon->getSelectionIDString(PLAYER_ID_GAME_MASTER) == "confirm")
{
if (m_listener == NULL)
{

View File

@ -25,6 +25,7 @@
#include "challenges/unlock_manager.hpp"
#include "config/player_manager.hpp"
#include "graphics/material_manager.hpp"
#include "graphics/render_info.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/scalable_font.hpp"
#include "io/file_manager.hpp"
@ -295,7 +296,7 @@ void FeatureUnlockedCutScene::init()
else if (m_unlocked_stuff[n].m_unlocked_kart != NULL)
{
KartModel *kart_model =
m_unlocked_stuff[n].m_unlocked_kart->getKartModelCopy();
m_unlocked_stuff[n].m_unlocked_kart->getKartModelCopy(KRT_DEFAULT);
m_all_kart_models.push_back(kart_model);
m_unlocked_stuff[n].m_root_gift_node = kart_model->attachModel(true, false);
m_unlocked_stuff[n].m_scale = 5.0f;

View File

@ -23,6 +23,7 @@
#include "challenges/unlock_manager.hpp"
#include "config/player_manager.hpp"
#include "graphics/irr_driver.hpp"
#include "graphics/render_info.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/scalable_font.hpp"
#include "guiengine/widgets/button_widget.hpp"
@ -181,7 +182,7 @@ void GrandPrixLose::setKarts(std::vector<std::string> ident_arg)
const KartProperties* kart = kart_properties_manager->getKart(ident_arg[n]);
if (kart != NULL)
{
KartModel* kart_model = kart->getKartModelCopy();
KartModel* kart_model = kart->getKartModelCopy(KRT_DEFAULT);
m_all_kart_models.push_back(kart_model);
scene::ISceneNode* kart_main_node = kart_model->attachModel(false, false);

View File

@ -23,6 +23,7 @@
#include "challenges/unlock_manager.hpp"
#include "config/player_manager.hpp"
#include "graphics/irr_driver.hpp"
#include "graphics/render_info.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/scalable_font.hpp"
#include "guiengine/widgets/button_widget.hpp"
@ -304,7 +305,7 @@ void GrandPrixWin::setKarts(const std::string idents_arg[3])
const KartProperties* kp = kart_properties_manager->getKart(idents[i]);
if (kp == NULL) continue;
KartModel* kart_model = kp->getKartModelCopy();
KartModel* kart_model = kp->getKartModelCopy(KRT_DEFAULT);
m_all_kart_models.push_back(kart_model);
scene::ISceneNode* kart_main_node = kart_model->attachModel(false, false);

View File

@ -76,6 +76,7 @@ bool MainMenuScreen::m_enable_online = false;
MainMenuScreen::MainMenuScreen() : Screen("main_menu.stkgui")
{
m_online_string = _("Online");
//I18N: Used as a verb, appears on the main menu (login button)
m_login_string = _("Login");
} // MainMenuScreen

View File

@ -373,6 +373,7 @@ void RaceGUI::drawGlobalMiniMap()
const Vec3& xyz = kart->getXYZ();
Vec3 draw_at;
world->getTrack()->mapPoint2MiniMap(xyz, &draw_at);
draw_at *= UserConfigParams::m_scale_rtts_factor;
video::ITexture* icon = kart->getKartProperties()->getMinimapIcon();
@ -393,6 +394,7 @@ void RaceGUI::drawGlobalMiniMap()
{
Vec3 draw_at;
world->getTrack()->mapPoint2MiniMap(sw->getBallPosition(), &draw_at);
draw_at *= UserConfigParams::m_scale_rtts_factor;
video::ITexture* icon =
irr_driver->getTexture(FileManager::GUI, "soccer_ball_normal.png");

View File

@ -362,6 +362,7 @@ void RaceGUIOverworld::drawGlobalMiniMap()
kart_xyz= kart->getXYZ();
Vec3 draw_at;
track->mapPoint2MiniMap(kart_xyz, &draw_at);
draw_at *= UserConfigParams::m_scale_rtts_factor;
video::ITexture* icon = kart->getKartProperties()->getMinimapIcon();
core::rect<s32> source(core::position2di(0, 0), icon->getSize());
@ -399,6 +400,7 @@ void RaceGUIOverworld::drawGlobalMiniMap()
Vec3 draw_at;
track->mapPoint2MiniMap(challenges[n].m_position, &draw_at);
draw_at *= UserConfigParams::m_scale_rtts_factor;
const ChallengeData* challenge = unlock_manager->getChallengeData(challenges[n].m_challenge_id);
const unsigned int val = challenge->getNumTrophies();

View File

@ -19,6 +19,7 @@
#include "audio/sfx_manager.hpp"
#include "config/user_config.hpp"
#include "graphics/render_info.hpp"
#include "guiengine/widgets/bubble_widget.hpp"
#include "guiengine/widgets/button_widget.hpp"
#include "guiengine/widgets/spinner_widget.hpp"
@ -149,9 +150,8 @@ void SoccerSetupScreen::beforeAddingWidget()
info.support_colorization = kart_model.supportColorization();
if (info.support_colorization)
{
kart_view->getModelViewRenderInfo().setKartModelRenderInfo
(info.team == SOCCER_TEAM_BLUE ?
RenderInfo::KRT_BLUE : RenderInfo::KRT_RED);
kart_view->getModelViewRenderInfo()->setKartModelRenderInfo
(info.team == SOCCER_TEAM_BLUE ? KRT_BLUE : KRT_RED);
}
// Add the kart model (including wheels and speed weight objects)
@ -295,7 +295,7 @@ GUIEngine::EventPropagation SoccerSetupScreen::filterActions(PlayerAction action
if (m_kart_view_info[playerId].support_colorization)
{
m_kart_view_info[playerId].view->getModelViewRenderInfo()
.setKartModelRenderInfo(RenderInfo::KRT_RED);
->setKartModelRenderInfo(KRT_RED);
}
for(int i=0 ; i < nb_players ; i++)
@ -315,7 +315,7 @@ GUIEngine::EventPropagation SoccerSetupScreen::filterActions(PlayerAction action
if (m_kart_view_info[playerId].support_colorization)
{
m_kart_view_info[playerId].view->getModelViewRenderInfo()
.setKartModelRenderInfo(RenderInfo::KRT_BLUE);
->setKartModelRenderInfo(KRT_BLUE);
}
for(int i=0 ; i < nb_players ; i++)

View File

@ -18,7 +18,6 @@
#ifndef HEADER_SOCCER_SETUP_SCREEN_HPP
#define HEADER_SOCCER_SETUP_SCREEN_HPP
#include "graphics/render_info.hpp"
#include "guiengine/screen.hpp"
#include "network/remote_kart_info.hpp"
@ -41,7 +40,6 @@ class SoccerSetupScreen : public GUIEngine::Screen,
bool confirmed;
bool support_colorization;
SoccerTeam team;
RenderInfo render_info;
KartViewInfo() : view(), confirmed(false), support_colorization(false),
team(SOCCER_TEAM_NONE) {}

View File

@ -38,8 +38,6 @@
#include "graphics/particle_emitter.hpp"
#include "graphics/particle_kind.hpp"
#include "graphics/particle_kind_manager.hpp"
#include "graphics/render_info.hpp"
#include "guiengine/scalable_font.hpp"
#include "io/file_manager.hpp"
#include "io/xml_node.hpp"
#include "items/item.hpp"
@ -1739,7 +1737,7 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
}
}
loadObjects(root, path, model_def_loader, true, NULL, NULL, NULL);
loadObjects(root, path, model_def_loader, true, NULL, NULL);
model_def_loader.cleanLibraryNodesAfterLoad();
@ -1929,7 +1927,7 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
void Track::loadObjects(const XMLNode* root, const std::string& path, ModelDefinitionLoader& model_def_loader,
bool create_lod_definitions, scene::ISceneNode* parent,
TrackObject* parent_library, RenderInfo* ri)
TrackObject* parent_library)
{
unsigned int start_position_counter = 0;
@ -1943,7 +1941,7 @@ void Track::loadObjects(const XMLNode* root, const std::string& path, ModelDefin
if (name == "track" || name == "default-start") continue;
if (name == "object" || name == "library")
{
m_track_object_manager->add(*node, parent, model_def_loader, parent_library, ri);
m_track_object_manager->add(*node, parent, model_def_loader, parent_library);
}
else if (name == "water")
{
@ -1987,7 +1985,7 @@ void Track::loadObjects(const XMLNode* root, const std::string& path, ModelDefin
{
if (UserConfigParams::m_graphical_effects)
{
m_track_object_manager->add(*node, parent, model_def_loader, parent_library, NULL);
m_track_object_manager->add(*node, parent, model_def_loader, parent_library);
}
}
else if (name == "sky-dome" || name == "sky-box" || name == "sky-color")
@ -2000,7 +1998,7 @@ void Track::loadObjects(const XMLNode* root, const std::string& path, ModelDefin
}
else if (name == "light")
{
m_track_object_manager->add(*node, parent, model_def_loader, parent_library, NULL);
m_track_object_manager->add(*node, parent, model_def_loader, parent_library);
}
else if (name == "weather")
{

View File

@ -56,7 +56,6 @@ class MusicInformation;
class ParticleEmitter;
class ParticleKind;
class PhysicalObject;
class RenderInfo;
class TrackObject;
class TrackObjectManager;
class TriangleMesh;
@ -457,8 +456,7 @@ public:
// ------------------------------------------------------------------------
void loadObjects(const XMLNode* root, const std::string& path,
ModelDefinitionLoader& lod_loader, bool create_lod_definitions,
scene::ISceneNode* parent, TrackObject* parent_library,
RenderInfo* ri);
scene::ISceneNode* parent, TrackObject* parent_library);
// ------------------------------------------------------------------------
bool isSoccer () const { return m_is_soccer; }
// ------------------------------------------------------------------------

View File

@ -20,6 +20,8 @@
#include "animations/three_d_animation.hpp"
#include "graphics/irr_driver.hpp"
#include "graphics/material.hpp"
#include "graphics/material_manager.hpp"
#include "graphics/render_info.hpp"
#include "io/file_manager.hpp"
#include "io/xml_node.hpp"
@ -43,9 +45,9 @@
*/
TrackObject::TrackObject(const XMLNode &xml_node, scene::ISceneNode* parent,
ModelDefinitionLoader& model_def_loader,
TrackObject* parent_library, RenderInfo* ri)
TrackObject* parent_library)
{
init(xml_node, parent, model_def_loader, parent_library, ri);
init(xml_node, parent, model_def_loader, parent_library);
} // TrackObject
// ----------------------------------------------------------------------------
@ -68,6 +70,7 @@ TrackObject::TrackObject(const core::vector3df& xyz, const core::vector3df& hpr,
m_animator = NULL;
m_physical_object = NULL;
m_parent_library = NULL;
m_render_info = NULL;
m_interaction = interaction;
m_presentation = presentation;
m_is_driveable = false;
@ -94,11 +97,12 @@ TrackObject::TrackObject(const core::vector3df& xyz, const core::vector3df& hpr,
*/
void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
ModelDefinitionLoader& model_def_loader,
TrackObject* parent_library, RenderInfo* ri)
TrackObject* parent_library)
{
m_init_xyz = core::vector3df(0,0,0);
m_init_hpr = core::vector3df(0,0,0);
m_init_scale = core::vector3df(1,1,1);
m_render_info = NULL;
m_enabled = true;
m_initially_visible = false;
m_presentation = NULL;
@ -178,13 +182,41 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
}
else
{
// Colorization settings
std::string model_name;
xml_node.get("model", &model_name);
bool colorizable = false;
scene::IMesh* mesh = NULL;
if (model_name.size() > 0)
{
mesh = irr_driver->getMesh(model_name);
if (mesh != NULL)
{
unsigned int n = mesh->getMeshBufferCount();
for (unsigned int i = 0; i < n; i++)
{
scene::IMeshBuffer *mb = mesh->getMeshBuffer(i);
Material* m = material_manager->getMaterialFor(mb
->getMaterial().getTexture(0), mb);
colorizable = colorizable || m->isColorizable();
}
}
}
// If at least one material is colorizable, add RenderInfo for it
if (colorizable)
{
m_render_info = new RenderInfo();
m_render_info->setDynamicHue(mesh);
}
scene::ISceneNode *glownode = NULL;
bool is_movable = false;
if (lod_instance)
{
m_type = "lod";
TrackObjectPresentationLOD* lod_node =
new TrackObjectPresentationLOD(xml_node, parent, model_def_loader, ri);
new TrackObjectPresentationLOD(xml_node, parent, model_def_loader, m_render_info);
m_presentation = lod_node;
LODNode* node = (LODNode*)lod_node->getNode();
@ -209,7 +241,7 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
m_presentation = new TrackObjectPresentationMesh(xml_node,
m_enabled,
parent,
ri);
m_render_info);
scene::ISceneNode* node = ((TrackObjectPresentationMesh *)m_presentation)->getNode();
if (type == "movable" && parent != NULL)
{
@ -356,6 +388,7 @@ TrackObject::~TrackObject()
delete m_presentation;
delete m_animator;
delete m_physical_object;
delete m_render_info;
} // ~TrackObject
// ----------------------------------------------------------------------------

View File

@ -31,10 +31,10 @@
#include <string>
#include "animations/three_d_animation.hpp"
class XMLNode;
class ThreeDAnimation;
class ModelDefinitionLoader;
class RenderInfo;
class ThreeDAnimation;
class XMLNode;
/**
* \ingroup tracks
@ -60,8 +60,9 @@ private:
std::string m_id;
protected:
RenderInfo* m_render_info;
protected:
/** The initial XYZ position of the object. */
core::vector3df m_init_xyz;
@ -99,14 +100,13 @@ protected:
void init(const XMLNode &xml_node, scene::ISceneNode* parent,
ModelDefinitionLoader& model_def_loader,
TrackObject* parent_library, RenderInfo* ri);
TrackObject* parent_library);
public:
TrackObject(const XMLNode &xml_node,
scene::ISceneNode* parent,
ModelDefinitionLoader& model_def_loader,
TrackObject* parent_library,
RenderInfo* ri);
TrackObject* parent_library);
TrackObject(const core::vector3df& xyz,
const core::vector3df& hpr,

View File

@ -22,7 +22,6 @@
#include "animations/three_d_animation.hpp"
#include "graphics/lod_node.hpp"
#include "graphics/material_manager.hpp"
#include "graphics/render_info.hpp"
#include "io/xml_node.hpp"
#include "physics/physical_object.hpp"
#include "tracks/track_object.hpp"
@ -46,11 +45,11 @@ TrackObjectManager::~TrackObjectManager()
*/
void TrackObjectManager::add(const XMLNode &xml_node, scene::ISceneNode* parent,
ModelDefinitionLoader& model_def_loader,
TrackObject* parent_library, RenderInfo* ri)
TrackObject* parent_library)
{
try
{
TrackObject *obj = new TrackObject(xml_node, parent, model_def_loader, parent_library, ri);
TrackObject *obj = new TrackObject(xml_node, parent, model_def_loader, parent_library);
m_all_objects.push_back(obj);
if(obj->isDriveable())
m_driveable_objects.push_back(obj);

View File

@ -23,11 +23,10 @@
#include "tracks/track_object.hpp"
#include "utils/ptr_vector.hpp"
class LODNode;
class RenderInfo;
class Track;
class Vec3;
class XMLNode;
class LODNode;
#include <map>
#include <vector>
@ -59,7 +58,7 @@ public:
void init();
void add(const XMLNode &xml_node, scene::ISceneNode* parent,
ModelDefinitionLoader& model_def_loader,
TrackObject* parent_library, RenderInfo* ri);
TrackObject* parent_library);
void update(float dt);
void handleExplosion(const Vec3 &pos, const PhysicalObject *mp,
bool secondary_hits=true);

View File

@ -177,13 +177,8 @@ TrackObjectPresentationLibraryNode::TrackObjectPresentationLibraryNode(
ModelDefinitionLoader& model_def_loader)
: TrackObjectPresentationSceneNode(xml_node)
{
m_render_info = NULL;
std::string name;
xml_node.get("name", &name);
float custom_hue = 0.0f;
xml_node.get("hue", &custom_hue);
if (custom_hue > 0.0f)
m_render_info = new RenderInfo(custom_hue, false);
m_node = irr_driver->getSceneManager()->addEmptySceneNode();
#ifdef DEBUG
@ -273,7 +268,7 @@ TrackObjectPresentationLibraryNode::TrackObjectPresentationLibraryNode(
assert(libroot != NULL);
World::getWorld()->getTrack()->loadObjects(libroot, lib_path, model_def_loader,
create_lod_definitions, m_node, parent, m_render_info);
create_lod_definitions, m_node, parent);
m_parent = parent;
} // TrackObjectPresentationLibraryNode
@ -281,8 +276,6 @@ TrackObjectPresentationLibraryNode::TrackObjectPresentationLibraryNode(
TrackObjectPresentationLibraryNode::~TrackObjectPresentationLibraryNode()
{
irr_driver->removeNode(m_node);
delete m_render_info;
m_render_info = NULL;
} // TrackObjectPresentationLibraryNode
// ----------------------------------------------------------------------------
void TrackObjectPresentationLibraryNode::move(const core::vector3df& xyz, const core::vector3df& hpr,

View File

@ -185,7 +185,6 @@ public:
class TrackObjectPresentationLibraryNode : public TrackObjectPresentationSceneNode
{
TrackObject* m_parent;
RenderInfo* m_render_info;
public:
TrackObjectPresentationLibraryNode(TrackObject* parent,
const XMLNode& xml_node,