1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-15 15:02:34 +02:00

Remove Logger ownership from GameWorld

This commit is contained in:
Daniel Evans 2015-03-30 02:45:58 +01:00 committed by Daniel Evans
parent b280aac859
commit b672e41acf
11 changed files with 117 additions and 78 deletions

View File

@ -2,6 +2,8 @@
#ifndef _GAMEDATA_HPP_
#define _GAMEDATA_HPP_
class Logger;
#include <engine/RWTypes.hpp>
#include <loaders/LoaderIMG.hpp>
#include <loaders/TextureLoader.hpp>
@ -41,13 +43,15 @@ private:
std::string datpath;
std::string splash;
Logger* logger;
public:
/**
* ctor
* @param path Path to the root of the game data.
*/
GameData(const std::string& path = "");
GameData(Logger* log, const std::string& path = "");
~GameData();
GameWorld* engine;
@ -273,6 +277,11 @@ public:
float getWaveHeightAt(const glm::vec3& ws) const;
GameTexts texts;
/**
* Determines whether the given path is a valid game directory.
*/
static bool isValidGameDirectory(const std::string& path);
};
#endif

View File

@ -2,7 +2,7 @@
#ifndef _GAMEWORLD_HPP_
#define _GAMEWORLD_HPP_
#include <core/Logger.hpp>
class Logger;
#include <engine/GameData.hpp>
#include <engine/GameState.hpp>
@ -59,16 +59,11 @@ class GameWorld
{
public:
GameWorld(const std::string& gamepath);
GameWorld(Logger* log, const std::string& gamepath);
~GameWorld();
/**
* Loads the game data
*/
bool load();
Logger logger;
Logger* logger;
/**
* Loads an IDE into the game

View File

@ -1,6 +1,8 @@
#ifndef _GAMERENDERER_HPP_
#define _GAMERENDERER_HPP_
class Logger;
#define GLEW_STATIC
#include <GL/glew.h>
#include <memory>
@ -43,6 +45,9 @@ class GameRenderer
{
/** Pointer to the world instance */
GameWorld* engine;
/** Logger to output messages */
Logger* logger;
/** The low-level drawing interface to use */
Renderer* renderer;
@ -86,7 +91,7 @@ class GameRenderer
public:
GameRenderer(GameWorld*);
GameRenderer(Logger* log, GameWorld*);
~GameRenderer();
/** Number of culling events */

View File

@ -13,6 +13,7 @@
#include <loaders/GenericDATLoader.hpp>
#include <loaders/LoaderGXT.hpp>
#include <loaders/BackgroundLoader.hpp>
#include <core/Logger.hpp>
#include <iostream>
#include <fstream>
@ -79,10 +80,9 @@ std::string fixPath(std::string path) {
}
GameData::GameData(const std::string& path)
: datpath(path), engine(nullptr)
GameData::GameData(Logger* log, const std::string& path)
: datpath(path), logger(log), engine(nullptr)
{
}
GameData::~GameData()
@ -124,7 +124,7 @@ void GameData::parseDAT(const std::string& path)
if(!datfile.is_open())
{
engine->logger.error("Data", "Failed to open game file " + path);
logger->error("Data", "Failed to open game file " + path);
}
else
{
@ -221,12 +221,12 @@ bool GameData::loadZone(const std::string& path)
for(auto& z : ipll.zones) {
zones.insert({z.name, z});
}
engine->logger.info("Data", "Loaded " + std::to_string(ipll.zones.size()) + " zones from " + path);
logger->info("Data", "Loaded " + std::to_string(ipll.zones.size()) + " zones from " + path);
return true;
}
}
else {
engine->logger.error("Data", "Failed to load zones from " + path);
logger->error("Data", "Failed to load zones from " + path);
}
return false;
@ -491,7 +491,7 @@ bool GameData::loadAudioClip(const std::string& name)
if ( name.find(".mp3") != name.npos )
{
engine->logger.error("Data", "MP3 Audio unsupported outside cutscenes");
logger->error("Data", "MP3 Audio unsupported outside cutscenes");
return false;
}
@ -501,7 +501,7 @@ bool GameData::loadAudioClip(const std::string& name)
if (! r )
{
engine->logger.error("Data", "Error loading audio clip " + fname);
logger->error("Data", "Error loading audio clip " + fname);
delete engine->missionAudio;
engine->missionAudio = nullptr;
}
@ -524,7 +524,7 @@ FileHandle GameData::openFile(const std::string &name)
auto file = index.openFile(name);
if( file == nullptr )
{
engine->logger.error("Data", "Unable to open file: " + name);
logger->error("Data", "Unable to open file: " + name);
}
return file;
}
@ -559,3 +559,20 @@ float GameData::getWaveHeightAt(const glm::vec3 &ws) const
{
return (1+sin(engine->gameTime + (ws.x + ws.y) * WATER_SCALE)) * WATER_HEIGHT;
}
bool GameData::isValidGameDirectory(const std::string& path)
{
if(path.empty())
{
return false;
}
LoaderIMG i;
if(! i.load(path + "/models/gta3.img") )
{
return false;
}
return true;
}

