From: <vo...@us...> - 2008-08-20 18:47:17
|
Revision: 787 http://opde.svn.sourceforge.net/opde/?rev=787&view=rev Author: volca Date: 2008-08-20 18:47:20 +0000 (Wed, 20 Aug 2008) Log Message: ----------- * sharedptr passed as const reference where possible * Z-Bias work (unfinished), transparency tweaks (nearly ok) * PropertyDataStorage -> DataStorage (the files will move as well) * some other bad coding practices fixed Modified Paths: -------------- trunk/src/services/binary/BinaryService.cpp trunk/src/services/binary/BinaryService.h trunk/src/services/database/DatabaseService.cpp trunk/src/services/database/DatabaseService.h trunk/src/services/inherit/InheritService.cpp trunk/src/services/inherit/InheritService.h trunk/src/services/link/LinkCommon.h trunk/src/services/link/LinkService.cpp trunk/src/services/link/LinkService.h trunk/src/services/link/Relation.cpp trunk/src/services/link/Relation.h trunk/src/services/loop/LoopService.cpp trunk/src/services/loop/LoopService.h trunk/src/services/object/ObjectService.cpp trunk/src/services/object/ObjectService.h trunk/src/services/object/SymNamePropertyStorage.cpp trunk/src/services/object/SymNamePropertyStorage.h trunk/src/services/property/PropertyCommon.h trunk/src/services/property/PropertyGroup.cpp trunk/src/services/property/PropertyGroup.h trunk/src/services/property/PropertyService.cpp trunk/src/services/property/PropertyService.h trunk/src/services/property/PropertyStorage.cpp trunk/src/services/property/PropertyStorage.h trunk/src/services/render/RenderService.cpp trunk/src/services/render/RenderService.h trunk/src/services/script/ScriptService.cpp trunk/src/services/script/ScriptService.h trunk/src/services/worldrep/WorldRepService.cpp trunk/src/services/worldrep/WorldRepService.h Modified: trunk/src/services/binary/BinaryService.cpp =================================================================== --- trunk/src/services/binary/BinaryService.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/binary/BinaryService.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -53,7 +53,7 @@ } //------------------------------------ - void BinaryService::addType(const std::string& group, DTypeDefPtr def) { + void BinaryService::addType(const std::string& group, const DTypeDefPtr& def) { LOG_DEBUG("BinaryService: Inserting type %s/%s", group.c_str(), def->name().c_str()); std::pair<TypeGroups::iterator, bool> grp = mTypeGroups.insert(TypeGroups::value_type(group, TypeMap())); @@ -62,7 +62,7 @@ } //------------------------------------ - void BinaryService::addEnum(const std::string& group, const std::string& name, DEnumPtr enm) { + void BinaryService::addEnum(const std::string& group, const std::string& name, const DEnumPtr& enm) { LOG_DEBUG("BinaryService: Inserting enum %s/%s", group.c_str(), name.c_str()); std::pair<EnumGroups::iterator, bool> grp = mEnumGroups.insert(EnumGroups::value_type(group, EnumMap())); Modified: trunk/src/services/binary/BinaryService.h =================================================================== --- trunk/src/services/binary/BinaryService.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/binary/BinaryService.h 2008-08-20 18:47:20 UTC (rev 787) @@ -51,19 +51,19 @@ * @param def The type definition to insert (the used name is taken from it) * @note Do release() the def if you do not intend to further use it once registered here */ - void addType(const std::string& group, DTypeDefPtr def); + void addType(const std::string& group, const DTypeDefPtr& def); /** Add a enumeration definition to a certain group (or global, if group=="") */ - void addEnum(const std::string& group, const std::string& name, DEnumPtr enm); + void addEnum(const std::string& group, const std::string& name, const DEnumPtr& enm); /** Add a type definition to the global definitions * @param def The type definition to insert (the used name is taken from it) * @see addType(const std::string&,DTypeDef) */ - inline void addType(DTypeDefPtr def) { addType("", def); }; + inline void addType(const DTypeDefPtr& def) { addType("", def); }; /** Add a type definition to the global definitions */ - inline void addEnum(const std::string& name, DEnumPtr enm) { addEnum("", name, enm); }; + inline void addEnum(const std::string& name, const DEnumPtr& enm) { addEnum("", name, enm); }; /** get the type definition of a type. * @param name The type name, in form "Name" or "Group/Name" Modified: trunk/src/services/database/DatabaseService.cpp =================================================================== --- trunk/src/services/database/DatabaseService.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/database/DatabaseService.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -114,7 +114,7 @@ } //------------------------------------------------------ - void DatabaseService::_loadMissionDB(FileGroupPtr db) { + void DatabaseService::_loadMissionDB(const FileGroupPtr& db) { LOG_DEBUG("DatabaseService::_loadMissionDB"); _loadGameSysDB(db); @@ -132,7 +132,7 @@ } //------------------------------------------------------ - void DatabaseService::_loadGameSysDB(FileGroupPtr db) { + void DatabaseService::_loadGameSysDB(const FileGroupPtr& db) { LOG_DEBUG("DatabaseService::_loadGameSysDB"); // GAM_FILE Modified: trunk/src/services/database/DatabaseService.h =================================================================== --- trunk/src/services/database/DatabaseService.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/database/DatabaseService.h 2008-08-20 18:47:20 UTC (rev 787) @@ -134,10 +134,10 @@ FileGroupPtr getDBFileNamed(const std::string& filename); /// Load and assign a mission database to the db (has to be a SaveGame), then loads the gamesys for the loaded miss file - void _loadMissionDB(FileGroupPtr db); + void _loadMissionDB(const FileGroupPtr& db); /// Load and assign a gamesys database to the db (has to be a mission or savegame) - void _loadGameSysDB(FileGroupPtr db); + void _loadGameSysDB(const FileGroupPtr& db); /// Overriden broadcast to support progress reports virtual void broadcastMessage(const DatabaseChangeMsg& msg); Modified: trunk/src/services/inherit/InheritService.cpp =================================================================== --- trunk/src/services/inherit/InheritService.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/inherit/InheritService.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -101,10 +101,12 @@ // It may so happen that the init() was not called... if (!mMetaPropRelation.isNull()) mMetaPropRelation->unregisterListener(mMetaPropListenerID); + + mInheritors.clear(); // sufficient - the smart_ptrs will delete } //------------------------------------------------------ - void InheritService::addInheritorFactory(InheritorFactoryPtr factory) { + void InheritService::addInheritorFactory(const InheritorFactoryPtr& factory) { mInheritorFactoryMap.insert(make_pair(factory->getName(), factory)); } @@ -347,7 +349,7 @@ } //------------------------------------------------------ - void InheritService::_addLink(LinkPtr link, unsigned int priority) { + void InheritService::_addLink(const LinkPtr& link, unsigned int priority) { // It works like this. link.src() is the target for inheritance, link.dst() is the source for inheritance InheritLinkPtr ilp = new InheritLink; @@ -375,7 +377,7 @@ } //------------------------------------------------------ - void InheritService::_changeLink(LinkPtr link, unsigned int priority) { + void InheritService::_changeLink(const LinkPtr& link, unsigned int priority) { // Modify priority of the link InheritMap::iterator it = mInheritSources.find(link->dst()); @@ -389,7 +391,7 @@ } //------------------------------------------------------ - void InheritService::_removeLink(LinkPtr link) { + void InheritService::_removeLink(const LinkPtr& link) { InheritMap::iterator it = mInheritSources.find(link->dst()); if (it != mInheritSources.end()) { Modified: trunk/src/services/inherit/InheritService.h =================================================================== --- trunk/src/services/inherit/InheritService.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/inherit/InheritService.h 2008-08-20 18:47:20 UTC (rev 787) @@ -68,7 +68,7 @@ /** Registers an inheritor factory */ - void addInheritorFactory(InheritorFactoryPtr factory); + void addInheritorFactory(const InheritorFactoryPtr& factory); /** Creates an inheritor instance, given the inheritor name * @return Inheritor pointer on success @@ -139,15 +139,15 @@ /** Adds an inheritance link. * @param link The link to be added as InheritLink * @param priority The priority of the link to be added */ - void _addLink(LinkPtr link, unsigned int priority); + void _addLink(const LinkPtr& link, unsigned int priority); /** Modifies the inheritance link priority * @param link The link to be modified * @param priority The priority of the link to be modified to */ - void _changeLink(LinkPtr link, unsigned int priority); + void _changeLink(const LinkPtr& link, unsigned int priority); /** Removes the given inheritance link */ - void _removeLink(LinkPtr link); + void _removeLink(const LinkPtr& link); /// Listener for the metaprop void onMetaPropMsg(const LinkChangeMsg& msg); Modified: trunk/src/services/link/LinkCommon.h =================================================================== --- trunk/src/services/link/LinkCommon.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/link/LinkCommon.h 2008-08-20 18:47:20 UTC (rev 787) @@ -74,16 +74,16 @@ public: /// Constructor - Creates empty data defined by default values in type - LinkData(link_id_t id, DTypeDefPtr type, bool useCache = false) : mID(id), DType(type, useCache) { }; + LinkData(link_id_t id, const DTypeDefPtr& type, bool useCache = false) : mID(id), DType(type, useCache) { }; /// Constructor - Loads data from FilePtr - LinkData(link_id_t id, DTypeDefPtr type, FilePtr file, int _size, bool useCache = false) : mID(id), DType(type,file,_size, useCache) { }; + LinkData(link_id_t id, const DTypeDefPtr& type, FilePtr file, int _size, bool useCache = false) : mID(id), DType(type,file,_size, useCache) { }; /// Constructor - copies the data from another DType instance LinkData(link_id_t id, const DType& type, bool useCache = false) : mID(id), DType(type, useCache) {}; /// Constructor - copies the data from DTypePtr instance - LinkData(link_id_t id, const DTypePtr type, bool useCache = false) : mID(id), DType(*type, useCache) {}; + LinkData(link_id_t id, const DTypePtr& type, bool useCache = false) : mID(id), DType(*type, useCache) {}; /// Destructor - Deletes the data ~LinkData() { }; @@ -145,7 +145,7 @@ /// Link chage message typedef struct LinkChangeMsg { LinkChangeMsg() : link(NULL) {}; - LinkChangeMsg(LinkPtr lnk) : link(lnk) {}; + LinkChangeMsg(const LinkPtr& lnk) : link(lnk) {}; /// A change that happened LinkChangeType change; Modified: trunk/src/services/link/LinkService.cpp =================================================================== --- trunk/src/services/link/LinkService.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/link/LinkService.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -28,7 +28,34 @@ using namespace std; namespace Opde { + /// helper string iterator over map keys + class RelationNameMapKeyIterator : public StringIterator { + public: + RelationNameMapKeyIterator(LinkService::RelationNameMap& relationMap) : + mRelationMap(relationMap) { + mIter = mRelationMap.begin(); + mEnd = mRelationMap.end(); + } + virtual const std::string& next() { + assert(!end()); + + const std::string& s = mIter->first; + + ++mIter; + + return s; + } + + virtual bool end() const { + return (mIter == mEnd); + } + + protected: + LinkService::RelationNameMap::iterator mIter, mEnd; + LinkService::RelationNameMap& mRelationMap; + }; + /*----------------------------------------------------*/ /*-------------------- LinkService -------------------*/ /*----------------------------------------------------*/ @@ -57,7 +84,7 @@ } //------------------------------------------------------ - void LinkService::load(FileGroupPtr db) { + void LinkService::load(const FileGroupPtr& db) { LOG_INFO("LinkService: Loading link definitions from file group '%s'", db->getName().c_str()); // First, try to build the Relation Name -> flavor and reverse records @@ -129,7 +156,7 @@ } //------------------------------------------------------ - void LinkService::save(FileGroupPtr db, uint saveMask) { + void LinkService::save(const FileGroupPtr& db, uint saveMask) { // Iterates through all the relations. Writes the name into the Relations file, and writes the relation's data using relation->save(db, saveMask) call // I do not want to have gaps in the relations indexing, which is implicit given the record order @@ -184,7 +211,7 @@ } //------------------------------------------------------ - RelationPtr LinkService::createRelation(const std::string& name, DTypeDefPtr type, bool hidden) { + RelationPtr LinkService::createRelation(const std::string& name, const DTypeDefPtr& type, bool hidden) { if (name.substr(0,1) == "~") OPDE_EXCEPT("Name conflict: Relation can't use ~ character as the first one, it's reserved for inverse relations. Conflicting name: " + name, "LinkService::createRelation"); @@ -274,8 +301,14 @@ } } + + // -------------------------------------------------------------------------- + StringIteratorPtr LinkService::getAllLinkNames() { + return new RelationNameMapKeyIterator(mRelationNameMap); + } + //------------------------------------------------------ - bool LinkService::requestRelationFlavorMap(int id, const std::string& name, RelationPtr rel) { + bool LinkService::requestRelationFlavorMap(int id, const std::string& name, RelationPtr& rel) { std::pair<FlavorToName::iterator, bool> res1 = mFlavorToName.insert(make_pair(id, name)); if (!res1.second) { Modified: trunk/src/services/link/LinkService.h =================================================================== --- trunk/src/services/link/LinkService.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/link/LinkService.h 2008-08-20 18:47:20 UTC (rev 787) @@ -62,7 +62,7 @@ * @param name The relation name * @param type The type defining the data format for link data * @param hidden The hidden relations (true) will not show up on public link list places */ - RelationPtr createRelation(const std::string& name, DTypeDefPtr type, bool hidden); + RelationPtr createRelation(const std::string& name, const DTypeDefPtr& type, bool hidden); /** Get relation given it's name * @param name The relation's name @@ -85,10 +85,10 @@ void objectDestroyed(int id); /** load links from a single database */ - void load(FileGroupPtr db); + void load(const FileGroupPtr& db); /** Saves the links and link data according to the saveMask */ - void save(FileGroupPtr db, uint saveMask); + void save(const FileGroupPtr& db, uint saveMask); /** Clears all the data and the relation mappings */ void clear(); @@ -112,8 +112,13 @@ /** @see Relation::getLink */ LinkPtr getLink(link_id_t id) const; - + /// Name to Relation instance. The primary storage of Relation instances. + typedef std::map<std::string, RelationPtr> RelationNameMap; + + /** @returns a link name iterator over all link type names (both inverse and normal ones) */ + StringIteratorPtr getAllLinkNames(); + protected: bool init(); void bootstrapFinished(); @@ -124,14 +129,11 @@ * @param rel The relation instance to associate with that id * @return false if conflict happened, true if all went ok, and new mapping is inserted (or already was registered) */ - bool requestRelationFlavorMap(int id, const std::string& name, RelationPtr rel); + bool requestRelationFlavorMap(int id, const std::string& name, RelationPtr& rel); typedef std::map<int, std::string> FlavorToName; typedef std::map<std::string, int> NameToFlavor; - /// Name to Relation instance. The primary storage of Relation instances. - typedef std::map<std::string, RelationPtr> RelationNameMap; - /// ID to Relation instance. Secondary storage of Relation instances, mapped per request when loading typedef std::map<int, RelationPtr> RelationIDMap; Modified: trunk/src/services/link/Relation.cpp =================================================================== --- trunk/src/services/link/Relation.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/link/Relation.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -71,7 +71,7 @@ /*-----------------------------------------------------*/ /*----------------------- Relation --------------------*/ /*-----------------------------------------------------*/ - Relation::Relation(const std::string& name, DTypeDefPtr type, bool isInverse, bool hidden) : + Relation::Relation(const std::string& name, const DTypeDefPtr& type, bool isInverse, bool hidden) : mID(-1), mName(name), mType(type), @@ -107,7 +107,7 @@ } // -------------------------------------------------------------------------- - void Relation::load(FileGroupPtr db) { + void Relation::load(const FileGroupPtr& db) { assert(!mIsInverse); // load the links and thei're data @@ -250,7 +250,7 @@ } // -------------------------------------------------------------------------- - void Relation::save(FileGroupPtr db, uint saveMask) { + void Relation::save(const FileGroupPtr& db, uint saveMask) { assert(!mIsInverse); LOG_DEBUG("Relation::save Saving relation %s", mName.c_str()); @@ -399,7 +399,7 @@ } // -------------------------------------------------------------------------- - link_id_t Relation::create(int from, int to, DTypePtr data) { + link_id_t Relation::create(int from, int to, const DTypePtr& data) { // Request an id. First let's see what concreteness we have unsigned int cidx = 0; @@ -575,8 +575,7 @@ } // -------------------------------------------------------------------------- - // -------------------------------------------------------------------------- - void Relation::_addLink(LinkPtr link) { + void Relation::_addLink(const LinkPtr& link) { // Insert, and detect the presence of such link already inserted (same ID) std::pair<LinkMap::iterator, bool> ires = mLinkMap.insert(make_pair(link->mID, link)); @@ -671,7 +670,7 @@ } // -------------------------------------------------------------------------- - void Relation::_assignLinkData(link_id_t id, LinkDataPtr data) { + void Relation::_assignLinkData(link_id_t id, const LinkDataPtr& data) { std::pair<LinkDataMap::iterator, bool> ires = mLinkDataMap.insert(make_pair(id, data)); if (!ires.second) { @@ -724,7 +723,7 @@ } // -------------------------------------------------------------------------- - LinkPtr Relation::createInverseLink(LinkPtr src) { + LinkPtr Relation::createInverseLink(const LinkPtr& src) { LinkPtr inv = new Link( src->id(), src->dst(), Modified: trunk/src/services/link/Relation.h =================================================================== --- trunk/src/services/link/Relation.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/link/Relation.h 2008-08-20 18:47:20 UTC (rev 787) @@ -35,15 +35,15 @@ */ class Relation : public NonCopyable, public MessageSource<LinkChangeMsg> { public: - Relation(const std::string& name, DTypeDefPtr type, bool isInverse, bool hidden = false); + Relation(const std::string& name, const DTypeDefPtr& type, bool isInverse, bool hidden = false); virtual ~Relation(); /** Loads the relation data from the given FileGroup */ - void load(FileGroupPtr db); + void load(const FileGroupPtr& db); /** Saves the relation data to the fiven file group * @todo Save Mask implementation */ - void save(FileGroupPtr db, uint saveMask); + void save(const FileGroupPtr& db, uint saveMask); /// @returns the Data Type describing the link data DTypeDefPtr getDataType() { return mType; }; @@ -99,7 +99,7 @@ * @note this version does create the link including the data, so a time and plenty of broadcasts is saved. * @note to create and fill the data, use DTypeDef::create to obtain a valid buffer to fill, then use DTypeDef::set to fill the fields. Once ready, supply the final buffer to the createLink */ - link_id_t create(int from, int to, DTypePtr data); + link_id_t create(int from, int to, const DTypePtr& data); /** getter for the DTypeDef this relation uses. * @note The returned object is better be tested by doing DTypeDefPtr::isNull() to determine if the object is usable. Relations with no data will just return null DTypeDefPtr */ @@ -175,7 +175,7 @@ * @note Always use this method to internally insert new links, if not in a situation when the standard sequence of link addition is needed (notification, query database refresh) * @note The link data have to be assigned prior to calling this method */ - void _addLink(LinkPtr newlnk); + void _addLink(const LinkPtr& newlnk); /** Internal method for link removal handling. Notifies the listeners, refreshes query databases. * @param id The id of the link to be removed @@ -194,7 +194,7 @@ * @param id Link id to assign the data to * @param data The link data to be assigned */ - void _assignLinkData(link_id_t id, LinkDataPtr data); + void _assignLinkData(link_id_t id, const LinkDataPtr& data); /** Removes link data for a link ID * @param id the ID of the link for which data should be removed @@ -217,7 +217,7 @@ * @param src The source link * @return LinkPtr of the new inverse link */ - LinkPtr createInverseLink(LinkPtr src); + LinkPtr createInverseLink(const LinkPtr& src); /** internal object destruction handler. @see objectDestroyed */ void _objectDestroyed(int id); Modified: trunk/src/services/loop/LoopService.cpp =================================================================== --- trunk/src/services/loop/LoopService.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/loop/LoopService.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -288,7 +288,7 @@ } //------------------------------------------------------ - void LoopService::setLoopMode(LoopModePtr newMode) { + void LoopService::setLoopMode(const LoopModePtr& newMode) { mActiveMode = mNewLoopMode; } Modified: trunk/src/services/loop/LoopService.h =================================================================== --- trunk/src/services/loop/LoopService.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/loop/LoopService.h 2008-08-20 18:47:20 UTC (rev 787) @@ -225,7 +225,7 @@ /** sets a new loop mode */ - void setLoopMode(LoopModePtr newMode); + void setLoopMode(const LoopModePtr& newMode); /// Termination was requested bool mTerminationRequested; Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/object/ObjectService.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -243,17 +243,17 @@ // For SceneNodes mPropPosition = mPropertyService->getPropertyGroup("Position"); - if (mPropPosition.isNull()) + if (mPropPosition == NULL) OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "ObjectService::bootstrapFinished"); mPropSymName = mPropertyService->getPropertyGroup("SymbolicName"); - if (mPropSymName.isNull()) + if (mPropSymName == NULL) OPDE_EXCEPT("Could not get SymbolicName property group. Not defined. Fatal", "ObjectService::bootstrapFinished"); mSymNameStorage = new SymNamePropertyStorage(); - // takes over the ownership of this Prop. storage - mPropSymName->setPropertyStorage(mSymNameStorage, true); + + mPropSymName->setPropertyStorage(mSymNameStorage); } //------------------------------------------------------ @@ -300,7 +300,7 @@ //------------------------------------------------------ - void ObjectService::_load(FileGroupPtr db, uint loadMask) { + void ObjectService::_load(const FileGroupPtr& db, uint loadMask) { // Load min, max obj id, then the rest of the FilePtr as a bitmap data. Those then are unpacked to ease the use int32_t minID, maxID; @@ -427,7 +427,7 @@ } //------------------------------------------------------ - void ObjectService::_save(FileGroupPtr db, uint saveMask) { + void ObjectService::_save(const FileGroupPtr& db, uint saveMask) { // only some values should be saved - // concrete objects or archetypes BitArray objmask(mAllocatedObjects.getMinIndex(), mAllocatedObjects.getMaxIndex()); Modified: trunk/src/services/object/ObjectService.h =================================================================== --- trunk/src/services/object/ObjectService.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/object/ObjectService.h 2008-08-20 18:47:20 UTC (rev 787) @@ -53,16 +53,20 @@ /// Object was destroyed (Including all links and properties) OBJ_DESTROYED, /// All objects were destroyed - OBJ_SYSTEM_CLEARED + OBJ_SYSTEM_CLEARED, + /// New min/max range for object ID's was supplied + OBJ_ID_RANGE_CHANGED } ObjectServiceMessageType; /// Message from object service - object was created/destroyed, etc struct ObjectServiceMsg { - // Type of the message that happened + /// Type of the message that happened ObjectServiceMessageType type; - // Object id that the message is informing about (not valid for OBJ_SYSTEM_CLEARED) + /// Object id that the message is informing about (not valid for OBJ_SYSTEM_CLEARED). Minimal object id for OBJ_ID_RANGE_CHANGED int objectID; + /// The Maximal id to hold. Only for OBJ_ID_RANGE_CHANGED event, otherwise undefined + int maxObjID; }; /** @brief Object service - service managing in-game objects. Holder of the object's scene nodes @@ -155,10 +159,10 @@ void onDBChange(const DatabaseChangeMsg& m); /** load links from a single database */ - void _load(FileGroupPtr db, uint clearMask); + void _load(const FileGroupPtr& db, uint clearMask); /** Saves the links and link data according to the saveMask */ - void _save(FileGroupPtr db, uint saveMask); + void _save(const FileGroupPtr& db, uint saveMask); /** Clears all the data and the relation mappings */ void _clear(uint clearMask); @@ -188,7 +192,7 @@ void createBuiltinResources(); /// Converts the properties orientation to quaternion - static Ogre::Quaternion toOrientation(PropertyDataPtr posdata); + static Ogre::Quaternion toOrientation(PropertyDataPtr& posdata); /// A stack of id's typedef std::stack<int> ObjectIDStack; @@ -197,7 +201,7 @@ BitArray mAllocatedObjects; /// Position property (to set/get position/orientation of objects) - PropertyGroupPtr mPropPosition; + PropertyGroup* mPropPosition; /// Map's symbolic name to object ID @@ -226,13 +230,13 @@ PropertyServicePtr mPropertyService; /// Symbolic name property pointer - PropertyGroupPtr mPropSymName; + PropertyGroup* mPropSymName; /// Scene manager pointer Ogre::SceneManager* mSceneMgr; /// Our specialized property storage for symbolic names - SymNamePropertyStorage* mSymNameStorage; + SymNamePropertyStoragePtr mSymNameStorage; }; /// Shared pointer to the service Modified: trunk/src/services/object/SymNamePropertyStorage.cpp =================================================================== --- trunk/src/services/object/SymNamePropertyStorage.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/object/SymNamePropertyStorage.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -29,19 +29,19 @@ // -------------------------------------------------------------------------- - SymNamePropertyStorage::SymNamePropertyStorage() : StringPropertyStorage() {}; + SymNamePropertyStorage::SymNamePropertyStorage() : StringDataStorage() {}; // -------------------------------------------------------------------------- SymNamePropertyStorage::~SymNamePropertyStorage() {}; // -------------------------------------------------------------------------- - bool SymNamePropertyStorage::destroyProp(int objID) { + bool SymNamePropertyStorage::destroy(int objID) { // Find the object name before destroying DVariant res; - if (getPropField(objID, "", res)) { - bool eraseok = StringPropertyStorage::destroyProp(objID); + if (getField(objID, "", res)) { + bool eraseok = StringDataStorage::destroy(objID); assert(eraseok); @@ -61,7 +61,7 @@ // -------------------------------------------------------------------------- - bool SymNamePropertyStorage::setPropField(int objID, const std::string& field, const DVariant& value) { + bool SymNamePropertyStorage::setField(int objID, const std::string& field, const DVariant& value) { // if the parent's set field passes, update ourselves as well. // but first, look if we can proceed (name duplicity check) @@ -74,16 +74,16 @@ return true; } - if (!hasProp(objID)) + if (!has(objID)) return false; // get the previous name of the object, free that record - StringPropertyMap::const_iterator sit = mStringPropMap.find(objID); + StringDataMap::const_iterator sit = mStringPropMap.find(objID); assert(sit != mStringPropMap.end()); // name not in use yet, we can assign it - if (StringPropertyStorage::setPropField(objID, field, value)) { + if (StringDataStorage::setField(objID, field, value)) { ReverseNameMap::iterator rit = mReverseMap.find(sit->second); mReverseMap.erase(rit); @@ -98,11 +98,11 @@ } // -------------------------------------------------------------------------- - bool SymNamePropertyStorage::_createProp(int objID, const std::string& text) { + bool SymNamePropertyStorage::_create(int objID, const std::string& text) { std::pair<ReverseNameMap::iterator, bool> res = mReverseMap.insert(std::make_pair(text, objID)); if (res.second) { - if (StringPropertyStorage::_createProp(objID, text)) { + if (StringDataStorage::_create(objID, text)) { return true; } } @@ -130,7 +130,7 @@ // -------------------------------------------------------------------------- void SymNamePropertyStorage::clear() { - StringPropertyStorage::clear(); + StringDataStorage::clear(); mReverseMap.clear(); } }; Modified: trunk/src/services/object/SymNamePropertyStorage.h =================================================================== --- trunk/src/services/object/SymNamePropertyStorage.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/object/SymNamePropertyStorage.h 2008-08-20 18:47:20 UTC (rev 787) @@ -30,7 +30,7 @@ namespace Opde { /** A Bi-Directional unique string Symbolic name storage for symbolic names. Overrides the StringPropertyStorage. */ - class SymNamePropertyStorage : public StringPropertyStorage { + class SymNamePropertyStorage : public StringDataStorage { protected: typedef std::map<std::string, int> ReverseNameMap; @@ -40,11 +40,11 @@ SymNamePropertyStorage(); virtual ~SymNamePropertyStorage(); - virtual bool destroyProp(int objID); + virtual bool destroy(int objID); - virtual bool setPropField(int objID, const std::string& field, const DVariant& value); + virtual bool setField(int objID, const std::string& field, const DVariant& value); - virtual bool _createProp(int objID, const std::string& text); + virtual bool _create(int objID, const std::string& text); virtual void clear(); @@ -53,8 +53,9 @@ /// Tester for name usage bool nameUsed(const std::string& name); + }; - }; + typedef shared_ptr<SymNamePropertyStorage> SymNamePropertyStoragePtr; }; #endif Modified: trunk/src/services/property/PropertyCommon.h =================================================================== --- trunk/src/services/property/PropertyCommon.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/property/PropertyCommon.h 2008-08-20 18:47:20 UTC (rev 787) @@ -29,13 +29,14 @@ namespace Opde { /** @brief Property data holder + * @deprecated We now have common data storage for both link and data, and extra layer of abstraction using DataStorage class */ class PropertyData : public DType { friend class PropertyGroup; public: /** Constructor. Constructs new data buffer, filled with zeros */ - PropertyData(int id, DTypeDefPtr type, bool useCache = false) : mID(id), DType(type, useCache) { }; + PropertyData(int id, const DTypeDefPtr& type, bool useCache = false) : mID(id), DType(type, useCache) { }; /** Constructor - loads data from FilePtr * @param id The object ID @@ -43,17 +44,17 @@ * @param file The File pointer (FilePtr) to load data from * @param _size the size of the data to be loaded * */ - PropertyData(int id, DTypeDefPtr type, FilePtr file, int _size, bool useCache = false) : mID(id), DType(type, file, _size, useCache) { }; + PropertyData(int id, const DTypeDefPtr& type, FilePtr file, int _size, bool useCache = false) : mID(id), DType(type, file, _size, useCache) { }; /** Constructor - takes object id and data instance * @param id The object ID * @param data The Data instance to copy the data from */ - PropertyData(int id, DTypePtr data, bool useCache = false) : mID(id), DType(*data, useCache) { }; + PropertyData(int id, const DTypePtr& data, bool useCache = false) : mID(id), DType(*data, useCache) { }; /** PropertyData cloning constructor * @param id The object ID * @param data The Data instance to copy the data from */ - PropertyData(int id, PropertyData data, bool useCache = false) : mID(id), DType(data, useCache) { }; + PropertyData(int id, const PropertyData& data, bool useCache = false) : mID(id), DType(data, useCache) { }; /** Destructor */ ~PropertyData() { }; @@ -84,7 +85,7 @@ PROP_GROUP_CLEARED } PropertyChangeType; - /// Link chage message + /// Property chage message typedef struct PropertyChangeMsg { /// A change that happened PropertyChangeType change; Modified: trunk/src/services/property/PropertyGroup.cpp =================================================================== --- trunk/src/services/property/PropertyGroup.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/property/PropertyGroup.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -30,17 +30,14 @@ namespace Opde { // -------------------------------------------------------------------------- - // PropertyGroup::PropertyGroup(PropertyService* owner, const std::string& name, const std::string& chunk_name, const std::string& ptype, DTypeDefPtr type, string inheritorName) : PropertyGroup::PropertyGroup(PropertyService* owner, const std::string& name, const std::string& chunk_name, - PropertyStorage* storage, std::string inheritorName, bool deleteStorageOnDestroy) : + const DataStoragePtr& storage, std::string inheritorName) : mOwner(owner), mName(name), mChunkName(chunk_name), mVerMaj(1), mVerMin(1), - mUseDataCache(false), mPropertyStorage(NULL), - mDeletePropStorageOnDestroy(deleteStorageOnDestroy), mBuiltin(false) { // Find the inheritor by the name, and assign too @@ -62,31 +59,20 @@ if (! mInheritor.isNull()) mInheritor->unregisterListener(mInheritorListenerID); - - if (mDeletePropStorageOnDestroy) - delete mPropertyStorage; } // -------------------------------------------------------------------------- - void PropertyGroup::setPropertyStorage(PropertyStorage* newStorage, bool deleteOnDestroy) { + void PropertyGroup::setPropertyStorage(const DataStoragePtr& newStorage) { // see if we had any data in the current if (!mPropertyStorage->isEmpty()) { LOG_ERROR("Property storage replacement for %s: Previous property storage had some data. This could mean something bad could happen...", mName.c_str()); } - - if (mDeletePropStorageOnDestroy) { - if (mPropertyStorage != newStorage) - delete mPropertyStorage; - } - - mPropertyStorage = newStorage; - mDeletePropStorageOnDestroy = deleteOnDestroy; } // -------------------------------------------------------------------------- - void PropertyGroup::load(FileGroupPtr db) { + void PropertyGroup::load(const FileGroupPtr& db) { // Open the chunk specified by "P$" + mChunkName FilePtr fprop; @@ -118,7 +104,7 @@ size = fprop->tell(); // Use property storage to load the property - if (mPropertyStorage->readFromFile(fprop, id)) { + if (mPropertyStorage->readFromFile(fprop, id, true)) { _addProperty(id); } else { LOG_ERROR("There was an error loading property %s for object %d. Property was not loaded", mName.c_str(), id); @@ -128,7 +114,7 @@ // -------------------------------------------------------------------------- - void PropertyGroup::save(FileGroupPtr db, const BitArray& objMask) { + void PropertyGroup::save(const FileGroupPtr& db, const BitArray& objMask) { // Open the chunk specified by "P$" + mChunkName FilePtr fprop; @@ -151,7 +137,7 @@ if (!objMask.get(id)) continue; - if (!mPropertyStorage->writeToFile(fprop, id)) + if (!mPropertyStorage->writeToFile(fprop, id, true)) LOG_ERROR("There was an error writing property %s for object %d. Property was not loaded", mName.c_str(), id); } } @@ -171,7 +157,7 @@ // -------------------------------------------------------------------------- bool PropertyGroup::createProperty(int obj_id) { - if (mPropertyStorage->createProp(obj_id)) { + if (mPropertyStorage->create(obj_id)) { _addProperty(obj_id); return true; @@ -182,7 +168,7 @@ // -------------------------------------------------------------------------- bool PropertyGroup::removeProperty(int obj_id) { - if (mPropertyStorage->destroyProp(obj_id)) { + if (mPropertyStorage->destroy(obj_id)) { mInheritor->setImplements(obj_id, false); return true; @@ -196,14 +182,14 @@ bool PropertyGroup::cloneProperty(int obj_id, int src_id) { bool had = false; - if (mPropertyStorage->hasProp(obj_id)) { + if (mPropertyStorage->has(obj_id)) { // delete first - mPropertyStorage->destroyProp(obj_id); + mPropertyStorage->destroy(obj_id); had = true; } - if (mPropertyStorage->cloneProp(src_id, obj_id)) { + if (mPropertyStorage->clone(src_id, obj_id)) { // went ok, the target now includes the property didn't previously if (!had) _addProperty(obj_id); @@ -216,13 +202,13 @@ // -------------------------------------------------------------------------- bool PropertyGroup::set(int id, const std::string& field, const DVariant& value) { - return mPropertyStorage->setPropField(id, field, value); + return mPropertyStorage->setField(id, field, value); } // -------------------------------------------------------------------------- bool PropertyGroup::get(int id, const std::string& field, DVariant& target) { int effID = _getEffectiveObject(id); - return mPropertyStorage->getPropField(effID, field, target); + return mPropertyStorage->getField(effID, field, target); } // -------------------------------------------------------------------------- @@ -263,5 +249,9 @@ removeProperty(id); } + // -------------------------------------------------------------------------- + DataFieldDescIteratorPtr PropertyGroup::getFieldDescIterator(void) { + return mPropertyStorage->getFieldDescIterator(); + } } Modified: trunk/src/services/property/PropertyGroup.h =================================================================== --- trunk/src/services/property/PropertyGroup.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/property/PropertyGroup.h 2008-08-20 18:47:20 UTC (rev 787) @@ -52,13 +52,19 @@ * @param ver_maj The major version of the chunk that stores this property * @param ver_min The minor version of the chunk that stores this property */ - PropertyGroup(PropertyService* owner, const std::string& name, const std::string& chunk_name, PropertyStorage* storage, std::string inheritorName, bool deleteStorageOnDestroy); + PropertyGroup(PropertyService* owner, const std::string& name, const std::string& chunk_name, const DataStoragePtr& storage, std::string inheritorName); /** Setter for the property chunk version */ inline void setChunkVersions(uint verMaj, uint verMin) { mVerMaj = verMaj; mVerMin = verMin; }; + + /** gets the major version of the chunk */ + inline uint getChunkVersionMajor(void) { return mVerMaj; }; + + /** gets the minor version of the chunk */ + inline uint getChunkVersionMinor(void) { return mVerMin; }; /** Destructor */ virtual ~PropertyGroup(); @@ -73,7 +79,7 @@ * @param propStorage The new storage for properties * @warning This should not be used when the property group holds some data */ - virtual void setPropertyStorage(PropertyStorage* newStorage, bool deleteOnDestroy = false); + virtual void setPropertyStorage(const DataStoragePtr& newStorage); /// Name getter. Returns the name of property this group manages @@ -100,18 +106,18 @@ * @note Will return false if the object only inherits the property, but does not own it (use has for that) */ bool owns(int obj_id) const { - return mPropertyStorage->hasProp(obj_id); + return mPropertyStorage->has(obj_id); } /** Loads properties from a file group * @param db The database to load from */ - void load(FileGroupPtr db); + void load(const FileGroupPtr& db); /** Saves properties to a file group * @param db The database to save to * @param objMask The BitArray of objects to be saved */ - void save(FileGroupPtr db, const BitArray& objMask); + void save(const FileGroupPtr& db, const BitArray& objMask); /** Clears the whole property group. * Clears out all the properties, and broadcasts PROP_GROUP_CLEARED @@ -158,15 +164,12 @@ /** Notification that an object was destroyed. @see PropertyService::objectDestroyed */ void objectDestroyed(int id); - - /** Sets the property group to cache data (caches fields so no direct to/from data will be used on loading) - * @param cache if true, writes will set a the value in a cache as well, and reads will search cache first - * @todo Reflect this into property storage + + /** @return A reference to const DataFieldDesc iterator, usable for data description, automatic gui composition, etc. + * Internally, this is just a wrapper around getFieldDescIterator call to PropertyStorage. + * @todo It should be decided if it is guaranteed to have this iterator in a storable quality - if it could be used to load/save data. */ - void setCacheData(bool cache) { mUseDataCache = cache; }; - - /** @return true if cache for data is used, false otherwise */ - bool getCacheData() { return mUseDataCache; }; + DataFieldDescIteratorPtr getFieldDescIterator(void); protected: /** Does the internal handling related to the creation of a property for object @@ -203,15 +206,9 @@ /// Inheritor value changes listener Inheritor::ListenerID mInheritorListenerID; - /// If true, data caching will be used - bool mUseDataCache; - /// Property storage used to store data for the property - PropertyStorage* mPropertyStorage; + DataStoragePtr mPropertyStorage; - /// True if the property storage should be deleted upon property group destruction - bool mDeletePropStorageOnDestroy; - /// Owner service PropertyService* mOwner; @@ -220,7 +217,7 @@ }; /// Shared pointer to property group - typedef shared_ptr<PropertyGroup> PropertyGroupPtr; + // typedef shared_ptr<PropertyGroup> PropertyGroupPtr; } Modified: trunk/src/services/property/PropertyService.cpp =================================================================== --- trunk/src/services/property/PropertyService.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/property/PropertyService.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -83,71 +83,30 @@ } // -------------------------------------------------------------------------- - PropertyGroupPtr PropertyService::createStructuredPropertyGroup(const std::string& name, const std::string& chunk_name, const DTypeDefPtr& type, std::string inheritorName) { - // create a property holder - PropertyStorage* storage; - + PropertyGroup* PropertyService::createPropertyGroup(const std::string& name, const std::string& chunkName, std::string inheritorName, const DataStoragePtr& storage, bool takeover) { + PropertyGroup* nr; try { - storage = new StructuredPropertyStorage(type, false); + nr = new PropertyGroup(this, name, chunkName, storage, inheritorName); } catch (...) { - OPDE_EXCEPT("Failed to create property storage for " + name, "PropertyService::createPropertyGroup"); - } - - // create the propert group - PropertyGroupPtr nr; - try { - nr = new PropertyGroup(this, name, chunk_name, storage, inheritorName, true); - } catch (...) { - delete storage; - OPDE_EXCEPT("Failed to create property group for " + name, "PropertyService::createPropertyGroup"); } std::pair<PropertyGroupMap::iterator, bool> res = mPropertyGroupMap.insert(make_pair(name, nr)); - if (!res.second) + if (!res.second) { + delete nr; + OPDE_EXCEPT("Failed to insert new instance of PropertyGroup, name already allocated : " + name, "PropertyService::createPropertyGroup"); - - LOG_INFO("PropertyService::createPropertyGroup: Created a property group %s (With chunk name %s)", name.c_str(), chunk_name.c_str()); - - return nr; - } - - // -------------------------------------------------------------------------- - PropertyGroupPtr PropertyService::createStringPropertyGroup(const std::string& name, const std::string& chunk_name, std::string inheritorName) { - // create a property holder - PropertyStorage* storage; - - try { - storage = new StringPropertyStorage(); - } catch (...) { - OPDE_EXCEPT("Failed to create property storage for " + name, "PropertyService::createPropertyGroup"); } - // create the propert group - PropertyGroupPtr nr; - try { - nr = new PropertyGroup(this, name, chunk_name, storage, inheritorName, true); - } catch (...) { - delete storage; - - OPDE_EXCEPT("Failed to create property group for " + name, "PropertyService::createPropertyGroup"); - } - - std::pair<PropertyGroupMap::iterator, bool> res = mPropertyGroupMap.insert(make_pair(name, nr)); + LOG_INFO("PropertyService::createPropertyGroup: Created a property group %s (With chunk name %s)", name.c_str(), chunkName.c_str()); - if (!res.second) - OPDE_EXCEPT("Failed to insert new instance of PropertyGroup, name already allocated : " + name, - "PropertyService::createPropertyGroup"); - - LOG_INFO("PropertyService::createPropertyGroup: Created a property group %s (With chunk name %s)", name.c_str(), chunk_name.c_str()); - return nr; } - + // -------------------------------------------------------------------------- - void PropertyService::load(FileGroupPtr db) { + void PropertyService::load(const FileGroupPtr& db) { // We just give the db to all registered groups PropertyGroupMap::iterator it = mPropertyGroupMap.begin(); @@ -162,7 +121,7 @@ } // -------------------------------------------------------------------------- - void PropertyService::save(FileGroupPtr db, const BitArray& objMask) { + void PropertyService::save(const FileGroupPtr& db, const BitArray& objMask) { // We just give the db to all registered groups PropertyGroupMap::iterator it = mPropertyGroupMap.begin(); @@ -186,7 +145,7 @@ } // -------------------------------------------------------------------------- - PropertyGroupPtr PropertyService::getPropertyGroup(const std::string& name) { + PropertyGroup* PropertyService::getPropertyGroup(const std::string& name) { PropertyGroupMap::iterator it = mPropertyGroupMap.find(name); if (it != mPropertyGroupMap.end()) { @@ -198,9 +157,9 @@ // -------------------------------------------------------------------------- bool PropertyService::has(int obj_id, const std::string& propName) { - PropertyGroupPtr prop = getPropertyGroup(propName); + PropertyGroup* prop = getPropertyGroup(propName); - if (!prop.isNull()) { + if (prop != NULL) { return prop->has(obj_id); } @@ -209,9 +168,9 @@ // -------------------------------------------------------------------------- bool PropertyService::owns(int obj_id, const std::string& propName) { - PropertyGroupPtr prop = getPropertyGroup(propName); + PropertyGroup* prop = getPropertyGroup(propName); - if (!prop.isNull()) { + if (prop != NULL) { return prop->owns(obj_id); } @@ -220,9 +179,9 @@ // -------------------------------------------------------------------------- bool PropertyService::set(int obj_id, const std::string& propName, const std::string& propField, const DVariant& value) { - PropertyGroupPtr prop = getPropertyGroup(propName); + PropertyGroup* prop = getPropertyGroup(propName); - if (!prop.isNull()) { + if (prop != NULL) { return prop->set(obj_id, propField, value); } @@ -232,9 +191,9 @@ // -------------------------------------------------------------------------- bool PropertyService::get(int obj_id, const std::string& propName, const std::string& propField, DVariant& target) { - PropertyGroupPtr prop = getPropertyGroup(propName); + PropertyGroup* prop = getPropertyGroup(propName); - if (!prop.isNull()) { + if (prop != NULL) { return prop->get(obj_id, propField, target); } Modified: trunk/src/services/property/PropertyService.h =================================================================== --- trunk/src/services/property/PropertyService.h 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/property/PropertyService.h 2008-08-20 18:47:20 UTC (rev 787) @@ -38,29 +38,22 @@ public: PropertyService(ServiceManager *manager, const std::string& name); virtual ~PropertyService(); - - /** Creates a structured property group - property holder using a structure definition in DTypeDef - * @see PropertyGroup::PropertyGroup - */ - PropertyGroupPtr createStructuredPropertyGroup(const std::string& name, const std::string& chunk_name, const DTypeDefPtr& type, std::string inheritorName); - /** Creates a single field holding property group - property holder containing a single field of a specified type + /** Creates a property group using the specified property storage + * @param name The name of the property group + * @param chunkName The name of the chunk the property is stored in + * @param inheritorName The name of the iheritor to use for the property (the published name of the inheritor factory) + * @param storage The property storage to be used for the property data. Caller is responsible for the storage destruction, unless takeover is set to true + * @param takeover If true, the storage's ownership will be taken over, meaning the storage will be destroyed upon destruction of the property group (or when construction fails) * @see PropertyGroup::PropertyGroup */ - PropertyGroupPtr createSimplePropertyGroup(const std::string& name, const std::string& chunk_name, DVariant::Type type, std::string inheritorName); + PropertyGroup* createPropertyGroup(const std::string& name, const std::string& chunkName, std::string inheritorName, const DataStoragePtr& storage, bool takeover = false); - /** Creates a string holding property group - property holder containing a variable length string - * @see PropertyGroup::PropertyGroup - */ - PropertyGroupPtr createStringPropertyGroup(const std::string& name, const std::string& chunk_name, std::string inheritorName); - - - /** Retrieves the property group given it's name, or NULL if not found * @param name The name of the property to retrieve the group for - * @return PropertyGroupPtr of the PropertyGroup named name if found, isNull()==true otherwise */ - PropertyGroupPtr getPropertyGroup(const std::string& name); + * @return PropertyGroup* of the PropertyGroup named name if found, isNull()==true otherwise */ + PropertyGroup* getPropertyGroup(const std::string& name); /** Determines if the given object has a property mapped (either itself, or by inheritance through MetaProperty link) * @param obj_id The object id to query @@ -76,7 +69,6 @@ */ bool owns(int obj_id, const std::string& propName); - /** Property setter. Sets a value of a property field * @param obj_id The object id * @param propName The name of the property group @@ -100,12 +92,12 @@ /** Load the properties from the database * @param db The database file group to use */ - void load(FileGroupPtr db); + void load(const FileGroupPtr& db); /** Saves the properties according to the saveMask * @param db The database file group to save to * @param objMask the BitArray of objects to be written */ - void save(FileGroupPtr db, const BitArray& objMask); + void save(const FileGroupPtr& db, const BitArray& objMask); /** Clears out all the PropertyGroups (effectively wiping out all properties) */ void clear(); @@ -114,7 +106,7 @@ StringIteratorPtr getAllPropertyNames(); /// maps property groups to their names - typedef std::map< std::string, PropertyGroupPtr > PropertyGroupMap; + typedef std::map< std::string, PropertyGroup* > PropertyGroupMap; protected: /// service initialization Modified: trunk/src/services/property/PropertyStorage.cpp =================================================================== --- trunk/src/services/property/PropertyStorage.cpp 2008-08-20 18:42:47 UTC (rev 786) +++ trunk/src/services/property/PropertyStorage.cpp 2008-08-20 18:47:20 UTC (rev 787) @@ -29,44 +29,88 @@ namespace Opde { // -------------------------------------------------------------------------- - // --------------- Default Property Storage --------------------------------- + // --------------- Various utility classes ---------------------------------- // -------------------------------------------------------------------------- + DTypeDefFieldDesc::DTypeDefFieldDesc(const DTypeDefPtr& type) { + // prepare the list + DTypeDef::const_iterator it = type->begin(); + + while (it != type->end()) { + const DTypeDef::FieldDef& fd = *(it++); + + DataFieldDesc dfd; + dfd.name = fd.name; + dfd.size = fd.type->size(); + dfd.type = fd.type->getDataType(); + dfd.enumerator = fd.type->getEnum().ptr(); + + mDataFieldDescList.push_back(dfd); + } + } + + DataFieldDescIteratorPtr DTypeDefFieldDesc::getIterator() { + return new DataFieldDescListIterator(mDataFieldDescList); + } + + /// iterator over a single DataFieldDesc element. Useful for single-fielded properties, such as varstr properties + class SingleFieldDescIterator : public DataFieldDescIterator { + public: + SingleFieldDescIterator(const DataFieldDesc& desc) : mDesc(desc), mEnd(false) {}; + + virtual const DataFieldDesc& next() { assert(!mEnd); mEnd = true; return mDesc; }; + + virtual bool end() const { std::cerr << "SFDI " << this << " " << mEnd << std::endl; return mEnd; }; + + protected: + const DataFieldDesc& mDesc; + bool mEnd; + }; + + // -------------------------------------------------------------------------- + // --------------- Structured Data Storage (DType based) -------------------- + // -------------------------------------------------------------------------- - StructuredPropertyStorage::StructuredPropertyStorage(const DTypeDefPtr& type, bool useDataCache) : + StructuredDataStorage::StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache) : mTypeDef(type), - mUseDataCache(useDataCache) { + mUseDataCache(useDataCache), + mFieldDesc(type) { + + } // -------------------------------------------------------------------------- - bool StructuredPropertyStorage::isEmpty() { - return mPropertyMap.empty(); + bool StructuredDataStorage::isEmpty() { + return mDataMap.empty(); } // -------------------------------------------------------------------------- - void StructuredPropertyStorage::clear() { - mPropertyMap.clear(); + void StructuredDataStorage::clear() { + mDataMap.clear(); } // -------------------------------------------------------------------------- - bool StructuredPropertyStorage::readFromFile(FilePtr& file, int objID) { - PropertyDataPtr pd = getPropForObject(objID); + bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); if (pd.isNull()) { uint32_t size; // Read the size - file->readElem(&size, sizeof(uint32_t)); + if (sizeStored) + file->readElem(&size, sizeof(uint32_t)); + else + size = mTypeDef->size(); // compare sizes if (size != mTypeDef->size()) - LOG_ERROR("Property size mismatch: %d definition, %d file source", mTypeDef->size(), size); + LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size); - // create a new property data - pd = _createProp(objID); + // create a new data + pd = _create(objID); pd->read(file, size); - mPropertyMap.insert(std::make_pair(objID, pd)); + mDataMap.insert(std::make_pair(objID, pd)); return true; } else { @@ -78,21 +122,22 @@ file->seek(size, File::FSEEK_CUR); - LOG_ERROR("Property already defined for object %d", objID); + LOG_ERROR("Data already defined for object %d", objID); } return false; } // -------------------------------------------------------------------------- - bool StructuredPropertyStorage::writeToFile(FilePtr& file, int objID) { - PropertyDataPtr pd = getPropForObject(objID); + bool StructuredDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); if (!pd.isNull()) { uint32_t size = pd->size(); // Write the size - file->writeElem(&size, sizeof(uint32_t)); + if (sizeStored) + file->writeElem(&size, sizeof(uint32_t)); // write the data itself pd->serialize(file); @@ -104,8 +149,8 @@ } // -------------------------------------------------------------------------- - bool StructuredPropertyStorage::setPropField(int objID, const std::string& field, const DVariant& value) { - PropertyDataPtr pd = getPropForObject(objID); + bool StructuredDataStorage::setField(int objID, const std::string& field, const DVariant& value) { + DTypePtr pd = getDataForObject(objID); if (!pd.isNull()) { // delegate to pd to set the field @@ -118,8 +163,8 @@ } // -------------------------------------------------------------------------- - bool StructuredPropertyStorage::getPropField(int objID, const std::string& field, DVariant& target) { - PropertyDataPtr pd = getPropForObject(objID); + bool StructuredDataStorage::getField(int objID, const std::string& field, DVariant& target) { + DTypePtr pd = getDataForObject(objID); if (!pd.isNull()) { // del... [truncated message content] |
From: <vo...@us...> - 2008-09-24 17:30:48
|
Revision: 850 http://opde.svn.sourceforge.net/opde/?rev=850&view=rev Author: volca Date: 2008-09-24 17:30:36 +0000 (Wed, 24 Sep 2008) Log Message: ----------- MP link now builtin Modified Paths: -------------- trunk/src/services/inherit/InheritService.cpp trunk/src/services/object/ObjectService.cpp Modified: trunk/src/services/inherit/InheritService.cpp =================================================================== --- trunk/src/services/inherit/InheritService.cpp 2008-09-24 17:29:44 UTC (rev 849) +++ trunk/src/services/inherit/InheritService.cpp 2008-09-24 17:30:36 UTC (rev 850) @@ -28,6 +28,7 @@ #include "CachedInheritor.h" #include "NeverInheritor.h" #include "ArchetypeInheritor.h" +#include "SingleFieldDataStorage.h" using namespace std; @@ -148,10 +149,10 @@ // Get the LinkService, then the relation metaprop // contact the config. service, and look for the inheritance link name - // TODO: ConfigurationService::getKey("Core","InheritanceLinkName").toString(); + // create the builtin metaprop storage... + DataStoragePtr stor = new UIntDataStorage(); + mMetaPropRelation = mLinkService->createRelation("MetaProp", stor, true); - mMetaPropRelation = mLinkService->getRelation("MetaProp"); - if (mMetaPropRelation.isNull()) OPDE_EXCEPT("MetaProp relation not found. Fatal.", "InheritService::init"); @@ -175,7 +176,7 @@ unsigned int priority = 0; if (msg.change != LNK_REMOVED) // Do not waste time if the link is removed - priority = mMetaPropRelation->getLinkField(msg.linkID, "priority").toUInt(); // Hardcoded! Could be parametrized + priority = mMetaPropRelation->getLinkField(msg.linkID, "").toUInt(); // Hardcoded! Could be parametrized // get the Link ref. LinkPtr l = mMetaPropRelation->getLink(msg.linkID); @@ -420,14 +421,10 @@ //------------------------------------------------------ void InheritService::_createMPLink(int objID, int srcID, int priority) { - // Modify priority of the link - DTypeDefPtr type = mMetaPropRelation->getDataType(); - DTypePtr ndata = new DType(type); - - ndata->set("priority", priority); - // Create a new link, that will do all the work... - mMetaPropRelation->create(objID, srcID, ndata); + // TODO: This should be made possible in a single go + link_id_t lid = mMetaPropRelation->create(objID, srcID); + mMetaPropRelation->setLinkField(lid, "", priority); } //-------------------------- Factory implementation Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-09-24 17:29:44 UTC (rev 849) +++ trunk/src/services/object/ObjectService.cpp 2008-09-24 17:30:36 UTC (rev 850) @@ -376,7 +376,7 @@ } try { - mLinkService->load(db); + mLinkService->load(db); // will load MP links if those exist, causing inherited properties to emerge } catch (BasicException& e) { LOG_FATAL("Exception while loading links from mission database : %s", e.getDetails().c_str()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-09-24 19:59:57
|
Revision: 858 http://opde.svn.sourceforge.net/opde/?rev=858&view=rev Author: volca Date: 2008-09-24 19:59:51 +0000 (Wed, 24 Sep 2008) Log Message: ----------- * dos2unix on CMakeLists again * services are now built static only on request Modified Paths: -------------- trunk/src/services/binary/CMakeLists.txt trunk/src/services/config/CMakeLists.txt trunk/src/services/database/CMakeLists.txt trunk/src/services/game/CMakeLists.txt trunk/src/services/gui/CMakeLists.txt trunk/src/services/inherit/CMakeLists.txt trunk/src/services/input/CMakeLists.txt trunk/src/services/link/CMakeLists.txt trunk/src/services/loop/CMakeLists.txt trunk/src/services/object/CMakeLists.txt trunk/src/services/property/CMakeLists.txt trunk/src/services/render/CMakeLists.txt trunk/src/services/script/CMakeLists.txt trunk/src/services/worldrep/CMakeLists.txt Modified: trunk/src/services/binary/CMakeLists.txt =================================================================== --- trunk/src/services/binary/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/binary/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,22 +1,24 @@ -INCLUDE( ${OPDE_SOURCE_DIR}/src/services/Services.cmake ) -INCLUDE( ${OPDE_SOURCE_DIR}/src/base/Base.cmake ) - -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_BASE_INCLUDES} - ${OPDE_SERVICE_INCLUDES} -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/dyntype - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeBinaryService BinaryService.cpp BinaryService.h) - -SET_TARGET_PROPERTIES(OpdeBinaryService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/Services.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/base/Base.cmake ) + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_BASE_INCLUDES} + ${OPDE_SERVICE_INCLUDES} +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeBinaryService BinaryService.cpp BinaryService.h) + + SET_TARGET_PROPERTIES(OpdeBinaryService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) \ No newline at end of file Modified: trunk/src/services/config/CMakeLists.txt =================================================================== --- trunk/src/services/config/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/config/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,32 +1,34 @@ -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/dyntype - ${OPDE_SOURCE_DIR}/src/base/Dark - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SOURCE_DIR}/src/compat - ${OPDE_SOURCE_DIR}/src/base/servicemanager - ${OPDE_SOURCE_DIR}/src/base/console - ${OPDE_SOURCE_DIR}/src/base/file - ${OPDE_SOURCE_DIR}/src/base/logger - ${OPDE_SOURCE_DIR}/src/services - ${OPDE_SOURCE_DIR}/src/services/worldrep - ${OPDE_SOURCE_DIR}/src/services/binary - ${OPDE_SOURCE_DIR}/src/services/database - ${OPDE_SOURCE_DIR}/src/services/link - ${OPDE_SOURCE_DIR}/src/services/inherit - ${OPDE_SOURCE_DIR}/src/services/property -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeConfigService ConfigService.cpp ConfigService.h) - -SET_TARGET_PROPERTIES(OpdeConfigService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/base/console + ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/logger + ${OPDE_SOURCE_DIR}/src/services + ${OPDE_SOURCE_DIR}/src/services/worldrep + ${OPDE_SOURCE_DIR}/src/services/binary + ${OPDE_SOURCE_DIR}/src/services/database + ${OPDE_SOURCE_DIR}/src/services/link + ${OPDE_SOURCE_DIR}/src/services/inherit + ${OPDE_SOURCE_DIR}/src/services/property +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeConfigService ConfigService.cpp ConfigService.h) + + SET_TARGET_PROPERTIES(OpdeConfigService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) \ No newline at end of file Modified: trunk/src/services/database/CMakeLists.txt =================================================================== --- trunk/src/services/database/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/database/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,26 +1,28 @@ -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/dyntype - ${OPDE_SOURCE_DIR}/src/base/Dark - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SOURCE_DIR}/src/compat - ${OPDE_SOURCE_DIR}/src/base/servicemanager - ${OPDE_SOURCE_DIR}/src/base/console - ${OPDE_SOURCE_DIR}/src/base/file - ${OPDE_SOURCE_DIR}/src/base/logger - ${OPDE_SOURCE_DIR}/src/services -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeDatabaseService DatabaseService.cpp DatabaseService.h) - -SET_TARGET_PROPERTIES(OpdeDatabaseService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/base/console + ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/logger + ${OPDE_SOURCE_DIR}/src/services +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeDatabaseService DatabaseService.cpp DatabaseService.h) + + SET_TARGET_PROPERTIES(OpdeDatabaseService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) \ No newline at end of file Modified: trunk/src/services/game/CMakeLists.txt =================================================================== --- trunk/src/services/game/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/game/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,32 +1,34 @@ -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/dyntype - ${OPDE_SOURCE_DIR}/src/base/Dark - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SOURCE_DIR}/src/compat - ${OPDE_SOURCE_DIR}/src/base/servicemanager - ${OPDE_SOURCE_DIR}/src/base/console - ${OPDE_SOURCE_DIR}/src/base/file - ${OPDE_SOURCE_DIR}/src/base/logger - ${OPDE_SOURCE_DIR}/src/services - ${OPDE_SOURCE_DIR}/src/services/worldrep - ${OPDE_SOURCE_DIR}/src/services/binary - ${OPDE_SOURCE_DIR}/src/services/database - ${OPDE_SOURCE_DIR}/src/services/link - ${OPDE_SOURCE_DIR}/src/services/inherit - ${OPDE_SOURCE_DIR}/src/services/property -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeGameService GameService.cpp GameService.h) - -SET_TARGET_PROPERTIES(OpdeGameService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/base/console + ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/logger + ${OPDE_SOURCE_DIR}/src/services + ${OPDE_SOURCE_DIR}/src/services/worldrep + ${OPDE_SOURCE_DIR}/src/services/binary + ${OPDE_SOURCE_DIR}/src/services/database + ${OPDE_SOURCE_DIR}/src/services/link + ${OPDE_SOURCE_DIR}/src/services/inherit + ${OPDE_SOURCE_DIR}/src/services/property +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeGameService GameService.cpp GameService.h) + + SET_TARGET_PROPERTIES(OpdeGameService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Modified: trunk/src/services/gui/CMakeLists.txt =================================================================== --- trunk/src/services/gui/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/gui/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -11,11 +11,13 @@ ${OPDE_SOURCE_DIR}/thirdparty/QuickGUI/include ) -add_library (OpdeGUIService - GUIService.cpp - GUIService.h -) +IF(STATIC_LIBS) + add_library (OpdeGUIService + GUIService.cpp + GUIService.h + ) -SET_TARGET_PROPERTIES(OpdeGUIService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) + SET_TARGET_PROPERTIES(OpdeGUIService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) \ No newline at end of file Modified: trunk/src/services/inherit/CMakeLists.txt =================================================================== --- trunk/src/services/inherit/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/inherit/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,37 +1,39 @@ -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_SOURCE_DIR}/src/compat - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/file - ${OPDE_SOURCE_DIR}/src/base/console - ${OPDE_SOURCE_DIR}/src/base/dyntype - ${OPDE_SOURCE_DIR}/src/base/servicemanager - ${OPDE_SOURCE_DIR}/src/base/logger - ${OPDE_SOURCE_DIR}/src/services - ${OPDE_SOURCE_DIR}/src/services/binary - ${OPDE_SOURCE_DIR}/src/services/link - ${OPDE_SOURCE_DIR}/src/services/database -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeInheritService - InheritService.cpp - CachedInheritor.cpp - NeverInheritor.cpp - ArchetypeInheritor.cpp - InheritService.h - CachedInheritor.h - NeverInheritor.h - ArchetypeInheritor.h - InheritCommon.h -) - -SET_TARGET_PROPERTIES(OpdeInheritService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/console + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/base/logger + ${OPDE_SOURCE_DIR}/src/services + ${OPDE_SOURCE_DIR}/src/services/binary + ${OPDE_SOURCE_DIR}/src/services/link + ${OPDE_SOURCE_DIR}/src/services/database +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeInheritService + InheritService.cpp + CachedInheritor.cpp + NeverInheritor.cpp + ArchetypeInheritor.cpp + InheritService.h + CachedInheritor.h + NeverInheritor.h + ArchetypeInheritor.h + InheritCommon.h + ) + + SET_TARGET_PROPERTIES(OpdeInheritService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) \ No newline at end of file Modified: trunk/src/services/input/CMakeLists.txt =================================================================== --- trunk/src/services/input/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/input/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,28 +1,30 @@ -INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) -INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) - -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OIS_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_BASE_INCLUDES} - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SERVICE_INCLUDES} -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OIS_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeInputService - InputService.cpp - InputEventMapper.cpp - InputService.h - InputEventMapper.h -) - -SET_TARGET_PROPERTIES(OpdeInputService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) +INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OIS_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_BASE_INCLUDES} + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SERVICE_INCLUDES} +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OIS_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeInputService + InputService.cpp + InputEventMapper.cpp + InputService.h + InputEventMapper.h + ) + + SET_TARGET_PROPERTIES(OpdeInputService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Modified: trunk/src/services/link/CMakeLists.txt =================================================================== --- trunk/src/services/link/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/link/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,27 +1,29 @@ -INCLUDE( ${OPDE_SOURCE_DIR}/src/services/Services.cmake ) -INCLUDE( ${OPDE_SOURCE_DIR}/src/base/Base.cmake ) - -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_BASE_INCLUDES} - ${OPDE_SERVICE_INCLUDES} -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeLinkService - LinkService.cpp - Relation.cpp - LinkService.h - Relation.h - LinkCommon.h -) - -SET_TARGET_PROPERTIES(OpdeLinkService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/Services.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/base/Base.cmake ) + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_BASE_INCLUDES} + ${OPDE_SERVICE_INCLUDES} +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeLinkService + LinkService.cpp + Relation.cpp + LinkService.h + Relation.h + LinkCommon.h + ) + + SET_TARGET_PROPERTIES(OpdeLinkService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Modified: trunk/src/services/loop/CMakeLists.txt =================================================================== --- trunk/src/services/loop/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/loop/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,22 +1,24 @@ -INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) -INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) - -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_BASE_INCLUDES} - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SERVICE_INCLUDES} -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OIS_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeLoopService LoopService.cpp LoopService.h) - -SET_TARGET_PROPERTIES(OpdeLoopService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) +INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_BASE_INCLUDES} + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SERVICE_INCLUDES} +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OIS_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeLoopService LoopService.cpp LoopService.h) + + SET_TARGET_PROPERTIES(OpdeLoopService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Modified: trunk/src/services/object/CMakeLists.txt =================================================================== --- trunk/src/services/object/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/object/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -15,13 +15,16 @@ ${OPDE_SOURCE_DIR}/src/base/servicemanager ) -add_library (OpdeObjectService - ObjectService.cpp - ObjectService.h - SymNamePropertyStorage.cpp - SymNamePropertyStorage.h -) -SET_TARGET_PROPERTIES(OpdeObjectService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +IF(STATIC_LIBS) + add_library (OpdeObjectService + ObjectService.cpp + ObjectService.h + SymNamePropertyStorage.cpp + SymNamePropertyStorage.h + ) + + SET_TARGET_PROPERTIES(OpdeObjectService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Modified: trunk/src/services/property/CMakeLists.txt =================================================================== --- trunk/src/services/property/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/property/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,34 +1,36 @@ -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/compat - ${OPDE_SOURCE_DIR}/src/base/servicemanager - ${OPDE_SOURCE_DIR}/src/base/dyntype - ${OPDE_SOURCE_DIR}/src/base/file - ${OPDE_SOURCE_DIR}/src/base/console - ${OPDE_SOURCE_DIR}/src/base/logger - ${OPDE_SOURCE_DIR}/src/services - ${OPDE_SOURCE_DIR}/src/services/binary - ${OPDE_SOURCE_DIR}/src/services/link - ${OPDE_SOURCE_DIR}/src/services/inherit - ${OPDE_SOURCE_DIR}/src/services/database -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdePropertyService - PropertyService.cpp - PropertyGroup.cpp - PropertyService.h - PropertyGroup.h - PropertyCommon.h -) - -SET_TARGET_PROPERTIES(OpdePropertyService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/console + ${OPDE_SOURCE_DIR}/src/base/logger + ${OPDE_SOURCE_DIR}/src/services + ${OPDE_SOURCE_DIR}/src/services/binary + ${OPDE_SOURCE_DIR}/src/services/link + ${OPDE_SOURCE_DIR}/src/services/inherit + ${OPDE_SOURCE_DIR}/src/services/database +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdePropertyService + PropertyService.cpp + PropertyGroup.cpp + PropertyService.h + PropertyGroup.h + PropertyCommon.h + ) + + SET_TARGET_PROPERTIES(OpdePropertyService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Modified: trunk/src/services/render/CMakeLists.txt =================================================================== --- trunk/src/services/render/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/render/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,33 +1,35 @@ -INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) -INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) - -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_BASE_INCLUDES} - ${OPDE_SOURCE_DIR}/src/compat - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SERVICE_INCLUDES} -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeRenderService - RenderService.cpp - RenderService.h - MaterialInstance.cpp - MaterialInstance.h - SubEntityMaterialInstance.cpp - SubEntityMaterialInstance.h - EntityMaterialInstance.cpp - EntityMaterialInstance.h -) - -SET_TARGET_PROPERTIES(OpdeRenderService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) - +INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) +INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_BASE_INCLUDES} + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SERVICE_INCLUDES} +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeRenderService + RenderService.cpp + RenderService.h + MaterialInstance.cpp + MaterialInstance.h + SubEntityMaterialInstance.cpp + SubEntityMaterialInstance.h + EntityMaterialInstance.cpp + EntityMaterialInstance.h + ) + + SET_TARGET_PROPERTIES(OpdeRenderService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) + Modified: trunk/src/services/script/CMakeLists.txt =================================================================== --- trunk/src/services/script/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/script/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -20,9 +20,11 @@ ${OGRE_LIB_DIR} ) -add_library (OpdeScriptService ScriptService.cpp ScriptService.h) +IF(STATIC_LIBS) + add_library (OpdeScriptService ScriptService.cpp ScriptService.h) -SET_TARGET_PROPERTIES(OpdeScriptService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) + SET_TARGET_PROPERTIES(OpdeScriptService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Modified: trunk/src/services/worldrep/CMakeLists.txt =================================================================== --- trunk/src/services/worldrep/CMakeLists.txt 2008-09-24 19:04:19 UTC (rev 857) +++ trunk/src/services/worldrep/CMakeLists.txt 2008-09-24 19:59:51 UTC (rev 858) @@ -1,31 +1,33 @@ -INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) -INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) - -include_directories ( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} - ${OPDE_BASE_INCLUDES} - ${OPDE_SOURCE_DIR}/src/base/Dark - ${OPDE_SOURCE_DIR}/src/scenemanager - ${OPDE_SERVICE_INCLUDES} -) - -link_directories ( - ${OGRE_LIB_DIR} - ${OPDE_SOURCE_DIR}/src/base/servicemanager -) - -add_library (OpdeWorldRepService - WorldRepService.cpp - WRCell.cpp - LightmapAtlas.cpp - WorldRepService.h - WRCell.h - LightmapAtlas.h - WRTypes.h - WRCommon.h -) - -SET_TARGET_PROPERTIES(OpdeWorldRepService PROPERTIES - COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" -) +INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) +INCLUDE(${OPDE_SOURCE_DIR}/src/base/Base.cmake) + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_BASE_INCLUDES} + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SERVICE_INCLUDES} +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeWorldRepService + WorldRepService.cpp + WRCell.cpp + LightmapAtlas.cpp + WorldRepService.h + WRCell.h + LightmapAtlas.h + WRTypes.h + WRCommon.h + ) + + SET_TARGET_PROPERTIES(OpdeWorldRepService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) 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:03:57
|
Revision: 862 http://opde.svn.sourceforge.net/opde/?rev=862&view=rev Author: volca Date: 2008-10-06 20:00:14 +0000 (Mon, 06 Oct 2008) Log Message: ----------- * DonorType added as built-in * DatabaseService now has loadGameSys method *some small fixes Modified Paths: -------------- trunk/src/services/database/DatabaseService.cpp trunk/src/services/database/DatabaseService.h trunk/src/services/inherit/InheritService.cpp trunk/src/services/inherit/InheritService.h trunk/src/services/object/ObjectService.cpp trunk/src/services/object/ObjectService.h trunk/src/services/property/PropertyService.cpp trunk/src/services/property/PropertyService.h Modified: trunk/src/services/database/DatabaseService.cpp =================================================================== --- trunk/src/services/database/DatabaseService.cpp 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/database/DatabaseService.cpp 2008-10-06 20:00:14 UTC (rev 862) @@ -69,7 +69,28 @@ LOG_DEBUG("DatabaseService::load - end()"); } + + //------------------------------------------------------ + void DatabaseService::loadGameSys(const std::string& filename) { + LOG_DEBUG("DatabaseService::loadGameSys - Loading requested file %s", filename.c_str()); + // if there is another database in hold + if (!mCurDB.isNull()) + unload(); + // Try to find the database + mCurDB = getDBFileNamed(filename); + + mLoadingStatus.reset(); + + // TODO: Overall coarse step - calculated from TagFile Count * mListeners.size() + mLoadingStatus.totalCoarse = mListeners.size(); + + // Currently hardcoded to mission db + _loadGameSysDB(mCurDB); + + LOG_DEBUG("DatabaseService::loadGameSys - end()"); + } + //------------------------------------------------------ FileGroupPtr DatabaseService::getDBFileNamed(const std::string& filename) { // TODO: Group of of the resource through the configuration service, once written @@ -117,8 +138,20 @@ void DatabaseService::_loadMissionDB(const FileGroupPtr& db) { LOG_DEBUG("DatabaseService::_loadMissionDB"); - _loadGameSysDB(db); + // Get the gamesys, load + // GAM_FILE + FilePtr fdm = db->getFile("GAM_FILE"); + char* data = new char[fdm->size()]; + + data[0] = 0x0; + + fdm->read(data, fdm->size()); + + FileGroupPtr gs = getDBFileNamed(data); + + _loadGameSysDB(gs); + // Load the Mission // Create a DB change message, and broadcast DatabaseChangeMsg m; @@ -135,24 +168,13 @@ void DatabaseService::_loadGameSysDB(const FileGroupPtr& db) { LOG_DEBUG("DatabaseService::_loadGameSysDB"); - // GAM_FILE - FilePtr fdm = db->getFile("GAM_FILE"); - - char* data = new char[fdm->size()]; - - data[0] = 0x0; - - fdm->read(data, fdm->size()); - - FileGroupPtr gs = getDBFileNamed(data); - // Create a DB change message, and broadcast DatabaseChangeMsg m; m.change = DBC_LOADING; m.dbtype = DBT_GAMESYS; m.dbtarget = DBT_MISSION; // TODO: Hardcoded - m.db = gs; + m.db = db; broadcastMessage(m); } Modified: trunk/src/services/database/DatabaseService.h =================================================================== --- trunk/src/services/database/DatabaseService.h 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/database/DatabaseService.h 2008-10-06 20:00:14 UTC (rev 862) @@ -1,177 +1,180 @@ -/****************************************************************************** - * - * 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 __DATABASESERVICE_H -#define __DATABASESERVICE_H - -#include "config.h" - -#include "OpdeServiceManager.h" -#include "OpdeService.h" -#include "FileGroup.h" -#include "SharedPtr.h" -#include "PrioritizedMessageSource.h" - -namespace Opde { - - /// Database event types - typedef enum { - /// Loading a new database - DBC_LOADING = 1, - /// Saving a database - DBC_SAVING, - /// Dropping a database - DBC_DROPPING - } DatabaseChangeType; - - /// Database types - typedef enum { - /// Game system database - DBT_GAMESYS = 1, - /// Mission file database - DBT_MISSION, - /// Savegame database - DBT_SAVEGAME, - /// A complete - full database (e.g. VBR, also means all for DB_DROPPING) - DBT_COMPLETE - } DatabaseType; - - /// The database change message - struct DatabaseChangeMsg { - /// A change requested to happen - DatabaseChangeType change; - /// Type of the database distributed by this event - DatabaseType dbtype; - /// Type of the target database - valid options are DB_MISSION, DB_SAVEGAME and DB_COMPLETE - DatabaseType dbtarget; - /// The pointer to the database file to be used - FileGroupPtr db; - }; - - - /// Progress report of database loading. This is what the Progress Listener get's every now and then to update the display - struct DatabaseProgressMsg { - /// Completion status - 0.0-1.0 - float completed; // Only the coarse steps are included here. The fine steps are not - /// Total coarse step count - int totalCoarse; - /// Current count of the coarse steps - int currentCoarse; - /// Overall count of the fine steps - int overallFine; // Increased on every DatabaseService::fineStep (not cleared). Means the overall step count that happened - - /// Recalculates the completed - void recalc() { - if (totalCoarse > 0) { - completed = static_cast<float>(currentCoarse) / static_cast<float>(totalCoarse); - } - } - - void reset() { - completed = 0; - totalCoarse = 0; - currentCoarse = 0; - overallFine = 0; - } - }; - - /** @brief Database service - service which handles dark database loading and saving - * Typically, a service wanting to handle database events will register as a listener, and handle the events given from this service. - * There are some rules: - * @li Mission loading will drop with DB_COMPLETE - * @li Savegame loading will have DB_SAVEGAME as dbtarget (so the services handling savegame related chunks will not process the mission's chunks) - */ - class OPDELIB_EXPORT DatabaseService : public Service, public PrioritizedMessageSource<DatabaseChangeMsg> { - public: - DatabaseService(ServiceManager *manager, const std::string& name); - virtual ~DatabaseService(); - - /// Loads a game database. Can be either savegame, or mission - void load(const std::string& filename); - - /// Unload the game data. Release all the data that are connected to a game's mission in progress - void unload(); - - /// Listener that receives events every now and then while loading - typedef Callback<DatabaseProgressMsg> ProgressListener; - - /// Progress Listener shared_ptr - typedef shared_ptr<ProgressListener> ProgressListenerPtr; - - /// Setter for the progress listener. - void setProgressListener(const ProgressListenerPtr& listener) { mProgressListener = listener; }; - - /// Clears (unsets) the progress listener (disabling it) - void unsetProgressListener() { mProgressListener = NULL; }; - - /// A free to use fine step function that calls the Progress Listener to reflect the loading progress - /// Use this especially in some long-to load services - void fineStep(int count); - - protected: - virtual bool init(); - - /// Retrieve a readonly database file by it's name - FileGroupPtr getDBFileNamed(const std::string& filename); - - /// Load and assign a mission database to the db (has to be a SaveGame), then loads the gamesys for the loaded miss file - void _loadMissionDB(const FileGroupPtr& db); - - /// Load and assign a gamesys database to the db (has to be a mission or savegame) - void _loadGameSysDB(const FileGroupPtr& db); - - /// Overriden broadcast to support progress reports - virtual void broadcastMessage(const DatabaseChangeMsg& msg); - - FileGroupPtr mCurDB; - - /// Used to report to the Progress Listener - DatabaseProgressMsg mLoadingStatus; - - ProgressListenerPtr mProgressListener; - }; - - /// Shared pointer to game service - typedef shared_ptr<DatabaseService> DatabaseServicePtr; - - - /// Factory for the DatabaseService objects - class OPDELIB_EXPORT DatabaseServiceFactory : public ServiceFactory { - public: - DatabaseServiceFactory(); - ~DatabaseServiceFactory() {}; - - /** Creates a DatabaseService instance */ - Service* createInstance(ServiceManager* manager); - - virtual const std::string& getName(); - - virtual const uint getMask(); - private: - static std::string mName; - }; -} - - -#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 __DATABASESERVICE_H +#define __DATABASESERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "FileGroup.h" +#include "SharedPtr.h" +#include "PrioritizedMessageSource.h" + +namespace Opde { + + /// Database event types + typedef enum { + /// Loading a new database + DBC_LOADING = 1, + /// Saving a database + DBC_SAVING, + /// Dropping a database + DBC_DROPPING + } DatabaseChangeType; + + /// Database types + typedef enum { + /// Game system database + DBT_GAMESYS = 1, + /// Mission file database + DBT_MISSION, + /// Savegame database + DBT_SAVEGAME, + /// A complete - full database (e.g. VBR, also means all for DB_DROPPING) + DBT_COMPLETE + } DatabaseType; + + /// The database change message + struct DatabaseChangeMsg { + /// A change requested to happen + DatabaseChangeType change; + /// Type of the database distributed by this event + DatabaseType dbtype; + /// Type of the target database - valid options are DB_MISSION, DB_SAVEGAME and DB_COMPLETE + DatabaseType dbtarget; + /// The pointer to the database file to be used + FileGroupPtr db; + }; + + + /// Progress report of database loading. This is what the Progress Listener get's every now and then to update the display + struct DatabaseProgressMsg { + /// Completion status - 0.0-1.0 + float completed; // Only the coarse steps are included here. The fine steps are not + /// Total coarse step count + int totalCoarse; + /// Current count of the coarse steps + int currentCoarse; + /// Overall count of the fine steps + int overallFine; // Increased on every DatabaseService::fineStep (not cleared). Means the overall step count that happened + + /// Recalculates the completed + void recalc() { + if (totalCoarse > 0) { + completed = static_cast<float>(currentCoarse) / static_cast<float>(totalCoarse); + } + } + + void reset() { + completed = 0; + totalCoarse = 0; + currentCoarse = 0; + overallFine = 0; + } + }; + + /** @brief Database service - service which handles dark database loading and saving + * Typically, a service wanting to handle database events will register as a listener, and handle the events given from this service. + * There are some rules: + * @li Mission loading will drop with DB_COMPLETE + * @li Savegame loading will have DB_SAVEGAME as dbtarget (so the services handling savegame related chunks will not process the mission's chunks) + */ + class OPDELIB_EXPORT DatabaseService : public Service, public PrioritizedMessageSource<DatabaseChangeMsg> { + public: + DatabaseService(ServiceManager *manager, const std::string& name); + virtual ~DatabaseService(); + + /// Loads a game database. Can be either savegame, or mission + void load(const std::string& filename); + + /// Loads a game system. drops all current data + void loadGameSys(const std::string& filename); + + /// Unload the game data. Release all the data that are connected to a game's mission in progress + void unload(); + + /// Listener that receives events every now and then while loading + typedef Callback<DatabaseProgressMsg> ProgressListener; + + /// Progress Listener shared_ptr + typedef shared_ptr<ProgressListener> ProgressListenerPtr; + + /// Setter for the progress listener. + void setProgressListener(const ProgressListenerPtr& listener) { mProgressListener = listener; }; + + /// Clears (unsets) the progress listener (disabling it) + void unsetProgressListener() { mProgressListener = NULL; }; + + /// A free to use fine step function that calls the Progress Listener to reflect the loading progress + /// Use this especially in some long-to load services + void fineStep(int count); + + protected: + virtual bool init(); + + /// Retrieve a readonly database file by it's name + FileGroupPtr getDBFileNamed(const std::string& filename); + + /// Load and assign a mission database to the db (has to be a SaveGame), then loads the gamesys for the loaded miss file + void _loadMissionDB(const FileGroupPtr& db); + + /// Load and assign a gamesys database to the db (has to be a mission or savegame) + void _loadGameSysDB(const FileGroupPtr& db); + + /// Overriden broadcast to support progress reports + virtual void broadcastMessage(const DatabaseChangeMsg& msg); + + FileGroupPtr mCurDB; + + /// Used to report to the Progress Listener + DatabaseProgressMsg mLoadingStatus; + + ProgressListenerPtr mProgressListener; + }; + + /// Shared pointer to game service + typedef shared_ptr<DatabaseService> DatabaseServicePtr; + + + /// Factory for the DatabaseService objects + class OPDELIB_EXPORT DatabaseServiceFactory : public ServiceFactory { + public: + DatabaseServiceFactory(); + ~DatabaseServiceFactory() {}; + + /** Creates a DatabaseService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + private: + static std::string mName; + }; +} + + +#endif Modified: trunk/src/services/inherit/InheritService.cpp =================================================================== --- trunk/src/services/inherit/InheritService.cpp 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/inherit/InheritService.cpp 2008-10-06 20:00:14 UTC (rev 862) @@ -37,27 +37,27 @@ /*--------------------- InheritQueries -------------------*/ /*--------------------------------------------------------*/ /// Just an empty result of a query - class EmptyInheritQueryResult : public InheritQueryResult { - public: - EmptyInheritQueryResult() : InheritQueryResult(), mNullPtr(NULL) { }; + class EmptyInheritQueryResult : public InheritQueryResult { + public: + EmptyInheritQueryResult() : InheritQueryResult(), mNullPtr(NULL) { }; - virtual const InheritLinkPtr& next() { return mNullPtr; }; + virtual const InheritLinkPtr& next() { return mNullPtr; }; - virtual bool end() const { - return true; - }; + virtual bool end() const { + return true; + }; protected: InheritLinkPtr mNullPtr; }; class SimpleInheritQueryResult : public InheritQueryResult { - public: - SimpleInheritQueryResult(const InheritService::InheritLinkMap& linkmap) : InheritQueryResult(), mLinkMap(linkmap) { - mIter = mLinkMap.begin(); - } + public: + SimpleInheritQueryResult(const InheritService::InheritLinkMap& linkmap) : InheritQueryResult(), mLinkMap(linkmap) { + mIter = mLinkMap.begin(); + } - virtual const InheritLinkPtr& next() { + virtual const InheritLinkPtr& next() { assert(!end()); const InheritLinkPtr& l = mIter->second; @@ -65,15 +65,15 @@ ++mIter; return l; - } + } - virtual bool end() const { - return (mIter == mLinkMap.end()); - } + virtual bool end() const { + return (mIter == mLinkMap.end()); + } - protected: - const InheritService::InheritLinkMap& mLinkMap; - InheritService::InheritLinkMap::const_iterator mIter; + protected: + const InheritService::InheritLinkMap& mLinkMap; + InheritService::InheritLinkMap::const_iterator mIter; }; @@ -85,47 +85,47 @@ Service(manager, name), mMetaPropListenerID(0), mMetaPropRelation() { - // Register some common factories. - // If a special factory would be needed, it has to be registered prior to it's usage, okay? - InheritorFactoryPtr if_cached = new CachedInheritorFactory(); - addInheritorFactory(if_cached); + // Register some common factories. + // If a special factory would be needed, it has to be registered prior to it's usage, okay? + InheritorFactoryPtr if_cached = new CachedInheritorFactory(); + addInheritorFactory(if_cached); - InheritorFactoryPtr if_never = new NeverInheritorFactory(); - addInheritorFactory(if_never); + InheritorFactoryPtr if_never = new NeverInheritorFactory(); + addInheritorFactory(if_never); - InheritorFactoryPtr if_arch = new ArchetypeInheritorFactory(); - addInheritorFactory(if_arch); + InheritorFactoryPtr if_arch = new ArchetypeInheritorFactory(); + addInheritorFactory(if_arch); } //------------------------------------------------------ InheritService::~InheritService() { - // It may so happen that the init() was not called... - if (!mMetaPropRelation.isNull()) - mMetaPropRelation->unregisterListener(mMetaPropListenerID); - + // It may so happen that the init() was not called... + if (!mMetaPropRelation.isNull()) + mMetaPropRelation->unregisterListener(mMetaPropListenerID); + mInheritors.clear(); // sufficient - the smart_ptrs will delete } - //------------------------------------------------------ - void InheritService::addInheritorFactory(const InheritorFactoryPtr& factory) { - mInheritorFactoryMap.insert(make_pair(factory->getName(), factory)); - } + //------------------------------------------------------ + void InheritService::addInheritorFactory(const InheritorFactoryPtr& factory) { + mInheritorFactoryMap.insert(make_pair(factory->getName(), factory)); + } - //------------------------------------------------------ - InheritorPtr InheritService::createInheritor(const std::string& name) { - InheritorFactoryMap::iterator it = mInheritorFactoryMap.find(name); + //------------------------------------------------------ + InheritorPtr InheritService::createInheritor(const std::string& name) { + InheritorFactoryMap::iterator it = mInheritorFactoryMap.find(name); - if (it != mInheritorFactoryMap.end()) { - InheritorPtr inh = it->second->createInstance(this); - mInheritors.push_back(inh); // no need map by name - return inh; - } else - OPDE_EXCEPT(string("No inheritor factory found for name : ") + name, "InheritService::createInheritor"); - } + if (it != mInheritorFactoryMap.end()) { + InheritorPtr inh = it->second->createInstance(this); + mInheritors.push_back(inh); // no need map by name + return inh; + } else + OPDE_EXCEPT(string("No inheritor factory found for name : ") + name, "InheritService::createInheritor"); + } //------------------------------------------------------ bool InheritService::init() { - // Link Service should have created us automatically through service masks. + // Link Service should have created us automatically through service masks. // So we can register as a link service listener mLinkService = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); @@ -133,117 +133,117 @@ LOG_FATAL("InheritService::init: LinkService does not exist?"); return false; } + + // create the builtin metaprop relation and it's storage... + DataStoragePtr stor = new UIntDataStorage(); + mMetaPropRelation = mLinkService->createRelation("MetaProp", stor, true); + // Could not be created? + if (mMetaPropRelation.isNull()) + OPDE_EXCEPT("MetaProp relation could not be created. Fatal.", "InheritService::init"); + return true; } - //------------------------------------------------------ - void InheritService::bootstrapFinished() { - // Link Service should have created us automatically through service masks. + //------------------------------------------------------ + void InheritService::bootstrapFinished() { + // Link Service should have created us automatically through service masks. // So we can register as a link service listener - LOG_INFO("InheritService::bootstrapFinished()"); + LOG_INFO("InheritService::bootstrapFinished()"); Relation::ListenerPtr metaPropCallback = new ClassCallback<LinkChangeMsg, InheritService>(this, &InheritService::onMetaPropMsg); // Get the LinkService, then the relation metaprop - // contact the config. service, and look for the inheritance link name - // create the builtin metaprop storage... - DataStoragePtr stor = new UIntDataStorage(); - mMetaPropRelation = mLinkService->createRelation("MetaProp", stor, true); - - if (mMetaPropRelation.isNull()) - OPDE_EXCEPT("MetaProp relation not found. Fatal.", "InheritService::init"); - mMetaPropListenerID = mMetaPropRelation->registerListener(metaPropCallback); - LOG_INFO("InheritService::bootstrapFinished() - done"); - } + LOG_INFO("InheritService::bootstrapFinished() - done"); + } //------------------------------------------------------ void InheritService::onMetaPropMsg(const LinkChangeMsg& msg) { - // If the message indicates reset of the database - if (msg.change == LNK_RELATION_CLEARED) { - clear(); // Will itself broadcast - return; - } + // If the message indicates reset of the database + if (msg.change == LNK_RELATION_CLEARED) { + clear(); // Will itself broadcast + return; + } // Read the link source, destination and priority // Get the priority of the link - unsigned int priority = 0; + unsigned int priority = 0; - if (msg.change != LNK_REMOVED) // Do not waste time if the link is removed - priority = mMetaPropRelation->getLinkField(msg.linkID, "").toUInt(); // Hardcoded! Could be parametrized + if (msg.change != LNK_REMOVED) // Do not waste time if the link is removed + priority = mMetaPropRelation->getLinkField(msg.linkID, "").toUInt(); // Hardcoded! Could be parametrized - // get the Link ref. - LinkPtr l = mMetaPropRelation->getLink(msg.linkID); + // get the Link ref. + LinkPtr l = mMetaPropRelation->getLink(msg.linkID); - InheritChangeMsg smsg; - smsg.srcID = l->dst(); // common - smsg.dstID = l->src(); + InheritChangeMsg smsg; + smsg.srcID = l->dst(); // common + smsg.dstID = l->src(); if (msg.change == LNK_ADDED) { - _addLink(l, priority); - // Insert into the maps - smsg.change = INH_ADDED; + _addLink(l, priority); + // Insert into the maps + smsg.change = INH_ADDED; - broadcastMessage(smsg); + broadcastMessage(smsg); } else if (msg.change == LNK_CHANGED) { - _changeLink(l, priority); - // Priority change happened - update - smsg.change = INH_CHANGED; - broadcastMessage(smsg); + _changeLink(l, priority); + // Priority change happened - update + smsg.change = INH_CHANGED; + broadcastMessage(smsg); } else if (msg.change == LNK_REMOVED) { - smsg.change = INH_REMOVED; - broadcastMessage(smsg); // Remove will broadcast prior to the removal + smsg.change = INH_REMOVED; + broadcastMessage(smsg); // Remove will broadcast prior to the removal - // Remove the link + // Remove the link _removeLink(l); } } - //------------------------------------------------------ - void InheritService::clear() { - // Step two. Broadcast the inheritance change - InheritChangeMsg smsg; - smsg.change = INH_CLEARED_ALL; - smsg.srcID = 0; // Some dummy values - smsg.dstID = 0; - broadcastMessage(smsg); + //------------------------------------------------------ + void InheritService::clear() { + // Step two. Broadcast the inheritance change + InheritChangeMsg smsg; + smsg.change = INH_CLEARED_ALL; + smsg.srcID = 0; // Some dummy values + smsg.dstID = 0; + broadcastMessage(smsg); - // Now clear - mInheritSources.clear(); - mInheritTargets.clear(); - } + // Now clear + mInheritSources.clear(); + mInheritTargets.clear(); + } - //------------------------------------------------------ - InheritQueryResultPtr InheritService::getSources(int objID) const { - InheritMap::const_iterator it = mInheritSources.find(objID); + //------------------------------------------------------ + InheritQueryResultPtr InheritService::getSources(int objID) const { + InheritMap::const_iterator it = mInheritSources.find(objID); - if (it != mInheritSources.end()) { - InheritQueryResultPtr res = new SimpleInheritQueryResult(it->second); - return res; - } else { - InheritQueryResultPtr res = new EmptyInheritQueryResult(); - return res; - } + if (it != mInheritSources.end()) { + InheritQueryResultPtr res = new SimpleInheritQueryResult(it->second); + return res; + } else { + InheritQueryResultPtr res = new EmptyInheritQueryResult(); + return res; + } - } + } - //------------------------------------------------------ + //------------------------------------------------------ InheritQueryResultPtr InheritService::getTargets(int objID) const { - InheritMap::const_iterator it = mInheritTargets.find(objID); + InheritMap::const_iterator it = mInheritTargets.find(objID); - if (it != mInheritTargets.end()) { - InheritQueryResultPtr res = new SimpleInheritQueryResult(it->second); - return res; - } else { - InheritQueryResultPtr res = new EmptyInheritQueryResult(); - return res; - } + if (it != mInheritTargets.end()) { + InheritQueryResultPtr res = new SimpleInheritQueryResult(it->second); + return res; + } else { + InheritQueryResultPtr res = new EmptyInheritQueryResult(); + return res; + } } //------------------------------------------------------ @@ -270,7 +270,7 @@ } } - return 0; + return 0; } //------------------------------------------------------ @@ -287,11 +287,11 @@ // see if we can have some greater one InheritMap::iterator it = mInheritSources.find(objID); - if (it != mInheritSources.end()) { - // object seems to have some MP links - // search for the max mp priority - - InheritLinkMap::iterator it2 = it->second.begin(); + if (it != mInheritSources.end()) { + // object seems to have some MP links + // search for the max mp priority + + InheritLinkMap::iterator it2 = it->second.begin(); while (it2 != it->second.end()) { int actPrio = it2->second->priority; @@ -299,10 +299,10 @@ mpPrio = actPrio + 8; // next free. MP priorities are stepped by 8 } } - } - - // whe have our priority. Let's create a new MP link! - _createMPLink(objID, mpID, mpPrio); + } + + // whe have our priority. Let's create a new MP link! + _createMPLink(objID, mpID, mpPrio); } //------------------------------------------------------ @@ -333,93 +333,93 @@ return inheritsFrom(objID, mpID); } - //------------------------------------------------------ + //------------------------------------------------------ bool InheritService::inheritsFrom(int objID, int srcID) const { InheritMap::const_iterator it = mInheritSources.find(objID); - if (it != mInheritSources.end()) { - // object seems to have some links - InheritLinkMap::const_iterator it2 = it->second.find(srcID); - - if (it2 != it->second.end()) + if (it != mInheritSources.end()) { + // object seems to have some links + InheritLinkMap::const_iterator it2 = it->second.find(srcID); + + if (it2 != it->second.end()) return true; - } - - return false; + } + + return false; } - //------------------------------------------------------ - void InheritService::_addLink(const LinkPtr& link, unsigned int priority) { - // It works like this. link.src() is the target for inheritance, link.dst() is the source for inheritance - InheritLinkPtr ilp = new InheritLink; + //------------------------------------------------------ + void InheritService::_addLink(const LinkPtr& link, unsigned int priority) { + // It works like this. link.src() is the target for inheritance, link.dst() is the source for inheritance + InheritLinkPtr ilp = new InheritLink; - // we've got the link reverse. MetaProp has src the target for inh, and dst the parent. - ilp->srcID = link->dst(); - ilp->dstID = link->src(); - ilp->priority = priority; + // we've got the link reverse. MetaProp has src the target for inh, and dst the parent. + ilp->srcID = link->dst(); + ilp->dstID = link->src(); + ilp->priority = priority; - pair<InheritMap::iterator, bool> r = mInheritSources.insert(make_pair(ilp->dstID, InheritLinkMap())); + pair<InheritMap::iterator, bool> r = mInheritSources.insert(make_pair(ilp->dstID, InheritLinkMap())); - // now insert for the link.src, with the InheritLinkPtr struct - pair<InheritLinkMap::iterator, bool> ri = r.first->second.insert(make_pair(ilp->srcID, ilp)); + // now insert for the link.src, with the InheritLinkPtr struct + pair<InheritLinkMap::iterator, bool> ri = r.first->second.insert(make_pair(ilp->srcID, ilp)); - if (!ri.second) - OPDE_EXCEPT("Multiple inheritance for the same src/dst pair is not allowed!", "InheritService::_addLink"); + if (!ri.second) + OPDE_EXCEPT("Multiple inheritance for the same src/dst pair is not allowed!", "InheritService::_addLink"); - // Repeat for the mInheritTarget's + // Repeat for the mInheritTarget's - r = mInheritTargets.insert(make_pair(ilp->srcID, InheritLinkMap())); + r = mInheritTargets.insert(make_pair(ilp->srcID, InheritLinkMap())); - ri = r.first->second.insert(make_pair(ilp->dstID, ilp)); + ri = r.first->second.insert(make_pair(ilp->dstID, ilp)); - if (!ri.second) - OPDE_EXCEPT("Multiple inheritance for the same src/dst pair is not allowed!", "InheritService::_addLink"); - } + if (!ri.second) + OPDE_EXCEPT("Multiple inheritance for the same src/dst pair is not allowed!", "InheritService::_addLink"); + } - //------------------------------------------------------ - void InheritService::_changeLink(const LinkPtr& link, unsigned int priority) { - // Modify priority of the link - InheritMap::iterator it = mInheritSources.find(link->dst()); + //------------------------------------------------------ + void InheritService::_changeLink(const LinkPtr& link, unsigned int priority) { + // Modify priority of the link + InheritMap::iterator it = mInheritSources.find(link->dst()); - if (it != mInheritSources.end()) { - // now insert for the link.src, with the InheritLinkPtr struct - InheritLinkMap::iterator it2 = it->second.find(link->src()); + if (it != mInheritSources.end()) { + // now insert for the link.src, with the InheritLinkPtr struct + InheritLinkMap::iterator it2 = it->second.find(link->src()); - it2->second->priority = priority; - } else - OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); - } + it2->second->priority = priority; + } else + OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); + } - //------------------------------------------------------ - void InheritService::_removeLink(const LinkPtr& link) { - InheritMap::iterator it = mInheritSources.find(link->dst()); + //------------------------------------------------------ + void InheritService::_removeLink(const LinkPtr& link) { + InheritMap::iterator it = mInheritSources.find(link->dst()); - if (it != mInheritSources.end()) { - // now insert for the link.src, with the InheritLinkPtr struct - InheritLinkMap::iterator it2 = it->second.find(link->src()); + if (it != mInheritSources.end()) { + // now insert for the link.src, with the InheritLinkPtr struct + InheritLinkMap::iterator it2 = it->second.find(link->src()); - if (it2 != it->second.end()) - it->second.erase(it2); - else - OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); - } else - OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); + if (it2 != it->second.end()) + it->second.erase(it2); + else + OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); + } else + OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); - // Same again, for the targets - it = mInheritTargets.find(link->src()); - if (it != mInheritTargets.end()) { - // now insert for the link.src, with the InheritLinkPtr struct - InheritLinkMap::iterator it2 = it->second.find(link->dst()); + // Same again, for the targets + it = mInheritTargets.find(link->src()); + if (it != mInheritTargets.end()) { + // now insert for the link.src, with the InheritLinkPtr struct + InheritLinkMap::iterator it2 = it->second.find(link->dst()); - if (it2 != it->second.end()) - it->second.erase(it2); - else - OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); - } else - OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); - } + if (it2 != it->second.end()) + it->second.erase(it2); + else + OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); + } else + OPDE_EXCEPT("Could not find the link to change the priority for", "InheritService::_changeLink"); + } - //------------------------------------------------------ + //------------------------------------------------------ void InheritService::_createMPLink(int objID, int srcID, int priority) { // Create a new link, that will do all the work... // TODO: This should be made possible in a single go Modified: trunk/src/services/inherit/InheritService.h =================================================================== --- trunk/src/services/inherit/InheritService.h 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/inherit/InheritService.h 2008-10-06 20:00:14 UTC (rev 862) @@ -1,210 +1,211 @@ -/****************************************************************************** - * - * 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 __INHERITSERVICE_H -#define __INHERITSERVICE_H - -#include "config.h" - -#include "OpdeServiceManager.h" -#include "OpdeService.h" -#include "SharedPtr.h" -#include "InheritCommon.h" -#include "Iterator.h" - -namespace Opde { - - typedef struct InheritLink { - /// Source object ID - int srcID; - /// Source object ID - int dstID; - /// The priority of this inheritance definition (It's int to help comparison with negative values) - int priority; - }; - - typedef std::vector< InheritLink > InheritLinkList; - - typedef shared_ptr< InheritLink > InheritLinkPtr; - - /** Inheritance query result. Put like this for effectiveness */ - typedef ConstIterator< InheritLinkPtr > InheritQueryResult; - - /// Shared pointer to InheritQuery - typedef shared_ptr< InheritQueryResult > InheritQueryResultPtr; - - /** Inherit Service - service managing object inheritance and metaproperties. - * This service is responsible for Inheritor management. Inheritors are classes that are used to track inheritance of certain qualities of an object (be it abstract or concrete). - * An example usage of Inheritor is property inheritance. Properties internally use the inheritors to transparently return values not directly assigned to the object ID, but rather inherited from the Effective object. - * Effective object is the carrier of the effective value - the value that has the maximal priority. - * */ - class OPDELIB_EXPORT InheritService : public Service, public MessageSource<InheritChangeMsg> { - public: - /// Constructor - InheritService(ServiceManager *manager, const std::string& name); - - /// Destructor - virtual ~InheritService(); - - - /** Registers an inheritor factory */ - void addInheritorFactory(const InheritorFactoryPtr& factory); - - /** Creates an inheritor instance, given the inheritor name - * @return Inheritor pointer on success - * @throw BasicException if the inheritor name was not found in factories */ - InheritorPtr createInheritor(const std::string& name); - - /** Requests all sources for inheritance for the given object ID - * @param objID the object id to get the Sources for */ - InheritQueryResultPtr getSources(int objID) const; - - /** Requests all inheritance targets for given object ID - * @param objID the id of the object to get inheritance targets for - * */ - InheritQueryResultPtr getTargets(int objID) const; - - /** Sets an archetype for given object (MP link with priority 0) - * @param objID the target object to set archetype for - * @param archetypeID the id of the archetype object to link to - * @note This should be only done on object creation. The method checks if the object has archetype already set and excepts if so - */ - void setArchetype(int objID, int archetypeID); - - /** Returns the archetype ID for the given object, or 0 if the object has no archetype */ - int getArchetype(int objID) const; - - /** Adds a new mp link that causes the object to inherit from a metaproperty object. - * Will use the first free priority possible. - * @param objID the object id to add MP to - * @param mpID the ID of the metaproperty to add */ - void addMetaProperty(int objID, int mpID); - - /** Removes a metaproperty from an object. - * @param objID the object id to remove the MP from - * @param mpID the ID of the metaproperty to remove */ - void removeMetaProperty(int objID, int mpID); - - /** Tester for object's inclusion of certain MP. - * @param objID the object id to remove the MP from - * @param mpID the ID of the metaproperty to remove - * @return true if the object inherits from the given mpID with priority > 0 (==0 is Archetype inheritance!), false otherwise - */ - bool hasMetaProperty(int objID, int mpID) const; - - - /** A tester for object inheritance. Returns true if the given object inherits, in any way, from the given source. - * @param objID the object ID to look for - * @param srcID the source object ID to test for inheritance on the objID - * @return true if the objID inherits from srcID, false otherwise - */ - bool inheritsFrom(int objID, int srcID) const; - - /// Clears out the inheritance map (leaves the other things intact) - void clear(); - - /// Map of object (src/dst) to inherit link - typedef std::map< int, InheritLinkPtr > InheritLinkMap; - - /// Map of the effective object ID's - typedef std::map< int, InheritLinkMap > InheritMap; - - private: - /// Service initialization - @see Service::init() - virtual bool init(); - - /// Service bootstraping ended - @see Service::bootstrapFinished() - virtual void bootstrapFinished(); - - /** Adds an inheritance link. - * @param link The link to be added as InheritLink - * @param priority The priority of the link to be added */ - void _addLink(const LinkPtr& link, unsigned int priority); - - /** Modifies the inheritance link priority - * @param link The link to be modified - * @param priority The priority of the link to be modified to */ - void _changeLink(const LinkPtr& link, unsigned int priority); - - /** Removes the given inheritance link */ - void _removeLink(const LinkPtr& link); - - /// Listener for the metaprop - void onMetaPropMsg(const LinkChangeMsg& msg); - - /// Creates a new metaproperty link with the specified priority - void _createMPLink(int objID, int srcID, int priority); - - /// Inheritance sources - InheritMap mInheritSources; - - /// Inheritance destinations - InheritMap mInheritTargets; - - /// Map of named inheritor factories - typedef std::map< std::string, InheritorFactoryPtr > InheritorFactoryMap; - - /// Map of inheritor factories - InheritorFactoryMap mInheritorFactoryMap; - - /// Link (Relation metaproperty) listener registration ID - Relation::ListenerID mMetaPropListenerID; - - /// Handle to the link service - LinkServicePtr mLinkService; - - /// Direct link to the metaprop relation - RelationPtr mMetaPropRelation; - - /// List of instanced inheritors - typedef std::vector< InheritorPtr > InheritorList; - - /// All instanced inheritors are here - InheritorList mInheritors; - }; - - /// Shared pointer to Link service - typedef shared_ptr< InheritService > InheritServicePtr; - - /// Factory for the LinkService objects - class OPDELIB_EXPORT InheritServiceFactory : public ServiceFactory { - public: - InheritServiceFactory(); - ~InheritServiceFactory() {}; - - /** Creates a LinkService instance */ - Service* createInstance(ServiceManager* manager); - - virtual const std::string& getName(); - - virtual const uint getMask(); - - private: - static std::string mName; - }; -} - - -#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 __INHERITSERVICE_H +#define __INHERITSERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "SharedPtr.h" +#include "InheritCommon.h" +#include "Iterator.h" + +namespace Opde { + + typedef struct InheritLink { + /// Source object ID + int srcID; + /// Source object ID + int dstID; + /// The priority of this inheritance definition (It's int to help comparison with negative values) + int priority; + }; + + typedef std::vector< InheritLink > InheritLinkList; + + typedef shared_ptr< InheritLink > InheritLinkPtr; + + /** Inheritance query result. Put like this for effectiveness */ + typedef ConstIterator< InheritLinkPtr > InheritQueryResult; + + /// Shared pointer to InheritQuery + typedef shared_ptr< InheritQueryResult > InheritQueryResultPtr; + + /** Inherit Service - service managing object inheritance and metaproperties. + * This service is responsible for Inheritor management. Inheritors are classes that are used to track inheritance of certain qualities of an object (be it abstract or concrete). + * An example usage of Inheritor is property inheritance. Properties internally use the inheritors to transparently return values not directly assigned to the object ID, but rather inherited from the Effective object. + * Effective object is the carrier of the effective value - the value that has the maximal priority. + * @note This class creates and uses the Metaproperty link, which is built-in + * */ + class OPDELIB_EXPORT InheritService : public Service, public MessageSource<InheritChangeMsg> { + public: + /// Constructor + InheritService(ServiceManager *manager, const std::string& name); + + /// Destructor + virtual ~InheritService(); + + + /** Registers an inheritor factory */ + void addInheritorFactory(const InheritorFactoryPtr& factory); + + /** Creates an inheritor instance, given the inheritor name + * @return Inheritor pointer on success + * @throw BasicException if the inheritor name was not found in factories */ + InheritorPtr createInheritor(const std::string& name); + + /** Requests all sources for inheritance for the given object ID + * @param objID the object id to get the Sources for */ + InheritQueryResultPtr getSources(int objID) const; + + /** Requests all inheritance targets for given object ID + * @param objID the id of the object to get inheritance targets for + * */ + InheritQueryResultPtr getTargets(int objID) const; + + /** Sets an archetype for given object (MP link with priority 0) + * @param objID the target object to set archetype for + * @param archetypeID the id of the archetype object to link to + * @note This should be only done on object creation. The method checks if the object has archetype already set and excepts if so + */ + void setArchetype(int objID, int archetypeID); + + /** Returns the archetype ID for the given object, or 0 if the object has no archetype */ + int getArchetype(int objID) const; + + /** Adds a new mp link that causes the object to inherit from a metaproperty object. + * Will use the first free priority possible. + * @param objID the object id to add MP to + * @param mpID the ID of the metaproperty to add */ + void addMetaProperty(int objID, int mpID); + + /** Removes a metaproperty from an object. + * @param objID the object id to remove the MP from + * @param mpID the ID of the metaproperty to remove */ + void removeMetaProperty(int objID, int mpID); + + /** Tester for object's inclusion of certain MP. + * @param objID the object id to remove the MP from + * @param mpID the ID of the metaproperty to remove + * @return true if the object inherits from the given mpID with priority > 0 (==0 is Archetype inheritance!), false otherwise + */ + bool hasMetaProperty(int objID, int mpID) const; + + + /** A tester for object inheritance. Returns true if the given object inherits, in any way, from the given source. + * @param objID the object ID to look for + * @param srcID the source object ID to test for inheritance on the objID + * @return true if the objID inherits from srcID, false otherwise + */ + bool inheritsFrom(int objID, int srcID) const; + + /// Clears out the inheritance map (leaves the other things intact) + void clear(); + + /// Map of object (src/dst) to inherit link + typedef std::map< int, InheritLinkPtr > InheritLinkMap; + + /// Map of the effective object ID's + typedef std::map< int, InheritLinkMap > InheritMap; + + private: + /// Service initialization - @see Service::init() + virtual bool init(); + + /// Service bootstraping ended - @see Service::bootstrapFinished() + virtual void bootstrapFinished(); + + /** Adds an inheritance link. + * @param link The link to be added as InheritLink + * @param priority The priority of the link to be added */ + void _addLink(const LinkPtr& link, unsigned int priority); + + /** Modifies the inheritance link priority + * @param link The link to be modified + * @param priority The priority of the link to be modified to */ + void _changeLink(const LinkPtr& link, unsigned int priority); + + /** Removes the given inheritance link */ + void _removeLink(const LinkPtr& link); + + /// Listener for the metaprop + void onMetaPropMsg(const LinkChangeMsg& msg); + + /// Creates a new metaproperty link with the specified priority + void _createMPLink(int objID, int srcID, int priority); + + /// Inheritance sources + InheritMap mInheritSources; + + /// Inheritance destinations + InheritMap mInheritTargets; + + /// Map of named inheritor factories + typedef std::map< std::string, InheritorFactoryPtr > InheritorFactoryMap; + + /// Map of inheritor factories + InheritorFactoryMap mInheritorFactoryMap; + + /// Link (Relation metaproperty) listener registration ID + Relation::ListenerID mMetaPropListenerID; + + /// Handle to the link service + LinkServicePtr mLinkService; + + /// Direct link to the metaprop relation + RelationPtr mMetaPropRelation; + + /// List of instanced inheritors + typedef std::vector< InheritorPtr > InheritorList; + + /// All instanced inheritors are here + InheritorList mInheritors; + }; + + /// Shared pointer to Link service + typedef shared_ptr< InheritService > InheritServicePtr; + + /// Factory for the LinkService objects + class OPDELIB_EXPORT InheritServiceFactory : public ServiceFactory { + public: + InheritServiceFactory(); + ~InheritServiceFactory() {}; + + /** Creates a LinkService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + + private: + static std::string mName; + }; +} + + +#endif Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/object/ObjectService.cpp 2008-10-06 20:00:14 UTC (rev 862) @@ -220,7 +220,9 @@ // DonorType property (single integer property): // mPropertyService->createPropertyGroup(); - + // create the builtin DonorType property + DataStoragePtr stor = new IntDataStorage(); + mPropDonorType = mPropertyService->createPropertyGroup("DonorType", "DonorType", "never", stor); } //------------------------------------------------------ @@ -448,7 +450,7 @@ for (int id = mAllocatedObjects.getMinIndex(); id < mAllocatedObjects.getMaxIndex(); ++id) { DVariant v; - if (mAllocatedObjects.get(id)) { + if (mAllocatedObjects.get(id)) { // only gamesys object have donortype... if (!mPropertyService->has(id, "DonorType")) { if (saveMask & 0x01) // has donortype, was archetype requested? objmask.set(id, true); // yep, so include this object Modified: trunk/src/services/object/ObjectService.h =================================================================== --- trunk/src/services/object/ObjectService.h 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/object/ObjectService.h 2008-10-06 20:00:14 UTC (rev 862) @@ -236,6 +236,8 @@ /// Symbolic name property pointer PropertyGroup* mPropSymName; + /// Donor type property pointer + PropertyGroup* mPropDonorType; /// Scene manager pointer Ogre::SceneManager* mSceneMgr; Modified: trunk/src/services/property/PropertyService.cpp =================================================================== --- trunk/src/services/property/PropertyService.cpp 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/property/PropertyService.cpp 2008-10-06 20:00:14 UTC (rev 862) @@ -71,13 +71,13 @@ // -------------------------------------------------------------------------- PropertyService::~PropertyService() { - PropertyList::iterator it = mPropertiesToDelete.begin(); + PropertyList::iterator it = mOwnedProperties.begin(); - for( ; it != mPropertiesToDelete.end(); ++it) { + for( ; it != mOwnedProperties.end(); ++it) { delete *it; } - mPropertiesToDelete.clear(); + mOwnedProperties.clear(); mPropertyGroupMap.clear(); } @@ -91,7 +91,7 @@ } // -------------------------------------------------------------------------- - PropertyGroup* PropertyService::createPropertyGroup(const std::string& name, const std::string& chunkName, std::string inheritorName, const DataStoragePtr& storage, bool takeover) { + PropertyGroup* PropertyService::createPropertyGroup(const std::string& name, const std::string& chunkName, std::string inheritorName, const DataStoragePtr& storage) { PropertyGroup* nr; try { nr = new PropertyGroup(this, name, chunkName, storage, inheritorName); @@ -109,7 +109,7 @@ } // insert the pointer into the to be freed list - mPropertiesToDelete.push_back(nr); + mOwnedProperties.push_back(nr); LOG_INFO("PropertyService::createPropertyGroup: Created a property group %s (With chunk name %s)", name.c_str(), chunkName.c_str()); Modified: trunk/src/services/property/PropertyService.h =================================================================== --- trunk/src/services/property/PropertyService.h 2008-10-06 19:57:35 UTC (rev 861) +++ trunk/src/services/property/PropertyService.h 2008-10-06 20:00:14 UTC (rev 862) @@ -1,161 +1,161 @@ -/****************************************************************************** - * - * 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 - * - *****************************************************************************/ - - -#ifndef __PROPERTYSERVICE_H -#define __PROPERTYSERVICE_H - -#include "config.h" - -#include "PropertyCommon.h" -#include "PropertyGroup.h" -#include "OpdeServiceManager.h" -#include "OpdeService.h" -#include "FileGroup.h" -#include "SharedPtr.h" -#include "MessageSource.h" - -namespace Opde { - /** @brief Property service - service managing in-game object properties - */ - class OPDELIB_EXPORT PropertyService : public Service { - public: - PropertyService(ServiceManager *manager, const std::string& name); - virtual ~PropertyService(); - - /** Creates a standard (data-holding onlu) property group using the specified property storage. This method should only be used for data processing applications. - * @param name The name of the property group - * @param chunkName The name of the chunk the property is stored in - * @param inheritorName The name of the iheritor to use for the property (the published name of the inheritor factory) - * @param storage The property storage to be used for the property data. Caller is responsible for the storage destruction, unless takeover is set to true - * @param takeover If true, the storage's ownership will be taken over, meaning the storage will be destroyed upon destruction of the property group (or when construction fails) - * @see PropertyGroup::PropertyGroup - */ - PropertyGroup* createPropertyGroup(const std::string& name, const std::string& chunkName, std::string inheritorName, const DataStoragePtr& storage, bool takeover = 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 + * + *****************************************************************************/ + +#ifndef __PROPERTYSERVICE_H +#define __PROPERTYSERVICE_H + +#include "config.h" + +#include "PropertyCommon.h" +#include "PropertyGroup.h" +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "FileGroup.h" +#include "SharedPtr.h" +#include "MessageSource.h" + +namespace Opde { + /** @brief Property service - service managing in-game object properties + */ + class OPDELIB_EXPORT PropertyService : public Service { + public: + PropertyService(ServiceManager *manager, const std::string& name); + virtual ~PropertyService(); + + /** Creates a standard (data-holding only) property group using the specified property storage. This method should only be used for data processing applications. + * @param name The name of the property group + * @param chunkName The name of the chunk the property is stored in + * @param inheritorName The name of the iheritor to use for the property (the published name of the inheritor factory) + * @param storage The property storage to be ... [truncated message content] |
From: <vo...@us...> - 2008-11-02 08:45:22
|
Revision: 949 http://opde.svn.sourceforge.net/opde/?rev=949&view=rev Author: volca Date: 2008-11-02 08:45:18 +0000 (Sun, 02 Nov 2008) Log Message: ----------- Fixing some fragility which caused problems in Christines Ponterbee medsci1.mis mission Modified Paths: -------------- trunk/src/services/link/LinkService.cpp trunk/src/services/link/LinkService.h trunk/src/services/link/Relation.cpp trunk/src/services/link/Relation.h trunk/src/services/object/ObjectService.cpp trunk/src/services/property/PropertyGroup.cpp trunk/src/services/render/RenderService.cpp Modified: trunk/src/services/link/LinkService.cpp =================================================================== --- trunk/src/services/link/LinkService.cpp 2008-11-01 16:02:00 UTC (rev 948) +++ trunk/src/services/link/LinkService.cpp 2008-11-02 08:45:18 UTC (rev 949) @@ -89,7 +89,7 @@ } //------------------------------------------------------ - void LinkService::load(const FileGroupPtr& db) { + void LinkService::load(const FileGroupPtr& db, const BitArray& objMask) { LOG_INFO("LinkService: Loading link definitions from file group '%s'", db->getName().c_str()); // First, try to build the Relation Name -> flavor and reverse records @@ -153,7 +153,7 @@ LOG_DEBUG("Loading relation %s", text); try { - rel->load(db); // only normal relation is loaded. Inverse is mapped automatically + rel->load(db, objMask); // only normal relation is loaded. Inverse is mapped automatically } catch (BasicException &e) { LOG_FATAL("LinkService: Caught a fatal exception while loading Relation %s : %s", text, e.getDetails().c_str() ); } Modified: trunk/src/services/link/LinkService.h =================================================================== --- trunk/src/services/link/LinkService.h 2008-11-01 16:02:00 UTC (rev 948) +++ trunk/src/services/link/LinkService.h 2008-11-02 08:45:18 UTC (rev 949) @@ -32,6 +32,7 @@ #include "LinkCommon.h" #include "Relation.h" #include "SharedPtr.h" +#include "BitArray.h" namespace Opde { @@ -86,8 +87,10 @@ */ void objectDestroyed(int id); - /** load links from a single database */ - void load(const FileGroupPtr& db); + /** load links from a single database + * @param db The database to load from + * @param objMask the mask of object id's to allow - both src and dst objects have to be here, otherwise link gets ignored */ + void load(const FileGroupPtr& db, const BitArray& objMask); /** Saves the links and link data according to the saveMask */ void save(const FileGroupPtr& db, uint saveMask); Modified: trunk/src/services/link/Relation.cpp =================================================================== --- trunk/src/services/link/Relation.cpp 2008-11-01 16:02:00 UTC (rev 948) +++ trunk/src/services/link/Relation.cpp 2008-11-02 08:45:18 UTC (rev 949) @@ -110,7 +110,7 @@ } // -------------------------------------------------------------------------- - void Relation::load(const FileGroupPtr& db) { + void Relation::load(const FileGroupPtr& db, const BitArray& objMask) { assert(!mIsInverse); // load the links and thei're data @@ -223,13 +223,28 @@ // Check if the flavor fits assert(LINK_ID_FLAVOR(link->mID) == mID); - // Add link, notify listeners... Will search for data and throw if did not find them - _addLink(link); - - // Inverse relation will get an inverse link to use - LinkPtr ilink = createInverseLink(link); - - mInverse->_addLink(ilink); + // Look if we fit into the mask + if (objMask[link->mSrc] && objMask[link->mDst]) { + // Add link, notify listeners... Will search for data and throw if did not find them + _addLink(link); + + // Inverse relation will get an inverse link to use + LinkPtr ilink = createInverseLink(link); + + mInverse->_addLink(ilink); + } else { + // the mask says no to the link! + LOG_ERROR("Relation (%s - %d): Link (ID %d, %d to %d) thrown away - obj IDs invalid", + mName.c_str(), + mID, + link->mID, + link->mSrc, + link->mDst); + + // delete the data as well... + if (!mStorage.isNull()) + mStorage->destroy(link->mID); + } } LOG_DEBUG("Relation (%s - %d): Done!", Modified: trunk/src/services/link/Relation.h =================================================================== --- trunk/src/services/link/Relation.h 2008-11-01 16:02:00 UTC (rev 948) +++ trunk/src/services/link/Relation.h 2008-11-02 08:45:18 UTC (rev 949) @@ -1,247 +1,251 @@ -/****************************************************************************** - * - * 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 - * - *****************************************************************************/ - - -#ifndef __RELATION_H -#define __RELATION_H - -#include "config.h" - -#include <string> -#include "NonCopyable.h" +/****************************************************************************** + * + * 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 + * + *****************************************************************************/ + + +#ifndef __RELATION_H +#define __RELATION_H + +#include "config.h" + +#include <string> +#include "NonCopyable.h" #include "DTypeDef.h" -#include "DataStorage.h" -#include "LinkCommon.h" -#include "FileGroup.h" -#include "MessageSource.h" - -namespace Opde { - /** @brief Relation. A store of a group of links of the same flavor. - */ - class OPDELIB_EXPORT Relation : public NonCopyable, public MessageSource<LinkChangeMsg> { - public: - Relation(const std::string& name, const DataStoragePtr& stor, bool isInverse, bool hidden = false); - virtual ~Relation(); - - /** Loads the relation data from the given FileGroup */ - void load(const FileGroupPtr& db); - - /** Saves the relation data to the fiven file group - * @todo Save Mask implementation */ - void save(const FileGroupPtr& db, uint saveMask); +#include "DataStorage.h" +#include "LinkCommon.h" +#include "FileGroup.h" +#include "MessageSource.h" +#include "BitArray.h" - /// Sets the versions of the chunks this relation uses for storage - void setChunkVersions(uint lmajor, uint lminor, uint dmajor, uint dminor) { - mLCVMaj = lmajor; - mLCVMin = lminor; - mDCVMaj = dmajor; - mDCVMin = dminor; - } - - /// Inverse relation getter. Will return a relation with the links going in opposite direction - Relation* inverse(); - - bool isInverse() { return mIsInverse; }; - - /// Sets a inverse relation to this relation. Can only be done once. - void setInverseRelation(Relation* rel); - - /** Clears out all the links, releses data, clears query caches */ - void clear(); - - /** Sets the ID (flavor) of this Relation. Must be done prior to any operation with the relation instance */ - inline void setID(int id) { mID = id; }; - - /** Returns the ID (flavor) of this relation. */ - inline int getID() { return mID; } - - /** Sets a fake size of the link data structure (some relation do not store a real size, but a fake one) */ - void setFakeSize(int size) { assert(size>0); mFakeSize = size; }; - - /** @return the name of this relation */ - const std::string& getName() { return mName; }; - - // ----------------- Link management methods -------------------- - /** Deletes a link specified by it's ID - * @param id The ID of the link that should be deleted - * @note Broadcasts the link removal message (LNK_REMOVED) */ - void remove(link_id_t id); - - /** Creates a new link, returning it's ID - * @param from The source object ID of this link - * @param to The destination obect ID of this link - * @note This version of createLink does initialize the Link data with zero values, if the DTypeDefPtr.isNull() is not true. This is not always the requested bahavior. Use create(int,int,char*) to create a link with already preset data - * @return the id of the newly created link (The concreteness of the link is autodetected given the from and to values (both < 0 - non concrete, otherwise concrete)) - * @note Broadcasts the link creation message - * @todo Some relations could be limited to one link between obect pair(!). This could be - */ - link_id_t create(int from, int to); - - /** Sets the link data field - * @param id The link id - * @param field The name of the field the modification is requested on - * @param DVariant The new value of the field - * @return true if successful, false otherwise - */ - bool setLinkField(link_id_t id, const std::string& field, const DVariant& value); - - /** Gets the link data field value - * @param id The link id +namespace Opde { + /** @brief Relation. A store of a group of links of the same flavor. + */ + class OPDELIB_EXPORT Relation : public NonCopyable, public MessageSource<LinkChangeMsg> { + public: + Relation(const std::string& name, const DataStoragePtr& stor, bool isInverse, bool hidden = false); + virtual ~Relation(); + + /** Loads the relation data from the given FileGroup + * @param db The database that the links are read from + * @param objMask the mask that limits the loaded objects (invalid ones are thrown away) + */ + void load(const FileGroupPtr& db, const BitArray& objMask); + + /** Saves the relation data to the fiven file group + * @todo Save Mask implementation */ + void save(const FileGroupPtr& db, uint saveMask); + + /// Sets the versions of the chunks this relation uses for storage + void setChunkVersions(uint lmajor, uint lminor, uint dmajor, uint dminor) { + mLCVMaj = lmajor; + mLCVMin = lminor; + mDCVMaj = dmajor; + mDCVMin = dminor; + } + + /// Inverse relation getter. Will return a relation with the links going in opposite direction + Relation* inverse(); + + bool isInverse() { return mIsInverse; }; + + /// Sets a inverse relation to this relation. Can only be done once. + void setInverseRelation(Relation* rel); + + /** Clears out all the links, releses data, clears query caches */ + void clear(); + + /** Sets the ID (flavor) of this Relation. Must be done prior to any operation with the relation instance */ + inline void setID(int id) { mID = id; }; + + /** Returns the ID (flavor) of this relation. */ + inline int getID() { return mID; } + + /** Sets a fake size of the link data structure (some relation do not store a real size, but a fake one) */ + void setFakeSize(int size) { assert(size>0); mFakeSize = size; }; + + /** @return the name of this relation */ + const std::string& getName() { return mName; }; + + // ----------------- Link management methods -------------------- + /** Deletes a link specified by it's ID + * @param id The ID of the link that should be deleted + * @note Broadcasts the link removal message (LNK_REMOVED) */ + void remove(link_id_t id); + + /** Creates a new link, returning it's ID + * @param from The source object ID of this link + * @param to The destination obect ID of this link + * @note This version of createLink does initialize the Link data with zero values, if the DTypeDefPtr.isNull() is not true. This is not always the requested bahavior. Use create(int,int,char*) to create a link with already preset data + * @return the id of the newly created link (The concreteness of the link is autodetected given the from and to values (both < 0 - non concrete, otherwise concrete)) + * @note Broadcasts the link creation message + * @todo Some relations could be limited to one link between obect pair(!). This could be + */ + link_id_t create(int from, int to); + + /** Sets the link data field + * @param id The link id * @param field The name of the field the modification is requested on - */ - DVariant getLinkField(link_id_t id, const std::string& field); - - - // ----------------- Link query methods -------------------- - /** Gets all links that come from source to destination - * @param src Source object ID - * @param dst Destination object ID or 0 if any destination - * @return LinkQueryResultPtr filled with the query result */ - LinkQueryResultPtr getAllLinks(int src, int dst) const; - - /** Gets single link ID that is coming from source to destination - * @param src Source object ID, or 0 if any source - * @param dst Destination object ID or 0 if any destination - * @return LinkPtr link instance that fulfills the requirements - * @note only one of the parameters can be zero - * @throws BasicException if there was more than one link that could be returned - */ - LinkPtr getOneLink(int src, int dst) const; - - /** Gets single link given the link ID - * @param id The link's ID - * @return LinkPtr link instance that fulfills the requirements, or NULL - */ - LinkPtr getLink(link_id_t id) const; - - /** Removes all links that connected to a given object ID - * @param id the object id to remove all links from - */ - void objectDestroyed(int id); - - /** Sets the relation to cache link data (caches fields so no direct to/from data will be used on loading) - * @param cache if true, writes will set a the value in a cache as well, and reads will search cache first - */ - void setCacheData(bool cache) { mUseDataCache = cache; }; - - /** @return true if cache for data is used, false otherwise */ - bool getCacheData() { return mUseDataCache; }; - - protected: - class MultiTargetLinkQueryResult; - - /** Internal method for link insertion. Inserts the link to the map, notifies listeners and query databases - * @param newlnk The link to be inserted - * @note Always use this method to internally insert new links, if not in a situation when the standard sequence of link addition is needed (notification, query database refresh) - * @note The link data have to be assigned prior to calling this method - */ - void _addLink(const LinkPtr& newlnk); - - /** Internal method for link removal handling. Notifies the listeners, refreshes query databases. - * @param id The id of the link to be removed - * @note Also removes the link data - */ - void _removeLink(link_id_t id); - - /** Returns the id that can be used to create a link (a free ID that is). - * @param cidx Concreteness index of the requested link (0-15) - * @note concreteness 0 is usually used for abstract links (both src and dst ID's end up < 0), concreteness 1 is used for links having at least one end in positive object ID space (non abstract objects) - * @ret - */ - link_id_t getFreeLinkID(uint cidx); - - /** Allocates the link ID, meaning it wont be given as free now. - * @param id The link that was allocated - * @note This now only increments the maximal index for the concreteness of the link if it is bigger than that - */ - void allocateLinkID(link_id_t id); - - /** Unallocates the link ID, meaning it will be available again. - * @param id The link that was allocated - * @note This now only decrements the maximal index of the concreteness the id has, if it was the maximal id - */ - void unallocateLinkID(link_id_t id); - - /** Creates an inverse link for the given link. The links share the same data, but have src and dst object id's swapped - * @param src The source link - * @return LinkPtr of the new inverse link - */ - LinkPtr createInverseLink(const LinkPtr& src); - - /** internal object destruction handler. @see objectDestroyed */ - void _objectDestroyed(int id); - - /// Map of links. Indexed by whole link id, contains the link class (LinkPtr) - typedef std::map< link_id_t, LinkPtr > LinkMap; - - /// Map of all links that have an object ID in either target or source - typedef std::multimap< int, LinkPtr > ObjectIDToLinks; - - /// Map of all maps that share a certain object ID - typedef std::map< int, ObjectIDToLinks > ObjectLinkMap; - - /// Map of links in source object ID, destination object id order - ObjectLinkMap mSrcDstLinkMap; - - /// ID of this relation (Flavor) - int mID; - - /// The maximal ID of the given concreteness level (only the index part) - link_id_t mMaxID[16]; - - /// Name of this relation - std::string mName; + * @param DVariant The new value of the field + * @return true if successful, false otherwise + */ + bool setLinkField(link_id_t id, const std::string& field, const DVariant& value); + /** Gets the link data field value + * @param id The link id + * @param field The name of the field the modification is requested on + */ + DVariant getLinkField(link_id_t id, const std::string& field); + + + // ----------------- Link query methods -------------------- + /** Gets all links that come from source to destination + * @param src Source object ID + * @param dst Destination object ID or 0 if any destination + * @return LinkQueryResultPtr filled with the query result */ + LinkQueryResultPtr getAllLinks(int src, int dst) const; + + /** Gets single link ID that is coming from source to destination + * @param src Source object ID, or 0 if any source + * @param dst Destination object ID or 0 if any destination + * @return LinkPtr link instance that fulfills the requirements + * @note only one of the parameters can be zero + * @throws BasicException if there was more than one link that could be returned + */ + LinkPtr getOneLink(int src, int dst) const; + + /** Gets single link given the link ID + * @param id The link's ID + * @return LinkPtr link instance that fulfills the requirements, or NULL + */ + LinkPtr getLink(link_id_t id) const; + + /** Removes all links that connected to a given object ID + * @param id the object id to remove all links from + */ + void objectDestroyed(int id); + + /** Sets the relation to cache link data (caches fields so no direct to/from data will be used on loading) + * @param cache if true, writes will set a the value in a cache as well, and reads will search cache first + */ + void setCacheData(bool cache) { mUseDataCache = cache; }; + + /** @return true if cache for data is used, false otherwise */ + bool getCacheData() { return mUseDataCache; }; + + protected: + class MultiTargetLinkQueryResult; + + /** Internal method for link insertion. Inserts the link to the map, notifies listeners and query databases + * @param newlnk The link to be inserted + * @note Always use this method to internally insert new links, if not in a situation when the standard sequence of link addition is needed (notification, query database refresh) + * @note The link data have to be assigned prior to calling this method + */ + void _addLink(const LinkPtr& newlnk); + + /** Internal method for link removal handling. Notifies the listeners, refreshes query databases. + * @param id The id of the link to be removed + * @note Also removes the link data + */ + void _removeLink(link_id_t id); + + /** Returns the id that can be used to create a link (a free ID that is). + * @param cidx Concreteness index of the requested link (0-15) + * @note concreteness 0 is usually used for abstract links (both src and dst ID's end up < 0), concreteness 1 is used for links having at least one end in positive object ID space (non abstract objects) + * @ret + */ + link_id_t getFreeLinkID(uint cidx); + + /** Allocates the link ID, meaning it wont be given as free now. + * @param id The link that was allocated + * @note This now only increments the maximal index for the concreteness of the link if it is bigger than that + */ + void allocateLinkID(link_id_t id); + + /** Unallocates the link ID, meaning it will be available again. + * @param id The link that was allocated + * @note This now only decrements the maximal index of the concreteness the id has, if it was the maximal id + */ + void unallocateLinkID(link_id_t id); + + /** Creates an inverse link for the given link. The links share the same data, but have src and dst object id's swapped + * @param src The source link + * @return LinkPtr of the new inverse link + */ + LinkPtr createInverseLink(const LinkPtr& src); + + /** internal object destruction handler. @see objectDestroyed */ + void _objectDestroyed(int id); + + /// Map of links. Indexed by whole link id, contains the link class (LinkPtr) + typedef std::map< link_id_t, LinkPtr > LinkMap; + + /// Map of all links that have an object ID in either target or source + typedef std::multimap< int, LinkPtr > ObjectIDToLinks; + + /// Map of all maps that share a certain object ID + typedef std::map< int, ObjectIDToLinks > ObjectLinkMap; + + /// Map of links in source object ID, destination object id order + ObjectLinkMap mSrcDstLinkMap; + + /// ID of this relation (Flavor) + int mID; + + /// The maximal ID of the given concreteness level (only the index part) + link_id_t mMaxID[16]; + + /// Name of this relation + std::string mName; + /// Data storage for the link data DataStoragePtr mStorage; - - /// Hidden relations are those which should not be mentioned by editor as a normal links (metaproperty and such) - bool mHidden; - - /// The map of ID->LinkPtr (Stores link info per link ID) - LinkMap mLinkMap; - - /// fake size. This size is written as the data size into the LD$ chunks - uint32_t mFakeSize; - - /// The pointer to inverse relation - Relation* mInverse; - - /// This relation is an inverse relation... - bool mIsInverse; - - /// chunk versions. Both Link and LinkData - uint mLCVMaj; - uint mLCVMin; - uint mDCVMaj; - uint mDCVMin; - - /// If true, data caching will be used - bool mUseDataCache; - - }; - - - /// Shared pointer on Relation - typedef shared_ptr< Relation > RelationPtr; -} - -#endif + + /// Hidden relations are those which should not be mentioned by editor as a normal links (metaproperty and such) + bool mHidden; + + /// The map of ID->LinkPtr (Stores link info per link ID) + LinkMap mLinkMap; + + /// fake size. This size is written as the data size into the LD$ chunks + uint32_t mFakeSize; + + /// The pointer to inverse relation + Relation* mInverse; + + /// This relation is an inverse relation... + bool mIsInverse; + + /// chunk versions. Both Link and LinkData + uint mLCVMaj; + uint mLCVMin; + uint mDCVMaj; + uint mDCVMin; + + /// If true, data caching will be used + bool mUseDataCache; + + }; + + + /// Shared pointer on Relation + typedef shared_ptr< Relation > RelationPtr; +} + +#endif Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-11-01 16:02:00 UTC (rev 948) +++ trunk/src/services/object/ObjectService.cpp 2008-11-02 08:45:18 UTC (rev 949) @@ -397,7 +397,7 @@ } try { - mLinkService->load(db); // will load MP links if those exist as well, causing inherited properties to emerge + mLinkService->load(db, mAllocatedObjects); // will load MP links if those exist as well, causing inherited properties to emerge } catch (BasicException& e) { LOG_FATAL("Exception while loading links from mission database : %s", e.getDetails().c_str()); } Modified: trunk/src/services/property/PropertyGroup.cpp =================================================================== --- trunk/src/services/property/PropertyGroup.cpp 2008-11-01 16:02:00 UTC (rev 948) +++ trunk/src/services/property/PropertyGroup.cpp 2008-11-02 08:45:18 UTC (rev 949) @@ -116,7 +116,7 @@ LOG_ERROR("Property group %s version mismatch : %d.%d expected, %d.%d encountered", pchn.c_str(), mVerMaj, mVerMin, hdr.version_high, hdr.version_low); } } catch (BasicException) { - LOG_FATAL("PropertyGroup::load : Could not find the property chunk %s", pchn.c_str()); + LOG_ERROR("PropertyGroup::load : Could not find the property chunk %s", pchn.c_str()); return; } Modified: trunk/src/services/render/RenderService.cpp =================================================================== --- trunk/src/services/render/RenderService.cpp 2008-11-01 16:02:00 UTC (rev 948) +++ trunk/src/services/render/RenderService.cpp 2008-11-02 08:45:18 UTC (rev 949) @@ -691,6 +691,9 @@ // attach the light to a newly created scenenode (child of the object's sn) SceneNode* on = getSceneNode(objID); + if (!on) + OPDE_EXCEPT("No SceneNode found for object", "RenderService::createLight"); + Quaternion q; // TODO: Just a test. After finding the right orientation, replace with a constant quaternion value This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-12-25 19:35:58
|
Revision: 1067 http://opde.svn.sourceforge.net/opde/?rev=1067&view=rev Author: volca Date: 2008-12-25 19:35:54 +0000 (Thu, 25 Dec 2008) Log Message: ----------- Adding sim service skeleton. Added Paths: ----------- trunk/src/services/sim/ trunk/src/services/sim/CMakeLists.txt trunk/src/services/sim/SimService.cpp trunk/src/services/sim/SimService.h Added: trunk/src/services/sim/CMakeLists.txt =================================================================== --- trunk/src/services/sim/CMakeLists.txt (rev 0) +++ trunk/src/services/sim/CMakeLists.txt 2008-12-25 19:35:54 UTC (rev 1067) @@ -0,0 +1,32 @@ +# $Id$ + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${ODE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/base/console + ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/logger + ${OPDE_SOURCE_DIR}/src/services + ${OPDE_SOURCE_DIR}/src/services/database +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeSimService SimService.cpp SimService.h) + + SET_TARGET_PROPERTIES(OpdeSimService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Property changes on: trunk/src/services/sim/CMakeLists.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/src/services/sim/SimService.cpp =================================================================== --- trunk/src/services/sim/SimService.cpp (rev 0) +++ trunk/src/services/sim/SimService.cpp 2008-12-25 19:35:54 UTC (rev 1067) @@ -0,0 +1,85 @@ +/****************************************************************************** + * + * 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 "SimService.h" +#include "OpdeException.h" +#include "ServiceCommon.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*-------------------- Sim Service -------------------*/ + /*----------------------------------------------------*/ + SimService::SimService(ServiceManager *manager, const std::string& name) : Service(manager, name) { + } + + //------------------------------------------------------ + bool SimService::init() { + return true; + } + + //------------------------------------------------------ + SimService::~SimService() { + } + + //------------------------------------------------------ + void SimService::loopStep(float deltaTime) { + mSimTime += mTimeCoeff * deltaTime; + // TODO: Iterate over listeners, broadcast + } + + //------------------------------------------------------ + void SimService::registerListener(SimListener* listener) { + // TODO: Code + } + + //------------------------------------------------------ + void SimService::unregisterListener(SimListener* listener) { + // TODO: Code + } + + + + //-------------------------- Factory implementation + std::string SimServiceFactory::mName = "SimService"; + + SimServiceFactory::SimServiceFactory() : ServiceFactory() { + ServiceManager::getSingleton().addServiceFactory(this); + }; + + const std::string& SimServiceFactory::getName() { + return mName; + } + + const uint SimServiceFactory::getMask() { + return SERVICE_ENGINE; + } + + Service* SimServiceFactory::createInstance(ServiceManager* manager) { + return new SimService(manager, mName); + } + +} Property changes on: trunk/src/services/sim/SimService.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/src/services/sim/SimService.h =================================================================== --- trunk/src/services/sim/SimService.h (rev 0) +++ trunk/src/services/sim/SimService.h 2008-12-25 19:35:54 UTC (rev 1067) @@ -0,0 +1,104 @@ +/****************************************************************************** + * + * 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 __SIMSERVICE_H +#define __SIMSERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "LoopService.h" +#include "SharedPtr.h" + +namespace Opde { + /** Abstract Simulation listener - a class that does something related to simulation extends this + */ + class OPDELIB_EXPORT SimListener { + public: + virtual void simStarted(); + + virtual void simEnded(); + + virtual void simStep(float simTime); + + /// Priority of the listener + virtual size_t getPriority(); + }; + + /** @brief Sim Service - a simulation timer base. Implements Sim time (simulation time). This time can have different flow rate than normal time. + * All simulation related listeners register here, not via loop service, which only handles game loop (and does not have the capability to pause/stretch time). + */ + class OPDELIB_EXPORT SimService : public Service, LoopClient { + public: + SimService(ServiceManager *manager, const std::string& name); + virtual ~SimService(); + + // --- Registration/Unregistration of clients + void registerListener(SimListener* listener); + + void unregisterListener(SimListener* listener); + + // --- Loop Service Client related --- + void loopStep(float deltaTime); + + protected: + /// Service initialization + bool init(); + + /// Time flow coefficient - 1.0 means the sim time is 1:1 with real time. 0.5 means sim time flows 2 times slower than normal time + float mTimeCoeff; + + /// Sim time. Set to zero on simulation start + float mSimTime; + + /// Simulation listeners - multimap, as we need prioritised behavior + typedef std::multimap<size_t, SimListener*> SimListeners; + + SimListeners mSimListeners; + }; + + /// Shared pointer to Sim service + typedef shared_ptr<SimService> SimServicePtr; + + + /// Factory for the SimService objects + class OPDELIB_EXPORT SimServiceFactory : public ServiceFactory { + public: + SimServiceFactory(); + ~SimServiceFactory() {}; + + /** Creates a SimService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + private: + static std::string mName; + }; +} + + +#endif Property changes on: trunk/src/services/sim/SimService.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...> - 2009-10-15 20:08:20
|
Revision: 1295 http://opde.svn.sourceforge.net/opde/?rev=1295&view=rev Author: volca Date: 2009-10-15 20:08:09 +0000 (Thu, 15 Oct 2009) Log Message: ----------- formatting Modified Paths: -------------- trunk/src/services/draw/DrawService.cpp trunk/src/services/render/ModelScaleProperty.cpp Modified: trunk/src/services/draw/DrawService.cpp =================================================================== --- trunk/src/services/draw/DrawService.cpp 2009-10-15 20:07:14 UTC (rev 1294) +++ trunk/src/services/draw/DrawService.cpp 2009-10-15 20:08:09 UTC (rev 1295) @@ -146,6 +146,7 @@ freeCurrentPal(); } + //------------------------------------------------------ DrawSheetPtr DrawService::createSheet(const std::string& sheetName) { assert(!sheetName.empty()); Modified: trunk/src/services/render/ModelScaleProperty.cpp =================================================================== --- trunk/src/services/render/ModelScaleProperty.cpp 2009-10-15 20:07:14 UTC (rev 1294) +++ trunk/src/services/render/ModelScaleProperty.cpp 2009-10-15 20:08:09 UTC (rev 1295) @@ -58,7 +58,7 @@ // -------------------------------------------------------------------------- void ModelScaleProperty::removeProperty(int oid) { - // reinit to 1.0 - no transparency + // reinit to 1.0 - no scaling setScale(oid, Vector3(1.0f, 1.0f, 1.0f)); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-10-20 14:24:04
|
Revision: 1302 http://opde.svn.sourceforge.net/opde/?rev=1302&view=rev Author: volca Date: 2009-10-20 14:23:54 +0000 (Tue, 20 Oct 2009) Log Message: ----------- some trivial work on camera service. Far from finished still, but should shed a bit of light Modified Paths: -------------- trunk/src/services/ServiceCommon.h trunk/src/services/Services.cmake trunk/src/services/camera/CameraService.cpp trunk/src/services/camera/CameraService.h Modified: trunk/src/services/ServiceCommon.h =================================================================== --- trunk/src/services/ServiceCommon.h 2009-10-20 14:21:34 UTC (rev 1301) +++ trunk/src/services/ServiceCommon.h 2009-10-20 14:23:54 UTC (rev 1302) @@ -142,6 +142,12 @@ // Renderer last #define LOOPCLIENT_PRIORITY_RENDERER 1024 + +// --------------------------------------------- +// --- Sim service priority list --------------- +// --------------------------------------------- +#define SIM_PRIORITY_INPUT 1 + // TODO: Forward decl. anything service related here to shorten the compilation time (in combination with header inclusion removal...) #endif Modified: trunk/src/services/Services.cmake =================================================================== --- trunk/src/services/Services.cmake 2009-10-20 14:21:34 UTC (rev 1301) +++ trunk/src/services/Services.cmake 2009-10-20 14:23:54 UTC (rev 1302) @@ -22,6 +22,8 @@ ${OPDE_SOURCE_DIR}/src/services/light ${OPDE_SOURCE_DIR}/src/services/draw ${OPDE_SOURCE_DIR}/src/services/room + ${OPDE_SOURCE_DIR}/src/services/sim + ${OPDE_SOURCE_DIR}/src/services/camera ) # All the resulting libraries in a nice package as well @@ -44,6 +46,8 @@ OpdeScriptService OpdeDrawService OpdeRoomService + OpdeSimService + OpdeCameraService ) # include the configuration from all the services (each config.cmake should append the OPDE_SERVICE_HEADERS and OPDE_SERVICE_SOURCES) Modified: trunk/src/services/camera/CameraService.cpp =================================================================== --- trunk/src/services/camera/CameraService.cpp 2009-10-20 14:21:34 UTC (rev 1301) +++ trunk/src/services/camera/CameraService.cpp 2009-10-20 14:23:54 UTC (rev 1302) @@ -35,7 +35,13 @@ /*----------------------------------------------------*/ template<> const size_t ServiceImpl<CameraService>::SID = __SERVICE_ID_CAMERA; - CameraService::CameraService(ServiceManager *manager, const std::string& name) : ServiceImpl<CameraService>(manager, name) { + CameraService::CameraService(ServiceManager *manager, const std::string& name) : + ServiceImpl<CameraService>(manager, name), + mHorizontalRot(0), + mVerticalRot(0), + mPaused(false), + mAttachmentObject(0), + mDynamicAttach(false) { } //------------------------------------------------------ @@ -44,13 +50,23 @@ //------------------------------------------------------ bool CameraService::staticAttach(int objID) { - // TODO: Code + if (mObjSrv->exists(objID)) { + mAttachmentObject = objID; + mDynamicAttach = false; + return true; + } + return false; } //------------------------------------------------------ bool CameraService::dynamicAttach(int objID) { - // TODO: Code + if (mObjSrv->exists(objID)) { + mAttachmentObject = objID; + mDynamicAttach = true; + return true; + } + return false; } @@ -66,10 +82,134 @@ } //------------------------------------------------------ + void CameraService::simPaused() { + // this means we will not apply any rotation + mPaused = true; + } + + //------------------------------------------------------ + void CameraService::simUnPaused() { + mPaused = false; + } + + //------------------------------------------------------ + void CameraService::simStep(float simTime, float delta) { + if (mPaused) + return; + + // scale + Vector2 rotation(mHorizontalRot, mVerticalRot); + + rotation /= delta; + + // apply to the object in question + if (mAttachmentObject != 0) { + // load the rotation + Quaternion rot = mObjSrv->orientation(mAttachmentObject); + // laod the position + Vector3 pos = mObjSrv->position(mAttachmentObject); + + if (mDynamicAttach) { // we should rotate the object... + // TODO: Code - apply the rotation on the obj. + // rot. + } + } else { + // rotate the player object + // TODO: rotate the camera + // this is not as easy as it looks. We should take physics into consideration... + } + + // reset the rotation indicators + mHorizontalRot = 0; + mVerticalRot = 0; + } + + //------------------------------------------------------ bool CameraService::init() { - return true; + return true; } + //------------------------------------------------------ + void CameraService::bootstrapFinished() { + mInputSrv = GET_SERVICE(InputService); + mRenderSrv = GET_SERVICE(RenderService); + mSimSrv = GET_SERVICE(SimService); + mObjSrv = GET_SERVICE(ObjectService); + + InputService::ListenerPtr mturnListener(new ClassCallback<InputEventMsg, CameraService>(this, &CameraService::onMTurn)); + InputService::ListenerPtr mlookListener(new ClassCallback<InputEventMsg, CameraService>(this, &CameraService::onMLook)); + + mInputSrv->registerCommandTrap("mturn", mturnListener); + mInputSrv->registerCommandTrap("mlook", mlookListener); + + // sim listener for the camera rotation + mSimSrv->registerListener(this, SIM_PRIORITY_INPUT); + } + + //------------------------------------------------------ + void CameraService::shutdown() { + mInputSrv->unregisterCommandTrap("mturn"); + mInputSrv->unregisterCommandTrap("mlook"); + mSimSrv->unregisterListener(this); + + mInputSrv.setNull(); + mRenderSrv.setNull(); + mSimSrv.setNull(); + mObjSrv.setNull(); + } + + //------------------------------------------------------ + void CameraService::onMTurn(const InputEventMsg& iem) { + // check for the event type + if (iem.event != IET_MOUSE_MOVE) + return; + + // calculate the rotation based on some variables + // we are interested in: + // * mouse_sensitivity + // * mouse_invert + // * freelook + const DVariant& msens = mInputSrv->getVariable("mouse_sensitivity"); + const DVariant& minvert = mInputSrv->getVariable("mouse_invert"); + + // schedule a turn on the object in question + float rot = iem.params.toFloat() * msens.toFloat(); + if (minvert.toBool()) + rot = -rot; + + appendCameraRotation(rot, 0.0f); + } + + //------------------------------------------------------ + void CameraService::onMLook(const InputEventMsg& iem) { + // check for the event type + if (iem.event != IET_MOUSE_MOVE) + return; + + // is freelook enabled? + DVariant mfreelook = mInputSrv->getVariable("freelook"); + + if (mfreelook.toInt() == 0) + return; + + // freelook enabled, rotate the view + const DVariant& msens = mInputSrv->getVariable("mouse_sensitivity"); + const DVariant& minvert = mInputSrv->getVariable("mouse_invert"); + + float rot = iem.params.toFloat() * msens.toFloat(); + if (minvert.toBool()) + rot = -rot; + + appendCameraRotation(0.0f, rot); + } + + //------------------------------------------------------ + void CameraService::appendCameraRotation(float horizontal, float vertical) { + // will be applied upon sim service callback + mHorizontalRot += horizontal; + mVerticalRot += vertical; + } + //-------------------------- Factory implementation std::string CameraServiceFactory::mName = "CameraService"; Modified: trunk/src/services/camera/CameraService.h =================================================================== --- trunk/src/services/camera/CameraService.h 2009-10-20 14:21:34 UTC (rev 1301) +++ trunk/src/services/camera/CameraService.h 2009-10-20 14:23:54 UTC (rev 1302) @@ -30,14 +30,16 @@ #include "OpdeServiceManager.h" #include "OpdeService.h" +#include "InputService.h" #include "RenderService.h" +#include "SimService.h" #include "SharedPtr.h" namespace Opde { /** @brief camera service. Service that handles in-game camera */ - class OPDELIB_EXPORT CameraService : public ServiceImpl<CameraService> { + class OPDELIB_EXPORT CameraService : public ServiceImpl<CameraService>, public SimListener { public: CameraService(ServiceManager *manager, const std::string& name); virtual ~CameraService(); @@ -59,8 +61,52 @@ /** Returns (unconditionally) the camera to the player object. */ void forceCameraReturn(); + // sim service listener: + virtual void simPaused(); + virtual void simUnPaused(); + virtual void simStep(float simTime, float delta); + + protected: bool init(); + void bootstrapFinished(); + void shutdown(); + + // input listeners + + /// Input callback. Called upon mouse left/right (X axis) movement + void onMTurn(const InputEventMsg& iem); + + /// Input callback. Called upon mouse up/down (Y axis) movement + void onMLook(const InputEventMsg& iem); + + // schedules a camera rotation. The given values are not scaled by time + void appendCameraRotation(float horizontal, float vertical); + + private: + /// Input service ptr + InputServicePtr mInputSrv; + + /// Render service ptr + RenderServicePtr mRenderSrv; + + /// Simulation service ptr + SimServicePtr mSimSrv; + + /// Object service ptr + ObjectServicePtr mObjSrv; + + float mHorizontalRot; + float mVerticalRot; + + /// paused flag (if paused, all rotation is discarded) + bool mPaused; + + /// object we're attached to, or zero if none + int mAttachmentObject; + + /// true means we allow the camera to rotate the object (no meaning if no attachment is done) + bool mDynamicAttach; }; /// Shared pointer to Camera service This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-11-09 15:33:05
|
Revision: 972 http://opde.svn.sourceforge.net/opde/?rev=972&view=rev Author: volca Date: 2008-11-09 15:32:59 +0000 (Sun, 09 Nov 2008) Log Message: ----------- * fixed a segv * inheritors now have a destruction mechanism, and are not distributed via shared ptr Modified Paths: -------------- trunk/src/services/inherit/ArchetypeInheritor.cpp trunk/src/services/inherit/ArchetypeInheritor.h trunk/src/services/inherit/CachedInheritor.cpp trunk/src/services/inherit/CachedInheritor.h trunk/src/services/inherit/InheritCommon.h trunk/src/services/inherit/InheritService.cpp trunk/src/services/inherit/InheritService.h trunk/src/services/inherit/NeverInheritor.cpp trunk/src/services/inherit/NeverInheritor.h trunk/src/services/property/PropertyGroup.cpp trunk/src/services/property/PropertyGroup.h trunk/src/services/render/RenderService.cpp trunk/src/services/worldrep/WorldRepService.cpp Modified: trunk/src/services/inherit/ArchetypeInheritor.cpp =================================================================== --- trunk/src/services/inherit/ArchetypeInheritor.cpp 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/ArchetypeInheritor.cpp 2008-11-09 15:32:59 UTC (rev 972) @@ -28,7 +28,7 @@ /*--------------------------------------------------------*/ /*--------------------- NeverInheritor -------------------*/ /*--------------------------------------------------------*/ - ArchetypeInheritor::ArchetypeInheritor(InheritService* is) : CachedInheritor(is) { + ArchetypeInheritor::ArchetypeInheritor(const InheritorFactory* fac, InheritService* is) : CachedInheritor(fac, is) { }; //------------------------------------------------------ @@ -54,8 +54,8 @@ return mName; } - InheritorPtr ArchetypeInheritorFactory::createInstance(InheritService* is) const { - return new ArchetypeInheritor(is); + Inheritor* ArchetypeInheritorFactory::createInstance(InheritService* is) const { + return new ArchetypeInheritor(this, is); } } Modified: trunk/src/services/inherit/ArchetypeInheritor.h =================================================================== --- trunk/src/services/inherit/ArchetypeInheritor.h 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/ArchetypeInheritor.h 2008-11-09 15:32:59 UTC (rev 972) @@ -33,7 +33,7 @@ class ArchetypeInheritor : public CachedInheritor { public: /// Constructor - ArchetypeInheritor(InheritService* is); + ArchetypeInheritor(const InheritorFactory* fac, InheritService* is); /// Destructor ~ArchetypeInheritor(); @@ -50,7 +50,7 @@ virtual std::string getName() const; - InheritorPtr createInstance(InheritService* is) const; + Inheritor* createInstance(InheritService* is) const; protected: static std::string mName; Modified: trunk/src/services/inherit/CachedInheritor.cpp =================================================================== --- trunk/src/services/inherit/CachedInheritor.cpp 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/CachedInheritor.cpp 2008-11-09 15:32:59 UTC (rev 972) @@ -28,7 +28,7 @@ /*---------------------------------------------------------*/ /*--------------------- CachedInheritor -------------------*/ /*---------------------------------------------------------*/ - CachedInheritor::CachedInheritor(InheritService* is) : mInheritService(is) { + CachedInheritor::CachedInheritor(const InheritorFactory* fac, InheritService* is) : Inheritor(fac), mInheritService(is) { InheritService::ListenerPtr callback = new ClassCallback<InheritChangeMsg, CachedInheritor>(this, &CachedInheritor::onInheritMsg); @@ -87,37 +87,35 @@ int niter = 0; InheritLinkPtr effective(NULL); - // now for each of the sources, find the one with the max. priority that still implements. - // Some logic to accept the self assigned is also present - while (!sources->end()) { - InheritLinkPtr il = sources->next(); - ++niter; - - int effID = getEffectiveID(il->srcID); // look for the effective ID of the source - - /* - validate and compare to the maximal. If priority is greater, - we have a new winner (but only if it validates and the source has some effective ID) - */ - // Comparing the priority to signed int... - if (validate(il->srcID, il->dstID, il->priority) && (il->priority > maxPrio) && (effID != 0)) { - effective = il; - maxPrio = il->priority; - newEffID = effID; - } - } - - - // If self-implements + // If self-implements if (getImplements(objID)) { + // self, because prop on object masks any inherited prop, be it mp or archetype + newEffID = objID; + } else { + // does not self-implement... + // now for each of the sources, find the one with the max. priority that still implements. + // Some logic to accept the self assigned is also present + while (!sources->end()) { + InheritLinkPtr il = sources->next(); + ++niter; - // If there is no source supply, set self. Respect priority>0 as metaprop - if (effective.isNull() || maxPrio <= 0) { - newEffID = objID; // self, because we mask 0 prio inh. or no source was found - } + int effID = getEffectiveID(il->srcID); // look for the effective ID of the source - } + /* + validate and compare to the maximal. If priority is greater, + we have a new winner (but only if it validates and the source has some effective ID) + */ + // Comparing the priority to signed int... + if (validate(il->srcID, il->dstID, il->priority) && (il->priority > maxPrio) && (effID != 0)) { + effective = il; + maxPrio = il->priority; + newEffID = effID; + } + } + } + + if (newEffID != 0) { if (setEffectiveID(objID, newEffID)) { // Broadcast the change to a new ID @@ -213,8 +211,8 @@ return mName; } - InheritorPtr CachedInheritorFactory::createInstance(InheritService* is) const { - return new CachedInheritor(is); + Inheritor* CachedInheritorFactory::createInstance(InheritService* is) const { + return new CachedInheritor(this, is); } } Modified: trunk/src/services/inherit/CachedInheritor.h =================================================================== --- trunk/src/services/inherit/CachedInheritor.h 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/CachedInheritor.h 2008-11-09 15:32:59 UTC (rev 972) @@ -33,7 +33,7 @@ class CachedInheritor : public Inheritor { public: /// Constructor - CachedInheritor(InheritService* is); + CachedInheritor(const InheritorFactory* fac, InheritService* is); /// Destructor ~CachedInheritor(); @@ -114,7 +114,7 @@ virtual std::string getName() const; - InheritorPtr createInstance(InheritService* is) const; + Inheritor* createInstance(InheritService* is) const; protected: static std::string mName; Modified: trunk/src/services/inherit/InheritCommon.h =================================================================== --- trunk/src/services/inherit/InheritCommon.h 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/InheritCommon.h 2008-11-09 15:32:59 UTC (rev 972) @@ -64,6 +64,9 @@ DVariant value; }; + // forward decl. + class InheritorFactory; + /** Inheritor interface * Inheritors are used to query effective object id * (the id of an object holding effective value) @@ -72,6 +75,9 @@ * This means that all the objects that are changed by the inheritance modification can be notified through the listener */ class Inheritor : public MessageSource<InheritValueChangeMsg> { public: + // constructor + Inheritor(const InheritorFactory* fac) : mFactory(fac) {}; + /// default destructor virtual ~Inheritor() {}; @@ -120,11 +126,14 @@ /// on a value change, the inheritor propagates the field and the new value to all affected objects virtual void valueChanged(int objID, const std::string& field, const DVariant& value) = 0; + + /// returns a pointer to the factory instance which constructed this inheritor + inline const InheritorFactory* getFactory() { return mFactory; }; + + protected: + const InheritorFactory* mFactory; }; - /// Shared pointer to Inheritor - typedef shared_ptr< Inheritor > InheritorPtr; - /// Inheritance change types typedef enum { /// Inherit. source was added (Sent after the addition) @@ -157,7 +166,9 @@ virtual std::string getName() const = 0; - virtual InheritorPtr createInstance(InheritService* is) const = 0; + virtual Inheritor* createInstance(InheritService* is) const = 0; + + virtual void destroyInstance(Inheritor* i) const { delete i; }; }; typedef shared_ptr< InheritorFactory > InheritorFactoryPtr; Modified: trunk/src/services/inherit/InheritService.cpp =================================================================== --- trunk/src/services/inherit/InheritService.cpp 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/InheritService.cpp 2008-11-09 15:32:59 UTC (rev 972) @@ -103,6 +103,12 @@ if (!mMetaPropRelation.isNull()) mMetaPropRelation->unregisterListener(mMetaPropListenerID); + InheritorList::iterator it = mInheritors.begin(); + + for (; it != mInheritors.end(); ++it) { + delete (*it); + } + mInheritors.clear(); // sufficient - the smart_ptrs will delete } @@ -112,11 +118,11 @@ } //------------------------------------------------------ - InheritorPtr InheritService::createInheritor(const std::string& name) { + Inheritor* InheritService::createInheritor(const std::string& name) { InheritorFactoryMap::iterator it = mInheritorFactoryMap.find(name); if (it != mInheritorFactoryMap.end()) { - InheritorPtr inh = it->second->createInstance(this); + Inheritor* inh = it->second->createInstance(this); mInheritors.push_back(inh); // no need map by name return inh; } else @@ -124,6 +130,21 @@ } //------------------------------------------------------ + void InheritService::destroyInheritor(Inheritor* inh) { + // erase from the vector, then destroy via the factory that created it + inh->getFactory()->destroyInstance(inh); + + InheritorList::iterator it = mInheritors.begin(); + + while (it != mInheritors.end()) { + if (*it == inh) + it = mInheritors.erase(it); + else + it++; + } + } + + //------------------------------------------------------ bool InheritService::init() { // Link Service should have created us automatically through service masks. // So we can register as a link service listener Modified: trunk/src/services/inherit/InheritService.h =================================================================== --- trunk/src/services/inherit/InheritService.h 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/InheritService.h 2008-11-09 15:32:59 UTC (rev 972) @@ -76,8 +76,12 @@ /** Creates an inheritor instance, given the inheritor name * @return Inheritor pointer on success * @throw BasicException if the inheritor name was not found in factories */ - InheritorPtr createInheritor(const std::string& name); + Inheritor* createInheritor(const std::string& name); + /** Destroys the given inheritor (The inheritor has to be constructed via createInheritor!) + */ + void destroyInheritor(Inheritor* inh); + /** Requests all sources for inheritance for the given object ID * @param objID the object id to get the Sources for */ InheritQueryResultPtr getSources(int objID) const; @@ -183,7 +187,7 @@ RelationPtr mMetaPropRelation; /// List of instanced inheritors - typedef std::vector< InheritorPtr > InheritorList; + typedef std::vector< Inheritor* > InheritorList; /// All instanced inheritors are here InheritorList mInheritors; Modified: trunk/src/services/inherit/NeverInheritor.cpp =================================================================== --- trunk/src/services/inherit/NeverInheritor.cpp 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/NeverInheritor.cpp 2008-11-09 15:32:59 UTC (rev 972) @@ -28,7 +28,7 @@ /*--------------------------------------------------------*/ /*--------------------- NeverInheritor -------------------*/ /*--------------------------------------------------------*/ - NeverInheritor::NeverInheritor(InheritService* is) : mInheritService(is) { + NeverInheritor::NeverInheritor(const InheritorFactory* fac, InheritService* is) : Inheritor(fac), mInheritService(is) { }; //------------------------------------------------------ @@ -137,8 +137,8 @@ return mName; } - InheritorPtr NeverInheritorFactory::createInstance(InheritService* is) const { - return new NeverInheritor(is); + Inheritor* NeverInheritorFactory::createInstance(InheritService* is) const { + return new NeverInheritor(this, is); } } Modified: trunk/src/services/inherit/NeverInheritor.h =================================================================== --- trunk/src/services/inherit/NeverInheritor.h 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/inherit/NeverInheritor.h 2008-11-09 15:32:59 UTC (rev 972) @@ -29,7 +29,7 @@ class NeverInheritor : public Inheritor { public: /// Constructor - NeverInheritor(InheritService* is); + NeverInheritor(const InheritorFactory* fac, InheritService* is); /// Destructor ~NeverInheritor(); @@ -71,7 +71,7 @@ virtual std::string getName() const; - InheritorPtr createInstance(InheritService* is) const; + Inheritor* createInstance(InheritService* is) const; protected: static std::string mName; Modified: trunk/src/services/property/PropertyGroup.cpp =================================================================== --- trunk/src/services/property/PropertyGroup.cpp 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/property/PropertyGroup.cpp 2008-11-09 15:32:59 UTC (rev 972) @@ -65,8 +65,8 @@ mBuiltin(false) { // Find the inheritor by the name, and assign too - InheritServicePtr inhs = static_pointer_cast<InheritService>(ServiceManager::getSingleton().getService("InheritService")); - mInheritor = inhs->createInheritor(inheritorName); + mInheritService = static_pointer_cast<InheritService>(ServiceManager::getSingleton().getService("InheritService")); + mInheritor = mInheritService->createInheritor(inheritorName); // And as a final step, register as inheritor listener Inheritor::ListenerPtr cil = new ClassCallback<InheritValueChangeMsg, PropertyGroup>(this, &PropertyGroup::onInheritChange); @@ -83,10 +83,12 @@ clear(); // have to unregister here to break shared_ptr dependencies (prop. groups are not shared_ptr handled) - if (! mInheritor.isNull()) + if (!mInheritor) { mInheritor->unregisterListener(mInheritorListenerID); - - mInheritor = NULL; + mInheritService->destroyInheritor(mInheritor); + mInheritor = NULL; + mInheritService = NULL; // releases the reference + } } // -------------------------------------------------------------------------- Modified: trunk/src/services/property/PropertyGroup.h =================================================================== --- trunk/src/services/property/PropertyGroup.h 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/property/PropertyGroup.h 2008-11-09 15:32:59 UTC (rev 972) @@ -221,7 +221,8 @@ uint mVerMin; /// Inheritor used to determine property inheritance - InheritorPtr mInheritor; + Inheritor* mInheritor; + InheritServicePtr mInheritService; /// Inheritor value changes listener Inheritor::ListenerID mInheritorListenerID; Modified: trunk/src/services/render/RenderService.cpp =================================================================== --- trunk/src/services/render/RenderService.cpp 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/render/RenderService.cpp 2008-11-09 15:32:59 UTC (rev 972) @@ -253,8 +253,13 @@ mPropScale->unregisterListener(mPropScaleListenerID); mPropScale = NULL; - if (!mLoopService.isNull()) + if (!mLoopService.isNull()) { mLoopService->removeLoopClient(this); + mLoopService = NULL; + } + + mConfigService = NULL; + mPropertyService = NULL; } // -------------------------------------------------------------------------- Modified: trunk/src/services/worldrep/WorldRepService.cpp =================================================================== --- trunk/src/services/worldrep/WorldRepService.cpp 2008-11-09 15:31:32 UTC (rev 971) +++ trunk/src/services/worldrep/WorldRepService.cpp 2008-11-09 15:32:59 UTC (rev 972) @@ -106,6 +106,8 @@ mDatabaseService->unregisterListener(mDbCallback); mDatabaseService = NULL; clearData(); + + mRenderService.setNull(); } WorldRepService::~WorldRepService() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-12-24 23:45:40
|
Revision: 1061 http://opde.svn.sourceforge.net/opde/?rev=1061&view=rev Author: patryn Date: 2008-12-24 23:45:09 +0000 (Wed, 24 Dec 2008) Log Message: ----------- Added Physics Service. Added Paths: ----------- trunk/src/services/physics/ trunk/src/services/physics/CMakeLists.txt trunk/src/services/physics/PhysicsService.cpp trunk/src/services/physics/PhysicsService.h Added: trunk/src/services/physics/CMakeLists.txt =================================================================== --- trunk/src/services/physics/CMakeLists.txt (rev 0) +++ trunk/src/services/physics/CMakeLists.txt 2008-12-24 23:45:09 UTC (rev 1061) @@ -0,0 +1,37 @@ +# $Id$ + +include_directories ( + ${OGRE_INCLUDE_DIR} + ${ODE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/base/console + ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/logger + ${OPDE_SOURCE_DIR}/src/services + ${OPDE_SOURCE_DIR}/src/services/worldrep + ${OPDE_SOURCE_DIR}/src/services/binary + ${OPDE_SOURCE_DIR}/src/services/database + ${OPDE_SOURCE_DIR}/src/services/link + ${OPDE_SOURCE_DIR}/src/services/inherit + ${OPDE_SOURCE_DIR}/src/services/property +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdePhysicsService PhysicsService.cpp PhysicsService.h) + + SET_TARGET_PROPERTIES(OpdePhysicsService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Property changes on: trunk/src/services/physics/CMakeLists.txt ___________________________________________________________________ Added: svn:keywords + Date Revision Author URL Id Added: svn:eol-style + native Added: trunk/src/services/physics/PhysicsService.cpp =================================================================== --- trunk/src/services/physics/PhysicsService.cpp (rev 0) +++ trunk/src/services/physics/PhysicsService.cpp 2008-12-24 23:45:09 UTC (rev 1061) @@ -0,0 +1,68 @@ +/****************************************************************************** + * + * 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 "PhysicsService.h" +#include "OpdeException.h" +#include "ServiceCommon.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*-------------------- Physics Service ---------------*/ + /*----------------------------------------------------*/ + PhysicsService::PhysicsService(ServiceManager *manager, const std::string& name) : Service(manager, name) { + mDbService = GET_SERVICE(DatabaseService); + } + + //------------------------------------------------------ + bool PhysicsService::init() { + return true; + } + + //------------------------------------------------------ + PhysicsService::~PhysicsService() { + } + + //-------------------------- Factory implementation + std::string PhysicsServiceFactory::mName = "PhysicsService"; + + PhysicsServiceFactory::PhysicsServiceFactory() : ServiceFactory() { + ServiceManager::getSingleton().addServiceFactory(this); + }; + + const std::string& PhysicsServiceFactory::getName() { + return mName; + } + + const uint PhysicsServiceFactory::getMask() { + return SERVICE_ENGINE; + } + + Service* PhysicsServiceFactory::createInstance(ServiceManager* manager) { + return new PhysicsService(manager, mName); + } + +} Property changes on: trunk/src/services/physics/PhysicsService.cpp ___________________________________________________________________ Added: svn:keywords + Date Revision Author URL Id Added: svn:eol-style + native Added: trunk/src/services/physics/PhysicsService.h =================================================================== --- trunk/src/services/physics/PhysicsService.h (rev 0) +++ trunk/src/services/physics/PhysicsService.h 2008-12-24 23:45:09 UTC (rev 1061) @@ -0,0 +1,73 @@ +/****************************************************************************** + * + * 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 __PHYSICSSERVICE_H +#define __PHYSICSSERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "DatabaseService.h" +#include "FileGroup.h" +#include "SharedPtr.h" + +namespace Opde { + + /** @brief Physics service - service defining game states (Temporary code. Will be filled with a high level state management - screens) + */ + class OPDELIB_EXPORT PhysicsService : public Service { + public: + PhysicsService(ServiceManager *manager, const std::string& name); + virtual ~PhysicsService(); + + protected: + bool init(); + + DatabaseServicePtr mDbService; + }; + + /// Shared pointer to Physics service + typedef shared_ptr<PhysicsService> PhysicsServicePtr; + + + /// Factory for the PhysicsService objects + class OPDELIB_EXPORT PhysicsServiceFactory : public ServiceFactory { + public: + PhysicsServiceFactory(); + ~PhysicsServiceFactory() {}; + + /** Creates a PhysicsService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + private: + static std::string mName; + }; +} + + +#endif Property changes on: trunk/src/services/physics/PhysicsService.h ___________________________________________________________________ Added: svn:keywords + Date Revision Author URL Id 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...> - 2009-01-09 12:34:57
|
Revision: 1093 http://opde.svn.sourceforge.net/opde/?rev=1093&view=rev Author: volca Date: 2009-01-09 11:30:05 +0000 (Fri, 09 Jan 2009) Log Message: ----------- Adding the DrawService empty shell - to be filled with code Added Paths: ----------- trunk/src/services/draw/ trunk/src/services/draw/CMakeLists.txt trunk/src/services/draw/DrawService.cpp trunk/src/services/draw/DrawService.h Added: trunk/src/services/draw/CMakeLists.txt =================================================================== --- trunk/src/services/draw/CMakeLists.txt (rev 0) +++ trunk/src/services/draw/CMakeLists.txt 2009-01-09 11:30:05 UTC (rev 1093) @@ -0,0 +1,25 @@ +include_directories ( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/dyntype + ${OPDE_SOURCE_DIR}/src/base/Dark + ${OPDE_SOURCE_DIR}/src/scenemanager + ${OPDE_SOURCE_DIR}/src/compat + ${OPDE_SOURCE_DIR}/src/base/servicemanager + ${OPDE_SOURCE_DIR}/src/services +) + +link_directories ( + ${OGRE_LIB_DIR} + ${OPDE_SOURCE_DIR}/src/base + ${OPDE_SOURCE_DIR}/src/base/servicemanager +) + +IF(STATIC_LIBS) + add_library (OpdeDrawService DrawService.cpp DrawService.h) + + SET_TARGET_PROPERTIES(OpdeDrawService PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" + ) +ENDIF(STATIC_LIBS) Property changes on: trunk/src/services/draw/CMakeLists.txt ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/draw/DrawService.cpp =================================================================== --- trunk/src/services/draw/DrawService.cpp (rev 0) +++ trunk/src/services/draw/DrawService.cpp 2009-01-09 11:30:05 UTC (rev 1093) @@ -0,0 +1,67 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "DrawService.h" +#include "OpdeException.h" +#include "ServiceCommon.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*-------------------- DrawService -------------------*/ + /*----------------------------------------------------*/ + DrawService::DrawService(ServiceManager *manager, const std::string& name) : Service(manager, name) { + } + + //------------------------------------------------------ + bool DrawService::init() { + return true; + } + + //------------------------------------------------------ + DrawService::~DrawService() { + } + + //-------------------------- Factory implementation + std::string DrawServiceFactory::mName = "DrawService"; + + DrawServiceFactory::DrawServiceFactory() : ServiceFactory() { + ServiceManager::getSingleton().addServiceFactory(this); + }; + + const std::string& DrawServiceFactory::getName() { + return mName; + } + + const uint DrawServiceFactory::getMask() { + return SERVICE_ENGINE; + } + + Service* DrawServiceFactory::createInstance(ServiceManager* manager) { + return new DrawService(manager, mName); + } + +} Property changes on: trunk/src/services/draw/DrawService.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/draw/DrawService.h =================================================================== --- trunk/src/services/draw/DrawService.h (rev 0) +++ trunk/src/services/draw/DrawService.h 2009-01-09 11:30:05 UTC (rev 1093) @@ -0,0 +1,69 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __DRAWSERVICE_H +#define __DRAWSERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "SharedPtr.h" + +namespace Opde { + + /** @brief Draw Service - 2D rendering service. + */ + class OPDELIB_EXPORT DrawService : public Service { + public: + DrawService(ServiceManager *manager, const std::string& name); + virtual ~DrawService(); + + protected: + bool init(); + }; + + /// Shared pointer to the draw service + typedef shared_ptr<DrawService> DrawServicePtr; + + + /// Factory for the DrawService objects + class OPDELIB_EXPORT DrawServiceFactory : public ServiceFactory { + public: + DrawServiceFactory(); + ~DrawServiceFactory() {}; + + /** Creates a GameService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + private: + static std::string mName; + }; +} + + +#endif Property changes on: trunk/src/services/draw/DrawService.h ___________________________________________________________________ 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...> - 2009-01-13 14:35:37
|
Revision: 1108 http://opde.svn.sourceforge.net/opde/?rev=1108&view=rev Author: volca Date: 2009-01-13 14:35:22 +0000 (Tue, 13 Jan 2009) Log Message: ----------- * Visibilty handling for sheet * Fix for InputService::fillVariables Modified Paths: -------------- trunk/src/services/draw/DrawSheet.cpp trunk/src/services/input/InputService.cpp Modified: trunk/src/services/draw/DrawSheet.cpp =================================================================== --- trunk/src/services/draw/DrawSheet.cpp 2009-01-13 14:27:07 UTC (rev 1107) +++ trunk/src/services/draw/DrawSheet.cpp 2009-01-13 14:35:22 UTC (rev 1108) @@ -31,7 +31,8 @@ /*-------------------- DrawSheet ---------------------*/ /*----------------------------------------------------*/ DrawSheet::DrawSheet() : mActive(false) { - // nothing to do! + // default to no visibility + setVisible(false); }; //------------------------------------------------------ @@ -50,12 +51,15 @@ void DrawSheet::activate() { mActive = true; + setVisible(true); // TODO: Need to inform all DrawBuffers? } //------------------------------------------------------ void DrawSheet::deactivate() { mActive = false; + + setVisible(false); } //------------------------------------------------------ Modified: trunk/src/services/input/InputService.cpp =================================================================== --- trunk/src/services/input/InputService.cpp 2009-01-13 14:27:07 UTC (rev 1107) +++ trunk/src/services/input/InputService.cpp 2009-01-13 14:35:22 UTC (rev 1108) @@ -461,6 +461,8 @@ result += var; } } + + return result; } //------------------------------------------------------ @@ -896,7 +898,7 @@ } else { // dispatch the key event using the mapper } - + return false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-04-02 11:46:36
|
Revision: 1177 http://opde.svn.sourceforge.net/opde/?rev=1177&view=rev Author: volca Date: 2009-04-02 11:46:32 +0000 (Thu, 02 Apr 2009) Log Message: ----------- Coding style rectification Modified Paths: -------------- trunk/src/services/light/LightService.cpp trunk/src/services/light/LightService.h trunk/src/services/worldrep/WRCell.cpp trunk/src/services/worldrep/WRCell.h trunk/src/services/worldrep/WRTypes.h trunk/src/services/worldrep/WorldRepService.cpp trunk/src/services/worldrep/WorldRepService.h Modified: trunk/src/services/light/LightService.cpp =================================================================== --- trunk/src/services/light/LightService.cpp 2009-04-02 11:17:00 UTC (rev 1176) +++ trunk/src/services/light/LightService.cpp 2009-04-02 11:46:32 UTC (rev 1177) @@ -81,7 +81,7 @@ //------------------------------------------------------ LightsForCellPtr LightService::_loadLightDefinitionsForCell(size_t cellID, const FilePtr& tag, - size_t num_anim_lights, size_t num_textured, wr_polygon_texturing_t* face_infos) { + size_t num_anim_lights, size_t num_textured, WRPolygonTexturing* face_infos) { assert(mLightPixelSize != 0); // create a new cell, load the definitions for it @@ -146,7 +146,7 @@ //------------------------------------------------------ - const wr_light_info_t& LightService::getLightInfo(size_t cellID, size_t faceID) { + const WRLightInfo& LightService::getLightInfo(size_t cellID, size_t faceID) { // find the LFC pointer for the cell return mLightsForCell[cellID]->getLightInfo(faceID); } @@ -212,7 +212,7 @@ /*------------------ LightsForCell -------------------*/ /*----------------------------------------------------*/ LightsForCell::LightsForCell(const FilePtr& file, size_t num_anim_lights, size_t num_textured, size_t light_size, - wr_polygon_texturing_t* face_infos) : + WRPolygonTexturing* face_infos) : mLightSize(light_size), mNumTextured(num_textured), mNumAnimLights(num_anim_lights), @@ -225,8 +225,8 @@ file->read(anim_map, sizeof(int16_t) * mNumAnimLights); //8. load the lightmap descriptors - lm_infos = new wr_light_info_t[mNumTextured]; - file->read(lm_infos, sizeof(wr_light_info_t) * mNumTextured); + lm_infos = new WRLightInfo[mNumTextured]; + file->read(lm_infos, sizeof(WRLightInfo) * mNumTextured); //9. load the lightmaps // alloc the space for all the pointers @@ -334,7 +334,7 @@ //------------------------------------------------------ - const wr_light_info_t& LightsForCell::getLightInfo(size_t face_id) { + const WRLightInfo& LightsForCell::getLightInfo(size_t face_id) { assert(face_id < mNumTextured); return lm_infos[face_id]; Modified: trunk/src/services/light/LightService.h =================================================================== --- trunk/src/services/light/LightService.h 2009-04-02 11:17:00 UTC (rev 1176) +++ trunk/src/services/light/LightService.h 2009-04-02 11:46:32 UTC (rev 1177) @@ -60,9 +60,9 @@ tag->readElem(&radius, sizeof(float)); }; - wr_coord_t pos; // 12 - wr_coord_t rot; // 12 - 24 - wr_coord_t brightness; // 4 - 28 + WRVector3 pos; // 12 + WRVector3 rot; // 12 - 24 + WRVector3 brightness; // 4 - 28 float cone_inner; // 4 - 32 - TODO: This is cos(alpha), not radians! float cone_outer; // 4 - 36 float radius; // 4 - 40 @@ -81,12 +81,12 @@ * @param light_size The size of the pixel in bytes (1=>grayscale lmaps, 2=>16 bit rgb lmaps) */ LightsForCell(const FilePtr& file, size_t num_anim_lights, - size_t num_textured, size_t light_size, wr_polygon_texturing_t* face_infos); + size_t num_textured, size_t light_size, WRPolygonTexturing* face_infos); ~LightsForCell(); void atlasLightMaps(LightAtlasList* atlas); - const wr_light_info_t& getLightInfo(size_t face_id); + const WRLightInfo& getLightInfo(size_t face_id); size_t getAtlasForPolygon(size_t face_id); @@ -101,7 +101,7 @@ /** animated lights map (e.g. bit to object number mapping) - count is to be found in the header */ int16_t *anim_map; // index by bit num, and ya get the object number the animated lightmap belongs to - wr_light_info_t *lm_infos; + WRLightInfo *lm_infos; // Lightmaps: // The count of lightmaps per face index @@ -125,7 +125,7 @@ size_t mNumAnimLights; /** Borrowed reference to face infos, used to determine the texture of polygon */ - wr_polygon_texturing_t* mFaceInfos; + WRPolygonTexturing* mFaceInfos; bool mAtlased; }; @@ -155,7 +155,7 @@ /** Loads the light definitions for the given cell from the current position of the tag file */ LightsForCellPtr _loadLightDefinitionsForCell(size_t cellID, const FilePtr& tag, size_t num_anim_lights, - size_t num_textured, wr_polygon_texturing_t* face_infos); + size_t num_textured, WRPolygonTexturing* face_infos); /** loads the light definition table from the specified file. * @note this method is internal, used by WorldRepService when loading the WR tag file */ @@ -171,7 +171,7 @@ void clear(); /** Lightmap info getter */ - const wr_light_info_t& getLightInfo(size_t cellID, size_t faceID); + const WRLightInfo& getLightInfo(size_t cellID, size_t faceID); /// Returns the atlas index for cell id and it's polygon id size_t getAtlasForCellPolygon(size_t cellID, size_t faceID); Modified: trunk/src/services/worldrep/WRCell.cpp =================================================================== --- trunk/src/services/worldrep/WRCell.cpp 2009-04-02 11:17:00 UTC (rev 1176) +++ trunk/src/services/worldrep/WRCell.cpp 2009-04-02 11:46:32 UTC (rev 1177) @@ -42,18 +42,18 @@ //------------------------------------------------------------------------------------ WRCell::WRCell(WorldRepService* owner, Ogre::DarkGeometry* targetGeom) : - cellNum(-1), - vertices(NULL), - face_maps(NULL), - face_infos(NULL), - poly_indices(NULL), - planes(NULL), + mCellNum(-1), + mVertices(NULL), + mFaceMaps(NULL), + mFaceInfos(NULL), + mPolyIndices(NULL), + mPlanes(NULL), mLoaded(false), mPortalsDone(false), mOwner(owner), mLevelGeometry(targetGeom), mLights(NULL) { - bspNode = NULL; + mBSPNode = NULL; mMaterialService = GET_SERVICE(MaterialService); mLightService = GET_SERVICE(LightService); @@ -64,16 +64,16 @@ WRCell::~WRCell() { if (mLoaded) { - delete[] vertices; - delete[] face_maps; - delete[] face_infos; + delete[] mVertices; + delete[] mFaceMaps; + delete[] mFaceInfos; - for (int i = 0; i < header.num_polygons; i++) - delete[] poly_indices[i]; + for (int i = 0; i < mHeader.numPolygons; i++) + delete[] mPolyIndices[i]; - delete[] poly_indices; + delete[] mPolyIndices; - delete[] planes; + delete[] mPlanes; } } @@ -83,26 +83,26 @@ assert(!mLoaded); // Copy the Cell id - cellNum = _cell_num; + mCellNum = _cell_num; // check the lightmap pixel size assert((lightSize >= 1) && (lightSize <= 2)); // The number in the comment is used by me to check if I deallocate what I allocated... // load the header - chunk->read(&header, sizeof(wr_cell_hdr_t)); + chunk->read(&mHeader, sizeof(WRCellHeader)); //1. load the vertices - vertices = new wr_coord_t[header.num_vertices]; - chunk->read(vertices, sizeof(wr_coord_t) * header.num_vertices); + mVertices = new WRVector3[mHeader.numVertices]; + chunk->read(mVertices, sizeof(WRVector3) * mHeader.numVertices); //2. load the cell's polygon mapping - face_maps = new wr_polygon_t[header.num_polygons]; - chunk->read(face_maps, sizeof(wr_polygon_t) * header.num_polygons); + mFaceMaps = new WRPolygon[mHeader.numPolygons]; + chunk->read(mFaceMaps, sizeof(WRPolygon) * mHeader.numPolygons); //3. load the cell's texturing infos - face_infos = new wr_polygon_texturing_t[header.num_textured]; - chunk->read(face_infos, sizeof(wr_polygon_texturing_t) * header.num_textured); + mFaceInfos = new WRPolygonTexturing[mHeader.numTextured]; + chunk->read(mFaceInfos, sizeof(WRPolygonTexturing) * mHeader.numTextured); // polygon mapping struct.. len and data @@ -112,33 +112,33 @@ chunk->read(&num_indices, sizeof(uint32_t)); // 4. - poly_indices = new uint8_t*[header.num_polygons]; + mPolyIndices = new uint8_t*[mHeader.numPolygons]; //5. for each polygon there is - for (int x = 0; x < header.num_polygons; x++) { - poly_indices[x] = new uint8_t[face_maps[x].count]; - chunk->read(&(poly_indices[x][0]), face_maps[x].count); + for (int x = 0; x < mHeader.numPolygons; x++) { + mPolyIndices[x] = new uint8_t[mFaceMaps[x].count]; + chunk->read(&(mPolyIndices[x][0]), mFaceMaps[x].count); } //6. load the planes - wr_plane_t* wr_planes = new wr_plane_t[header.num_planes]; - chunk->read(wr_planes, sizeof(wr_plane_t) * header.num_planes); + WRPlane* wr_planes = new WRPlane[mHeader.numPlanes]; + chunk->read(wr_planes, sizeof(WRPlane) * mHeader.numPlanes); - planes = new Ogre::Plane[header.num_planes]; + mPlanes = new Ogre::Plane[mHeader.numPlanes]; // convert the planes to the ogre format - for (int x = 0; x < header.num_planes; x++) { - wr_plane_t origpl = wr_planes[x]; + for (int x = 0; x < mHeader.numPlanes; x++) { + WRPlane origpl = wr_planes[x]; Ogre::Plane tplane; tplane.normal = Vector3(origpl.normal.x, origpl.normal.y, origpl.normal.z); tplane.d = origpl.d; - planes[x] = tplane; + mPlanes[x] = tplane; } delete[] wr_planes; // and load it's light info - mLights = mLightService->_loadLightDefinitionsForCell(cellNum, chunk, header.num_anim_lights, header.num_textured, face_infos); + mLights = mLightService->_loadLightDefinitionsForCell(mCellNum, chunk, mHeader.numAnimLights, mHeader.numTextured, mFaceInfos); mLoaded = true; } @@ -149,15 +149,15 @@ assert(mLoaded); - if (index > header.num_planes) + if (index > mHeader.numPlanes) OPDE_EXCEPT("Plane index is out of bounds", "WRCell::getPlane"); - return planes[index]; + return mPlanes[index]; } //------------------------------------------------------------------------------------ - void WRCell::insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, wr_coord_t coord, + void WRCell::insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, WRVector3 coord, const Ogre::Vector2& displacement, const std::pair<Ogre::uint, Ogre::uint>& dimensions, Vector3 origin) { BspVertex vert; @@ -178,18 +178,18 @@ //------------------------------------------------------------------------------------ - void WRCell::constructBspVertex(int faceNum, wr_coord_t pos, const Ogre::Vector2& displacement, const std::pair< + void WRCell::constructBspVertex(int faceNum, WRVector3 pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint>& dimensions, BspVertex *vtx) { // Position copy vtx->position[0] = pos.x; vtx->position[1] = pos.y; vtx->position[2] = pos.z; - uint pln = face_maps[faceNum].plane; + uint pln = mFaceMaps[faceNum].plane; // Normal copy - Vector3 normal(planes[pln].normal.x, planes[pln].normal.y, planes[pln].normal.z); + Vector3 normal(mPlanes[pln].normal.x, mPlanes[pln].normal.y, mPlanes[pln].normal.z); normal.normalise(); vtx->normal[0] = normal.x; @@ -209,8 +209,8 @@ // Texturing axises - wr_coord_t _axu = face_infos[faceNum].ax_u; - wr_coord_t _axv = face_infos[faceNum].ax_v; + WRVector3 _axu = mFaceInfos[faceNum].axisU; + WRVector3 _axv = mFaceInfos[faceNum].axisV; // convert the vectors to the Ogre types @@ -231,15 +231,15 @@ // The UV shifts can't simply be center vertex based! It all seems to be 0 vertex based. - sh_u = face_infos[faceNum].u / 4096.0; - sh_v = face_infos[faceNum].v / 4096.0; + sh_u = mFaceInfos[faceNum].u / 4096.0; + sh_v = mFaceInfos[faceNum].v / 4096.0; // the original vertex: Vector3 tmp = Vector3(pos.x, pos.y, pos.z); // The first vertex in the poly. - wr_coord_t& first = vertices[poly_indices[faceNum][0]]; //cell->face_maps[faceNum].flags + WRVector3& first = mVertices[mPolyIndices[faceNum][0]]; //cell->face_maps[faceNum].flags // converted to Ogre Vector3 Vector3 o_first = Vector3(first.x, first.y, first.z); @@ -265,7 +265,7 @@ vtx->texcoords[1] = ty; // ----------------- LIGHTMAP COORDS -------------------- - wr_coord_t& o_center = face_infos[faceNum].center; + WRVector3& o_center = mFaceInfos[faceNum].center; Vector3 center = Vector3(o_center.x, o_center.y, o_center.z); tmp = Vector3(pos.x, pos.y, pos.z); @@ -273,11 +273,11 @@ Vector3 orig = tmp; // for debugging, remove... // The scale defines the pixel size. Nothing else does - float scale = face_infos[faceNum].scale; + float scale = mFaceInfos[faceNum].scale; // lightmaps x,y sizes - const wr_light_info_t& li = mLights->getLightInfo(faceNum); + const WRLightInfo& li = mLights->getLightInfo(faceNum); unsigned int sz_x = li.lx; unsigned int sz_y = li.ly; @@ -316,9 +316,10 @@ //------------------------------------------------------------------------------------ Vector2 WRCell::calcLightmapDisplacement(int polyNum) { // ------------- Calculate the UV center displacement (as the poly center is off) + // This method is just a hack. We need to find a proper way to detect light map on polygon alignment // readout from the cell info - wr_coord_t _axu = face_infos[polyNum].ax_u; - wr_coord_t _axv = face_infos[polyNum].ax_v; + WRVector3 _axu = mFaceInfos[polyNum].axisU; + WRVector3 _axv = mFaceInfos[polyNum].axisV; // convert the vectors to the Ogre types @@ -335,9 +336,9 @@ // Precalculate the lightmap displacement. (To get the resulting lmap uv to 0-1 range) - for (int vert = 0; vert < face_maps[polyNum].count; vert++) { + for (int vert = 0; vert < mFaceMaps[polyNum].count; vert++) { // find the min and max coords in texture space - wr_coord_t coord = vertices[poly_indices[polyNum][vert]]; + WRVector3 coord = mVertices[mPolyIndices[polyNum][vert]]; Vector3 vcoord(coord.x, coord.y, coord.z); @@ -355,55 +356,6 @@ max_uv -= min_uv; return min_uv + max_uv / 2; - // return min_uv; - /* - - // Calculate the centroid of the polygon - // The zero index vertex UV space coord: - wr_coord_t coord = vertices[ poly_indices[polyNum][0] ]; - - Vector3 vcoord(coord.x, coord.y, coord.z); - - // To uv space - Vector2 zuv(nax_u.dotProduct(vcoord), nax_v.dotProduct(vcoord)); - - Vector2 center(0,0); - Real parea = 0; - - // Precalculate the lightmap displacement. (To get the resulting lmap uv to 0-1 range) - for (int vert = 1; vert < face_maps[polyNum].count - 1; vert++) { - // find the min and max coords in texture space - wr_coord_t coord = vertices[ poly_indices[polyNum][vert] ]; - - Vector3 vcoord(coord.x, coord.y, coord.z); - - // To uv space - Vector2 uvs(nax_u.dotProduct(vcoord), nax_v.dotProduct(vcoord)); - - // The next vertex - coord = vertices[ poly_indices[polyNum][vert+1] ]; - - - vcoord = Vector3(coord.x, coord.y, coord.z); - - // To uv space - Vector2 uvsn(nax_u.dotProduct(vcoord), nax_v.dotProduct(vcoord)); - - // Calculate the centroid of the triangle - Vector2 centroid = (uvs + uvsn + zuv) / 3; - - Vector2 disp1 = uvs-zuv; - Vector2 disp2 = uvsn-zuv; - Real area = disp1.x * disp2.y - disp1.y * disp2.x; - - center += centroid * area; - parea += area; - } - - center /= parea; - - return center; - */ } @@ -412,12 +364,12 @@ // some checks on the status. These are hard mistakes assert(mLoaded); - int portalStart = header.num_polygons - header.num_portals; + int portalStart = getFaceCount(); - for (int polyNum = portalStart; polyNum < header.num_textured; polyNum++) { + for (int polyNum = portalStart; polyNum < mHeader.numTextured; polyNum++) { // Prepare the object's name StringUtil::StrStreamType modelName; - modelName << "cell_" << cellNum << "_portal_" << polyNum; + modelName << "cell_" << mCellNum << "_portal_" << polyNum; // Each portal's mesh gets it's own manual object. This way we minimize the mesh attachments to hopefully minimal set ManualObject* manual = sceneMgr->createManualObject(modelName.str()); @@ -428,10 +380,10 @@ // getMaterialName(face_infos[polyNum].txt, lightMaps[polyNum]->getAtlasIndex(), dimensions, face_maps[polyNum].flags) - MaterialPtr mat = mMaterialService->getWRMaterialInstance(face_infos[polyNum].txt, - -1, face_maps[polyNum].flags); // mLightService->getAtlasForCellPolygon(cellNum, polyNum) + MaterialPtr mat = mMaterialService->getWRMaterialInstance(mFaceInfos[polyNum].txt, + -1, mFaceMaps[polyNum].flags); // mLightService->getAtlasForCellPolygon(cellNum, polyNum) - dimensions = mMaterialService->getTextureDimensions(face_infos[polyNum].txt); + dimensions = mMaterialService->getTextureDimensions(mFaceInfos[polyNum].txt); // begin inserting one polygon manual->begin(mat->getName()); @@ -441,24 +393,24 @@ // Hmm. I use a SceneNode centered at the polygon's center. Otherwise I get huge radius (from 0,0,0 of the sceneNode). - wr_coord_t polyCenter = face_infos[polyNum].center; + WRVector3 polyCenter = mFaceInfos[polyNum].center; Vector3 nodeCenter = Vector3(polyCenter.x, polyCenter.y, polyCenter.z); - wr_coord_t zero; + WRVector3 zero; zero.x = 0; zero.y = 0; zero.z = 0; // insertTexturedVertex(manual, polyNum, zero, displacement, dimensions, nodeCenter); // for each vertex, insert into the model - for (int vert = 0; vert < face_maps[polyNum].count; vert++) { - wr_coord_t vrelative = vertices[poly_indices[polyNum][vert]]; + for (int vert = 0; vert < mFaceMaps[polyNum].count; vert++) { + WRVector3 vrelative = mVertices[mPolyIndices[polyNum][vert]]; insertTexturedVertex(manual, polyNum, vrelative, displacement, dimensions, nodeCenter); } // now feed the indexes - for (int t = 1; t < face_maps[polyNum].count - 1; t++) { + for (int t = 1; t < mFaceMaps[polyNum].count - 1; t++) { // push back the indexes manual->index(0); manual->index(t); @@ -468,7 +420,7 @@ manual->end(); - LOG_DEBUG("Attaching cell water portal %d geometry...", cellNum); + LOG_DEBUG("Attaching cell water portal %d geometry...", mCellNum); // Attach the resulting object to the node with the center in the center vertex of the mesh... SceneNode* meshNode = sceneMgr->createSceneNode(modelName.str()); meshNode->setPosition(nodeCenter); @@ -483,35 +435,35 @@ meshNode->needUpdate(true); } - LOG_DEBUG(" - Attaching cell water portal %d geometry : done", cellNum); + LOG_DEBUG(" - Attaching cell water portal %d geometry : done", mCellNum); } } //------------------------------------------------------------------------------------ int WRCell::attachPortals(DarkSceneManager* smgr) { - assert(bspNode); + assert(mBSPNode); assert(!mPortalsDone); // The textured portals are both texturing source and portals. This solves the problems of that approach. - int PortalOffset = header.num_polygons - header.num_portals; + int PortalOffset = mHeader.numPolygons - mHeader.numPortals; // Number of removed vertices (This number indicates the count of vertices removed due to the // fact that the vector to the next vertex is the same (to some degree) as from the last one to here) int optimized = 0; - for (int portalNum = PortalOffset; portalNum < header.num_polygons; portalNum++) { + for (int portalNum = PortalOffset; portalNum < mHeader.numPolygons; portalNum++) { Ogre::Plane portalPlane; - portalPlane = getPlane(face_maps[portalNum].plane); + portalPlane = getPlane(mFaceMaps[portalNum].plane); - Portal *portal = smgr->createPortal(smgr->getBspLeaf(cellNum), smgr->getBspLeaf( - face_maps[portalNum].tgt_cell), portalPlane); + Portal *portal = smgr->createPortal(smgr->getBspLeaf(mCellNum), smgr->getBspLeaf( + mFaceMaps[portalNum].tgtCell), portalPlane); - for (int vert = 0; vert < face_maps[portalNum].count; vert++) { + for (int vert = 0; vert < mFaceMaps[portalNum].count; vert++) { // for each vertex of that poly - wr_coord_t coord = vertices[poly_indices[portalNum][vert]]; + WRVector3 coord = mVertices[mPolyIndices[portalNum][vert]]; portal->addPoint(coord.x, coord.y, coord.z); } // for each vertex @@ -527,7 +479,7 @@ // insert to the plane->(portal set) map std::pair<Ogre::BspNode::PlanePortalMap::iterator, bool> ptset = mPortalMap.insert( - Ogre::BspNode::PlanePortalMap::value_type(face_maps[portalNum].plane, Ogre::PortalList())); + Ogre::BspNode::PlanePortalMap::value_type(mFaceMaps[portalNum].plane, Ogre::PortalList())); ptset.first->second.insert(portal); } @@ -543,10 +495,10 @@ // Only the non-transparent geometry, please - no textured portals - int faceCount = header.num_polygons - header.num_portals; + int faceCount = mHeader.numPolygons - mHeader.numPortals; for (int polyNum = 0; polyNum < faceCount; polyNum++) { - total += face_maps[polyNum].count; + total += mFaceMaps[polyNum].count; } return total; @@ -562,10 +514,10 @@ // Only the non-transparent geometry, please - no textured portals - int faceCount = header.num_polygons - header.num_portals; + int faceCount = getFaceCount(); for (int polyNum = 0; polyNum < faceCount; polyNum++) { - int pvc = face_maps[polyNum].count; + int pvc = mFaceMaps[polyNum].count; assert(pvc > 2); total += 3 * (pvc - 2); } @@ -578,7 +530,7 @@ int WRCell::getFaceCount() { // this one is simple in the above mentioned scenario - return header.num_polygons - header.num_portals; + return mHeader.numPolygons - mHeader.numPortals; } @@ -594,18 +546,18 @@ // int faceCount = header.num_polygons - header.num_portals; - int faceCount = header.num_textured; + int faceCount = mHeader.numTextured; // Cell is recentered with this - wr_coord_t cellCenter = header.center; + WRVector3 cellCenter = mHeader.center; Vector3 nodeCenter = Vector3(cellCenter.x, cellCenter.y, cellCenter.z); // Now let's iterate over the materials // Prepare the object's name StringUtil::StrStreamType modelName; - modelName << "cell_" << cellNum; + modelName << "cell_" << mCellNum; // Attach the resulting object to the node with the center in the center vertex of the mesh... if (faceCount <= 0) { @@ -617,8 +569,8 @@ for (int polyNum = 0; polyNum < faceCount; polyNum++) { std::pair<Ogre::uint, Ogre::uint> dimensions; - MaterialPtr mat = mMaterialService->getWRMaterialInstance(face_infos[polyNum].txt, - mLightService->getAtlasForCellPolygon(cellNum, polyNum), face_maps[polyNum].flags); + MaterialPtr mat = mMaterialService->getWRMaterialInstance(mFaceInfos[polyNum].txt, + mLightService->getAtlasForCellPolygon(mCellNum, polyNum), mFaceMaps[polyNum].flags); // insert the poly index into the list of that material @@ -627,7 +579,7 @@ res.first->second.push_back(polyNum); - dimensions = mMaterialService->getTextureDimensions(face_infos[polyNum].txt); + dimensions = mMaterialService->getTextureDimensions(mFaceInfos[polyNum].txt); // Could be rather per material. But well. just for test anyway @@ -637,7 +589,7 @@ std::map<std::string, std::vector<int> >::iterator it = matToPolys.begin(); for (; it != matToPolys.end(); it++) { - DarkFragment* frag = mLevelGeometry->createFragment(cellNum, MaterialManager::getSingleton().getByName( + DarkFragment* frag = mLevelGeometry->createFragment(mCellNum, MaterialManager::getSingleton().getByName( it->first)); std::vector<int>::iterator pi = it->second.begin(); @@ -661,10 +613,10 @@ // for each vertex, insert into the model - uint32_t *idxmap = new uint32_t[face_maps[polyNum].count]; + uint32_t *idxmap = new uint32_t[mFaceMaps[polyNum].count]; - for (int vert = 0; vert < face_maps[polyNum].count; vert++) { - wr_coord_t vrelative = vertices[poly_indices[polyNum][vert]]; + for (int vert = 0; vert < mFaceMaps[polyNum].count; vert++) { + WRVector3 vrelative = mVertices[mPolyIndices[polyNum][vert]]; // insertTexturedVertex(manual, polyNum, vrelative, displacement, dimensions, nodeCenter); @@ -677,7 +629,7 @@ } // now feed the indexes - for (int t = 1; t < face_maps[polyNum].count - 1; t++) { + for (int t = 1; t < mFaceMaps[polyNum].count - 1; t++) { // push back the indexes frag->index(idxmap[0]); frag->index(idxmap[t + 1]); @@ -692,22 +644,22 @@ //------------------------------------------------------------------------------------ void WRCell::setBspNode(Ogre::BspNode* tgtNode) { - bspNode = tgtNode; - bspNode->setIsLeaf(true); + mBSPNode = tgtNode; + mBSPNode->setIsLeaf(true); - bspNode->_setCellFlags(header.cell_flags); + mBSPNode->_setCellFlags(mHeader.cellFlags); } //------------------------------------------------------------------------------------ Ogre::BspNode* WRCell::getBspNode() { - return bspNode; + return mBSPNode; } //------------------------------------------------------------------------------------ Ogre::Vector3 WRCell::getCenter() { - Vector3 center(header.center.x, header.center.y, header.center.z); + Vector3 center(mHeader.center.x, mHeader.center.y, mHeader.center.z); return center; } Modified: trunk/src/services/worldrep/WRCell.h =================================================================== --- trunk/src/services/worldrep/WRCell.h 2009-04-02 11:17:00 UTC (rev 1176) +++ trunk/src/services/worldrep/WRCell.h 2009-04-02 11:46:32 UTC (rev 1177) @@ -63,25 +63,25 @@ class OPDELIB_EXPORT WRCell { private: /** The cell number this cell represents */ - int cellNum; + int mCellNum; - wr_cell_hdr_t header; + WRCellHeader mHeader; /** the list of the cell's vertices (count is in the header) */ - wr_coord_t *vertices; + WRVector3 *mVertices; /** the list of the polygon map headers */ - wr_polygon_t *face_maps; + WRPolygon *mFaceMaps; /** the list of the face texturing infos */ - wr_polygon_texturing_t *face_infos; + WRPolygonTexturing *mFaceInfos; /** polygon mapping struct.. pointer to array of indices on each poly index poly_indices[0][0]... etc.*/ // uint32_t num_indices; - uint8_t **poly_indices; + uint8_t **mPolyIndices; /** Planes forming the cell */ - Ogre::Plane *planes; + Ogre::Plane *mPlanes; /** Indicates the fact that the cell data have already been loaded */ bool mLoaded; @@ -95,18 +95,18 @@ /** Inserts a new vertex into the manual object. Calculates all the UV values needed * @deprecated For moving towards the geometry by buffers */ - void insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, wr_coord_t pos, const Ogre::Vector2& displacement, + void insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, WRVector3 pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint >& dimensions, Ogre::Vector3 origin); /** Constructs a BSPVertex out of our data */ - void constructBspVertex(int faceNum, wr_coord_t pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint >& dimensions, BspVertex *vtx); + void constructBspVertex(int faceNum, WRVector3 pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint >& dimensions, BspVertex *vtx); /** Calculates the Lightmap center in texture space, using Bounding coordinates as the base. */ Ogre::Vector2 calcLightmapDisplacement(int polyNum); /** The bsp node constructed by this class. Filled with static geometry and otherwise initialized */ - Ogre::BspNode* bspNode; + Ogre::BspNode* mBSPNode; /** Owner service of this cell */ WorldRepService* mOwner; Modified: trunk/src/services/worldrep/WRTypes.h =================================================================== --- trunk/src/services/worldrep/WRTypes.h 2009-04-02 11:17:00 UTC (rev 1176) +++ trunk/src/services/worldrep/WRTypes.h 2009-04-02 11:46:32 UTC (rev 1177) @@ -35,41 +35,41 @@ typedef struct { // SIZE: 8 uint32_t unk; - uint32_t num_cells; - } wr_hdr_t; + uint32_t numCells; + } WRHeader; typedef struct { // SIZE: 8 float x; float y; float z; - } wr_coord_t; + } WRVector3; typedef struct { // SIZE: 31 - uint8_t num_vertices; // vertex count + uint8_t numVertices; // vertex count - uint8_t num_polygons; // total number of polygons - uint8_t num_textured; // textured polys count - uint8_t num_portals; // faces that define a portal... Count this number from face_maps to get the first index of portal + uint8_t numPolygons; // total number of polygons + uint8_t numTextured; // textured polys count + uint8_t numPortals; // faces that define a portal... Count this number from face_maps to get the first index of portal - uint8_t num_planes; // plane count - uint8_t media_type; // air == 1, water == 2 [TNH] - uint8_t cell_flags; // bit 6 is set in fog cells. bits 3+4 are set in doorways, probably for vision blocking [TNH]. bit 1 - wireframe + uint8_t numPlanes; // plane count + uint8_t mediaType; // air == 1, water == 2 [TNH] + uint8_t cellFlags; // bit 6 is set in fog cells. bits 3+4 are set in doorways, probably for vision blocking [TNH]. bit 1 - wireframe uint32_t nxn; // size of the weird struct in bytes? - uint16_t polymap_size; // this is repeated at the start of the polygon index list. you could do a sanity-check against it [TNH] - uint8_t num_anim_lights; // number of animated lights - animlm indexes length (the array before lightmap descriptors, indexing bits of animflags to light numbers) - uint8_t flow_group; // 0-no flow group, otherwise the flow group no. + uint16_t polymapSize; // this is repeated at the start of the polygon index list. you could do a sanity-check against it [TNH] + uint8_t numAnimLights; // number of animated lights - animlm indexes length (the array before lightmap descriptors, indexing bits of animflags to light numbers) + uint8_t flowGroup; // 0-no flow group, otherwise the flow group no. // cell's bounding sphere - wr_coord_t center; + WRVector3 center; float radius; // Only an approximation, but enough to guarantee that every point in the cell is enclosed by this sphere. - } wr_cell_hdr_t; + } WRCellHeader; typedef struct { // SIZE: 8 float x; float y; - } wr_coord_2d_t; + } WRVector2; typedef struct { // SIZE: 8 @@ -77,46 +77,46 @@ uint8_t count; // Polygon vertices count uint8_t plane; // plane number uint8_t unk; // seems zero - uint16_t tgt_cell; // target leaf for this portal... + uint16_t tgtCell; // target leaf for this portal... uint8_t unk1; // Cell motion related - uint8_t unk2; // Some flags... 41, FF... etc... - } wr_polygon_t; + uint8_t unk2; // Some flags... 41, FF... etc... (0x010 might be light map only render) + } WRPolygon; typedef struct { // SIZE: 12+12+12+12 = 48 - wr_coord_t ax_u; // U axis - wr_coord_t ax_v; // V axis - both directions of texture growth (e.g. U axis and V axis) - and they are not normalised! (in some way related to scale) + WRVector3 axisU; // U axis + WRVector3 axisV; // V axis - both directions of texture growth (e.g. U axis and V axis) - and they are not normalised! (in some way related to scale) int16_t u; // txt shift u (must divide by 1024 to get float number (and I dunno why, I had to invert it too)) int16_t v; // txt shift v uint8_t txt; // texture number (index to the texture list) - uint8_t origin_vtx; // the vertex index of the origin vertex - the vertex used as a reference for texturing - uint8_t unk[2]; + uint8_t originVertex; // the vertex index of the origin vertex - the vertex used as a reference for texturing + uint16_t unk; // something related to texture cache float scale; // scale of the texture - wr_coord_t center; - } wr_polygon_texturing_t; + WRVector3 center; + } WRPolygonTexturing; // a plane typedef struct { // SIZE: 16 - wr_coord_t normal; + WRVector3 normal; float d; - } wr_plane_t; + } WRPlane; /** Lightmap Information struct. */ typedef struct { // SIZE: 4+4+12 = 20 int16_t u; // LMAP U shift probably (if, then the same approach as in the wr_face_info_t) int16_t v; // LMAP V shift probably - uint16_t lx; // this is the dimension X + uint16_t lx; // this is the dimension X stored as a 16 bit value uint8_t ly; // this is the dimension Y - uint8_t unk; + uint8_t lx8; // 8bit version of lx - uint32_t static_lmap_ptr; // Static lightmap pointer in memory - ignored by us - uint32_t dynamic_lmap_ptr; // Dynamic lightmap pointer in memory - ignored by us + uint32_t staticLmapPtr; // Static lightmap pointer in memory - ignored by us + uint32_t dynamicLmapPtr; // Dynamic lightmap pointer in memory - ignored by us uint32_t animflags; // map of animlight lightmaps present - bit 1 means yes for that light - count ones, add 1 and you get the total num of lmaps for this lmap info - } wr_light_info_t; + } WRLightInfo; /** @@ -127,11 +127,11 @@ // I put those into one field, as Msvc and GCC differ in bitfield packing uint32_t ndn_fl; // uint8_t flags; // 0x100 == 1 -> leaf node - int32_t cell; // if Nonleaf, the splitting cells number - int32_t plane; // if Nonleaf, the splitting cells plane number - e.g. read nodes[cell].plane[plane] to get the plane you want + int32_t cell; // if non-leaf, the splitting cells number + int32_t plane; // if non-leaf, the splitting cells plane number - e.g. read nodes[cell].plane[plane] to get the plane you want uint32_t front; // Or Cell index if leaf node (or END if 0xFFFFFF) uint32_t back; // Not used in leaf node - } wr_BSP_node_t; + } WRBSPNode; #define _BSP_NODENUM(a) (a.ndn_fl & 0x00FFFFFF) #define _BSP_FLAGS(a) (a.ndn_fl >> 24) Modified: trunk/src/services/worldrep/WorldRepService.cpp =================================================================== --- trunk/src/services/worldrep/WorldRepService.cpp 2009-04-02 11:17:00 UTC (rev 1176) +++ trunk/src/services/worldrep/WorldRepService.cpp 2009-04-02 11:46:32 UTC (rev 1177) @@ -185,15 +185,15 @@ // ----------------------- The level loading methods follow void WorldRepService::loadFromChunk(FilePtr& wrChunk, size_t lightSize) { - wr_hdr_t header; - wrChunk->read(&header, sizeof(wr_hdr_t)); + WRHeader header; + wrChunk->read(&header, sizeof(WRHeader)); - mNumCells = header.num_cells; + mNumCells = header.numCells; - mCells = new WRCell*[header.num_cells]; + mCells = new WRCell*[header.numCells]; mWorldGeometry = mSceneMgr->createGeometry("LEVEL_GEOMETRY"); // will be deleted on clear_scene - mWorldGeometry->setCellCount(header.num_cells); + mWorldGeometry->setCellCount(header.numCells); for (uint32_t i = 0; i < mNumCells; i++) { mCells[i] = new WRCell(this, mWorldGeometry); @@ -202,7 +202,7 @@ mLightService->setLightPixelSize(lightSize); unsigned int idx; - for (idx = 0; idx < header.num_cells; idx++) { + for (idx = 0; idx < header.numCells; idx++) { // Load one Cell mCells[idx]->loadFromChunk(idx, wrChunk, lightSize); } @@ -210,8 +210,8 @@ // -- Load the extra planes wrChunk->read(&mExtraPlaneCount, sizeof(uint32_t)); - mExtraPlanes = new wr_plane_t[mExtraPlaneCount]; - wrChunk->read(mExtraPlanes, sizeof(wr_plane_t) * mExtraPlaneCount); + mExtraPlanes = new WRPlane[mExtraPlaneCount]; + wrChunk->read(mExtraPlanes, sizeof(WRPlane) * mExtraPlaneCount); // -------------------------------------------------------------------------------- // -- Load and process the BSP tree @@ -219,8 +219,8 @@ wrChunk->read(&BspRows, sizeof(uint32_t)); // Load the BSP, and construct it - wr_BSP_node_t *Bsp = new wr_BSP_node_t[BspRows]; - wrChunk->read(Bsp, BspRows * sizeof(wr_BSP_node_t)); + WRBSPNode *Bsp = new WRBSPNode[BspRows]; + wrChunk->read(Bsp, BspRows * sizeof(WRBSPNode)); // Create the BspTree createBSP(BspRows, Bsp); @@ -233,7 +233,7 @@ mLightService->build(); // assign the leaf nodes - for (idx = 0; idx < header.num_cells; idx++) { + for (idx = 0; idx < header.numCells; idx++) { BspNode* node = mSceneMgr->getBspLeaf(idx); mCells[idx]->setBspNode(node); } @@ -242,7 +242,7 @@ // Attach the portals to the BSP tree leafs int optimized = 0; - for (idx = 0; idx < header.num_cells; idx++) { + for (idx = 0; idx < header.numCells; idx++) { optimized += mCells[idx]->attachPortals(mSceneMgr); } @@ -250,7 +250,7 @@ // -------------------------------------------------------------------------------- // Build the portal meshes and cell geometry - for (idx = 0; idx < header.num_cells; idx++) { + for (idx = 0; idx < header.numCells; idx++) { mCells[idx]->constructPortalMeshes(mSceneMgr); mCells[idx]->createCellGeometry(); } @@ -269,10 +269,10 @@ // --------------------------------------------------------------------- - void WorldRepService::createBSP(unsigned int BspRows, wr_BSP_node_t *tree) { + void WorldRepService::createBSP(unsigned int BspRows, WRBSPNode *tree) { // First pass - creates all the BSP nodes for (unsigned int i = 0; i < BspRows; i++) { - const wr_BSP_node_t& wr_node = tree[i]; + const WRBSPNode& wr_node = tree[i]; if (_BSP_FLAGS(wr_node) & 0x01) { // leaf node mSceneMgr->createBspNode(i, wr_node.front); @@ -284,7 +284,7 @@ // Second Pass. Set front, back pointers on the tree split nodes for (unsigned int i = 0; i < BspRows; i++) { - const wr_BSP_node_t& wr_node = tree[i]; + const WRBSPNode& wr_node = tree[i]; // If this is a leaf node, go to next row @@ -339,7 +339,7 @@ //----------------------------------------------------------------------- - Ogre::Plane WorldRepService::constructPlane(wr_plane_t plane) { + Ogre::Plane WorldRepService::constructPlane(WRPlane plane) { Vector3 normal(plane.normal.x, plane.normal.y, plane.normal.z); float dist = plane.d; Ogre::Plane oplane; Modified: trunk/src/services/worldrep/WorldRepService.h =================================================================== --- trunk/src/services/worldrep/WorldRepService.h 2009-04-02 11:17:00 UTC (rev 1176) +++ trunk/src/services/worldrep/WorldRepService.h 2009-04-02 11:46:32 UTC (rev 1177) @@ -87,10 +87,10 @@ void setSkyBox(const FileGroupPtr& db); /** Internal method. Creates a BspNode instance tree, and supplies it to the sceneManager */ - void createBSP(unsigned int BspRows, wr_BSP_node_t *tree); + void createBSP(unsigned int BspRows, WRBSPNode *tree); /** Internal method. Constructs Ogre plane out of worldrep plane */ - Ogre::Plane constructPlane(wr_plane_t plane); + Ogre::Plane constructPlane(WRPlane plane); // TODO: Move this away... RenderService->getRoot? Ogre::Root *mRoot; @@ -102,7 +102,7 @@ WRCell** mCells; uint32_t mExtraPlaneCount; - wr_plane_t* mExtraPlanes; + WRPlane* mExtraPlanes; /** Cell count from header */ uint32_t mNumCells; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-05-26 12:56:48
|
Revision: 1203 http://opde.svn.sourceforge.net/opde/?rev=1203&view=rev Author: volca Date: 2009-05-26 12:56:40 +0000 (Tue, 26 May 2009) Log Message: ----------- service files are now explicitly listed to avoid problems (this also fixes some problems with adding new files - has to be done explicitely now) Modified Paths: -------------- trunk/src/services/Services.cmake Added Paths: ----------- trunk/src/services/binary/config.cmake trunk/src/services/config/config.cmake trunk/src/services/database/config.cmake trunk/src/services/draw/config.cmake trunk/src/services/game/config.cmake trunk/src/services/gui/config.cmake trunk/src/services/inherit/config.cmake trunk/src/services/input/config.cmake trunk/src/services/light/config.cmake trunk/src/services/link/config.cmake trunk/src/services/loop/config.cmake trunk/src/services/material/config.cmake trunk/src/services/object/config.cmake trunk/src/services/physics/config.cmake trunk/src/services/property/config.cmake trunk/src/services/render/config.cmake trunk/src/services/script/config.cmake trunk/src/services/sim/config.cmake trunk/src/services/worldrep/config.cmake Modified: trunk/src/services/Services.cmake =================================================================== --- trunk/src/services/Services.cmake 2009-05-26 07:31:45 UTC (rev 1202) +++ trunk/src/services/Services.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -5,7 +5,7 @@ ${OPDE_SOURCE_DIR}/src/services/ ${OPDE_SOURCE_DIR}/src/services/binary ${OPDE_SOURCE_DIR}/src/services/game - ${OPDE_SOURCE_DIR}/src/services/physics + ${OPDE_SOURCE_DIR}/src/services/physics ${OPDE_SOURCE_DIR}/src/services/config ${OPDE_SOURCE_DIR}/src/services/worldrep ${OPDE_SOURCE_DIR}/src/services/link @@ -44,8 +44,30 @@ OpdeDrawService ) -FILE(GLOB_RECURSE OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/*.h) -FILE(GLOB_RECURSE OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/*.cpp) -SET(OPDE_SERVICE_FILES ${OPDE_SERVICE_HEADERS} ${OPDE_SERVICE_SOURCES}) +# include the configuration from all the services (each config.cmake should append the OPDE_SERVICE_HEADERS and OPDE_SERVICE_SOURCES) +# that is done via: LIST(APPEND OPDE_SERVICE_SOURCES myfile.cpp) and simmilar... +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/binary/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/config/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/database/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/draw/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/game/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/gui/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/inherit/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/input/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/light/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/link/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/loop/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/material/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/object/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/physics/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/property/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/render/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/script/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/sim/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/worldrep/config.cmake ) +# join the variables +SET(OPDE_SERVICE_FILES ${OPDE_SERVICE_HEADERS}) +LIST(APPEND OPDE_SERVICE_FILES ${OPDE_SERVICE_SOURCES}) + # To use this, just do INCLUDE(${OPDE_SOURCE_DIR}/src/services/Services.cmake) Added: trunk/src/services/binary/config.cmake =================================================================== --- trunk/src/services/binary/config.cmake (rev 0) +++ trunk/src/services/binary/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/binary/BinaryService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/binary/BinaryService.h) Property changes on: trunk/src/services/binary/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/config/config.cmake =================================================================== --- trunk/src/services/config/config.cmake (rev 0) +++ trunk/src/services/config/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/config/ConfigService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/config/ConfigService.h) Property changes on: trunk/src/services/config/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/database/config.cmake =================================================================== --- trunk/src/services/database/config.cmake (rev 0) +++ trunk/src/services/database/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/database/DatabaseService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/database/DatabaseService.h) Property changes on: trunk/src/services/database/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/draw/config.cmake =================================================================== --- trunk/src/services/draw/config.cmake (rev 0) +++ trunk/src/services/draw/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,19 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/DrawBuffer.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/DrawCommon.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/DrawOperation.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/DrawService.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/DrawSheet.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/FontDrawSource.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/RenderedImage.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/RenderedLabel.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/draw/TextureAtlas.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/DrawBuffer.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/DrawCommon.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/DrawOperation.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/DrawService.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/DrawSheet.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/FontDrawSource.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/LGPalette.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/RenderedImage.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/RenderedLabel.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/draw/TextureAtlas.h) Property changes on: trunk/src/services/draw/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/game/config.cmake =================================================================== --- trunk/src/services/game/config.cmake (rev 0) +++ trunk/src/services/game/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/game/GameService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/game/GameService.h) Property changes on: trunk/src/services/game/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/gui/config.cmake =================================================================== --- trunk/src/services/gui/config.cmake (rev 0) +++ trunk/src/services/gui/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/gui/GUIService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/gui/GUIService.h) Property changes on: trunk/src/services/gui/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/inherit/config.cmake =================================================================== --- trunk/src/services/inherit/config.cmake (rev 0) +++ trunk/src/services/inherit/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,9 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/inherit/ArchetypeInheritor.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/inherit/CachedInheritor.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/inherit/InheritService.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/inherit/NeverInheritor.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/inherit/ArchetypeInheritor.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/inherit/CachedInheritor.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/inherit/InheritCommon.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/inherit/InheritService.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/inherit/NeverInheritor.h) Property changes on: trunk/src/services/inherit/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/input/config.cmake =================================================================== --- trunk/src/services/input/config.cmake (rev 0) +++ trunk/src/services/input/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,4 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/input/InputEventMapper.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/input/InputService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/input/InputEventMapper.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/input/InputService.h) Property changes on: trunk/src/services/input/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/light/config.cmake =================================================================== --- trunk/src/services/light/config.cmake (rev 0) +++ trunk/src/services/light/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/light/LightService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/light/LightService.h) Property changes on: trunk/src/services/light/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/link/config.cmake =================================================================== --- trunk/src/services/link/config.cmake (rev 0) +++ trunk/src/services/link/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,5 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/link/LinkService.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/link/Relation.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/link/LinkCommon.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/link/LinkService.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/link/Relation.h) Property changes on: trunk/src/services/link/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/loop/config.cmake =================================================================== --- trunk/src/services/loop/config.cmake (rev 0) +++ trunk/src/services/loop/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/loop/LoopService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/loop/LoopService.h) Property changes on: trunk/src/services/loop/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/material/config.cmake =================================================================== --- trunk/src/services/material/config.cmake (rev 0) +++ trunk/src/services/material/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/material/MaterialService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/material/MaterialService.h) Property changes on: trunk/src/services/material/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/object/config.cmake =================================================================== --- trunk/src/services/object/config.cmake (rev 0) +++ trunk/src/services/object/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,6 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/object/ObjectService.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/object/PositionPropertyStorage.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/object/SymNamePropertyStorage.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/object/ObjectService.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/object/PositionPropertyStorage.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/object/SymNamePropertyStorage.h) Property changes on: trunk/src/services/object/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/physics/config.cmake =================================================================== --- trunk/src/services/physics/config.cmake (rev 0) +++ trunk/src/services/physics/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/physics/PhysicsService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/physics/PhysicsService.h) Property changes on: trunk/src/services/physics/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/property/config.cmake =================================================================== --- trunk/src/services/property/config.cmake (rev 0) +++ trunk/src/services/property/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,5 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/property/PropertyGroup.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/property/PropertyService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/property/PropertyCommon.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/property/PropertyGroup.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/property/PropertyService.h) Property changes on: trunk/src/services/property/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/render/config.cmake =================================================================== --- trunk/src/services/render/config.cmake (rev 0) +++ trunk/src/services/render/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,23 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/EntityMaterialInstance.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/HasRefsProperty.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/MaterialInstance.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/ModelNameProperty.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/ModelScaleProperty.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/RenderAlphaProperty.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/RenderedProperty.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/RenderService.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/RenderTypeProperty.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/SubEntityMaterialInstance.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/render/ZBiasProperty.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/EntityMaterialInstance.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/HasRefsProperty.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/jorge.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/MaterialInstance.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/ModelNameProperty.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/ModelScaleProperty.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/RenderAlphaProperty.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/RenderedProperty.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/RenderService.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/RenderTypeProperty.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/SubEntityMaterialInstance.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/render/ZBiasProperty.h) Property changes on: trunk/src/services/render/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/script/config.cmake =================================================================== --- trunk/src/services/script/config.cmake (rev 0) +++ trunk/src/services/script/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/script/ScriptService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/script/ScriptService.h) Property changes on: trunk/src/services/script/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/sim/config.cmake =================================================================== --- trunk/src/services/sim/config.cmake (rev 0) +++ trunk/src/services/sim/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/sim/SimService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/sim/SimService.h) Property changes on: trunk/src/services/sim/config.cmake ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/worldrep/config.cmake =================================================================== --- trunk/src/services/worldrep/config.cmake (rev 0) +++ trunk/src/services/worldrep/config.cmake 2009-05-26 12:56:40 UTC (rev 1203) @@ -0,0 +1,8 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/worldrep/LightmapAtlas.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/worldrep/WorldRepService.cpp) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/worldrep/WRCell.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/worldrep/LightmapAtlas.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/worldrep/WorldRepService.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/worldrep/WRCell.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/worldrep/WRCommon.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/worldrep/WRTypes.h) Property changes on: trunk/src/services/worldrep/config.cmake ___________________________________________________________________ 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...> - 2009-06-01 19:55:53
|
Revision: 1211 http://opde.svn.sourceforge.net/opde/?rev=1211&view=rev Author: volca Date: 2009-06-01 19:55:46 +0000 (Mon, 01 Jun 2009) Log Message: ----------- a really simple key repeat implemented, the key off for non-on/off events removed. Modified Paths: -------------- trunk/src/services/input/InputService.cpp trunk/src/services/input/InputService.h trunk/src/services/loop/LoopService.h Modified: trunk/src/services/input/InputService.cpp =================================================================== --- trunk/src/services/input/InputService.cpp 2009-06-01 10:17:36 UTC (rev 1210) +++ trunk/src/services/input/InputService.cpp 2009-06-01 19:55:46 UTC (rev 1211) @@ -56,6 +56,13 @@ mLoopClientDef.name = mName; mCurrentMapper = new InputEventMapper(this); + + mCurrentKey = OIS::KC_UNASSIGNED; + mKeyPressTime = 0.0f; + mInitialDelay = 0.4f; // TODO: Read these from the config service + mRepeatDelay = 0.3f; + + mNonExclusive = false; } //------------------------------------------------------ @@ -407,12 +414,12 @@ paramList.insert( std::make_pair( std::string( "WINDOW" ), windowHndStr.str())); // Non-exclusive input - for debugging purposes - bool nonex = false; + bool mNonExclusive = false; if (mConfigService->hasParam("nonexclusive")) - nonex = mConfigService->getParam("nonexclusive").toBool(); + mNonExclusive = mConfigService->getParam("nonexclusive").toBool(); - if (nonex) + if (mNonExclusive) { #if defined OIS_WIN32_PLATFORM paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" ))); @@ -507,9 +514,33 @@ { // TODO: For now. The code will move here for 0.3 captureInputs(); + + // Process the key repeat (but only for exclusive input) + if (!mNonExclusive) + processKeyRepeat(deltaTime/1000.0f); // loop time is in milis } //------------------------------------------------------ + void InputService::processKeyRepeat(float deltaTime) { + if (mCurrentKey == OIS::KC_UNASSIGNED) + return; + + mKeyPressTime += deltaTime; + + assert(mCurrentDelay > 0); + assert(mRepeatDelay > 0); + + // see if we overlapped + while (mKeyPressTime > mRepeatDelay) { + mKeyPressTime -= mCurrentDelay; + mCurrentDelay = mRepeatDelay; + + if (mInputMode == IM_MAPPED) + processKeyEvent(mCurrentKey, IET_KEYBOARD_HOLD); + } + } + + //------------------------------------------------------ void InputService::setBindContext(const std::string& context) { InputEventMapperPtr iemp = findMapperForContext(context); @@ -637,67 +668,72 @@ } //------------------------------------------------------ - void InputService::processKeyEvent(const OIS::KeyEvent &e, InputEventType t) - { + void InputService::processKeyEvent(unsigned int keyCode, InputEventType t) { // Some safety checks if (mInputMode == IM_DIRECT) return; - + if (mCurrentMapper.isNull()) { LOG_ERROR("InputService::processKeyEvent: Mapped input, but no mapper set for the current state!"); return; } - - // dispatch the key event using the mapper - unsigned int key = (unsigned int)e.key; - + if (mKeyboard->isModifierDown(Keyboard::Alt)) - key |= ALT_MOD; + keyCode |= ALT_MOD; + if (mKeyboard->isModifierDown(Keyboard::Ctrl)) - key |= CTRL_MOD; + keyCode |= CTRL_MOD; + if (mKeyboard->isModifierDown(Keyboard::Shift)) - key |= SHIFT_MOD; - + keyCode |= SHIFT_MOD; + std::string command; - CommandMap::const_iterator it = mCommandMap.find(key); - - if (it != mCommandMap.end()) - { + CommandMap::const_iterator it = mCommandMap.find(keyCode); + + if (it != mCommandMap.end()) { command = it->second; - } else { + } else { LOG_DEBUG("Encountered an unmapped key event '%s'", e.text); return; } - + InputEventMsg msg; - std::pair<string, string> Split = splitCommand(command); - + std::pair<string, string> Split = splitCommand(command); + msg.command = Split.first; msg.params = Split.second; msg.event = t; - - if (command[0] == '+') - { + + if (command[0] == '+') { if (t == IET_KEYBOARD_PRESS) msg.params = 1.0f; + else if (t == IET_KEYBOARD_RELEASE) + msg.params = 0.0f; else - msg.params = 0.0f; + // no processing for keyboard hold + return; + command = command.substr(1); - } - else if (command[0] == '-') - { + } else if (command[0] == '-') { if (t == IET_KEYBOARD_PRESS) msg.params = 0.0f; + else if (t == IET_KEYBOARD_RELEASE) + msg.params = 1.0f; else - msg.params = 1.0f; + // no processing for keyboard hold + return; command = command.substr(1); + } else if (t == IET_KEYBOARD_RELEASE) { + // no key release for the non-on/off type events + return; } - + if (!callCommandTrap(msg)) { - LOG_DEBUG("Encountered an unmapped key event '%s'", e.text); + LOG_DEBUG("Encountered an unmapped key event '%d'", keyCode); } } + //------------------------------------------------------ void InputService::processJoyMouseEvent(unsigned int id, InputEventType event) { @@ -838,12 +874,16 @@ //------------------------------------------------------ bool InputService::keyPressed(const OIS::KeyEvent &e) { + // TODO: We could use a key filter to detect if the key is repeatable + mCurrentKey = e.key; + mKeyPressTime = 0; + mCurrentDelay = mInitialDelay; if (mInputMode == IM_DIRECT) { if (mDirectListener) // direct event, dispatch to the current listener return mDirectListener->keyPressed(e); } else { - processKeyEvent(e, IET_KEYBOARD_PRESS); + processKeyEvent(static_cast<unsigned int>(e.key), IET_KEYBOARD_PRESS); } return false; @@ -852,12 +892,15 @@ //------------------------------------------------------ bool InputService::keyReleased(const OIS::KeyEvent &e) { + if (e.key == mCurrentKey) + mCurrentKey = OIS::KC_UNASSIGNED; + if (mInputMode == IM_DIRECT) { if (mDirectListener) // direct event, dispatch to the current listener return mDirectListener->keyReleased(e); } else { - processKeyEvent(e, IET_KEYBOARD_RELEASE); + processKeyEvent(static_cast<unsigned int>(e.key), IET_KEYBOARD_RELEASE); } return false; Modified: trunk/src/services/input/InputService.h =================================================================== --- trunk/src/services/input/InputService.h 2009-06-01 10:17:36 UTC (rev 1210) +++ trunk/src/services/input/InputService.h 2009-06-01 19:55:46 UTC (rev 1211) @@ -235,6 +235,9 @@ void shutdown(); void loopStep(float deltaTime); + + /// Processes key repeats, calls processKeyEvent on appropriate delays + void processKeyRepeat(float deltaTime); void initKeyMap(); void tokenize(std::string , std::vector<std::string> &OutVector, char Token); @@ -254,7 +257,7 @@ std::pair<std::string, std::string> splitCommand(const std::string& cmd) const; /// Processes the received key event with current mapper, and if it finds a match, sends an event - void processKeyEvent(const OIS::KeyEvent &e, InputEventType t); + void processKeyEvent(unsigned int keyCode, InputEventType t); void processJoyMouseEvent(unsigned int Id, InputEventType Event); @@ -333,6 +336,17 @@ /// Current direct listener /// TODO: Maybe this will become a stack DirectInputListener* mDirectListener; + + /// Key Repeat: Initial delay (between first and second key repeats) + float mInitialDelay; + /// Key Repeat: Repeat delay (between second and latter key repeats) + float mRepeatDelay; + /// Key Repeat: Current key time + float mKeyPressTime; + /// Key Repeat: Current target delay time + float mCurrentDelay; + /// Key Repeat: Current key pressed + OIS::KeyCode mCurrentKey; // Input system related objects /// OIS input system @@ -355,6 +369,9 @@ /// Loop service pointer LoopServicePtr mLoopService; + + /// Non-exclusive input + bool mNonExclusive; }; /// Shared pointer to input service Modified: trunk/src/services/loop/LoopService.h =================================================================== --- trunk/src/services/loop/LoopService.h 2009-06-01 10:17:36 UTC (rev 1210) +++ trunk/src/services/loop/LoopService.h 2009-06-01 19:55:46 UTC (rev 1211) @@ -111,7 +111,7 @@ virtual void loopModeEnded(const LoopModeDefinition& loopMode); /** Loop step event. Called every frame by the active loop mode, if this mode is the member of the new mode - * @param deltaTime The time that passed since the start of the last frame to the start of this frame + * @param deltaTime The time (in miliseconds) that passed since the start of the last frame to the start of this frame */ virtual void loopStep(float deltaTime) = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-07-27 10:18:01
|
Revision: 1224 http://opde.svn.sourceforge.net/opde/?rev=1224&view=rev Author: volca Date: 2009-07-27 10:17:55 +0000 (Mon, 27 Jul 2009) Log Message: ----------- oops. Fixing the breakage introduced by last few commits Modified Paths: -------------- trunk/src/services/inherit/InheritService.cpp trunk/src/services/link/Relation.cpp trunk/src/services/link/Relation.h Modified: trunk/src/services/inherit/InheritService.cpp =================================================================== --- trunk/src/services/inherit/InheritService.cpp 2009-07-27 09:51:23 UTC (rev 1223) +++ trunk/src/services/inherit/InheritService.cpp 2009-07-27 10:17:55 UTC (rev 1224) @@ -461,7 +461,7 @@ //------------------------------------------------------ void InheritService::_createMPLink(int objID, int srcID, int priority) { - mMetaPropRelation->createWithValue(objID, srcID, DVariant(m)); + mMetaPropRelation->createWithValue(objID, srcID, DVariant(priority)); } //-------------------------- Factory implementation Modified: trunk/src/services/link/Relation.cpp =================================================================== --- trunk/src/services/link/Relation.cpp 2009-07-27 09:51:23 UTC (rev 1223) +++ trunk/src/services/link/Relation.cpp 2009-07-27 10:17:55 UTC (rev 1224) @@ -475,6 +475,30 @@ } // -------------------------------------------------------------------------- + link_id_t Relation::createWithValue(int from, int to, const DVariant& value) { + // Request an id. First let's see what concreteness we have + unsigned int cidx = 0; + + if (from >= 0 || to >= 0) + cidx = 1; + + link_id_t id = getFreeLinkID(cidx); + + LinkPtr newl(new Link(id, from, to, mID)); + + mStorage->createWithValue(id, value); + + // Last, insert the link to the database and notify + _addLink(newl); + + LinkPtr ilink = createInverseLink(newl); + + mInverse->_addLink(ilink); + + return id; + } + + // -------------------------------------------------------------------------- void Relation::remove(link_id_t id) { // A waste I smell here. Maybe there will be a difference in Broadcasts later _removeLink(id); Modified: trunk/src/services/link/Relation.h =================================================================== --- trunk/src/services/link/Relation.h 2009-07-27 09:51:23 UTC (rev 1223) +++ trunk/src/services/link/Relation.h 2009-07-27 10:17:55 UTC (rev 1224) @@ -112,6 +112,17 @@ * @todo Some relations could be limited to one link between obect pair(!). This could be */ link_id_t createWithValues(int from, int to, const DVariantStringMap& dataValues); + + /** Creates a new link, returning it's ID + * @param from The source object ID of this link + * @param to The destination obect ID of this link + * @param values The data value to inject into the link data upon creation (only valid for single-value data) + * @note This version of link creation does initialize the Link data with predefined value + * @return the id of the newly created link (The concreteness of the link is autodetected given the from and to values (both < 0 - non concrete, otherwise concrete)) + * @note Broadcasts the link creation message + * @todo Some relations could be limited to one link between obect pair(!). This could be + */ + link_id_t createWithValue(int from, int to, const DVariant& value); /** Sets the link data field * @param id The link id This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-08-27 11:55:15
|
Revision: 1230 http://opde.svn.sourceforge.net/opde/?rev=1230&view=rev Author: volca Date: 2009-08-27 11:55:05 +0000 (Thu, 27 Aug 2009) Log Message: ----------- adding room service stub Added Paths: ----------- trunk/src/services/room/ trunk/src/services/room/Room.cpp trunk/src/services/room/Room.h trunk/src/services/room/RoomCommon.h trunk/src/services/room/RoomPortal.cpp trunk/src/services/room/RoomPortal.h trunk/src/services/room/RoomService.cpp trunk/src/services/room/RoomService.h trunk/src/services/room/config.cmake Added: trunk/src/services/room/Room.cpp =================================================================== --- trunk/src/services/room/Room.cpp (rev 0) +++ trunk/src/services/room/Room.cpp 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "Room.h" + +namespace Opde { + + Room::Room() { + + } + + Room::~Room() { + + } +} + Property changes on: trunk/src/services/room/Room.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/room/Room.h =================================================================== --- trunk/src/services/room/Room.h (rev 0) +++ trunk/src/services/room/Room.h 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,51 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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$ + * + *****************************************************************************/ +/** @file Room.h + * @brief A single room in room database. + */ + +#ifndef __ROOM_H +#define __ROOM_H + +#include "config.h" +#include "SharedPtr.h" + +namespace Opde { + /** @brief A single Room. Rooms are space bounded elements that are used + * for sound propagation, path finding and as a script message sources. + */ + class OPDELIB_EXPORT Room { + public: + Room(); + ~Room(); + + private: + + }; + + /// Shared pointer to a room instance + typedef shared_ptr<Room> RoomPtr; +} + + +#endif Property changes on: trunk/src/services/room/Room.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/room/RoomCommon.h =================================================================== --- trunk/src/services/room/RoomCommon.h (rev 0) +++ trunk/src/services/room/RoomCommon.h 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,160 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __ROOMCOMMON_H +#define __ROOMCOMMON_H + +namespace Opde { + /* Room service structures - as specified by Telliamed */ + struct DarkDBChunkROOM_DB + { + uint32_t version; // 0x01 + uint32_t num_rooms; + + void read(const FilePtr& f) { + f->read(&version, sizeof(uint32_t)); + f->read(&num_rooms, sizeof(uint32_t)); + } + + void write(const FilePtr& f) { + f->write(&version, sizeof(uint32_t)); + f->write(&num_rooms, sizeof(uint32_t)); + } + }; + + struct DarkDBRoom + { + sint32_t id; // object ID + sint16_t room; // room number + DVector3 center; // should not be in solid space or overlapping another room + DPlane plane[6]; + uint32_t num_portals; + //DarkDBRoomPortal portals[] + // A matrix of portal-to-portal distances, calculated as the linear distance + // between each pair of portal centers. + //float distances[] // num_portals**2 + //uint32 num_lists // The number of count+arrays that follow. Usually 2. + //DarkDBIDList lists[] + // There are usually two lists. + // The first is the IDs of all objects that are in this room. + // The second is the object IDs of creatures in this room. + // (The IDs should be in both lists, unless you know of an AI that isn't an object.) + + void read(const FilePtr& f) { + f->read(&id, sizeof(uint32_t)); + f->read(&room, sizeof(sint16_t)); + center.read(f); + + for (size_t i = 0; i < 6; ++i) + plane[i].read(f); + + f->read(&num_portals, sizeof(uint32_t)); + } + + void write(const FilePtr& f) { + f->write(&id, sizeof(uint32_t)); + f->write(&room, sizeof(sint16_t)); + center.write(f); + + for (size_t i = 0; i < 6; ++i) + plane[i].write(f); + + f->write(&num_portals, sizeof(uint32_t)); + } + }; + + struct DarkDBRoomPortal + { + sint32_t id; // portal ID + uint32_t index; // The index of this portal in the room's portal list + DPlane plane; + uint32_t num_edges; + + Plane* edge; // all planes follow at this point (num_edges) + + sint32_t dest_room; // room number this portal goes to + sint32_t src_room; // this room number + DVector3 center; // center point of the portal. (should not be in solid space) + sint32_t dest_portal; // portal ID on the other side of this portal + + DarkDBRoomPortal() { + id = -1; + index = 0; + num_edges = 0; + edge = NULL; + dest_room = -1; + src_room = -1; + dest_portal = -1; + } + + ~DarkDBRoomPortal() { + delete[] edge; + } + + void read(const FilePtr& f) { + f->read(&id, sizeof(sint32_t)); + f->read(&index, sizeof(uint32_t)); + plane.read(f); + + f->read(&num_edges, sizeof(uint32_t)); + + delete[] edge; // to be sure + edge = new DPlane[num_edges]; + for (size_t i = 0; i < num_edges; ++i) + edge[i].read(f); + + // tail + f->read(&dest_room, sizeof(sint32_t)); + f->read(&src_room, sizeof(sint32_t)); + + center.read(f); + + f->read(&dest_portal, sizeof(sint32_t)); + } + + void write(const FilePtr& f) { + f->write(&id, sizeof(sint32_t)); + f->write(&index, sizeof(uint32_t)); + plane.write(f); + + f->write(&num_edges, sizeof(uint32_t)); + + assert(edge); + for (size_t i = 0; i < num_edges; ++i) + edge[i].write(f); + + // tail + f->write(&dest_room, sizeof(sint32_t)); + f->write(&src_room, sizeof(sint32_t)); + + center.write(f); + + f->write(&dest_portal, sizeof(sint32_t)); + } + }; + +} + + +#endif Property changes on: trunk/src/services/room/RoomCommon.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/room/RoomPortal.cpp =================================================================== --- trunk/src/services/room/RoomPortal.cpp (rev 0) +++ trunk/src/services/room/RoomPortal.cpp 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "RoomPortal.h" + +namespace Opde { + RoomPortal::RoomPortal() { + + } + + RoomPortal::~RoomPortal() { + + } +} + + Property changes on: trunk/src/services/room/RoomPortal.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/room/RoomPortal.h =================================================================== --- trunk/src/services/room/RoomPortal.h (rev 0) +++ trunk/src/services/room/RoomPortal.h 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,48 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __ROOMPORTAL_H +#define __ROOMPORTAL_H + +#include "config.h" +#include "SharedPtr.h" + +namespace Opde { + /** @brief A room portal. Room portals connect two Room instances (doorways) + */ + class OPDELIB_EXPORT RoomPortal { + public: + RoomPortal(); + ~RoomPortal(); + + private: + + }; + + /// Shared pointer to a room portal instance + typedef shared_ptr<RoomPortal> RoomPortalPtr; +} + + +#endif Property changes on: trunk/src/services/room/RoomPortal.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/room/RoomService.cpp =================================================================== --- trunk/src/services/room/RoomService.cpp (rev 0) +++ trunk/src/services/room/RoomService.cpp 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,106 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "RoomService.h" +#include "OpdeException.h" +#include "ServiceCommon.h" +#include "logger.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*-------------------- RoomService -------------------*/ + /*----------------------------------------------------*/ + template<> const size_t ServiceImpl<RoomService>::SID = __SERVICE_ID_ROOM; + + RoomService::RoomService(ServiceManager *manager, const std::string& name) : ServiceImpl< Opde::RoomService >(manager, name) { + } + + //------------------------------------------------------ + RoomService::~RoomService() { + } + + + //------------------------------------------------------ + bool RoomService::init() { + return true; + } + + + //------------------------------------------------------ + void RoomService::bootstrapFinished() { + mDbService = GET_SERVICE(DatabaseService); + mDbService->registerListener(this, DBP_ROOM); + } + + //------------------------------------------------------ + void RoomService::shutdown() { + mDbService->unregisterListener(this); + mDbService.setNull(); + } + + //------------------------------------------------------ + void RoomService::onDBLoad(const FileGroupPtr& db, uint32_t curmask) { + LOG_INFO("RoomService::onDBLoad called."); + // STUB + } + + //------------------------------------------------------ + void RoomService::onDBSave(const FileGroupPtr& db, uint32_t tgtmask) { + LOG_INFO("RoomService::onDBSave called."); + // STUB + } + + //------------------------------------------------------ + void RoomService::onDBDrop(uint32_t dropmask) { + LOG_INFO("RoomService::onDBDrop called."); + // STUB + } + + //-------------------------- Factory implementation + std::string RoomServiceFactory::mName = "RoomService"; + + RoomServiceFactory::RoomServiceFactory() : ServiceFactory() { + ServiceManager::getSingleton().addServiceFactory(this); + }; + + const std::string& RoomServiceFactory::getName() { + return mName; + } + + const uint RoomServiceFactory::getMask() { + return SERVICE_ENGINE; + } + + const size_t RoomServiceFactory::getSID() { + return RoomService::SID; + } + + Service* RoomServiceFactory::createInstance(ServiceManager* manager) { + return new RoomService(manager, mName); + } + +} Property changes on: trunk/src/services/room/RoomService.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/room/RoomService.h =================================================================== --- trunk/src/services/room/RoomService.h (rev 0) +++ trunk/src/services/room/RoomService.h 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,98 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __ROOMSERVICE_H +#define __ROOMSERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "DatabaseService.h" +#include "FileGroup.h" +#include "SharedPtr.h" + +namespace Opde { + /** @brief Room service - service providing a Room database. + * Room database is a high level system that classifies object positions into 'rooms'. + * @note This service listens to object positions + * @note This service is a source of script messages + */ + class OPDELIB_EXPORT RoomService : public ServiceImpl<RoomService>, DatabaseListener { + public: + /// Constructor + RoomService(ServiceManager *manager, const std::string& name); + + /// Destructor + virtual ~RoomService(); + + protected: + // service related + bool init(); + void bootstrapFinished(); + void shutdown(); + + /** Database load callback + * @see DatabaseListener::onDBLoad */ + void onDBLoad(const FileGroupPtr& db, uint32_t curmask); + + /** Database save callback + * @see DatabaseListener::onDBSave */ + void onDBSave(const FileGroupPtr& db, uint32_t tgtmask); + + /** Database drop callback + * @see DatabaseListener::onDBDrop */ + void onDBDrop(uint32_t dropmask); + + + private: + /// Database service + DatabaseServicePtr mDbService; + }; + + /// Shared pointer to Room service + typedef shared_ptr<RoomService> RoomServicePtr; + + + /// Factory for the RoomService objects + class OPDELIB_EXPORT RoomServiceFactory : public ServiceFactory { + public: + RoomServiceFactory(); + ~RoomServiceFactory() {}; + + /** Creates a RoomService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + + virtual const size_t getSID(); + private: + static std::string mName; + }; +} + + +#endif Property changes on: trunk/src/services/room/RoomService.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/room/config.cmake =================================================================== --- trunk/src/services/room/config.cmake (rev 0) +++ trunk/src/services/room/config.cmake 2009-08-27 11:55:05 UTC (rev 1230) @@ -0,0 +1,7 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/room/RoomService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/room/RoomService.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/room/Room.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/room/Room.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/room/RoomPortal.h) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/room/RoomPortal.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/room/RoomCommon.h) Property changes on: trunk/src/services/room/config.cmake ___________________________________________________________________ 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...> - 2009-08-27 13:22:35
|
Revision: 1239 http://opde.svn.sourceforge.net/opde/?rev=1239&view=rev Author: volca Date: 2009-08-27 12:13:06 +0000 (Thu, 27 Aug 2009) Log Message: ----------- * rewritten the database service to use DatabaseListener class, a more comfy approach * the database loader now more similar to the dark one and uses FILE_TYPE * The DarkCommon.h header introduced to the other files (with a warm welcome) * maybe some other small edits too... Modified Paths: -------------- trunk/src/services/Services.cmake trunk/src/services/database/DatabaseService.cpp trunk/src/services/database/DatabaseService.h trunk/src/services/game/GameService.cpp trunk/src/services/gui/config.cmake trunk/src/services/inherit/CachedInheritor.cpp trunk/src/services/input/InputService.cpp trunk/src/services/light/LightService.h trunk/src/services/material/MaterialService.cpp trunk/src/services/material/MaterialService.h trunk/src/services/object/ObjectService.cpp trunk/src/services/object/ObjectService.h trunk/src/services/render/RenderService.cpp trunk/src/services/render/RenderService.h trunk/src/services/worldrep/WRCell.cpp trunk/src/services/worldrep/WRCell.h trunk/src/services/worldrep/WRTypes.h trunk/src/services/worldrep/WorldRepService.cpp trunk/src/services/worldrep/WorldRepService.h Modified: trunk/src/services/Services.cmake =================================================================== --- trunk/src/services/Services.cmake 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/Services.cmake 2009-08-27 12:13:06 UTC (rev 1239) @@ -60,6 +60,7 @@ INCLUDE( ${OPDE_SOURCE_DIR}/src/services/material/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/object/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/physics/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/room/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/property/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/render/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/script/config.cmake ) Modified: trunk/src/services/database/DatabaseService.cpp =================================================================== --- trunk/src/services/database/DatabaseService.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/database/DatabaseService.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -54,49 +54,87 @@ //------------------------------------------------------ DatabaseService::~DatabaseService() { } - + //------------------------------------------------------ - void DatabaseService::load(const std::string& filename) { + void DatabaseService::load(const std::string& filename, uint32_t loadMask) { LOG_DEBUG("DatabaseService::load - Loading requested file %s", filename.c_str()); - // if there is another database in hold - if (!mCurDB.isNull()) - unload(); - - // Try to find the database - mCurDB = getDBFileNamed(filename); - mLoadingStatus.reset(); - - // TODO: Overall coarse step - calculated from TagFile Count * mListeners.size() - mLoadingStatus.totalCoarse = mListeners.size() * 2; - - // Currently hardcoded to mission db - _loadMissionDB(mCurDB); - + + // drop first + unload(DBM_COMPLETE); + + // do a recursive load as needed + recursiveMergeLoad(filename, loadMask); + LOG_DEBUG("DatabaseService::load - end()"); } //------------------------------------------------------ - void DatabaseService::loadGameSys(const std::string& filename) { - LOG_DEBUG("DatabaseService::loadGameSys - Loading requested file %s", filename.c_str()); + void DatabaseService::recursiveMergeLoad(const std::string& filename, uint32_t loadMask) { + // load the database, but see for the parents first + LOG_DEBUG("DatabaseService::recursiveMergeLoad - Recurse load of file %s", filename.c_str()); - // if there is another database in hold - if (!mCurDB.isNull()) - unload(); + FileGroupPtr db = getDBFileNamed(filename); + + // the coarse count is lifted every call to ensure all the databases are counted + mLoadingStatus.totalCoarse++; + + uint32_t ft = getFileType(db); + + const char* parentDbTag = getParentDBTagName(ft); + + if (parentDbTag != NULL) { + // load the parent first + // but filter out any bits overriden by overlay database + // this is to ensure that .sav data will be loaded instead of .mis, for example + + std::string parentFile = loadFileNameFromTag(db, parentDbTag); + recursiveMergeLoad(parentFile, loadMask & ~ft); + } + + broadcastOnDBLoad(db, ft & loadMask); + } + + //------------------------------------------------------ + void DatabaseService::mergeLoad(const std::string& filename, uint32_t loadMask) { + FileGroupPtr db = getDBFileNamed(filename); + uint32_t ft = getFileType(db); + + LOG_DEBUG("DatabaseService::mergeLoad - Merge load of file %s", filename.c_str()); + + mLoadingStatus.reset(); + mLoadingStatus.totalCoarse++; + + broadcastOnDBLoad(db, ft & loadMask); + + LOG_DEBUG("DatabaseService::mergeLoad - end()"); + } + + //------------------------------------------------------ + void DatabaseService::save(const std::string& filename, uint32_t saveMask) { + // just prepare the progress and delegate to the broadcast + FilePtr fp = FilePtr(new StdFile(filename, File::FILE_RW)); + FileGroupPtr tgtdb = FileGroupPtr(new DarkFileGroup(fp)); + + LOG_DEBUG("DatabaseService::save - Save to file %s, mask %X", filename.c_str(), saveMask); - // Try to find the database - mCurDB = getDBFileNamed(filename); - mLoadingStatus.reset(); - - // TODO: Overall coarse step - calculated from TagFile Count * mListeners.size() - mLoadingStatus.totalCoarse = mListeners.size(); - - // Currently hardcoded to mission db - _loadGameSysDB(mCurDB); + mLoadingStatus.totalCoarse++; + + broadcastOnDBSave(tgtdb, saveMask); + } + + //------------------------------------------------------ + void DatabaseService::unload(uint32_t dropMask) { + LOG_DEBUG("DatabaseService::unload"); + + broadcastOnDBDrop(dropMask); + + /// Wipe out the file we used + mCurDB.setNull(); - LOG_DEBUG("DatabaseService::loadGameSys - end()"); + LOG_DEBUG("DatabaseService::unload - end()"); } //------------------------------------------------------ @@ -109,26 +147,6 @@ } //------------------------------------------------------ - void DatabaseService::unload() { - LOG_DEBUG("DatabaseService::unload"); - DatabaseChangeMsg m; - - m.change = DBC_DROPPING; - m.dbtype = DBT_COMPLETE; - m.dbtarget = DBT_COMPLETE; // No meaning here, at least now. - // ^ It could be used to unload f.e. only mission or savegame, thus saving reload. This is a nice subject to think about, yes - - m.db = mCurDB; - - broadcastMessageReversed(m); - - /// Wipe out the files we used - mCurDB.setNull(); - - LOG_DEBUG("DatabaseService::unload - end()"); - } - - //------------------------------------------------------ void DatabaseService::fineStep(int count) { // recalculate the status mLoadingStatus.overallFine += count; @@ -141,67 +159,124 @@ (*mProgressListener)(mLoadingStatus); } } + + //------------------------------------------------------ + void DatabaseService::registerListener(DatabaseListener* listener, size_t priority) { + mListeners.insert(std::make_pair(priority, listener)); + } + + //------------------------------------------------------ + void DatabaseService::unregisterListener(DatabaseListener* listener) { + Listeners::iterator it = mListeners.begin(); + while (it != mListeners.end()) { + + if (it->second == listener) { + Listeners::iterator rem = it++; + mListeners.erase(rem); + } else { + it++; + } + } + } + //------------------------------------------------------ - void DatabaseService::_loadMissionDB(const FileGroupPtr& db) { - LOG_DEBUG("DatabaseService::_loadMissionDB"); + uint32_t DatabaseService::getFileType(const FileGroupPtr& db) { + // TODO: load FILE_TYPE for the first parameter + FilePtr fttag = db->getFile("FILE_TYPE"); + + if (fttag.isNull()) { + // TODO: Exception, rather + LOG_FATAL("Database file did not contain FILE_TYPE tag"); + return 0; + } + + + if (fttag->size() < sizeof(uint32_t)) { + // TODO: Exception, rather + LOG_FATAL("Database file did contain an invalid FILE_TYPE tag"); + return 0; + } + + uint32_t filetype; + + fttag->readElem(&filetype, sizeof(uint32_t)); + + return filetype; + } - // Get the gamesys, load - // GAM_FILE - FilePtr fdm = db->getFile("GAM_FILE"); + //------------------------------------------------------ + const char* DatabaseService::getParentDBTagName(uint32_t fileType) { + // fixed for now + if (fileType == DBM_FILETYPE_SAV) + return "MIS_FILE"; + + if (fileType == DBM_FILETYPE_MIS) + return "GAM_FILE"; + + return NULL; + } + + //------------------------------------------------------ + std::string DatabaseService::loadFileNameFromTag(const Opde::FileGroupPtr& db, const char* tagname) { + FilePtr fdm = db->getFile(tagname); - // never happened size_t gft_size = fdm->size(); - char* data = new char[gft_size + 1]; - + + std::string res; + + char* data = NULL; + + data = new char[gft_size + 1]; data[0] = 0x0; data[gft_size] = 0x0; - fdm->read(data, fdm->size()); + fdm->read(data, fdm->size()); // TODO: Catch exception - FileGroupPtr gs = getDBFileNamed(data); - - delete[] data; - - _loadGameSysDB(gs); - - // Load the Mission - // Create a DB change message, and broadcast - DatabaseChangeMsg m; - - m.change = DBC_LOADING; - m.dbtype = DBT_MISSION; - m.dbtarget = DBT_MISSION; // TODO: Hardcoded - m.db = db; - - broadcastMessage(m); + res = std::string(data); + + delete data; + + + return res; } //------------------------------------------------------ - void DatabaseService::_loadGameSysDB(const FileGroupPtr& db) { - LOG_DEBUG("DatabaseService::_loadGameSysDB"); - - // Create a DB change message, and broadcast - DatabaseChangeMsg m; - - m.change = DBC_LOADING; - m.dbtype = DBT_GAMESYS; - m.dbtarget = DBT_MISSION; // TODO: Hardcoded - m.db = db; - - broadcastMessage(m); + void DatabaseService::broadcastOnDBLoad(const FileGroupPtr& db, uint32_t curmask) { + Listeners::iterator it = mListeners.begin(); + + for (; it != mListeners.end(); ++it) { + unsigned long sttime = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); + + // Inform about the load + it->second->onDBLoad(db, curmask); + + unsigned long now = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); + + LOG_INFO("DatabaseService: Operation took %f seconds", (float)(now-sttime) / 1000); + + // recalculate the status + mLoadingStatus.currentCoarse++; + + mLoadingStatus.recalc(); + + // call the progress listener if it is set + if (!mProgressListener.isNull()) { + (*mProgressListener)(mLoadingStatus); + } + } } - - + //------------------------------------------------------ - void DatabaseService::broadcastMessage(const DatabaseChangeMsg& msg) { + void DatabaseService::broadcastOnDBSave(const FileGroupPtr& db, uint32_t tgtmask) { Listeners::iterator it = mListeners.begin(); - for (; it != mListeners.end(); ++it) { unsigned long sttime = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); - // Use the callback functor to fire the callback - (*it->second)(msg); + + // Inform about the save + it->second->onDBSave(db, tgtmask); + unsigned long now = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); LOG_INFO("DatabaseService: Operation took %f seconds", (float)(now-sttime) / 1000); @@ -217,14 +292,20 @@ } } } - + //------------------------------------------------------ - void DatabaseService::broadcastMessageReversed(const DatabaseChangeMsg& msg) { + void DatabaseService::broadcastOnDBDrop(uint32_t dropmask) { Listeners::reverse_iterator it = mListeners.rbegin(); - + for (; it != mListeners.rend(); ++it) { - // Use the callback functor to fire the callback - (*it->second)(msg); + unsigned long sttime = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); + + // Inform about the drop + it->second->onDBDrop(dropmask); + + unsigned long now = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); + + LOG_INFO("DatabaseService: Operation took %f seconds", (float)(now-sttime) / 1000); // recalculate the status mLoadingStatus.currentCoarse++; @@ -237,7 +318,7 @@ } } } - + //-------------------------- Factory implementation std::string DatabaseServiceFactory::mName = "DatabaseService"; Modified: trunk/src/services/database/DatabaseService.h =================================================================== --- trunk/src/services/database/DatabaseService.h 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/database/DatabaseService.h 2009-08-27 12:13:06 UTC (rev 1239) @@ -45,19 +45,83 @@ DBC_DROPPING } DatabaseChangeType; - /// Database types + + /* + * FILE_TYPE [*] [*] + * Magic-number of file. + * Seems to be a bitmap representing what chunks might + * appear in the file, but I can't find any specific associations. + * Some archaic COWs I have used only the high-word. + +struct DarkDBChunkFILE_TYPE +{ + uint32 type; +}; +#define FILE_TYPE_VBR 0x00000500 // 0000 0000 0101 +#define FILE_TYPE_SAV 0x00011900 // 0001 0001 1001 +#define FILE_TYPE_MIS 0x00031900 // 0011 0001 1001 +#define FILE_TYPE_GAM 0x00040200 // 0100 0000 0010 +#define FILE_TYPE_COW 0x00071F00 // 0111 0001 1111 +#define FILE_TYPE_MASK_ARCHAIC 0xFFFF0000 +// bit 8 - not on GAM +// bit 9 - only on GAM +// bit 10 - only on VBR +// bit 11 - only on MIS/SAV +// bit 12 - only on MIS/SAV +// bit 16 - MIS/SAV +// bit 17 - MIS +// bit 18 - GAM + */ + + /** Database type encoding. Designed to be compatible with the FILE_TYPE tag for later replacement. + * All this info derived directly from Telliamed's DarkUtils FILE_TYPE description (Thanks again for all the work). + * + * [....:....|....:.A98|7654:3210|....:....] + * + * The high 3 bits (A98) contain historical data distribution guidelines: (A == ABSTRACT OBJECTS, 9==MISSON DATA, 8==CONCRETE OBJECTS) + * + * The Second lowest byte contains newer data separation guidelines (to be combined with the high word): + * + * Concrete data : bit 1 (1). Active on databases that contain concrete object tree + * Abstract data : bit 2 (2). Active on databases that contain gamesys (abstract object tree and other abstract definitions - recipes) + * VBR data : bit 3 (4). Active only on VBR databases - that contain brush lists + * + */ typedef enum { - /// Game system database - DBT_GAMESYS = 1, - /// Mission file database - DBT_MISSION, - /// Savegame database - DBT_SAVEGAME, + /// Contains concrete objects (not necessarily object database!) + DBM_CONCRETE = 0x0100, + /// Contains Abstract objects + DBM_ABSTRACT = 0x0200, + /// Multibrush database - indicates multibrushes/minibrushes are present - VBR files have this (those have 0x0500 mask to be precise). Verified. + DBM_MBRUSHES = 0x0400, + /// Unknown. Present in cow only + DBM_UNKNOWN1 = 0x0800, + /// Contains concrete objects/links/properties, probably (or maybe AI state, sound propagation state, dunno...). A Mask because I can't yet separate which is what + DBM_CONCRETE_OLP = 0x11900, // TODO: Decompose this one + // High level bits (old encoding): + /// Concrete object mask + DBM_OBJTREE_CONCRETE = 0x010000, + /// Mission data present mask + DBM_MIS_DATA = 0x020000, + /// Gamesys data present + DBM_OBJTREE_GAMESYS = 0x040000, /// A complete - full database (e.g. VBR, also means all for DB_DROPPING) - DBT_COMPLETE - } DatabaseType; + DBM_COMPLETE = 0x071F00, + // File types follow + /// GAM file type + DBM_FILETYPE_GAM = 0x040200, + /// VBR file type + DBM_FILETYPE_VBR = 0x000500, + /// SAV file type + DBM_FILETYPE_SAV = 0x011900, + /// MIS file type + DBM_FILETYPE_MIS = 0x031900, + /// COW file type + DBM_FILETYPE_COW = 0x071F00, + } DatabaseMask; /// The database change message + /* struct DatabaseChangeMsg { /// A change requested to happen DatabaseChangeType change; @@ -68,6 +132,7 @@ /// The pointer to the database file to be used FileGroupPtr db; }; + */ /// Progress report of database loading. This is what the Progress Listener get's every now and then to update the display @@ -95,6 +160,22 @@ overallFine = 0; } }; + + // Forward decl. + class DatabaseService; + + /** Listener for database events. Pure abstract + * @todo We need flags for various parts of the object system (compatible with the mask 'FILE_TYPE' in tag file databases) + */ + class DatabaseListener { + friend class DatabaseService; + + protected: + virtual void onDBLoad(const FileGroupPtr& db, uint32_t curmask) = 0; + virtual void onDBSave(const FileGroupPtr& db, uint32_t tgtmask) = 0; + virtual void onDBDrop(uint32_t dropmask) = 0; + + }; /** @brief Database service - service which handles dark database loading and saving * Typically, a service wanting to handle database events will register as a listener, and handle the events given from this service. @@ -102,19 +183,25 @@ * @li Mission loading will drop with DB_COMPLETE * @li Savegame loading will have DB_SAVEGAME as dbtarget (so the services handling savegame related chunks will not process the mission's chunks) */ - class OPDELIB_EXPORT DatabaseService : public ServiceImpl<DatabaseService>, public PrioritizedMessageSource<DatabaseChangeMsg> { + class OPDELIB_EXPORT DatabaseService : public ServiceImpl<DatabaseService> { public: DatabaseService(ServiceManager *manager, const std::string& name); virtual ~DatabaseService(); - /// Loads a game database. Can be either savegame, or mission - void load(const std::string& filename); + /// High-level load. Loads a game database including parent databases as needed, dropping previous loaded data + void load(const std::string& filename, uint32_t loadMask); - /// Loads a game system. drops all current data - void loadGameSys(const std::string& filename); - - /// Unload the game data. Release all the data that are connected to a game's mission in progress - void unload(); + /// Loads a game database without dropping any data + void mergeLoad(const std::string& filename, uint32_t loadMask); + + /// Recursive load of all databases in hierarchy, without dropping + void recursiveMergeLoad(const std::string& filename, uint32_t loadMask); + + /// Saves a game database, writing all data fitting the specified mask + void save(const std::string& filename, uint32_t loadMask); + + /// Unload the game data. Release all the data fitting the mask specified + void unload(uint32_t dropMask); /// Listener that receives events every now and then while loading typedef Callback<DatabaseProgressMsg> ProgressListener; @@ -131,32 +218,58 @@ /// A free to use fine step function that calls the Progress Listener to reflect the loading progress /// Use this especially in some long-to load services void fineStep(int count); - void mLoadingStaus(); + /** Registers a listener. + * @param listener A pointer to the listening class + * @param priority desired loading priority (order) of the listener + * @note The same pointer has to be supplied to the unregisterListener in order to succeed with unregistration + */ + void registerListener(DatabaseListener* listener, size_t priority); + + /** Unregisters a listener. + * @param listener ID returned by the registerListener call + * @note The pointer has to be the same as the one supplied to the registerListener + */ + void unregisterListener(DatabaseListener* listener); + protected: virtual bool init(); + + /** Reads the File_Type tag from the specified database. + * @param db The database to load the tag value from + * @return the FILE_TYPE first 4 bytes as uint32_t, or 0 if something bad happens (not found, tag too short) + */ + uint32_t getFileType(const FileGroupPtr& db); /// Retrieve a readonly database file by it's name FileGroupPtr getDBFileNamed(const std::string& filename); - /// Load and assign a mission database to the db (has to be a SaveGame), then loads the gamesys for the loaded miss file - void _loadMissionDB(const FileGroupPtr& db); - - /// Load and assign a gamesys database to the db (has to be a mission or savegame) - void _loadGameSysDB(const FileGroupPtr& db); - - /// Overriden broadcast to support progress reports - virtual void broadcastMessage(const DatabaseChangeMsg& msg); - - /// a reverse order message broadcaster - this one is used in unloading - virtual void broadcastMessageReversed(const DatabaseChangeMsg& msg); - + /** Gets the database tag name containing the file name of the parent database based on the FILE_TYPE value */ + const char* getParentDBTagName(uint32_t fileType); + + /** loads a file name from the specified tag */ + std::string loadFileNameFromTag(const FileGroupPtr& db, const char* tagname); + + /// Calls onDBLoad on all listeners obeying priorities + void broadcastOnDBLoad(const FileGroupPtr& db, uint32_t curmask); + + /// Calls onDBLoad on all listeners obeying priorities + void broadcastOnDBSave(const FileGroupPtr& db, uint32_t tgtmask); + + /// Calls onDBLoad on all listeners obeying priorities + void broadcastOnDBDrop(uint32_t dropmask); + FileGroupPtr mCurDB; /// Used to report to the Progress Listener DatabaseProgressMsg mLoadingStatus; ProgressListenerPtr mProgressListener; + + /// Map of db. load listeners + typedef std::multimap< size_t, DatabaseListener* > Listeners; + + Listeners mListeners; }; /// Shared pointer to Database service Modified: trunk/src/services/game/GameService.cpp =================================================================== --- trunk/src/services/game/GameService.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/game/GameService.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -51,7 +51,7 @@ //------------------------------------------------------ void GameService::load(const std::string& filename) { - mDbService->load(filename); + mDbService->load(filename, DBM_COMPLETE); } //-------------------------- Factory implementation Modified: trunk/src/services/gui/config.cmake =================================================================== --- trunk/src/services/gui/config.cmake 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/gui/config.cmake 2009-08-27 12:13:06 UTC (rev 1239) @@ -1,2 +1,4 @@ LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/gui/GUIService.cpp) LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/gui/GUIService.h) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/gui/ConsoleGUI.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/gui/ConsoleGUI.h) Modified: trunk/src/services/inherit/CachedInheritor.cpp =================================================================== --- trunk/src/services/inherit/CachedInheritor.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/inherit/CachedInheritor.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -80,7 +80,7 @@ // First, get the old effective ID int oldEffID = getEffectiveID(objID); - // Let' vote for a new effective object ID + // Let's vote for a new effective object ID InheritQueryResultPtr sources = mInheritService->getSources(objID); int maxPrio = -1; // no inheritance indicator itself @@ -171,7 +171,12 @@ //------------------------------------------------------ void CachedInheritor::onInheritMsg(const InheritChangeMsg& msg) { - // Received an even about inheritance change. Must refresh target object of such change + if (msg.change == INH_CLEARED_ALL) { + clear(); + return; + } + + // Received an even about inheritance change. Must refresh target object of such change refresh(msg.dstID); } Modified: trunk/src/services/input/InputService.cpp =================================================================== --- trunk/src/services/input/InputService.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/input/InputService.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -695,7 +695,7 @@ if (it != mCommandMap.end()) { command = it->second; } else { - LOG_DEBUG("Encountered an unmapped key event '%s'", e.text); + LOG_DEBUG("Encountered an unmapped key event %d", keyCode); return; } Modified: trunk/src/services/light/LightService.h =================================================================== --- trunk/src/services/light/LightService.h 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/light/LightService.h 2009-08-27 12:13:06 UTC (rev 1239) @@ -33,6 +33,7 @@ #include "File.h" #include "DarkLight.h" #include "LightmapAtlas.h" +#include "DarkCommon.h" #include "WRTypes.h" #include "OpdeServiceManager.h" #include "Array.h" @@ -45,8 +46,8 @@ namespace Opde { struct LightTableEntry { LightTableEntry(const FilePtr& tag, bool rgb) { - tag->readElem(&pos, sizeof(float), 3); - tag->readElem(&rot, sizeof(float), 3); + pos.read(tag); + rot.read(tag); if (rgb) { tag->readElem(&brightness, sizeof(float), 3); @@ -60,9 +61,9 @@ tag->readElem(&radius, sizeof(float)); }; - WRVector3 pos; // 12 - WRVector3 rot; // 12 - 24 - WRVector3 brightness; // 4 - 28 + DVector3 pos; // 12 + DVector3 rot; // 12 - 24 + DVector3 brightness; // 4 - 28 float cone_inner; // 4 - 32 - TODO: This is cos(alpha), not radians! float cone_outer; // 4 - 36 float radius; // 4 - 40 Modified: trunk/src/services/material/MaterialService.cpp =================================================================== --- trunk/src/services/material/MaterialService.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/material/MaterialService.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -382,11 +382,9 @@ mFamilies = NULL; // db listener registration - mDbCallback = DatabaseService::ListenerPtr(new ClassCallback<DatabaseChangeMsg, MaterialService> (this, &MaterialService::onDBChange)); - mDatabaseService = GET_SERVICE(DatabaseService); - mDatabaseService->registerListener(mDbCallback, DBP_MATERIAL); + mDatabaseService->registerListener(this, DBP_MATERIAL); mLightService = GET_SERVICE(LightService); @@ -394,6 +392,12 @@ } + //------------------------------------------------------ + void MaterialService::shutdown() { + if (!mDatabaseService.isNull()) + mDatabaseService->unregisterListener(this); + } + //----------------------------------------------------------------------- void MaterialService::loadFlowTextures(const FileGroupPtr& db) { // Load the TXLIST chunk from the resource mission file. @@ -640,23 +644,28 @@ } } - //------------------------------------------------------ - void MaterialService::onDBChange(const DatabaseChangeMsg& m) { - LOG_INFO("MaterialService::onDBChange called."); - if (m.change == DBC_DROPPING) { + void MaterialService::onDBLoad(const FileGroupPtr& db, uint32_t curmask) { + LOG_INFO("MaterialService::onDBLoad called."); + + // see if we're facing a mission file + if (curmask & DBM_MIS_DATA) + loadMaterials(db); + } + + //------------------------------------------------------ + void MaterialService::onDBSave(const FileGroupPtr& db, uint32_t tgtmask) { + LOG_INFO("MaterialService::onDBSave called."); + // TODO: Save the materials to the database + } + + //------------------------------------------------------ + void MaterialService::onDBDrop(uint32_t tgtdrop) { + LOG_INFO("MaterialService::onDBDrop called."); + // if mission or gamesys is dropped, + // drop here as well + if (tgtdrop & DBM_MIS_DATA) clear(); - return; - } - - if (m.change == DBC_LOADING && m.dbtype == DBT_MISSION) { - // If there is some scene already, clear it - clear(); - - - // Initialize materials here: - loadMaterials(m.db); - } } Modified: trunk/src/services/material/MaterialService.h =================================================================== --- trunk/src/services/material/MaterialService.h 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/material/MaterialService.h 2009-08-27 12:13:06 UTC (rev 1239) @@ -80,7 +80,7 @@ /** @brief Material Service - Service which handles materials for terrain and objects - their loading, unloading, cloning, etc. */ - class OPDELIB_EXPORT MaterialService : public ServiceImpl<MaterialService> { + class OPDELIB_EXPORT MaterialService : public ServiceImpl<MaterialService>, public DatabaseListener { public: /** Constructor * @param manager The ServiceManager that created this service @@ -129,9 +129,24 @@ /// @see Service::bootstrapFinished void bootstrapFinished(); + + /// @see Service::shutdown + void shutdown(); /// DB load/unload event callback method - void onDBChange(const DatabaseChangeMsg& m); + // void onDBChange(const DatabaseChangeMsg& m); +// + /** Database load callback + * @see DatabaseListener::onDBLoad */ + void onDBLoad(const FileGroupPtr& db, uint32_t curmask); + + /** Database save callback + * @see DatabaseListener::onDBSave */ + void onDBSave(const FileGroupPtr& db, uint32_t tgtmask); + + /** Database drop callback + * @see DatabaseListener::onDBDrop */ + void onDBDrop(uint32_t dropmask); /** Called by loadMaterials. Load the FLOW_TEX and initializes \@templateXXXX according to IN and OUT texture numbers and names. Needs material definitions * named water/AAAA_in and water/AAAA_out where AAAA is the expected flow texture name (usualy bl, gr, l2, l3, l4) */ @@ -177,9 +192,6 @@ // Texture scale setter (for custom texture overrides) void setWRTextureScale(unsigned int idx, std::pair<float, float> scale); - /// Database callback - DatabaseService::ListenerPtr mDbCallback; - /// Database service DatabaseServicePtr mDatabaseService; Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/object/ObjectService.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -43,14 +43,13 @@ template<> const size_t ServiceImpl<ObjectService>::SID = __SERVICE_ID_OBJECT; ObjectService::ObjectService(ServiceManager *manager, const std::string& name) : ServiceImpl< Opde::ObjectService >(manager, name), - mAllocatedObjects(-6144, 2048), + mAllocatedObjects(), mDatabaseService(NULL), mObjVecVerMaj(0), // Seems to be the same for all versions mObjVecVerMin(2), mSceneMgr(NULL), mSymNameStorage(NULL), mPositionStorage(NULL) { - } //------------------------------------------------------ @@ -210,9 +209,12 @@ //------------------------------------------------------ void ObjectService::grow(int minID, int maxID) { + LOG_DEBUG("ObjectService::grow: Growing id pool to %d - %d (old size %d-%d)", minID, maxID, + mAllocatedObjects.getMinIndex(), mAllocatedObjects.getMaxIndex()); + // grow the allocated objects to have enough room for new object flags mAllocatedObjects.grow(minID, maxID); - + // grow the Properties mPropertyService->grow(minID, maxID); @@ -257,10 +259,8 @@ mServiceManager->createByMask(SERVICE_OBJECT_LISTENER); // Register as a database listener - mDbCallback = DatabaseService::ListenerPtr(new ClassCallback<DatabaseChangeMsg, ObjectService>(this, &ObjectService::onDBChange)); - mDatabaseService = GET_SERVICE(DatabaseService); - mDatabaseService->registerListener(mDbCallback, DBP_OBJECT); + mDatabaseService->registerListener(this, DBP_OBJECT); mInheritService = GET_SERVICE(InheritService); mLinkService = GET_SERVICE(LinkService); @@ -270,7 +270,7 @@ //------------------------------------------------------ void ObjectService::shutdown() { if (!mDatabaseService.isNull()) - mDatabaseService->unregisterListener(mDbCallback); + mDatabaseService->unregisterListener(this); mPropertyService.setNull(); mLinkService.setNull(); @@ -282,50 +282,62 @@ } //------------------------------------------------------ - void ObjectService::onDBChange(const DatabaseChangeMsg& m) { - if (m.change == DBC_DROPPING) { - // TODO: Clear the object mapping, broadcast the 'objects are being released' change - _clear(0x03); - } else if (m.change == DBC_LOADING) { - // TODO: Load the object mapping bitmap (16 categories, although just 0 abstract, 1 concrete are in use) - // NOTE: Just the given range is used (based on the bitmap of the file - bit 0 abstract objs, bit 1 concrete objs) - // NOTE: Upon loading a savegame, skip the mission file as the property and link services do it - // NOTE: A good idea would probably be to introduce loadmask (for quicksaves - archetypes would stay intact f.e.) - // NOTE: Original dark always saves complete bitmap, although the mission loadout will overwrite the part which is concrete - // NOTE: Use the same config parameter name here to avoid confusion (If needed, that is): obj_min, obj_max (ID's) - // NOTE: Two pass search for free ID's would be nice: first look into the stack of free id's, then iterate the object bitmap and find first zero - uint loadMask = 0x03; - - // No loading of objsys in mission if savegame is the target... - if (m.dbtarget == DBT_SAVEGAME && m.dbtype == DBT_MISSION) - return; - - // Not loading an empty mission, ignore the concretes of the GAMESYS! - if (m.dbtype == DBT_GAMESYS && m.dbtarget != DBT_GAMESYS) { - loadMask = 0x01; - } - - if (m.dbtype == DBT_MISSION || m.dbtype == DBT_SAVEGAME) - loadMask = 0x02; - - _load(m.db, loadMask); - } else if (m.change == DBC_SAVING) { - // Write the object allocation bitmap, whole (as original dark does it) - uint savemask = 0x03; // whole system (archetypes and concretes) - - if (m.dbtarget == DBT_GAMESYS) - savemask = 0x01; - - if (m.dbtarget == DBT_MISSION) - savemask = 0x02; - - _save(m.db, savemask); - } + void ObjectService::onDBLoad(const FileGroupPtr& db, uint32_t curmask) { + LOG_INFO("ObjectService::onDBLoad called."); + + uint loadMask = 0x00; + + // curtype contains the database's FILE_TYPE value. We use it to decide what to load + if (curmask & DBM_OBJTREE_CONCRETE) + loadMask |= 0x02; + + if (curmask & DBM_OBJTREE_GAMESYS) + loadMask |= 0x01; + + if (loadMask != 0x00) + _load(db, loadMask); } + + //------------------------------------------------------ + void ObjectService::onDBSave(const FileGroupPtr& db, uint32_t tgtmask) { + LOG_INFO("ObjectService::onDBSave called."); + + uint saveMask = 0x00; + + // curtype contains the database's FILE_TYPE value. We use it to decide what to load + if (tgtmask & DBM_OBJTREE_CONCRETE) + saveMask |= 0x02; + + if (tgtmask & DBM_OBJTREE_GAMESYS) + saveMask |= 0x01; + + if (saveMask != 0x00) + _save(db, saveMask); + } + + //------------------------------------------------------ + void ObjectService::onDBDrop(uint32_t dropmask) { + LOG_INFO("ObjectService::onDBDrop called."); + // if mission or gamesys is dropped, + // drop here as well + + uint mask = 0x00; + + // curtype contains the database's FILE_TYPE value. We use it to decide what to load + if (dropmask & DBM_OBJTREE_CONCRETE) + mask |= 0x02; + + if (dropmask & DBM_OBJTREE_GAMESYS) + mask |= 0x01; + + if (dropmask != 0x00) + _clear(mask); + } //------------------------------------------------------ void ObjectService::_load(const FileGroupPtr& db, uint loadMask) { + LOG_VERBOSE("ObjectService::_load Called on %s with %d", db->getName().c_str(), loadMask); // Load min, max obj id, then the rest of the FilePtr as a bitmap data. Those then are unpacked to ease the use int32_t minID, maxID; @@ -337,6 +349,7 @@ f->readElem(&maxID, 4); LOG_DEBUG("ObjectService: ObjVec MinID %d, MaxID %d", minID, maxID); + assert(minID <= maxID); if ((minID & 0x07) != 0) { // compensate the start bits. not aligned to byte @@ -374,7 +387,7 @@ * Now I don't want to do any dirty handling of this issue, so all code has to be prepared for this */ - // Processes one byte a time + // Processes all the new ID's for(id = minID; id < maxID ; ++id) { if (fileObjs[id]) { LOG_VERBOSE("Found object ID %d", id); @@ -425,6 +438,8 @@ //------------------------------------------------------ void ObjectService::_clear(uint clearMask) { + LOG_DEBUG("ObjectService::clear Clear called with mask %d", clearMask); + // Only bit idx 0 and 1 are used bool clearArchetypes = clearMask & 0x01; bool clearConcretes = (clearMask & 0x02) || clearArchetypes; Modified: trunk/src/services/object/ObjectService.h =================================================================== --- trunk/src/services/object/ObjectService.h 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/object/ObjectService.h 2009-08-27 12:13:06 UTC (rev 1239) @@ -82,7 +82,7 @@ * @todo OBJECT_CREATE_STARTED message type for those services needing a preparation for object creation (for example render service will create a SceneNode at that time, so it can update it's position and orientation when loading Position properties) */ - class OPDELIB_EXPORT ObjectService : public ServiceImpl<ObjectService>, public MessageSource<ObjectServiceMsg> { + class OPDELIB_EXPORT ObjectService : public ServiceImpl<ObjectService>, public MessageSource<ObjectServiceMsg>, public DatabaseListener { public: ObjectService(ServiceManager *manager, const std::string& name); @@ -98,7 +98,7 @@ /// Good to use when wanting to prevent broadcasting of the creation before the properties/links are set int beginCreate(int archetype); - /// finalises the creation if the given object (only broadcasts that object was created) + /// finalises the creation of the given object (only broadcasts that object was created) void endCreate(int objID); /// Returns true if the object exists, false otherwise @@ -166,8 +166,17 @@ void shutdown(); - /** Database change callback */ - void onDBChange(const DatabaseChangeMsg& m); + /** Database load callback + * @see DatabaseListener::onDBLoad */ + void onDBLoad(const FileGroupPtr& db, uint32_t curmask); + + /** Database save callback + * @see DatabaseListener::onDBSave */ + void onDBSave(const FileGroupPtr& db, uint32_t tgtmask); + + /** Database drop callback + * @see DatabaseListener::onDBDrop */ + void onDBDrop(uint32_t dropmask); /** load objects from a single database */ void _load(const FileGroupPtr& db, uint clearMask); @@ -216,9 +225,6 @@ /// Map's symbolic name to object ID - /// Database callback - DatabaseService::ListenerPtr mDbCallback; - /// Database service DatabaseServicePtr mDatabaseService; Modified: trunk/src/services/render/RenderService.cpp =================================================================== --- trunk/src/services/render/RenderService.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/render/RenderService.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -180,12 +180,13 @@ mRenderTypeProperty(NULL), mRenderAlphaProperty(NULL), mZBiasProperty(NULL) { - // TODO: This is just plain wrong. This service should be the maintainer of the used scene manager, if any other service needs the direct handle, etc. - // The fact is this service is probably game only, and should be the initialiser of graphics as the whole. This will be the - // modification that should be done soon in order to let the code look and be nice - // FIX! - mRoot = Root::getSingletonPtr(); - mManualBinFileLoader = new ManualBinFileLoader(); + + // TODO: This is just plain wrong. This service should be the maintainer of the used scene manager, if any other service needs the direct handle, etc. + // The fact is this service is probably game only, and should be the initialiser of graphics as the whole. This will be the + // modification that should be done soon in order to let the code look and be nice + // FIX! + mRoot = Root::getSingletonPtr(); + mManualBinFileLoader = new ManualBinFileLoader(); mLoopClientDef.id = LOOPCLIENT_ID_RENDERER; mLoopClientDef.mask = LOOPMODE_RENDER; @@ -215,7 +216,7 @@ void RenderService::shutdown() { LOG_INFO("RenderService::shutdown()"); - clear(); + clear(); if (mHasRefsProperty) { mPropertyService->unregisterPropertyGroup(mHasRefsProperty); @@ -267,22 +268,22 @@ mPropertyService.setNull(); } - // -------------------------------------------------------------------------- - bool RenderService::init() { - // TODO: These can be gathered from the config file. Usage of the config service would be a nice thing to do - if( !mRoot->restoreConfig() ) { - // If there is no config file, show the configuration dialog - if( !mRoot->showConfigDialog() ) { - LOG_ERROR("RenderService::init: The renderer setup was canceled. Application termination in progress."); - return false; - } - } + // -------------------------------------------------------------------------- + bool RenderService::init() { + // TODO: These can be gathered from the config file. Usage of the config service would be a nice thing to do + if( !mRoot->restoreConfig() ) { + // If there is no config file, show the configuration dialog + if( !mRoot->showConfigDialog() ) { + LOG_ERROR("RenderService::init: The renderer setup was canceled. Application termination in progress."); + return false; + } + } - // Initialise and create a default rendering window + // Initialise and create a default rendering window mRenderWindow = mRoot->initialise( true, "openDarkEngine" ); - // Dark scene manager factory - LOG_DEBUG("RenderService::init(): new DarkSceneManagerFactory()"); + // Dark scene manager factory + LOG_DEBUG("RenderService::init(): new DarkSceneManagerFactory()"); mDarkSMFactory = new DarkSceneManagerFactory(); // Register @@ -321,34 +322,34 @@ } - // -------------------------------------------------------------------------- - Ogre::Root* RenderService::getOgreRoot() { - assert(mRoot); - return mRoot; - } + // -------------------------------------------------------------------------- + Ogre::Root* RenderService::getOgreRoot() { + assert(mRoot); + return mRoot; + } - // -------------------------------------------------------------------------- - Ogre::SceneManager* RenderService::getSceneManager() { - assert(mSceneMgr); - return mSceneMgr; - } + // -------------------------------------------------------------------------- + Ogre::SceneManager* RenderService::getSceneManager() { + assert(mSceneMgr); + return mSceneMgr; + } - // -------------------------------------------------------------------------- - Ogre::RenderWindow* RenderService::getRenderWindow() { - assert(mRenderWindow); - return mRenderWindow; - } + // -------------------------------------------------------------------------- + Ogre::RenderWindow* RenderService::getRenderWindow() { + assert(mRenderWindow); + return mRenderWindow; + } + // -------------------------------------------------------------------------- + Ogre::Viewport* RenderService::getDefaultViewport() { + assert(mDefaultCamera); + return mDefaultCamera->getViewport(); + } + // -------------------------------------------------------------------------- - Ogre::Viewport* RenderService::getDefaultViewport() { - assert(mDefaultCamera); - return mDefaultCamera->getViewport(); - } - - // -------------------------------------------------------------------------- - Ogre::Camera* RenderService::getDefaultCamera() { + Ogre::Camera* RenderService::getDefaultCamera() { return mDefaultCamera; - } + } // -------------------------------------------------------------------------- void RenderService::setScreenSize(bool fullScreen, unsigned int width, unsigned int height) { @@ -356,14 +357,15 @@ mRenderWindow->setFullscreen(fullScreen, width, height); + mCurrentSize.fullscreen = fullScreen; + mCurrentSize.width = width; + mCurrentSize.height = height; + RenderServiceMsg msg; msg.msg_type = RENDER_WINDOW_SIZE_CHANGE; + msg.size = mCurrentSize; - msg.size.fullscreen = fullScreen; - msg.size.width = width; - msg.size.height = height; - broadcastMessage(msg); } @@ -393,7 +395,7 @@ mPropPosition = mPropertyService->getPropertyGroup("Position"); if (mPropPosition == NULL) - OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "RenderService::bootstrapFinished"); + OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "RenderService::bootstrapFinished"); // listener to the position property to control the scenenode PropertyGroup::ListenerPtr cposc( @@ -420,31 +422,31 @@ Ogre::WindowEventUtilities::messagePump(); } - // -------------------------------------------------------------------------- - void RenderService::prepareMesh(const Ogre::String& name) { - String fname = name + ".mesh"; + // -------------------------------------------------------------------------- + void RenderService::prepareMesh(const Ogre::String& name) { + String fname = name + ".mesh"; if (!Ogre::MeshManager::getSingleton().resourceExists(fname)) { - // Undefine in advance, so there will be no clash - Ogre::MeshManager::getSingleton().remove(fname); - // If it is not found - LOG_DEBUG("RenderService::prepareMesh: Mesh definition for %s not found, loading manually from .bin file...", name.c_str()); - // do a create + // Undefine in advance, so there will be no clash + Ogre::MeshManager::getSingleton().remove(fname); + // If it is not found + LOG_DEBUG("RenderService::prepareMesh: Mesh definition for %s not found, loading manually from .bin file...", name.c_str()); + // do a create - try { - Ogre::MeshPtr mesh1 = Ogre::MeshManager::getSingleton().create(fname, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, - true, mManualBinFileLoader); - } catch (FileNotFoundException) { - LOG_ERROR("RenderService::prepareMesh: Could not find the requested model %s", name.c_str()); - } catch (Opde::FileException) { - LOG_ERROR("RenderService::prepareMesh: Could not load the requested model %s", name.c_str()); - } - } + try { + Ogre::MeshPtr mesh1 = Ogre::MeshManager::getSingleton().create(fname, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + true, mManualBinFileLoader); + } catch (FileNotFoundException) { + LOG_ERROR("RenderService::prepareMesh: Could not find the requested model %s", name.c_str()); + } catch (Opde::FileException) { + LOG_ERROR("RenderService::prepareMesh: Could not load the requested model %s", name.c_str()); + } + } } - // -------------------------------------------------------------------------- - void RenderService::createObjectModel(int id) { - Ogre::String idstr = StringConverter::toString(id); + // -------------------------------------------------------------------------- + void RenderService::createObjectModel(int id) { + Ogre::String idstr = StringConverter::toString(id); Entity *ent = mSceneMgr->createEntity( "Object" + idstr, DEFAULT_RAMP_OBJECT_NAME); @@ -474,10 +476,10 @@ ei->refreshVisibility(); mEntityMap.insert(make_pair(id, ei)); - } + } - // -------------------------------------------------------------------------- - void RenderService::removeObjectModel(int id) { + // -------------------------------------------------------------------------- + void RenderService::removeObjectModel(int id) { // Not validated in prop service to be any different // just remove the entity, will add a new one ObjectEntityMap::iterator it = mEntityMap.find(id); @@ -488,7 +490,7 @@ // erase the record itself - will destroy the EntityInfo mEntityMap.erase(it); } - } + } // -------------------------------------------------------------------------- void RenderService::setObjectModel(int id, const std::string& name) { @@ -539,7 +541,7 @@ ei->setSkip(false); } - // -------------------------------------------------------------------------- + // -------------------------------------------------------------------------- void RenderService::prepareEntity(Ogre::Entity* e) { e->_initialise(true); @@ -561,13 +563,13 @@ } } - // -------------------------------------------------------------------------- - void RenderService::clear() { + // -------------------------------------------------------------------------- + void RenderService::clear() { // will destroy all EntityInfos - mEntityMap.clear(); + mEntityMap.clear(); mObjectToNode.clear(); - } + } // -------------------------------------------------------------------------- @@ -724,6 +726,7 @@ createRampMesh(); } + // -------------------------------------------------------------------------- void RenderService::createRampMesh() { // Code copied from Ogre3D wiki, and modified (Thanks to the original author for saving my time!) /// Create the mesh via the MeshManager Modified: trunk/src/services/render/RenderService.h =================================================================== --- trunk/src/services/render/RenderService.h 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/render/RenderService.h 2009-08-27 12:13:06 UTC (rev 1239) @@ -183,6 +183,8 @@ /** Internal method that returns entity info for a given object ID, or NULL if such does not exist */ EntityInfo* _getEntityInfo(int oid); + + inline const RenderWindowSize& getCurrentScreenSize() const { return mCurrentSize; }; protected: @@ -303,6 +305,9 @@ RenderTypeProperty* mRenderTypeProperty; RenderAlphaProperty* mRenderAlphaProperty; ZBiasProperty* mZBiasProperty; + + private: + RenderWindowSize mCurrentSize; }; /// Shared pointer to Link service Modified: trunk/src/services/worldrep/WRCell.cpp =================================================================== --- trunk/src/services/worldrep/WRCell.cpp 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/worldrep/WRCell.cpp 2009-08-27 12:13:06 UTC (rev 1239) @@ -93,8 +93,8 @@ chunk->read(&mHeader, sizeof(WRCellHeader)); //1. load the vertices - mVertices = new WRVector3[mHeader.numVertices]; - chunk->read(mVertices, sizeof(WRVector3) * mHeader.numVertices); + mVertices = new DVector3[mHeader.numVertices]; + chunk->read(mVertices, sizeof(DVector3) * mHeader.numVertices); //2. load the cell's polygon mapping mFaceMaps = new WRPolygon[mHeader.numPolygons]; @@ -121,13 +121,13 @@ } //6. load the planes - WRPlane* wr_planes = new WRPlane[mHeader.numPlanes]; - chunk->read(wr_planes, sizeof(WRPlane) * mHeader.numPlanes); + DPlane* wr_planes = new DPlane[mHeader.numPlanes]; + chunk->read(wr_planes, sizeof(DPlane) * mHeader.numPlanes); mPlanes = new Ogre::Plane[mHeader.numPlanes]; // convert the planes to the ogre format for (int x = 0; x < mHeader.numPlanes; x++) { - WRPlane origpl = wr_planes[x]; + DPlane origpl = wr_planes[x]; Ogre::Plane tplane; tplane.normal = Vector3(origpl.normal.x, origpl.normal.y, origpl.normal.z); @@ -157,7 +157,7 @@ //------------------------------------------------------------------------------------ - void WRCell::insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, WRVector3 coord, + void WRCell::insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, DVector3 coord, const Ogre::Vector2& displacement, const std::pair<Ogre::uint, Ogre::uint>& dimensions, Vector3 origin) { BspVertex vert; @@ -178,7 +178,7 @@ //------------------------------------------------------------------------------------ - void WRCell::constructBspVertex(int faceNum, WRVector3 pos, const Ogre::Vector2& displacement, const std::pair< + void WRCell::constructBspVertex(int faceNum, DVector3 pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint>& dimensions, BspVertex *vtx) { // Position copy vtx->position[0] = pos.x; @@ -209,8 +209,8 @@ // Texturing axises - WRVector3 _axu = mFaceInfos[faceNum].axisU; - WRVector3 _axv = mFaceInfos[faceNum].axisV; + const DVector3& _axu = mFaceInfos[faceNum].axisU; + const DVector3& _axv = mFaceInfos[faceNum].axisV; // convert the vectors to the Ogre types @@ -239,7 +239,7 @@ // The first vertex in the poly. - WRVector3& first = mVertices[mPolyIndices[faceNum][0]]; //cell->face_maps[faceNum].flags + const DVector3& first = mVertices[mPolyIndices[faceNum][0]]; //cell->face_maps[faceNum].flags // converted to Ogre Vector3 Vector3 o_first = Vector3(first.x, first.y, first.z); @@ -265,7 +265,7 @@ vtx->texcoords[1] = ty; // ----------------- LIGHTMAP COORDS -------------------- - WRVector3& o_center = mFaceInfos[faceNum].center; + const DVector3& o_center = mFaceInfos[faceNum].center; Vector3 center = Vector3(o_center.x, o_center.y, o_center.z); tmp = Vector3(pos.x, pos.y, pos.z); @@ -318,8 +318,8 @@ // ------------- Calculate the UV center displacement (as the poly center is off) // This method is just a hack. We need to find a proper way to detect light map on polygon alignment // readout from the cell info - WRVector3 _axu = mFaceInfos[polyNum].axisU; - WRVector3 _axv = mFaceInfos[polyNum].axisV; + DVector3 _axu = mFaceInfos[polyNum].axisU; + DVector3 _axv = mFaceInfos[polyNum].axisV; // convert the vectors to the Ogre types @@ -338,7 +338,7 @@ // Precalculate the lightmap displacement. (To get the resulting lmap uv to 0-1 range) for (int vert = 0; vert < mFaceMaps[polyNum].count; vert++) { // find the min and max coords in texture space - WRVector3 coord = mVertices[mPolyIndices[polyNum][vert]]; + DVector3 coord = mVertices[mPolyIndices[polyNum][vert]]; Vector3 vcoord(coord.x, coord.y, coord.z); @@ -393,10 +393,10 @@ // Hmm. I use a SceneNode centered at the polygon's center. Otherwise I get huge radius (from 0,0,0 of the sceneNode). - WRVector3 polyCenter = mFaceInfos[polyNum].center; + DVector3 polyCenter = mFaceInfos[polyNum].center; Vector3 nodeCenter = Vector3(polyCenter.x, polyCenter.y, polyCenter.z); - WRVector3 zero; + DVector3 zero; zero.x = 0; zero.y = 0; zero.z = 0; @@ -404,7 +404,7 @@ // for each vertex, insert into the model for (int vert = 0; vert < mFaceMaps[polyNum].count; vert++) { - WRVector3 vrelative = mVertices[mPolyIndices[polyNum][vert]]; + DVector3 vrelative = mVertices[mPolyIndices[polyNum][vert]]; insertTexturedVertex(manual, polyNum, vrelative, displacement, dimensions, nodeCenter); } @@ -463,7 +463,7 @@ for (int vert = 0; vert < mFaceMaps[portalNum].count; vert++) { // for each vertex of that poly - WRVector3 coord = mVertices[mPolyIndices[portalNum][vert]]; + DVector3 coord = mVertices[mPolyIndices[portalNum][vert]]; portal->addPoint(coord.x, coord.y, coord.z); } // for each vertex @@ -550,7 +550,7 @@ // Cell is recentered with this - WRVector3 cellCenter = mHeader.center; + DVector3 cellCenter = mHeader.center; Vector3 nodeCenter = Vector3(cellCenter.x, cellCenter.y, cellCenter.z); @@ -616,7 +616,7 @@ uint32_t *idxmap = new uint32_t[mFaceMaps[polyNum].count]; for (int vert = 0; vert < mFaceMaps[polyNum].count; vert++) { - WRVector3 vrelative = mVertices[mPolyIndices[polyNum][vert]]; + DVector3 vrelative = mVertices[mPolyIndices[polyNum][vert]]; // insertTexturedVertex(manual, polyNum, vrelative, displacement, dimensions, nodeCenter); Modified: trunk/src/services/worldrep/WRCell.h =================================================================== --- trunk/src/services/worldrep/WRCell.h 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/worldrep/WRCell.h 2009-08-27 12:13:06 UTC (rev 1239) @@ -68,7 +68,7 @@ WRCellHeader mHeader; /** the list of the cell's vertices (count is in the header) */ - WRVector3 *mVertices; + DVector3 *mVertices; /** the list of the polygon map headers */ WRPolygon *mFaceMaps; @@ -95,11 +95,11 @@ /** Inserts a new vertex into the manual object. Calculates all the UV values needed * @deprecated For moving towards the geometry by buffers */ - void insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, WRVector3 pos, const Ogre::Vector2& displacement, + void insertTexturedVertex(Ogre::ManualObject *manual, int faceNum, DVector3 pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint >& dimensions, Ogre::Vector3 origin); /** Constructs a BSPVertex out of our data */ - void constructBspVertex(int faceNum, WRVector3 pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint >& dimensions, BspVertex *vtx); + void constructBspVertex(int faceNum, DVector3 pos, const Ogre::Vector2& displacement, const std::pair< Ogre::uint, Ogre::uint >& dimensions, BspVertex *vtx); /** Calculates the Lightmap center in texture space, using Bounding coordinates as the base. */ Ogre::Vector2 calcLightmapDisplacement(int polyNum); Modified: trunk/src/services/worldrep/WRTypes.h =================================================================== --- trunk/src/services/worldrep/WRTypes.h 2009-08-27 12:09:35 UTC (rev 1238) +++ trunk/src/services/worldrep/WRTypes.h 2009-08-27 12:13:06 UTC (rev 1239) @@ -27,6 +27,7 @@ #include "LightmapAtlas.h" #include "integers.h" +#include "DarkCommon.h" // the only one which collided is wr_cell_hdr, but to be sure... #pragma pack(push, 1) @@ -38,13 +39,6 @@ uint32_t numCells; } WRHeader; - typedef struct { // SIZE: 8 - float x; - float y; - float z; - } WRVector3; - - typedef struct { // SIZE: 31 uint8_t numVertices; // vertex count @@ -62,17 +56,11 @@ uint8_t flowGroup; // 0-no flow group, otherwise the flow group no. // cell's bounding sphere - WRVector3 center; + DVector3 center; float radius; // Only an approximation, but enough to guarantee that every point in the cell is enclosed by this sphere. } WRCellHeader; typedef struct { // SIZE: 8 - float x; - float y; - } WRVector2; - - - typedef struct { // SIZE: 8 uint8_t flags; // Nonzero for watered polygons uint8_t count; // Polygon vertices count uint8_t plane; // plane number @@ -83,8 +71,8 @@ } WRPolygon; typedef struct { // SIZE: 12+12+12+12 = 48 - WRVector3 axisU; // U axis - WRVector3 axisV; // V axis - both directions of texture growth (e.g. U axis and V axis) - and they are not normalised! (in some way related to scale) + DVector3 axisU; // U axis + DVector3 axisV; // V axis - both directions of texture growth (e.g. U axis and V axis) - and they are not normalised! (in some way related to scale) int16_t u; // txt shift u (must divide by 1024 to get float number (and I dunno why, I had to invert it too)) int16_t v; // txt shift v @@ -94,15 +82,9 @@ uint16_t unk; // something related to texture cache float scale; // scale of the texture - WRVector3 center; + DVector3 center; } WRPolygonTexturing; - // a plane - typedef struct { // SIZE: 16 - WRVector3 normal; - float d; - } WRPlane; - /** Lightmap Information struct. */ typedef struct { // SIZE: 4+4+12 = 20 int16_t u; // LMAP U shift probably (if, then the same approach as in the wr_face_info_t) Modified: trunk/src/services/worldrep/WorldRepService.cpp =================================================================== --- trunk/src/services/worldrep/WorldRepService.cpp 2009-08-27 12:09:35 UTC (rev 1238)... [truncated message content] |
From: <vo...@us...> - 2009-10-18 18:53:15
|
Revision: 1299 http://opde.svn.sourceforge.net/opde/?rev=1299&view=rev Author: volca Date: 2009-10-18 18:53:09 +0000 (Sun, 18 Oct 2009) Log Message: ----------- adding camera service stub Modified Paths: -------------- trunk/src/services/ServiceCommon.h trunk/src/services/Services.cmake Added Paths: ----------- trunk/src/services/camera/ trunk/src/services/camera/CameraService.cpp trunk/src/services/camera/CameraService.h trunk/src/services/camera/config.cmake Modified: trunk/src/services/ServiceCommon.h =================================================================== --- trunk/src/services/ServiceCommon.h 2009-10-18 18:38:33 UTC (rev 1298) +++ trunk/src/services/ServiceCommon.h 2009-10-18 18:53:09 UTC (rev 1299) @@ -57,6 +57,7 @@ #define __SERVICE_ID_SIM 18 #define __SERVICE_ID_WORLDREP 19 #define __SERVICE_ID_ROOM 20 +#define __SERVICE_ID_CAMERA 21 // -------------------------------------- // --- Bitmasks for service masking --- Modified: trunk/src/services/Services.cmake =================================================================== --- trunk/src/services/Services.cmake 2009-10-18 18:38:33 UTC (rev 1298) +++ trunk/src/services/Services.cmake 2009-10-18 18:53:09 UTC (rev 1299) @@ -68,6 +68,7 @@ INCLUDE( ${OPDE_SOURCE_DIR}/src/services/script/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/sim/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/worldrep/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/camera/config.cmake ) # join the variables SET(OPDE_SERVICE_FILES ${OPDE_SERVICE_HEADERS}) Added: trunk/src/services/camera/CameraService.cpp =================================================================== --- trunk/src/services/camera/CameraService.cpp (rev 0) +++ trunk/src/services/camera/CameraService.cpp 2009-10-18 18:53:09 UTC (rev 1299) @@ -0,0 +1,96 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "CameraService.h" +#include "logger.h" +#include "ServiceCommon.h" + +using namespace std; +using namespace Ogre; + +namespace Opde { + + /*----------------------------------------------------*/ + /*-------------------- CameraService -----------------*/ + /*----------------------------------------------------*/ + template<> const size_t ServiceImpl<CameraService>::SID = __SERVICE_ID_CAMERA; + + CameraService::CameraService(ServiceManager *manager, const std::string& name) : ServiceImpl<CameraService>(manager, name) { + } + + //------------------------------------------------------ + CameraService::~CameraService() { + } + + //------------------------------------------------------ + bool CameraService::staticAttach(int objID) { + // TODO: Code + return false; + } + + //------------------------------------------------------ + bool CameraService::dynamicAttach(int objID) { + // TODO: Code + return false; + } + + //------------------------------------------------------ + bool CameraService::cameraReturn(int objID) { + // TODO: Code + return false; + } + + //------------------------------------------------------ + void CameraService::forceCameraReturn() { + // TODO: Code + } + + //------------------------------------------------------ + bool CameraService::init() { + return true; + } + + //-------------------------- Factory implementation + std::string CameraServiceFactory::mName = "CameraService"; + + CameraServiceFactory::CameraServiceFactory() : ServiceFactory() { + ServiceManager::getSingleton().addServiceFactory(this); + }; + + const std::string& CameraServiceFactory::getName() { + return mName; + } + + const uint CameraServiceFactory::getMask() { + return SERVICE_RENDERER; + } + + const size_t CameraServiceFactory::getSID() { + return CameraService::SID; + } + + Service* CameraServiceFactory::createInstance(ServiceManager* manager) { + return new CameraService(manager, mName); + } + +} Property changes on: trunk/src/services/camera/CameraService.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/camera/CameraService.h =================================================================== --- trunk/src/services/camera/CameraService.h (rev 0) +++ trunk/src/services/camera/CameraService.h 2009-10-18 18:53:09 UTC (rev 1299) @@ -0,0 +1,90 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __CAMERASERVICE_H +#define __CAMERASERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "RenderService.h" +#include "SharedPtr.h" + +namespace Opde { + + /** @brief camera service. Service that handles in-game camera + */ + class OPDELIB_EXPORT CameraService : public ServiceImpl<CameraService> { + public: + CameraService(ServiceManager *manager, const std::string& name); + virtual ~CameraService(); + + /** Attaches camera to an object. Does not allow freelook + * @return true on success, false on failure */ + bool staticAttach(int objID); + + /** Attaches camera to an object with freelook allowed + * @return true on success, false on failure */ + bool dynamicAttach(int objID); + + /** Returns (conditionally) the camera to the player object. + * Camera is only returned if it is currently attached to the object specified by the parameter + * @param curObjID The current object to which camera is attached + * @return true on success, false on failure */ + bool cameraReturn(int objID); + + /** Returns (unconditionally) the camera to the player object. */ + void forceCameraReturn(); + + protected: + bool init(); + }; + + /// Shared pointer to Camera service + typedef shared_ptr<CameraService> CameraServicePtr; + + + /// Factory for the CameraService objects + class OPDELIB_EXPORT CameraServiceFactory : public ServiceFactory { + public: + CameraServiceFactory(); + ~CameraServiceFactory() {}; + + /** Creates a CameraService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + + virtual const size_t getSID(); + private: + static std::string mName; + }; +} + + +#endif Property changes on: trunk/src/services/camera/CameraService.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/camera/config.cmake =================================================================== --- trunk/src/services/camera/config.cmake (rev 0) +++ trunk/src/services/camera/config.cmake 2009-10-18 18:53:09 UTC (rev 1299) @@ -0,0 +1,2 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/camera/CameraService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/camera/CameraService.h) Property changes on: trunk/src/services/camera/config.cmake ___________________________________________________________________ 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...> - 2009-10-26 14:39:18
|
Revision: 1309 http://opde.svn.sourceforge.net/opde/?rev=1309&view=rev Author: volca Date: 2009-10-26 14:39:11 +0000 (Mon, 26 Oct 2009) Log Message: ----------- Adding platform service stub. This one will be used for interaction with file system and other platform specific operations (currently only UnixPlatform is implemented somehow) Modified Paths: -------------- trunk/src/services/ServiceCommon.h trunk/src/services/Services.cmake Added Paths: ----------- trunk/src/services/platform/ trunk/src/services/platform/ApplePlatform.cpp trunk/src/services/platform/ApplePlatform.h trunk/src/services/platform/Platform.cpp trunk/src/services/platform/Platform.h trunk/src/services/platform/PlatformService.cpp trunk/src/services/platform/PlatformService.h trunk/src/services/platform/UnixPlatform.cpp trunk/src/services/platform/UnixPlatform.h trunk/src/services/platform/Win32Platform.cpp trunk/src/services/platform/Win32Platform.h trunk/src/services/platform/config.cmake Modified: trunk/src/services/ServiceCommon.h =================================================================== --- trunk/src/services/ServiceCommon.h 2009-10-22 10:33:37 UTC (rev 1308) +++ trunk/src/services/ServiceCommon.h 2009-10-26 14:39:11 UTC (rev 1309) @@ -58,6 +58,7 @@ #define __SERVICE_ID_WORLDREP 19 #define __SERVICE_ID_ROOM 20 #define __SERVICE_ID_CAMERA 21 +#define __SERVICE_ID_PLATFORM 22 // -------------------------------------- // --- Bitmasks for service masking --- Modified: trunk/src/services/Services.cmake =================================================================== --- trunk/src/services/Services.cmake 2009-10-22 10:33:37 UTC (rev 1308) +++ trunk/src/services/Services.cmake 2009-10-26 14:39:11 UTC (rev 1309) @@ -24,6 +24,7 @@ ${OPDE_SOURCE_DIR}/src/services/room ${OPDE_SOURCE_DIR}/src/services/sim ${OPDE_SOURCE_DIR}/src/services/camera + ${OPDE_SOURCE_DIR}/src/services/platform ) # All the resulting libraries in a nice package as well @@ -48,6 +49,7 @@ OpdeRoomService OpdeSimService OpdeCameraService + OpdePlatformService ) # include the configuration from all the services (each config.cmake should append the OPDE_SERVICE_HEADERS and OPDE_SERVICE_SOURCES) @@ -73,6 +75,7 @@ INCLUDE( ${OPDE_SOURCE_DIR}/src/services/sim/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/worldrep/config.cmake ) INCLUDE( ${OPDE_SOURCE_DIR}/src/services/camera/config.cmake ) +INCLUDE( ${OPDE_SOURCE_DIR}/src/services/platform/config.cmake ) # join the variables SET(OPDE_SERVICE_FILES ${OPDE_SERVICE_HEADERS}) Added: trunk/src/services/platform/ApplePlatform.cpp =================================================================== --- trunk/src/services/platform/ApplePlatform.cpp (rev 0) +++ trunk/src/services/platform/ApplePlatform.cpp 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "ApplePlatform.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*--------------------- ApplePlatform ----------------*/ + /*----------------------------------------------------*/ + ApplePlatform::ApplePlatform(PlatformService* owner) : Platform(owner) { + } + + //------------------------------------------------------ + ApplePlatform::~ApplePlatform() { + } + + //------------------------------------------------------ + std::string ApplePlatform::getGlobalConfigPath() const { + // TODO: CODE + return "/Invalid/"; + } + + //------------------------------------------------------ + std::string ApplePlatform::getUserConfigPath() const { + // TODO: CODE + return "/Invalid/"; + } + + //------------------------------------------------------ + std::string ApplePlatform::getDirectorySeparator() const { + return "/"; + } +} Property changes on: trunk/src/services/platform/ApplePlatform.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/ApplePlatform.h =================================================================== --- trunk/src/services/platform/ApplePlatform.h (rev 0) +++ trunk/src/services/platform/ApplePlatform.h 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __APPLEPLATFORM_H +#define __APPLEPLATFORM_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "Platform.h" + +namespace Opde { + + /** @brief Apple platform. Apple OS specific platform handling code. + */ + class OPDELIB_EXPORT ApplePlatform : public Platform { + public: + ApplePlatform(PlatformService* owner); + virtual ~ApplePlatform(); + + virtual std::string getGlobalConfigPath() const; + + virtual std::string getUserConfigPath() const; + + virtual std::string getDirectorySeparator() const; + }; + +} + + +#endif Property changes on: trunk/src/services/platform/ApplePlatform.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/Platform.cpp =================================================================== --- trunk/src/services/platform/Platform.cpp (rev 0) +++ trunk/src/services/platform/Platform.cpp 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,39 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "Platform.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*------------------------ Platform ------------------*/ + /*----------------------------------------------------*/ + Platform::Platform(PlatformService* owner) : mOwner(owner) { + } + + //------------------------------------------------------ + Platform::~Platform() { + } +} Property changes on: trunk/src/services/platform/Platform.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/Platform.h =================================================================== --- trunk/src/services/platform/Platform.h (rev 0) +++ trunk/src/services/platform/Platform.h 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,61 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __PLATFORM_H +#define __PLATFORM_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "PlatformService.h" + +namespace Opde { + + /** @brief A platform. OS specific piece of code used to handle configuration and data paths. + */ + class OPDELIB_EXPORT Platform { + public: + Platform(PlatformService* owner); + virtual ~Platform(); + + /// Getter for system-wide configuration directory + virtual std::string getGlobalConfigPath() const = 0; + + /// Getter for user-specific configuration directory + virtual std::string getUserConfigPath() const = 0; + + /// Returns the directory separator string for the platform + virtual std::string getDirectorySeparator() const = 0; + + protected: + /// Owner service + PlatformService *mOwner; + }; + +} + + +#endif Property changes on: trunk/src/services/platform/Platform.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/PlatformService.cpp =================================================================== --- trunk/src/services/platform/PlatformService.cpp (rev 0) +++ trunk/src/services/platform/PlatformService.cpp 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,99 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "PlatformService.h" +#include "logger.h" +#include "ServiceCommon.h" + +#include "Win32Platform.h" +#include "UnixPlatform.h" +#include "ApplePlatform.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*-------------------- PlatformService ---------------*/ + /*----------------------------------------------------*/ + template<> const size_t ServiceImpl<PlatformService>::SID = __SERVICE_ID_PLATFORM; + + PlatformService::PlatformService(ServiceManager *manager, const std::string& name) : + ServiceImpl<PlatformService>(manager, name) { +#ifdef WIN32 + mPlatform = new Win32Platform(this); +#else +# ifdef UNIX + mPlatform = new UnixPlatform(this); +# else +# ifdef APPLE + mPlatform = new ApplePlatform(this); +# else +# error Unknown platform! +# endif +# endif +#endif + } + + //------------------------------------------------------ + PlatformService::~PlatformService() { + delete mPlatform; + } + + //------------------------------------------------------ + bool PlatformService::init() { + return true; + } + + //------------------------------------------------------ + void PlatformService::bootstrapFinished() { + } + + //------------------------------------------------------ + void PlatformService::shutdown() { + } + + + //-------------------------- Factory implementation + std::string PlatformServiceFactory::mName = "PlatformService"; + + PlatformServiceFactory::PlatformServiceFactory() : ServiceFactory() { + }; + + const std::string& PlatformServiceFactory::getName() { + return mName; + } + + const uint PlatformServiceFactory::getMask() { + return SERVICE_ENGINE; + } + + const size_t PlatformServiceFactory::getSID() { + return PlatformService::SID; + } + + Service* PlatformServiceFactory::createInstance(ServiceManager* manager) { + return new PlatformService(manager, mName); + } + +} Property changes on: trunk/src/services/platform/PlatformService.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/PlatformService.h =================================================================== --- trunk/src/services/platform/PlatformService.h (rev 0) +++ trunk/src/services/platform/PlatformService.h 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,78 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __PLATFORMSERVICE_H +#define __PLATFORMSERVICE_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "SharedPtr.h" + +namespace Opde { + // Forward decl. + class Platform; + + /** @brief Platform service. Service that gives the engine an abstracted way to work with various OSes and File Systems they introduce. + */ + class OPDELIB_EXPORT PlatformService : public ServiceImpl<PlatformService> { + public: + PlatformService(ServiceManager *manager, const std::string& name); + virtual ~PlatformService(); + + protected: + bool init(); + void bootstrapFinished(); + void shutdown(); + + private: + Platform *mPlatform; + }; + + /// Shared pointer to Platform service + typedef shared_ptr<PlatformService> PlatformServicePtr; + + /// Factory for the PlatformService objects + class OPDELIB_EXPORT PlatformServiceFactory : public ServiceFactory { + public: + PlatformServiceFactory(); + ~PlatformServiceFactory() {}; + + /** Creates a PlatformService instance */ + Service* createInstance(ServiceManager* manager); + + virtual const std::string& getName(); + + virtual const uint getMask(); + + virtual const size_t getSID(); + private: + static std::string mName; + }; +} + + +#endif Property changes on: trunk/src/services/platform/PlatformService.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/UnixPlatform.cpp =================================================================== --- trunk/src/services/platform/UnixPlatform.cpp (rev 0) +++ trunk/src/services/platform/UnixPlatform.cpp 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,63 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "UnixPlatform.h" +#include <stdlib.h> + +using namespace std; + +namespace Opde { + const std::string UnixPlatform::msOpdeHomeDirName = ".opde"; + + /*----------------------------------------------------*/ + /*--------------------- UnixPlatform ----------------*/ + /*----------------------------------------------------*/ + UnixPlatform::UnixPlatform(PlatformService* owner) : Platform(owner) { + } + + //------------------------------------------------------ + UnixPlatform::~UnixPlatform() { + } + + //------------------------------------------------------ + std::string UnixPlatform::getGlobalConfigPath() const { + // global config path is hardcoded at compile time + // it is the location of share/opde directory... + // for the share directory location, we have a config time define + return OPDE_SHARE_DIR; + } + + //------------------------------------------------------ + std::string UnixPlatform::getUserConfigPath() const { + // local config path is based on the user's home directory + // respectively the .opde directory inside it + std::string home = getenv("HOME"); + + return home + getDirectorySeparator() + msOpdeHomeDirName + getDirectorySeparator(); + } + + //------------------------------------------------------ + std::string UnixPlatform::getDirectorySeparator() const { + return "/"; + } +} Property changes on: trunk/src/services/platform/UnixPlatform.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/UnixPlatform.h =================================================================== --- trunk/src/services/platform/UnixPlatform.h (rev 0) +++ trunk/src/services/platform/UnixPlatform.h 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,57 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __UNIXPLATFORM_H +#define __UNIXPLATFORM_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "Platform.h" + +namespace Opde { + + /** @brief Unix platform. Unix/Linux (Posix OS) specific platform handling code. + */ + class OPDELIB_EXPORT UnixPlatform : public Platform { + public: + UnixPlatform(PlatformService* owner); + virtual ~UnixPlatform(); + + virtual std::string getGlobalConfigPath() const; + + virtual std::string getUserConfigPath() const; + + virtual std::string getDirectorySeparator() const; + + private: + static const std::string msOpdeHomeDirName; + }; + +} + + +#endif Property changes on: trunk/src/services/platform/UnixPlatform.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/Win32Platform.cpp =================================================================== --- trunk/src/services/platform/Win32Platform.cpp (rev 0) +++ trunk/src/services/platform/Win32Platform.cpp 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,56 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 "Win32Platform.h" + +using namespace std; + +namespace Opde { + + /*----------------------------------------------------*/ + /*--------------------- Win32Platform ----------------*/ + /*----------------------------------------------------*/ + Win32Platform::Win32Platform(PlatformService* owner) : Platform(owner) { + } + + //------------------------------------------------------ + Win32Platform::~Win32Platform() { + } + + //------------------------------------------------------ + std::string Win32Platform::getGlobalConfigPath() const { + // TODO: CODE + return "\\Invalid\\"; + } + + //------------------------------------------------------ + std::string Win32Platform::getUserConfigPath() const { + // TODO: CODE + return "\\Invalid\\"; + } + + //------------------------------------------------------ + std::string ApplePlatform::getDirectorySeparator() const { + return "\\"; + } +} Property changes on: trunk/src/services/platform/Win32Platform.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/Win32Platform.h =================================================================== --- trunk/src/services/platform/Win32Platform.h (rev 0) +++ trunk/src/services/platform/Win32Platform.h 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,54 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 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 __WIN32PLATFORM_H +#define __WIN32PLATFORM_H + +#include "config.h" + +#include "OpdeServiceManager.h" +#include "OpdeService.h" +#include "Platform.h" + +namespace Opde { + + /** @brief Win32 platform. Windows specific platform handling code. + */ + class OPDELIB_EXPORT Win32Platform : public Platform { + public: + Win32Platform(PlatformService* owner); + virtual ~Win32Platform(); + + virtual std::string getGlobalConfigPath() const; + + virtual std::string getUserConfigPath() const; + + virtual std::string getDirectorySeparator() const; + }; + +} + + +#endif Property changes on: trunk/src/services/platform/Win32Platform.h ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/platform/config.cmake =================================================================== --- trunk/src/services/platform/config.cmake (rev 0) +++ trunk/src/services/platform/config.cmake 2009-10-26 14:39:11 UTC (rev 1309) @@ -0,0 +1,26 @@ +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/platform/PlatformService.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/platform/PlatformService.h) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/platform/Platform.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/platform/Platform.h) + + +# OS Specific code follows. Example: OS X could have a specific condition here +IF(UNIX) + IF(APPLE) + # Apple specific platform + # TODO: LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/platform/ApplePlatform.cpp) + # TODO: LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/platform/ApplePlatform.h) + MESSAGE(FATAL_ERROR "Apple platform currently unsupported! Please consider helping us by providing the platform specific code!") + ELSE(APPLE) + # Generic unix platform + LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/platform/UnixPlatform.cpp) + LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/platform/UnixPlatform.h) + ENDIF(APPLE) +ELSE(UNIX) + IF(WIN32) + LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/platform/Win32Platform.cpp) + LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/platform/Win32Platform.h) + ELSE(WIN32) + MESSAGE(FATAL_ERROR "Unknown platform encountered! Please consider helping us by providing your platform specific code!") + ENDIF(WIN32) +ENDIF(UNIX) Property changes on: trunk/src/services/platform/config.cmake ___________________________________________________________________ Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |