Skip to content

Commit

Permalink
AngelScript: procedural road bindings + docs.
Browse files Browse the repository at this point in the history
CODECHANGES:
* new file ProceduralRoadAngelscript.cpp - binds procedural_point, ProceduralRoadClass, ProceduralObjectClass, ProceduralManagerClass
* ProceduralRoad.h/cpp - added strong enums RoadType and TextureFit - extracted from class ProceduralRoad
* TerrainAngelscript.cpp - added getter for procedural manager.
* TObjFileFormat: accomodated new pointer type.
  • Loading branch information
ohlidalp committed Aug 7, 2022
1 parent 6a7fe0e commit b5b4c2c
Show file tree
Hide file tree
Showing 17 changed files with 533 additions and 146 deletions.
37 changes: 37 additions & 0 deletions doc/angelscript/Script2Game/ProceduralManagerClass.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@

namespace Script2Game {

/** \addtogroup ScriptSideAPIs
* @{
*/

/** \addtogroup Script2Game
* @{
*/

/**
* @brief Binding of RoR::ProceduralManager; generates dynamic roads for terrain.
* @note Obtain the object using `game.getTerrain().getProceduralManager()`.
*/
class ProceduralManagerClass
{
public:
/**
* Generates road mesh and adds to internal list
*/
void addObject(ProceduralObjectClass @po);

/**
* Clears road mesh and removes from internal list
*/
void removeObject(ProceduralObjectClass @po);

int getNumObjects();

ProceduralObjectClass@ getObject(int pos);
};

/// @} //addtogroup Script2Game
/// @} //addtogroup ScriptSideAPIs

} //namespace Script2Game
58 changes: 58 additions & 0 deletions doc/angelscript/Script2Game/ProceduralObjectClass.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@

namespace Script2Game {

/** \addtogroup ScriptSideAPIs
* @{
*/

/** \addtogroup Script2Game
* @{
*/

/**
* @brief Binding of RoR::ProceduralPoint;
*/
*/
struct procedural_point
{
public:
vector3 position;
quaternion rotation;
float width;
float border_width;
float border_height;
RoadType type;
int pillar_type;
}

/**
* @brief Binding of RoR::ProceduralObject; a spline for generating dynamic roads.
* @note Obtain the object using `game.getTerrain().getProceduralManager()`.
*/
class ProceduralObjectClass
{
public:
/**
* Name of the road/street this spline represents.
*/
string name;

/**
* Adds point at the end.
*/
void addPoint(procedural_point);

/**
* Adds point before the element at the specified position.
*/
void insertPoint(int pos, procedural_point);
void deletePoint(int pos);
procedural_point getPoint(int pos);
int getNumPoints();
ProceduralRoadClass @getRoad();
};

/// @} //addtogroup Script2Game
/// @} //addtogroup ScriptSideAPIs

} //namespace Script2Game
75 changes: 75 additions & 0 deletions doc/angelscript/Script2Game/ProceduralRoadClass.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@

namespace Script2Game {

/** \addtogroup ScriptSideAPIs
* @{
*/

/** \addtogroup Script2Game
* @{
*/

enum RoadType
{
ROAD_AUTOMATIC,
ROAD_FLAT,
ROAD_LEFT,
ROAD_RIGHT,
ROAD_BOTH,
ROAD_BRIDGE,
ROAD_MONORAIL
};

enum TextureFit
{
TEXFIT_NONE,
TEXFIT_BRICKWALL,
TEXFIT_ROADS1,
TEXFIT_ROADS2,
TEXFIT_ROAD,
TEXFIT_ROADS3,
TEXFIT_ROADS4,
TEXFIT_CONCRETEWALL,
TEXFIT_CONCRETEWALLI,
TEXFIT_CONCRETETOP,
TEXFIT_CONCRETEUNDER
};

/**
* @brief Binding of RoR::ProceduralRoad; a dynamically generated road mesh.
* @note For internal use by ProceduralManagerClass - do not use unless you know what you're doing!
*/
*/
class ProceduralRoadClass
{
public:
/**
* For internal use by ProceduralManagerClass - do not use unless you know what you're doing!
*/
void addBlock(vector3 pos, quaternion rot, RoadType type, float width, float border_width, float border_height, int pillar_type = 1);
/**
* For internal use by ProceduralManagerClass - do not use unless you know what you're doing!
*/
void addQuad(vector3 p1, vector3 p2, vector3 p3, vector3 p4, TextureFit texfit, vector3 pos, vector3 lastpos, float width, bool flip = false);
/**
* For internal use by ProceduralManagerClass - do not use unless you know what you're doing!
*/
void addCollisionQuad(vector3 p1, vector3 p2, vector3 p3, vector3 p4, string const&in gm_name, bool flip = false);
/**
* For internal use by ProceduralManagerClass - do not use unless you know what you're doing!
*/
void createMesh();
/**
* For internal use by ProceduralManagerClass - do not use unless you know what you're doing!
*/
void finish();
/**
* For internal use by ProceduralManagerClass - do not use unless you know what you're doing!
*/
void setCollisionEnabled(bool v);
};

/// @} //addtogroup Script2Game
/// @} //addtogroup ScriptSideAPIs

} //namespace Script2Game
2 changes: 2 additions & 0 deletions doc/angelscript/Script2Game/TerrainClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class TerrainClass
* @return Player spawn position when entering game.
*/
vector3 getSpawnPos();