View File

@ -1,4 +1,7 @@
#include <engine/GameWorld.hpp>
#include <core/Logger.hpp>
#include <loaders/LoaderIPL.hpp>
#include <loaders/LoaderIDE.hpp>
#include <ai/DefaultAIController.hpp>
@ -75,12 +78,22 @@ public:
}
};
GameWorld::GameWorld(const std::string& path)
: gameTime(0.f), gameData(path), randomEngine(rand()),
GameWorld::GameWorld(Logger* log, const std::string& path)
: logger(log), gameTime(0.f), gameData(log, path), randomEngine(rand()),
_work( new WorkContext( this ) ), script(nullptr), cutsceneAudio(nullptr), missionAudio(nullptr),
paused(false)
{
gameData.engine = this;
collisionConfig = new btDefaultCollisionConfiguration;
collisionDispatcher = new WorldCollisionDispatcher(collisionConfig);
broadphase = new btDbvtBroadphase();
solver = new btSequentialImpulseConstraintSolver;
dynamicsWorld = new btDiscreteDynamicsWorld(collisionDispatcher, broadphase, solver, collisionConfig);
dynamicsWorld->setGravity(btVector3(0.f, 0.f, -9.81f));
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
gContactProcessedCallback = ContactProcessedCallback;
dynamicsWorld->setInternalTickCallback(PhysicsTickCallback, this);
}
GameWorld::~GameWorld()
@ -100,23 +113,6 @@ GameWorld::~GameWorld()
/// @todo delete other things.
}
bool GameWorld::load()
{
collisionConfig = new btDefaultCollisionConfiguration;
collisionDispatcher = new WorldCollisionDispatcher(collisionConfig);
broadphase = new btDbvtBroadphase();
solver = new btSequentialImpulseConstraintSolver;
dynamicsWorld = new btDiscreteDynamicsWorld(collisionDispatcher, broadphase, solver, collisionConfig);
dynamicsWorld->setGravity(btVector3(0.f, 0.f, -9.81f));
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
gContactProcessedCallback = ContactProcessedCallback;
dynamicsWorld->setInternalTickCallback(PhysicsTickCallback, this);
gameData.load();
return true;
}
bool GameWorld::defineItems(const std::string& name)
{
auto i = gameData.ideLocations.find(name);
@ -142,7 +138,7 @@ bool GameWorld::defineItems(const std::string& name)
}
}
else {
logger.error("Data", "Failed to load IDE " + path);
logger->error("Data", "Failed to load IDE " + path);
}
return false;
@ -162,7 +158,7 @@ void GameWorld::runScript(const std::string &name)
script = new ScriptMachine(this, f, opcodes);
}
else {
logger.error("World", "Failed to load SCM: " + name);
logger->error("World", "Failed to load SCM: " + name);
}
}
@ -179,7 +175,7 @@ bool GameWorld::placeItems(const std::string& name)
for( size_t i = 0; i < ipll.m_instances.size(); ++i) {
std::shared_ptr<InstanceData> inst = ipll.m_instances[i];
if(! createInstance(inst->id, inst->pos, inst->rot)) {
logger.error("World", "No object data for instance " + std::to_string(inst->id) + " in " + path);
logger->error("World", "No object data for instance " + std::to_string(inst->id) + " in " + path);
}
}
@ -200,7 +196,7 @@ bool GameWorld::placeItems(const std::string& name)
}
else
{
logger.error("Data", "Failed to load IPL " + path);
logger->error("Data", "Failed to load IPL " + path);
return false;
}
@ -238,7 +234,7 @@ InstanceObject *GameWorld::createInstance(const uint16_t id, const glm::vec3& po
}
if( modelname.empty() ) {
logger.warning("World", "Instance with missing model: " + std::to_string(id));
logger->warning("World", "Instance with missing model: " + std::to_string(id));
}
auto instance = new InstanceObject(
@ -306,6 +302,7 @@ uint16_t GameWorld::findModelDefinition(const std::string model)
}
#include <ai/PlayerController.hpp>
#include <core/Logger.hpp>
CutsceneObject *GameWorld::createCutsceneObject(const uint16_t id, const glm::vec3 &pos, const glm::quat &rot)
{
std::string modelname;
@ -351,7 +348,7 @@ CutsceneObject *GameWorld::createCutsceneObject(const uint16_t id, const glm::ve
// Ensure the relevant data is loaded.
if( modelname.empty() ) {
logger.error("World", "Cutscene object " + std::to_string(id) + " has no model");
logger->error("World", "Cutscene object " + std::to_string(id) + " has no model");
return nullptr;
}
@ -381,7 +378,7 @@ VehicleObject *GameWorld::createVehicle(const uint16_t id, const glm::vec3& pos,
{
auto vti = findObjectType<VehicleData>(id);
if( vti ) {
logger.info("World", "Creating Vehicle ID " + std::to_string(id) + " (" + vti->gameName + ")");
logger->info("World", "Creating Vehicle ID " + std::to_string(id) + " (" + vti->gameName + ")");
if(! vti->modelName.empty()) {
gameData.loadDFF(vti->modelName + ".dff");
@ -399,7 +396,7 @@ VehicleObject *GameWorld::createVehicle(const uint16_t id, const glm::vec3& pos,
sec = gameData.vehicleColours[palit->second[set].second];
}
else {
logger.warning("World", "No colour palette for vehicle " + vti->modelName);
logger->warning("World", "No colour palette for vehicle " + vti->modelName);
}
auto wi = findObjectType<ObjectData>(vti->wheelModelID);
@ -705,7 +702,7 @@ void GameWorld::loadCutscene(const std::string &name)
if ( !cutsceneAudioLoaded )
{
logger.warning("Data", "Failed to load cutscene audio: " + name);
logger->warning("Data", "Failed to load cutscene audio: " + name);
}
@ -714,7 +711,7 @@ void GameWorld::loadCutscene(const std::string &name)
}
state.currentCutscene = cutscene;
state.currentCutscene->meta.name = name;
logger.info("World", "Loaded cutscene: " + name);
logger->info("World", "Loaded cutscene: " + name);
}
void GameWorld::startCutscene()

View File

@ -19,6 +19,7 @@
#include <objects/CutsceneObject.hpp>
#include <render/GameShaders.hpp>
#include <core/Logger.hpp>
#include <deque>
#include <cmath>
@ -65,11 +66,11 @@ std::vector<VertexP2> sspaceRect = {
GeometryBuffer ssRectGeom;
DrawBuffer ssRectDraw;
GameRenderer::GameRenderer(GameWorld* engine)
: engine(engine), renderer(new OpenGLRenderer), _renderAlpha(0.f),
GameRenderer::GameRenderer(Logger* log, GameWorld* engine)
: engine(engine), logger(log), renderer(new OpenGLRenderer), _renderAlpha(0.f),
map(engine, renderer), water(this), text(engine, this)
{
engine->logger.info("Renderer", renderer->getIDString());
logger->info("Renderer", renderer->getIDString());
worldProg = renderer->createShader(
GameShaders::WorldObject::VertexShader,
@ -504,7 +505,7 @@ void GameRenderer::renderVehicle(VehicleObject *vehicle)
{
if(!vehicle->model)
{
engine->logger.warning("Renderer", "Vehicle model " + vehicle->vehicle->modelName + " not loaded!");
logger->warning("Renderer", "Vehicle model " + vehicle->vehicle->modelName + " not loaded!");
}
glm::mat4 matrixModel = vehicle->getTimeAdjustedTransform( _renderAlpha );
@ -679,7 +680,7 @@ void GameRenderer::renderPickup(PickupObject *pickup)
itemModel = weapons->resource->findFrame(odata->modelName + "_l0");
if ( ! itemModel )
{
engine->logger.error("Renderer", "Weapon frame " + odata->modelName + " not in model");
logger->error("Renderer", "Weapon frame " + odata->modelName + " not in model");
}
}
}
@ -693,7 +694,7 @@ void GameRenderer::renderPickup(PickupObject *pickup)
}
else
{
engine->logger.error("Renderer", "Pickup model " + odata->modelName + " not loaded");
logger->error("Renderer", "Pickup model " + odata->modelName + " not loaded");
}
}
@ -762,11 +763,11 @@ void GameRenderer::renderProjectile(ProjectileObject *projectile)
renderFrame(weapons->resource, itemModel, modelMatrix * matrix, nullptr, 1.f);
}
else {
engine->logger.error("Renderer", "Weapon frame " + odata->modelName + " not in model");
logger->error("Renderer", "Weapon frame " + odata->modelName + " not in model");
}
}
else {
engine->logger.error("Renderer", "Weapon.dff not loaded");
logger->error("Renderer", "Weapon.dff not loaded");
}
}
@ -806,11 +807,11 @@ void GameRenderer::renderItem(InventoryItem *item, const glm::mat4 &modelMatrix)
renderFrame(weapons->resource, itemModel, modelMatrix * matrix, nullptr, 1.f);
}
else {
engine->logger.error("Renderer", "Weapon frame " + odata->modelName + " not in model");
logger->error("Renderer", "Weapon frame " + odata->modelName + " not in model");
}
}
else {
engine->logger.error("Renderer", "Weapon model not loaded");
logger->error("Renderer", "Weapon model not loaded");
}
}
@ -841,7 +842,7 @@ void GameRenderer::renderGeometry(Model* model, size_t g, const glm::mat4& model
tex = engine->gameData.findTexture(tC, tA);
if( ! tex )
{
//engine->logger.warning("Renderer", "Missing texture: " + tC + " " + tA);
//logger->warning("Renderer", "Missing texture: " + tC + " " + tA);
}
mat.textures[0].texture = tex;
}

