30#pragma region ProceduralObject
34 if (pos >= 0 && pos < (
int)
points.size())
46 if (pos >= 0 && pos < (
int)
points.size())
54 if (pos >= 0 && pos < (
int)
points.size())
62#pragma region ProceduralManager
65 : pGroupingSceneNode(groupingSceneNode)
76 if (pos >= 0 && pos < (
int)
pObjects.size())
106 for (
size_t i = 0; i <
pObjects.size(); i++)
123 Ogre::SimpleSpline spline;
127 spline.setAutoCalculate(
false);
130 spline.addPoint(pp->position);
132 spline.recalcTangents();
135 for (
int i_point = 0; i_point < po->
getNumPoints(); i_point++)
143 for (
int i_seg = 1; i_seg <= num_segments; i_seg++)
147 po->
road->
addBlock(pp->position, pp->rotation, pp->type, pp->width, pp->bwidth, pp->bheight, pp->pillartype);
151 const float progress =
static_cast<float>(i_seg) /
static_cast<float>(num_segments);
154 const Ogre::Vector3 smooth_pos = spline.interpolate(i_point - 1, progress);
155 const Ogre::Quaternion smooth_rot = Quaternion::nlerp(progress, prev_pp->rotation, pp->rotation);
156 const float smooth_width = Math::lerp(prev_pp->width, pp->width, progress);
157 const float smooth_bwidth = Math::lerp(prev_pp->bwidth, pp->bwidth, progress);
158 const float smooth_bheight = Math::lerp(prev_pp->bheight, pp->bheight, progress);
160 po->
road->
addBlock(smooth_pos, smooth_rot, pp->type, smooth_width, smooth_bwidth, smooth_bheight, pp->pillartype);
167 po->
road->
addBlock(pp->position, pp->rotation, pp->type, pp->width, pp->bwidth, pp->bheight, pp->pillartype);
181 Log(
"[RoR] Procedural road diagnostic.\n"
182 " types: 0=ROAD_AUTOMATIC, 1=ROAD_FLAT, 2=ROAD_LEFT, 3=ROAD_RIGHT, 4=ROAD_BOTH, 5=ROAD_BRIDGE, 6=ROAD_MONORAIL\n"
183 " pillartypes: 0=none, 1=road bridge, 2=monorail");
184 for (
int i=0; i< (int)
pObjects.size(); ++i)
186 LogFormat(
"~~~~~~ ProceduralObject %d ~~~~~~", i);
188 for (
int j = 0; j<(int)po->
points.size(); ++j)
191 LogFormat(
"\t Point [%d] posXYZ %f %f %f, type %d, width %f, bwidth %f, bheight %f, pillartype %i",
192 j, pp->position.x, pp->position.y, pp->position.z,
193 pp->type, pp->width, pp->bwidth, pp->bheight, pp->pillartype);
Central state/object manager and communications hub.
void rebuildObjectMesh(ProceduralObjectPtr po)
Rebuilds the road mesh.
virtual ~ProceduralManager() override
void deleteObjectMesh(ProceduralObjectPtr po)
Deletes the road mesh.
void addObject(ProceduralObjectPtr po)
Generates road mesh and adds to internal list.
ProceduralManager(Ogre::SceneNode *groupingSceneNode)
void removeObject(ProceduralObjectPtr po)
Clears road mesh and removes from internal list.
Ogre::SceneNode * pGroupingSceneNode
ProceduralObjectPtr getObject(int pos)
std::vector< ProceduralObjectPtr > pObjects
void setCollisionEnabled(bool v)
Must be set before any quads are added. Default: true.
void finish(Ogre::SceneNode *snode, const std::string &materialName="")
If materialName is empty, the default material will be used.
void addBlock(Ogre::Vector3 pos, Ogre::Quaternion rot, RoadType type, float width, float bwidth, float bheight, int pillartype=1)
RefCountingObjectPtr< ProceduralObject > ProceduralObjectPtr
RefCountingObjectPtr< ProceduralRoad > ProceduralRoadPtr
RefCountingObjectPtr< ProceduralPoint > ProceduralPointPtr
void LogFormat(const char *format,...)
Improved logging utility. Uses fixed 2Kb buffer.
std::string custom_groundmodel
If empty, the default ground model ("asphalt" for roads, "concrete" for others) is used for collision...
ProceduralPointPtr getPoint(int pos)
bool collision_enabled
Generate collision triangles?
std::vector< ProceduralPointPtr > points
void insertPoint(int pos, ProceduralPointPtr p)
void deletePoint(int pos)
std::string custom_material
If empty, the default material is used.