ProceduralManagerClass @getProceduralManager();
};

/// @} //addtogroup Script2Game
Expand Down
1 change: 1 addition & 0 deletions source/main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ if (USE_ANGELSCRIPT)
scripting/bindings/InputEngineAngelscript.cpp
scripting/bindings/LocalStorageAngelscript.cpp
scripting/bindings/OgreAngelscript.cpp
scripting/bindings/ProceduralRoadAngelscript.cpp
scripting/bindings/ScriptEventsAngelscript.cpp
scripting/bindings/TerrainAngelscript.cpp
scripting/bindings/VehicleAiAngelscript.cpp
Expand Down
32 changes: 16 additions & 16 deletions source/main/resources/tobj_fileformat/TObjFileFormat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ bool TObjParser::ProcessCurrentLine()
}
if (strncmp("begin_procedural_roads", m_cur_line, 22) == 0)
{
m_cur_procedural_obj = ProceduralObject(); // Hard reset, discarding last "non-procedural" road strip. For backwards compatibility. ~ Petr Ohlidal, 08/2020
m_cur_procedural_obj = new ProceduralObject(); // Hard reset, discarding last "non-procedural" road strip. For backwards compatibility. ~ Petr Ohlidal, 08/2020
m_in_procedural_road = true;
m_road2_use_old_mode = true;
return true;
Expand All @@ -117,7 +117,7 @@ bool TObjParser::ProcessCurrentLine()
if (m_road2_use_old_mode)
{
m_def->proc_objects.push_back(m_cur_procedural_obj);
m_cur_procedural_obj = ProceduralObject();
m_cur_procedural_obj = new ProceduralObject();
}
m_in_procedural_road = false;
return true;
Expand Down Expand Up @@ -196,17 +196,17 @@ void TObjParser::ProcessProceduralLine()

point.rotation = this->CalcRotation(rot);

if (obj_name == "flat" ) { point.type = ProceduralRoad::ROAD_FLAT; }
else if (obj_name == "left" ) { point.type = ProceduralRoad::ROAD_LEFT; }
else if (obj_name == "right" ) { point.type = ProceduralRoad::ROAD_RIGHT; }
else if (obj_name == "both" ) { point.type = ProceduralRoad::ROAD_BOTH; }
else if (obj_name == "bridge" ) { point.type = ProceduralRoad::ROAD_BRIDGE; point.pillartype = 1; }
else if (obj_name == "monorail" ) { point.type = ProceduralRoad::ROAD_MONORAIL; point.pillartype = 2; }
else if (obj_name == "monorail2" ) { point.type = ProceduralRoad::ROAD_MONORAIL; point.pillartype = 0; }
else if (obj_name == "bridge_no_pillars") { point.type = ProceduralRoad::ROAD_BRIDGE; point.pillartype = 0; }
else { point.type = ProceduralRoad::ROAD_AUTOMATIC; point.pillartype = 0; }

m_cur_procedural_obj.points.push_back(point);
if (obj_name == "flat" ) { point.type = RoadType::ROAD_FLAT; }
else if (obj_name == "left" ) { point.type = RoadType::ROAD_LEFT; }
else if (obj_name == "right" ) { point.type = RoadType::ROAD_RIGHT; }
else if (obj_name == "both" ) { point.type = RoadType::ROAD_BOTH; }
else if (obj_name == "bridge" ) { point.type = RoadType::ROAD_BRIDGE; point.pillartype = 1; }
else if (obj_name == "monorail" ) { point.type = RoadType::ROAD_MONORAIL; point.pillartype = 2; }
else if (obj_name == "monorail2" ) { point.type = RoadType::ROAD_MONORAIL; point.pillartype = 0; }
else if (obj_name == "bridge_no_pillars") { point.type = RoadType::ROAD_BRIDGE; point.pillartype = 0; }
else { point.type = RoadType::ROAD_AUTOMATIC; point.pillartype = 0; }

m_cur_procedural_obj->points.push_back(point);
}