View File

@ -19,6 +19,7 @@
#include <data/Skeleton.hpp>
#include <objects/CutsceneObject.hpp>
#include <objects/PickupObject.hpp>
#include <core/Logger.hpp>
#include <glm/gtx/string_cast.hpp>
@ -91,7 +92,7 @@ void game_create_vehicle_generator(const ScriptArguments& args)
if(args[4].type == TString)
{
args.getVM()->getWorld()->logger.error("SCM", "Model names not supported for vehicle generator");
args.getVM()->getWorld()->logger->error("SCM", "Model names not supported for vehicle generator");
return;
}
@ -381,7 +382,7 @@ void game_create_garage(const ScriptArguments& args)
int garageType = args[6].integer;
auto garageHandle = args[7].handle;
args.getVM()->getWorld()->logger.warning("SCM", "Garages Unimplemented! " + std::to_string(garageType));
args.getVM()->getWorld()->logger->warning("SCM", "Garages Unimplemented! " + std::to_string(garageType));
}
void game_disable_ped_paths(const ScriptArguments& args)
@ -438,7 +439,7 @@ bool game_model_loaded(const ScriptArguments& args)
void game_restart_critical_mission(const ScriptArguments& args)
{
args.getVM()->getWorld()->logger.info("SCM", "Restarting Critical Mission");
args.getVM()->getWorld()->logger->info("SCM", "Restarting Critical Mission");
// Reset player state.
glm::vec3 position(args[0].real, args[1].real, args[2].real + 1.f);
@ -553,7 +554,7 @@ void game_create_cutscene_object(const ScriptArguments& args)
*args[1].handle = object;
if( object == nullptr ) {
args.getVM()->getWorld()->logger.error("SCM", "Could not create cutscene object " + std::to_string(id));
args.getVM()->getWorld()->logger->error("SCM", "Could not create cutscene object " + std::to_string(id));
}
}
void game_set_cutscene_anim(const ScriptArguments& args)
@ -566,7 +567,7 @@ void game_set_cutscene_anim(const ScriptArguments& args)
object->animator->setAnimation(anim, false);
}
else {
args.getVM()->getWorld()->logger.error("SCM", "Failed to load cutscene anim: " + animName);
args.getVM()->getWorld()->logger->error("SCM", "Failed to load cutscene anim: " + animName);
}
}
void game_start_cutscene(const ScriptArguments& args)
@ -632,7 +633,7 @@ void game_set_head_animation(const ScriptArguments& args)
object->animator->setAnimation(anim, false);
}
else {
args.getVM()->getWorld()->logger.error("SCM", "Failed to load cutscene anim: " + animName);
args.getVM()->getWorld()->logger->error("SCM", "Failed to load cutscene anim: " + animName);
}
}
@ -721,7 +722,7 @@ void game_load_audio(const ScriptArguments& args)
{
if(! args.getVM()->getWorld()->gameData.loadAudioClip(name + ".mp3") )
{
args.getVM()->getWorld()->logger.error("SCM", "Failed to load audio: " + name);
args.getVM()->getWorld()->logger->error("SCM", "Failed to load audio: " + name);
}
}
}
@ -756,7 +757,7 @@ void game_play_music_id(const ScriptArguments& args)
// TODO play anything other than Miscom.wav
if(! gw->gameData.loadAudioClip( name + ".wav" ) )
{
args.getVM()->getWorld()->logger.error("SCM", "Error loading audio " + name);
args.getVM()->getWorld()->logger->error("SCM", "Error loading audio " + name);
return;
}
else if ( args.getVM()->getWorld()->missionAudio )

