From: <pa...@us...> - 2008-08-20 08:38:27
|
Revision: 773 http://opde.svn.sourceforge.net/opde/?rev=773&view=rev Author: patryn Date: 2008-08-20 08:38:24 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Command line can now be used to set the game we are running. Modified Paths: -------------- trunk/src/main/GameStateManager.cpp trunk/src/main/GameStateManager.h trunk/src/main/Opde.cpp Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-08-20 04:17:27 UTC (rev 772) +++ trunk/src/main/GameStateManager.cpp 2008-08-20 08:38:24 UTC (rev 773) @@ -56,7 +56,7 @@ // The instance owner template<> GameStateManager* Singleton<GameStateManager>::ms_Singleton = 0; - GameStateManager::GameStateManager() : + GameStateManager::GameStateManager(std::string GameType) : mStateStack(), mTerminate(false), mRoot(NULL), @@ -67,6 +67,7 @@ mDTypeScriptLdr(NULL), mPLDefScriptLdr(NULL), mConfigService(NULL) { + mGameType = GameType; } GameStateManager::~GameStateManager() { @@ -274,13 +275,15 @@ // Load resource paths from config file ConfigFile cf; - // If resources config param exists, load resources according to it, otherwise failback to resources.cfg - DVariant d; - if (mConfigService->getParam("resources", d)) { - cf.load(d.toString()); - } else { + //Load the resources according to the game type, if game type not specified, load the default + if((mGameType == "T1") || (mGameType == "t1")) + cf.load("thief1.cfg"); + else if((mGameType == "T2") || (mGameType == "t2")) + cf.load("thief2.cfg"); + else if((mGameType == "SS2") || (mGameType == "ss2")) + cf.load("shock2.cfg"); + else cf.load("resources.cfg"); - } // Go through all sections & settings in the file ConfigFile::SectionIterator seci = cf.getSectionIterator(); Modified: trunk/src/main/GameStateManager.h =================================================================== --- trunk/src/main/GameStateManager.h 2008-08-20 04:17:27 UTC (rev 772) +++ trunk/src/main/GameStateManager.h 2008-08-20 08:38:24 UTC (rev 773) @@ -59,7 +59,7 @@ */ class GameStateManager : public Singleton<GameStateManager>, public DirectInputListener { public: - GameStateManager(); + GameStateManager(std::string GameType); ~GameStateManager(); // Singleton related @@ -135,6 +135,8 @@ ConfigServicePtr mConfigService; InputServicePtr mInputService; + + std::string mGameType; }; } Modified: trunk/src/main/Opde.cpp =================================================================== --- trunk/src/main/Opde.cpp 2008-08-20 04:17:27 UTC (rev 772) +++ trunk/src/main/Opde.cpp 2008-08-20 08:38:24 UTC (rev 773) @@ -31,12 +31,16 @@ #include "windows.h" INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) +{ + std::string GameType(strCmdLine); #else int main(int argc, char**argv) +{ + std::string GameType(argv[0]); #endif -{ + // Create application object - GameStateManager* man = new GameStateManager(); + GameStateManager* man = new GameStateManager(GameType); try { man->run(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-08-20 18:09:17
|
Revision: 780 http://opde.svn.sourceforge.net/opde/?rev=780&view=rev Author: volca Date: 2008-08-20 18:09:24 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Adding doc generator for properties and links (and enums). Very dirty but works quite well Modified Paths: -------------- trunk/src/main/CMakeLists.txt Added Paths: ----------- trunk/src/main/OpdeDocGen.cpp Modified: trunk/src/main/CMakeLists.txt =================================================================== --- trunk/src/main/CMakeLists.txt 2008-08-20 18:07:46 UTC (rev 779) +++ trunk/src/main/CMakeLists.txt 2008-08-20 18:09:24 UTC (rev 780) @@ -30,6 +30,12 @@ ${OPDE_SOURCE_DIR}/src/services/worldrep ) +# Doc generator for opde - property and link types info generator +add_executable (opdeDocGen WIN32 + OpdeDocGen.cpp +) + +# Main executable add_executable (opde WIN32 Opde.cpp GameStateManager.cpp @@ -59,11 +65,14 @@ DTypeScriptCompiler.h PLDefScriptCompiler.cpp PLDefScriptCompiler.h + DTypeScriptLoader.cpp + DTypeScriptLoader.h + PLDefScriptLoader.cpp + PLDefScriptLoader.h CustomImageCodec.cpp CustomImageCodec.h ) - target_link_libraries( opde ${OGRE_LIBRARIES} ${OIS_LIBRARIES} @@ -75,6 +84,15 @@ OpdeBase ) +target_link_libraries( opdeDocGen + ${OGRE_LIBRARIES} + OpdeFile + OpdeLogger + OpdeConsole + ${OPDE_SERVICE_LIBRARIES} + OpdeBase +) + target_link_libraries( OpdeRoot ${OGRE_LIBRARIES} ${OIS_LIBRARIES} Added: trunk/src/main/OpdeDocGen.cpp =================================================================== --- trunk/src/main/OpdeDocGen.cpp (rev 0) +++ trunk/src/main/OpdeDocGen.cpp 2008-08-20 18:09:24 UTC (rev 780) @@ -0,0 +1,443 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + *****************************************************************************/ + +#include "GameStateManager.h" +#include "OpdeException.h" +#include "Root.h" +#include "StringTokenizer.h" + +#include <OgreException.h> + +// Simple and very dirty doc generator. +// outputs to latex so it can be converted to html using latex2html or rendered to pdf, etc. +using namespace Opde; +using namespace std; + +namespace Opde { + /// Documentation generator for properties and links + class DocGenerator { + protected: + typedef enum { + DT_PROP, + DT_LINK, + DT_ENUM, + DT_SPECIAL + } DocumentStringType; + + int mArgc; + char** mArgv; + std::string mConfigFile; + Opde::Root* mRoot; + ConfigServicePtr mConfigSvc; + + typedef std::map<std::string, std::string> DocStrings; + + DocStrings mPropertyDocs; + DocStrings mLinkDocs; + DocStrings mEnumDocs; + DocStrings mSpecialDocs; + + typedef std::map<std::string, DEnum*> EnumMap; + + EnumMap mEncounteredEnums; + + void queueEnumForDesc(DEnum* en) { + assert(en); + + mEncounteredEnums[en->getName()] = en; + } + + bool parseCommandline(void) { + // look for config file name + if (mArgc < 2) + return false; + + mConfigFile = mArgv[1]; + return true; + } + + bool initialize(void) { + // parse the config file. Load the dtype scripts + // this is done automatically by adding the resource locations + // then bootstrapping + // initialize Opde::Root. No service types besides the base + mRoot->loadConfigFile(mConfigFile); + + DVariant p; + + if (!mConfigSvc->getParam("resources", p)) { + // default + p = "resources.cfg"; + } + + mRoot->loadResourceConfig(p.toString()); + mRoot->bootstrapFinished(); + } + + void dispatchAdditionalDocString(DocumentStringType type, const string& addr, const string& txt) { + if (addr != "") { + switch (type) { + case DT_PROP: + LOG_DEBUG("Dispatched prop desc for '%s': %s", addr.c_str(), txt.c_str()); + mPropertyDocs[addr] = txt; + break; + case DT_LINK: + LOG_DEBUG("Dispatched link desc for '%s': %s", addr.c_str(), txt.c_str()); + mLinkDocs[addr] = txt; + break; + case DT_ENUM: + LOG_DEBUG("Dispatched enum desc for '%s': %s", addr.c_str(), txt.c_str()); + mEnumDocs[addr] = txt; + break; + case DT_SPECIAL: + LOG_DEBUG("Dispatched special doc page '%s': %s", addr.c_str(), txt.c_str()); + mSpecialDocs[addr] = txt; + break; + } + } else { + LOG_DEBUG("Empty address for accumulated doc %s", txt.c_str()); + } + } + + void loadAdditionalDocStrings(void) { + // see if we can open the specified file + DVariant fn = "docstrings.txt"; // default + + // override, if present + mConfigSvc->getParam("docstrings", fn); + + std::fstream s; + + s.open(fn.toString().c_str(), ios::in); + + if (s.fail()) + return; + + string target = ""; + DocumentStringType doctype = DT_PROP; + string text = ""; + + // process line by line + while (!s.eof()) { + string line; + + getline(s, line, '\n'); + + // process + // strip comments + size_t cpos = line.find_first_of("#"); + + if (cpos != line.npos) + line = line.substr(0, --cpos); + + // we now have the comment stripped. See if we have a target specifier + + size_t cl = line.find_first_of("]"); + + if (line[0] == '[' && cl != line.npos) { + // yup. see the type + string cont = line.substr(1, cl - 1); + + WhitespaceStringTokenizer tok(cont); + + string type = tok.next(); + string address = tok.next(); + + DocumentStringType ntype = DT_PROP; + + if (type == "prop") { + ntype = DT_PROP; + } else if (type == "link") { + ntype = DT_LINK; + } else if (type == "enum") { + ntype = DT_ENUM; + } else if (type == "page") { + ntype = DT_SPECIAL; + } else { + OPDE_EXCEPT("Unknown section type :" + type, "DocGenerator::loadAdditionalDocStrings"); + } + + // dispatch the old text + dispatchAdditionalDocString(doctype, target, text); + + doctype = ntype; + text = ""; + target = address; + } else { + text += line; + text += '\n'; // we want to preserve formatting + } + } // the cycle + + // last dispatch + dispatchAdditionalDocString(doctype, target, text); + + s.close(); + } + + void genPropDocs(fstream& fo) { + PropertyServicePtr ps = ServiceManager::getSingleton().getService("PropertyService").as<PropertyService>(); + + StringIteratorPtr pn = ps->getAllPropertyNames(); + + fo << "\\chapter{Properties}" << endl; + + while (!pn->end()) { + const string& propname = pn->next(); + + std::cerr << "Prop " << propname << std::endl; + + fo << "\\section*{" << propname << "}" << endl; + + // for cross linking + fo << "\\label{prop_" << propname << "}" << endl; + + // standard info header. Chunk versions, data size, label + // Get the prop group + PropertyGroup* pg = ps->getPropertyGroup(propname); + + fo << "\\textbf{Property}: " << propname << endl << endl; // TODO: Path + + uint maj, min; + maj = pg->getChunkVersionMajor(); + min = pg->getChunkVersionMinor(); + + // get the info + fo << "\\textbf{Chunk version:} " << maj << "." << min << endl; + + if (pg->getBuiltin()) + fo << "Built-In" << endl; + + + DocStrings::iterator it = mPropertyDocs.find(propname); + if (it != mPropertyDocs.end()) { + fo << endl << "\\subsection*{Description}" << endl; + + // spit out the additional docs if present + fo << it->second << endl; + } + + fo << endl << "\\subsection*{Fields}" << endl; + fo << "\\begin{tabular}{lcrrr}" << endl; + // table contents, each line ending with \\, cells separated using & + fo << "\\textbf{Field} & \\textbf{Type} & \\textbf{Size} & \\textbf{Enum} & \\textbf{Description} \\\\" << endl; + + // TODO: spit all the property fields with descriptions + DataFieldDescIteratorPtr dfi = pg->getFieldDescIterator(); + + // iterate + while(!dfi->end()) { + const DataFieldDesc& df = dfi->next(); + + fo << df.name << " & " << + DVariant::typeToString(df.type) << " & " << + df.size << " & "; + + if (df.enumerator != NULL) { + fo << df.enumerator->getName() << " \\pageref{enum_"<< df.enumerator->getName() <<"}"; + queueEnumForDesc(df.enumerator); + } else { + fo << "-"; + }; + + fo << " & \\\\" << std::endl; + } + + fo << "\\end{tabular}" << endl; + + fo << endl; + } + } + + void genLinkDocs(fstream& fo) { + LinkServicePtr ls = ServiceManager::getSingleton().getService("LinkService").as<LinkService>(); + + StringIteratorPtr ln = ls->getAllLinkNames(); + + fo << "\\chapter{Links}" << endl; + + while (!ln->end()) { + const string& linkname = ln->next(); + + fo << "\\section*{" << linkname << "}" << endl; + + // for cross linking + fo << "\\label{prop_" << linkname << "}" << endl; + + DocStrings::iterator it = mLinkDocs.find(linkname); + if (it != mLinkDocs.end()) { + fo << endl << "\\subsection*{Description}" << endl; + + // spit out the additional docs if present + fo << it->second << endl; + } + + fo << "\\end{tabular}" << endl; + + fo << endl; + } + } + + void genEnumDocs(fstream& fo) { + fo << "\\chapter{Enumerations}" << endl; + + EnumMap::iterator it = mEncounteredEnums.begin(); + + for (; it != mEncounteredEnums.end(); ++it) { + DEnum* en = it->second; + + const string& enname = en->getName(); + + fo << "\\section*{" << enname << "}" << endl; + + // for cross linking + fo << "\\label{enum_" << enname << "}" << endl; + + fo << "\\textbf{Type:}"; + + if (en->isBitfield()) + fo << "Bitfield" << endl << endl; // TODO: Path + else + fo << "Enumeration" << endl << endl; // TODO: Path + + DocStrings::iterator it = mEnumDocs.find(enname); + + if (it != mEnumDocs.end()) { + fo << endl << "\\subsection*{Description}" << endl; + + // spit out the additional docs if present + fo << it->second << endl; + } + + fo << endl << "\\subsection*{Structure}" << endl; + fo << "\\begin{tabular}{lr}" << endl; + // table contents, each line ending with \\, cells separated using & + fo << "\\textbf{Key} & \\textbf{Value} \\\\" << endl; + + DEnum::EnumFieldList l = en->getFieldList(0); + + DEnum::EnumFieldList::iterator kit = l.begin(); + + // iterate + for (; kit != l.end(); ++kit) { + DEnum::EnumField& f = *kit; + + fo << f.key << " & " << + f.value.toUInt() << " \\\\" << std::endl; + } + + fo << "\\end{tabular}" << endl; + + fo << endl; + } + } + + void doGenerate(void) { + DVariant fn = "output.tex"; // default + + // override, if present + mConfigSvc->getParam("outfile", fn); + + std::fstream s; + + s.open(fn.toString().c_str(), ios::out); + + // if we have specialdoc header, output it + s << mSpecialDocs["header"]; + + // first iterate over the properties + genPropDocs(s); + + // links + genLinkDocs(s); + + // enumerations + genEnumDocs(s); + + s<<"\\end{document}" << endl; + s.close(); + } + + public: + DocGenerator(int argc, char**argv) : mArgc(argc), mArgv(argv) { + mRoot = new Opde::Root(SERVICE_CORE); + // we want script autoload + mRoot->registerCustomScriptLoaders(); + mConfigSvc = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); + } + + ~DocGenerator(void) { + mConfigSvc = NULL; + delete mRoot; + } + + void help(void) { + cout << "Usage: opdeDocGen config_file" << endl; + } + + + bool generateDoc(void) { + if (!parseCommandline()) { + help(); + return false; + } + + // TODO: debug config param. + mRoot->setLogLevel(5); + // TODO: logfile config param. + mRoot->logToFile("opdeDocGen.log"); + + // initialize the system - load the dtype scripts according to the config + initialize(); + + // read the additional docs file. This file contains docs for each entity + // has a simple format [prop PropName] or [link LinkName] for doc target change. Other lines (after stripping # comments) + // are accumulated to the last specified doc target + loadAdditionalDocStrings(); + + // generate the doc + doGenerate(); + + return true; + } + }; +}; + +int main(int argc, char**argv) { + int rv = 0; + + try { + DocGenerator dg(argc, argv); + + if (!dg.generateDoc()) + rv = 3; // exit code 3 - parsing failed + } catch( Ogre::Exception& e ) { + std::cerr << "An exception has occured: " << + e.getFullDescription().c_str() << std::endl; + rv = 1; // exit code 2 - ogre error + } catch( BasicException& e ) { + std::cerr << "An exception has occured: " << + e.getDetails().c_str() << std::endl; + rv = 2; // exit code 1 - opde error + } + + return rv; +} Property changes on: trunk/src/main/OpdeDocGen.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-08-20 18:14:06
|
Revision: 782 http://opde.svn.sourceforge.net/opde/?rev=782&view=rev Author: volca Date: 2008-08-20 18:14:13 +0000 (Wed, 20 Aug 2008) Log Message: ----------- script loaders added to the root object Modified Paths: -------------- trunk/src/main/Root.cpp trunk/src/main/Root.h Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2008-08-20 18:10:42 UTC (rev 781) +++ trunk/src/main/Root.cpp 2008-08-20 18:14:13 UTC (rev 782) @@ -60,7 +60,9 @@ mDTypeScriptCompiler(NULL), mPLDefScriptCompiler(NULL), mConsoleBackend(NULL), - mServiceMask(serviceMask) { + mServiceMask(serviceMask), + mDTypeScriptLdr(NULL), + mPLDefScriptLdr(NULL) { mLogger = new Logger(); @@ -96,6 +98,10 @@ // ------------------------------------------------------- Root::~Root() { + // if those are used, delete them + delete mDTypeScriptLdr; + delete mPLDefScriptLdr; + delete mDTypeScriptCompiler; delete mPLDefScriptCompiler; @@ -120,10 +126,24 @@ delete mLogger; delete mOgreOpdeLogConnector; + + delete mOgreLogManager; } // ------------------------------------------------------- + void Root::registerCustomScriptLoaders() { + // TODO: bindings + + // the classes register themselves to ogre + if (!mDTypeScriptLdr) + mDTypeScriptLdr = new DTypeScriptLoader(); + + if (!mPLDefScriptLdr) + mPLDefScriptLdr = new PLDefScriptLoader(); + } + + // ------------------------------------------------------- void Root::bootstrapFinished() { // Initialise all resources Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); Modified: trunk/src/main/Root.h =================================================================== --- trunk/src/main/Root.h 2008-08-20 18:10:42 UTC (rev 781) +++ trunk/src/main/Root.h 2008-08-20 18:14:13 UTC (rev 782) @@ -41,6 +41,10 @@ #include "DTypeScriptCompiler.h" #include "PLDefScriptCompiler.h" +// script loaders +#include "DTypeScriptLoader.h" +#include "PLDefScriptLoader.h" + namespace Opde { /** OPDE core class. Used to initialize the whole engine. Singleton */ @@ -88,6 +92,9 @@ /** A shortcut to set loglevel. Valid values are 0-4 */ void setLogLevel(int level); + /// registers custom script loaders with ogre, meaning the custom scripts will get loaded automatically + void registerCustomScriptLoaders(); + protected: /// Registers all the service factories to the Service Manger void registerServiceFactories(); @@ -112,6 +119,12 @@ LogListenerList mLogListeners; const unsigned int mServiceMask; + + /// Loader for the DType scripts. Only used if + DTypeScriptLoader* mDTypeScriptLdr; + + /// Loader for the PLDef scripts + PLDefScriptLoader* mPLDefScriptLdr; }; } // namespace Opde This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-08-20 18:56:52
|
Revision: 793 http://opde.svn.sourceforge.net/opde/?rev=793&view=rev Author: volca Date: 2008-08-20 18:57:02 +0000 (Wed, 20 Aug 2008) Log Message: ----------- name for the denum, property group now normal pointer, gameplaystate uninitialized vars Modified Paths: -------------- trunk/src/main/DTypeScriptCompiler.cpp trunk/src/main/GamePlayState.cpp trunk/src/main/PLDefScriptCompiler.cpp Modified: trunk/src/main/DTypeScriptCompiler.cpp =================================================================== --- trunk/src/main/DTypeScriptCompiler.cpp 2008-08-20 18:53:27 UTC (rev 792) +++ trunk/src/main/DTypeScriptCompiler.cpp 2008-08-20 18:57:02 UTC (rev 793) @@ -412,10 +412,10 @@ mCurrentState.enumvaltype = ntype; - mCurrentState.enumeration = new DEnum(ntype, false); + mCurrentState.enumeration = new DEnum(mCurrentState.name, ntype, false); } else { mCurrentState.enumvaltype = DVariant::DV_UINT; - mCurrentState.enumeration = new DEnum(DVariant::DV_UINT, true); + mCurrentState.enumeration = new DEnum(mCurrentState.name, DVariant::DV_UINT, true); } } Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-08-20 18:53:27 UTC (rev 792) +++ trunk/src/main/GamePlayState.cpp 2008-08-20 18:57:02 UTC (rev 793) @@ -77,10 +77,14 @@ mBackward = false; mLeft = false; mRight = false; + mScreenShot = false; + mSceneDisplay = false; + mPortalDisplay = false; + mDebug = false; mSceneDetailIndex = 0; - mNumScreenShots = 1; + mNumScreenShots = 0; mRoot = Root::getSingletonPtr(); mOverlayMgr = OverlayManager::getSingletonPtr(); @@ -102,16 +106,16 @@ void GamePlayState::start() { LOG_INFO("GamePlayState: Starting"); - PropertyGroupPtr PropertyGroup = ServiceManager::getSingleton().getService("PropertyService"). - as<PropertyService>()->getPropertyGroup("Position"); + PropertyGroup* posPG = ServiceManager::getSingleton().getService("PropertyService"). + as<PropertyService>()->getPropertyGroup("Position"); - if (PropertyGroup.isNull()) + if (posPG == NULL) OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "GamePlayState::start"); LOG_DEBUG("Starting Point object id : %d", StartingPointObjID); DVariant spoint; - PropertyGroup->get(StartingPointObjID, "position", spoint); + posPG->get(StartingPointObjID, "position", spoint); Vector3 StartingPoint(0,0,0); @@ -365,7 +369,7 @@ } else if(e.key == KC_D) { mRight = true; return true; - } else if (e.key == KC_SYSRQ) { + } else if (e.key == KC_SYSRQ || e.key == KC_F5) { mScreenShot = true; return true; } else if (e.key == KC_O) { Modified: trunk/src/main/PLDefScriptCompiler.cpp =================================================================== --- trunk/src/main/PLDefScriptCompiler.cpp 2008-08-20 18:53:27 UTC (rev 792) +++ trunk/src/main/PLDefScriptCompiler.cpp 2008-08-20 18:57:02 UTC (rev 793) @@ -206,25 +206,23 @@ if (mCurrentState.label == "") // default to property chunk name silently mCurrentState.label = mCurrentState.name; - PropertyGroupPtr pg; + PropertyGroup* pg; + DataStoragePtr stor; if (mCurrentState.ptype == "varstr") { - pg = mPropertyService->createStringPropertyGroup( - mCurrentState.label, - mCurrentState.name, - mCurrentState.inherit); - } else { - // for now, any other string will lead us here: - // We could in theory templatize the string property group to all primitive types later... - pg = mPropertyService->createStructuredPropertyGroup( - mCurrentState.label, - mCurrentState.name, - dt, - mCurrentState.inherit); + stor = new StringDataStorage(); + } else { + stor = new StructuredDataStorage(dt, mCurrentState.cached); } + + pg = mPropertyService->createPropertyGroup( + mCurrentState.label, + mCurrentState.name, + mCurrentState.inherit, + stor + ); pg->setChunkVersions(mCurrentState.pmajor, mCurrentState.pminor); - pg->setCacheData(mCurrentState.cached); } else { logParseError("Closing an unknown state!"); } @@ -351,7 +349,7 @@ uint maj = StringConverter::parseLong(svmaj); uint min = StringConverter::parseLong(svmin); - if (mCurrentState.state == CS_RELATION) { + if (mCurrentState.state == CS_RELATION || mCurrentState.state == CS_PROPERTY) { // fill the current state only if (vid == ID_D_VER) { mCurrentState.dmajor = maj; @@ -378,7 +376,7 @@ mLinkService->setChunkVersion(maj, min); } else if (vid == ID_P_VER) { mDefaultPMajor = maj; - mDefaultPMinor = maj; + mDefaultPMinor = min; } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-08-31 17:30:14
|
Revision: 816 http://opde.svn.sourceforge.net/opde/?rev=816&view=rev Author: volca Date: 2008-08-31 17:30:23 +0000 (Sun, 31 Aug 2008) Log Message: ----------- various small fixes Modified Paths: -------------- trunk/src/main/DTypeScriptCompiler.cpp trunk/src/main/GamePlayState.cpp trunk/src/main/OpdeDocGen.cpp Modified: trunk/src/main/DTypeScriptCompiler.cpp =================================================================== --- trunk/src/main/DTypeScriptCompiler.cpp 2008-08-31 17:29:23 UTC (rev 815) +++ trunk/src/main/DTypeScriptCompiler.cpp 2008-08-31 17:30:23 UTC (rev 816) @@ -266,14 +266,15 @@ if (mCurrentState.state == CS_ENUM) logParseError("Struct inside enum error."); - DTypeDefPtr nt = new DTypeDef(was.name, was.types, was.unioned); - + DTypeDefPtr nt; + // if specified an array, wrap it up so if (was.arraylen > 1) { // wrap up - DTypeDef *nta = new DTypeDef(nt, was.arraylen); - - nt = nta; + DTypeDefPtr nelem = new DTypeDef(was.name, was.types, was.unioned); + nt = new DTypeDef(nelem, was.arraylen); + } else { + nt = new DTypeDef(was.name, was.types, was.unioned); } // create the struct according to the 'was' structure fields Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-08-31 17:29:23 UTC (rev 815) +++ trunk/src/main/GamePlayState.cpp 2008-08-31 17:30:23 UTC (rev 816) @@ -320,7 +320,7 @@ static String stt = "Traversal Time: "; static String ssr = "Static Build Time: "; - uint bculls, eports, rendc, travtm; + uint bculls = 0, eports = 0, rendc = 0, travtm = 0; unsigned long statbt; Modified: trunk/src/main/OpdeDocGen.cpp =================================================================== --- trunk/src/main/OpdeDocGen.cpp 2008-08-31 17:29:23 UTC (rev 815) +++ trunk/src/main/OpdeDocGen.cpp 2008-08-31 17:30:23 UTC (rev 816) @@ -438,7 +438,7 @@ } catch( BasicException& e ) { std::cerr << "An exception has occured: " << e.getDetails().c_str() << std::endl; - rv = 2; // exit code 1 - opde error + rv = 2; // exit code 1 - opde error } return rv; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-09-08 18:29:10
|
Revision: 830 http://opde.svn.sourceforge.net/opde/?rev=830&view=rev Author: volca Date: 2008-09-08 18:29:20 +0000 (Mon, 08 Sep 2008) Log Message: ----------- Compiler now does not understand varstr Modified Paths: -------------- trunk/src/main/DTypeScriptCompiler.cpp trunk/src/main/DTypeScriptCompiler.h Modified: trunk/src/main/DTypeScriptCompiler.cpp =================================================================== --- trunk/src/main/DTypeScriptCompiler.cpp 2008-09-08 18:27:28 UTC (rev 829) +++ trunk/src/main/DTypeScriptCompiler.cpp 2008-09-08 18:29:20 UTC (rev 830) @@ -84,7 +84,7 @@ "<Variant_Type> ::= 'uint' | 'int' | 'float' | 'bool' | 'string' | 'vector' \n" - "<String_Type> ::= <Fixed_String> | 'varstr' \n" + "<String_Type> ::= <Fixed_String> \n" "<Fixed_String> ::= 'char' <Array_Spec> \n" @@ -170,8 +170,6 @@ addLexemeTokenAction("shortvec", ID_SHORTVECTOR, &DTypeScriptCompiler::parseField); addLexemeTokenAction("char", ID_CHAR, &DTypeScriptCompiler::parseField); - - addLexemeTokenAction("varstr", ID_VARSTR, &DTypeScriptCompiler::parseField); } //----------------------------------------------------------------------- @@ -499,10 +497,8 @@ case ID_FLOAT : return DVariant::DV_FLOAT; case ID_STRING : - case ID_CHAR: - case ID_VARSTR : return DVariant::DV_STRING; + case ID_CHAR: return DVariant::DV_STRING; - case ID_VECTOR : return DVariant::DV_VECTOR; case ID_SHORTVECTOR : return DVariant::DV_QUATERNION; @@ -534,8 +530,6 @@ case ID_SHORTVECTOR : return 6; - case ID_VARSTR : return -1; - default : logParseError("Invalid type specified or size can't be determined"); return 0; //To keep MSVC happy @@ -561,6 +555,7 @@ } else datasize = getDataLenFromID(typei); + // Look at the next token. it can either be 'use', array spec '[' or direct name of the field if (testNextTokenID(ID_USE)) { // use enumeration Modified: trunk/src/main/DTypeScriptCompiler.h =================================================================== --- trunk/src/main/DTypeScriptCompiler.h 2008-09-08 18:27:28 UTC (rev 829) +++ trunk/src/main/DTypeScriptCompiler.h 2008-09-08 18:29:20 UTC (rev 830) @@ -110,7 +110,6 @@ ID_FLOAT, ID_STRING, // String as a dvariant type ID_CHAR, // String with defined size - ID_VARSTR, // Variable length string ID_VECTOR, ID_SHORTVECTOR, ID_AUTOTOKEN // The start of the autogenerated tokens This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-09-24 17:36:49
|
Revision: 852 http://opde.svn.sourceforge.net/opde/?rev=852&view=rev Author: volca Date: 2008-09-24 17:36:30 +0000 (Wed, 24 Sep 2008) Log Message: ----------- Various small fixes Modified Paths: -------------- trunk/src/main/GamePlayState.cpp trunk/src/main/GamePlayState.h trunk/src/main/GameState.h trunk/src/main/OpdeDocGen.cpp trunk/src/main/Root.h Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-09-24 17:34:41 UTC (rev 851) +++ trunk/src/main/GamePlayState.cpp 2008-09-24 17:36:30 UTC (rev 852) @@ -1,483 +1,484 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - * - *****************************************************************************/ - -#include "config.h" - -#include "OIS.h" -#include "GameStateManager.h" -#include "GamePlayState.h" -#include "GameLoadState.h" -#include "logger.h" -#include "integers.h" - -#include "DarkCamera.h" - -#include <OgreRenderWindow.h> -#include <OgreOverlayElement.h> -#include <OgreStringConverter.h> - -using namespace Ogre; -using namespace OIS; - -namespace Opde { - - template<> GamePlayState* Singleton<GamePlayState>::ms_Singleton = 0; - - GamePlayState::GamePlayState() : mSceneMgr(NULL), mToLoadScreen(true), mDebugOverlay(NULL) { - /// Register as a command listener, so we can load different levels - Opde::ConsoleBackend::getSingleton().registerCommandListener("load", dynamic_cast<ConsoleCommandListener*>(this)); - Opde::ConsoleBackend::getSingleton().setCommandHint("load", "Loads a specified mission file"); - Opde::ConsoleBackend::getSingleton().registerCommandListener("fps", dynamic_cast<ConsoleCommandListener*>(this)); - Opde::ConsoleBackend::getSingleton().setCommandHint("fps", "Dump FPS stats"); - - mRotateSpeed = 36; - mMoveSpeed = 50; - mRotateYFactor = 1; - - mShadows = false; - mSceneDisplay = false; - - // Try to remap the parameters with those listed in the configuration - mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); - - if (mConfigService->hasParam("move_speed")) - mMoveSpeed = mConfigService->getParam("move_speed").toFloat(); - - if (mConfigService->hasParam("mouse_speed")) - mRotateSpeed = mConfigService->getParam("mouse_speed").toFloat(); - - if (mConfigService->hasParam("mouse_invert")) - mRotateYFactor = mConfigService->getParam("mouse_invert").toFloat(); - - mTranslateVector = Vector3::ZERO; - mRotX = 0; - mRotY = 0; - - mForward = false; - mBackward = false; - mLeft = false; - mRight = false; - - mScreenShot = false; - mSceneDisplay = false; - mPortalDisplay = false; - mDebug = false; - - mSceneDetailIndex = 0; - mNumScreenShots = 0; - - mRoot = Root::getSingletonPtr(); - mOverlayMgr = OverlayManager::getSingletonPtr(); - - mConsole = new ConsoleFrontend(); - mConsole->setActive(false); - - mDebugOverlay = OverlayManager::getSingleton().getByName("Opde/DebugOverlay"); - - // Portal stats overlay - mPortalOverlay = OverlayManager::getSingleton().getByName("Opde/OpdeDebugOverlay"); - - mShadows = true; - } - - GamePlayState::~GamePlayState() { - delete mConsole; - } - - void GamePlayState::start() { - LOG_INFO("GamePlayState: Starting"); - PropertyGroup* posPG = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService"))->getPropertyGroup("Position"); - - if (posPG == NULL) - OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "GamePlayState::start"); - - LOG_DEBUG("Starting Point object id : %d", StartingPointObjID); - - DVariant spoint; - posPG->get(StartingPointObjID, "position", spoint); - - Vector3 StartingPoint(0,0,0); - - if (spoint.type() == DVariant::DV_VECTOR) - StartingPoint = spoint.toVector(); - - LOG_DEBUG("Starting Point position : %f %f %f", StartingPoint.x, StartingPoint.y, StartingPoint.z); - -// std::string tmp = PropertyGroup->get(StartingPointObjID, "SymName").toString(); - mSceneMgr = mRoot->getSceneManager( "DarkSceneManager" ); - RenderServicePtr renderSrv = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); - - mCamera = renderSrv->getDefaultCamera(); - mViewport = renderSrv->getDefaultViewport(); - mWindow = renderSrv->getRenderWindow(); - - mSceneMgr->clearSpecialCaseRenderQueues(); - mSceneMgr->setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE); - - mCamera->setNearClipDistance(0.5); - mCamera->setFarClipDistance(4000); - - // Also change position, and set Quake-type orientation - ViewPoint vp = mSceneMgr->getSuggestedViewpoint(true); - mCamera->setPosition(vp.position); - - if (StartingPointObjID != 0) - mCamera->setPosition(StartingPoint); - - mCamera->pitch(Degree(90)); - mCamera->rotate(vp.orientation); - - // Don't yaw along variable axis, causes leaning - mCamera->setFixedYawAxis(true, Vector3::UNIT_Z); - - - // Thiefy FOV - mCamera->setFOVy(Degree(70)); - - if (mConfigService->hasParam("debug")) { - if (mConfigService->getParam("debug") == true) { - // debug overlay - mDebugOverlay->show(); - - // Portal stats overlay - mPortalOverlay->show(); - - mDebug = true; - } - } - - // hidden as default - mConsole->setActive(false); - - mWindow->resetStatistics(); - - mToLoadScreen = false; - - LOG_INFO("GamePlayState: Started"); - } - - void GamePlayState::exit() { - LOG_INFO("GamePlayState: Exiting"); - - // mConsole->setActive(false); - - // clear the scene - mSceneMgr->clearScene(); - - mPortalOverlay->hide(); - mDebugOverlay->hide(); - mConsole->setActive(false); - mConsole->update(1); // to hide the console while exiting - - if (mToLoadScreen) { - pushState(GameLoadState::getSingletonPtr()); - mToLoadScreen = false; - } - - LOG_INFO("GamePlayState: Exited"); - } - - void GamePlayState::suspend() { - LOG_INFO("GamePlayState: Suspend?!"); - mToLoadScreen = false; - } - - void GamePlayState::resume() { - LOG_INFO("GamePlayState: Resume?!"); - mToLoadScreen = false; - } - - void GamePlayState::update(unsigned long timePassed) { - if (timePassed == 0) { - mMoveScale = 0.1f; - mRotScale = 0.1f; - } else { - mMoveScale = mMoveSpeed * timePassed / 1000.0f; - mRotScale = mRotateSpeed * timePassed / 1000.0f; - } - - // Quick hack. Let the camera move: - if (mForward) - mTranslateVector.z = -mMoveScale; - - if (mBackward) - mTranslateVector.z = mMoveScale; - - if (mLeft) - mTranslateVector.x = -mMoveScale; - - if (mRight) - mTranslateVector.x = mMoveScale; - - mCamera->yaw(mRotX * mRotScale); - mCamera->pitch(mRotY * mRotScale); - mCamera->moveRelative(mTranslateVector); - - mTranslateVector = Vector3::ZERO; - mRotX = 0; - mRotY = 0; - - if (mSceneDisplay) { - mSceneDetailIndex = (mSceneDetailIndex+1)%2 ; // I Do not need points for now - switch(mSceneDetailIndex) { - case 0 : mCamera->setPolygonMode(PM_SOLID) ; break ; - case 1 : mCamera->setPolygonMode(PM_WIREFRAME) ; break ; - //case 2 : mCamera->setPolygonMode(PM_POINTS) ; break ; - } - mSceneDisplay = false; - } - - if (mPortalDisplay) { - // reuse - mSceneMgr->getOption("ShowPortals", &mPortalDisplay); - mPortalDisplay = !mPortalDisplay; - mSceneMgr->setOption("ShowPortals", &mPortalDisplay); - - mPortalDisplay = false; - } - - if (mScreenShot) { - char tmp[20]; - sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots); - RenderWindow* w = Ogre::Root::getSingleton().getAutoCreatedWindow(); - - w->writeContentsToFile(tmp); - - mScreenShot = false; - } - - mConsole->update(timePassed); - - // Temporary: Debug Overlay - static String currFps = "Current FPS: "; - static String avgFps = "Average FPS: "; - static String bestFps = "Best FPS: "; - static String worstFps = "Worst FPS: "; - static String tris = "Triangle Count: "; - static String batches = "Batch Count: "; - - if (mDebug) { - // update stats when necessary - try { - OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Opde/AverageFps"); - OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Opde/CurrFps"); - OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Opde/BestFps"); - OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement("Opde/WorstFps"); - - const RenderTarget::FrameStats& stats = mWindow->getStatistics(); - - guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS)); - guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS)); - guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS) - +" "+StringConverter::toString(stats.bestFrameTime)+" ms"); - guiWorst->setCaption(worstFps + StringConverter::toString(stats.worstFPS) - +" "+StringConverter::toString(stats.worstFrameTime)+" ms"); - - OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement("Opde/NumTris"); - guiTris->setCaption(tris + StringConverter::toString(stats.triangleCount)); - - OverlayElement* guiBatches = OverlayManager::getSingleton().getOverlayElement("Opde/NumBatches"); - guiBatches->setCaption(batches + StringConverter::toString(stats.batchCount)); - - // OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText"); - } - catch(...) - { - // ignore - } - - // update the portal statistics - try { - // Volca: I've disabled the timing reports, they need a patch of SM to work - OverlayElement* guibc = OverlayManager::getSingleton().getOverlayElement("Opde/BackCulls"); - OverlayElement* guiep = OverlayManager::getSingleton().getOverlayElement("Opde/EvalPorts"); - OverlayElement* guirc = OverlayManager::getSingleton().getOverlayElement("Opde/RendCells"); - OverlayElement* guitt = OverlayManager::getSingleton().getOverlayElement("Opde/TravTime"); - OverlayElement* guisr = OverlayManager::getSingleton().getOverlayElement("Opde/StaticRenderTime"); - - // Temporary: Debug Overlay - static String sbc = "Backface culls: "; - static String sep = "Evaluated portals: "; - static String src = "Rendered cells: "; - static String stt = "Traversal Time: "; - static String ssr = "Static Build Time: "; - - uint bculls = 0, eports = 0, rendc = 0, travtm = 0; - - unsigned long statbt; - - mSceneMgr->getOption("BackfaceCulls", &bculls); - - // mSceneMgr->getOption("CellsRendered", &rendc); - mSceneMgr->getOption("EvaluatedPortals", &eports); - // mSceneMgr->getOption("TraversalTime", &travtm); - mSceneMgr->getOption("StaticBuildTime", &statbt); - - travtm = static_cast<DarkCamera*>(mCamera)->getTraversalTime(); - rendc = static_cast<DarkCamera*>(mCamera)->getVisibleCellCount(); - - guibc->setCaption(sbc + StringConverter::toString(bculls)); - guiep->setCaption(sep + StringConverter::toString(eports)); - guirc->setCaption(src + StringConverter::toString(rendc)); - guitt->setCaption(stt + StringConverter::toString(travtm) + " ms"); - guisr->setCaption(ssr + StringConverter::toString(statbt) + " ms"); - } - catch(...) - { - // ignore - } - } - } - - bool GamePlayState::keyPressed( const OIS::KeyEvent &e ) { - if( e.key == KC_F12 ) { - mConsole->setActive(!mConsole->isActive()); - return true; - } - - if (!mConsole->injectKeyPress(e)) { - if(e.key == KC_W) { - mForward = true; - return true; - } else if(e.key == KC_S) { - mBackward = true; - return true; - } else if(e.key == KC_A) { - mLeft = true; - return true; - } else if(e.key == KC_D) { - mRight = true; - return true; - } else if (e.key == KC_SYSRQ || e.key == KC_F5) { - mScreenShot = true; - return true; - } else if (e.key == KC_O) { - mSceneDisplay = true; - return true; - } else if (e.key == KC_P) { - mPortalDisplay = true; - return true; - } else return true; - } else { - return true; - }; - } - - bool GamePlayState::keyReleased( const OIS::KeyEvent &e ) { - if (!mConsole->isActive()) { - if(e.key == KC_W) { - mForward = false; - return true; - } else if(e.key == KC_S) { - mBackward = false; - return true; - } else if(e.key == KC_A) { - mLeft = false; - return true; - } else if(e.key == KC_D) { - mRight = false; - return true; - } else if( e.key == KC_ESCAPE ) { - requestTermination(); - return true; - } else if (e.key == KC_I) { - mShadows = !mShadows; - - if (mShadows) - mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); - else - mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE); - } - - return true; - } else return true; - } - - bool GamePlayState::mouseMoved( const OIS::MouseEvent &e ) { - mRotX -= Degree( e.state.X.rel * 20.00); - // use Y axis invert - mRotY -= Degree( e.state.Y.rel * 20.00 * mRotateYFactor); - return false; - } - - bool GamePlayState::mousePressed( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { - return false; - } - - bool GamePlayState::mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { - return false; - } - - void GamePlayState::commandExecuted(std::string command, std::string parameters) { - std::cerr << "command " << command << " " << parameters << std::endl; - - if (command == "load") { - // specify the mission file to load by the load state, then switch to the load state - mConfigService->setParam("mission", parameters); - mToLoadScreen = true; - popState(); - } else if (command == "fps") { - const RenderTarget::FrameStats& stats = mWindow->getStatistics(); - - LOG_INFO("Average FPS : %10.2f", stats.avgFPS); - LOG_INFO("Last FPS : %10.2f", stats.lastFPS); - LOG_INFO("Worst FPS : %10.2f", stats.worstFPS); - } - } - - void GamePlayState::onLinkPlayerFactoryMsg(const LinkChangeMsg& msg) { - switch (msg.change) { - case PROP_ADDED : { - LOG_INFO("GamePlayState: Found StartingPoint"); - // get the Link ref. - LinkPtr l = mPlayerFactoryRelation->getLink(msg.linkID); - StartingPointObjID = l->src(); - break; - } - } - } - - void GamePlayState::bootstrapFinished() { - mLinkService = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); - Relation::ListenerPtr metaPropCallback = - new ClassCallback<LinkChangeMsg, GamePlayState>(this, &GamePlayState::onLinkPlayerFactoryMsg); - - mPlayerFactoryRelation = mLinkService->getRelation("PlayerFactory"); - - if (mPlayerFactoryRelation.isNull()) - OPDE_EXCEPT("MetaProp relation not found. Fatal.", "InheritService::init"); - - mPlayerFactoryListenerID = mPlayerFactoryRelation->registerListener(metaPropCallback); - LOG_INFO("GamePlayState::bootstrapFinished() - done"); - } - - GamePlayState& GamePlayState::getSingleton() { - assert(ms_Singleton); return *ms_Singleton; - } - - GamePlayState* GamePlayState::getSingletonPtr() { - return ms_Singleton; - } - -} - +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#include "config.h" + +#include "GamePlayState.h" +#include "OIS.h" +#include "GameStateManager.h" + +#include "GameLoadState.h" +#include "logger.h" +#include "integers.h" + +#include "DarkCamera.h" + +#include <OgreRenderWindow.h> +#include <OgreOverlayElement.h> +#include <OgreStringConverter.h> + +using namespace Ogre; +using namespace OIS; + +namespace Opde { + + template<> GamePlayState* Singleton<GamePlayState>::ms_Singleton = 0; + + GamePlayState::GamePlayState() : mSceneMgr(NULL), mToLoadScreen(true), mDebugOverlay(NULL) { + /// Register as a command listener, so we can load different levels + Opde::ConsoleBackend::getSingleton().registerCommandListener("load", dynamic_cast<ConsoleCommandListener*>(this)); + Opde::ConsoleBackend::getSingleton().setCommandHint("load", "Loads a specified mission file"); + Opde::ConsoleBackend::getSingleton().registerCommandListener("fps", dynamic_cast<ConsoleCommandListener*>(this)); + Opde::ConsoleBackend::getSingleton().setCommandHint("fps", "Dump FPS stats"); + + mRotateSpeed = 36; + mMoveSpeed = 50; + mRotateYFactor = 1; + + mShadows = false; + mSceneDisplay = false; + + // Try to remap the parameters with those listed in the configuration + mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); + + if (mConfigService->hasParam("move_speed")) + mMoveSpeed = mConfigService->getParam("move_speed").toFloat(); + + if (mConfigService->hasParam("mouse_speed")) + mRotateSpeed = mConfigService->getParam("mouse_speed").toFloat(); + + if (mConfigService->hasParam("mouse_invert")) + mRotateYFactor = mConfigService->getParam("mouse_invert").toFloat(); + + mTranslateVector = Vector3::ZERO; + mRotX = 0; + mRotY = 0; + + mForward = false; + mBackward = false; + mLeft = false; + mRight = false; + + mScreenShot = false; + mSceneDisplay = false; + mPortalDisplay = false; + mDebug = false; + + mSceneDetailIndex = 0; + mNumScreenShots = 0; + + mRoot = Root::getSingletonPtr(); + mOverlayMgr = OverlayManager::getSingletonPtr(); + + mConsole = new ConsoleFrontend(); + mConsole->setActive(false); + + mDebugOverlay = OverlayManager::getSingleton().getByName("Opde/DebugOverlay"); + + // Portal stats overlay + mPortalOverlay = OverlayManager::getSingleton().getByName("Opde/OpdeDebugOverlay"); + + mShadows = true; + } + + GamePlayState::~GamePlayState() { + delete mConsole; + } + + void GamePlayState::start() { + LOG_INFO("GamePlayState: Starting"); + PropertyGroup* posPG = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService"))->getPropertyGroup("Position"); + + if (posPG == NULL) + OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "GamePlayState::start"); + + LOG_DEBUG("Starting Point object id : %d", StartingPointObjID); + + DVariant spoint; + posPG->get(StartingPointObjID, "position", spoint); + + Vector3 StartingPoint(0,0,0); + + if (spoint.type() == DVariant::DV_VECTOR) + StartingPoint = spoint.toVector(); + + LOG_DEBUG("Starting Point position : %f %f %f", StartingPoint.x, StartingPoint.y, StartingPoint.z); + +// std::string tmp = PropertyGroup->get(StartingPointObjID, "SymName").toString(); + mSceneMgr = mRoot->getSceneManager( "DarkSceneManager" ); + RenderServicePtr renderSrv = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); + + mCamera = renderSrv->getDefaultCamera(); + mViewport = renderSrv->getDefaultViewport(); + mWindow = renderSrv->getRenderWindow(); + + mSceneMgr->clearSpecialCaseRenderQueues(); + mSceneMgr->setSpecialCaseRenderQueueMode(SceneManager::SCRQM_EXCLUDE); + + mCamera->setNearClipDistance(0.5); + mCamera->setFarClipDistance(4000); + + // Also change position, and set Quake-type orientation + ViewPoint vp = mSceneMgr->getSuggestedViewpoint(true); + mCamera->setPosition(vp.position); + + if (StartingPointObjID != 0) + mCamera->setPosition(StartingPoint); + + mCamera->pitch(Degree(90)); + mCamera->rotate(vp.orientation); + + // Don't yaw along variable axis, causes leaning + mCamera->setFixedYawAxis(true, Vector3::UNIT_Z); + + + // Thiefy FOV + mCamera->setFOVy(Degree(70)); + + if (mConfigService->hasParam("debug")) { + if (mConfigService->getParam("debug") == true) { + // debug overlay + mDebugOverlay->show(); + + // Portal stats overlay + mPortalOverlay->show(); + + mDebug = true; + } + } + + // hidden as default + mConsole->setActive(false); + + mWindow->resetStatistics(); + + mToLoadScreen = false; + + LOG_INFO("GamePlayState: Started"); + } + + void GamePlayState::exit() { + LOG_INFO("GamePlayState: Exiting"); + + // mConsole->setActive(false); + + // clear the scene + mSceneMgr->clearScene(); + + mPortalOverlay->hide(); + mDebugOverlay->hide(); + mConsole->setActive(false); + mConsole->update(1); // to hide the console while exiting + + if (mToLoadScreen) { + pushState(GameLoadState::getSingletonPtr()); + mToLoadScreen = false; + } + + LOG_INFO("GamePlayState: Exited"); + } + + void GamePlayState::suspend() { + LOG_INFO("GamePlayState: Suspend?!"); + mToLoadScreen = false; + } + + void GamePlayState::resume() { + LOG_INFO("GamePlayState: Resume?!"); + mToLoadScreen = false; + } + + void GamePlayState::update(unsigned long timePassed) { + if (timePassed == 0) { + mMoveScale = 0.1f; + mRotScale = 0.1f; + } else { + mMoveScale = mMoveSpeed * timePassed / 1000.0f; + mRotScale = mRotateSpeed * timePassed / 1000.0f; + } + + // Quick hack. Let the camera move: + if (mForward) + mTranslateVector.z = -mMoveScale; + + if (mBackward) + mTranslateVector.z = mMoveScale; + + if (mLeft) + mTranslateVector.x = -mMoveScale; + + if (mRight) + mTranslateVector.x = mMoveScale; + + mCamera->yaw(mRotX * mRotScale); + mCamera->pitch(mRotY * mRotScale); + mCamera->moveRelative(mTranslateVector); + + mTranslateVector = Vector3::ZERO; + mRotX = 0; + mRotY = 0; + + if (mSceneDisplay) { + mSceneDetailIndex = (mSceneDetailIndex+1)%2 ; // I Do not need points for now + switch(mSceneDetailIndex) { + case 0 : mCamera->setPolygonMode(PM_SOLID) ; break ; + case 1 : mCamera->setPolygonMode(PM_WIREFRAME) ; break ; + //case 2 : mCamera->setPolygonMode(PM_POINTS) ; break ; + } + mSceneDisplay = false; + } + + if (mPortalDisplay) { + // reuse + mSceneMgr->getOption("ShowPortals", &mPortalDisplay); + mPortalDisplay = !mPortalDisplay; + mSceneMgr->setOption("ShowPortals", &mPortalDisplay); + + mPortalDisplay = false; + } + + if (mScreenShot) { + char tmp[20]; + sprintf(tmp, "screenshot_%d.png", ++mNumScreenShots); + RenderWindow* w = Ogre::Root::getSingleton().getAutoCreatedWindow(); + + w->writeContentsToFile(tmp); + + mScreenShot = false; + } + + mConsole->update(timePassed); + + // Temporary: Debug Overlay + static String currFps = "Current FPS: "; + static String avgFps = "Average FPS: "; + static String bestFps = "Best FPS: "; + static String worstFps = "Worst FPS: "; + static String tris = "Triangle Count: "; + static String batches = "Batch Count: "; + + if (mDebug) { + // update stats when necessary + try { + OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Opde/AverageFps"); + OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Opde/CurrFps"); + OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Opde/BestFps"); + OverlayElement* guiWorst = OverlayManager::getSingleton().getOverlayElement("Opde/WorstFps"); + + const RenderTarget::FrameStats& stats = mWindow->getStatistics(); + + guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS)); + guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS)); + guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS) + +" "+StringConverter::toString(stats.bestFrameTime)+" ms"); + guiWorst->setCaption(worstFps + StringConverter::toString(stats.worstFPS) + +" "+StringConverter::toString(stats.worstFrameTime)+" ms"); + + OverlayElement* guiTris = OverlayManager::getSingleton().getOverlayElement("Opde/NumTris"); + guiTris->setCaption(tris + StringConverter::toString(stats.triangleCount)); + + OverlayElement* guiBatches = OverlayManager::getSingleton().getOverlayElement("Opde/NumBatches"); + guiBatches->setCaption(batches + StringConverter::toString(stats.batchCount)); + + // OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText"); + } + catch(...) + { + // ignore + } + + // update the portal statistics + try { + // Volca: I've disabled the timing reports, they need a patch of SM to work + OverlayElement* guibc = OverlayManager::getSingleton().getOverlayElement("Opde/BackCulls"); + OverlayElement* guiep = OverlayManager::getSingleton().getOverlayElement("Opde/EvalPorts"); + OverlayElement* guirc = OverlayManager::getSingleton().getOverlayElement("Opde/RendCells"); + OverlayElement* guitt = OverlayManager::getSingleton().getOverlayElement("Opde/TravTime"); + OverlayElement* guisr = OverlayManager::getSingleton().getOverlayElement("Opde/StaticRenderTime"); + + // Temporary: Debug Overlay + static String sbc = "Backface culls: "; + static String sep = "Evaluated portals: "; + static String src = "Rendered cells: "; + static String stt = "Traversal Time: "; + static String ssr = "Static Build Time: "; + + uint bculls = 0, eports = 0, rendc = 0, travtm = 0; + + unsigned long statbt; + + mSceneMgr->getOption("BackfaceCulls", &bculls); + + // mSceneMgr->getOption("CellsRendered", &rendc); + mSceneMgr->getOption("EvaluatedPortals", &eports); + // mSceneMgr->getOption("TraversalTime", &travtm); + mSceneMgr->getOption("StaticBuildTime", &statbt); + + travtm = static_cast<DarkCamera*>(mCamera)->getTraversalTime(); + rendc = static_cast<DarkCamera*>(mCamera)->getVisibleCellCount(); + + guibc->setCaption(sbc + StringConverter::toString(bculls)); + guiep->setCaption(sep + StringConverter::toString(eports)); + guirc->setCaption(src + StringConverter::toString(rendc)); + guitt->setCaption(stt + StringConverter::toString(travtm) + " ms"); + guisr->setCaption(ssr + StringConverter::toString(statbt) + " ms"); + } + catch(...) + { + // ignore + } + } + } + + bool GamePlayState::keyPressed( const OIS::KeyEvent &e ) { + if( e.key == KC_F12 ) { + mConsole->setActive(!mConsole->isActive()); + return true; + } + + if (!mConsole->injectKeyPress(e)) { + if(e.key == KC_W) { + mForward = true; + return true; + } else if(e.key == KC_S) { + mBackward = true; + return true; + } else if(e.key == KC_A) { + mLeft = true; + return true; + } else if(e.key == KC_D) { + mRight = true; + return true; + } else if (e.key == KC_SYSRQ || e.key == KC_F5) { + mScreenShot = true; + return true; + } else if (e.key == KC_O) { + mSceneDisplay = true; + return true; + } else if (e.key == KC_P) { + mPortalDisplay = true; + return true; + } else return true; + } else { + return true; + }; + } + + bool GamePlayState::keyReleased( const OIS::KeyEvent &e ) { + if (!mConsole->isActive()) { + if(e.key == KC_W) { + mForward = false; + return true; + } else if(e.key == KC_S) { + mBackward = false; + return true; + } else if(e.key == KC_A) { + mLeft = false; + return true; + } else if(e.key == KC_D) { + mRight = false; + return true; + } else if( e.key == KC_ESCAPE ) { + requestTermination(); + return true; + } else if (e.key == KC_I) { + mShadows = !mShadows; + + if (mShadows) + mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); + else + mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE); + } + + return true; + } else return true; + } + + bool GamePlayState::mouseMoved( const OIS::MouseEvent &e ) { + mRotX -= Degree( e.state.X.rel * 20.00); + // use Y axis invert + mRotY -= Degree( e.state.Y.rel * 20.00 * mRotateYFactor); + return false; + } + + bool GamePlayState::mousePressed( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { + return false; + } + + bool GamePlayState::mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { + return false; + } + + void GamePlayState::commandExecuted(std::string command, std::string parameters) { + std::cerr << "command " << command << " " << parameters << std::endl; + + if (command == "load") { + // specify the mission file to load by the load state, then switch to the load state + mConfigService->setParam("mission", parameters); + mToLoadScreen = true; + popState(); + } else if (command == "fps") { + const RenderTarget::FrameStats& stats = mWindow->getStatistics(); + + LOG_INFO("Average FPS : %10.2f", stats.avgFPS); + LOG_INFO("Last FPS : %10.2f", stats.lastFPS); + LOG_INFO("Worst FPS : %10.2f", stats.worstFPS); + } + } + + void GamePlayState::onLinkPlayerFactoryMsg(const LinkChangeMsg& msg) { + switch (msg.change) { + case PROP_ADDED : { + LOG_INFO("GamePlayState: Found StartingPoint"); + // get the Link ref. + LinkPtr l = mPlayerFactoryRelation->getLink(msg.linkID); + StartingPointObjID = l->src(); + break; + } + } + } + + void GamePlayState::bootstrapFinished() { + mLinkService = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); + Relation::ListenerPtr metaPropCallback = + new ClassCallback<LinkChangeMsg, GamePlayState>(this, &GamePlayState::onLinkPlayerFactoryMsg); + + mPlayerFactoryRelation = mLinkService->getRelation("PlayerFactory"); + + if (mPlayerFactoryRelation.isNull()) + OPDE_EXCEPT("MetaProp relation not found. Fatal.", "InheritService::init"); + + mPlayerFactoryListenerID = mPlayerFactoryRelation->registerListener(metaPropCallback); + LOG_INFO("GamePlayState::bootstrapFinished() - done"); + } + + GamePlayState& GamePlayState::getSingleton() { + assert(ms_Singleton); return *ms_Singleton; + } + + GamePlayState* GamePlayState::getSingletonPtr() { + return ms_Singleton; + } + +} + Modified: trunk/src/main/GamePlayState.h =================================================================== --- trunk/src/main/GamePlayState.h 2008-09-24 17:34:41 UTC (rev 851) +++ trunk/src/main/GamePlayState.h 2008-09-24 17:36:30 UTC (rev 852) @@ -28,6 +28,10 @@ #include "GameState.h" #include "OpdeSingleton.h" #include "ConsoleFrontend.h" +#include "ConsoleCommandListener.h" +#include "LinkCommon.h" +#include "ConfigService.h" +#include "LinkService.h" #include <OgreMath.h> #include <OgreRoot.h> Modified: trunk/src/main/GameState.h =================================================================== --- trunk/src/main/GameState.h 2008-09-24 17:34:41 UTC (rev 851) +++ trunk/src/main/GameState.h 2008-09-24 17:36:30 UTC (rev 852) @@ -27,7 +27,6 @@ #include "config.h" -#include "RefCounted.h" #include <OIS.h> namespace Opde { Modified: trunk/src/main/OpdeDocGen.cpp =================================================================== --- trunk/src/main/OpdeDocGen.cpp 2008-09-24 17:34:41 UTC (rev 851) +++ trunk/src/main/OpdeDocGen.cpp 2008-09-24 17:36:30 UTC (rev 852) @@ -23,10 +23,10 @@ #include "config.h" -#include "GameStateManager.h" #include "OpdeException.h" #include "Root.h" #include "StringTokenizer.h" +#include "ConfigService.h" #include <OgreException.h> Modified: trunk/src/main/Root.h =================================================================== --- trunk/src/main/Root.h 2008-09-24 17:34:41 UTC (rev 851) +++ trunk/src/main/Root.h 2008-09-24 17:36:30 UTC (rev 852) @@ -100,6 +100,7 @@ protected: /// Registers all the service factories to the Service Manger void registerServiceFactories(); + /// Creates all the loop modes void setupLoopModes(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-06 20:00:21
|
Revision: 861 http://opde.svn.sourceforge.net/opde/?rev=861&view=rev Author: volca Date: 2008-10-06 19:57:35 +0000 (Mon, 06 Oct 2008) Log Message: ----------- * OpdeScript python script interpretter with opde bindings added * Some removal of temporary code, newlines Modified Paths: -------------- trunk/src/main/CMakeLists.txt trunk/src/main/Opde.cpp Added Paths: ----------- trunk/src/main/OpdeScript.cpp Modified: trunk/src/main/CMakeLists.txt =================================================================== --- trunk/src/main/CMakeLists.txt 2008-10-06 19:55:35 UTC (rev 860) +++ trunk/src/main/CMakeLists.txt 2008-10-06 19:57:35 UTC (rev 861) @@ -104,3 +104,18 @@ COMPILE_DEFINITIONS "OPDE_EXE_TARGET" ) +# Script executor executable +add_executable (opdeScript WIN32 + OpdeScript.cpp +) + +target_link_libraries( opdeScript + OpdeLib + ${OGRE_LIBRARIES} + ${OIS_LIBRARIES} + ${FREEIMAGE_LIBRARIES} +) + +SET_TARGET_PROPERTIES( opdeScript PROPERTIES + COMPILE_DEFINITIONS "OPDE_EXE_TARGET" +) Modified: trunk/src/main/Opde.cpp =================================================================== --- trunk/src/main/Opde.cpp 2008-10-06 19:55:35 UTC (rev 860) +++ trunk/src/main/Opde.cpp 2008-10-06 19:57:35 UTC (rev 861) @@ -1,85 +1,79 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - * - *****************************************************************************/ - -#include "config.h" - -#include "GameStateManager.h" -#include "OpdeException.h" - -#include <OgreException.h> - -#ifndef OPDE_EXE_TARGET -#error Opde exe target not defined! -#endif - - -using namespace Opde; - -#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 -#define WIN32_LEAN_AND_MEAN -#include "windows.h" - -INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) -{ - #if (OPDE_EXE_TARGET) - std::cout << "MY_SYMBOL was defined." << std::endl; - #else - std::cout << "MY_SYMBOL was NOT defined." << std::endl; - #endif - - std::string GameType(strCmdLine); -#else -int main(int argc, char**argv) -{ - std::string GameType = ""; - - if (argc >= 2) - GameType = argv[1]; -#endif - - // Create application object - GameStateManager* man = new GameStateManager(GameType); - - try { - man->run(); - } catch( Ogre::Exception& e ) { -#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 - MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); -#else - std::cerr << "An exception has occured: " << - e.getFullDescription().c_str() << std::endl; -#endif - - } catch( BasicException& e ) { -#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 - MessageBox( NULL, e.getDetails().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); -#else - std::cerr << "An exception has occured: " << - e.getDetails().c_str() << std::endl; -#endif - } - - delete man; - - return 0; -} +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#include "config.h" + +#include "GameStateManager.h" +#include "OpdeException.h" + +#include <OgreException.h> + +#ifndef OPDE_EXE_TARGET +#error OPDE_EXE_TARGET target not defined! +#endif + + +using namespace Opde; + +#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 +#define WIN32_LEAN_AND_MEAN +#include "windows.h" + +INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) +{ + std::string GameType(strCmdLine); +#else +int main(int argc, char**argv) +{ + std::string GameType = ""; + + if (argc >= 2) + GameType = argv[1]; +#endif + + // Create application object + GameStateManager* man = new GameStateManager(GameType); + + try { + man->run(); + } catch( Ogre::Exception& e ) { +#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 + MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); +#else + std::cerr << "An exception has occured: " << + e.getFullDescription().c_str() << std::endl; +#endif + + } catch( BasicException& e ) { +#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 + MessageBox( NULL, e.getDetails().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); +#else + std::cerr << "An exception has occured: " << + e.getDetails().c_str() << std::endl; +#endif + } + + delete man; + + return 0; +} Added: trunk/src/main/OpdeScript.cpp =================================================================== --- trunk/src/main/OpdeScript.cpp (rev 0) +++ trunk/src/main/OpdeScript.cpp 2008-10-06 19:57:35 UTC (rev 861) @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#include "config.h" + +#include "GameStateManager.h" +#include "OpdeException.h" +#include "bindings.h" + +#include <OgreException.h> + + +#ifndef OPDE_EXE_TARGET +#error OPDE_EXE_TARGET target not defined! +#endif + +using namespace Opde; + +#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 +#define WIN32_LEAN_AND_MEAN +#include "windows.h" + +INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) +{ + std::string scriptName(strCmdLine); +#else +int main(int argc, char**argv) +{ + std::string scriptName = ""; + + if (argc >= 2) + scriptName = argv[1]; +#endif + + if (scriptName != "") { + PythonLanguage::init(); + # TODO: Need a way to supply args to the script + PythonLanguage::runScript(scriptName.c_str()); + PythonLanguage::term(); + } else { + std::cerr << "opdeScript: Script name epected as a parameter!" << std::endl; + return 1; + } + + return 0; +} Property changes on: trunk/src/main/OpdeScript.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-07 19:25:27
|
Revision: 870 http://opde.svn.sourceforge.net/opde/?rev=870&view=rev Author: volca Date: 2008-10-07 19:25:14 +0000 (Tue, 07 Oct 2008) Log Message: ----------- * Make opdeScript a console app for win32 * Adding ProxyArchive (unfinished, but compiles) Modified Paths: -------------- trunk/src/main/CMakeLists.txt trunk/src/main/OpdeScript.cpp Added Paths: ----------- trunk/src/main/ProxyArchive.cpp trunk/src/main/ProxyArchive.h Modified: trunk/src/main/CMakeLists.txt =================================================================== --- trunk/src/main/CMakeLists.txt 2008-10-07 07:07:12 UTC (rev 869) +++ trunk/src/main/CMakeLists.txt 2008-10-07 19:25:14 UTC (rev 870) @@ -1,123 +1,125 @@ -INCLUDE( ${OPDE_SOURCE_DIR}/src/services/Services.cmake ) -INCLUDE( ${OPDE_SOURCE_DIR}/src/base/Base.cmake ) -INCLUDE( ${OPDE_SOURCE_DIR}/src/bindings/Bindings.cmake ) -INCLUDE( ${OPDE_SOURCE_DIR}/src/scenemanager/DarkSceneManager.cmake ) - -include_directories( - ${OGRE_INCLUDE_DIR} - ${OIS_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_BASE_INCLUDES} - ${OPDE_SOURCE_DIR}/src/compat - ${OPDE_SOURCE_DIR}/src/base/Dark - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SOURCE_DIR}/src/main - ${OPDE_SOURCE_DIR}/src/bindings - ${OPDE_SOURCE_DIR}/thirdparty/QuickGUI/include - ${OPDE_SERVICE_INCLUDES} - ${FREEIMAGE_INCLUDE_DIR} - ${PYTHON_INCLUDE_PATH} -) - -add_library (OpdeLib SHARED - Root.cpp - Root.h - DTypeScriptCompiler.cpp - DTypeScriptCompiler.h - PLDefScriptCompiler.cpp - PLDefScriptCompiler.h - DTypeScriptLoader.cpp - DTypeScriptLoader.h - PLDefScriptLoader.cpp - PLDefScriptLoader.h - CustomImageCodec.cpp - CustomImageCodec.h - # and the base lib files - ${OPDE_BASE_FILES} - # and service files as well - ${OPDE_SERVICE_FILES} - # and the python bindings - ${OPDE_BINDING_FILES} - # and the scene manager - ${OPDE_SCENEMANAGER_FILES} -) - -link_directories( - ${OPDE_BASE_INCLUDES} - ${OPDE_SOURCE_DIR}/src/scenemanager -) - -# We don't link any our own files here, as CMake does not support convenience libraries -target_link_libraries( OpdeLib - ${OGRE_LIBRARIES} - ${OIS_LIBRARIES} - ${FREEIMAGE_LIBRARIES} - ${PYTHON_LIBRARIES} - QuickGUI -) - -set_property(TARGET OpdeLib PROPERTY LINK_INTERFACE_LIBRARIES "") - -# Build flags for the .DLL __declspec things, etc. -SET_TARGET_PROPERTIES(OpdeLib PROPERTIES - DEFINE_SYMBOL "OPDELIB_DLL_TARGET" - LINK_INTERFACE_LIBRARIES "" -) - -if (NOT WIN32) - # Currently there is no need to build this on windows (and also it fails) - is there latex2html for windows anyway? - # Doc generator for opde - property and link types info generator - add_executable (opdeDocGen WIN32 - OpdeDocGen.cpp - ) - - target_link_libraries( opdeDocGen - OpdeLib - ) - - SET_TARGET_PROPERTIES(opdeDocGen PROPERTIES - COMPILE_DEFINITIONS "OPDE_EXE_TARGET" - ) -endif(NOT WIN32) - -# Main executable -add_executable (opde WIN32 - Opde.cpp - GameStateManager.cpp - GameState.cpp - GamePlayState.cpp - GameLoadState.cpp - GameStateManager.h - GameState.h - GamePlayState.h - GameLoadState.h -) - -target_link_libraries( opde - OpdeLib - ${OGRE_LIBRARIES} - ${OIS_LIBRARIES} - ${FREEIMAGE_LIBRARIES} -) - -SET_TARGET_PROPERTIES( opde PROPERTIES - COMPILE_DEFINITIONS "OPDE_EXE_TARGET" -) - -# Script executor executable -add_executable (opdeScript - OpdeScript.cpp -) - -target_link_libraries( opdeScript - OpdeLib - ${OGRE_LIBRARIES} - ${OIS_LIBRARIES} - ${FREEIMAGE_LIBRARIES} - ${PYTHON_LIBRARIES} -) - -SET_TARGET_PROPERTIES( opdeScript PROPERTIES - COMPILE_DEFINITIONS "OPDE_EXE_TARGET" -) - +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/Services.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/base/Base.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/bindings/Bindings.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/scenemanager/DarkSceneManager.cmake ) + +include_directories( + ${OGRE_INCLUDE_DIR} + ${OIS_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_BASE_INCLUDES} + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SOURCE_DIR}/src/main + ${OPDE_SOURCE_DIR}/src/bindings + ${OPDE_SOURCE_DIR}/thirdparty/QuickGUI/include + ${OPDE_SERVICE_INCLUDES} + ${FREEIMAGE_INCLUDE_DIR} + ${PYTHON_INCLUDE_PATH} +) + +add_library (OpdeLib SHARED + Root.cpp + Root.h + DTypeScriptCompiler.cpp + DTypeScriptCompiler.h + PLDefScriptCompiler.cpp + PLDefScriptCompiler.h + DTypeScriptLoader.cpp + DTypeScriptLoader.h + PLDefScriptLoader.cpp + PLDefScriptLoader.h + CustomImageCodec.cpp + CustomImageCodec.h + ProxyArchive.cpp + ProxyArchive.h + # and the base lib files + ${OPDE_BASE_FILES} + # and service files as well + ${OPDE_SERVICE_FILES} + # and the python bindings + ${OPDE_BINDING_FILES} + # and the scene manager + ${OPDE_SCENEMANAGER_FILES} +) + +link_directories( + ${OPDE_BASE_INCLUDES} + ${OPDE_SOURCE_DIR}/src/scenemanager +) + +# We don't link any our own files here, as CMake does not support convenience libraries +target_link_libraries( OpdeLib + ${OGRE_LIBRARIES} + ${OIS_LIBRARIES} + ${FREEIMAGE_LIBRARIES} + ${PYTHON_LIBRARIES} + QuickGUI +) + +set_property(TARGET OpdeLib PROPERTY LINK_INTERFACE_LIBRARIES "") + +# Build flags for the .DLL __declspec things, etc. +SET_TARGET_PROPERTIES(OpdeLib PROPERTIES + DEFINE_SYMBOL "OPDELIB_DLL_TARGET" + LINK_INTERFACE_LIBRARIES "" +) + +if (NOT WIN32) + # Currently there is no need to build this on windows (and also it fails) - is there latex2html for windows anyway? + # Doc generator for opde - property and link types info generator + add_executable (opdeDocGen WIN32 + OpdeDocGen.cpp + ) + + target_link_libraries( opdeDocGen + OpdeLib + ) + + SET_TARGET_PROPERTIES(opdeDocGen PROPERTIES + COMPILE_DEFINITIONS "OPDE_EXE_TARGET" + ) +endif(NOT WIN32) + +# Main executable +add_executable (opde WIN32 + Opde.cpp + GameStateManager.cpp + GameState.cpp + GamePlayState.cpp + GameLoadState.cpp + GameStateManager.h + GameState.h + GamePlayState.h + GameLoadState.h +) + +target_link_libraries( opde + OpdeLib + ${OGRE_LIBRARIES} + ${OIS_LIBRARIES} + ${FREEIMAGE_LIBRARIES} +) + +SET_TARGET_PROPERTIES( opde PROPERTIES + COMPILE_DEFINITIONS "OPDE_EXE_TARGET" +) + +# Script executor executable +add_executable (opdeScript + OpdeScript.cpp +) + +target_link_libraries( opdeScript + OpdeLib + ${OGRE_LIBRARIES} + ${OIS_LIBRARIES} + ${FREEIMAGE_LIBRARIES} + ${PYTHON_LIBRARIES} +) + +SET_TARGET_PROPERTIES( opdeScript PROPERTIES + COMPILE_DEFINITIONS "OPDE_EXE_TARGET" +) + Modified: trunk/src/main/OpdeScript.cpp =================================================================== --- trunk/src/main/OpdeScript.cpp 2008-10-07 07:07:12 UTC (rev 869) +++ trunk/src/main/OpdeScript.cpp 2008-10-07 19:25:14 UTC (rev 870) @@ -30,27 +30,14 @@ #include <OgreException.h> -#ifndef OPDE_EXE_TARGET -#error OPDE_EXE_TARGET target not defined! -#endif - using namespace Opde; -#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 -#define WIN32_LEAN_AND_MEAN -#include "windows.h" - -INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) -{ - std::string scriptName(strCmdLine); -#else int main(int argc, char**argv) { std::string scriptName = ""; if (argc >= 2) scriptName = argv[1]; -#endif if (scriptName != "") { PythonLanguage::init(); Added: trunk/src/main/ProxyArchive.cpp =================================================================== --- trunk/src/main/ProxyArchive.cpp (rev 0) +++ trunk/src/main/ProxyArchive.cpp 2008-10-07 19:25:14 UTC (rev 870) @@ -0,0 +1,219 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#include "ProxyArchive.h" +#include <fnmatch.h> + +#include <OgreException.h> +#include <OgreString.h> + +namespace Ogre { + + // ------------------------------------------------------- + ProxyArchive::ProxyArchive(const String& name, const String& archType) : + Archive(name, archType) { + + createArchive(); + assert(mArchive); + } + + // ------------------------------------------------------- + ProxyArchive::~ProxyArchive(void) { + destroyArchive(); + } + + // ------------------------------------------------------- + void ProxyArchive::load(void) { + // load, build map + mArchive->load(); + + StringVectorPtr lst = mArchive->list(true, false); + + StringVector::iterator it = lst->begin(); + + while (it != lst->end()) { + const std::string& fn = *it++; + std::string tn = transformName(fn); + // insert into the map + std::pair<NameTable::iterator, bool> result = + mExtToIntNames.insert(std::make_pair(tn, fn)); + + // see if the result is ok, except if not + if (!result.second) + OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, + "Archive '" + mName + "' contains duplicities : " + fn, + "ProxyArchive::load"); + } + } + + + // ------------------------------------------------------- + void ProxyArchive::unload(void) { + mArchive->unload(); + + mExtToIntNames.clear(); + } + + // ------------------------------------------------------- + FileInfoListPtr ProxyArchive::findFileInfo(const String& pattern, bool recursive , bool dirs) { + /// have to list all infos, filter those which fit + FileInfoListPtr lst = listFileInfo(recursive, dirs); + + FileInfoListPtr res(new FileInfoList()); + + /// now iterate, the list, match using the name, return + FileInfoList::iterator it = lst->begin(); + + while (it != lst->end()) { + const FileInfo& fi = *it++; + // match? + if (match(pattern, fi.filename)) { + res->push_back(fi); + } + } + + return res; + } + + // ------------------------------------------------------- + bool ProxyArchive::exists(const String& filename) { + // look in the map + NameTable::iterator it = mExtToIntNames.find(filename); + + if (it != mExtToIntNames.end()) { + return mArchive->exists(it->second); + } + + return false; + } + + // ------------------------------------------------------- + StringVectorPtr ProxyArchive::find(const String& pattern, bool recursive , bool dirs) { + /// have to list all infos, filter those which fit + StringVectorPtr lst = list(recursive, dirs); + + StringVectorPtr res(new StringVector()); + + /// now iterate, the list, match using the name, return + StringVector::iterator it = lst->begin(); + + while (it != lst->end()) { + const String& fn = *it++; + // match? + if (match(pattern, fn)) { + res->push_back(fn); + } + } + + return res; + } + + // ------------------------------------------------------- + FileInfoListPtr ProxyArchive::listFileInfo(bool recursive , bool dirs) { + FileInfoListPtr list = mArchive->listFileInfo(recursive, dirs); + + FileInfoListPtr res(new FileInfoList()); + + /// now iterate, the list, match using the name, return + FileInfoList::iterator it = list->begin(); + + while (it != list->end()) { + const FileInfo& fi = *it++; + + FileInfo fin; + + fin.archive = this; + fin.filename = transformName(fi.filename); + fin.path = transformName(fi.path); + fin.basename = transformName(fi.basename); + + fin.compressedSize = fi.compressedSize; + fin.uncompressedSize = fi.uncompressedSize; + + res->push_back(fin); + } + + return res; + } + + // ------------------------------------------------------- + StringVectorPtr ProxyArchive::list(bool recursive , bool dirs) { + /// have to list all infos, filter those which fit + StringVectorPtr lst = list(recursive, dirs); + + StringVectorPtr res(new StringVector()); + + /// now iterate, the list, match using the name, return + StringVector::iterator it = lst->begin(); + + while (it != lst->end()) { + const String& fn = *it++; + + res->push_back(transformName(fn)); + } + + return res; + } + + // ------------------------------------------------------- + DataStreamPtr ProxyArchive::open(const String& filename) const { + String utfn = untransformName(filename); + return mArchive->open(utfn); + } + + // ------------------------------------------------------- + std::string ProxyArchive::untransformName(const String& name) const { + NameTable::const_iterator it = mExtToIntNames.find(name); + + if (it != mExtToIntNames.end()) { + return it->second; + } else { + OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND, + "Archive '" + mName + "' does not contain file : " + name, + "ProxyArchive::untransformName"); + } + } + + // ------------------------------------------------------- + bool ProxyArchive::match(const String& pattern, const String& name) const { + String unt = untransformName(name); + StringUtil::toLowerCase(unt); + String lpattern = pattern; + StringUtil::toLowerCase(lpattern); + + // match using fnmatch + return fnmatch(lpattern.c_str(), unt.c_str(), 0); + } + + // ------------------------------------------------------- + void ProxyArchive::createArchive(void) { + mArchive = NULL; + } + + + // ------------------------------------------------------- + void ProxyArchive::destroyArchive(void) { + // nothing + } + +} Property changes on: trunk/src/main/ProxyArchive.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/src/main/ProxyArchive.h =================================================================== --- trunk/src/main/ProxyArchive.h (rev 0) +++ trunk/src/main/ProxyArchive.h 2008-10-07 19:25:14 UTC (rev 870) @@ -0,0 +1,121 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#ifndef __PROXYARCHIVE_H +#define __PROXYARCHIVE_H + +#include "config.h" +#include "OgreArchive.h" + +namespace Ogre { + + /** Proxy archive, which performs name transforms and delegates to underlying archive instance. + * There are couple different possible usages for this archive class: + * 1. A case insensitive filesystem archive on *nix systems + * 2. A ZIP file handler which includes the FNAME.ZIP as FNAME/ in all names of the archive + * 3. Other + * + * + * In Opde, this class is used to mask the fact about the resource's source (crf file or not), and + * make ogre's file system archive case insensitive on *nix systems. + * + * @todo The final piece of puzzle will be a class that autoloads crf files as resources \ + * for the predefined group, and a resource listener that allows duplicate resource names in some way + */ + class OPDELIB_EXPORT ProxyArchive : public Archive { + public: + /// constructor + ProxyArchive(const String& name, const String& archType); + + /// destructor + virtual ~ProxyArchive(void); + + /// performs the archive load. Scans the archive for filenames, builds the reverse transform table + virtual void load(void); + + /// Unloads the archive, clears the transform map + virtual void unload(void); + + /// opens a resource stream, unmapping the name first + virtual DataStreamPtr open(const String& filename) const; + + /// lists the contents of the archive. transformed. + virtual StringVectorPtr list(bool recursive = true, bool dirs = false); + + /// lists the contents of the archive. transformed, in the FileInfo structures. + virtual FileInfoListPtr listFileInfo(bool recursive = true, bool dirs = false); + + /// performs a pattern match find on the archive files + virtual StringVectorPtr find(const String& pattern, bool recursive = true, + bool dirs = false) = 0; + + /// Searches for the given name, untransforming it first + virtual bool exists(const String& filename); + + /** Searches for files that match the given pattern + * @see find + */ + virtual FileInfoListPtr findFileInfo(const String& pattern, + bool recursive = true, bool dirs = false); + + /// reports case sensitiveness of this proxy archive + virtual bool isCaseSensitive(void) const = 0; + + protected: + /// performs the forward transform on a single name + virtual String transformName(const String& name) = 0; + + /// performs an inverse transform on a single name, turning internal name from the external one + virtual String untransformName(const String& name) const; + + /** compares if the given filename matches the pattern + * By default, this does case insensitive filename match on the untransformed name + */ + virtual bool match(const String& pattern, const String& name) const; + + /// constructs the archive. called from constructor + virtual void createArchive(void); + + /// destructs the archive. called from destructor + virtual void destroyArchive(void); + + typedef std::map<std::string, std::string> NameTable; + + NameTable mExtToIntNames; + + Archive* mArchive; + }; + + /*class CaseLessFileSystemArchive : public ProxyArchive<FileSystemArchive> { + protected: + virtual std::string transformName(const std::string& name) = 0; + } + + /// factory for the various types of ProxyArchive + class ProxyArchiveFactory<class PA> { + // TODO: finish this + } + */ +} + +#endif Property changes on: trunk/src/main/ProxyArchive.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-19 20:05:39
|
Revision: 889 http://opde.svn.sourceforge.net/opde/?rev=889&view=rev Author: volca Date: 2008-10-19 20:05:34 +0000 (Sun, 19 Oct 2008) Log Message: ----------- ProxyArchives implemented Modified Paths: -------------- trunk/src/main/ProxyArchive.cpp trunk/src/main/ProxyArchive.h Modified: trunk/src/main/ProxyArchive.cpp =================================================================== --- trunk/src/main/ProxyArchive.cpp 2008-10-19 12:31:35 UTC (rev 888) +++ trunk/src/main/ProxyArchive.cpp 2008-10-19 20:05:34 UTC (rev 889) @@ -25,20 +25,20 @@ #include <OgreException.h> #include <OgreString.h> +#include <OgreFileSystem.h> +#include <OgreZip.h> namespace Ogre { - // ------------------------------------------------------- + // ----- Proxy Archive ----------------------------------- + // ------------------------------------------------------- ProxyArchive::ProxyArchive(const String& name, const String& archType) : - Archive(name, archType) { - - createArchive(); - assert(mArchive); + Archive(name, archType), + mArchive(NULL) { } // ------------------------------------------------------- ProxyArchive::~ProxyArchive(void) { - destroyArchive(); } // ------------------------------------------------------- @@ -53,6 +53,7 @@ while (it != lst->end()) { const std::string& fn = *it++; std::string tn = transformName(fn); + StringUtil::toLowerCase(tn); // insert into the map std::pair<NameTable::iterator, bool> result = mExtToIntNames.insert(std::make_pair(tn, fn)); @@ -96,14 +97,12 @@ // ------------------------------------------------------- bool ProxyArchive::exists(const String& filename) { - // look in the map - NameTable::iterator it = mExtToIntNames.find(filename); - - if (it != mExtToIntNames.end()) { - return mArchive->exists(it->second); + try { + String un = untransformName(filename); + return mArchive->exists(un); + } catch (Ogre::Exception &e) { + return false; } - - return false; } // ------------------------------------------------------- @@ -158,7 +157,7 @@ // ------------------------------------------------------- StringVectorPtr ProxyArchive::list(bool recursive , bool dirs) { /// have to list all infos, filter those which fit - StringVectorPtr lst = list(recursive, dirs); + StringVectorPtr lst = mArchive->list(recursive, dirs); StringVectorPtr res(new StringVector()); @@ -182,7 +181,9 @@ // ------------------------------------------------------- std::string ProxyArchive::untransformName(const String& name) const { - NameTable::const_iterator it = mExtToIntNames.find(name); + String s = name; + StringUtil::toLowerCase(s); + NameTable::const_iterator it = mExtToIntNames.find(s); if (it != mExtToIntNames.end()) { return it->second; @@ -270,15 +271,78 @@ return match; } + // ------------------------------------------------------- - void ProxyArchive::createArchive(void) { - mArchive = NULL; + // ----- CaseLess Archive -------------------------------- + // ------------------------------------------------------- + CaseLessFileSystemArchive::CaseLessFileSystemArchive(const String& name, + const String& archType) : ProxyArchive(name, archType) { + + mArchive = new Ogre::FileSystemArchive(mName, mType); } - - + // ------------------------------------------------------- - void ProxyArchive::destroyArchive(void) { - // nothing + CaseLessFileSystemArchive::~CaseLessFileSystemArchive(void) { + delete mArchive; } + + // ------------------------------------------------------- + bool CaseLessFileSystemArchive::isCaseSensitive(void) const { + return false; + } + // ------------------------------------------------------- + String CaseLessFileSystemArchive::transformName(const std::string& name) { + // simple - just lowercase the name + String res = name; + StringUtil::toLowerCase(res); + return res; + } + + // ------------------------------------------------------- + // ----- CRF Archive ------------------------------------- + // ------------------------------------------------------- + CRFArchive::CRFArchive(const String& name, + const String& archType) : ProxyArchive(name, archType) { + + // split, we only want the file name part + String ext, path; + StringUtil::splitFullFilename(name, mFilePart, ext, path); + + StringUtil::toLowerCase(mFilePart); + + mFilePart += '/'; + + mArchive = new Ogre::ZipArchive(mName, mType); + } + + // ------------------------------------------------------- + CRFArchive::~CRFArchive(void) { + delete mArchive; + } + + // ------------------------------------------------------- + bool CRFArchive::isCaseSensitive(void) const { + return false; + } + + // ------------------------------------------------------- + String CRFArchive::transformName(const std::string& name) { + String res = name; + StringUtil::toLowerCase(res); + // just lowercase the name, and prefix with the mFilePart + return mFilePart + res; + } + + // ------------------------------------------------------- + const String& CaseLessFileSystemArchiveFactory::getType(void) const { + static String name = "Dir"; + return name; + } + + // ------------------------------------------------------- + const String& CrfArchiveFactory::getType(void) const { + static String name = "Crf"; + return name; + } } Modified: trunk/src/main/ProxyArchive.h =================================================================== --- trunk/src/main/ProxyArchive.h 2008-10-19 12:31:35 UTC (rev 888) +++ trunk/src/main/ProxyArchive.h 2008-10-19 20:05:34 UTC (rev 889) @@ -25,7 +25,9 @@ #define __PROXYARCHIVE_H #include "config.h" -#include "OgreArchive.h" + +#include <OgreArchive.h> +#include <OgreArchiveFactory.h> namespace Ogre { @@ -67,7 +69,7 @@ /// performs a pattern match find on the archive files virtual StringVectorPtr find(const String& pattern, bool recursive = true, - bool dirs = false) = 0; + bool dirs = false); /// Searches for the given name, untransforming it first virtual bool exists(const String& filename); @@ -93,12 +95,6 @@ */ virtual bool match(const String& pattern, const String& name) const; - /// constructs the archive. called from constructor - virtual void createArchive(void); - - /// destructs the archive. called from destructor - virtual void destroyArchive(void); - typedef std::map<std::string, std::string> NameTable; NameTable mExtToIntNames; @@ -106,16 +102,61 @@ Archive* mArchive; }; - /*class CaseLessFileSystemArchive : public ProxyArchive<FileSystemArchive> { + /// Lowercase transforming file system archive + class CaseLessFileSystemArchive : public ProxyArchive { + public: + CaseLessFileSystemArchive(const String& name, const String& archType); + ~CaseLessFileSystemArchive(void); + + bool isCaseSensitive(void) const; + protected: - virtual std::string transformName(const std::string& name) = 0; - } + String transformName(const std::string& name); + + }; - /// factory for the various types of ProxyArchive - class ProxyArchiveFactory<class PA> { - // TODO: finish this - } - */ + /// Zip archive wrapper that prefixes the file names with the name without extesion (fam.crf -> fam/*) + class CRFArchive : public ProxyArchive { + public: + CRFArchive(const String& name, const String& archType); + ~CRFArchive(void); + + bool isCaseSensitive(void) const; + + protected: + String transformName(const std::string& name); + + String mFilePart; + }; + + // Factories, so we can actually use these + + class CaseLessFileSystemArchiveFactory : public ArchiveFactory { // what a title! + public: + virtual ~CaseLessFileSystemArchiveFactory() {} + + const String& getType(void) const; + + Archive* createInstance(const String& name) { + return new CaseLessFileSystemArchive(name, "Dir"); + } + + void destroyInstance( Archive* arch) { delete arch; } + }; + + class CrfArchiveFactory : public ArchiveFactory { + public: + virtual ~CrfArchiveFactory() {} + + const String& getType(void) const; + + Archive* createInstance(const String& name) { + return new CRFArchive(name, "Crf"); + } + + void destroyInstance( Archive* arch) { delete arch; } + }; + } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-12-19 22:40:13
|
Revision: 1039 http://opde.svn.sourceforge.net/opde/?rev=1039&view=rev Author: patryn Date: 2008-12-19 22:40:05 +0000 (Fri, 19 Dec 2008) Log Message: ----------- Added empty bodies for the recently added pure virtual functions in OgreSDK so the code would compile. Later we can decide what we want to do with them. Modified Paths: -------------- trunk/src/main/CustomImageCodec.h trunk/src/main/ProxyArchive.h Modified: trunk/src/main/CustomImageCodec.h =================================================================== --- trunk/src/main/CustomImageCodec.h 2008-12-19 22:17:22 UTC (rev 1038) +++ trunk/src/main/CustomImageCodec.h 2008-12-19 22:40:05 UTC (rev 1039) @@ -72,6 +72,8 @@ /// Static method to shutdown FreeImage and unregister the FreeImage codecs static void shutdown(void); + + String magicNumberToFileExt(const char *magicNumberPtr, size_t maxbytes) const {return "";}; }; Modified: trunk/src/main/ProxyArchive.h =================================================================== --- trunk/src/main/ProxyArchive.h 2008-12-19 22:17:22 UTC (rev 1038) +++ trunk/src/main/ProxyArchive.h 2008-12-19 22:40:05 UTC (rev 1039) @@ -83,6 +83,8 @@ /// reports case sensitiveness of this proxy archive virtual bool isCaseSensitive(void) const = 0; + time_t getModifiedTime(const String& filename) {return 0;}; + protected: /// performs the forward transform on a single name virtual String transformName(const String& name) = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-02-16 21:05:30
|
Revision: 1137 http://opde.svn.sourceforge.net/opde/?rev=1137&view=rev Author: volca Date: 2009-02-16 21:05:25 +0000 (Mon, 16 Feb 2009) Log Message: ----------- some testing code added (commented out for now) Modified Paths: -------------- trunk/src/main/GamePlayState.cpp trunk/src/main/GamePlayState.h Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2009-02-16 21:02:21 UTC (rev 1136) +++ trunk/src/main/GamePlayState.cpp 2009-02-16 21:05:25 UTC (rev 1137) @@ -33,6 +33,8 @@ #include "DarkCamera.h" +#include "TextureAtlas.h" + #include <OgreRenderWindow.h> #include <OgreOverlayElement.h> #include <OgreStringConverter.h> @@ -180,7 +182,43 @@ mWindow->resetStatistics(); mToLoadScreen = false; + /* + mDrawService = GET_SERVICE(DrawService); + mCamera->setPosition(0,10,-15); + mCamera->lookAt(0,0,30); + mCamera->setNearClipDistance(0.5f); + mSceneMgr->setAmbientLight(ColourValue(1, 1, 1)); + + TextureAtlas* ta = mDrawService->createAtlas(); + DrawSource* ds = ta->createDrawSource("access.pcx", "General"); + // testing what happens when a font is loaded (e.g. where it segv's) + FontDrawSource* fds = mDrawService->loadFont(ta, "fonts/MAINFONT.FON" , "General"); + FontDrawSource* fds1 = mDrawService->loadFont(ta, "fonts/MAINAA.FON" , "General"); + + ta->build(); + + RenderedLabel* rl = mDrawService->createRenderedLabel(fds, "OpenDarkEngine test"); + RenderedLabel* rl2 = mDrawService->createRenderedLabel(fds, "TEST 2"); + rl->setPosition(250, 100); + rl2->setPosition(250, 120); + + mRi = mDrawService->createRenderedImage(ds); + + mRi->setZOrder(DrawService::MAX_Z_VALUE); + mRi->setPosition(0, 0); + + DrawSheet* dsh = mDrawService->createSheet("GameScreen"); + + dsh->addDrawOperation(mRi); + dsh->addDrawOperation(rl); + dsh->addDrawOperation(rl2); + + dsh->setVisible(true); + + mSceneMgr->getRootSceneNode()->attachObject(dsh); + mDrawService->setActiveSheet(dsh); + */ LOG_INFO("GamePlayState: Started"); } @@ -440,6 +478,8 @@ } bool GamePlayState::mouseMoved( const OIS::MouseEvent &e ) { + // mRi->setPosition(e.state.X.abs, e.state.Y.abs); + mRotX -= Degree( e.state.X.rel * 20.00); // use Y axis invert mRotY -= Degree( e.state.Y.rel * 20.00 * mRotateYFactor); Modified: trunk/src/main/GamePlayState.h =================================================================== --- trunk/src/main/GamePlayState.h 2009-02-16 21:02:21 UTC (rev 1136) +++ trunk/src/main/GamePlayState.h 2009-02-16 21:05:25 UTC (rev 1137) @@ -34,6 +34,7 @@ #include "LinkCommon.h" #include "ConfigService.h" #include "LinkService.h" +#include "DrawService.h" #include <OgreMath.h> #include <OgreRoot.h> @@ -122,6 +123,8 @@ int mNumScreenShots; // config service ConfigServicePtr mConfigService; + + RenderedImage* mRi; private: /// Direct link to the player factory relation RelationPtr mPlayerFactoryRelation; @@ -130,6 +133,8 @@ int StartingPointObjID; /// Link (Relation player factory) listener registration ID Relation::ListenerID mPlayerFactoryListenerID; + + DrawServicePtr mDrawService; }; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-09-04 05:56:30
|
Revision: 1251 http://opde.svn.sourceforge.net/opde/?rev=1251&view=rev Author: volca Date: 2009-09-04 05:56:23 +0000 (Fri, 04 Sep 2009) Log Message: ----------- Adding Room service and SERVICE_ALL construction right before bootstrap end Modified Paths: -------------- trunk/src/main/GameStateManager.cpp trunk/src/main/Root.cpp Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2009-09-04 05:55:06 UTC (rev 1250) +++ trunk/src/main/GameStateManager.cpp 2009-09-04 05:56:23 UTC (rev 1251) @@ -232,6 +232,8 @@ LOG_INFO("GameStateManager: Finishing bootstrap"); + // Temporary create to allow Room service creation and testing + ServiceManager::getSingleton().createByMask(SERVICE_ALL); mRoot->bootstrapFinished(); ps->bootstrapFinished(); Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2009-09-04 05:55:06 UTC (rev 1250) +++ trunk/src/main/Root.cpp 2009-09-04 05:56:23 UTC (rev 1251) @@ -50,6 +50,7 @@ #include "MaterialService.h" #include "LightService.h" #include "DrawService.h" +#include "RoomService.h" // base #include "ManualBinFileLoader.h" @@ -91,6 +92,8 @@ LOG_INFO("Starting openDarkEngine %d.%d.%d (%s), build %s, %s", OPDE_VER_MAJOR, OPDE_VER_MINOR, OPDE_VER_PATCH, OPDE_CODE_NAME, __DATE__, __TIME__); mServiceMgr = new ServiceManager(mServiceMask); + + LOG_INFO("Root: Created a ServiceManager instance with global mask %X", mServiceMask); // To supress logging of OGRE (we'll use a plugin for our logger for Ogre logs) // we need to create a Ogre::LogManager here on our own @@ -269,6 +272,7 @@ new LightServiceFactory(); new MaterialServiceFactory(); new DrawServiceFactory(); + new RoomServiceFactory(); } // ------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-19 20:07:07
|
Revision: 891 http://opde.svn.sourceforge.net/opde/?rev=891&view=rev Author: volca Date: 2008-10-19 20:07:01 +0000 (Sun, 19 Oct 2008) Log Message: ----------- Use the proxyarchive Modified Paths: -------------- trunk/src/main/GameStateManager.cpp trunk/src/main/GameStateManager.h trunk/src/main/Root.cpp trunk/src/main/Root.h Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-10-19 20:06:07 UTC (rev 890) +++ trunk/src/main/GameStateManager.cpp 2008-10-19 20:07:01 UTC (rev 891) @@ -1,368 +1,381 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - * - *****************************************************************************/ - -#include "config.h" - -#include "GameStateManager.h" -#include "OpdeException.h" -#include "logger.h" -#include "stdlog.h" -#include "filelog.h" - -// All the services -#include "WorldRepService.h" -#include "BinaryService.h" -#include "GameService.h" -#include "ConfigService.h" -#include "LinkService.h" -#include "PropertyService.h" -#include "InheritService.h" -#include "RenderService.h" -#include "DatabaseService.h" -#include "InputService.h" -#include "LoopService.h" -#include "ObjectService.h" - -#include "GameLoadState.h" -#include "GamePlayState.h" - -// If custom codec is to be used -#include "CustomImageCodec.h" - -#include <OgreRoot.h> -#include <OgreWindowEventUtilities.h> -#include <OgreConfigFile.h> - -using namespace Ogre; - -namespace Opde { - - // The instance owner - template<> GameStateManager* Singleton<GameStateManager>::ms_Singleton = 0; - - GameStateManager::GameStateManager(std::string GameType) : - mStateStack(), - mTerminate(false), - mLogger(NULL), - mRoot(NULL), - mStdLog(NULL), - mConsoleBackend(NULL), - mServiceMgr(NULL), - mDTypeScriptLdr(NULL), - mPLDefScriptLdr(NULL), - mConfigService(NULL) { - mGameType = GameType; - } - - GameStateManager::~GameStateManager() { - if (!mInputService.isNull()) - mInputService->unsetDirectListener(); - - mInputService.setNull(); - mConfigService.setNull(); - - while (!mStateStack.empty()) { - GameState* state = mStateStack.top(); - mStateStack.pop(); - - state->exit(); - } - - delete mDTypeScriptLdr; // Unregisters itself - mDTypeScriptLdr = NULL; - - delete mPLDefScriptLdr; // Unregisters itself - mPLDefScriptLdr = NULL; - - // Delete the service manager - delete mServiceMgr; - mServiceMgr = NULL; - - CustomImageCodec::shutdown(); - - delete mConsoleBackend; - delete mRoot; - - // Release the loggers - delete mLogger; - delete mStdLog; - delete mFileLog; - } - - GameStateManager& GameStateManager::getSingleton(void) { - assert( ms_Singleton ); return ( *ms_Singleton ); - } - - GameStateManager* GameStateManager::getSingletonPtr(void) { - return ms_Singleton; - } - - //------------------ Main implementation ------------------ - void GameStateManager::terminate() { - mTerminate = true; - } - - void GameStateManager::pushState(GameState* state) { - if (!mStateStack.empty()) { - mStateStack.top()->exit(); - } - - mStateStack.push(state); - - state->start(); - } - - void GameStateManager::popState() { - if (!mStateStack.empty()) { - GameState* old = mStateStack.top(); - - mStateStack.pop(); - - old->exit(); - - if (!mStateStack.empty()) { // There is another state in the stack - // mStateStack.top()->start(); - } else { - // mTerminate = true; // Terminate automatically if this state was the last? - } - } else { - OPDE_EXCEPT("State stack was empty, nothing could be done.","StateManager::popState"); - } - } - - - bool GameStateManager::run() { - // Initialize opde logger and console backend - mLogger = new Logger(); - - mStdLog = new StdLog(); - mFileLog = new FileLog("opde.log"); - - mLogger->registerLogListener(mFileLog); - - // Create an ogre's root - mRoot = new Root(); - - CustomImageCodec::startup(); - - mConsoleBackend = new Opde::ConsoleBackend(); - - // So console will write the messages from the logger - mLogger->registerLogListener(mConsoleBackend); - - mConsoleBackend->putMessage("==Console Starting=="); - - // Create the service manager - mServiceMgr = new ServiceManager(SERVICE_ALL); - assert(ServiceManager::getSingletonPtr() != 0); - - if (ServiceManager::getSingletonPtr() == 0) - LOG_FATAL("Rotten tomatoes!"); - - // Register the worldrep service factory - registerServiceFactories(); - - mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); - - mConfigService->loadParams("opde.cfg"); - - RenderServicePtr rends; - - rends = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); - - // Setup resources. - setupResources(); - - // Initialise resources - ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); - - - if (!mConfigService->hasParam("mission")) // Failback - { - if((mGameType == "SS2") || (mGameType == "ss2")) - mConfigService->setParam("mission", "earth.mis"); - else - mConfigService->setParam("mission", "miss1.mis"); - } - - // TODO: Remove this temporary nonsense. In fact. Remove the whole class this method is in! - GamePlayState* ps = new GamePlayState(); - GameLoadState* ls = new GameLoadState(); - - // Set default mipmap level (NB some APIs ignore this) - TextureManager::getSingleton().setDefaultNumMipmaps(5); - - setupInputSystem(); - - // TODO: Broadcast to all services: bootstrapFinished - mServiceMgr->bootstrapFinished(); - - ps->bootstrapFinished(); - - // Push the initial state - pushState(ls); - - // Run the game loop - // Main while-loop - unsigned long lTimeCurrentFrame = 0; - - while( !mTerminate ) { - // Calculate time since last frame and remember current time for next frame - mTimeLastFrame = lTimeCurrentFrame; - lTimeCurrentFrame = mRoot->getTimer()->getMilliseconds(); - - unsigned long lTimeSinceLastFrame = lTimeCurrentFrame - mTimeLastFrame; - - // Update current state - mStateStack.top()->update( lTimeSinceLastFrame ); - - // InputService::captureInputs() - mInputService->captureInputs(); - - // Render next frame - mRoot->renderOneFrame(); - - // Deal with platform specific issues - Ogre::WindowEventUtilities::messagePump(); - } - - while (!mStateStack.empty()) { - GameState* state = mStateStack.top(); - mStateStack.pop(); - - state->exit(); - } - - delete ps; - delete ls; - - return true; - } - - void GameStateManager::registerServiceFactories() { - // register the service factories - new WorldRepServiceFactory(); - new BinaryServiceFactory(); - new GameServiceFactory(); - new ConfigServiceFactory(); - new LinkServiceFactory(); - new PropertyServiceFactory(); - new InheritServiceFactory(); - new RenderServiceFactory(); - new DatabaseServiceFactory(); - new InputServiceFactory(); - new LoopServiceFactory(); - new ObjectServiceFactory(); - } - - /// Method which will define the source of resources (other than current folder) - void GameStateManager::setupResources(void) { - // First, register the script loaders... - - // Allocate and register the DType script loader. Registers itself - mDTypeScriptLdr = new DTypeScriptLoader(); - - // Allocate and register the PLDef script loader. Registers itself - mPLDefScriptLdr = new PLDefScriptLoader(); - - // Load resource paths from config file - ConfigFile cf; - - //Load the resources according to the game type, if game type not specified, load the default - if((mGameType == "T1") || (mGameType == "t1")) - cf.load("thief1.cfg"); - else if((mGameType == "T2") || (mGameType == "t2")) - cf.load("thief2.cfg"); - else if((mGameType == "SS2") || (mGameType == "ss2")) - cf.load("shock2.cfg"); - else - cf.load("resources.cfg"); - - // Go through all sections & settings in the file - ConfigFile::SectionIterator seci = cf.getSectionIterator(); - - String secName, typeName, archName; - - while (seci.hasMoreElements()) { - secName = seci.peekNextKey(); - ConfigFile::SettingsMultiMap *settings = seci.getNext(); - ConfigFile::SettingsMultiMap::iterator i; - - for (i = settings->begin(); i != settings->end(); ++i) { - typeName = i->first; - archName = i->second; - ResourceGroupManager::getSingleton().addResourceLocation( - archName, typeName, secName); - } - } - } - - void GameStateManager::setupInputSystem() { - mInputService = static_pointer_cast<InputService>(ServiceManager::getSingleton().getService("InputService")); - - mInputService->createBindContext("game"); - mInputService->setBindContext("game"); - - mInputService->setInputMode(IM_DIRECT); - // Commented out for now, as it is not needed - // mInputService->loadBNDFile("dark.bnd"); - - mInputService->setDirectListener(this); - } - - bool GameStateManager::keyPressed( const OIS::KeyEvent &e ) { - if (!mStateStack.empty()) { - mStateStack.top()->keyPressed(e); - } - return false; - } - - bool GameStateManager::keyReleased( const OIS::KeyEvent &e ) { - if (!mStateStack.empty()) { - mStateStack.top()->keyReleased(e); - } - return false; - } - - bool GameStateManager::mouseMoved( const OIS::MouseEvent &e ) { - if (!mStateStack.empty()) { - mStateStack.top()->mouseMoved(e); - } - return false; - } - - bool GameStateManager::mousePressed( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { - if (!mStateStack.empty()) { - mStateStack.top()->mousePressed(e, id); - } - return false; - } - - bool GameStateManager::mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { - if (!mStateStack.empty()) { - mStateStack.top()->mouseReleased(e, id); - } - return false; - } - -} +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#include "config.h" + +#include "GameStateManager.h" +#include "OpdeException.h" +#include "logger.h" +#include "stdlog.h" +#include "filelog.h" + +// All the services +#include "WorldRepService.h" +#include "BinaryService.h" +#include "GameService.h" +#include "ConfigService.h" +#include "LinkService.h" +#include "PropertyService.h" +#include "InheritService.h" +#include "RenderService.h" +#include "DatabaseService.h" +#include "InputService.h" +#include "LoopService.h" +#include "ObjectService.h" + +#include "GameLoadState.h" +#include "GamePlayState.h" + +#include "ProxyArchive.h" + +// If custom codec is to be used +#include "CustomImageCodec.h" + +#include <OgreRoot.h> +#include <OgreWindowEventUtilities.h> +#include <OgreConfigFile.h> + +using namespace Ogre; + +namespace Opde { + + // The instance owner + template<> GameStateManager* Singleton<GameStateManager>::ms_Singleton = 0; + + GameStateManager::GameStateManager(std::string GameType) : + mStateStack(), + mTerminate(false), + mLogger(NULL), + mRoot(NULL), + mStdLog(NULL), + mConsoleBackend(NULL), + mServiceMgr(NULL), + mDTypeScriptLdr(NULL), + mPLDefScriptLdr(NULL), + mDirArchiveFactory(NULL), + mCrfArchiveFactory(NULL), + mConfigService(NULL) { + mGameType = GameType; + } + + GameStateManager::~GameStateManager() { + if (!mInputService.isNull()) + mInputService->unsetDirectListener(); + + mInputService.setNull(); + mConfigService.setNull(); + + while (!mStateStack.empty()) { + GameState* state = mStateStack.top(); + mStateStack.pop(); + + state->exit(); + } + + delete mDTypeScriptLdr; // Unregisters itself + mDTypeScriptLdr = NULL; + + delete mPLDefScriptLdr; // Unregisters itself + mPLDefScriptLdr = NULL; + + // Delete the service manager + delete mServiceMgr; + mServiceMgr = NULL; + + CustomImageCodec::shutdown(); + + delete mDirArchiveFactory; + delete mCrfArchiveFactory; + + delete mConsoleBackend; + delete mRoot; + + // Release the loggers + delete mLogger; + delete mStdLog; + delete mFileLog; + } + + GameStateManager& GameStateManager::getSingleton(void) { + assert( ms_Singleton ); return ( *ms_Singleton ); + } + + GameStateManager* GameStateManager::getSingletonPtr(void) { + return ms_Singleton; + } + + //------------------ Main implementation ------------------ + void GameStateManager::terminate() { + mTerminate = true; + } + + void GameStateManager::pushState(GameState* state) { + if (!mStateStack.empty()) { + mStateStack.top()->exit(); + } + + mStateStack.push(state); + + state->start(); + } + + void GameStateManager::popState() { + if (!mStateStack.empty()) { + GameState* old = mStateStack.top(); + + mStateStack.pop(); + + old->exit(); + + if (!mStateStack.empty()) { // There is another state in the stack + // mStateStack.top()->start(); + } else { + // mTerminate = true; // Terminate automatically if this state was the last? + } + } else { + OPDE_EXCEPT("State stack was empty, nothing could be done.","StateManager::popState"); + } + } + + + bool GameStateManager::run() { + // Initialize opde logger and console backend + mLogger = new Logger(); + + mStdLog = new StdLog(); + mFileLog = new FileLog("opde.log"); + + mLogger->registerLogListener(mFileLog); + + // Create an ogre's root + mRoot = new Root(); + + mDirArchiveFactory = new Ogre::CaseLessFileSystemArchiveFactory(); + // TODO: mCrfArchiveFactory = new Ogre::CrfArchiveFactory(); + + Ogre::ArchiveManager::getSingleton().addArchiveFactory(mDirArchiveFactory); + // TODO: Ogre::ArchiveManager::getSingleton().addArchiveFactory(mCrfArchiveFactory); + + CustomImageCodec::startup(); + + mConsoleBackend = new Opde::ConsoleBackend(); + + // So console will write the messages from the logger + mLogger->registerLogListener(mConsoleBackend); + + mConsoleBackend->putMessage("==Console Starting=="); + + // Create the service manager + mServiceMgr = new ServiceManager(SERVICE_ALL); + assert(ServiceManager::getSingletonPtr() != 0); + + if (ServiceManager::getSingletonPtr() == 0) + LOG_FATAL("Rotten tomatoes!"); + + // Register the worldrep service factory + registerServiceFactories(); + + mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); + + mConfigService->loadParams("opde.cfg"); + + RenderServicePtr rends; + + rends = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); + + // Setup resources. + setupResources(); + + // Initialise resources + ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); + + + if (!mConfigService->hasParam("mission")) // Failback + { + if((mGameType == "SS2") || (mGameType == "ss2")) + mConfigService->setParam("mission", "earth.mis"); + else + mConfigService->setParam("mission", "miss1.mis"); + } + + // TODO: Remove this temporary nonsense. In fact. Remove the whole class this method is in! + GamePlayState* ps = new GamePlayState(); + GameLoadState* ls = new GameLoadState(); + + // Set default mipmap level (NB some APIs ignore this) + TextureManager::getSingleton().setDefaultNumMipmaps(5); + + setupInputSystem(); + + // TODO: Broadcast to all services: bootstrapFinished + mServiceMgr->bootstrapFinished(); + + ps->bootstrapFinished(); + + // Push the initial state + pushState(ls); + + // Run the game loop + // Main while-loop + unsigned long lTimeCurrentFrame = 0; + + while( !mTerminate ) { + // Calculate time since last frame and remember current time for next frame + mTimeLastFrame = lTimeCurrentFrame; + lTimeCurrentFrame = mRoot->getTimer()->getMilliseconds(); + + unsigned long lTimeSinceLastFrame = lTimeCurrentFrame - mTimeLastFrame; + + // Update current state + mStateStack.top()->update( lTimeSinceLastFrame ); + + // InputService::captureInputs() + mInputService->captureInputs(); + + // Render next frame + mRoot->renderOneFrame(); + + // Deal with platform specific issues + Ogre::WindowEventUtilities::messagePump(); + } + + while (!mStateStack.empty()) { + GameState* state = mStateStack.top(); + mStateStack.pop(); + + state->exit(); + } + + delete ps; + delete ls; + + return true; + } + + void GameStateManager::registerServiceFactories() { + // register the service factories + new WorldRepServiceFactory(); + new BinaryServiceFactory(); + new GameServiceFactory(); + new ConfigServiceFactory(); + new LinkServiceFactory(); + new PropertyServiceFactory(); + new InheritServiceFactory(); + new RenderServiceFactory(); + new DatabaseServiceFactory(); + new InputServiceFactory(); + new LoopServiceFactory(); + new ObjectServiceFactory(); + } + + /// Method which will define the source of resources (other than current folder) + void GameStateManager::setupResources(void) { + // First, register the script loaders... + + // Allocate and register the DType script loader. Registers itself + mDTypeScriptLdr = new DTypeScriptLoader(); + + // Allocate and register the PLDef script loader. Registers itself + mPLDefScriptLdr = new PLDefScriptLoader(); + + // Load resource paths from config file + ConfigFile cf; + + //Load the resources according to the game type, if game type not specified, load the default + if((mGameType == "T1") || (mGameType == "t1")) + cf.load("thief1.cfg"); + else if((mGameType == "T2") || (mGameType == "t2")) + cf.load("thief2.cfg"); + else if((mGameType == "SS2") || (mGameType == "ss2")) + cf.load("shock2.cfg"); + else + cf.load("resources.cfg"); + + // Go through all sections & settings in the file + ConfigFile::SectionIterator seci = cf.getSectionIterator(); + + String secName, typeName, archName; + + while (seci.hasMoreElements()) { + secName = seci.peekNextKey(); + ConfigFile::SettingsMultiMap *settings = seci.getNext(); + ConfigFile::SettingsMultiMap::iterator i; + + for (i = settings->begin(); i != settings->end(); ++i) { + typeName = i->first; + archName = i->second; + ResourceGroupManager::getSingleton().addResourceLocation( + archName, typeName, secName); + } + } + } + + void GameStateManager::setupInputSystem() { + mInputService = static_pointer_cast<InputService>(ServiceManager::getSingleton().getService("InputService")); + + mInputService->createBindContext("game"); + mInputService->setBindContext("game"); + + mInputService->setInputMode(IM_DIRECT); + // Commented out for now, as it is not needed + // mInputService->loadBNDFile("dark.bnd"); + + mInputService->setDirectListener(this); + } + + bool GameStateManager::keyPressed( const OIS::KeyEvent &e ) { + if (!mStateStack.empty()) { + mStateStack.top()->keyPressed(e); + } + return false; + } + + bool GameStateManager::keyReleased( const OIS::KeyEvent &e ) { + if (!mStateStack.empty()) { + mStateStack.top()->keyReleased(e); + } + return false; + } + + bool GameStateManager::mouseMoved( const OIS::MouseEvent &e ) { + if (!mStateStack.empty()) { + mStateStack.top()->mouseMoved(e); + } + return false; + } + + bool GameStateManager::mousePressed( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { + if (!mStateStack.empty()) { + mStateStack.top()->mousePressed(e, id); + } + return false; + } + + bool GameStateManager::mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id ) { + if (!mStateStack.empty()) { + mStateStack.top()->mouseReleased(e, id); + } + return false; + } + +} Modified: trunk/src/main/GameStateManager.h =================================================================== --- trunk/src/main/GameStateManager.h 2008-10-19 20:06:07 UTC (rev 890) +++ trunk/src/main/GameStateManager.h 2008-10-19 20:07:01 UTC (rev 891) @@ -1,146 +1,151 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - * - *****************************************************************************/ - - -#ifndef __GAMESTATEMANAGER_H -#define __GAMESTATEMANAGER_H - -#include "config.h" - -#include <OISMouse.h> -#include <OISKeyboard.h> -#include <OISInputManager.h> - -#include <OgreRenderWindow.h> - -#include <stack> - -#include "OpdeSingleton.h" -#include "GameState.h" -#include "stdlog.h" -#include "filelog.h" -#include "ConsoleBackend.h" -#include "OpdeServiceManager.h" -#include "ConfigService.h" -#include "InputService.h" -#include "DVariant.h" - -#include "DTypeScriptLoader.h" -#include "PLDefScriptLoader.h" - -namespace Opde { - - /** The game state manager. A main piece of code, which controls the flow of the program. Also dispatcher for input device events. - * A state is a class inheriting GameState abstract class, which controls a single state of the game. GameState's instance - * then receives events from keyboard and other input devices, event for frame update, etc. - * - * @note This class should implements a custom game loop. - * - * @see GameState - * @todo add OIS::JoyStickListener - */ - class GameStateManager : public Singleton<GameStateManager>, public DirectInputListener { - public: - GameStateManager(std::string GameType); - ~GameStateManager(); - - // Singleton related - static GameStateManager& getSingleton(void); - static GameStateManager* getSingletonPtr(void); - - /// Terminates the execution of the game loop - void terminate(); - - /** Pushes a new state to the stack, and calls start() on this new state - * If the stack was not empty before, suspend() is called on previous top - */ - void pushState(GameState* state); - - /** Pops the topmost state from stack, if possible. Calls exit() on such state - * - */ - void popState(); - - /** Initialize the state manager, then run the loop with the given state. Initializes ogre, resources, input system, etc. - * @return true if game should procede, false otherwise */ - bool run(); - protected: - /** Registers all the service factories */ - void registerServiceFactories(); - - /** Loads the resources from the resources.cfg */ - void setupResources(void); - - /** Setup the OIS input system. */ - void setupInputSystem(); - - bool keyPressed( const OIS::KeyEvent &e ); - bool keyReleased( const OIS::KeyEvent &e ); - - bool mouseMoved( const OIS::MouseEvent &e ); - bool mousePressed( const OIS::MouseEvent &e, OIS::MouseButtonID id ); - bool mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id ); - - - typedef std::stack<GameState*> StateStack; - - /// Stack of the game states - StateStack mStateStack; - - /// the game loop should end if true - bool mTerminate; - - /// last frame's time - unsigned long mTimeLastFrame; - - /// Stderr logger - StdLog* mStdLog; - FileLog* mFileLog; - - ConsoleBackend* mConsoleBackend; - - Logger *mLogger; - - // --- Ogre instances - Ogre::Root *mRoot; - - // Service manager handle - ServiceManager* mServiceMgr; - - // Loader for the DType scripts - DTypeScriptLoader* mDTypeScriptLdr; - - // Loader for the PLDef scripts - PLDefScriptLoader* mPLDefScriptLdr; - - // config service - ConfigServicePtr mConfigService; - - InputServicePtr mInputService; - - std::string mGameType; - }; - -} - -#endif +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + + +#ifndef __GAMESTATEMANAGER_H +#define __GAMESTATEMANAGER_H + +#include "config.h" + +#include <OISMouse.h> +#include <OISKeyboard.h> +#include <OISInputManager.h> + +#include <OgreRenderWindow.h> + +#include <stack> + +#include "OpdeSingleton.h" +#include "GameState.h" +#include "stdlog.h" +#include "filelog.h" +#include "ConsoleBackend.h" +#include "OpdeServiceManager.h" +#include "ConfigService.h" +#include "InputService.h" +#include "DVariant.h" + +#include "DTypeScriptLoader.h" +#include "PLDefScriptLoader.h" + +namespace Opde { + + /** The game state manager. A main piece of code, which controls the flow of the program. Also dispatcher for input device events. + * A state is a class inheriting GameState abstract class, which controls a single state of the game. GameState's instance + * then receives events from keyboard and other input devices, event for frame update, etc. + * + * @note This class should implements a custom game loop. + * + * @see GameState + * @todo add OIS::JoyStickListener + */ + class GameStateManager : public Singleton<GameStateManager>, public DirectInputListener { + public: + GameStateManager(std::string GameType); + ~GameStateManager(); + + // Singleton related + static GameStateManager& getSingleton(void); + static GameStateManager* getSingletonPtr(void); + + /// Terminates the execution of the game loop + void terminate(); + + /** Pushes a new state to the stack, and calls start() on this new state + * If the stack was not empty before, suspend() is called on previous top + */ + void pushState(GameState* state); + + /** Pops the topmost state from stack, if possible. Calls exit() on such state + * + */ + void popState(); + + /** Initialize the state manager, then run the loop with the given state. Initializes ogre, resources, input system, etc. + * @return true if game should procede, false otherwise */ + bool run(); + protected: + /** Registers all the service factories */ + void registerServiceFactories(); + + /** Loads the resources from the resources.cfg */ + void setupResources(void); + + /** Setup the OIS input system. */ + void setupInputSystem(); + + bool keyPressed( const OIS::KeyEvent &e ); + bool keyReleased( const OIS::KeyEvent &e ); + + bool mouseMoved( const OIS::MouseEvent &e ); + bool mousePressed( const OIS::MouseEvent &e, OIS::MouseButtonID id ); + bool mouseReleased( const OIS::MouseEvent &e, OIS::MouseButtonID id ); + + + typedef std::stack<GameState*> StateStack; + + /// Stack of the game states + StateStack mStateStack; + + /// the game loop should end if true + bool mTerminate; + + /// last frame's time + unsigned long mTimeLastFrame; + + /// Stderr logger + StdLog* mStdLog; + FileLog* mFileLog; + + ConsoleBackend* mConsoleBackend; + + Logger *mLogger; + + // --- Ogre instances + Ogre::Root *mRoot; + + // Service manager handle + ServiceManager* mServiceMgr; + + // Loader for the DType scripts + DTypeScriptLoader* mDTypeScriptLdr; + + // Loader for the PLDef scripts + PLDefScriptLoader* mPLDefScriptLdr; + + + Ogre::ArchiveFactory* mDirArchiveFactory; + + Ogre::ArchiveFactory* mCrfArchiveFactory; + + // config service + ConfigServicePtr mConfigService; + + InputServicePtr mInputService; + + std::string mGameType; + }; + +} + +#endif Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2008-10-19 20:06:07 UTC (rev 890) +++ trunk/src/main/Root.cpp 2008-10-19 20:07:01 UTC (rev 891) @@ -49,6 +49,7 @@ // base #include "ManualBinFileLoader.h" #include "ManualFonFileLoader.h" +#include "ProxyArchive.h" #include "logger.h" #include "OpdeException.h" #include "ConsoleFrontend.h" @@ -70,7 +71,9 @@ mPLDefScriptCompiler(NULL), mServiceMask(serviceMask), mDTypeScriptLdr(NULL), - mPLDefScriptLdr(NULL) { + mPLDefScriptLdr(NULL), + mDirArchiveFactory(NULL), + mCrfArchiveFactory(NULL) { mLogger = new Logger(); @@ -87,7 +90,15 @@ mOgreLogManager->getDefaultLog()->addListener(mOgreOpdeLogConnector); mOgreRoot = new Ogre::Root(); + + // register the factories + mDirArchiveFactory = new Ogre::CaseLessFileSystemArchiveFactory(); + // TODO: Decide if this should be used or not + // mCrfArchiveFactory = new Ogre::CrfArchiveFactory(); + Ogre::ArchiveManager::getSingleton().addArchiveFactory(mDirArchiveFactory); + // Ogre::ArchiveManager::getSingleton().addArchiveFactory(mCrfArchiveFactory); + // if custom image hooks are to be included, setup now Ogre::CustomImageCodec::startup(); @@ -110,6 +121,8 @@ delete mDTypeScriptCompiler; delete mPLDefScriptCompiler; + // Archive manager has no way to remove the archive factories... + delete mServiceMgr; delete mConsoleBackend; @@ -125,12 +138,17 @@ } mLogListeners.clear(); + delete mDirArchiveFactory; + delete mCrfArchiveFactory; + // As the last thing - release the logger delete mLogger; delete mOgreOpdeLogConnector; delete mOgreLogManager; + + } Modified: trunk/src/main/Root.h =================================================================== --- trunk/src/main/Root.h 2008-10-19 20:06:07 UTC (rev 890) +++ trunk/src/main/Root.h 2008-10-19 20:07:01 UTC (rev 891) @@ -128,6 +128,10 @@ /// Loader for the PLDef scripts PLDefScriptLoader* mPLDefScriptLdr; + + Ogre::ArchiveFactory* mDirArchiveFactory; + + Ogre::ArchiveFactory* mCrfArchiveFactory; }; } // namespace Opde This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-26 15:28:39
|
Revision: 930 http://opde.svn.sourceforge.net/opde/?rev=930&view=rev Author: volca Date: 2008-10-26 15:28:35 +0000 (Sun, 26 Oct 2008) Log Message: ----------- Migrating the testing viewer to Opde::Root Modified Paths: -------------- trunk/src/main/GameLoadState.cpp trunk/src/main/GamePlayState.cpp trunk/src/main/GameStateManager.cpp trunk/src/main/GameStateManager.h trunk/src/main/Root.cpp trunk/src/main/Root.h Modified: trunk/src/main/GameLoadState.cpp =================================================================== --- trunk/src/main/GameLoadState.cpp 2008-10-26 14:18:30 UTC (rev 929) +++ trunk/src/main/GameLoadState.cpp 2008-10-26 15:28:35 UTC (rev 930) @@ -45,7 +45,7 @@ template<> GameLoadState* Singleton<GameLoadState>::ms_Singleton = 0; GameLoadState::GameLoadState() : mSceneMgr(NULL), mOverlayMgr(NULL), mLoaded(false) { - mRoot = Root::getSingletonPtr(); + mRoot = Ogre::Root::getSingletonPtr(); mOverlayMgr = OverlayManager::getSingletonPtr(); mServiceMgr = ServiceManager::getSingletonPtr(); Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-10-26 14:18:30 UTC (rev 929) +++ trunk/src/main/GamePlayState.cpp 2008-10-26 15:28:35 UTC (rev 930) @@ -87,7 +87,7 @@ mSceneDetailIndex = 0; mNumScreenShots = 0; - mRoot = Root::getSingletonPtr(); + mRoot = Ogre::Root::getSingletonPtr(); mOverlayMgr = OverlayManager::getSingletonPtr(); mConsole = new ConsoleFrontend(); Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-10-26 14:18:30 UTC (rev 929) +++ trunk/src/main/GameStateManager.cpp 2008-10-26 15:28:35 UTC (rev 930) @@ -65,17 +65,15 @@ GameStateManager::GameStateManager(std::string GameType) : mStateStack(), mTerminate(false), - mLogger(NULL), mRoot(NULL), - mStdLog(NULL), mConsoleBackend(NULL), mServiceMgr(NULL), - mDTypeScriptLdr(NULL), - mPLDefScriptLdr(NULL), - mDirArchiveFactory(NULL), - mCrfArchiveFactory(NULL), + mInputService(NULL), mConfigService(NULL) { mGameType = GameType; + + mRoot = new Opde::Root(SERVICE_ALL, "opde.log"); + mRoot->registerCustomScriptLoaders(); } GameStateManager::~GameStateManager() { @@ -92,28 +90,7 @@ state->exit(); } - delete mDTypeScriptLdr; // Unregisters itself - mDTypeScriptLdr = NULL; - - delete mPLDefScriptLdr; // Unregisters itself - mPLDefScriptLdr = NULL; - - // Delete the service manager - delete mServiceMgr; - mServiceMgr = NULL; - - CustomImageCodec::shutdown(); - - delete mConsoleBackend; delete mRoot; - - delete mDirArchiveFactory; - delete mCrfArchiveFactory; - - // Release the loggers - delete mLogger; - delete mStdLog; - delete mFileLog; } GameStateManager& GameStateManager::getSingleton(void) { @@ -160,43 +137,17 @@ bool GameStateManager::run() { // Initialize opde logger and console backend - mLogger = new Logger(); - - mStdLog = new StdLog(); - mFileLog = new FileLog("opde.log"); - - mLogger->registerLogListener(mFileLog); - - LOG_INFO("Starting openDarkEngine %d.%d.%d (%s)\n", OPDE_VER_MAJOR, OPDE_VER_MINOR, OPDE_VER_PATCH, OPDE_CODE_NAME); - // Create an ogre's root - mRoot = new Root(); + mOgreRoot = Ogre::Root::getSingletonPtr(); - mDirArchiveFactory = new Ogre::CaseLessFileSystemArchiveFactory(); - // TODO: mCrfArchiveFactory = new Ogre::CrfArchiveFactory(); - - Ogre::ArchiveManager::getSingleton().addArchiveFactory(mDirArchiveFactory); - // TODO: Ogre::ArchiveManager::getSingleton().addArchiveFactory(mCrfArchiveFactory); - - CustomImageCodec::startup(); - - mConsoleBackend = new Opde::ConsoleBackend(); - - // So console will write the messages from the logger - mLogger->registerLogListener(mConsoleBackend); - + mConsoleBackend = Opde::ConsoleBackend::getSingletonPtr(); mConsoleBackend->putMessage("==Console Starting=="); - // Create the service manager - mServiceMgr = new ServiceManager(SERVICE_ALL); assert(ServiceManager::getSingletonPtr() != 0); if (ServiceManager::getSingletonPtr() == 0) LOG_FATAL("Rotten tomatoes!"); - // Register the worldrep service factory - registerServiceFactories(); - mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); mConfigService->loadParams("opde.cfg"); @@ -229,9 +180,8 @@ setupInputSystem(); - // TODO: Broadcast to all services: bootstrapFinished - mServiceMgr->bootstrapFinished(); - + mRoot->bootstrapFinished(); + ps->bootstrapFinished(); // Push the initial state @@ -244,7 +194,7 @@ while( !mTerminate ) { // Calculate time since last frame and remember current time for next frame mTimeLastFrame = lTimeCurrentFrame; - lTimeCurrentFrame = mRoot->getTimer()->getMilliseconds(); + lTimeCurrentFrame = mOgreRoot->getTimer()->getMilliseconds(); unsigned long lTimeSinceLastFrame = lTimeCurrentFrame - mTimeLastFrame; @@ -255,7 +205,7 @@ mInputService->captureInputs(); // Render next frame - mRoot->renderOneFrame(); + mOgreRoot->renderOneFrame(); // Deal with platform specific issues Ogre::WindowEventUtilities::messagePump(); @@ -274,62 +224,23 @@ return true; } - void GameStateManager::registerServiceFactories() { - // register the service factories - new WorldRepServiceFactory(); - new BinaryServiceFactory(); - new GameServiceFactory(); - new ConfigServiceFactory(); - new LinkServiceFactory(); - new PropertyServiceFactory(); - new InheritServiceFactory(); - new RenderServiceFactory(); - new DatabaseServiceFactory(); - new InputServiceFactory(); - new LoopServiceFactory(); - new ObjectServiceFactory(); - } - /// Method which will define the source of resources (other than current folder) void GameStateManager::setupResources(void) { // First, register the script loaders... - - // Allocate and register the DType script loader. Registers itself - mDTypeScriptLdr = new DTypeScriptLoader(); - - // Allocate and register the PLDef script loader. Registers itself - mPLDefScriptLdr = new PLDefScriptLoader(); - // Load resource paths from config file - ConfigFile cf; + String configName = "resources.cfg"; //Load the resources according to the game type, if game type not specified, load the default if((mGameType == "T1") || (mGameType == "t1")) - cf.load("thief1.cfg"); + configName = "thief1.cfg"; else if((mGameType == "T2") || (mGameType == "t2")) - cf.load("thief2.cfg"); + configName = "thief2.cfg"; else if((mGameType == "SS2") || (mGameType == "ss2")) - cf.load("shock2.cfg"); - else - cf.load("resources.cfg"); + configName = "shock2.cfg"; - // Go through all sections & settings in the file - ConfigFile::SectionIterator seci = cf.getSectionIterator(); - - String secName, typeName, archName; - - while (seci.hasMoreElements()) { - secName = seci.peekNextKey(); - ConfigFile::SettingsMultiMap *settings = seci.getNext(); - ConfigFile::SettingsMultiMap::iterator i; - - for (i = settings->begin(); i != settings->end(); ++i) { - typeName = i->first; - archName = i->second; - ResourceGroupManager::getSingleton().addResourceLocation( - archName, typeName, secName); - } - } + + + mRoot->loadResourceConfig(configName); } void GameStateManager::setupInputSystem() { Modified: trunk/src/main/GameStateManager.h =================================================================== --- trunk/src/main/GameStateManager.h 2008-10-26 14:18:30 UTC (rev 929) +++ trunk/src/main/GameStateManager.h 2008-10-26 15:28:35 UTC (rev 930) @@ -35,10 +35,9 @@ #include <stack> +#include "Root.h" #include "OpdeSingleton.h" #include "GameState.h" -#include "stdlog.h" -#include "filelog.h" #include "ConsoleBackend.h" #include "OpdeServiceManager.h" #include "ConfigService.h" @@ -50,14 +49,8 @@ namespace Opde { - /** The game state manager. A main piece of code, which controls the flow of the program. Also dispatcher for input device events. - * A state is a class inheriting GameState abstract class, which controls a single state of the game. GameState's instance - * then receives events from keyboard and other input devices, event for frame update, etc. - * - * @note This class should implements a custom game loop. - * - * @see GameState - * @todo add OIS::JoyStickListener + /** The game state manager. A temporary piece of code that enables opde testing. + * @warning This code is here only for testing purposes, and will go away later on */ class GameStateManager : public Singleton<GameStateManager>, public DirectInputListener { public: @@ -85,9 +78,6 @@ * @return true if game should procede, false otherwise */ bool run(); protected: - /** Registers all the service factories */ - void registerServiceFactories(); - /** Loads the resources from the resources.cfg */ void setupResources(void); @@ -114,36 +104,23 @@ unsigned long mTimeLastFrame; /// Stderr logger - StdLog* mStdLog; - FileLog* mFileLog; - ConsoleBackend* mConsoleBackend; - Logger *mLogger; + /// Opde::root + Opde::Root *mRoot; + Ogre::Root *mOgreRoot; - // --- Ogre instances - Ogre::Root *mRoot; - - // Service manager handle - ServiceManager* mServiceMgr; - - // Loader for the DType scripts - DTypeScriptLoader* mDTypeScriptLdr; - - // Loader for the PLDef scripts - PLDefScriptLoader* mPLDefScriptLdr; - - - Ogre::ArchiveFactory* mDirArchiveFactory; - - Ogre::ArchiveFactory* mCrfArchiveFactory; - - // config service + /// config service reference ConfigServicePtr mConfigService; + /// input service reference InputServicePtr mInputService; + /// Type of the game (t1,t2,ss2) std::string mGameType; + + /// Service manager ref + ServiceManager* mServiceMgr; }; } Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2008-10-26 14:18:30 UTC (rev 929) +++ trunk/src/main/Root.cpp 2008-10-26 15:28:35 UTC (rev 930) @@ -61,7 +61,7 @@ template<> Root* Singleton<Root>::ms_Singleton = 0; // ------------------------------------------------------- - Root::Root(uint serviceMask) : + Root::Root(uint serviceMask, char* logFileName) : mLogger(NULL), mServiceMgr(NULL), mOgreRoot(NULL), @@ -77,6 +77,12 @@ mLogger = new Logger(); + if (logFileName) { + logToFile(logFileName); + } + + LOG_INFO("Starting openDarkEngine %d.%d.%d (%s)", OPDE_VER_MAJOR, OPDE_VER_MINOR, OPDE_VER_PATCH, OPDE_CODE_NAME); + mServiceMgr = new ServiceManager(mServiceMask); // To supress logging of OGRE (we'll use a plugin for our logger for Ogre logs) Modified: trunk/src/main/Root.h =================================================================== --- trunk/src/main/Root.h 2008-10-26 14:18:30 UTC (rev 929) +++ trunk/src/main/Root.h 2008-10-26 15:28:35 UTC (rev 930) @@ -53,8 +53,10 @@ class OPDELIB_EXPORT Root : public Singleton<Root> { public: /** Initializes the opde core - * @param serviceMask the mask of the services which should be used (others will be ignored and unreachable) */ - Root(uint serviceMask = SERVICE_ALL); + * @param serviceMask the mask of the services which should be used (others will be ignored and unreachable) + * @param logFileName - optional log file name - when specified, logging to file will be initialized automatically + */ + Root(uint serviceMask = SERVICE_ALL, char* logFileName = NULL); /** stops the opde core, does cleanup */ ~Root(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-10-28 05:19:31
|
Revision: 939 http://opde.svn.sourceforge.net/opde/?rev=939&view=rev Author: patryn Date: 2008-10-28 05:19:29 +0000 (Tue, 28 Oct 2008) Log Message: ----------- A couple of minor optimizations. Modified Paths: -------------- trunk/src/main/GamePlayState.cpp trunk/src/main/GameStateManager.cpp Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-10-28 02:07:26 UTC (rev 938) +++ trunk/src/main/GamePlayState.cpp 2008-10-28 05:19:29 UTC (rev 939) @@ -268,17 +268,18 @@ mConsole->update(timePassed); - // Temporary: Debug Overlay - static String currFps = "Current FPS: "; - static String avgFps = "Average FPS: "; - static String bestFps = "Best FPS: "; - static String worstFps = "Worst FPS: "; - static String tris = "Triangle Count: "; - static String batches = "Batch Count: "; - if (mDebug) { // update stats when necessary try { + + // Temporary: Debug Overlay + static String currFps = "Current FPS: "; + static String avgFps = "Average FPS: "; + static String bestFps = "Best FPS: "; + static String worstFps = "Worst FPS: "; + static String tris = "Triangle Count: "; + static String batches = "Batch Count: "; + OverlayElement* guiAvg = OverlayManager::getSingleton().getOverlayElement("Opde/AverageFps"); OverlayElement* guiCurr = OverlayManager::getSingleton().getOverlayElement("Opde/CurrFps"); OverlayElement* guiBest = OverlayManager::getSingleton().getOverlayElement("Opde/BestFps"); Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-10-28 02:07:26 UTC (rev 938) +++ trunk/src/main/GameStateManager.cpp 2008-10-28 05:19:29 UTC (rev 939) @@ -191,12 +191,13 @@ // Main while-loop unsigned long lTimeCurrentFrame = 0; + Timer * CentralTimer = mOgreRoot->getTimer(); RenderWindow * AutoCreatedWindow = mOgreRoot->getAutoCreatedWindow(); while( !mTerminate ) { // Calculate time since last frame and remember current time for next frame mTimeLastFrame = lTimeCurrentFrame; - lTimeCurrentFrame = mOgreRoot->getTimer()->getMilliseconds(); + lTimeCurrentFrame = CentralTimer->getMilliseconds(); unsigned long lTimeSinceLastFrame = lTimeCurrentFrame - mTimeLastFrame; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-11-09 14:04:23
|
Revision: 969 http://opde.svn.sourceforge.net/opde/?rev=969&view=rev Author: volca Date: 2008-11-09 14:04:13 +0000 (Sun, 09 Nov 2008) Log Message: ----------- Provide a possibility to set the mission name on the command line Modified Paths: -------------- trunk/src/main/GameStateManager.cpp trunk/src/main/GameStateManager.h trunk/src/main/Opde.cpp Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-11-07 05:38:29 UTC (rev 968) +++ trunk/src/main/GameStateManager.cpp 2008-11-09 14:04:13 UTC (rev 969) @@ -64,7 +64,7 @@ // The instance owner template<> GameStateManager* Singleton<GameStateManager>::ms_Singleton = 0; - GameStateManager::GameStateManager(std::string GameType) : + GameStateManager::GameStateManager(const std::string& GameType) : mStateStack(), mTerminate(false), mRoot(NULL), @@ -167,6 +167,8 @@ // Initialise resources ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); + if (mMissionName != "") + mConfigService->setParam("mission", mMissionName); if (!mConfigService->hasParam("mission")) // Failback { Modified: trunk/src/main/GameStateManager.h =================================================================== --- trunk/src/main/GameStateManager.h 2008-11-07 05:38:29 UTC (rev 968) +++ trunk/src/main/GameStateManager.h 2008-11-09 14:04:13 UTC (rev 969) @@ -54,7 +54,7 @@ */ class GameStateManager : public Singleton<GameStateManager>, public DirectInputListener { public: - GameStateManager(std::string GameType); + GameStateManager(const std::string& GameType); ~GameStateManager(); // Singleton related @@ -77,6 +77,9 @@ /** Initialize the state manager, then run the loop with the given state. Initializes ogre, resources, input system, etc. * @return true if game should procede, false otherwise */ bool run(); + + inline void setDesiredMissionName(const std::string& name) { mMissionName = name; }; + protected: /** Loads the resources from the resources.cfg */ void setupResources(void); @@ -119,6 +122,9 @@ /// Type of the game (t1,t2,ss2) std::string mGameType; + /// requested mission file name + std::string mMissionName; + /// Service manager ref ServiceManager* mServiceMgr; }; Modified: trunk/src/main/Opde.cpp =================================================================== --- trunk/src/main/Opde.cpp 2008-11-07 05:38:29 UTC (rev 968) +++ trunk/src/main/Opde.cpp 2008-11-09 14:04:13 UTC (rev 969) @@ -41,20 +41,34 @@ INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) { - std::string GameType(strCmdLine); + std::string scmdline(strCmdLine); + + // split on space, find if we have two arguments or just one + WhitespaceStringTokenizer wst(GameType); + + std::string GameType = wst.next(); + std::string missionName = wst.next(); #else int main(int argc, char**argv) { std::string GameType = ""; + std::string missionName = ""; if (argc >= 2) GameType = argv[1]; + + if (argc >= 3) + missionName = argv[2]; #endif // Create application object GameStateManager* man = new GameStateManager(GameType); try { + // if we have a mission name, supply + if (missionName != "") + man->setDesiredMissionName(missionName); + man->run(); } catch( Ogre::Exception& e ) { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-11-19 12:34:30
|
Revision: 977 http://opde.svn.sourceforge.net/opde/?rev=977&view=rev Author: volca Date: 2008-11-19 12:34:27 +0000 (Wed, 19 Nov 2008) Log Message: ----------- * getter macro for services used * some random changes Modified Paths: -------------- trunk/src/main/DTypeScriptCompiler.cpp trunk/src/main/GameLoadState.cpp trunk/src/main/GamePlayState.cpp trunk/src/main/GameStateManager.cpp trunk/src/main/OpdeDocGen.cpp trunk/src/main/PLDefScriptCompiler.cpp trunk/src/main/Root.cpp Modified: trunk/src/main/DTypeScriptCompiler.cpp =================================================================== --- trunk/src/main/DTypeScriptCompiler.cpp 2008-11-19 12:32:17 UTC (rev 976) +++ trunk/src/main/DTypeScriptCompiler.cpp 2008-11-19 12:34:27 UTC (rev 977) @@ -116,7 +116,7 @@ mGroupName = ""; ServiceManager* svcmgr = ServiceManager::getSingletonPtr(); - mBinaryService = static_pointer_cast<BinaryService>(svcmgr->getService("BinaryService")); + mBinaryService = GET_SERVICE(BinaryService); mCurrentState.state = CS_UNKNOWN; } @@ -265,7 +265,7 @@ logParseError("Struct inside enum error."); DTypeDefPtr nt; - + // if specified an array, wrap it up so if (was.arraylen > 1) { // wrap up @@ -500,7 +500,7 @@ case ID_CHAR: return DVariant::DV_STRING; case ID_VECTOR : return DVariant::DV_VECTOR; - + case ID_SHORTVECTOR : return DVariant::DV_QUATERNION; default : @@ -527,7 +527,7 @@ case ID_FLOAT : return 4; case ID_VECTOR : return 12; - + case ID_SHORTVECTOR : return 6; default : @@ -555,7 +555,7 @@ } else datasize = getDataLenFromID(typei); - + // Look at the next token. it can either be 'use', array spec '[' or direct name of the field if (testNextTokenID(ID_USE)) { // use enumeration Modified: trunk/src/main/GameLoadState.cpp =================================================================== --- trunk/src/main/GameLoadState.cpp 2008-11-19 12:32:17 UTC (rev 976) +++ trunk/src/main/GameLoadState.cpp 2008-11-19 12:34:27 UTC (rev 977) @@ -48,9 +48,9 @@ mRoot = Ogre::Root::getSingletonPtr(); mOverlayMgr = OverlayManager::getSingletonPtr(); mServiceMgr = ServiceManager::getSingletonPtr(); - - mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); + mConfigService = GET_SERVICE(ConfigService); + mFontTest = false; mManualFonLoader = new ManualFonFileLoader(); @@ -104,8 +104,8 @@ mSceneMgr->addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY); mSceneMgr->setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE); - RenderServicePtr renderSrv = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); - + RenderServicePtr renderSrv = GET_SERVICE(RenderService); + mCamera = renderSrv->getDefaultCamera(); mViewport = renderSrv->getDefaultViewport(); @@ -158,13 +158,13 @@ void GameLoadState::update(unsigned long timePassed) { if (!mFirstTime && !mLoaded) { unsigned long start_ms = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); - + OverlayElement* guiLdr = OverlayManager::getSingleton().getOverlayElement("Opde/LoadPanel/Description"); guiLdr->setCaption("Loading, please wait..."); mRoot->renderOneFrame(); - GameServicePtr gsvc = static_pointer_cast<GameService>(mServiceMgr->getService("GameService")); + GameServicePtr gsvc = GET_SERVICE(GameService); std::string misFile = mConfigService->getParam("mission"); @@ -173,7 +173,7 @@ mLoaded = true; guiLdr->setCaption("Loaded, press ESC..."); - + LOG_INFO("Loading took %10.2f seconds", (Ogre::Root::getSingleton().getTimer()->getMilliseconds() - start_ms) / 1000.0f); // popState(); // Hardcoded, so no escape key is needed @@ -230,7 +230,7 @@ panel->setMetricsMode(Ogre::GMM_RELATIVE); panel->setPosition(0, 0); panel->setDimensions(1, 1); // Full screen - + // TODO: Background material? panel->setMaterialName("Colour/Red"); @@ -246,9 +246,9 @@ Ogre::LogManager::getSingleton().logMessage("Loading font test " + *it); String text = "Keepers would like this font: " + *it+ ", LOADING!"; - + Ogre::FontPtr fnt = FontManager::getSingleton().create(*it, "General"); - + // A test. For parch book load a custom font palette if ((*it == "FONTAA36.FON") || (*it == "FONTAA29.FON")) { mManualFonLoader->setPalette(ManualFonFileLoader::ePT_PCX, "BOOK.PCX"); @@ -257,8 +257,8 @@ } else { mManualFonLoader->setPalette(); } - - + + mManualFonLoader->loadResource(&(*fnt)); height = StringConverter::parseInt(fnt->getParameter("size")); Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-11-19 12:32:17 UTC (rev 976) +++ trunk/src/main/GamePlayState.cpp 2008-11-19 12:34:27 UTC (rev 977) @@ -59,7 +59,7 @@ mSceneDisplay = false; // Try to remap the parameters with those listed in the configuration - mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); + mConfigService = GET_SERVICE(ConfigService); if (mConfigService->hasParam("move_speed")) mMoveSpeed = mConfigService->getParam("move_speed").toFloat(); @@ -78,7 +78,7 @@ mBackward = false; mLeft = false; mRight = false; - + mScreenShot = false; mSceneDisplay = false; mPortalDisplay = false; @@ -97,9 +97,9 @@ // Portal stats overlay mPortalOverlay = OverlayManager::getSingleton().getByName("Opde/OpdeDebugOverlay"); - + mShadows = true; - + StartingPointObjID = 0; } @@ -109,27 +109,28 @@ void GamePlayState::start() { LOG_INFO("GamePlayState: Starting"); - PropertyGroup* posPG = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService"))->getPropertyGroup("Position"); - + PropertyServicePtr ps = GET_SERVICE(PropertyService); + PropertyGroup* posPG = ps->getPropertyGroup("Position"); + if (posPG == NULL) OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "GamePlayState::start"); - - LOG_DEBUG("Starting Point object id : %d", StartingPointObjID); - + + LOG_DEBUG("Starting Point object id : %d", StartingPointObjID); + DVariant spoint; posPG->get(StartingPointObjID, "position", spoint); - + Vector3 StartingPoint(0,0,0); - + if (spoint.type() == DVariant::DV_VECTOR) StartingPoint = spoint.toVector(); - - LOG_DEBUG("Starting Point position : %f %f %f", StartingPoint.x, StartingPoint.y, StartingPoint.z); - + + LOG_DEBUG("Starting Point position : %f %f %f", StartingPoint.x, StartingPoint.y, StartingPoint.z); + // std::string tmp = PropertyGroup->get(StartingPointObjID, "SymName").toString(); mSceneMgr = mRoot->getSceneManager( "DarkSceneManager" ); - RenderServicePtr renderSrv = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); - + RenderServicePtr renderSrv = GET_SERVICE(RenderService); + mCamera = renderSrv->getDefaultCamera(); mViewport = renderSrv->getDefaultViewport(); mWindow = renderSrv->getRenderWindow(); @@ -143,10 +144,10 @@ // Also change position, and set Quake-type orientation ViewPoint vp = mSceneMgr->getSuggestedViewpoint(true); mCamera->setPosition(vp.position); - + if (StartingPointObjID != 0) mCamera->setPosition(StartingPoint); - + mCamera->pitch(Degree(90)); mCamera->rotate(vp.orientation); @@ -175,7 +176,7 @@ mWindow->resetStatistics(); mToLoadScreen = false; - + LOG_INFO("GamePlayState: Started"); } @@ -265,7 +266,7 @@ mScreenShot = false; } - + mConsole->update(timePassed); if (mDebug) { @@ -328,12 +329,12 @@ unsigned long statbt; mSceneMgr->getOption("BackfaceCulls", &bculls); - + // mSceneMgr->getOption("CellsRendered", &rendc); mSceneMgr->getOption("EvaluatedPortals", &eports); // mSceneMgr->getOption("TraversalTime", &travtm); mSceneMgr->getOption("StaticBuildTime", &statbt); - + travtm = static_cast<DarkCamera*>(mCamera)->getTraversalTime(); rendc = static_cast<DarkCamera*>(mCamera)->getVisibleCellCount(); @@ -403,13 +404,13 @@ return true; } else if (e.key == KC_I) { mShadows = !mShadows; - + if (mShadows) mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); - else + else mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE); } - + return true; } else return true; } @@ -459,7 +460,7 @@ } void GamePlayState::bootstrapFinished() { - mLinkService = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); + mLinkService = GET_SERVICE(LinkService); Relation::ListenerPtr metaPropCallback = new ClassCallback<LinkChangeMsg, GamePlayState>(this, &GamePlayState::onLinkPlayerFactoryMsg); Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-11-19 12:32:17 UTC (rev 976) +++ trunk/src/main/GameStateManager.cpp 2008-11-19 12:34:27 UTC (rev 977) @@ -73,7 +73,7 @@ mInputService(NULL), mConfigService(NULL) { mGameType = GameType; - + mRoot = new Opde::Root(SERVICE_ALL, "opde.log"); mRoot->registerCustomScriptLoaders(); } @@ -81,7 +81,7 @@ GameStateManager::~GameStateManager() { if (!mInputService.isNull()) mInputService->unsetDirectListener(); - + mInputService.setNull(); mConfigService.setNull(); @@ -141,7 +141,7 @@ // Initialize opde logger and console backend // Create an ogre's root mOgreRoot = Ogre::Root::getSingletonPtr(); - + mConsoleBackend = Opde::ConsoleBackend::getSingletonPtr(); mConsoleBackend->putMessage("==Console Starting=="); @@ -150,16 +150,16 @@ if (ServiceManager::getSingletonPtr() == 0) LOG_FATAL("Rotten tomatoes!"); - mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); - + mConfigService = GET_SERVICE(ConfigService); + mConfigService->loadParams("opde.cfg"); - + // override the config setting mConfigService->setParam("game_type", mGameType); - + RenderServicePtr rends; - rends = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); + rends = GET_SERVICE(RenderService); // Setup resources. setupResources(); @@ -187,7 +187,7 @@ MaxAtlasSize = 512; } LOG_INFO("Max Atlas Size : %d", MaxAtlasSize); - LightAtlas::setMaxSize(MaxAtlasSize); + LightAtlas::setMaxSize(MaxAtlasSize); // TODO: Remove this temporary nonsense. In fact. Remove the whole class this method is in! GamePlayState* ps = new GamePlayState(); @@ -245,7 +245,7 @@ // Calculate time since last frame and remember current time for next frame mTimeLastFrame = lTimeCurrentFrame; lTimeCurrentFrame = CentralTimer->getMilliseconds(); - + unsigned long lTimeSinceLastFrame = lTimeCurrentFrame - mTimeLastFrame; // Update current state @@ -283,7 +283,7 @@ // First, register the script loaders... // Load resource paths from config file String configName = "resources.cfg", GameType = "Default"; - + //Load the resources according to the game type, if game type not specified, load the default if((mGameType == "T1") || (mGameType == "t1")) { @@ -300,14 +300,14 @@ configName = "shock2.cfg"; GameType = "System Shock 2"; } - + LOG_INFO("Game type: %s", GameType.c_str()); - + mRoot->loadResourceConfig(configName); } void GameStateManager::setupInputSystem() { - mInputService = static_pointer_cast<InputService>(ServiceManager::getSingleton().getService("InputService")); + mInputService = GET_SERVICE(InputService); mInputService->createBindContext("game"); mInputService->setBindContext("game"); Modified: trunk/src/main/OpdeDocGen.cpp =================================================================== --- trunk/src/main/OpdeDocGen.cpp 2008-11-19 12:32:17 UTC (rev 976) +++ trunk/src/main/OpdeDocGen.cpp 2008-11-19 12:34:27 UTC (rev 977) @@ -45,57 +45,57 @@ DT_ENUM, DT_SPECIAL } DocumentStringType; - + int mArgc; char** mArgv; std::string mConfigFile; Opde::Root* mRoot; ConfigServicePtr mConfigSvc; - + typedef std::map<std::string, std::string> DocStrings; - + DocStrings mPropertyDocs; DocStrings mLinkDocs; DocStrings mEnumDocs; DocStrings mSpecialDocs; - + typedef std::map<std::string, DEnum*> EnumMap; - + EnumMap mEncounteredEnums; - + void queueEnumForDesc(DEnum* en) { assert(en); - + mEncounteredEnums[en->getName()] = en; } - + bool parseCommandline(void) { // look for config file name - if (mArgc < 2) + if (mArgc < 2) return false; - + mConfigFile = mArgv[1]; return true; } - + void initialize(void) { // parse the config file. Load the dtype scripts // this is done automatically by adding the resource locations // then bootstrapping // initialize Opde::Root. No service types besides the base mRoot->loadConfigFile(mConfigFile); - + DVariant p; - + if (!mConfigSvc->getParam("resources", p)) { // default p = "resources.cfg"; } - + mRoot->loadResourceConfig(p.toString()); mRoot->bootstrapFinished(); } - + void dispatchAdditionalDocString(DocumentStringType type, const string& addr, const string& txt) { if (addr != "") { switch (type) { @@ -120,53 +120,53 @@ LOG_DEBUG("Empty address for accumulated doc %s", txt.c_str()); } } - + void loadAdditionalDocStrings(void) { // see if we can open the specified file DVariant fn = "docstrings.txt"; // default - + // override, if present mConfigSvc->getParam("docstrings", fn); - + std::fstream s; - + s.open(fn.toString().c_str(), ios::in); - + if (s.fail()) return; - + string target = ""; DocumentStringType doctype = DT_PROP; string text = ""; - + // process line by line while (!s.eof()) { string line; - + getline(s, line, '\n'); - + // process // strip comments size_t cpos = line.find_first_of("#"); - + if (cpos != line.npos) line = line.substr(0, --cpos); - + // we now have the comment stripped. See if we have a target specifier - + size_t cl = line.find_first_of("]"); - + if (line[0] == '[' && cl != line.npos) { // yup. see the type string cont = line.substr(1, cl - 1); - + WhitespaceStringTokenizer tok(cont); - + string type = tok.next(); string address = tok.next(); - + DocumentStringType ntype = DT_PROP; - + if (type == "prop") { ntype = DT_PROP; } else if (type == "link") { @@ -178,10 +178,10 @@ } else { OPDE_EXCEPT("Unknown section type :" + type, "DocGenerator::loadAdditionalDocStrings"); } - + // dispatch the old text dispatchAdditionalDocString(doctype, target, text); - + doctype = ntype; text = ""; target = address; @@ -190,209 +190,209 @@ text += '\n'; // we want to preserve formatting } } // the cycle - + // last dispatch dispatchAdditionalDocString(doctype, target, text); - + s.close(); } - + void genPropDocs(fstream& fo) { - PropertyServicePtr ps = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService")); - + PropertyServicePtr ps = GET_SERVICE(PropertyService); + StringIteratorPtr pn = ps->getAllPropertyNames(); - + fo << "\\chapter{Properties}" << endl; - + while (!pn->end()) { const string& propname = pn->next(); - + std::cerr << "Prop " << propname << std::endl; - + fo << "\\section*{" << propname << "}" << endl; - + // for cross linking fo << "\\label{prop_" << propname << "}" << endl; - + // standard info header. Chunk versions, data size, label // Get the prop group PropertyGroup* pg = ps->getPropertyGroup(propname); fo << "\\textbf{Property}: " << propname << endl << endl; // TODO: Path - + uint maj, min; maj = pg->getChunkVersionMajor(); min = pg->getChunkVersionMinor(); - + // get the info fo << "\\textbf{Chunk version:} " << maj << "." << min << endl; - + if (pg->getBuiltin()) fo << "Built-In" << endl; - - + + DocStrings::iterator it = mPropertyDocs.find(propname); if (it != mPropertyDocs.end()) { fo << endl << "\\subsection*{Description}" << endl; - + // spit out the additional docs if present fo << it->second << endl; } - + fo << endl << "\\subsection*{Fields}" << endl; fo << "\\begin{tabular}{lcrrr}" << endl; // table contents, each line ending with \\, cells separated using & fo << "\\textbf{Field} & \\textbf{Type} & \\textbf{Size} & \\textbf{Enum} & \\textbf{Description} \\\\" << endl; - + // TODO: spit all the property fields with descriptions DataFieldDescIteratorPtr dfi = pg->getFieldDescIterator(); - + // iterate while(!dfi->end()) { const DataFieldDesc& df = dfi->next(); - + fo << df.name << " & " << DVariant::typeToString(df.type) << " & " << df.size << " & "; - + if (df.enumerator != NULL) { fo << df.enumerator->getName() << " \\pageref{enum_"<< df.enumerator->getName() <<"}"; queueEnumForDesc(df.enumerator); } else { fo << "-"; }; - - fo << " & \\\\" << std::endl; + + fo << " & \\\\" << std::endl; } - + fo << "\\end{tabular}" << endl; - + fo << endl; } } - + void genLinkDocs(fstream& fo) { - LinkServicePtr ls = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); - + LinkServicePtr ls = GET_SERVICE(LinkService); + StringIteratorPtr ln = ls->getAllLinkNames(); - + fo << "\\chapter{Links}" << endl; - + while (!ln->end()) { const string& linkname = ln->next(); - + fo << "\\section*{" << linkname << "}" << endl; - + // for cross linking fo << "\\label{prop_" << linkname << "}" << endl; - + DocStrings::iterator it = mLinkDocs.find(linkname); if (it != mLinkDocs.end()) { fo << endl << "\\subsection*{Description}" << endl; - + // spit out the additional docs if present fo << it->second << endl; } - + fo << "\\end{tabular}" << endl; - + fo << endl; } } - + void genEnumDocs(fstream& fo) { fo << "\\chapter{Enumerations}" << endl; - + EnumMap::iterator it = mEncounteredEnums.begin(); - + for (; it != mEncounteredEnums.end(); ++it) { DEnum* en = it->second; - + const string& enname = en->getName(); - + fo << "\\section*{" << enname << "}" << endl; - + // for cross linking fo << "\\label{enum_" << enname << "}" << endl; - + fo << "\\textbf{Type:}"; - + if (en->isBitfield()) fo << "Bitfield" << endl << endl; // TODO: Path else fo << "Enumeration" << endl << endl; // TODO: Path - + DocStrings::iterator it = mEnumDocs.find(enname); - + if (it != mEnumDocs.end()) { fo << endl << "\\subsection*{Description}" << endl; - + // spit out the additional docs if present fo << it->second << endl; } - + fo << endl << "\\subsection*{Structure}" << endl; fo << "\\begin{tabular}{lr}" << endl; // table contents, each line ending with \\, cells separated using & fo << "\\textbf{Key} & \\textbf{Value} \\\\" << endl; - + DEnum::EnumFieldList l = en->getFieldList(0); - + DEnum::EnumFieldList::iterator kit = l.begin(); - + // iterate for (; kit != l.end(); ++kit) { DEnum::EnumField& f = *kit; - + fo << f.key << " & " << - f.value.toUInt() << " \\\\" << std::endl; + f.value.toUInt() << " \\\\" << std::endl; } - + fo << "\\end{tabular}" << endl; - + fo << endl; } } - + void doGenerate(void) { DVariant fn = "output.tex"; // default - + // override, if present mConfigSvc->getParam("outfile", fn); - + std::fstream s; - + s.open(fn.toString().c_str(), ios::out); - + // if we have specialdoc header, output it s << mSpecialDocs["header"]; - + // first iterate over the properties genPropDocs(s); - + // links genLinkDocs(s); - + // enumerations genEnumDocs(s); - + s<<"\\end{document}" << endl; s.close(); } - + public: DocGenerator(int argc, char**argv) : mArgc(argc), mArgv(argv) { mRoot = new Opde::Root(SERVICE_CORE); // we want script autoload mRoot->registerCustomScriptLoaders(); - mConfigSvc = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); + mConfigSvc = GET_SERVICE(ConfigService); } - + ~DocGenerator(void) { mConfigSvc = NULL; delete mRoot; } - + void help(void) { cout << "Usage: opdeDocGen config_file" << endl; } @@ -403,23 +403,23 @@ help(); return false; } - + // TODO: debug config param. mRoot->setLogLevel(5); // TODO: logfile config param. mRoot->logToFile("opdeDocGen.log"); - + // initialize the system - load the dtype scripts according to the config initialize(); - + // read the additional docs file. This file contains docs for each entity - // has a simple format [prop PropName] or [link LinkName] for doc target change. Other lines (after stripping # comments) + // has a simple format [prop PropName] or [link LinkName] for doc target change. Other lines (after stripping # comments) // are accumulated to the last specified doc target loadAdditionalDocStrings(); - + // generate the doc doGenerate(); - + return true; } }; @@ -427,10 +427,10 @@ int main(int argc, char**argv) { int rv = 0; - + try { DocGenerator dg(argc, argv); - + if (!dg.generateDoc()) rv = 3; // exit code 3 - parsing failed } catch( Ogre::Exception& e ) { Modified: trunk/src/main/PLDefScriptCompiler.cpp =================================================================== --- trunk/src/main/PLDefScriptCompiler.cpp 2008-11-19 12:32:17 UTC (rev 976) +++ trunk/src/main/PLDefScriptCompiler.cpp 2008-11-19 12:34:27 UTC (rev 977) @@ -60,9 +60,9 @@ "<FakeSize> ::= 'fake_size' <Integer> \n" // if dark reports a different size, report that one "<LinkHidden> ::= 'hidden' \n" - + "<DataCache> ::= 'cached' \n" - + "<DataType> ::= 'type' <Label> \n" "<DChunkVersion> ::= 'd_ver' <Version> \n" @@ -101,9 +101,9 @@ // default to global definition group ServiceManager* svcmgr = ServiceManager::getSingletonPtr(); - mLinkService = static_pointer_cast<LinkService>(svcmgr->getService("LinkService")); - mBinaryService = static_pointer_cast<BinaryService>(svcmgr->getService("BinaryService")); - mPropertyService = static_pointer_cast<PropertyService>(svcmgr->getService("PropertyService")); + mLinkService = GET_SERVICE(LinkService); + mBinaryService = GET_SERVICE(BinaryService); + mPropertyService = GET_SERVICE(PropertyService); mCurrentState.state = CS_UNKNOWN; } @@ -135,9 +135,9 @@ addLexemeTokenAction("label", ID_LABEL, &PLDefScriptCompiler::parseLabel); addLexemeTokenAction("inherit", ID_INHERIT, &PLDefScriptCompiler::parseInherit); - + addLexemeTokenAction("cache", ID_CACHED, &PLDefScriptCompiler::parseCached); - + addLexemeTokenAction("type", ID_TYPE, &PLDefScriptCompiler::parseType); } @@ -196,10 +196,10 @@ dt = getTypeDef("links", mCurrentState.dtypename); // TODO: Hardcoded. A problem? DataStoragePtr stor; - + if (!dt.isNull()) stor = new StructuredDataStorage(dt, false); - + RelationPtr rel = mLinkService->createRelation(mCurrentState.name, stor, mCurrentState.hidden); if (mCurrentState.fake_size >= 0) @@ -216,17 +216,17 @@ PropertyGroup* pg; DataStoragePtr stor; - + if (mCurrentState.ptype == "varstr") { stor = new StringDataStorage(); } else { DTypeDefPtr dt; dt = getTypeDef("properties", mCurrentState.dtypename); - - stor = new StructuredDataStorage(dt, mCurrentState.cached); + + stor = new StructuredDataStorage(dt, mCurrentState.cached); } - + pg = mPropertyService->createPropertyGroup( mCurrentState.label, mCurrentState.name, @@ -338,7 +338,7 @@ void PLDefScriptCompiler::parseCached(void) { mCurrentState.cached = true; } - + //----------------------------------------------------------------------- void PLDefScriptCompiler::parseType(void) { mCurrentState.ptype = getNextTokenLabel(); Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2008-11-19 12:32:17 UTC (rev 976) +++ trunk/src/main/Root.cpp 2008-11-19 12:34:27 UTC (rev 977) @@ -35,6 +35,7 @@ #include "filelog.h" #include "OpdeServiceManager.h" + // Services #include "WorldRepService.h" #include "GameService.h" @@ -45,6 +46,8 @@ #include "LinkService.h" #include "PropertyService.h" #include "DatabaseService.h" +#include "MaterialService.h" +#include "LightService.h" // base #include "ManualBinFileLoader.h" @@ -55,17 +58,19 @@ #include "ConsoleFrontend.h" #include "stdlog.h" + + namespace Opde { // ------------------------------------------------------- // singleton related template<> Root* Singleton<Root>::ms_Singleton = 0; - + // ------------------------------------------------------- - Root::Root(uint serviceMask, char* logFileName) : - mLogger(NULL), - mServiceMgr(NULL), - mOgreRoot(NULL), - mOgreLogManager(NULL), + Root::Root(uint serviceMask, char* logFileName) : + mLogger(NULL), + mServiceMgr(NULL), + mOgreRoot(NULL), + mOgreLogManager(NULL), mConsoleBackend(NULL), mDTypeScriptCompiler(NULL), mPLDefScriptCompiler(NULL), @@ -74,29 +79,29 @@ mPLDefScriptLdr(NULL), mDirArchiveFactory(NULL), mCrfArchiveFactory(NULL) { - + mLogger = new Logger(); - + if (logFileName) { logToFile(logFileName); } - + LOG_INFO("Starting openDarkEngine %d.%d.%d (%s)", OPDE_VER_MAJOR, OPDE_VER_MINOR, OPDE_VER_PATCH, OPDE_CODE_NAME); - + mServiceMgr = new ServiceManager(mServiceMask); - + // To supress logging of OGRE (we'll use a plugin for our logger for Ogre logs) // we need to create a Ogre::LogManager here on our own mOgreLogManager = new Ogre::LogManager(); mOgreLogManager->createLog("Ogre.log", true, false, true); - + mOgreOpdeLogConnector = new OgreOpdeLogConnector(mLogger); - + // create our logger's ogre log listener interface. Connect together mOgreLogManager->getDefaultLog()->addListener(mOgreOpdeLogConnector); - + mOgreRoot = new Ogre::Root(); - + // register the factories mDirArchiveFactory = new Ogre::CaseLessFileSystemArchiveFactory(); // TODO: Decide if this should be used or not @@ -114,10 +119,10 @@ mDTypeScriptCompiler = new DTypeScriptCompiler(); mPLDefScriptCompiler = new PLDefScriptCompiler(); - + setupLoopModes(); } - + // ------------------------------------------------------- Root::~Root() { LOG_INFO("openDarkEngine is shutting down"); @@ -125,50 +130,50 @@ // if those are used, delete them delete mDTypeScriptLdr; delete mPLDefScriptLdr; - + delete mDTypeScriptCompiler; delete mPLDefScriptCompiler; // Archive manager has no way to remove the archive factories... - + delete mServiceMgr; - + delete mConsoleBackend; - + Ogre::CustomImageCodec::shutdown(); delete mOgreRoot; - + LogListenerList::iterator it = mLogListeners.begin(); - + for (;it != mLogListeners.end(); ++it) { mLogger->unregisterLogListener(*it); delete *it; } mLogListeners.clear(); - + delete mDirArchiveFactory; delete mCrfArchiveFactory; - + // As the last thing - release the logger delete mLogger; - + delete mOgreOpdeLogConnector; - + delete mOgreLogManager; - - + + } // ------------------------------------------------------- void Root::registerCustomScriptLoaders() { // TODO: bindings - + // the classes register themselves to ogre if (!mDTypeScriptLdr) mDTypeScriptLdr = new DTypeScriptLoader(); - - if (!mPLDefScriptLdr) + + if (!mPLDefScriptLdr) mPLDefScriptLdr = new PLDefScriptLoader(); } @@ -182,8 +187,8 @@ // ------------------------------------------------------- void Root::loadConfigFile(const std::string& fileName) { - ConfigServicePtr cfp = static_pointer_cast<ConfigService>(mServiceMgr->getService("ConfigService")); - + ConfigServicePtr cfp = GET_SERVICE(ConfigService); + cfp->loadParams(fileName); } @@ -223,29 +228,29 @@ } } } - + // ------------------------------------------------------- void Root::addResourceLocation(const std::string& name, const std::string& typeName, const std::string& secName, bool recursive) { Ogre::ResourceGroupManager::getSingleton().addResourceLocation(name, typeName, secName, recursive); } - + // ------------------------------------------------------- void Root::removeResourceLocation(const std::string& name, const std::string& secName) { Ogre::ResourceGroupManager::getSingleton().removeResourceLocation(name, secName); } - + // ------------------------------------------------------- void Root::registerServiceFactories() { // register all the service factories // The factories are deleted in service manager - + // TODO: WE ALL KNOW this is VERY WRONG way to work with memory allocation - + /* The right way would be for example: 1. ServiceFactoryPtr - shared_ptr<ServiceFactory>; 2. Work everywhere with the shared_ptr instead - */ - + */ + new WorldRepServiceFactory(); new BinaryServiceFactory(); new GameServiceFactory(); @@ -258,41 +263,43 @@ new InputServiceFactory(); new LoopServiceFactory(); new ObjectServiceFactory(); + new LightServiceFactory(); + new MaterialServiceFactory(); } - + // ------------------------------------------------------- void Root::setupLoopModes() { // Loop modes are only setup if not masked by global service mask if (mServiceMask & SERVICE_ENGINE) { // Loop modes are hardcoded - LoopServicePtr ls = static_pointer_cast<LoopService>(ServiceManager::getSingleton().getService("LoopService")); + LoopServicePtr ls = GET_SERVICE(LoopService); // Create all the required loop services LoopModeDefinition def; - + // Loop mode that does no engine processing at all def.id = 1; def.name = "GUIOnlyLoopMode"; def.mask = LOOPMODE_INPUT | LOOPMODE_RENDER; - + ls->createLoopMode(def); - + // Loop mode that runs all the loop clients def.id = 0xFF; def.name = "AllClientsLoopMode"; def.mask = LOOPMODE_MASK_ALL_CLIENTS; - + ls->createLoopMode(def); } } - + // ------------------------------------------------------- void Root::logToFile(const std::string& fname) { LogListener* flog = new FileLog(fname); - + mLogger->registerLogListener(flog); mLogListeners.push_back(flog); } - + // ------------------------------------------------------- void Root::setLogLevel(int level) { // Call mLogger to setup the log level This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |