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
TuneupFileFormat.h
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-2024 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#pragma once
23
29#include "Application.h"
30#include "CacheSystem.h"
31#include "RefCountingObject.h"
32
33#include <OgreResourceManager.h>
34
35#include <array>
36#include <vector>
37#include <string>
38#include <set>
39
40namespace RoR {
41
42const size_t TUNEUP_BUF_SIZE = 2000;
43
45{
47 Ogre::Vector3 tnt_pos = Ogre::Vector3::ZERO;
48 std::string tnt_origin;
49};
50
52{
54 Ogre::Vector3 tct_pos = Ogre::Vector3::ZERO;
55 std::string tct_origin;
56};
57
59{
63 std::array<std::string, 2> twt_media;
65 float twt_tire_radius = -1.f;
66 float twt_rim_radius = -1.f;
67 std::string twt_origin;
68
69};
70
72{
74 std::array<std::string, 2> tpt_media;
75 Ogre::Vector3 tpt_offset = Ogre::Vector3::ZERO;
76 Ogre::Vector3 tpt_rotation = Ogre::Vector3::ZERO;
77 std::string tpt_origin;
78};
79
81{
83 std::string tft_media;
84 Ogre::Vector3 tft_offset = Ogre::Vector3::ZERO;
85 Ogre::Vector3 tft_rotation = Ogre::Vector3::ZERO;
86 std::string tft_origin;
87};
88
90{
91 std::string tmt_name;
92 std::string tmt_type;
93 std::array<std::string, 3> tmt_media;
94 std::string tmt_origin;
95};
96
100struct TuneupDef: public RefCountingObject<TuneupDef>
101{
104 std::string name;
105 std::string guid;
106 std::string filename;
107 std::string thumbnail;
108 std::string description;
109 std::string author_name;
110 int author_id = -1;
113
116 std::set<std::string> use_addonparts;
117
118 std::map<NodeNum_t, TuneupNodeTweak> node_tweaks;
119 std::map<CineCameraID_t, TuneupCineCameraTweak> cinecam_tweaks;
120 std::map<WheelID_t, TuneupWheelTweak> wheel_tweaks;
121 std::map<PropID_t, TuneupPropTweak> prop_tweaks;
122 std::map<FlexbodyID_t, TuneupFlexbodyTweak> flexbody_tweaks;
123 std::map<std::string, TuneupManagedMatTweak> managedmat_tweaks;
124 std::set<PropID_t> unwanted_props;
125 std::set<FlexbodyID_t> unwanted_flexbodies;
126 std::set<FlareID_t> unwanted_flares;
127 std::set<ExhaustID_t> unwanted_exhausts;
128 std::set<std::string> unwanted_managedmats;
130
133 std::set<PropID_t> force_remove_props;
134 std::set<FlexbodyID_t> force_remove_flexbodies;
135 std::map<WheelID_t, WheelSide> force_wheel_sides;
136 std::map<VideoCameraID_t, VideoCamRole> force_video_cam_roles;
137 std::set<FlareID_t> force_remove_flares;
138 std::set<ExhaustID_t> force_remove_exhausts;
139 std::set<std::string> force_remove_managedmats;
141
144 std::set<NodeNum_t> protected_nodes;
145 std::set<CineCameraID_t> protected_cinecams;
146 std::set<WheelID_t> protected_wheels;
147 std::set<PropID_t> protected_props;
148 std::set<FlexbodyID_t> protected_flexbodies;
149 std::set<FlareID_t> protected_flares;
150 std::set<ExhaustID_t> protected_exhausts;
151 std::set<std::string> protected_managedmats;
153
155 void reset();
156
159 bool isPropProtected(PropID_t propid) const { return protected_props.find(propid) != protected_props.end(); }
160 bool isFlexbodyProtected(FlexbodyID_t flexbodyid) const { return protected_flexbodies.find(flexbodyid) != protected_flexbodies.end(); }
161 bool isWheelProtected(WheelID_t wheelid) const { return protected_wheels.find(wheelid) != protected_wheels.end(); }
162 bool isNodeProtected(NodeNum_t nodenum) const { return protected_nodes.find(nodenum) != protected_nodes.end(); }
163 bool isCineCameraProtected(CineCameraID_t cinecamid) const { return protected_cinecams.find(cinecamid) != protected_cinecams.end(); }
164 bool isFlareProtected(FlareID_t flareid) const { return protected_flares.find(flareid) != protected_flares.end(); }
165 bool isExhaustProtected(ExhaustID_t exhaustid) const { return protected_exhausts.find(exhaustid) != protected_exhausts.end(); }
166 bool isManagedMatProtected(const std::string& matname) const { return protected_managedmats.find(matname) != protected_managedmats.end(); }
168
171 bool isPropUnwanted(PropID_t propid) { return unwanted_props.find(propid) != unwanted_props.end(); }
172 bool isFlexbodyUnwanted(FlexbodyID_t flexbodyid) { return unwanted_flexbodies.find(flexbodyid) != unwanted_flexbodies.end(); }
173 bool isFlareUnwanted(FlareID_t flareid) { return unwanted_flares.find(flareid) != unwanted_flares.end(); }
174 bool isExhaustUnwanted(ExhaustID_t exhaustid) { return unwanted_exhausts.find(exhaustid) != unwanted_exhausts.end(); }
175 bool isManagedMatUnwanted(const std::string& matname) { return unwanted_managedmats.find(matname) != unwanted_managedmats.end(); }
177
180 bool isPropForceRemoved(PropID_t propid) { return force_remove_props.find(propid) != force_remove_props.end(); }
181 bool isFlexbodyForceRemoved(FlexbodyID_t flexbodyid) { return force_remove_flexbodies.find(flexbodyid) != force_remove_flexbodies.end(); }
182 bool isWheelSideForced(WheelID_t wheelid, WheelSide& out_val) const;
183 bool isFlareForceRemoved(FlareID_t flareid) { return force_remove_flares.find(flareid) != force_remove_flares.end(); }
184 bool isExhaustForceRemoved(ExhaustID_t exhaustid) { return force_remove_exhausts.find(exhaustid) != force_remove_exhausts.end(); }
185 bool isManagedMatForceRemoved(const std::string& matname) { return force_remove_managedmats.find(matname) != force_remove_managedmats.end(); }
186 bool isVideoCameraRoleForced(VideoCameraID_t camera_id, VideoCamRole& out_val) const;
188};
189
191{
192public:
193
194 static std::vector<TuneupDefPtr> ParseTuneups(Ogre::DataStreamPtr& stream);
195 static void ExportTuneup(Ogre::DataStreamPtr& stream, TuneupDefPtr& tuneup);
196
199 static bool isAddonPartUsed(TuneupDefPtr& tuneup_entry, const std::string& filename);
201
204 static float getTweakedWheelTireRadius(TuneupDefPtr& tuneup_entry, WheelID_t wheel_id, float orig_val);
205 static float getTweakedWheelRimRadius(TuneupDefPtr& tuneup_entry, WheelID_t wheel_id, float orig_val);
206 static std::string getTweakedWheelMedia(TuneupDefPtr& tuneup_entry, WheelID_t wheel_id, int media_idx, const std::string& orig_val);
207 static std::string getTweakedWheelMediaRG(TuneupDefPtr& tuneup_def, WheelID_t wheel_id, int media_idx, const std::string& orig_val);
208 static WheelSide getTweakedWheelSide(TuneupDefPtr& tuneup_entry, WheelID_t wheel_id, WheelSide orig_val);
209 static bool isWheelTweaked(TuneupDefPtr& tuneup_entry, WheelID_t wheel_id, TuneupWheelTweak*& out_tweak);
211
214 static Ogre::Vector3 getTweakedNodePosition(TuneupDefPtr& tuneup_entry, NodeNum_t nodenum, Ogre::Vector3 orig_val);
215 static bool isNodeTweaked(TuneupDefPtr& tuneup_entry, NodeNum_t nodenum, TuneupNodeTweak*& out_tweak);
217
220 static Ogre::Vector3 getTweakedCineCameraPosition(TuneupDefPtr& tuneup_entry, CineCameraID_t cinecamid, Ogre::Vector3 orig_val);
221 static bool isCineCameraTweaked(TuneupDefPtr& tuneup_entry, CineCameraID_t cinecamid, TuneupCineCameraTweak*& out_tweak);
223
226 static bool isPropAnyhowRemoved(TuneupDefPtr& tuneup_def, PropID_t prop_id);
227 static Ogre::Vector3 getTweakedPropOffset(TuneupDefPtr& tuneup_entry, PropID_t prop_id, Ogre::Vector3 orig_val);
228 static Ogre::Vector3 getTweakedPropRotation(TuneupDefPtr& tuneup_entry, PropID_t prop_id, Ogre::Vector3 orig_val);
229 static std::string getTweakedPropMedia(TuneupDefPtr& tuneup_entry, PropID_t prop_id, int media_idx, const std::string& orig_val);
230 static std::string getTweakedPropMediaRG(TuneupDefPtr& tuneup_def, PropID_t prop_id, int media_idx, const std::string& orig_val);
231 static bool isPropTweaked(TuneupDefPtr& tuneup_entry, PropID_t flexbody_id, TuneupPropTweak*& out_tweak);
233
236 static bool isFlexbodyAnyhowRemoved(TuneupDefPtr& tuneup_def, FlexbodyID_t flexbody_id);
237 static Ogre::Vector3 getTweakedFlexbodyOffset(TuneupDefPtr& tuneup_entry, FlexbodyID_t flexbody_id, Ogre::Vector3 orig_val);
238 static Ogre::Vector3 getTweakedFlexbodyRotation(TuneupDefPtr& tuneup_entry, FlexbodyID_t flexbody_id, Ogre::Vector3 orig_val);
239 static std::string getTweakedFlexbodyMedia(TuneupDefPtr& tuneup_entry, FlexbodyID_t flexbody_id, int media_idx, const std::string& orig_val);
240 static std::string getTweakedFlexbodyMediaRG(TuneupDefPtr& tuneup_def, FlexbodyID_t flexbody_id, int media_idx, const std::string& orig_val);
241 static bool isFlexbodyTweaked(TuneupDefPtr& tuneup_entry, FlexbodyID_t flexbody_id, TuneupFlexbodyTweak*& out_tweak);
243
246 static bool isFlareAnyhowRemoved(TuneupDefPtr& tuneup_def, FlareID_t flare_id);
248
251 static bool isExhaustAnyhowRemoved(TuneupDefPtr& tuneup_def, ExhaustID_t exhaust_id);
253
256 static bool isManagedMatAnyhowRemoved(TuneupDefPtr& tuneup_def, const std::string& matname);
257 static std::string getTweakedManagedMatType(TuneupDefPtr& tuneup_def, const std::string& matname, const std::string& orig_val);
258 static std::string getTweakedManagedMatMedia(TuneupDefPtr& tuneup_def, const std::string& matname, int media_idx, const std::string& orig_val);
259 static std::string getTweakedManagedMatMediaRG(TuneupDefPtr& tuneup_def, const std::string& matname, int media_idx, const std::string& orig_val);
260 static bool isManagedMatTweaked(TuneupDefPtr& tuneup_def, const std::string& matname, TuneupManagedMatTweak*& out_tweak);
262
265 static VideoCamRole getTweakedVideoCameraRole(TuneupDefPtr& tuneup_def, VideoCameraID_t camera_id, VideoCamRole orig_val);
267
268private:
269
270 static void ParseTuneupAttribute(const std::string& line, TuneupDefPtr& tuneup_def);
271};
272
273}; // namespace RoR
Central state/object manager and communications hub.
A database of user-installed content alias 'mods' (vehicles, terrains...)
Self reference-counting objects, as requred by AngelScript garbage collector.
static bool isAddonPartUsed(TuneupDefPtr &tuneup_entry, const std::string &filename)
static Ogre::Vector3 getTweakedPropRotation(TuneupDefPtr &tuneup_entry, PropID_t prop_id, Ogre::Vector3 orig_val)
static VideoCamRole getTweakedVideoCameraRole(TuneupDefPtr &tuneup_def, VideoCameraID_t camera_id, VideoCamRole orig_val)
static std::string getTweakedPropMedia(TuneupDefPtr &tuneup_entry, PropID_t prop_id, int media_idx, const std::string &orig_val)
static bool isManagedMatTweaked(TuneupDefPtr &tuneup_def, const std::string &matname, TuneupManagedMatTweak *&out_tweak)
static std::string getTweakedPropMediaRG(TuneupDefPtr &tuneup_def, PropID_t prop_id, int media_idx, const std::string &orig_val)
static void ParseTuneupAttribute(const std::string &line, TuneupDefPtr &tuneup_def)
static void ExportTuneup(Ogre::DataStreamPtr &stream, TuneupDefPtr &tuneup)
static bool isPropAnyhowRemoved(TuneupDefPtr &tuneup_def, PropID_t prop_id)
static bool isWheelTweaked(TuneupDefPtr &tuneup_entry, WheelID_t wheel_id, TuneupWheelTweak *&out_tweak)
static Ogre::Vector3 getTweakedCineCameraPosition(TuneupDefPtr &tuneup_entry, CineCameraID_t cinecamid, Ogre::Vector3 orig_val)
static Ogre::Vector3 getTweakedPropOffset(TuneupDefPtr &tuneup_entry, PropID_t prop_id, Ogre::Vector3 orig_val)
static bool isFlareAnyhowRemoved(TuneupDefPtr &tuneup_def, FlareID_t flare_id)
static std::string getTweakedFlexbodyMediaRG(TuneupDefPtr &tuneup_def, FlexbodyID_t flexbody_id, int media_idx, const std::string &orig_val)
static float getTweakedWheelTireRadius(TuneupDefPtr &tuneup_entry, WheelID_t wheel_id, float orig_val)
static std::string getTweakedFlexbodyMedia(TuneupDefPtr &tuneup_entry, FlexbodyID_t flexbody_id, int media_idx, const std::string &orig_val)
static bool isManagedMatAnyhowRemoved(TuneupDefPtr &tuneup_def, const std::string &matname)
static bool isNodeTweaked(TuneupDefPtr &tuneup_entry, NodeNum_t nodenum, TuneupNodeTweak *&out_tweak)
static Ogre::Vector3 getTweakedFlexbodyOffset(TuneupDefPtr &tuneup_entry, FlexbodyID_t flexbody_id, Ogre::Vector3 orig_val)
static float getTweakedWheelRimRadius(TuneupDefPtr &tuneup_entry, WheelID_t wheel_id, float orig_val)
static std::string getTweakedManagedMatMediaRG(TuneupDefPtr &tuneup_def, const std::string &matname, int media_idx, const std::string &orig_val)
static bool isFlexbodyTweaked(TuneupDefPtr &tuneup_entry, FlexbodyID_t flexbody_id, TuneupFlexbodyTweak *&out_tweak)
static bool isCineCameraTweaked(TuneupDefPtr &tuneup_entry, CineCameraID_t cinecamid, TuneupCineCameraTweak *&out_tweak)
static std::vector< TuneupDefPtr > ParseTuneups(Ogre::DataStreamPtr &stream)
static std::string getTweakedManagedMatMedia(TuneupDefPtr &tuneup_def, const std::string &matname, int media_idx, const std::string &orig_val)
static bool isPropTweaked(TuneupDefPtr &tuneup_entry, PropID_t flexbody_id, TuneupPropTweak *&out_tweak)
static Ogre::Vector3 getTweakedNodePosition(TuneupDefPtr &tuneup_entry, NodeNum_t nodenum, Ogre::Vector3 orig_val)
static Ogre::Vector3 getTweakedFlexbodyRotation(TuneupDefPtr &tuneup_entry, FlexbodyID_t flexbody_id, Ogre::Vector3 orig_val)
static bool isFlexbodyAnyhowRemoved(TuneupDefPtr &tuneup_def, FlexbodyID_t flexbody_id)
static std::string getTweakedManagedMatType(TuneupDefPtr &tuneup_def, const std::string &matname, const std::string &orig_val)
static WheelSide getTweakedWheelSide(TuneupDefPtr &tuneup_entry, WheelID_t wheel_id, WheelSide orig_val)
static bool isExhaustAnyhowRemoved(TuneupDefPtr &tuneup_def, ExhaustID_t exhaust_id)
static std::string getTweakedWheelMediaRG(TuneupDefPtr &tuneup_def, WheelID_t wheel_id, int media_idx, const std::string &orig_val)
static std::string getTweakedWheelMedia(TuneupDefPtr &tuneup_entry, WheelID_t wheel_id, int media_idx, const std::string &orig_val)
static const NodeNum_t NODENUM_INVALID
int CineCameraID_t
Index into Actor::ar_cinecam_node and Actor::ar_camera_node_* arrays; use RoR::CINECAMERAID_INVALID a...
WheelSide
Used by rig-def/addonpart/tuneup formats to specify wheel rim mesh orientation.
VideoCamRole
int WheelID_t
Index to Actor::ar_wheels, use RoR::WHEELID_INVALID as empty value.
static const WheelID_t WHEELID_INVALID
static const CineCameraID_t CINECAMERAID_INVALID
int VideoCameraID_t
Index into GfxActor::m_videocameras, use RoR::VIDEOCAMERAID_INVALID as empty value.
int PropID_t
Index to GfxActor::m_props, use RoR::PROPID_INVALID as empty value.
int FlareID_t
Index into Actor::ar_flares, use RoR::FLAREID_INVALID as empty value.
int ExhaustID_t
Index into GfxActor::m_exhausts, use RoR::EXHAUSTID_INVALID as empty value.
int FlexbodyID_t
Index to GfxActor::m_flexbodies, use RoR::FLEXBODYID_INVALID as empty value.
CacheCategoryId
@ CID_None
uint16_t NodeNum_t
Node position within Actor::ar_nodes; use RoR::NODENUM_INVALID as empty value.
static const PropID_t PROPID_INVALID
const size_t TUNEUP_BUF_SIZE
static const FlexbodyID_t FLEXBODYID_INVALID
< Data of 'addonpart_tweak_cinecam <cinecam ID> <posX> <posY> <posZ>'
CineCameraID_t tct_cinecam_id
Arg#1, required.
Ogre::Vector3 tct_pos
Args#234, required.
std::string tct_origin
Addonpart filename.
Dual purpose:
std::string description
std::string filename
target vehicle filename
bool isFlexbodyUnwanted(FlexbodyID_t flexbodyid)
bool isManagedMatUnwanted(const std::string &matname)
std::set< WheelID_t > protected_wheels
Wheels that cannot be altered via 'addonpart_tweak_wheel'.
bool isVideoCameraRoleForced(VideoCameraID_t camera_id, VideoCamRole &out_val) const
std::string thumbnail
std::set< FlareID_t > protected_flares
Flares which cannot be altered via 'addonpart_unwanted_flare' directive.
std::map< WheelID_t, TuneupWheelTweak > wheel_tweaks
Mesh name and radius overrides via 'addonpart_tweak_wheel'.
std::set< std::string > protected_managedmats
Managed materials which cannot be altered via 'addonpart_tweak_managedmaterial' directive.
bool isFlexbodyProtected(FlexbodyID_t flexbodyid) const
bool isPropProtected(PropID_t propid) const
bool isFlareUnwanted(FlareID_t flareid)
std::set< ExhaustID_t > protected_exhausts
Exhausts which cannot be altered via 'addonpart_unwanted_exhaust' directive.
std::set< NodeNum_t > protected_nodes
Nodes that cannot be altered via 'addonpart_tweak_node'.
std::set< PropID_t > unwanted_props
'addonpart_unwanted_prop' directives.
bool isPropForceRemoved(PropID_t propid)
std::set< ExhaustID_t > unwanted_exhausts
'addonpart_unwanted_exhaust' directives.
std::set< FlexbodyID_t > unwanted_flexbodies
'addonpart_unwanted_flexbody' directives.
std::map< VideoCameraID_t, VideoCamRole > force_video_cam_roles
UI overrides.
std::set< FlexbodyID_t > protected_flexbodies
Flexbodies which cannot be altered via 'addonpart_tweak_flexbody' or 'addonpart_unwanted_flexbody' di...
std::map< PropID_t, TuneupPropTweak > prop_tweaks
Mesh name(s), offset and rotation overrides via 'addonpart_tweak_prop'.
std::set< std::string > force_remove_managedmats
User unticked an UI checkbox in Tuning menu, section Managed Materials.
bool isCineCameraProtected(CineCameraID_t cinecamid) const
TuneupDefPtr clone()
std::set< FlareID_t > unwanted_flares
'addonpart_unwanted_flare' directives.
bool isPropUnwanted(PropID_t propid)
bool isWheelSideForced(WheelID_t wheelid, WheelSide &out_val) const
std::map< NodeNum_t, TuneupNodeTweak > node_tweaks
Node position overrides via 'addonpart_tweak_node'.
std::set< std::string > use_addonparts
Addonpart filenames.
bool isFlexbodyForceRemoved(FlexbodyID_t flexbodyid)
bool isFlareForceRemoved(FlareID_t flareid)
std::set< ExhaustID_t > force_remove_exhausts
User unticked an UI checkbox in Tuning menu, section Exhausts.
bool isManagedMatForceRemoved(const std::string &matname)
std::map< FlexbodyID_t, TuneupFlexbodyTweak > flexbody_tweaks
Mesh name, offset and rotation overrides via 'addonpart_tweak_flexbody'.
std::set< std::string > unwanted_managedmats
'addonpart_unwanted_managedmaterial' directives.
bool isWheelProtected(WheelID_t wheelid) const
bool isManagedMatProtected(const std::string &matname) const
CacheCategoryId category_id
std::set< PropID_t > force_remove_props
UI overrides.
bool isExhaustUnwanted(ExhaustID_t exhaustid)
bool isExhaustProtected(ExhaustID_t exhaustid) const
std::map< CineCameraID_t, TuneupCineCameraTweak > cinecam_tweaks
Cinecam position overrides via 'addonpart_tweak_cinecam'.
std::set< FlareID_t > force_remove_flares
User unticked an UI checkbox in Tuning menu, section Flares.
bool isExhaustForceRemoved(ExhaustID_t exhaustid)
std::map< std::string, TuneupManagedMatTweak > managedmat_tweaks
Managed material overrides via 'addonpart_tweak_managedmaterial'.
std::set< PropID_t > protected_props
Props which cannot be altered via 'addonpart_tweak_prop' or 'addonpart_unwanted_prop' directive.
std::set< CineCameraID_t > protected_cinecams
Cinecams that cannot be altered via 'addonpart_tweak_cinecam'.
std::string guid
target vehicle GUID
bool isNodeProtected(NodeNum_t nodenum) const
std::set< FlexbodyID_t > force_remove_flexbodies
UI overrides.
std::string author_name
std::map< WheelID_t, WheelSide > force_wheel_sides
UI overrides.
bool isFlareProtected(FlareID_t flareid) const
< Data of 'addonpart_tweak_flexbody <flexbody ID> <offsetX> <offsetY> <offsetZ> <rotX> <rotY> <rotZ> ...
std::string tft_origin
Addonpart filename.
< Data of 'addonpart_tweak_managedmaterial <name> <type> <media1> <media2> [<media3>]'
std::string tmt_name
Arg#1, required.
std::string tmt_type
Arg#2, required.
std::string tmt_origin
Addonpart filename.
std::array< std::string, 3 > tmt_media
Arg#3, required, Arg#4, optional, Arg#5, optional.
< Data of 'addonpart_tweak_node <nodenum> <posX> <posY> <posZ>'
std::string tnt_origin
Addonpart filename.
NodeNum_t tnt_nodenum
Arg#1, required.
Ogre::Vector3 tnt_pos
Args#234, required.
< Data of 'addonpart_tweak_prop <prop ID> <offsetX> <offsetY> <offsetZ> <rotX> <rotY> <rotZ> <media1>...
std::string tpt_origin
Addonpart filename.
Ogre::Vector3 tpt_rotation
std::array< std::string, 2 > tpt_media
Media1 = prop mesh; Media2: Steering wheel mesh or beacon flare material.
< Data of 'addonpart_tweak_wheel <wheel ID> <media1> <media2> <side flag> <tire radius> <rim radius>'
WheelSide twt_side
Arg#4, optional, default LEFT (Only applicable to mesh/flexbody wheels)
float twt_tire_radius
Arg#5, optional.
std::array< std::string, 2 > twt_media
twt_media[0] Arg#2, required ('wheels[2]': face material, 'meshwheels[2]/flexbodywheels': rim mesh) t...
std::string twt_origin
Addonpart filename.
WheelID_t twt_wheel_id
Arg#1, required.
float twt_rim_radius
Arg#6, optional, only applies to some wheel types.