View File

@ -21,6 +21,7 @@
#include <objects/CutsceneObject.hpp>
#include <objects/PickupObject.hpp>
#include <objects/GenericPickup.hpp>
#include <core/Logger.hpp>
#include <glm/gtx/string_cast.hpp>
@ -430,7 +431,7 @@ bool game_vehicle_stopped(const ScriptArguments& args)
void game_make_object_important(const ScriptArguments& args)
{
auto inst = (InstanceObject*)(*args[0].handle);
args.getVM()->getWorld()->logger.warning("SCM", "Object pinning unimplemented!");
args.getVM()->getWorld()->logger->warning("SCM", "Object pinning unimplemented!");
}
bool game_character_in_area_on_foot(const ScriptArguments& args)
@ -777,7 +778,7 @@ void game_create_object_world(const ScriptArguments& args)
auto& modelname = args.getVM()->getFile()->getModels()[-id];
id = args.getVM()->getWorld()->findModelDefinition(modelname);
if( id == (uint16_t)-1 ) {
args.getVM()->getWorld()->logger.error("SCM", "Failed to find model " + modelname);
args.getVM()->getWorld()->logger->error("SCM", "Failed to find model " + modelname);
}
}

View File

@ -64,25 +64,33 @@ RWGame::RWGame(const std::string& gamepath, int argc, char* argv[])
glewExperimental = GL_TRUE;
glewInit();
log.addReciever(&logPrinter);
log.info("Game", "Game directory: " + gamepath);
if(! GameData::isValidGameDirectory(gamepath) )
{
std::string envname(ENV_GAME_PATH_NAME);
throw std::runtime_error("Invalid game directory path, is " +envname+ " set?");
}
engine = new GameWorld(gamepath);
engine->logger.addReciever(&logPrinter);
engine = new GameWorld(&log, gamepath);
// Initalize all the archives.
engine->gameData.loadIMG("/models/gta3");
//engine->gameData.loadIMG("/models/txd");
engine->gameData.loadIMG("/anim/cuts");
engine->gameData.load();
// Initialize renderer
renderer = new GameRenderer(engine);
renderer = new GameRenderer(&log, engine);
// Set up text renderer
renderer->text.setFontTexture(0, "pager");
renderer->text.setFontTexture(1, "font1");
renderer->text.setFontTexture(2, "font2");
/// @TODO expand this here.
engine->load();
debug = new DebugDraw;
debug->setDebugMode(btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawConstraints | btIDebugDraw::DBG_DrawConstraintLimits);
engine->dynamicsWorld->setDebugDrawer(debug);
@ -113,7 +121,7 @@ RWGame::RWGame(const std::string& gamepath, int argc, char* argv[])
StateManager::get().enter(loading);
engine->logger.info("Game", "Started");
log.info("Game", "Started");
}
RWGame::~RWGame()
@ -244,7 +252,7 @@ void RWGame::tick(float dt)
}
catch( SCMException& ex ) {
std::cerr << ex.what() << std::endl;
engine->logger.error( "Script", ex.what() );
log.error( "Script", ex.what() );
throw;
}
}

View File

@ -1,5 +1,7 @@
#ifndef _RWGAME_HPP_
#define _RWGAME_HPP_
#include <core/Logger.hpp>
#include <engine/GameWorld.hpp>
#include <render/GameRenderer.hpp>
#include "game.hpp"
@ -8,6 +10,7 @@
class RWGame
{
Logger log;
GameWorld* engine;
// must be allocated after Logger setup.
GameRenderer* renderer;

View File

@ -3,6 +3,7 @@
#include <SFML/Window.hpp>
#include <engine/GameWorld.hpp>
#include <core/Logger.hpp>
#include <glm/gtx/string_cast.hpp>
#define ENV_GAME_PATH_NAME ("OPENRW_GAME_PATH")
@ -39,11 +40,12 @@ public:
wnd.create(sf::VideoMode(640, 360), "Testing");
glewExperimental = GL_TRUE;
glewInit();
e = new GameWorld(getGamePath());
Logger log;
e = new GameWorld(&log, getGamePath());
e->gameData.loadIMG("/models/gta3");
e->gameData.loadIMG("/anim/cuts");
e->load();
e->gameData.load();
for(std::map<std::string, std::string>::iterator it = e->gameData.ideLocations.begin();
it != e->gameData.ideLocations.end();
++it) {