From: Remi B. <els...@us...> - 2004-08-28 20:40:23
|
Update of /cvsroot/once/oncecode/src/common In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8810/src/common Modified Files: Tag: cel-switch ocapplication.cpp ocapplication.h ocarea.cpp ocarea.h ocidentifier.h ocloader.cpp Added Files: Tag: cel-switch ocentityreg.cpp ocentityreg.h ocpcconvert.cpp ocpcconvert.h Log Message: Added entity registry. --- NEW FILE: ocpcconvert.h --- /* * ocpcconvert.h * Copyright (C) 2003-2004 by The Once developement 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 OC_COMMON_PCCONVERT_H #define OC_COMMON_PCCONVERT_H #include "common/ocpcserialize.h" /** * This class provide facilities for serializing/deserializing propclass. */ struct ocPcConverters { // The serial returned by these function must be deleted when no longer used static iSimpleSerial* PropclassToSerial(iPcMesh* pcmesh); static iSimpleSerial* PropclassToSerial(iPcLinearMovement* pclinmove); static iSimpleSerial* PropclassToSerial(iPcRegion* region); // Any of these functions can be called only one for each propclass static bool UpdatePropclassFromSerial(iPcMesh* pcmesh, ocPcMeshData* data); static bool UpdatePropclassFromSerial(iPcRegion* pcregion, ocPcRegionData* data); static bool UpdatePropclassFromSerial(iPcLinearMovement* pclinmove, ocPcLinearMovementData* data); }; #endif --- NEW FILE: ocpcconvert.cpp --- /* * ocpcconvert.cpp * Copyright (C) 2003-2004 by The Once developement team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include "csgeom/vector3.h" #include "iutil/object.h" #include "iengine/mesh.h" #include "propclass/linmove.h" #include "propclass/region.h" #include "propclass/mesh.h" #include "common/ocentityreg.h" #include "common/ocloader.h" #include "common/ocarea.h" #include "common/ocapplication.h" #include "common/ocpcconvert.h" iSimpleSerial* ocPcConverters::PropclassToSerial(iPcMesh* pcmesh) { ocPcMeshData* data = new ocPcMeshData; data->mesh_name = pcmesh->GetMesh()->QueryObject()->GetName(); return data; } bool ocPcConverters::UpdatePropclassFromSerial(iPcMesh* pcmesh, ocPcMeshData* data) { return GetApplication()->GetLoader()->LoadMesh(pcmesh, data->mesh_name); } iSimpleSerial* ocPcConverters::PropclassToSerial(iPcLinearMovement* pclinmove) { ocPcLinearMovementData* data = new ocPcLinearMovementData; iSector* sect; pclinmove->GetLastPosition(data->position, data->yrot, sect); CS_ASSERT(sect); const ocSectorRegistry* sector_reg; sector_reg = GetApplication()->GetEntityRegistry()->GetSectorRegistry(); data->area_id = sector_reg->GetIDBySector(sect); pclinmove->GetVelocity(data->speed); csVector3 ang_vel; pclinmove->GetAngularVelocity(ang_vel); data->yrot_vel = ang_vel.y; return data; } bool ocPcConverters::UpdatePropclassFromSerial(iPcLinearMovement* pc, ocPcLinearMovementData* data) { const ocSectorRegistry* sector_reg; sector_reg = GetApplication()->GetEntityRegistry()->GetSectorRegistry(); iSector* sector = sector_reg->GetSectorByID(data->area_id); CS_ASSERT(sector); pc->SetPosition(data->position, data->yrot, sector); pc->SetVelocity(data->speed); pc->SetAngularVelocity(csVector3(0, data->yrot_vel, 0)); return true; } iSimpleSerial* ocPcConverters::PropclassToSerial(iPcRegion* pcregion) { ocPcRegionData* data = new ocPcRegionData; data->area_name = pcregion->GetRegionName(); return data; } bool ocPcConverters::UpdatePropclassFromSerial(iPcRegion* pcregion, ocPcRegionData* data) { return GetApplication()->GetLoader()->LoadRegion(pcregion, data->area_name); } --- NEW FILE: ocentityreg.cpp --- /* * ocentityreg.cpp * Copyright (C) 2003-2004 by Th Once developement team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include "iutil/object.h" #include "iengine/engine.h" #include "iengine/sector.h" #include "iengine/region.h" #include "csutil/csobject.h" #include "physicallayer/pl.h" #include "physicallayer/entity.h" #include "physicallayer/propclas.h" #include "propclass/region.h" #include "common/ocapplication.h" #include "common/ocentityreg.h" //--------------------------- ocObjectID ------------------------------------- SCF_VERSION(iObjectID, 0, 1, 0); struct iObjectID : public iBase { virtual ocID GetID() = 0; }; class ocObjectID : public csObject, public iObjectID { private: ocID id; public: ocObjectID(ocID _id) : id(_id) { SetName("once_id"); } SCF_DECLARE_IBASE_EXT(csObject); virtual ocID GetID() { return id; } }; SCF_IMPLEMENT_IBASE_EXT(ocObjectID) SCF_IMPLEMENTS_INTERFACE(iObjectID) SCF_IMPLEMENT_IBASE_EXT_END //------------------------ ocSectorRegistry ---------------------------------- ocID ocSectorRegistry::GetIDBySector(iSector* sector) { iObject* obj = sector->QueryObject()->GetChild("once_id"); if (!obj) return ocInvalidID; csRef<iObjectID> objid = SCF_QUERY_INTERFACE(obj, iObjectID); CS_ASSERT(objid); return objid->GetID(); } bool ocSectorRegistry::Register(ocID id, iCelEntity* entity) { csRef<iPcRegion> pcregion = CEL_QUERY_PROPCLASS_ENT(entity, iPcRegion); if (!pcregion) return false; csRef<iEngine> engine = GetApplication()->GetEngine(); iSector* sector = engine->FindSector(pcregion->GetRegionName(), pcregion->GetRegion()); if (!sector) { fprintf(stderr, "FATAL ERROR: Sector Registry: Region %s doesn't contain " "a sector with its name!", pcregion->GetRegionName()); abort(); } iObject* objid = new ocObjectID(id); sector->QueryObject()->ObjAdd(objid); objid->DecRef(); sector_reg.Put(id, sector); return true; } bool ocSectorRegistry::Unregister(ocID id) { // @@@ The object ID must be freed here. return sector_reg.DeleteAll(id); } //------------------------- ocEntityRegistry --------------------------------- void ocEntityRegistry::Register(ocID id, iCelEntity* entity) { entity_reg.Put(id, entity); sector_reg.Register(id, entity); } void ocEntityRegistry::Unregister(ocID id) { entity_reg.DeleteAll(id); sector_reg.Unregister(id); } void ocEntityRegistry::UnregisterAll() { entity_reg.DeleteAll(); sector_reg.UnregisterAll(); } Index: ocapplication.h =================================================================== RCS file: /cvsroot/once/oncecode/src/common/ocapplication.h,v retrieving revision 1.3.2.3 retrieving revision 1.3.2.4 diff -C2 -d -r1.3.2.3 -r1.3.2.4 *** ocapplication.h 27 Aug 2004 17:25:29 -0000 1.3.2.3 --- ocapplication.h 28 Aug 2004 20:40:11 -0000 1.3.2.4 *************** *** 47,51 **** class ocSettingsMgr; class ocSerialFactory; ! class ocAreaRegistry; /** A common class, inherited by client and server. */ --- 47,51 ---- class ocSettingsMgr; class ocSerialFactory; ! class ocEntityRegistry; /** A common class, inherited by client and server. */ *************** *** 81,86 **** /// The settings manager ocSettingsMgr* settings_mgr; ! /// The area registry. ! ocAreaRegistry* area_registry; protected: --- 81,86 ---- /// The settings manager ocSettingsMgr* settings_mgr; ! /// The entity registry. ! ocEntityRegistry* entity_registry; protected: *************** *** 123,128 **** /** Returns CEL entity loader */ csRef<iEntityLoader> GetEntityLoader() { return entity_loader; } ! /** Returns the area registry */ ! ocAreaRegistry* GetAreaRegistry() { return area_registry; } /** Returns the once loader */ ocLoader* GetLoader() { return loader; } --- 123,128 ---- /** Returns CEL entity loader */ csRef<iEntityLoader> GetEntityLoader() { return entity_loader; } ! /** Returns the entity registry */ ! ocEntityRegistry* GetEntityRegistry() { return entity_registry; } /** Returns the once loader */ ocLoader* GetLoader() { return loader; } Index: ocarea.h =================================================================== RCS file: /cvsroot/once/oncecode/src/common/ocarea.h,v retrieving revision 1.13.2.5 retrieving revision 1.13.2.6 diff -C2 -d -r1.13.2.5 -r1.13.2.6 *** ocarea.h 24 Aug 2004 20:24:12 -0000 1.13.2.5 --- ocarea.h 28 Aug 2004 20:40:11 -0000 1.13.2.6 *************** *** 47,93 **** }; - /** - * This class takes care of registering the known areas and provide quick ways - * to find them/query sectors. - * - * This is only a kind of cache. This class doesn't keep any ownership on the - * entities. - */ - class ocAreaRegistry - { - private: - /// Link to the engine. - csRef<iEngine> engine; - /// Link to the physical layer - csRef<iCelPlLayer> pl; - /// Internal hash, from ocID to the cel entity. - csHash<iCelEntity*,ocID> toentity_reg; - - public: - /** - * Constructor - requires the engine plugin - */ - ocAreaRegistry(csRef<iEngine> engine, csRef<iCelPlLayer> pl); - - /** - * Register an area into the registry. - */ - void Register(ocID id, iCelEntity* entity); - - /** - * Flush the registry. - */ - void UnregisterAll(); - - /** - * Get the sector associated with the given id. - */ - iSector* GetSectorByID(ocID id); - - /** - * Get the ID associated with the given sector. - */ - ocID GetIDBySector(iSector* sector); - }; - #endif // OCPLAYER_H --- 47,49 ---- --- NEW FILE: ocentityreg.h --- /* * ocentityreg.h * Copyright (C) 2003-2004 by Th Once developement 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 OCENTIYREG_H #define OCENTIYREG_H #include "csutil/hash.h" #include "iengine/sector.h" #include "physicallayer/pl.h" #include "common/ocidentifier.h" /** * The sector registry. It can be used to do ID <-> sector conversion. */ class ocSectorRegistry { private: /// The internal hash. csHash<iSector*, ocID> sector_reg; public: /** * Get the sector corresponding to this ID. */ iSector* GetSectorByID(ocID id) const { return sector_reg.Get(id, 0); } /** * Get the ID corresponding to this sector. */ static ocID GetIDBySector(iSector* sector); /** * Register an entity. This entity isn't necessarily an area. If it is not, * this function will do nothing and return false. */ bool Register(ocID id, iCelEntity* entity); /** * Unregister an entity. You can call this even if it is not in the registry. */ bool Unregister(ocID id); /** * Unregister all entities. This don't delete them from the physical layer! */ void UnregisterAll() { sector_reg.DeleteAll(); } }; /** * This class is used to store, find and map entities. * It is composed of sub registry. Currently: * - Sector registry. * - Player registry. */ class ocEntityRegistry { private: /// The sector registry. ocSectorRegistry sector_reg; /// The internal hash. csHash<iCelEntity*, ocID> entity_reg; public: /** * Get an entity according to his ID. */ iCelEntity* Get(ocID id) { return entity_reg.Get(id, 0); } /** * Register an entity with his ID. This will take care of registering it * in the sub registry, if necessary. */ void Register(ocID id, iCelEntity* entity); /** * Unregister an entity with given ID. */ void Unregister(ocID id); /** * Unregister all entities. This don't delete them from the physical layer! */ void UnregisterAll(); /** * Get the sub sector registry. */ const ocSectorRegistry* GetSectorRegistry() { return §or_reg; } }; #endif Index: ocidentifier.h =================================================================== RCS file: /cvsroot/once/oncecode/src/common/ocidentifier.h,v retrieving revision 1.19.2.1 retrieving revision 1.19.2.2 diff -C2 -d -r1.19.2.1 -r1.19.2.2 *** ocidentifier.h 1 Aug 2004 17:04:40 -0000 1.19.2.1 --- ocidentifier.h 28 Aug 2004 20:40:11 -0000 1.19.2.2 *************** *** 25,28 **** --- 25,29 ---- typedef uint32 ocRaceID; typedef uint32 ocID; + #define ocInvalidID ((ocID) -1) /// this macro makes an int from 4 characters Index: ocapplication.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/common/ocapplication.cpp,v retrieving revision 1.4.2.2 retrieving revision 1.4.2.3 diff -C2 -d -r1.4.2.2 -r1.4.2.3 *** ocapplication.cpp 24 Aug 2004 20:24:12 -0000 1.4.2.2 --- ocapplication.cpp 28 Aug 2004 20:40:11 -0000 1.4.2.3 *************** *** 38,41 **** --- 38,42 ---- #include "physicallayer/pl.h" + #include "common/ocentityreg.h" #include "common/ocloader.h" #include "common/ocfactory.h" *************** *** 59,63 **** content_tree = 0; settings_mgr = 0; ! area_registry = 0; } --- 60,64 ---- content_tree = 0; settings_mgr = 0; ! entity_registry = 0; } *************** *** 74,78 **** delete content_tree; content_tree = 0; delete settings_mgr; settings_mgr = 0; ! delete area_registry; area_registry = 0; } --- 75,79 ---- delete content_tree; content_tree = 0; delete settings_mgr; settings_mgr = 0; ! delete entity_registry; entity_registry = 0; } *************** *** 204,209 **** settings_mgr = new ocSettingsMgr(ds, vfs); ! // Create modules: Area registry ! area_registry = new ocAreaRegistry(engine, pl); return true; --- 205,210 ---- settings_mgr = new ocSettingsMgr(ds, vfs); ! // Create modules: Entity registry ! entity_registry = new ocEntityRegistry(); return true; Index: ocarea.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/common/ocarea.cpp,v retrieving revision 1.14.2.5 retrieving revision 1.14.2.6 diff -C2 -d -r1.14.2.5 -r1.14.2.6 *** ocarea.cpp 24 Aug 2004 20:24:12 -0000 1.14.2.5 --- ocarea.cpp 28 Aug 2004 20:40:11 -0000 1.14.2.6 *************** *** 46,90 **** return buf.ReadString(area_name); } - - //------------------------------ ocAreaRegistry ------------------------------ - ocAreaRegistry::ocAreaRegistry(csRef<iEngine> eng, csRef<iCelPlLayer> p) : - engine(eng), - pl(p) - { - } - - void ocAreaRegistry::Register(ocID id, iCelEntity* entity) - { - toentity_reg.Put(id, entity); - } - - void ocAreaRegistry::UnregisterAll() - { - toentity_reg.DeleteAll(); - } - - iSector* ocAreaRegistry::GetSectorByID(ocID id) - { - iCelEntity* entity = toentity_reg.Get(id, 0); - if (!entity) - return 0; - - csRef<iPcRegion> pcregion = CEL_QUERY_PROPCLASS_ENT(entity, iPcRegion); - CS_ASSERT(pcregion); - - const char* regionname = pcregion->GetRegionName(); - iRegion* region = engine->GetRegions()->FindByName(regionname); - CS_ASSERT(region); - iSector* sector = engine->FindSector(regionname, region); - CS_ASSERT(sector); - - return sector; - } - - ocID ocAreaRegistry::GetIDBySector(iSector* sect) - { - iCelEntity* ent = pl->FindAttachedEntity(sect->QueryObject()); - csRef<iOnceBehaviour> oncebehave = SCF_QUERY_INTERFACE(ent->GetBehaviour(), - iOnceBehaviour); - return oncebehave->GetID(); - } --- 46,47 ---- Index: ocloader.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/common/ocloader.cpp,v retrieving revision 1.15.2.5 retrieving revision 1.15.2.6 diff -C2 -d -r1.15.2.5 -r1.15.2.6 *** ocloader.cpp 27 Aug 2004 17:25:29 -0000 1.15.2.5 --- ocloader.cpp 28 Aug 2004 20:40:11 -0000 1.15.2.6 *************** *** 132,144 **** } - csRef<iCelPropertyClass> pc = - SCF_QUERY_INTERFACE(pcregion, iCelPropertyClass); - iCelEntity* entity = pc->GetEntity(); - csRef<iOnceBehaviour> behave = - SCF_QUERY_INTERFACE(entity->GetBehaviour(), iOnceBehaviour); - - pl->AttachEntity(sector->QueryObject(), entity); - app->GetAreaRegistry()->Register(behave->GetID(), entity); - return true; } --- 132,135 ---- |