RigsofRods
Soft-body Physics Simulation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
TObjFileFormat.h
Go to the documentation of this file.
1 /*
2  This source file is part of Rigs of Rods
3  Copyright 2016-2017 Petr Ohlidal
4 
5  For more information, see http://www.rigsofrods.org/
6 
7  Rigs of Rods is free software: you can redistribute it and/or modify
8  it under the terms of the GNU General Public License version 3, as
9  published by the Free Software Foundation.
10 
11  Rigs of Rods is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #pragma once
21 
25 
26 #include "Collisions.h"
27 #include "ForwardDeclarations.h"
28 
29 #include <Ogre.h>
30 
31 #include <memory>
32 
33 namespace RoR {
34 
35 namespace TObj {
36 
37  const int STR_LEN = 300;
38  const int LINE_BUF_LEN = 4000;
39 
40  void WriteToStream(TObjDocumentPtr doc, Ogre::DataStreamPtr stream);
41 
42 } // namespace TObj
43 
44 // -----------------------------------------------------------------------------
45 struct TObjTree
46 {
48  yaw_from(0.f), yaw_to(0.f),
49  scale_from(0.f), scale_to(0.f),
50  min_distance(90), max_distance(700),
51  high_density(1.f),
52  grid_spacing(0.f)
53  {
54  tree_mesh [0] = '\0';
55  color_map [0] = '\0';
56  density_map [0] = '\0';
57  collision_mesh[0] = '\0';
58  }
59 
60  float yaw_from, yaw_to;
63  float high_density;
64  float grid_spacing;
65 
70 };
71 
72 // -----------------------------------------------------------------------------
74 struct TObjGrass
75 {
77  range(80),
78  technique(1), // GRASSTECH_CROSSQUADS
79  grow_techniq(0),
80  sway_speed(0.5f),
81  sway_length(0.05f),
82  sway_distrib(10.f),
83 
84  min_x(0.2f), min_y(0.2f), min_h(-9999.f),
85  max_x(1.0f), max_y(0.6f), max_h(+9999.f)
86  {
87  material_name [0] = '\0';
88  color_map_filename [0] = '\0';
89  density_map_filename [0] = '\0';
90  }
91 
92  int range;
93  int technique;
95  float sway_speed;
96  float sway_length;
97  float sway_distrib;
98  float density;
99 
100  float min_x, min_y, min_h;
101  float max_x, max_y, max_h;
102 
106 };
107 
108 // -----------------------------------------------------------------------------
110 {
111  Ogre::Vector3 position;
112  Ogre::Quaternion rotation;
113  Ogre::Vector3 tobj_rotation;
116  std::string comments;
117 };
118 
119 // -----------------------------------------------------------------------------
120 struct TObjEntry
121 {
122  TObjEntry() {};
123  TObjEntry(
124  Ogre::Vector3 pos, Ogre::Vector3 rot, const char* instance_name,
125  TObjSpecialObject special, const char* type, const char* name);
126 
127  bool IsActor() const;
128  bool IsRoad() const;
129 
130  Ogre::Vector3 position = Ogre::Vector3::ZERO;
131  Ogre::Vector3 rotation = Ogre::Vector3::ZERO;
133  char type[TObj::STR_LEN] = {};
136  float rendering_distance = 0.f; // 0 means 'always rendered', see https://ogrecave.github.io/ogre/api/1.11/class_ogre_1_1_movable_object.html#afe1f2a1009e3f14f36e1bcc9b1b9557e
137  std::string comments;
138 };
139 
140 // -----------------------------------------------------------------------------
142 {
144  grid_position(),
145  grid_enabled(false)
146  {}
147 
148  std::string document_name;
149  Ogre::Vector3 grid_position;
151  bool rot_yxz;
152  std::vector<TObjTree> trees;
153  std::vector<TObjGrass> grass;
154  std::vector<TObjVehicle> vehicles;
155  std::vector<TObjEntry> objects;
156  std::vector<ProceduralObjectPtr> proc_objects;
157 };
158 
159 // -----------------------------------------------------------------------------
161 {
162 public:
163  void Prepare();
164  bool ProcessLine(const char* line);
165  void ProcessOgreStream(Ogre::DataStream* stream);
167 
168  static Ogre::Quaternion CalcRotation(Ogre::Vector3 const& rot, bool rot_yxz);
169 
170 private:
171  // Processing:
172  bool ProcessCurrentLine();
173  void ProcessProceduralLine();
174  void ProcessGridLine();
175  void ProcessTreesLine();
176  void ProcessGrassLine();
177  void ProcessActorObject(const TObjEntry& object);
178  void ProcessRoadObject(const TObjEntry& object);
179 
180  // Helpers:
181  void ImportProceduralPoint(Ogre::Vector3 const& pos, Ogre::Vector3 const& rot, TObjSpecialObject special);
182  bool ParseObjectLine(TObjEntry& object);
183  void FlushProceduralObject();
184 
186  std::string m_filename;
188  const char* m_cur_line;
189  const char* m_cur_line_trimmed;
192 
193  // Procedural roads
197 
198  // Auto-importing legacy road blocks (ODEF) as procedural roads
199  Ogre::Vector3 m_road2_last_pos;
200  Ogre::Vector3 m_road2_last_rot;
202 
203  bool m_rot_yxz;
204 };
205 
206 } // namespace RoR
RoR::TObjParser::ProcessLine
bool ProcessLine(const char *line)
Definition: TObjFileFormat.cpp:72
RoR::TObjVehicle::type
TObjSpecialObject type
Definition: TObjFileFormat.h:115
RoR::TObjParser::m_preceding_line_comments
std::string m_preceding_line_comments
Definition: TObjFileFormat.h:191
RoR::TObjParser::ProcessProceduralLine
void ProcessProceduralLine()
Definition: TObjFileFormat.cpp:246
ForwardDeclarations.h
Global forward declarations.
RoR::TObjGrass::density
float density
Definition: TObjFileFormat.h:98
RoR::TObjParser::ProcessActorObject
void ProcessActorObject(const TObjEntry &object)
Definition: TObjFileFormat.cpp:334
RoR::TObjGrass::min_y
float min_y
Definition: TObjFileFormat.h:100
RoR::TObjParser
Definition: TObjFileFormat.h:160
RoR::TObjGrass::range
int range
Definition: TObjFileFormat.h:92
RoR::TObjEntry::IsActor
bool IsActor() const
Definition: TObjFileFormat.cpp:48
RoR::TObjEntry::comments
std::string comments
Comment line(s) preceding the object-line in the .TOBJ file.
Definition: TObjFileFormat.h:137
RoR::TObjGrass::max_y
float max_y
Definition: TObjFileFormat.h:101
RoR::TObjParser::m_filename
std::string m_filename
Definition: TObjFileFormat.h:186
RoR::TObjVehicle::rotation
Ogre::Quaternion rotation
Definition: TObjFileFormat.h:112
RoR::TObjDocument::grid_enabled
bool grid_enabled
Definition: TObjFileFormat.h:150
RoR::TObjGrass::sway_distrib
float sway_distrib
Definition: TObjFileFormat.h:97
RoR::TObjParser::Prepare
void Prepare()
Definition: TObjFileFormat.cpp:58
RoR::TObjTree::yaw_to
float yaw_to
Definition: TObjFileFormat.h:60
RoR::TObjGrass::min_x
float min_x
Definition: TObjFileFormat.h:100
RoR::TObjSpecialObject
TObjSpecialObject
Definition: Application.h:557
RoR::TObjDocument::proc_objects
std::vector< ProceduralObjectPtr > proc_objects
Definition: TObjFileFormat.h:156
RoR::TObjEntry::rendering_distance
float rendering_distance
Definition: TObjFileFormat.h:136
RoR::TObjEntry::instance_name
char instance_name[TObj::STR_LEN]
Definition: TObjFileFormat.h:134
RoR::TObjDocument::grid_position
Ogre::Vector3 grid_position
Definition: TObjFileFormat.h:149
RoR::TObjParser::m_in_procedural_road
bool m_in_procedural_road
Definition: TObjFileFormat.h:194
RoR::TObjTree::min_distance
float min_distance
Definition: TObjFileFormat.h:62
RoR::TObjEntry::odef_name
char odef_name[TObj::STR_LEN]
Definition: TObjFileFormat.h:135
RoR::TObjGrass::material_name
char material_name[TObj::STR_LEN]
Definition: TObjFileFormat.h:103
RoR::TObj::LINE_BUF_LEN
const int LINE_BUF_LEN
Definition: TObjFileFormat.h:38
RefCountingObjectPtr< ProceduralObject >
RoR::TObjParser::ProcessCurrentLine
bool ProcessCurrentLine()
Definition: TObjFileFormat.cpp:104
RoR::TObjGrass::max_h
float max_h
Definition: TObjFileFormat.h:101
RoR::TObjDocument::trees
std::vector< TObjTree > trees
Definition: TObjFileFormat.h:152
RoR::TObjParser::Finalize
TObjDocumentPtr Finalize()
Passes ownership.
Definition: TObjFileFormat.cpp:211
RoR::TObjDocument::grass
std::vector< TObjGrass > grass
Definition: TObjFileFormat.h:153
RoR::TObjEntry::special
TObjSpecialObject special
Definition: TObjFileFormat.h:132
RoR::TObjParser::m_cur_procedural_obj_start_line
int m_cur_procedural_obj_start_line
Definition: TObjFileFormat.h:196
RoR::TObjTree::density_map
char density_map[TObj::STR_LEN]
Definition: TObjFileFormat.h:68
RoR::TObjParser::ProcessGridLine
void ProcessGridLine()
Definition: TObjFileFormat.cpp:274
RoR::TObjEntry
Definition: TObjFileFormat.h:120
RoR::TObjGrass::sway_length
float sway_length
Definition: TObjFileFormat.h:96
RoR::TObjEntry::rotation
Ogre::Vector3 rotation
Definition: TObjFileFormat.h:131
RoR::TObjParser::m_line_number
int m_line_number
Definition: TObjFileFormat.h:187
RoR::TObjParser::ParseObjectLine
bool ParseObjectLine(TObjEntry &object)
Definition: TObjFileFormat.cpp:412
RoR::TObjDocumentPtr
std::shared_ptr< TObjDocument > TObjDocumentPtr
Definition: ForwardDeclarations.h:222
RoR::TObjParser::ImportProceduralPoint
void ImportProceduralPoint(Ogre::Vector3 const &pos, Ogre::Vector3 const &rot, TObjSpecialObject special)
Definition: TObjFileFormat.cpp:375
RoR::TObjVehicle::tobj_rotation
Ogre::Vector3 tobj_rotation
Original rotation specified in .TOBJ file.
Definition: TObjFileFormat.h:113
RoR::TObjGrass::technique
int technique
Definition: TObjFileFormat.h:93
RoR::TObj::STR_LEN
const int STR_LEN
Definition: TObjFileFormat.h:37
RoR::TObjGrass::density_map_filename
char density_map_filename[TObj::STR_LEN]
Definition: TObjFileFormat.h:105
RoR::TObjParser::m_road2_num_blocks
int m_road2_num_blocks
Definition: TObjFileFormat.h:201
RoR::TObjParser::m_road2_last_rot
Ogre::Vector3 m_road2_last_rot
Definition: TObjFileFormat.h:200
RoR::TObjVehicle::position
Ogre::Vector3 position
Definition: TObjFileFormat.h:111
RoR::TObjDocument::vehicles
std::vector< TObjVehicle > vehicles
Definition: TObjFileFormat.h:154
RoR::TObjVehicle::comments
std::string comments
Comment line(s) preceding the vehicle-line in the .TOBJ file.
Definition: TObjFileFormat.h:116
RoR::TObjTree::tree_mesh
char tree_mesh[TObj::STR_LEN]
Definition: TObjFileFormat.h:66
RoR::TObjGrass::sway_speed
float sway_speed
Definition: TObjFileFormat.h:95
RoR::TObjEntry::type
char type[TObj::STR_LEN]
Definition: TObjFileFormat.h:133
RoR::TObjDocument
Definition: TObjFileFormat.h:141
RoR::TObjEntry::IsRoad
bool IsRoad() const
Definition: TObjFileFormat.cpp:43
RoR::TObjTree::scale_from
float scale_from
Definition: TObjFileFormat.h:61
RoR::TObjParser::m_def
TObjDocumentPtr m_def
Definition: TObjFileFormat.h:185
RoR::TObjParser::m_cur_procedural_obj
ProceduralObjectPtr m_cur_procedural_obj
Definition: TObjFileFormat.h:195
RoR::TObjTree::max_distance
float max_distance
Definition: TObjFileFormat.h:62
RoR::TObjParser::ProcessRoadObject
void ProcessRoadObject(const TObjEntry &object)
Definition: TObjFileFormat.cpp:346
RoR::TObjParser::CalcRotation
static Ogre::Quaternion CalcRotation(Ogre::Vector3 const &rot, bool rot_yxz)
Definition: TObjFileFormat.cpp:396
RoR::TObjParser::m_rot_yxz
bool m_rot_yxz
Definition: TObjFileFormat.h:203
RoR::TObjEntry::TObjEntry
TObjEntry()
Definition: TObjFileFormat.h:122
RoR::TObjParser::ProcessOgreStream
void ProcessOgreStream(Ogre::DataStream *stream)
Definition: TObjFileFormat.cpp:231
RoR::TObjTree::grid_spacing
float grid_spacing
Definition: TObjFileFormat.h:64
RoR::TObjTree::TObjTree
TObjTree()
Definition: TObjFileFormat.h:47
RoR::TObjParser::m_road2_last_pos
Ogre::Vector3 m_road2_last_pos
Definition: TObjFileFormat.h:199
RoR::TObjParser::m_cur_line
const char * m_cur_line
Definition: TObjFileFormat.h:188
RoR::TObj::WriteToStream
void WriteToStream(TObjDocumentPtr doc, Ogre::DataStreamPtr stream)
Definition: TObjFileFormat.cpp:475
RoR::TObjGrass::color_map_filename
char color_map_filename[TObj::STR_LEN]
Definition: TObjFileFormat.h:104
RoR::TObjTree::high_density
float high_density
Definition: TObjFileFormat.h:63
RoR::TObjVehicle::name
char name[TObj::STR_LEN]
Definition: TObjFileFormat.h:114
RoR::TObjGrass::max_x
float max_x
Definition: TObjFileFormat.h:101
RoR::TObjGrass
Unified 'grass' and 'grass2'.
Definition: TObjFileFormat.h:74
RoR::TObjParser::m_default_rendering_distance
float m_default_rendering_distance
Definition: TObjFileFormat.h:190
RoR::TObjGrass::grow_techniq
int grow_techniq
Definition: TObjFileFormat.h:94
RoR::TObjDocument::rot_yxz
bool rot_yxz
Definition: TObjFileFormat.h:151
RoR::TObjTree::color_map
char color_map[TObj::STR_LEN]
Definition: TObjFileFormat.h:67
RoR::TObjTree
Definition: TObjFileFormat.h:45
RoR::TObjTree::scale_to
float scale_to
Definition: TObjFileFormat.h:61
RoR::TObjSpecialObject::NONE
@ NONE
RoR::TObjEntry::position
Ogre::Vector3 position
Definition: TObjFileFormat.h:130
RoR::TObjVehicle
Definition: TObjFileFormat.h:109
RoR::TObjParser::ProcessTreesLine
void ProcessTreesLine()
Definition: TObjFileFormat.cpp:281
Collisions.h
RoR::TObjParser::FlushProceduralObject
void FlushProceduralObject()
Definition: TObjFileFormat.cpp:456
RoR::TObjGrass::min_h
float min_h
Definition: TObjFileFormat.h:100
RoR::TObjDocument::objects
std::vector< TObjEntry > objects
Definition: TObjFileFormat.h:155
RoR::TObjGrass::TObjGrass
TObjGrass()
Definition: TObjFileFormat.h:76
RoR::TObjDocument::TObjDocument
TObjDocument()
Definition: TObjFileFormat.h:143
RoR
Definition: AppContext.h:36
RoR::TObjParser::m_cur_line_trimmed
const char * m_cur_line_trimmed
Definition: TObjFileFormat.h:189
RoR::TObjDocument::document_name
std::string document_name
Definition: TObjFileFormat.h:148
RoR::TObjTree::collision_mesh
char collision_mesh[TObj::STR_LEN]
Definition: TObjFileFormat.h:69
RoR::TObjTree::yaw_from
float yaw_from
Definition: TObjFileFormat.h:60
RoR::TObjParser::ProcessGrassLine
void ProcessGrassLine()
Definition: TObjFileFormat.cpp:295