Rigs of Rods 2023.09
Soft-body Physics Simulation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Loading...
Searching...
No Matches
ActorSpawnerFlow.cpp
Go to the documentation of this file.
1/*
2 This source file is part of Rigs of Rods
3 Copyright 2005-2012 Pierre-Michel Ricordel
4 Copyright 2007-2012 Thomas Fischer
5 Copyright 2013-2020 Petr Ohlidal
6
7 For more information, see http://www.rigsofrods.org/
8
9 Rigs of Rods is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License version 3, as
11 published by the Free Software Foundation.
12
13 Rigs of Rods is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22/*
23 @file
24 @brief Implements part of ActorSpawner class. Code separated for easier debugging.
25 @author Petr Ohlidal
26 @date 12/2013
27*/
28
29#include "ActorSpawner.h"
30
31#include "Actor.h"
32#include "CacheSystem.h"
33#include "GfxScene.h"
34#include "Renderdash.h"
35
36using namespace RoR;
37
38#define PROCESS_ELEMENT(_KEYWORD_, _FIELD_, _FUNCTION_) \
39{ \
40 this->SetCurrentKeyword(_KEYWORD_); \
41 for (auto& m: m_selected_modules) \
42 { \
43 m_current_module = m; \
44 for (auto& entry: m->_FIELD_) \
45 { \
46 try { \
47 _FUNCTION_(entry); \
48 } \
49 catch (...) \
50 { \
51 this->HandleException(); \
52 } \
53 } \
54 m_current_module.reset(); \
55 } \
56 this->SetCurrentKeyword(RigDef::Keyword::INVALID); \
57}
58
60{
61 m_actor = actor;
62 m_file = def;
63 m_custom_resource_group = rq.asr_cache_entry->resource_group; // For historical/backwards-compat reasons, the instances live in the same group as the bundle.
64
65 // Under OGRE, every scenenode must have globally unique name.
66 m_actor_grouping_scenenode = App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->createChildSceneNode(this->ComposeName("Actor"));
67 m_particles_parent_scenenode = m_actor_grouping_scenenode->createChildSceneNode(this->ComposeName("Particles"));
68 m_wheels_parent_scenenode = m_actor_grouping_scenenode->createChildSceneNode(this->ComposeName("Wheels"));
69 m_flexbodies_parent_scenenode = m_actor_grouping_scenenode->createChildSceneNode(this->ComposeName("Flexbodies"));
70 m_props_parent_scenenode = m_actor_grouping_scenenode->createChildSceneNode(this->ComposeName("Props"));
71 m_flares_parent_scenenode = m_actor_grouping_scenenode->createChildSceneNode(this->ComposeName("Flares"));
72
75 m_wing_area = 0.f;
76 m_fuse_z_min = 1000.0f;
77 m_fuse_z_max = -1000.0f;
78 m_fuse_y_min = 1000.0f;
79 m_fuse_y_max = -1000.0f;
81
82 // Disable aerial pos. lights for land vehicles (detect by 'engine' element).
83 if (m_file->root_module->engine.size() > 0)
84 {
86 }
87 else
88 {
89 for (auto& sel_module : m_selected_modules)
90 {
91 if (sel_module->engine.size() > 0)
92 {
94 }
95 }
96 }
97
98 // Create the built-in "renderdash" material for use in meshes.
99 // Must be done before 'props' are processed because those traditionally use it.
100 // Must be always created, there is no mechanism to declare the need for it. It can be acessed from any mesh, not only dashboard-prop.
101 // Example content: https://github.com/RigsOfRods/rigs-of-rods/files/3044343/45fc291a9d2aa5faaa36cca6df9571cd6d1f1869_Actros_8x8-englisch.zip
102 // TODO: Move setup to GfxActor
104 m_custom_resource_group, this->ComposeName("RenderdashTex", 0), this->ComposeName("RenderdashCam", 0));
105
106 this->InitializeRig();
107
108 // Vehicle name
110
111 // File hash
112 m_actor->ar_filehash = m_file->hash;
113
114 // Flags in root module
115 m_actor->ar_forward_commands = m_file->forward_commands;
116 m_actor->ar_import_commands = m_file->import_commands;
117 m_actor->ar_rescuer_flag = m_file->rescuer;
118 m_actor->m_disable_default_sounds = m_file->disable_default_sounds;
119 m_actor->ar_hide_in_actor_list = m_file->hide_in_chooser;
120
124
125 // 'guid': unused for gameplay
126 if (m_file->root_module->guid.empty())
127 {
128 this->AddMessage(Message::TYPE_WARNING, "vehicle uses no GUID, skinning will be impossible");
129 }
130
132 // This prepares substitute materials -> MUST be processed before any meshes are loaded.
135 // MUST be done before "guisettings" (overrides help panel material)
144
145 // ---------------------------- User-defined nodes ----------------------------
146
147 m_actor->m_gfx_actor = std::unique_ptr<RoR::GfxActor>(
149
151
152 // Old-format exhaust (defined by flags 'x/y' in section 'nodes', one per vehicle)
154 {
156 }
157
158 // ---------------------------- Node generating sections ----------------------------
159
161
162 // ---------------------------- Wheels (also generate nodes) ----------------------------
163
169
170 // ---------------------------- WheelDetachers ----------------------------
171
173
174 // ---------------------------- User-defined beams ----------------------------
175 // (may reference any generated/user-defined node)
176
181 PROCESS_ELEMENT(RigDef::Keyword::COMMANDS2, commands2, ProcessCommand); // 'commands' are auto-imported as 'commands2'.
185
186 // ---------------------------- Other ----------------------------
187
219 PROCESS_ELEMENT(RigDef::Keyword::TURBOPROPS2, turboprops2, ProcessTurboprop2); // 'turboprops' are auto-imported as 'turboprops2'.
222 PROCESS_ELEMENT(RigDef::Keyword::FLEXBODIES, flexbodies, ProcessFlexbody); // (needs GfxActor to exist)
223 PROCESS_ELEMENT(RigDef::Keyword::WINGS, wings, ProcessWing); // (needs GfxActor to exist)
224 PROCESS_ELEMENT(RigDef::Keyword::AIRBRAKES, airbrakes, ProcessAirbrake); // (needs GfxActor to exist)
225
226#ifdef USE_OPENAL
227
230
231#endif // USE_OPENAL
232
233 this->FinalizeRig();
234
235 if (m_oldstyle_cab_texcoords.size() > 0 && m_actor->ar_num_cabs > 0)
236 {
237 this->CreateCabVisual();
238 };
239
240 this->FinalizeGfxSetup();
241}
Vehicle spawning logic.
#define PROCESS_ELEMENT(_KEYWORD_, _FIELD_, _FUNCTION_)
A database of user-installed content alias 'mods' (vehicles, terrains...)
bool ar_import_commands
Sim state.
Definition Actor.h:556
bool ar_forward_commands
Sim state.
Definition Actor.h:555
std::string ar_filehash
Attribute; filled at spawn.
Definition Actor.h:477
Ogre::String ar_design_name
Name of the vehicle/machine/object this actor represents.
Definition Actor.h:406
bool m_disable_default_sounds
Spawner context; TODO: remove.
Definition Actor.h:706
int ar_num_cabs
Definition Actor.h:394
NodeNum_t ar_exhaust_dir_node
Old-format exhaust (one per vehicle) backwards direction node.
Definition Actor.h:428
std::unique_ptr< GfxActor > m_gfx_actor
Definition Actor.h:610
NodeNum_t ar_exhaust_pos_node
Old-format exhaust (one per vehicle) emitter node.
Definition Actor.h:427
bool ar_hide_in_actor_list
Hide in list of spawned actors (available in top menubar). Useful for fixed-place machinery,...
Definition Actor.h:405
bool ar_rescuer_flag
Gameplay attr; defined in truckfile. TODO: Does anybody use this anymore?
Definition Actor.h:554
void ProcessAntiLockBrakes(RigDef::AntiLockBrakes &def)
void ProcessFlare2(RigDef::Flare2 &def)
std::list< std::shared_ptr< RigDef::Document::Module > > m_selected_modules
void ProcessScrewprop(RigDef::Screwprop &def)
void ProcessFixedNode(RigDef::Node::Ref node_ref)
void ProcessGlobals(RigDef::Globals &def)
void ProcessHydro(RigDef::Hydro &def)
void ProcessRotator2(RigDef::Rotator2 &def)
void ProcessTractionControl(RigDef::TractionControl &def)
void ProcessMeshWheel2(RigDef::MeshWheel2 &def)
void ProcessMinimass(RigDef::Minimass &def)
void ProcessEngturbo(RigDef::Engturbo &def)
void ProcessProp(RigDef::Prop &def)
Resource group override is used with addonparts.
bool m_generate_wing_position_lights
void ProcessWheelDetacher(RigDef::WheelDetacher &def)
void ProcessSlidenode(RigDef::SlideNode &def)
void ProcessSoundSource2(RigDef::SoundSource2 &def)
void ProcessExtCamera(RigDef::ExtCamera &def)
void ProcessSoundSource(RigDef::SoundSource &def)
void ProcessBeam(RigDef::Beam &def)
void ProcessRope(RigDef::Rope &def)
void ProcessParticle(RigDef::Particle &def)
void ProcessFlare3(RigDef::Flare3 &def)
void ProcessCruiseControl(RigDef::CruiseControl &def)
void ProcessHook(RigDef::Hook &def)
void ProcessTurbojet(RigDef::Turbojet &def)
void ProcessExhaust(RigDef::Exhaust &def)
void ProcessFlexbody(RigDef::Flexbody &def)
void ProcessRopable(RigDef::Ropable &def)
void ProcessNewActor(ActorPtr actor, ActorSpawnRequest rq, RigDef::DocumentPtr def)
void ProcessShock(RigDef::Shock &def)
void ProcessTurboprop2(RigDef::Turboprop2 &def)
void ProcessAuthor(RigDef::Author &def)
void ProcessAxle(RigDef::Axle &def)
void ProcessWheel(RigDef::Wheel &def)
void ProcessGuiSettings(RigDef::GuiSettings &def)
RoR::Renderdash * m_oldstyle_renderdash
void ProcessTransferCase(RigDef::TransferCase &def)
Ogre::SceneNode * m_flares_parent_scenenode
this isn't used for moving/hiding things, just helps developers inspect the scene graph.
void ProcessWheel2(RigDef::Wheel2 &def)
void ProcessRailGroup(RigDef::RailGroup &def)
Ogre::SceneNode * m_particles_parent_scenenode
this isn't used for moving/hiding things, just helps developers inspect the scene graph.
void ProcessContacter(RigDef::Node::Ref &node_ref)
void ProcessSpeedLimiter(RigDef::SpeedLimiter &def)
void ProcessEngine(RigDef::Engine &def)
void ProcessWing(RigDef::Wing &def)
void ProcessSubmesh(RigDef::Submesh &def)
void ProcessAnimator(RigDef::Animator &def)
void ProcessNode(RigDef::Node &def)
RigDef::DocumentPtr m_file
void ProcessCinecam(RigDef::Cinecam &def)
void ProcessFlaregroupNoImport(RigDef::FlaregroupNoImport &def)
void ProcessManagedMaterial(RigDef::ManagedMaterial &def)
void ProcessShock3(RigDef::Shock3 &def)
void ProcessFusedrag(RigDef::Fusedrag &def)
void ProcessCommand(RigDef::Command2 &def)
std::string m_custom_resource_group
Ogre::SceneNode * m_wheels_parent_scenenode
this isn't used for moving/hiding things, just helps developers inspect the scene graph.
Ogre::SceneNode * m_props_parent_scenenode
this isn't used for moving/hiding things, just helps developers inspect the scene graph.
void ProcessCamera(RigDef::Camera &def)
void ProcessTie(RigDef::Tie &def)
void ProcessFlexBodyWheel(RigDef::FlexBodyWheel &def)
void ProcessPistonprop(RigDef::Pistonprop &def)
void ProcessInterAxle(RigDef::InterAxle &def)
void ProcessBrakes(RigDef::Brakes &def)
void ProcessMeshWheel(RigDef::MeshWheel &def)
void ProcessCustomDashInputs(RigDef::CustomDashboardInput &def)
void ProcessLockgroup(RigDef::Lockgroup &lockgroup)
void ProcessHelp(RigDef::Help &def)
std::string ComposeName(const std::string &object, int number=-1)
Creates name containing actor ID token, i.e. "Object#1 (filename.truck [Instance ID 1])".
void ProcessAirbrake(RigDef::Airbrake &def)
void ProcessRotator(RigDef::Rotator &def)
std::vector< CabTexcoord > m_oldstyle_cab_texcoords
void ProcessShock2(RigDef::Shock2 &def)
Ogre::Vector3 m_spawn_position
Ogre::SceneNode * m_flexbodies_parent_scenenode
this isn't used for moving/hiding things, just helps developers inspect the scene graph.
void ProcessTrigger(RigDef::Trigger &def)
void ProcessCameraRail(RigDef::CameraRail &def)
void ProcessCollisionBox(RigDef::CollisionBox &def)
void ProcessTorqueCurve(RigDef::TorqueCurve &def)
RigDef::Keyword m_current_keyword
For error reports.
void ProcessDescription(Ogre::String const &line)
void AddMessage(Message type, Ogre::String const &text)
Maintenance.
void AddExhaust(NodeNum_t emitter_node_idx, NodeNum_t direction_node_idx)
void ProcessCollisionRange(RigDef::CollisionRange &def)
Ogre::SceneNode * m_actor_grouping_scenenode
Topmost common parent; this isn't used for moving things, just helps developers inspect the scene gra...
void ProcessEngoption(RigDef::Engoption &def)
Ogre::String resource_group
Resource group of the loaded bundle. Empty if not loaded yet.
Definition CacheSystem.h:89
Ogre::SceneManager * GetSceneManager()
Definition GfxScene.h:83
'renderdash' is a name of a classic Render-To-Texture animated material with gauges and other dashboa...
Definition Renderdash.h:35
std::shared_ptr< Document > DocumentPtr
GfxScene * GetGfxScene()
CacheEntryPtr asr_cache_entry
Optional, overrides 'asr_filename' and 'asr_cache_entry_num'.
Definition SimData.h:834
Ogre::Vector3 asr_position
Definition SimData.h:837