void TObjParser::ProcessGridLine()
Expand Down Expand Up @@ -294,7 +294,7 @@ void TObjParser::ProcessRoadObject(const TObjEntry& object)

// finish it and start new object
m_def->proc_objects.push_back(m_cur_procedural_obj);
m_cur_procedural_obj = ProceduralObject();
m_cur_procedural_obj = new ProceduralObject();
}
m_road2_use_old_mode = true;

Expand All @@ -320,10 +320,10 @@ void TObjParser::ImportProceduralPoint(Ogre::Vector3 const& pos, Ogre::Vector3 c
pp.pillartype = (int)(special != TObj::SpecialObject::ROAD_BRIDGE_NO_PILLARS);
pp.position = pos;
pp.rotation = this->CalcRotation(rot);
pp.type = (special == TObj::SpecialObject::ROAD) ? ProceduralRoad::ROAD_FLAT : ProceduralRoad::ROAD_AUTOMATIC;
pp.type = (special == TObj::SpecialObject::ROAD) ? RoadType::ROAD_FLAT : RoadType::ROAD_AUTOMATIC;
pp.width = 8;

m_cur_procedural_obj.points.push_back(pp);
m_cur_procedural_obj->points.push_back(pp);
}

Ogre::Quaternion TObjParser::CalcRotation(Ogre::Vector3 const& rot) const
Expand Down
4 changes: 2 additions & 2 deletions source/main/resources/tobj_fileformat/TObjFileFormat.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ struct TObjFile
std::vector<TObjGrass> grass;
std::vector<TObjVehicle> vehicles;
std::vector<TObjEntry> objects;
std::vector<ProceduralObject> proc_objects;
std::vector<ProceduralObjectPtr> proc_objects;
};

// -----------------------------------------------------------------------------
Expand Down Expand Up @@ -197,7 +197,7 @@ class TObjParser
bool m_road2_use_old_mode; // Old parser: 'int r2oldmode'
Ogre::Vector3 m_road2_last_pos;
Ogre::Vector3 m_road2_last_rot;
ProceduralObject m_cur_procedural_obj;
ProceduralObjectPtr m_cur_procedural_obj;
};

} // namespace RoR
1 change: 1 addition & 0 deletions source/main/scripting/ScriptEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ void ScriptEngine::init()
RegisterVehicleAi(engine); // VehicleAIClass, aiEvents, AiValues
RegisterConsole(engine); // ConsoleClass, CVarClass, CVarFlags
RegisterActor(engine); // BeamClass
RegisterProceduralRoad(engine);// procedural_point, ProceduralRoadClass, ProceduralObjectClass, ProceduralManagerClass
RegisterTerrain(engine); // TerrainClass
RegisterGameScript(engine); // GameScriptClass
RegisterScriptEvents(engine); // scriptEvents
Expand Down
3 changes: 3 additions & 0 deletions source/main/scripting/bindings/AngelScriptBindings.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ void RegisterOgreObjects(AngelScript::asIScriptEngine* engine);
/// Registers RoR::Terrain, defined in TerrainAngelscript.cpp
void RegisterTerrain(AngelScript::asIScriptEngine* engine);

/// defined in ProceduralRoadAngelscript.cpp
void RegisterProceduralRoad(AngelScript::asIScriptEngine* engine);


/// @} //addtogroup Scripting

Expand Down
Loading

0 comments on commit b5b4c2c

Please sign in to comment.