1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-11-08 20:02:41 +01:00
openrw/rwengine/include/engine/GameWorld.hpp

302 lines
6.2 KiB
C++
Raw Normal View History

#pragma once
2013-12-20 17:02:46 +01:00
#ifndef _GAMEWORLD_HPP_
#define _GAMEWORLD_HPP_
2015-03-30 03:45:58 +02:00
class Logger;
2015-04-18 02:11:17 +02:00
#include <GL/glew.h>
class GameData;
class GameState;
2014-07-25 04:30:44 +02:00
2014-06-06 18:04:00 +02:00
#include <ai/AIGraphNode.hpp>
#include <ai/AIGraph.hpp>
2015-02-04 18:16:46 +01:00
#include <audio/SoundManager.hpp>
class CutsceneObject;
2014-06-06 13:18:32 +02:00
class WorkContext;
2015-04-29 22:03:53 +02:00
#include <objects/ObjectTypes.hpp>
2014-06-06 13:18:32 +02:00
class GameObject;
2014-06-06 16:22:26 +02:00
class CharacterObject;
class InstanceObject;
class VehicleObject;
2013-09-09 01:18:36 +02:00
#include <render/VisualFX.hpp>
2015-04-18 02:11:17 +02:00
#include <data/ObjectData.hpp>
struct WeaponScan;
2013-07-02 08:06:03 +02:00
#include <glm/glm.hpp>
#include <btBulletDynamicsCommon.h>
#include <btBulletCollisionCommon.h>
#include <vector>
#include <set>
#include <random>
#include <array>
/**
* Information about "Goal" locations so they can be rendered
* (this doesn't really belong here).
*/
struct AreaIndicatorInfo
{
enum AreaIndicatorType
{
Cylinder
};
AreaIndicatorType type;
glm::vec3 position;
glm::vec3 radius;
};
2013-07-02 08:06:03 +02:00
/**
* @brief Handles all data relating to object instances and other "worldly" state.
2013-07-02 08:06:03 +02:00
*/
2013-12-20 17:02:46 +01:00
class GameWorld
2013-07-02 08:06:03 +02:00
{
public:
GameWorld(Logger* log, WorkContext* work, GameData* dat);
2014-06-06 13:18:32 +02:00
~GameWorld();
2015-03-30 03:03:38 +02:00
2015-03-30 03:45:58 +02:00
Logger* logger;
2015-03-30 03:03:38 +02:00
2013-07-02 08:06:03 +02:00
/**
* Loads an IPL into the game.
* @param name The name of the IPL as it appears in the games' gta.dat
*/
2013-07-02 14:49:20 +02:00
bool placeItems(const std::string& name);
2013-07-02 08:06:03 +02:00
void createTraffic(const glm::vec3& near);
void cleanupTraffic(const glm::vec3& focus);
/**
* Creates an instance
*/
2014-06-06 16:22:26 +02:00
InstanceObject *createInstance(const uint16_t id, const glm::vec3& pos, const glm::quat& rot = glm::quat());
/**
* @brief Creates an InstanceObject for use in the current Cutscene.
*/
CutsceneObject *createCutsceneObject(const uint16_t id, const glm::vec3& pos, const glm::quat& rot = glm::quat());
/**
* Creates a vehicle
*/
VehicleObject *createVehicle(const uint16_t id, const glm::vec3& pos, const glm::quat& rot = glm::quat(), GameObjectID gid = 0);
/**
* Creates a pedestrian.
*/
CharacterObject* createPedestrian(const uint16_t id, const glm::vec3& pos, const glm::quat& rot = glm::quat(), GameObjectID gid = 0);
/**
* Creates a player
*/
CharacterObject* createPlayer(const glm::vec3& pos, const glm::quat& rot = glm::quat(), GameObjectID gid = 0);
2015-04-29 22:03:53 +02:00
/**
* Inserts the given game object into the world.
*/
void insertObject(GameObject* object);
/**
* Finds the GameObject with the given ID, if not found then nullptr.
*/
GameObject* findObject(GameObjectID id) const;
2013-12-12 03:55:31 +01:00
/**
* Destroys an existing Object
*/
void destroyObject(GameObject* object);
/**
* @brief Put an object on the deletion queue.
*/
void destroyObjectQueued(GameObject* object);
/**
* @brief Destroys all objects on the destruction queue.
*/
void destroyQueuedObjects();
/**
* Performs a weapon scan against things in the world
*/
2014-06-30 02:56:45 +02:00
void doWeaponScan(const WeaponScan &scan );
/**
* Allocates a new VisualFX of the given type
*/
VisualFX* createEffect(VisualFX::EffectType type);
2013-12-12 03:55:31 +01:00
/**
* Immediately destoys the given effect
*/
void destroyEffect(VisualFX* effect);
2013-12-27 23:57:11 +01:00
/**
* Returns the current hour
*/
int getHour();
2013-12-27 23:57:11 +01:00
/**
* Returns the current minute
*/
int getMinute();
glm::vec3 getGroundAtPosition(const glm::vec3& pos) const;
float getGameTime() const;
2013-07-02 08:06:03 +02:00
/**
* Game data
*/
2015-04-18 02:11:17 +02:00
GameData* data;
2014-07-25 04:30:44 +02:00
/**
* Gameplay state
*/
GameState* state;
2013-07-02 09:53:23 +02:00
2015-02-04 18:16:46 +01:00
/**
* State of playing sounds
*/
SoundManager sound;
2013-07-02 14:49:20 +02:00
/**
2015-04-29 22:03:53 +02:00
* The active GameObjects within the world, mapped to their allocated ID
2013-07-02 14:49:20 +02:00
*/
2015-04-29 22:03:53 +02:00
std::map<GameObjectID, GameObject*> objects;
std::set<GameObject*> characters;
/**
* Stores objects within a grid cell, and their maximum
* bounding radius
*/
struct GridCell
{
/**
* Static instances within this grid cell
*/
std::set<GameObject*> instances;
float boundingRadius = 0.f;
};
std::array<GridCell, WORLD_GRID_CELLS> worldGrid;
/**
* returns true if the given object should be stored
* within the grid
*/
bool shouldBeOnGrid(GameObject* object);
void addToGrid(GameObject* object);
/**
* Returns the grid coordinates for a world coordinates
*/
glm::ivec2 worldToGrid(const glm::vec2& world);
2013-08-16 01:05:41 +02:00
/**
* Map of Model Names to Instances
*/
std::map<std::string, InstanceObject*> modelInstances;
2013-07-02 14:49:20 +02:00
2013-09-21 04:27:33 +02:00
/**
* AI Graph
*/
AIGraph aigraph;
/**
* Visual Effects
* @todo Consider using lighter handing mechanism
*/
std::vector<VisualFX*> effects;
2013-07-30 17:59:44 +02:00
/**
* Randomness Engine
*/
std::default_random_engine randomEngine;
/**
* Bullet
*/
btDefaultCollisionConfiguration* collisionConfig;
btCollisionDispatcher* collisionDispatcher;
btBroadphaseInterface* broadphase;
btSequentialImpulseConstraintSolver* solver;
btDiscreteDynamicsWorld* dynamicsWorld;
2014-06-06 13:18:32 +02:00
2014-06-11 22:00:53 +02:00
/**
2014-06-16 02:29:36 +02:00
* @brief physicsNearCallback
* Used to implement uprooting and other physics oddities.
2014-06-11 22:00:53 +02:00
*/
2014-06-16 02:29:36 +02:00
static bool ContactProcessedCallback(btManifoldPoint& mp, void* body0, void* body1);
/**
* @brief PhysicsTickCallback updates object each physics tick.
* @param physWorld
* @param timeStep
*/
static void PhysicsTickCallback(btDynamicsWorld* physWorld, btScalar timeStep);
2014-06-11 22:00:53 +02:00
2014-06-06 13:18:32 +02:00
/**
* Work related
*/
WorkContext* _work;
/**
* @brief Loads and starts the named cutscene.
* @param name
*/
void loadCutscene(const std::string& name);
void startCutscene();
void clearCutscene();
2015-01-25 19:42:29 +01:00
bool isCutsceneDone();
sf::SoundStream* cutsceneAudio;
bool cutsceneAudioLoaded;
sf::SoundBuffer* missionAudio;
2014-12-17 01:39:52 +01:00
sf::Sound missionSound;
/**
* @brief loads a model into a special character slot.
*/
void loadSpecialCharacter(const unsigned short index, const std::string& name);
void loadSpecialModel(const unsigned short index, const std::string& name);
void disableAIPaths(AIGraphNode::NodeType type, const glm::vec3& min, const glm::vec3& max);
void enableAIPaths(AIGraphNode::NodeType type, const glm::vec3& min, const glm::vec3& max);
void drawAreaIndicator(AreaIndicatorInfo::AreaIndicatorType type, glm::vec3 position, glm::vec3 radius);
const std::vector<AreaIndicatorInfo>& getAreaIndicators() const { return areaIndicators; }
void clearTickData();
2015-02-04 18:16:46 +01:00
void setPaused(bool pause);
bool isPaused() const;
private:
/**
* @brief Used by objects to delete themselves during updates.
*/
std::set<GameObject*> deletionQueue;
std::vector<AreaIndicatorInfo> areaIndicators;
2015-02-04 18:16:46 +01:00
/**
* Flag for pausing the simulation
*/
bool paused;
2013-07-02 08:06:03 +02:00
};
#endif