From: <vo...@us...> - 2008-08-20 20:34:26
|
Revision: 800 http://opde.svn.sourceforge.net/opde/?rev=800&view=rev Author: volca Date: 2008-08-20 20:34:34 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Shared OpdeLib Modified Paths: -------------- trunk/src/bindings/CMakeLists.txt trunk/src/services/script/CMakeLists.txt trunk/src/tools/CMakeLists.txt Modified: trunk/src/bindings/CMakeLists.txt =================================================================== --- trunk/src/bindings/CMakeLists.txt 2008-08-20 20:32:54 UTC (rev 799) +++ trunk/src/bindings/CMakeLists.txt 2008-08-20 20:34:34 UTC (rev 800) @@ -55,9 +55,5 @@ ) target_link_libraries(OpdePythonBindings - ${OGRE_LIBRARIES} - ${OPDE_BASE_LIBRARIES} - ${PYTHON_LIBRARIES} - ${OPDE_SERVICE_LIBRARIES} - OpdeRoot + OpdeLib ) Modified: trunk/src/services/script/CMakeLists.txt =================================================================== --- trunk/src/services/script/CMakeLists.txt 2008-08-20 20:32:54 UTC (rev 799) +++ trunk/src/services/script/CMakeLists.txt 2008-08-20 20:34:34 UTC (rev 800) @@ -20,8 +20,6 @@ add_library (OpdeScriptService ScriptService.cpp ScriptService.h) -target_link_libraries(OpdeScriptService - OpdeBase - OpdeServiceManager - OpdeRoot -) \ No newline at end of file +#target_link_libraries(OpdeScriptService +# OpdeLib +#) \ No newline at end of file Modified: trunk/src/tools/CMakeLists.txt =================================================================== --- trunk/src/tools/CMakeLists.txt 2008-08-20 20:32:54 UTC (rev 799) +++ trunk/src/tools/CMakeLists.txt 2008-08-20 20:34:34 UTC (rev 800) @@ -8,9 +8,9 @@ add_executable ( meshconvert meshconvert.cpp ) -add_executable (chunk chunk.cpp) +add_executable ( chunk chunk.cpp ) -add_executable (DarkFontConverter DarkFontConverter.cpp) +add_executable ( DarkFontConverter DarkFontConverter.cpp ) target_link_libraries( chunk ${OGRE_LIBRARIES} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-08-25 01:52:13
|
Revision: 807 http://opde.svn.sourceforge.net/opde/?rev=807&view=rev Author: patryn Date: 2008-08-25 01:52:18 +0000 (Mon, 25 Aug 2008) Log Message: ----------- Got rid of 37 warnings. Modified Paths: -------------- trunk/src/base/console/ConsoleBackend.cpp trunk/src/base/console/ConsoleBackend.h trunk/src/base/console/ConsoleFrontend.cpp trunk/src/base/console/ConsoleFrontend.h trunk/src/base/file/File.cpp trunk/src/base/file/File.h trunk/src/base/loaders/ManualBinFileLoader.cpp trunk/src/base/loaders/ManualFonFileLoader.cpp trunk/src/bindings/DatabaseServiceBinder.cpp trunk/src/bindings/InputServiceBinder.cpp trunk/src/bindings/QuickGUIBindings.cpp trunk/src/main/CustomImageCodec.cpp trunk/src/main/DTypeScriptCompiler.cpp trunk/src/main/PLDefScriptCompiler.cpp trunk/src/services/binary/BinaryService.cpp trunk/src/services/input/InputService.cpp trunk/src/services/link/Relation.cpp trunk/src/services/property/PropertyGroup.cpp trunk/src/services/render/RenderService.cpp trunk/src/services/worldrep/WorldRepService.cpp Modified: trunk/src/base/console/ConsoleBackend.cpp =================================================================== --- trunk/src/base/console/ConsoleBackend.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/console/ConsoleBackend.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -151,12 +151,12 @@ return false; } - void ConsoleBackend::pullMessages(std::vector<Ogre::String>& target, int pos, unsigned int lines) { + void ConsoleBackend::pullMessages(std::vector<Ogre::String>& target, unsigned int pos, unsigned int lines) { // add the lines from the mMessages backwards std::deque < Ogre::String >::iterator it; - int size = mMessages.size(); + unsigned int size = mMessages.size(); if (pos >= size) { pos = size - 1; Modified: trunk/src/base/console/ConsoleBackend.h =================================================================== --- trunk/src/base/console/ConsoleBackend.h 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/console/ConsoleBackend.h 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id:$ + * $Id$ * *****************************************************************************/ @@ -102,7 +102,7 @@ @param linenum The start line to load. -1 means we will pull up to #lines from end of the vector @param lines the maximal count of lines to load */ - void pullMessages(std::vector<Ogre::String>& target, int pos, unsigned int lines); + void pullMessages(std::vector<Ogre::String>& target, unsigned int pos, unsigned int lines); // Singleton stuff static ConsoleBackend& getSingleton(void); Modified: trunk/src/base/console/ConsoleFrontend.cpp =================================================================== --- trunk/src/base/console/ConsoleFrontend.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/console/ConsoleFrontend.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -17,6 +17,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * $Id$ + * *****************************************************************************/ Modified: trunk/src/base/console/ConsoleFrontend.h =================================================================== --- trunk/src/base/console/ConsoleFrontend.h 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/console/ConsoleFrontend.h 2008-08-25 01:52:18 UTC (rev 807) @@ -17,6 +17,8 @@ * 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 __CONSOLEFRONTEND_H @@ -63,7 +65,7 @@ Ogre::String mCommand; - int mPosition; + unsigned int mPosition; ConsoleBackend* mConsoleBackend; }; Modified: trunk/src/base/file/File.cpp =================================================================== --- trunk/src/base/file/File.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/file/File.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id$ + * *****************************************************************************/ #include <OgreLogManager.h> Modified: trunk/src/base/file/File.h =================================================================== --- trunk/src/base/file/File.h 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/file/File.h 2008-08-25 01:52:18 UTC (rev 807) @@ -17,6 +17,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * $Id$ + * *****************************************************************************/ Modified: trunk/src/base/loaders/ManualBinFileLoader.cpp =================================================================== --- trunk/src/base/loaders/ManualBinFileLoader.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/loaders/ManualBinFileLoader.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -1397,7 +1397,7 @@ try { TextureManager::getSingleton().load(txtname, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D); - } catch (Exception &e) { + } catch (Exception) { // Error loading from txt16... txtname = String("txt/") + String(mat.name); } @@ -1885,7 +1885,7 @@ TextureManager::getSingleton().load(txtname, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D); - } catch (Exception &e) { + } catch (Exception) { // Error loading from txt16... txtname = String("txt/") + String(mat.name); } Modified: trunk/src/base/loaders/ManualFonFileLoader.cpp =================================================================== --- trunk/src/base/loaders/ManualFonFileLoader.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/base/loaders/ManualFonFileLoader.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -232,7 +232,7 @@ { Stream = Ogre::ResourceGroupManager::getSingleton().openResource(mPaletteFileName, mFontGroup, true); mPaletteFile = new OgreFile(Stream); - } catch(Ogre::FileNotFoundException &e) { + } catch(Ogre::FileNotFoundException) { // Could not find resource, use the default table LogManager::getSingleton().logMessage("Specified palette file not found - using default palette!"); return (RGBQUAD*)ColorTable; Modified: trunk/src/bindings/DatabaseServiceBinder.cpp =================================================================== --- trunk/src/bindings/DatabaseServiceBinder.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/bindings/DatabaseServiceBinder.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -157,7 +157,7 @@ result = Py_None; Py_INCREF(result); return result; - } catch (BasicException& ex) { + } catch (BasicException) { PyErr_SetString(PyExc_TypeError, "Error setting a callback, is the given argument a callable?"); return NULL; } Modified: trunk/src/bindings/InputServiceBinder.cpp =================================================================== --- trunk/src/bindings/InputServiceBinder.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/bindings/InputServiceBinder.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -202,7 +202,7 @@ result = Py_None; Py_INCREF(result); return result; - } catch (BasicException& ex) { + } catch (BasicException) { PyErr_SetString(PyExc_TypeError, "Error setting a callback, is the given argument a callable?"); return NULL; } Modified: trunk/src/bindings/QuickGUIBindings.cpp =================================================================== --- trunk/src/bindings/QuickGUIBindings.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/bindings/QuickGUIBindings.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -597,7 +597,7 @@ PyObject* handle = slot->getPythonSideObject(); return handle; - } catch(Opde::BasicException& e) { + } catch(Opde::BasicException) { PyErr_SetString(PyExc_TypeError, "Given callback handle is probably invalid!"); return NULL; } Modified: trunk/src/main/CustomImageCodec.cpp =================================================================== --- trunk/src/main/CustomImageCodec.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/main/CustomImageCodec.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -16,6 +16,8 @@ * 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$ * *****************************************************************************/ @@ -69,7 +71,7 @@ try { msReplacedCodecs[*v] = Codec::getCodec(*v); - } catch (Ogre::Exception &e) { + } catch (Ogre::Exception) { // Nothing to do... that means the codec was not registered by the previous codec impl. } Modified: trunk/src/main/DTypeScriptCompiler.cpp =================================================================== --- trunk/src/main/DTypeScriptCompiler.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/main/DTypeScriptCompiler.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -335,7 +335,7 @@ DTypeDefPtr DTypeScriptCompiler::getTypeDef(const std::string& name) { try { return mBinaryService->getType(mGroupName, name); - } catch (BasicException& ex) { + } catch (BasicException) { try { if (mGroupName != "") { return mBinaryService->getType("", name); @@ -343,7 +343,7 @@ logParseError("Type definition not found : " + name); return NULL; } - } catch (BasicException& ex) { + } catch (BasicException) { logParseError("Type definition not found : " + name); return NULL; } @@ -354,7 +354,7 @@ DEnumPtr DTypeScriptCompiler::getEnum(const std::string& name) { try { return mBinaryService->getEnum(mGroupName, name); - } catch (BasicException& ex) { + } catch (BasicException) { try { if (mGroupName != "") { return mBinaryService->getEnum("", name); @@ -362,7 +362,7 @@ logParseError("Enum definition not found : " + name); return NULL; } - } catch (BasicException& ex) { + } catch (BasicException) { logParseError("Enum definition not found : " + name); return NULL; } @@ -436,7 +436,7 @@ mCurrentState.enumeration->insert(keyname, val); - } catch (runtime_error &e) { + } catch (runtime_error) { logParseError("error while constructing key value : " + value); } } @@ -587,7 +587,7 @@ templ = DVariant(type, getNextTokenLabel()); hasDefault = true; - } catch (runtime_error &ex) { + } catch (runtime_error) { logParseError("Exception while constructing the default field's '" + name + "' value"); } } Modified: trunk/src/main/PLDefScriptCompiler.cpp =================================================================== --- trunk/src/main/PLDefScriptCompiler.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/main/PLDefScriptCompiler.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -16,6 +16,9 @@ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA, or go to * http://www.gnu.org/copyleft/lesser.txt. + * + * $Id$ + * *****************************************************************************/ // Inspired by Ogre's material compiler, parts of the code were taken from the Ogre projects @@ -236,7 +239,7 @@ DTypeDefPtr PLDefScriptCompiler::getTypeDef(const std::string& group, const std::string& name) { try { return mBinaryService->getType(group, name); - } catch (BasicException& ex) { + } catch (BasicException) { try { if (group != "") { return mBinaryService->getType("", name); @@ -244,7 +247,7 @@ logParseError("Type definition not found : '" + name + "'"); return NULL; } - } catch (BasicException& ex) { + } catch (BasicException) { logParseError("Type definition not found : '" + name + "'"); return NULL; } Modified: trunk/src/services/binary/BinaryService.cpp =================================================================== --- trunk/src/services/binary/BinaryService.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/services/binary/BinaryService.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -171,7 +171,7 @@ try { type = getType(parameters); - } catch (BasicException &e) { + } catch (BasicException) { LOG_ERROR("Type not found : %s", parameters.c_str()); return; } Modified: trunk/src/services/input/InputService.cpp =================================================================== --- trunk/src/services/input/InputService.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/services/input/InputService.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ Modified: trunk/src/services/link/Relation.cpp =================================================================== --- trunk/src/services/link/Relation.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/services/link/Relation.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -17,6 +17,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * $Id$ + * *****************************************************************************/ @@ -123,7 +125,7 @@ // let's open the L$NAME and LD$NAME files in the db try { flink = db->getFile(lchn); - } catch (BasicException& e) { + } catch (BasicException) { LOG_FATAL("Relation::load : Could not find the Link chunk %s", lchn.c_str()); return; } Modified: trunk/src/services/property/PropertyGroup.cpp =================================================================== --- trunk/src/services/property/PropertyGroup.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/services/property/PropertyGroup.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -87,7 +87,7 @@ if (hdr.version_high != mVerMaj || hdr.version_low != mVerMin) { 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& e) { + } catch (BasicException) { LOG_FATAL("PropertyGroup::load : Could not find the property chunk %s", pchn.c_str()); return; } @@ -122,7 +122,7 @@ try { fprop = db->createFile(pchn, mVerMaj, mVerMin); - } catch (BasicException& e) { + } catch (BasicException) { LOG_FATAL("PropertyGroup::save : Could not create property chunk %s", pchn.c_str()); return; } Modified: trunk/src/services/render/RenderService.cpp =================================================================== --- trunk/src/services/render/RenderService.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/services/render/RenderService.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * - * $Id$ + * $Id$ * *****************************************************************************/ @@ -737,7 +737,7 @@ // First, try to load the mesh directly as a mesh file Ogre::MeshPtr mesh1 = Ogre::MeshManager::getSingleton().load(fname, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - } catch (FileNotFoundException &e) { + } catch (FileNotFoundException) { // Undefine in advance, so there will be no clash Ogre::MeshManager::getSingleton().remove(fname); // If it is not found @@ -747,9 +747,9 @@ try { Ogre::MeshPtr mesh1 = Ogre::MeshManager::getSingleton().create(fname, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, true, mManualBinFileLoader); - } catch (FileNotFoundException &e) { + } catch (FileNotFoundException) { LOG_ERROR("RenderService::prepareMesh: Could not find the requested model %s", name.c_str()); - } catch (Opde::FileException &e) { + } catch (Opde::FileException) { LOG_ERROR("RenderService::prepareMesh: Could not load the requested model %s", name.c_str()); } } @@ -766,7 +766,7 @@ try { node = getSceneNode(id); - } catch (BasicException& e) { + } catch (BasicException) { LOG_ERROR("RenderService: Could not get the sceneNode for object %d! Not attaching object model!", id); mSceneMgr->destroyEntity(ent); return; Modified: trunk/src/services/worldrep/WorldRepService.cpp =================================================================== --- trunk/src/services/worldrep/WorldRepService.cpp 2008-08-23 07:24:33 UTC (rev 806) +++ trunk/src/services/worldrep/WorldRepService.cpp 2008-08-25 01:52:18 UTC (rev 807) @@ -450,7 +450,7 @@ Opde::FilePtr flow_tex; try { flow_tex = db->getFile("FLOW_TEX"); - } catch (FileException &e) { + } catch (FileException) { LOG_INFO("Flow chunk does not exist. Water materials may not be correctly displayed", "WorldRepService::loadFlowTextures"); return; } @@ -554,7 +554,7 @@ loaded = true; break; // we got it! - } catch (Ogre::Exception& e) { + } catch (Ogre::Exception) { // Nothing. We are trying more extensions } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-08-31 14:13:38
|
Revision: 813 http://opde.svn.sourceforge.net/opde/?rev=813&view=rev Author: volca Date: 2008-08-31 14:13:39 +0000 (Sun, 31 Aug 2008) Log Message: ----------- * introducing static_pointer_cast (as seen in boost::shared_ptr), getting rid of .as<>() * fixing a few warnings Modified Paths: -------------- trunk/src/base/SharedPtr.h trunk/src/main/DTypeScriptCompiler.cpp trunk/src/main/GameLoadState.cpp trunk/src/main/GamePlayState.cpp trunk/src/main/GameStateManager.cpp trunk/src/main/PLDefScriptCompiler.cpp trunk/src/main/Root.cpp trunk/src/services/game/GameService.cpp trunk/src/services/gui/GUIService.cpp trunk/src/services/inherit/InheritService.cpp trunk/src/services/input/InputService.cpp trunk/src/services/link/LinkService.cpp trunk/src/services/loop/LoopService.cpp trunk/src/services/object/ObjectService.cpp trunk/src/services/property/PropertyGroup.cpp trunk/src/services/render/RenderService.cpp trunk/src/services/worldrep/WRCell.cpp trunk/src/services/worldrep/WorldRepService.cpp Modified: trunk/src/base/SharedPtr.h =================================================================== --- trunk/src/base/SharedPtr.h 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/base/SharedPtr.h 2008-08-31 14:13:39 UTC (rev 813) @@ -55,8 +55,14 @@ } public: + /** Helper ctor for shared_ptr casting with static_pointer_cast<U>(). + * @warning Do not use directly */ + shared_ptr(T* ptr, unsigned int *refs) : mPtr(ptr), mReferences(refs) { + ++(*mReferences); + } + /// conversion ctor - template<class U> shared_ptr(shared_ptr<U> const & a) : mPtr(a.mPtr), mReferences(a.mReferences) { + template<class U> shared_ptr(shared_ptr<U>& a) : mPtr(a.mPtr), mReferences(a.mReferences) { if (mReferences) ++(*mReferences); } @@ -76,7 +82,7 @@ mReferences = new unsigned int(1); } }; - + ~shared_ptr() { release(); } @@ -108,19 +114,7 @@ return (mPtr == NULL); } - /// static cast - template<class U> shared_ptr<U> as() { - // of course, Dynamic cast would be safer, then again, slower - U* ptr = static_cast<U*>(mPtr); - - ++(*mReferences); - - shared_ptr<U> n = shared_ptr<U>(ptr, mReferences); - - return n; - } - - unsigned int getRefCount() { + unsigned int getRefCount() const { return (*mReferences); } @@ -132,21 +126,27 @@ } - private: - /** Helper ctor for shared_ptr casting with as<U>() - */ - shared_ptr(T* ptr, unsigned int *refs) : mPtr(ptr), mReferences(refs) { + unsigned int* getRefCountPtr(void) const { + return mReferences; } + }; template<class A, class B> inline bool operator==(shared_ptr<A> const& a, shared_ptr<B> const& b) { return a.ptr() == b.ptr(); - } + } - template<class A, class B> inline bool operator!=(shared_ptr<A> const& a, shared_ptr<B> const& b) { - return a.ptr() != b.ptr(); - } + template<class A, class B> inline bool operator!=(shared_ptr<A> const& a, shared_ptr<B> const& b) { + return a.ptr() != b.ptr(); + } + /// static cast of the shared_ptr + template<class U, class V> shared_ptr<U> static_pointer_cast(const shared_ptr<V>& src) { + U* ptr = static_cast<U*>(src.ptr()); + + return shared_ptr<U>(ptr, src.getRefCountPtr()); + } + } // namespace Opde #endif Modified: trunk/src/main/DTypeScriptCompiler.cpp =================================================================== --- trunk/src/main/DTypeScriptCompiler.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/main/DTypeScriptCompiler.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -116,7 +116,7 @@ mGroupName = ""; ServiceManager* svcmgr = ServiceManager::getSingletonPtr(); - mBinaryService = svcmgr->getService("BinaryService").as<BinaryService>(); + mBinaryService = static_pointer_cast<BinaryService>(svcmgr->getService("BinaryService")); mCurrentState.state = CS_UNKNOWN; } Modified: trunk/src/main/GameLoadState.cpp =================================================================== --- trunk/src/main/GameLoadState.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/main/GameLoadState.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -46,7 +46,8 @@ mRoot = Root::getSingletonPtr(); mOverlayMgr = OverlayManager::getSingletonPtr(); mServiceMgr = ServiceManager::getSingletonPtr(); - mConfigService = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); + + mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); mFontTest = false; @@ -101,7 +102,7 @@ mSceneMgr->addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY); mSceneMgr->setSpecialCaseRenderQueueMode(SceneManager::SCRQM_INCLUDE); - RenderServicePtr renderSrv = ServiceManager::getSingleton().getService("RenderService").as<RenderService>(); + RenderServicePtr renderSrv = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); mCamera = renderSrv->getDefaultCamera(); mViewport = renderSrv->getDefaultViewport(); @@ -159,9 +160,9 @@ mRoot->renderOneFrame(); - GameServicePtr gsvc = mServiceMgr->getService("GameService").as<GameService>(); + GameServicePtr gsvc = static_pointer_cast<GameService>(mServiceMgr->getService("GameService")); - std::string misFile = mConfigService->getParam("mission"); + std::string misFile = mConfigService->getParam("mission"); gsvc->load(misFile); Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/main/GamePlayState.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -41,7 +41,7 @@ template<> GamePlayState* Singleton<GamePlayState>::ms_Singleton = 0; - GamePlayState::GamePlayState() : mSceneMgr(NULL), mDebugOverlay(NULL), mToLoadScreen(true) { + GamePlayState::GamePlayState() : mSceneMgr(NULL), mToLoadScreen(true), mDebugOverlay(NULL) { /// Register as a command listener, so we can load different levels Opde::ConsoleBackend::getSingleton().registerCommandListener("load", dynamic_cast<ConsoleCommandListener*>(this)); Opde::ConsoleBackend::getSingleton().setCommandHint("load", "Loads a specified mission file"); @@ -56,10 +56,8 @@ mSceneDisplay = false; // Try to remap the parameters with those listed in the configuration - mConfigService = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); - GameStateManager* gsm = GameStateManager::getSingletonPtr(); + mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); - if (mConfigService->hasParam("move_speed")) mMoveSpeed = mConfigService->getParam("move_speed").toFloat(); @@ -106,8 +104,7 @@ void GamePlayState::start() { LOG_INFO("GamePlayState: Starting"); - PropertyGroup* posPG = ServiceManager::getSingleton().getService("PropertyService"). - as<PropertyService>()->getPropertyGroup("Position"); + PropertyGroup* posPG = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService"))->getPropertyGroup("Position"); if (posPG == NULL) OPDE_EXCEPT("Could not get Position property group. Not defined. Fatal", "GamePlayState::start"); @@ -126,7 +123,7 @@ // std::string tmp = PropertyGroup->get(StartingPointObjID, "SymName").toString(); mSceneMgr = mRoot->getSceneManager( "DarkSceneManager" ); - RenderServicePtr renderSrv = ServiceManager::getSingleton().getService("RenderService").as<RenderService>(); + RenderServicePtr renderSrv = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); mCamera = renderSrv->getDefaultCamera(); mViewport = renderSrv->getDefaultViewport(); @@ -459,7 +456,7 @@ } void GamePlayState::bootstrapFinished() { - mLinkService = ServiceManager::getSingleton().getService("LinkService").as<LinkService>(); + mLinkService = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); Relation::ListenerPtr metaPropCallback = new ClassCallback<LinkChangeMsg, GamePlayState>(this, &GamePlayState::onLinkPlayerFactoryMsg); Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/main/GameStateManager.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -176,13 +176,13 @@ // Register the worldrep service factory registerServiceFactories(); - mConfigService = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); + mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); mConfigService->loadParams("opde.cfg"); RenderServicePtr rends; - rends = ServiceManager::getSingleton().getService("RenderService").as<RenderService>(); + rends = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); // Setup resources. setupResources(); @@ -312,7 +312,7 @@ } void GameStateManager::setupInputSystem() { - mInputService = ServiceManager::getSingleton().getService("InputService").as<InputService>(); + mInputService = static_pointer_cast<InputService>(ServiceManager::getSingleton().getService("InputService")); mInputService->createBindContext("game"); mInputService->setBindContext("game"); Modified: trunk/src/main/PLDefScriptCompiler.cpp =================================================================== --- trunk/src/main/PLDefScriptCompiler.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/main/PLDefScriptCompiler.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -97,9 +97,9 @@ // default to global definition group ServiceManager* svcmgr = ServiceManager::getSingletonPtr(); - mLinkService = svcmgr->getService("LinkService").as<LinkService>(); - mBinaryService = svcmgr->getService("BinaryService").as<BinaryService>(); - mPropertyService = svcmgr->getService("PropertyService").as<PropertyService>(); + mLinkService = static_pointer_cast<LinkService>(svcmgr->getService("LinkService")); + mBinaryService = static_pointer_cast<BinaryService>(svcmgr->getService("BinaryService")); + mPropertyService = static_pointer_cast<PropertyService>(svcmgr->getService("PropertyService")); mCurrentState.state = CS_UNKNOWN; } Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/main/Root.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -57,9 +57,9 @@ mServiceMgr(NULL), mOgreRoot(NULL), mOgreLogManager(NULL), + mConsoleBackend(NULL), mDTypeScriptCompiler(NULL), mPLDefScriptCompiler(NULL), - mConsoleBackend(NULL), mServiceMask(serviceMask), mDTypeScriptLdr(NULL), mPLDefScriptLdr(NULL) { @@ -153,7 +153,7 @@ // ------------------------------------------------------- void Root::loadConfigFile(const std::string& fileName) { - ConfigServicePtr cfp = mServiceMgr->getService("ConfigService").as<ConfigService>(); + ConfigServicePtr cfp = static_pointer_cast<ConfigService>(mServiceMgr->getService("ConfigService")); cfp->loadParams(fileName); } @@ -236,7 +236,7 @@ // Loop modes are only setup if not masked by global service mask if (mServiceMask & SERVICE_ENGINE) { // Loop modes are hardcoded - LoopServicePtr ls = ServiceManager::getSingleton().getService("LoopService").as<LoopService>(); + LoopServicePtr ls = static_pointer_cast<LoopService>(ServiceManager::getSingleton().getService("LoopService")); // Create all the required loop services LoopModeDefinition def; Modified: trunk/src/services/game/GameService.cpp =================================================================== --- trunk/src/services/game/GameService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/game/GameService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -32,7 +32,7 @@ /*-------------------- GameService -------------------*/ /*----------------------------------------------------*/ GameService::GameService(ServiceManager *manager, const std::string& name) : Service(manager, name) { - mDbService = ServiceManager::getSingleton().getService("DatabaseService").as<DatabaseService>(); + mDbService = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService("DatabaseService")); } //------------------------------------------------------ Modified: trunk/src/services/gui/GUIService.cpp =================================================================== --- trunk/src/services/gui/GUIService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/gui/GUIService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -185,7 +185,7 @@ // Nothing to do, we have to wait for RenderService to settle in init... Better do everything in bootstrapFinished thus // One thing happens here though - loading of the mapping file based on a config file value - ConfigServicePtr cfp = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); + ConfigServicePtr cfp = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); // if we have a config value (and the specified file is loadable), load the mapping file DVariant val; @@ -212,8 +212,8 @@ // ----------------------------------- void GUIService::bootstrapFinished() { - mInputSrv = ServiceManager::getSingleton().getService("InputService").as<InputService>(); - mRenderSrv = ServiceManager::getSingleton().getService("RenderService").as<RenderService>(); + mInputSrv = static_pointer_cast<InputService>(ServiceManager::getSingleton().getService("InputService")); + mRenderSrv = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); mRoot = new QuickGUI::Root(); Modified: trunk/src/services/inherit/InheritService.cpp =================================================================== --- trunk/src/services/inherit/InheritService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/inherit/InheritService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -126,7 +126,7 @@ bool InheritService::init() { // Link Service should have created us automatically through service masks. // So we can register as a link service listener - mLinkService = ServiceManager::getSingleton().getService("LinkService").as<LinkService>(); + mLinkService = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); if (mLinkService.isNull()) { LOG_FATAL("InheritService::init: LinkService does not exist?"); Modified: trunk/src/services/input/InputService.cpp =================================================================== --- trunk/src/services/input/InputService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/input/InputService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -300,9 +300,9 @@ size_t windowHnd = 0; std::ostringstream windowHndStr; - mConfigService = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); - - mRenderService = ServiceManager::getSingleton().getService("RenderService").as<RenderService>(); + mConfigService = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); + mRenderService = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); + mRenderWindow = mRenderService->getRenderWindow(); // Get window handle @@ -368,7 +368,7 @@ // Last step: Get the loop service and register as a listener - mLoopService = ServiceManager::getSingleton().getService("LoopService").as<LoopService>(); + mLoopService = static_pointer_cast<LoopService>(ServiceManager::getSingleton().getService("LoopService")); mLoopService->addLoopClient(this); return true; Modified: trunk/src/services/link/LinkService.cpp =================================================================== --- trunk/src/services/link/LinkService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/link/LinkService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -80,7 +80,7 @@ // Ensure link listeners are created mServiceManager->createByMask(SERVICE_LINK_LISTENER); - mDatabaseService = ServiceManager::getSingleton().getService("DatabaseService").as<DatabaseService>(); + mDatabaseService = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService("DatabaseService")); } //------------------------------------------------------ @@ -92,7 +92,7 @@ The Relations chunk should be present, and the same for all File Groups As we do not know if something was already initialised or not, we just request mapping and see if it goes or not */ - BinaryServicePtr bs = ServiceManager::getSingleton().getService("BinaryService").as<BinaryService>(); + // BinaryServicePtr bs = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService("BinaryService")); FilePtr rels = db->getFile("Relations"); Modified: trunk/src/services/loop/LoopService.cpp =================================================================== --- trunk/src/services/loop/LoopService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/loop/LoopService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -233,8 +233,7 @@ //------------------------------------------------------ void LoopService::run() { - float deltaTime = 0.0; - + if (mNewModeRequested) { // See if there is a loop mode pending... mNewModeRequested = false; setLoopMode(mNewLoopMode); Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/object/ObjectService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -218,7 +218,7 @@ //------------------------------------------------------ void ObjectService::createBuiltinResources() { - mPropertyService = ServiceManager::getSingleton().getService("PropertyService").as<PropertyService>(); + mPropertyService = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService")); // DonorType property (single integer property): // mPropertyService->createPropertyGroup(); @@ -233,12 +233,12 @@ // Register as a database listener mDbCallback = new ClassCallback<DatabaseChangeMsg, ObjectService>(this, &ObjectService::onDBChange); - mDatabaseService = ServiceManager::getSingleton().getService("DatabaseService").as<DatabaseService>(); + mDatabaseService = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService("DatabaseService")); mDatabaseService->registerListener(mDbCallback, DBP_OBJECT); - mInheritService = ServiceManager::getSingleton().getService("InheritService").as<InheritService>(); - mLinkService = ServiceManager::getSingleton().getService("LinkService").as<LinkService>(); - mPropertyService = ServiceManager::getSingleton().getService("PropertyService").as<PropertyService>(); + mInheritService = static_pointer_cast<InheritService>(ServiceManager::getSingleton().getService("InheritService")); + mLinkService = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); + mPropertyService = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService")); // For SceneNodes mPropPosition = mPropertyService->getPropertyGroup("Position"); @@ -323,6 +323,9 @@ size_t bsize = f->size() - 2 * sizeof(int32_t); unsigned char* bitmap = new unsigned char[bsize + 1]; + + for (size_t idx = 0; idx <= bsize; idx++) // fill the whole buf with zeros, even the padding at the end + bitmap[idx] = 0; f->read(bitmap, bsize); @@ -571,7 +574,7 @@ //------------------------------------------------------ void ObjectService::resetMinMaxID() { - ConfigServicePtr cfp = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); + ConfigServicePtr cfp = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); DVariant val; // Config Values: obj_min, obj_max Modified: trunk/src/services/property/PropertyGroup.cpp =================================================================== --- trunk/src/services/property/PropertyGroup.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/property/PropertyGroup.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -41,7 +41,7 @@ mBuiltin(false) { // Find the inheritor by the name, and assign too - InheritServicePtr inhs = ServiceManager::getSingleton().getService("InheritService").as<InheritService>(); + InheritServicePtr inhs = static_pointer_cast<InheritService>(ServiceManager::getSingleton().getService("InheritService")); mInheritor = inhs->createInheritor(inheritorName); // And as a final step, register as inheritor listener Modified: trunk/src/services/render/RenderService.cpp =================================================================== --- trunk/src/services/render/RenderService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/render/RenderService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -65,12 +65,12 @@ /*--------------------- RenderService --------------------*/ /*--------------------------------------------------------*/ RenderService::RenderService(ServiceManager *manager, const std::string& name) : Service(manager, name), + mRoot(NULL), mSceneMgr(NULL), - mRoot(NULL), mRenderWindow(NULL), mDarkSMFactory(NULL), + mDefaultCamera(NULL), mLoopService(NULL), - mDefaultCamera(NULL), mEditorMode(false) { // 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 @@ -167,7 +167,7 @@ mRenderWindow->addViewport( mDefaultCamera ); // Last step: Get the loop service and register as a listener - mLoopService = ServiceManager::getSingleton().getService("LoopService").as<LoopService>(); + mLoopService = static_pointer_cast<LoopService>(ServiceManager::getSingleton().getService("LoopService")); mLoopService->addLoopClient(this); // prepare the default models and textures @@ -256,7 +256,7 @@ // contact the config. service, and look for the inheritance link name // TODO: ConfigurationService::getKey("Core","InheritanceLinkName").toString(); - mPropertyService = ServiceManager::getSingleton().getService("PropertyService").as<PropertyService>(); + mPropertyService = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService")); // TODO: hardcoded property name, but that's hopefully not a problem after all @@ -333,7 +333,7 @@ // to fix this, we should create a handler for that property // ===== OBJECT SERVICE LISTENER ===== - mObjectService = ServiceManager::getSingleton().getService("ObjectService").as<ObjectService>(); + mObjectService = static_pointer_cast<ObjectService>(ServiceManager::getSingleton().getService("ObjectService")); // Listener to object messages ObjectService::ListenerPtr objlist = Modified: trunk/src/services/worldrep/WRCell.cpp =================================================================== --- trunk/src/services/worldrep/WRCell.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/worldrep/WRCell.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -173,7 +173,7 @@ for (lmap = 0; lmap < lmcount; lmap++) { // 11. Read one lightmap lmaps[i][lmap] = new uint8_t[lmsize]; - chunk->read(&(lmaps[i][lmap][0]), lmsize); + chunk->read(lmaps[i][lmap], lmsize); } } Modified: trunk/src/services/worldrep/WorldRepService.cpp =================================================================== --- trunk/src/services/worldrep/WorldRepService.cpp 2008-08-31 14:03:34 UTC (rev 812) +++ trunk/src/services/worldrep/WorldRepService.cpp 2008-08-31 14:13:39 UTC (rev 813) @@ -53,7 +53,7 @@ } bool WorldRepService::init() { - mRenderService = ServiceManager::getSingleton().getService("RenderService").as<RenderService>(); + mRenderService = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); if (mRenderService.isNull()) { LOG_ERROR("RenderService instance was not found. Fatal"); @@ -95,7 +95,7 @@ LOG_DEBUG("WorldRepService: Registering as a listener to the database messages"); mDbCallback = new ClassCallback<DatabaseChangeMsg, WorldRepService>(this, &WorldRepService::onDBChange); - mDatabaseService = ServiceManager::getSingleton().getService("DatabaseService").as<DatabaseService>(); + mDatabaseService = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService("DatabaseService")); mDatabaseService->registerListener(mDbCallback, DBP_WORLDREP); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-08-31 14:36:40
|
Revision: 814 http://opde.svn.sourceforge.net/opde/?rev=814&view=rev Author: volca Date: 2008-08-31 14:36:48 +0000 (Sun, 31 Aug 2008) Log Message: ----------- * introducing static_pointer_cast (as seen in boost::shared_ptr), getting rid of .as<>() Modified Paths: -------------- trunk/src/bindings/ConfigServiceBinder.cpp trunk/src/bindings/DatabaseServiceBinder.cpp trunk/src/bindings/GUIServiceBinder.cpp trunk/src/bindings/InputServiceBinder.cpp trunk/src/bindings/LinkServiceBinder.cpp trunk/src/bindings/LoopServiceBinder.cpp trunk/src/bindings/ObjectServiceBinder.cpp trunk/src/bindings/PropertyServiceBinder.cpp trunk/src/main/OpdeDocGen.cpp Modified: trunk/src/bindings/ConfigServiceBinder.cpp =================================================================== --- trunk/src/bindings/ConfigServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/ConfigServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -86,7 +86,7 @@ Object* object = construct(&msType); if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<ConfigService>(); + object->mInstance = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; Modified: trunk/src/bindings/DatabaseServiceBinder.cpp =================================================================== --- trunk/src/bindings/DatabaseServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/DatabaseServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -190,7 +190,7 @@ Object* object = construct(&msType); if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<DatabaseService>(); + object->mInstance = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; Modified: trunk/src/bindings/GUIServiceBinder.cpp =================================================================== --- trunk/src/bindings/GUIServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/GUIServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -156,7 +156,7 @@ Object* object = construct(&msType); if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<GUIService>(); + object->mInstance = static_pointer_cast<GUIService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; Modified: trunk/src/bindings/InputServiceBinder.cpp =================================================================== --- trunk/src/bindings/InputServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/InputServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -247,7 +247,7 @@ if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<InputService>(); + object->mInstance = static_pointer_cast<InputService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; } Modified: trunk/src/bindings/LinkServiceBinder.cpp =================================================================== --- trunk/src/bindings/LinkServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/LinkServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -251,7 +251,7 @@ Object* object = construct(&msType); if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<LinkService>(); + object->mInstance = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; Modified: trunk/src/bindings/LoopServiceBinder.cpp =================================================================== --- trunk/src/bindings/LoopServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/LoopServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -151,7 +151,7 @@ if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<LoopService>(); + object->mInstance = static_pointer_cast<LoopService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; } Modified: trunk/src/bindings/ObjectServiceBinder.cpp =================================================================== --- trunk/src/bindings/ObjectServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/ObjectServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -294,7 +294,7 @@ if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<ObjectService>(); + object->mInstance = static_pointer_cast<ObjectService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; } Modified: trunk/src/bindings/PropertyServiceBinder.cpp =================================================================== --- trunk/src/bindings/PropertyServiceBinder.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/bindings/PropertyServiceBinder.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -206,7 +206,7 @@ if (object != NULL) { - object->mInstance = ServiceManager::getSingleton().getService(msName).as<PropertyService>(); + object->mInstance = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService(msName)); } return (PyObject *)object; } Modified: trunk/src/main/OpdeDocGen.cpp =================================================================== --- trunk/src/main/OpdeDocGen.cpp 2008-08-31 14:13:39 UTC (rev 813) +++ trunk/src/main/OpdeDocGen.cpp 2008-08-31 14:36:48 UTC (rev 814) @@ -196,7 +196,7 @@ } void genPropDocs(fstream& fo) { - PropertyServicePtr ps = ServiceManager::getSingleton().getService("PropertyService").as<PropertyService>(); + PropertyServicePtr ps = static_pointer_cast<PropertyService>(ServiceManager::getSingleton().getService("PropertyService")); StringIteratorPtr pn = ps->getAllPropertyNames(); @@ -270,7 +270,7 @@ } void genLinkDocs(fstream& fo) { - LinkServicePtr ls = ServiceManager::getSingleton().getService("LinkService").as<LinkService>(); + LinkServicePtr ls = static_pointer_cast<LinkService>(ServiceManager::getSingleton().getService("LinkService")); StringIteratorPtr ln = ls->getAllLinkNames(); @@ -383,7 +383,7 @@ mRoot = new Opde::Root(SERVICE_CORE); // we want script autoload mRoot->registerCustomScriptLoaders(); - mConfigSvc = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); + mConfigSvc = static_pointer_cast<ConfigService>(ServiceManager::getSingleton().getService("ConfigService")); } ~DocGenerator(void) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-09-17 13:33:16
|
Revision: 836 http://opde.svn.sourceforge.net/opde/?rev=836&view=rev Author: volca Date: 2008-09-17 13:33:26 +0000 (Wed, 17 Sep 2008) Log Message: ----------- moving PropertyStorage to dyntype - it is becoming a common ancestor to data storage classes Added Paths: ----------- trunk/src/base/dyntype/PropertyStorage.cpp trunk/src/base/dyntype/PropertyStorage.h Removed Paths: ------------- trunk/src/services/property/PropertyStorage.cpp trunk/src/services/property/PropertyStorage.h Copied: trunk/src/base/dyntype/PropertyStorage.cpp (from rev 830, trunk/src/services/property/PropertyStorage.cpp) =================================================================== --- trunk/src/base/dyntype/PropertyStorage.cpp (rev 0) +++ trunk/src/base/dyntype/PropertyStorage.cpp 2008-09-17 13:33:26 UTC (rev 836) @@ -0,0 +1,434 @@ +/****************************************************************************** + * + * 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 "PropertyStorage.h" +#include "logger.h" + +using namespace std; + +namespace Opde { + // -------------------------------------------------------------------------- + // --------------- 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) -------------------- + // -------------------------------------------------------------------------- + + StructuredDataStorage::StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache) : + mTypeDef(type), + mUseDataCache(useDataCache), + mFieldDesc(type) { + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::isEmpty() { + return mDataMap.empty(); + } + + // -------------------------------------------------------------------------- + void StructuredDataStorage::clear() { + mDataMap.clear(); + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); + + if (pd.isNull()) { + uint32_t size; + + // Read the size + if (sizeStored) + file->readElem(&size, sizeof(uint32_t)); + else + size = mTypeDef->size(); + + // compare sizes + if (size != mTypeDef->size()) + LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size); + + // create a new data + pd = _create(objID); + + pd->read(file, size); + + mDataMap.insert(std::make_pair(objID, pd)); + + return true; + } else { + // still have to at least skip the data + uint32_t size; + + // Read the size + file->readElem(&size, sizeof(uint32_t)); + + file->seek(size, File::FSEEK_CUR); + + LOG_ERROR("Data already defined for object %d", objID); + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); + + if (!pd.isNull()) { + uint32_t size = pd->size(); + + // Write the size + if (sizeStored) + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + pd->serialize(file); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + 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 + pd->set(field, value); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::getField(int objID, const std::string& field, DVariant& target) { + DTypePtr pd = getDataForObject(objID); + + if (!pd.isNull()) { + // delegate to pd to get the field val. + // TODO: Faster using a pass by reference construct? + target = pd->get(field); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::has(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + return (it != mDataMap.end()); + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::clone(int srcID, int dstID) { + // clone prop data + if (!has(srcID) || has(dstID)) + return false; + + DTypePtr pd = getDataForObject(srcID); + + DTypePtr nd = new DType(*pd, mUseDataCache); + + // insert into map for the new object + std::pair<DataMap::iterator, bool> res = mDataMap.insert(std::make_pair(dstID, nd)); + + return res.second; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::destroy(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + mDataMap.erase(it); + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::create(int objID) { + return !(_create(objID).isNull()); + } + + // -------------------------------------------------------------------------- + DTypePtr StructuredDataStorage::_create(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it == mDataMap.end()) { + DTypePtr propd = new DType(mTypeDef, mUseDataCache); + + mDataMap.insert(std::make_pair(objID, propd)); + + return propd; + } + + return it->second; + } + + // -------------------------------------------------------------------------- + IntIteratorPtr StructuredDataStorage::getAllStoredObjects() { + return new DataKeyIterator(mDataMap); + } + + // -------------------------------------------------------------------------- + DTypePtr StructuredDataStorage::getDataForObject(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + return it->second; + } else { + return NULL; + } + } + + // -------------------------------------------------------------------------- + DataFieldDescIteratorPtr StructuredDataStorage::getFieldDescIterator(void) { + // return our pre-prepared field desc iterator + return mFieldDesc.getIterator(); + } + + // -------------------------------------------------------------------------- + // --------------- String Data Storage -------------------------------------- + // -------------------------------------------------------------------------- + StringDataStorage::StringDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = -1; + mFieldDesc.type = DVariant::DV_STRING; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::create(int objID) { + return _create(objID, ""); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::destroy(int objID) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + mStringPropMap.erase(it); + + // true, erase went ok + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::has(int objID) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + return (it != mStringPropMap.end()); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::clone(int srcID, int dstID) { + StringDataMap::iterator it = mStringPropMap.find(srcID); + + if (it != mStringPropMap.end()) { + std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(dstID, it->second)); + + return res.second; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::getField(int objID, const std::string& field, DVariant& target) { + assert(field==""); + + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + target = it->second; + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::setField(int objID, const std::string& field, const DVariant& value) { + assert(field==""); + + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + it->second = value.toString(); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + const std::string& str = it->second; + + uint32_t size = str.size(); + uint32_t outer_size = size + sizeof(uint32_t); + + // Write the size (first size is the size of the string + 4 bytes of the internal size) + if (sizeStored) + file->writeElem(&outer_size, sizeof(uint32_t)); + + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + file->write(str.c_str(), size); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it == mStringPropMap.end()) { + uint32_t outer_size, size; + + if (sizeStored) + file->readElem(&outer_size, sizeof(uint32_t)); + + file->readElem(&size, sizeof(uint32_t)); + + if (!sizeStored) + outer_size = size - sizeof(uint32_t); + + assert(outer_size == (size + sizeof(uint32_t))); + + // prepare the string temp buffer + char* str = new char[size + 1]; + + str[size] = 0; // terminate to be sure + + file->read(str, size); + + std::string sobj(str); + + _create(objID, sobj); + + delete[] str; + + return true; + } else { + // skip the prop... + uint32_t size; + + file->readElem(&size, sizeof(uint32_t)); + file->seek(size, File::FSEEK_CUR); + + LOG_ERROR("Data (str) already defined for object %d", objID); + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::_create(int objID, const std::string& text) { + std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(objID, text)); + + return res.second; + } + + // -------------------------------------------------------------------------- + void StringDataStorage::clear() { + mStringPropMap.clear(); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::isEmpty() { + return mStringPropMap.empty(); + } + + // -------------------------------------------------------------------------- + IntIteratorPtr StringDataStorage::getAllStoredObjects() { + return new StringDataMapKeyIterator(mStringPropMap); + } + + // -------------------------------------------------------------------------- + DataFieldDescIteratorPtr StringDataStorage::getFieldDescIterator(void) { + return new SingleFieldDescIterator(mFieldDesc); + } + + // -------------------------------------------------------------------------- + // --------------- Bool Data Storage ---------------------------------------- + // -------------------------------------------------------------------------- + +} Copied: trunk/src/base/dyntype/PropertyStorage.h (from rev 835, trunk/src/services/property/PropertyStorage.h) =================================================================== --- trunk/src/base/dyntype/PropertyStorage.h (rev 0) +++ trunk/src/base/dyntype/PropertyStorage.h 2008-09-17 13:33:26 UTC (rev 836) @@ -0,0 +1,345 @@ +/****************************************************************************** + * + * 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 __DATASTORAGE_H +#define __DATASTORAGE_H + +#include "config.h" + +#include "DTypeDef.h" +#include "DVariant.h" +#include "File.h" +#include "Iterator.h" + +namespace Opde { + /** @brief Storage for data (Interface). This class is used as a backend for either property or link storage, and provides data these classes. + * This storage can be overriden to suit better for particular data handling to be managed in effective/different manner for example. + * @note This class does no inheritance resolving itself (in case of properties). Only stores data. + * @note The objID, object id referenced here has the meaning of a ID of any kind appropriate - game object id for Properties, Link id for links. + */ + class OPDELIB_EXPORT DataStorage { + public: + virtual ~DataStorage() {}; + + /** Creates a default-value data for object numbered objID + * @param objID The object ID + * @return true if creation wen't ok, false if something went wrong (object already has the data attached) + */ + virtual bool create(int objID) = 0; + + /** Destroys data on a defined object + * @param objID the object to destroy the data for + * @return true if data was destroyed, false if something went wrong (data was not assigned to the object) + */ + virtual bool destroy(int objID) = 0; + + /** Data ownership detector. Returns true if this data storage holds data for the given object ID + */ + virtual bool has(int objID) = 0; + + /** Clones the data to another object ID (copies all values) + * @note The target data has to not exit (this routine does not overwrite) + * @param srcID the source object ID + * @param dstID the destination ID + * @return true if all went ok, false otherwise (srcID invalid, dstID invalid...) + */ + virtual bool clone(int srcID, int dstID) = 0; + + /** Field value getter + * @param objID The object id to get data value for + * @param field The field to get value for + * @param target The target variant to fill with value + * @return true if value was set to target, false if the field was invalid + */ + virtual bool getField(int objID, const std::string& field, DVariant& target) = 0; + + /** Field value setter + * @param objID The object id to set data value for + * @param field The field to set value for + * @param value The new value to use + * @return true if value was set to target, false if the field was invalid + */ + virtual bool setField(int objID, const std::string& field, const DVariant& value) = 0; + + /** Serialization core routine + * This routine is used to serialize the data for given object ID into a File handle. + * Normally, this routine should write data for the stored data in this format: + * @code + * 32-bit unnsigned size (N) - only expected/written if sizeStored is true + * N bytes of data data for the given property + * @endcode + * + * @param file The file to store the data into + * @param objID The id of the object data to write + * @param sizeStored if true, the size is stored with the data + */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored) = 0; + + /** Deserialization core routine + * This routine is used to read property data for a given object id from a given File handle. + * Normally, this format format is used: + * @code + * 32-bit unnsigned size (N) - only expected/written if sizeStored is true + * N bytes of Property data for the given property + * @endcode + * @note This routine automatically creates property data slot for the objID, and does no load over any previous data (so clear before load is encouraged) + * + * @param file The file to read the data from + * @param objID The id of the object data to read + * @param sizeStored if true, the size is stored with the data, and is read before the data. Otherwise the size of the date this storage uses is used + */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored) = 0; + + /** Called to clear all data */ + virtual void clear() = 0; + + /** Emptyness of data storage detector + * @return true If the data storage does not hold any data, false if does */ + virtual bool isEmpty() = 0; + + /** Getter for all stored object ID's + */ + virtual IntIteratorPtr getAllStoredObjects() = 0; + + /** Optional handler for object ID range re-sets (f.e. when growing the concretes) + */ + virtual void setIDRange(int minID, int MaxID) { }; + + /** Data description retrieval routine. Can be used to generate GUI for data editor, etc. + * @return The data fields description iterator, preferably in the order sored + */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void) = 0; + }; + + /// Shared pointer to data storage + typedef shared_ptr<DataStorage> DataStoragePtr; + + /// Internal: Implementation of field desc. for iterator over DTypeDef + class OPDELIB_EXPORT DTypeDefFieldDesc { + public: + DTypeDefFieldDesc(const DTypeDefPtr& type); + + DataFieldDescIteratorPtr getIterator(); + + protected: + DataFieldDescList mDataFieldDescList; + }; + + /** Structured data implementation of the DataStorage. */ + class OPDELIB_EXPORT StructuredDataStorage : public DataStorage { + public: + StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache); + + /** @see DataStorage::createProp */ + virtual bool create(int objID); + + /** @see DataStorage::destroyProp */ + virtual bool destroy(int objID); + + /** @see DataStorage::hasProp */ + virtual bool has(int objID); + + /** @see DataStorage::cloneProp */ + virtual bool clone(int srcID, int dstID); + + /** @see DataStorage::getPropField */ + virtual bool getField(int objID, const std::string& field, DVariant& target); + + /** @see DataStorage::setPropField */ + virtual bool setField(int objID, const std::string& field, const DVariant& value); + + /** @see DataStorage::writeToFile */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::readFromFile */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::clear */ + virtual void clear(); + + /** @see DataStorage::isEmpty */ + virtual bool isEmpty(); + + /** @see DataStorage::getAllStoredObjects */ + virtual IntIteratorPtr getAllStoredObjects(); + + /** @see DataStorage::getFieldDescIterator */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void); + + protected: + + /** core data creation routine. Returns a pointer to newly created or already existed data data for the objID */ + virtual DTypePtr _create(int objID); + + /// Internal getter for data + DTypePtr getDataForObject(int objID); + + /// Stores objectID -> Data + typedef std::map< int, DTypePtr > DataMap; + + /// Data store instance + DataMap mDataMap; + + /// Type definition for the stored properties + DTypeDefPtr mTypeDef; + + /// Data cache usage indicator (field conversion speedup) + bool mUseDataCache; + + typedef MapKeyIterator<DataMap, int> DataKeyIterator; + + class EmptyIntIterator : public IntIterator { + public: + EmptyIntIterator() : mZero(0) {}; + + const int& next() { + assert(false); + + return mZero; + }; + + bool end() const { + return true; + }; + + protected: + int mZero; + }; + + /// Field description pre-prepared iterator + DTypeDefFieldDesc mFieldDesc; + }; + + + /** Data storage targetted at storing variable length strings (One per id). */ + class OPDELIB_EXPORT StringDataStorage : public DataStorage { + public: + StringDataStorage(); + + protected: + /** @see DataStorage::createProp */ + virtual bool create(int objID); + + /** @see DataStorage::destroyProp */ + virtual bool destroy(int objID); + + /** @see DataStorage::hasProp */ + virtual bool has(int objID); + + /** @see DataStorage::cloneProp */ + virtual bool clone(int srcID, int dstID); + + /** @see DataStorage::getPropField */ + virtual bool getField(int objID, const std::string& field, DVariant& target); + + /** @see DataStorage::setPropField */ + virtual bool setField(int objID, const std::string& field, const DVariant& value); + + /** @see DataStorage::writeToFile */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::readFromFile */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::clear */ + virtual void clear(); + + /** @see DataStorage::isEmpty */ + virtual bool isEmpty(); + + /** @see DataStorage::getAllStoredObjects */ + virtual IntIteratorPtr getAllStoredObjects(); + + /** Core Data creation routine */ + virtual bool _create(int objID, const std::string& text); + + /** @see DataStorage::getFieldDescIterator */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void); + + /// String Data map + typedef std::map<int, std::string> StringDataMap; + + /// Holder of data (string) values + StringDataMap mStringPropMap; + + /// String prop. storage is a single-field construct. This is the field desc for the field + DataFieldDesc mFieldDesc; + + typedef MapKeyIterator<StringDataMap, int> StringDataMapKeyIterator; + }; + +// +// /// Bool property store. Stores 1 bool per object id in a packed array +// class BoolPropertyStorage : public PropertyStorage { +// public: +// BoolPropertyStorage(); +// ~BoolPropertyStorage(); +// +// protected: +// /** @see PropertyStorage::createProp */ +// virtual bool createProp(int objID); +// +// /** @see PropertyStorage::destroyProp */ +// virtual bool destroyProp(int objID); +// +// /** @see PropertyStorage::hasProp */ +// virtual bool hasProp(int objID); +// +// /** @see PropertyStorage::cloneProp */ +// virtual bool cloneProp(int srcID, int dstID); +// +// /** @see PropertyStorage::getPropField */ +// virtual bool getPropField(int objID, const std::string& field, DVariant& target); +// +// /** @see PropertyStorage::setPropField */ +// virtual bool setPropField(int objID, const std::string& field, const DVariant& value); +// +// /** @see PropertyStorage::writeToFile */ +// virtual bool writeToFile(FilePtr& file, int objID); +// +// /** @see PropertyStorage::readFromFile */ +// virtual bool readFromFile(FilePtr& file, int objID); +// +// /** @see PropertyStorage::clear */ +// virtual void clear(); +// +// /** @see PropertyStorage::isEmpty */ +// virtual bool isEmpty(); +// +// /** @see PropertyStorage::getAllStoredObjects */ +// virtual BitArrayIteratorPtr getAllStoredObjects(); +// +// /// Handles the growth of the object ID range on the bitarrays +// virtual void setIDRange(int minID, int MaxID); +// +// /// mask of stored objects +// BitArray mMask; +// +// /// True/False storage for the objects +// BitArray mValues; +// } + +} + +#endif // __PROPERTYSTORAGE_H Deleted: trunk/src/services/property/PropertyStorage.cpp =================================================================== --- trunk/src/services/property/PropertyStorage.cpp 2008-09-17 13:31:37 UTC (rev 835) +++ trunk/src/services/property/PropertyStorage.cpp 2008-09-17 13:33:26 UTC (rev 836) @@ -1,434 +0,0 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * - * $Id$ - * - *****************************************************************************/ - -#include "PropertyStorage.h" -#include "logger.h" - -using namespace std; - -namespace Opde { - // -------------------------------------------------------------------------- - // --------------- 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) -------------------- - // -------------------------------------------------------------------------- - - StructuredDataStorage::StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache) : - mTypeDef(type), - mUseDataCache(useDataCache), - mFieldDesc(type) { - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::isEmpty() { - return mDataMap.empty(); - } - - // -------------------------------------------------------------------------- - void StructuredDataStorage::clear() { - mDataMap.clear(); - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { - DTypePtr pd = getDataForObject(objID); - - if (pd.isNull()) { - uint32_t size; - - // Read the size - if (sizeStored) - file->readElem(&size, sizeof(uint32_t)); - else - size = mTypeDef->size(); - - // compare sizes - if (size != mTypeDef->size()) - LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size); - - // create a new data - pd = _create(objID); - - pd->read(file, size); - - mDataMap.insert(std::make_pair(objID, pd)); - - return true; - } else { - // still have to at least skip the data - uint32_t size; - - // Read the size - file->readElem(&size, sizeof(uint32_t)); - - file->seek(size, File::FSEEK_CUR); - - LOG_ERROR("Data already defined for object %d", objID); - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { - DTypePtr pd = getDataForObject(objID); - - if (!pd.isNull()) { - uint32_t size = pd->size(); - - // Write the size - if (sizeStored) - file->writeElem(&size, sizeof(uint32_t)); - - // write the data itself - pd->serialize(file); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - 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 - pd->set(field, value); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::getField(int objID, const std::string& field, DVariant& target) { - DTypePtr pd = getDataForObject(objID); - - if (!pd.isNull()) { - // delegate to pd to get the field val. - // TODO: Faster using a pass by reference construct? - target = pd->get(field); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::has(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - return (it != mDataMap.end()); - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::clone(int srcID, int dstID) { - // clone prop data - if (!has(srcID) || has(dstID)) - return false; - - DTypePtr pd = getDataForObject(srcID); - - DTypePtr nd = new DType(*pd, mUseDataCache); - - // insert into map for the new object - std::pair<DataMap::iterator, bool> res = mDataMap.insert(std::make_pair(dstID, nd)); - - return res.second; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::destroy(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it != mDataMap.end()) { - mDataMap.erase(it); - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::create(int objID) { - return !(_create(objID).isNull()); - } - - // -------------------------------------------------------------------------- - DTypePtr StructuredDataStorage::_create(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it == mDataMap.end()) { - DTypePtr propd = new DType(mTypeDef, mUseDataCache); - - mDataMap.insert(std::make_pair(objID, propd)); - - return propd; - } - - return it->second; - } - - // -------------------------------------------------------------------------- - IntIteratorPtr StructuredDataStorage::getAllStoredObjects() { - return new DataKeyIterator(mDataMap); - } - - // -------------------------------------------------------------------------- - DTypePtr StructuredDataStorage::getDataForObject(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it != mDataMap.end()) { - return it->second; - } else { - return NULL; - } - } - - // -------------------------------------------------------------------------- - DataFieldDescIteratorPtr StructuredDataStorage::getFieldDescIterator(void) { - // return our pre-prepared field desc iterator - return mFieldDesc.getIterator(); - } - - // -------------------------------------------------------------------------- - // --------------- String Data Storage -------------------------------------- - // -------------------------------------------------------------------------- - StringDataStorage::StringDataStorage() { - mFieldDesc.enumerator = NULL; - mFieldDesc.name = ""; - mFieldDesc.size = -1; - mFieldDesc.type = DVariant::DV_STRING; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::create(int objID) { - return _create(objID, ""); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::destroy(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - mStringPropMap.erase(it); - - // true, erase went ok - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::has(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - return (it != mStringPropMap.end()); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::clone(int srcID, int dstID) { - StringDataMap::iterator it = mStringPropMap.find(srcID); - - if (it != mStringPropMap.end()) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(dstID, it->second)); - - return res.second; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::getField(int objID, const std::string& field, DVariant& target) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - target = it->second; - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::setField(int objID, const std::string& field, const DVariant& value) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - it->second = value.toString(); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - const std::string& str = it->second; - - uint32_t size = str.size(); - uint32_t outer_size = size + sizeof(uint32_t); - - // Write the size (first size is the size of the string + 4 bytes of the internal size) - if (sizeStored) - file->writeElem(&outer_size, sizeof(uint32_t)); - - file->writeElem(&size, sizeof(uint32_t)); - - // write the data itself - file->write(str.c_str(), size); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it == mStringPropMap.end()) { - uint32_t outer_size, size; - - if (sizeStored) - file->readElem(&outer_size, sizeof(uint32_t)); - - file->readElem(&size, sizeof(uint32_t)); - - if (!sizeStored) - outer_size = size - sizeof(uint32_t); - - assert(outer_size == (size + sizeof(uint32_t))); - - // prepare the string temp buffer - char* str = new char[size + 1]; - - str[size] = 0; // terminate to be sure - - file->read(str, size); - - std::string sobj(str); - - _create(objID, sobj); - - delete[] str; - - return true; - } else { - // skip the prop... - uint32_t size; - - file->readElem(&size, sizeof(uint32_t)); - file->seek(size, File::FSEEK_CUR); - - LOG_ERROR("Data (str) already defined for object %d", objID); - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::_create(int objID, const std::string& text) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(objID, text)); - - return res.second; - } - - // -------------------------------------------------------------------------- - void StringDataStorage::clear() { - mStringPropMap.clear(); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::isEmpty() { - return mStringPropMap.empty(); - } - - // -------------------------------------------------------------------------- - IntIteratorPtr StringDataStorage::getAllStoredObjects() { - return new StringDataMapKeyIterator(mStringPropMap); - } - - // -------------------------------------------------------------------------- - DataFieldDescIteratorPtr StringDataStorage::getFieldDescIterator(void) { - return new SingleFieldDescIterator(mFieldDesc); - } - - // -------------------------------------------------------------------------- - // --------------- Bool Data Storage ---------------------------------------- - // -------------------------------------------------------------------------- - -} Deleted: trunk/src/services/property/PropertyStorage.h =================================================================== --- trunk/src/services/property/PropertyStorage.h 2008-09-17 13:31:37 UTC (rev 835) +++ trunk/src/services/property/PropertyStorage.h 2008-09-17 13:33:26 UTC (rev 836) @@ -1,345 +0,0 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - * - *****************************************************************************/ - - -#ifndef __DATASTORAGE_H -#define __DATASTORAGE_H - -#include "config.h" - -#include "DTypeDef.h" -#include "DVariant.h" -#include "File.h" -#include "Iterator.h" - -namespace Opde { - /** @brief Storage for data (Interface). This class is used as a backend for either property or link storage, and provides data these classes. - * This storage can be overriden to suit better for particular data handling to be managed in effective/different manner for example. - * @note This class does no inheritance resolving itself (in case of properties). Only stores data. - * @note The objID, object id referenced here has the meaning of a ID of any kind appropriate - game object id for Properties, Link id for links. - */ - class OPDELIB_EXPORT DataStorage { - public: - virtual ~DataStorage() {}; - - /** Creates a default-value data for object numbered objID - * @param objID The object ID - * @return true if creation wen't ok, false if something went wrong (object already has the data attached) - */ - virtual bool create(int objID) = 0; - - /** Destroys data on a defined object - * @param objID the object to destroy the data for - * @return true if data was destroyed, false if something went wrong (data was not assigned to the object) - */ - virtual bool destroy(int objID) = 0; - - /** Data ownership detector. Returns true if this data storage holds data for the given object ID - */ - virtual bool has(int objID) = 0; - - /** Clones the data to another object ID (copies all values) - * @note The target data has to not exit (this routine does not overwrite) - * @param srcID the source object ID - * @param dstID the destination ID - * @return true if all went ok, false otherwise (srcID invalid, dstID invalid...) - */ - virtual bool clone(int srcID, int dstID) = 0; - - /** Field value getter - * @param objID The object id to get data value for - * @param field The field to get value for - * @param target The target variant to fill with value - * @return true if value was set to target, false if the field was invalid - */ - virtual bool getField(int objID, const std::string& field, DVariant& target) = 0; - - /** Field value setter - * @param objID The object id to set data value for - * @param field The field to set value for - * @param value The new value to use - * @return true if value was set to target, false if the field was invalid - */ - virtual bool setField(int objID, const std::string& field, const DVariant& value) = 0; - - /** Serialization core routine - * This routine is used to serialize the data for given object ID into a File handle. - * Normally, this routine should write data for the stored data in this format: - * @code - * 32-bit unnsigned size (N) - only expected/written if sizeStored is true - * N bytes of data data for the given property - * @endcode - * - * @param file The file to store the data into - * @param objID The id of the object data to write - * @param sizeStored if true, the size is stored with the data - */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored) = 0; - - /** Deserialization core routine - * This routine is used to read property data for a given object id from a given File handle. - * Normally, this format format is used: - * @code - * 32-bit unnsigned size (N) - only expected/written if sizeStored is true - * N bytes of Property data for the given property - * @endcode - * @note This routine automatically creates property data slot for the objID, and does no load over any previous data (so clear before load is encouraged) - * - * @param file The file to read the data from - * @param objID The id of the object data to read - * @param sizeStored if true, the size is stored with the data, and is read before the data. Otherwise the size of the date this storage uses is used - */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored) = 0; - - /** Called to clear all data */ - virtual void clear() = 0; - - /** Emptyness of data storage detector - * @return true If the data storage does not hold any data, false if does */ - virtual bool isEmpty() = 0; - - /** Getter for all stored object ID's - */ - virtual IntIteratorPtr getAllStoredObjects() = 0; - - /** Optional handler for object ID range re-sets (f.e. when growing the concretes) - */ - virtual void setIDRange(int minID, int MaxID) { }; - - /** Data description retrieval routine. Can be used to generate GUI for data editor, etc. - * @return The data fields description iterator, preferably in the order sored - */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void) = 0; - }; - - /// Shared pointer to data storage - typedef shared_ptr<DataStorage> DataStoragePtr; - - /// Internal: Implementation of field desc. for iterator over DTypeDef - class OPDELIB_EXPORT DTypeDefFieldDesc { - public: - DTypeDefFieldDesc(const DTypeDefPtr& type); - - DataFieldDescIteratorPtr getIterator(); - - protected: - DataFieldDescList mDataFieldDescList; - }; - - /** Structured data implementation of the DataStorage. */ - class OPDELIB_EXPORT StructuredDataStorage : public DataStorage { - public: - StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache); - - /** @see DataStorage::createProp */ - virtual bool create(int objID); - - /** @see DataStorage::destroyProp */ - virtual bool destroy(int objID); - - /** @see DataStorage::hasProp */ - virtual bool has(int objID); - - /** @see DataStorage::cloneProp */ - virtual bool clone(int srcID, int dstID); - - /** @see DataStorage::getPropField */ - virtual bool getField(int objID, const std::string& field, DVariant& target); - - /** @see DataStorage::setPropField */ - virtual bool setField(int objID, const std::string& field, const DVariant& value); - - /** @see DataStorage::writeToFile */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::readFromFile */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::clear */ - virtual void clear(); - - /** @see DataStorage::isEmpty */ - virtual bool isEmpty(); - - /** @see DataStorage::getAllStoredObjects */ - virtual IntIteratorPtr getAllStoredObjects(); - - /** @see DataStorage::getFieldDescIterator */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void); - - protected: - - /** core data creation routine. Returns a pointer to newly created or already existed data data for the objID */ - virtual DTypePtr _create(int objID); - - /// Internal getter for data - DTypePtr getDataForObject(int objID); - - /// Stores objectID -> Data - typedef std::map< int, DTypePtr > DataMap; - - /// Data store instance - DataMap mDataMap; - - /// Type definition for the stored properties - DTypeDefPtr mTypeDef; - - /// Data cache usage indicator (field conversion speedup) - bool mUseDataCache; - - typedef MapKeyIterator<DataMap, int> DataKeyIterator; - - class EmptyIntIterator : public IntIterator { - public: - EmptyIntIterator() : mZero(0) {}; - - const int& next() { - assert(false); - - return mZero; - }; - - bool end() const { - return true; - }; - - protected: - int mZero; - }; - - /// Field description pre-prepared iterator - DTypeDefFieldDesc mFieldDesc; - }; - - - /** Data storage targetted at storing variable length strings (One per id). */ - class OPDELIB_EXPORT StringDataStorage : public DataStorage { - public: - StringDataStorage(); - - protected: - /** @see DataStorage::createProp */ - virtual bool create(int objID); - - /** @see DataStorage::destroyProp */ - virtual bool destroy(int objID); - - /** @see DataStorage::hasProp */ - virtual bool has(int objID); - - /** @see DataStorage::cloneProp */ - virtual bool clone(int srcID, int dstID); - - /** @see DataStorage::getPropField */ - virtual bool getField(int objID, const std::string& field, DVariant& target); - - /** @see DataStorage::setPropField */ - virtual bool setField(int objID, const std::string& field, const DVariant& value); - - /** @see DataStorage::writeToFile */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::readFromFile */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::clear */ - virtual void clear(); - - /** @see DataStorage::isEmpty */ - virtual bool isEmpty(); - - /** @see DataStorage::getAllStoredObjects */ - virtual IntIteratorPtr getAllStoredObjects(); - - /** Core Data creation routine */ - virtual bool _create(int objID, const std::string& text); - - /** @see DataStorage::getFieldDescIterator */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void); - - /// String Data map - typedef std::map<int, std::string> StringDataMap; - - /// Holder of data (string) values - StringDataMap mStringPropMap; - - /// String prop. storage is a single-field construct. This is the field desc for the field - DataFieldDesc mFieldDesc; - - typedef MapKeyIterator<StringDataMap, int> StringDataMapKeyIterator; - }; - -// -// /// Bool property store. Stores 1 bool per object id in a packed array -// class BoolPropertyStorage : public PropertyStorage { -// public: -// BoolPropertyStorage(); -// ~BoolPropertyStorage(); -// -// protected: -// /** @see PropertyStorage::createProp */ -// virtual bool createProp(int objID); -// -// /** @see PropertyStorage::destroyProp */ -// virtual bool destroyProp(int objID); -// -// /** @see PropertyStorage::hasProp */ -// virtual bool hasProp(int objID); -// -// /** @see PropertyStorage::cloneProp */ -// virtual bool cloneProp(int srcID, int dstID); -// -// /** @see PropertyStorage::getPropField */ -// virtual bool getPropField(int objID, const std::string& field, DVariant& target); -// -// /** @see PropertyStorage::setPropField */ -// virtual bool setPropField(int objID, const std::string& field, const DVariant& value); -// -// /** @see PropertyStorage::writeToFile */ -// virtual bool writeToFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::readFromFile */ -// virtual bool readFromFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::clear */ -// virtual void clear(); -// -// /** @see PropertyStorage::isEmpty */ -// virtual bool isEmpty(); -// -// /** @see PropertyStorage::getAllStoredObjects */ -// virtual BitArrayIteratorPtr getAllStoredObjects(); -// -// /// Handles the growth of the object ID range on the bitarrays -// virtual void setIDRange(int minID, int MaxID); -// -// /// mask of stored objects -// BitArray mMask; -// -// /// True/False storage for the objects -// BitArray mValues; -// } - -} - -#endif // __PROPERTYSTORAGE_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-09-17 14:03:14
|
Revision: 837 http://opde.svn.sourceforge.net/opde/?rev=837&view=rev Author: volca Date: 2008-09-17 14:03:20 +0000 (Wed, 17 Sep 2008) Log Message: ----------- PropertyStorage.* -> DataStorage.* (and related changes to make it work) Modified Paths: -------------- trunk/src/base/dyntype/CMakeLists.txt trunk/src/services/property/CMakeLists.txt trunk/src/services/property/PropertyGroup.h Added Paths: ----------- trunk/src/base/dyntype/DataStorage.cpp trunk/src/base/dyntype/DataStorage.h Removed Paths: ------------- trunk/src/base/dyntype/PropertyStorage.cpp trunk/src/base/dyntype/PropertyStorage.h Modified: trunk/src/base/dyntype/CMakeLists.txt =================================================================== --- trunk/src/base/dyntype/CMakeLists.txt 2008-09-17 13:33:26 UTC (rev 836) +++ trunk/src/base/dyntype/CMakeLists.txt 2008-09-17 14:03:20 UTC (rev 837) @@ -5,6 +5,7 @@ ${OPDE_BINARY_DIR} ${OPDE_SOURCE_DIR}/src/base ${OPDE_SOURCE_DIR}/src/base/file + ${OPDE_SOURCE_DIR}/src/base/logger ${OPDE_SOURCE_DIR}/src/compat ) @@ -20,6 +21,8 @@ DTypeDef.cpp DTypeDef.h DTHelpers.h + DataStorage.cpp + DataStorage.h ) target_link_libraries( OpdeDynType Copied: trunk/src/base/dyntype/DataStorage.cpp (from rev 836, trunk/src/base/dyntype/PropertyStorage.cpp) =================================================================== --- trunk/src/base/dyntype/DataStorage.cpp (rev 0) +++ trunk/src/base/dyntype/DataStorage.cpp 2008-09-17 14:03:20 UTC (rev 837) @@ -0,0 +1,434 @@ +/****************************************************************************** + * + * 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 "DataStorage.h" +#include "logger.h" + +using namespace std; + +namespace Opde { + // -------------------------------------------------------------------------- + // --------------- 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) -------------------- + // -------------------------------------------------------------------------- + + StructuredDataStorage::StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache) : + mTypeDef(type), + mUseDataCache(useDataCache), + mFieldDesc(type) { + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::isEmpty() { + return mDataMap.empty(); + } + + // -------------------------------------------------------------------------- + void StructuredDataStorage::clear() { + mDataMap.clear(); + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); + + if (pd.isNull()) { + uint32_t size; + + // Read the size + if (sizeStored) + file->readElem(&size, sizeof(uint32_t)); + else + size = mTypeDef->size(); + + // compare sizes + if (size != mTypeDef->size()) + LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size); + + // create a new data + pd = _create(objID); + + pd->read(file, size); + + mDataMap.insert(std::make_pair(objID, pd)); + + return true; + } else { + // still have to at least skip the data + uint32_t size; + + // Read the size + file->readElem(&size, sizeof(uint32_t)); + + file->seek(size, File::FSEEK_CUR); + + LOG_ERROR("Data already defined for object %d", objID); + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { + DTypePtr pd = getDataForObject(objID); + + if (!pd.isNull()) { + uint32_t size = pd->size(); + + // Write the size + if (sizeStored) + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + pd->serialize(file); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + 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 + pd->set(field, value); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::getField(int objID, const std::string& field, DVariant& target) { + DTypePtr pd = getDataForObject(objID); + + if (!pd.isNull()) { + // delegate to pd to get the field val. + // TODO: Faster using a pass by reference construct? + target = pd->get(field); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::has(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + return (it != mDataMap.end()); + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::clone(int srcID, int dstID) { + // clone prop data + if (!has(srcID) || has(dstID)) + return false; + + DTypePtr pd = getDataForObject(srcID); + + DTypePtr nd = new DType(*pd, mUseDataCache); + + // insert into map for the new object + std::pair<DataMap::iterator, bool> res = mDataMap.insert(std::make_pair(dstID, nd)); + + return res.second; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::destroy(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + mDataMap.erase(it); + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StructuredDataStorage::create(int objID) { + return !(_create(objID).isNull()); + } + + // -------------------------------------------------------------------------- + DTypePtr StructuredDataStorage::_create(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it == mDataMap.end()) { + DTypePtr propd = new DType(mTypeDef, mUseDataCache); + + mDataMap.insert(std::make_pair(objID, propd)); + + return propd; + } + + return it->second; + } + + // -------------------------------------------------------------------------- + IntIteratorPtr StructuredDataStorage::getAllStoredObjects() { + return new DataKeyIterator(mDataMap); + } + + // -------------------------------------------------------------------------- + DTypePtr StructuredDataStorage::getDataForObject(int objID) { + DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + return it->second; + } else { + return NULL; + } + } + + // -------------------------------------------------------------------------- + DataFieldDescIteratorPtr StructuredDataStorage::getFieldDescIterator(void) { + // return our pre-prepared field desc iterator + return mFieldDesc.getIterator(); + } + + // -------------------------------------------------------------------------- + // --------------- String Data Storage -------------------------------------- + // -------------------------------------------------------------------------- + StringDataStorage::StringDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = -1; + mFieldDesc.type = DVariant::DV_STRING; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::create(int objID) { + return _create(objID, ""); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::destroy(int objID) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + mStringPropMap.erase(it); + + // true, erase went ok + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::has(int objID) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + return (it != mStringPropMap.end()); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::clone(int srcID, int dstID) { + StringDataMap::iterator it = mStringPropMap.find(srcID); + + if (it != mStringPropMap.end()) { + std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(dstID, it->second)); + + return res.second; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::getField(int objID, const std::string& field, DVariant& target) { + assert(field==""); + + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + target = it->second; + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::setField(int objID, const std::string& field, const DVariant& value) { + assert(field==""); + + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + it->second = value.toString(); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it != mStringPropMap.end()) { + const std::string& str = it->second; + + uint32_t size = str.size(); + uint32_t outer_size = size + sizeof(uint32_t); + + // Write the size (first size is the size of the string + 4 bytes of the internal size) + if (sizeStored) + file->writeElem(&outer_size, sizeof(uint32_t)); + + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + file->write(str.c_str(), size); + + return true; + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { + StringDataMap::iterator it = mStringPropMap.find(objID); + + if (it == mStringPropMap.end()) { + uint32_t outer_size, size; + + if (sizeStored) + file->readElem(&outer_size, sizeof(uint32_t)); + + file->readElem(&size, sizeof(uint32_t)); + + if (!sizeStored) + outer_size = size - sizeof(uint32_t); + + assert(outer_size == (size + sizeof(uint32_t))); + + // prepare the string temp buffer + char* str = new char[size + 1]; + + str[size] = 0; // terminate to be sure + + file->read(str, size); + + std::string sobj(str); + + _create(objID, sobj); + + delete[] str; + + return true; + } else { + // skip the prop... + uint32_t size; + + file->readElem(&size, sizeof(uint32_t)); + file->seek(size, File::FSEEK_CUR); + + LOG_ERROR("Data (str) already defined for object %d", objID); + } + + return false; + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::_create(int objID, const std::string& text) { + std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(objID, text)); + + return res.second; + } + + // -------------------------------------------------------------------------- + void StringDataStorage::clear() { + mStringPropMap.clear(); + } + + // -------------------------------------------------------------------------- + bool StringDataStorage::isEmpty() { + return mStringPropMap.empty(); + } + + // -------------------------------------------------------------------------- + IntIteratorPtr StringDataStorage::getAllStoredObjects() { + return new StringDataMapKeyIterator(mStringPropMap); + } + + // -------------------------------------------------------------------------- + DataFieldDescIteratorPtr StringDataStorage::getFieldDescIterator(void) { + return new SingleFieldDescIterator(mFieldDesc); + } + + // -------------------------------------------------------------------------- + // --------------- Bool Data Storage ---------------------------------------- + // -------------------------------------------------------------------------- + +} Copied: trunk/src/base/dyntype/DataStorage.h (from rev 836, trunk/src/base/dyntype/PropertyStorage.h) =================================================================== --- trunk/src/base/dyntype/DataStorage.h (rev 0) +++ trunk/src/base/dyntype/DataStorage.h 2008-09-17 14:03:20 UTC (rev 837) @@ -0,0 +1,345 @@ +/****************************************************************************** + * + * 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 __DATASTORAGE_H +#define __DATASTORAGE_H + +#include "config.h" + +#include "DTypeDef.h" +#include "DVariant.h" +#include "File.h" +#include "Iterator.h" + +namespace Opde { + /** @brief Storage for data (Interface). This class is used as a backend for either property or link storage, and provides data these classes. + * This storage can be overriden to suit better for particular data handling to be managed in effective/different manner for example. + * @note This class does no inheritance resolving itself (in case of properties). Only stores data. + * @note The objID, object id referenced here has the meaning of a ID of any kind appropriate - game object id for Properties, Link id for links. + */ + class OPDELIB_EXPORT DataStorage { + public: + virtual ~DataStorage() {}; + + /** Creates a default-value data for object numbered objID + * @param objID The object ID + * @return true if creation wen't ok, false if something went wrong (object already has the data attached) + */ + virtual bool create(int objID) = 0; + + /** Destroys data on a defined object + * @param objID the object to destroy the data for + * @return true if data was destroyed, false if something went wrong (data was not assigned to the object) + */ + virtual bool destroy(int objID) = 0; + + /** Data ownership detector. Returns true if this data storage holds data for the given object ID + */ + virtual bool has(int objID) = 0; + + /** Clones the data to another object ID (copies all values) + * @note The target data has to not exit (this routine does not overwrite) + * @param srcID the source object ID + * @param dstID the destination ID + * @return true if all went ok, false otherwise (srcID invalid, dstID invalid...) + */ + virtual bool clone(int srcID, int dstID) = 0; + + /** Field value getter + * @param objID The object id to get data value for + * @param field The field to get value for + * @param target The target variant to fill with value + * @return true if value was set to target, false if the field was invalid + */ + virtual bool getField(int objID, const std::string& field, DVariant& target) = 0; + + /** Field value setter + * @param objID The object id to set data value for + * @param field The field to set value for + * @param value The new value to use + * @return true if value was set to target, false if the field was invalid + */ + virtual bool setField(int objID, const std::string& field, const DVariant& value) = 0; + + /** Serialization core routine + * This routine is used to serialize the data for given object ID into a File handle. + * Normally, this routine should write data for the stored data in this format: + * @code + * 32-bit unnsigned size (N) - only expected/written if sizeStored is true + * N bytes of data data for the given property + * @endcode + * + * @param file The file to store the data into + * @param objID The id of the object data to write + * @param sizeStored if true, the size is stored with the data + */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored) = 0; + + /** Deserialization core routine + * This routine is used to read property data for a given object id from a given File handle. + * Normally, this format format is used: + * @code + * 32-bit unnsigned size (N) - only expected/written if sizeStored is true + * N bytes of Property data for the given property + * @endcode + * @note This routine automatically creates property data slot for the objID, and does no load over any previous data (so clear before load is encouraged) + * + * @param file The file to read the data from + * @param objID The id of the object data to read + * @param sizeStored if true, the size is stored with the data, and is read before the data. Otherwise the size of the date this storage uses is used + */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored) = 0; + + /** Called to clear all data */ + virtual void clear() = 0; + + /** Emptyness of data storage detector + * @return true If the data storage does not hold any data, false if does */ + virtual bool isEmpty() = 0; + + /** Getter for all stored object ID's + */ + virtual IntIteratorPtr getAllStoredObjects() = 0; + + /** Optional handler for object ID range re-sets (f.e. when growing the concretes) + */ + virtual void setIDRange(int minID, int MaxID) { }; + + /** Data description retrieval routine. Can be used to generate GUI for data editor, etc. + * @return The data fields description iterator, preferably in the order sored + */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void) = 0; + }; + + /// Shared pointer to data storage + typedef shared_ptr<DataStorage> DataStoragePtr; + + /// Internal: Implementation of field desc. for iterator over DTypeDef + class OPDELIB_EXPORT DTypeDefFieldDesc { + public: + DTypeDefFieldDesc(const DTypeDefPtr& type); + + DataFieldDescIteratorPtr getIterator(); + + protected: + DataFieldDescList mDataFieldDescList; + }; + + /** Structured data implementation of the DataStorage. */ + class OPDELIB_EXPORT StructuredDataStorage : public DataStorage { + public: + StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache); + + /** @see DataStorage::createProp */ + virtual bool create(int objID); + + /** @see DataStorage::destroyProp */ + virtual bool destroy(int objID); + + /** @see DataStorage::hasProp */ + virtual bool has(int objID); + + /** @see DataStorage::cloneProp */ + virtual bool clone(int srcID, int dstID); + + /** @see DataStorage::getPropField */ + virtual bool getField(int objID, const std::string& field, DVariant& target); + + /** @see DataStorage::setPropField */ + virtual bool setField(int objID, const std::string& field, const DVariant& value); + + /** @see DataStorage::writeToFile */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::readFromFile */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::clear */ + virtual void clear(); + + /** @see DataStorage::isEmpty */ + virtual bool isEmpty(); + + /** @see DataStorage::getAllStoredObjects */ + virtual IntIteratorPtr getAllStoredObjects(); + + /** @see DataStorage::getFieldDescIterator */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void); + + protected: + + /** core data creation routine. Returns a pointer to newly created or already existed data data for the objID */ + virtual DTypePtr _create(int objID); + + /// Internal getter for data + DTypePtr getDataForObject(int objID); + + /// Stores objectID -> Data + typedef std::map< int, DTypePtr > DataMap; + + /// Data store instance + DataMap mDataMap; + + /// Type definition for the stored properties + DTypeDefPtr mTypeDef; + + /// Data cache usage indicator (field conversion speedup) + bool mUseDataCache; + + typedef MapKeyIterator<DataMap, int> DataKeyIterator; + + class EmptyIntIterator : public IntIterator { + public: + EmptyIntIterator() : mZero(0) {}; + + const int& next() { + assert(false); + + return mZero; + }; + + bool end() const { + return true; + }; + + protected: + int mZero; + }; + + /// Field description pre-prepared iterator + DTypeDefFieldDesc mFieldDesc; + }; + + + /** Data storage targetted at storing variable length strings (One per id). */ + class OPDELIB_EXPORT StringDataStorage : public DataStorage { + public: + StringDataStorage(); + + protected: + /** @see DataStorage::createProp */ + virtual bool create(int objID); + + /** @see DataStorage::destroyProp */ + virtual bool destroy(int objID); + + /** @see DataStorage::hasProp */ + virtual bool has(int objID); + + /** @see DataStorage::cloneProp */ + virtual bool clone(int srcID, int dstID); + + /** @see DataStorage::getPropField */ + virtual bool getField(int objID, const std::string& field, DVariant& target); + + /** @see DataStorage::setPropField */ + virtual bool setField(int objID, const std::string& field, const DVariant& value); + + /** @see DataStorage::writeToFile */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::readFromFile */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); + + /** @see DataStorage::clear */ + virtual void clear(); + + /** @see DataStorage::isEmpty */ + virtual bool isEmpty(); + + /** @see DataStorage::getAllStoredObjects */ + virtual IntIteratorPtr getAllStoredObjects(); + + /** Core Data creation routine */ + virtual bool _create(int objID, const std::string& text); + + /** @see DataStorage::getFieldDescIterator */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void); + + /// String Data map + typedef std::map<int, std::string> StringDataMap; + + /// Holder of data (string) values + StringDataMap mStringPropMap; + + /// String prop. storage is a single-field construct. This is the field desc for the field + DataFieldDesc mFieldDesc; + + typedef MapKeyIterator<StringDataMap, int> StringDataMapKeyIterator; + }; + +// +// /// Bool property store. Stores 1 bool per object id in a packed array +// class BoolPropertyStorage : public PropertyStorage { +// public: +// BoolPropertyStorage(); +// ~BoolPropertyStorage(); +// +// protected: +// /** @see PropertyStorage::createProp */ +// virtual bool createProp(int objID); +// +// /** @see PropertyStorage::destroyProp */ +// virtual bool destroyProp(int objID); +// +// /** @see PropertyStorage::hasProp */ +// virtual bool hasProp(int objID); +// +// /** @see PropertyStorage::cloneProp */ +// virtual bool cloneProp(int srcID, int dstID); +// +// /** @see PropertyStorage::getPropField */ +// virtual bool getPropField(int objID, const std::string& field, DVariant& target); +// +// /** @see PropertyStorage::setPropField */ +// virtual bool setPropField(int objID, const std::string& field, const DVariant& value); +// +// /** @see PropertyStorage::writeToFile */ +// virtual bool writeToFile(FilePtr& file, int objID); +// +// /** @see PropertyStorage::readFromFile */ +// virtual bool readFromFile(FilePtr& file, int objID); +// +// /** @see PropertyStorage::clear */ +// virtual void clear(); +// +// /** @see PropertyStorage::isEmpty */ +// virtual bool isEmpty(); +// +// /** @see PropertyStorage::getAllStoredObjects */ +// virtual BitArrayIteratorPtr getAllStoredObjects(); +// +// /// Handles the growth of the object ID range on the bitarrays +// virtual void setIDRange(int minID, int MaxID); +// +// /// mask of stored objects +// BitArray mMask; +// +// /// True/False storage for the objects +// BitArray mValues; +// } + +} + +#endif // __PROPERTYSTORAGE_H Deleted: trunk/src/base/dyntype/PropertyStorage.cpp =================================================================== --- trunk/src/base/dyntype/PropertyStorage.cpp 2008-09-17 13:33:26 UTC (rev 836) +++ trunk/src/base/dyntype/PropertyStorage.cpp 2008-09-17 14:03:20 UTC (rev 837) @@ -1,434 +0,0 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * - * $Id$ - * - *****************************************************************************/ - -#include "PropertyStorage.h" -#include "logger.h" - -using namespace std; - -namespace Opde { - // -------------------------------------------------------------------------- - // --------------- 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) -------------------- - // -------------------------------------------------------------------------- - - StructuredDataStorage::StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache) : - mTypeDef(type), - mUseDataCache(useDataCache), - mFieldDesc(type) { - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::isEmpty() { - return mDataMap.empty(); - } - - // -------------------------------------------------------------------------- - void StructuredDataStorage::clear() { - mDataMap.clear(); - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { - DTypePtr pd = getDataForObject(objID); - - if (pd.isNull()) { - uint32_t size; - - // Read the size - if (sizeStored) - file->readElem(&size, sizeof(uint32_t)); - else - size = mTypeDef->size(); - - // compare sizes - if (size != mTypeDef->size()) - LOG_ERROR("Data size mismatch: %d definition, %d file source", mTypeDef->size(), size); - - // create a new data - pd = _create(objID); - - pd->read(file, size); - - mDataMap.insert(std::make_pair(objID, pd)); - - return true; - } else { - // still have to at least skip the data - uint32_t size; - - // Read the size - file->readElem(&size, sizeof(uint32_t)); - - file->seek(size, File::FSEEK_CUR); - - LOG_ERROR("Data already defined for object %d", objID); - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { - DTypePtr pd = getDataForObject(objID); - - if (!pd.isNull()) { - uint32_t size = pd->size(); - - // Write the size - if (sizeStored) - file->writeElem(&size, sizeof(uint32_t)); - - // write the data itself - pd->serialize(file); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - 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 - pd->set(field, value); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::getField(int objID, const std::string& field, DVariant& target) { - DTypePtr pd = getDataForObject(objID); - - if (!pd.isNull()) { - // delegate to pd to get the field val. - // TODO: Faster using a pass by reference construct? - target = pd->get(field); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::has(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - return (it != mDataMap.end()); - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::clone(int srcID, int dstID) { - // clone prop data - if (!has(srcID) || has(dstID)) - return false; - - DTypePtr pd = getDataForObject(srcID); - - DTypePtr nd = new DType(*pd, mUseDataCache); - - // insert into map for the new object - std::pair<DataMap::iterator, bool> res = mDataMap.insert(std::make_pair(dstID, nd)); - - return res.second; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::destroy(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it != mDataMap.end()) { - mDataMap.erase(it); - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StructuredDataStorage::create(int objID) { - return !(_create(objID).isNull()); - } - - // -------------------------------------------------------------------------- - DTypePtr StructuredDataStorage::_create(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it == mDataMap.end()) { - DTypePtr propd = new DType(mTypeDef, mUseDataCache); - - mDataMap.insert(std::make_pair(objID, propd)); - - return propd; - } - - return it->second; - } - - // -------------------------------------------------------------------------- - IntIteratorPtr StructuredDataStorage::getAllStoredObjects() { - return new DataKeyIterator(mDataMap); - } - - // -------------------------------------------------------------------------- - DTypePtr StructuredDataStorage::getDataForObject(int objID) { - DataMap::iterator it = mDataMap.find(objID); - - if (it != mDataMap.end()) { - return it->second; - } else { - return NULL; - } - } - - // -------------------------------------------------------------------------- - DataFieldDescIteratorPtr StructuredDataStorage::getFieldDescIterator(void) { - // return our pre-prepared field desc iterator - return mFieldDesc.getIterator(); - } - - // -------------------------------------------------------------------------- - // --------------- String Data Storage -------------------------------------- - // -------------------------------------------------------------------------- - StringDataStorage::StringDataStorage() { - mFieldDesc.enumerator = NULL; - mFieldDesc.name = ""; - mFieldDesc.size = -1; - mFieldDesc.type = DVariant::DV_STRING; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::create(int objID) { - return _create(objID, ""); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::destroy(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - mStringPropMap.erase(it); - - // true, erase went ok - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::has(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - return (it != mStringPropMap.end()); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::clone(int srcID, int dstID) { - StringDataMap::iterator it = mStringPropMap.find(srcID); - - if (it != mStringPropMap.end()) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(dstID, it->second)); - - return res.second; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::getField(int objID, const std::string& field, DVariant& target) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - target = it->second; - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::setField(int objID, const std::string& field, const DVariant& value) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - it->second = value.toString(); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - const std::string& str = it->second; - - uint32_t size = str.size(); - uint32_t outer_size = size + sizeof(uint32_t); - - // Write the size (first size is the size of the string + 4 bytes of the internal size) - if (sizeStored) - file->writeElem(&outer_size, sizeof(uint32_t)); - - file->writeElem(&size, sizeof(uint32_t)); - - // write the data itself - file->write(str.c_str(), size); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it == mStringPropMap.end()) { - uint32_t outer_size, size; - - if (sizeStored) - file->readElem(&outer_size, sizeof(uint32_t)); - - file->readElem(&size, sizeof(uint32_t)); - - if (!sizeStored) - outer_size = size - sizeof(uint32_t); - - assert(outer_size == (size + sizeof(uint32_t))); - - // prepare the string temp buffer - char* str = new char[size + 1]; - - str[size] = 0; // terminate to be sure - - file->read(str, size); - - std::string sobj(str); - - _create(objID, sobj); - - delete[] str; - - return true; - } else { - // skip the prop... - uint32_t size; - - file->readElem(&size, sizeof(uint32_t)); - file->seek(size, File::FSEEK_CUR); - - LOG_ERROR("Data (str) already defined for object %d", objID); - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::_create(int objID, const std::string& text) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(objID, text)); - - return res.second; - } - - // -------------------------------------------------------------------------- - void StringDataStorage::clear() { - mStringPropMap.clear(); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::isEmpty() { - return mStringPropMap.empty(); - } - - // -------------------------------------------------------------------------- - IntIteratorPtr StringDataStorage::getAllStoredObjects() { - return new StringDataMapKeyIterator(mStringPropMap); - } - - // -------------------------------------------------------------------------- - DataFieldDescIteratorPtr StringDataStorage::getFieldDescIterator(void) { - return new SingleFieldDescIterator(mFieldDesc); - } - - // -------------------------------------------------------------------------- - // --------------- Bool Data Storage ---------------------------------------- - // -------------------------------------------------------------------------- - -} Deleted: trunk/src/base/dyntype/PropertyStorage.h =================================================================== --- trunk/src/base/dyntype/PropertyStorage.h 2008-09-17 13:33:26 UTC (rev 836) +++ trunk/src/base/dyntype/PropertyStorage.h 2008-09-17 14:03:20 UTC (rev 837) @@ -1,345 +0,0 @@ -/****************************************************************************** - * - * This file is part of openDarkEngine project - * Copyright (C) 2005-2006 openDarkEngine team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - * - *****************************************************************************/ - - -#ifndef __DATASTORAGE_H -#define __DATASTORAGE_H - -#include "config.h" - -#include "DTypeDef.h" -#include "DVariant.h" -#include "File.h" -#include "Iterator.h" - -namespace Opde { - /** @brief Storage for data (Interface). This class is used as a backend for either property or link storage, and provides data these classes. - * This storage can be overriden to suit better for particular data handling to be managed in effective/different manner for example. - * @note This class does no inheritance resolving itself (in case of properties). Only stores data. - * @note The objID, object id referenced here has the meaning of a ID of any kind appropriate - game object id for Properties, Link id for links. - */ - class OPDELIB_EXPORT DataStorage { - public: - virtual ~DataStorage() {}; - - /** Creates a default-value data for object numbered objID - * @param objID The object ID - * @return true if creation wen't ok, false if something went wrong (object already has the data attached) - */ - virtual bool create(int objID) = 0; - - /** Destroys data on a defined object - * @param objID the object to destroy the data for - * @return true if data was destroyed, false if something went wrong (data was not assigned to the object) - */ - virtual bool destroy(int objID) = 0; - - /** Data ownership detector. Returns true if this data storage holds data for the given object ID - */ - virtual bool has(int objID) = 0; - - /** Clones the data to another object ID (copies all values) - * @note The target data has to not exit (this routine does not overwrite) - * @param srcID the source object ID - * @param dstID the destination ID - * @return true if all went ok, false otherwise (srcID invalid, dstID invalid...) - */ - virtual bool clone(int srcID, int dstID) = 0; - - /** Field value getter - * @param objID The object id to get data value for - * @param field The field to get value for - * @param target The target variant to fill with value - * @return true if value was set to target, false if the field was invalid - */ - virtual bool getField(int objID, const std::string& field, DVariant& target) = 0; - - /** Field value setter - * @param objID The object id to set data value for - * @param field The field to set value for - * @param value The new value to use - * @return true if value was set to target, false if the field was invalid - */ - virtual bool setField(int objID, const std::string& field, const DVariant& value) = 0; - - /** Serialization core routine - * This routine is used to serialize the data for given object ID into a File handle. - * Normally, this routine should write data for the stored data in this format: - * @code - * 32-bit unnsigned size (N) - only expected/written if sizeStored is true - * N bytes of data data for the given property - * @endcode - * - * @param file The file to store the data into - * @param objID The id of the object data to write - * @param sizeStored if true, the size is stored with the data - */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored) = 0; - - /** Deserialization core routine - * This routine is used to read property data for a given object id from a given File handle. - * Normally, this format format is used: - * @code - * 32-bit unnsigned size (N) - only expected/written if sizeStored is true - * N bytes of Property data for the given property - * @endcode - * @note This routine automatically creates property data slot for the objID, and does no load over any previous data (so clear before load is encouraged) - * - * @param file The file to read the data from - * @param objID The id of the object data to read - * @param sizeStored if true, the size is stored with the data, and is read before the data. Otherwise the size of the date this storage uses is used - */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored) = 0; - - /** Called to clear all data */ - virtual void clear() = 0; - - /** Emptyness of data storage detector - * @return true If the data storage does not hold any data, false if does */ - virtual bool isEmpty() = 0; - - /** Getter for all stored object ID's - */ - virtual IntIteratorPtr getAllStoredObjects() = 0; - - /** Optional handler for object ID range re-sets (f.e. when growing the concretes) - */ - virtual void setIDRange(int minID, int MaxID) { }; - - /** Data description retrieval routine. Can be used to generate GUI for data editor, etc. - * @return The data fields description iterator, preferably in the order sored - */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void) = 0; - }; - - /// Shared pointer to data storage - typedef shared_ptr<DataStorage> DataStoragePtr; - - /// Internal: Implementation of field desc. for iterator over DTypeDef - class OPDELIB_EXPORT DTypeDefFieldDesc { - public: - DTypeDefFieldDesc(const DTypeDefPtr& type); - - DataFieldDescIteratorPtr getIterator(); - - protected: - DataFieldDescList mDataFieldDescList; - }; - - /** Structured data implementation of the DataStorage. */ - class OPDELIB_EXPORT StructuredDataStorage : public DataStorage { - public: - StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache); - - /** @see DataStorage::createProp */ - virtual bool create(int objID); - - /** @see DataStorage::destroyProp */ - virtual bool destroy(int objID); - - /** @see DataStorage::hasProp */ - virtual bool has(int objID); - - /** @see DataStorage::cloneProp */ - virtual bool clone(int srcID, int dstID); - - /** @see DataStorage::getPropField */ - virtual bool getField(int objID, const std::string& field, DVariant& target); - - /** @see DataStorage::setPropField */ - virtual bool setField(int objID, const std::string& field, const DVariant& value); - - /** @see DataStorage::writeToFile */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::readFromFile */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::clear */ - virtual void clear(); - - /** @see DataStorage::isEmpty */ - virtual bool isEmpty(); - - /** @see DataStorage::getAllStoredObjects */ - virtual IntIteratorPtr getAllStoredObjects(); - - /** @see DataStorage::getFieldDescIterator */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void); - - protected: - - /** core data creation routine. Returns a pointer to newly created or already existed data data for the objID */ - virtual DTypePtr _create(int objID); - - /// Internal getter for data - DTypePtr getDataForObject(int objID); - - /// Stores objectID -> Data - typedef std::map< int, DTypePtr > DataMap; - - /// Data store instance - DataMap mDataMap; - - /// Type definition for the stored properties - DTypeDefPtr mTypeDef; - - /// Data cache usage indicator (field conversion speedup) - bool mUseDataCache; - - typedef MapKeyIterator<DataMap, int> DataKeyIterator; - - class EmptyIntIterator : public IntIterator { - public: - EmptyIntIterator() : mZero(0) {}; - - const int& next() { - assert(false); - - return mZero; - }; - - bool end() const { - return true; - }; - - protected: - int mZero; - }; - - /// Field description pre-prepared iterator - DTypeDefFieldDesc mFieldDesc; - }; - - - /** Data storage targetted at storing variable length strings (One per id). */ - class OPDELIB_EXPORT StringDataStorage : public DataStorage { - public: - StringDataStorage(); - - protected: - /** @see DataStorage::createProp */ - virtual bool create(int objID); - - /** @see DataStorage::destroyProp */ - virtual bool destroy(int objID); - - /** @see DataStorage::hasProp */ - virtual bool has(int objID); - - /** @see DataStorage::cloneProp */ - virtual bool clone(int srcID, int dstID); - - /** @see DataStorage::getPropField */ - virtual bool getField(int objID, const std::string& field, DVariant& target); - - /** @see DataStorage::setPropField */ - virtual bool setField(int objID, const std::string& field, const DVariant& value); - - /** @see DataStorage::writeToFile */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::readFromFile */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::clear */ - virtual void clear(); - - /** @see DataStorage::isEmpty */ - virtual bool isEmpty(); - - /** @see DataStorage::getAllStoredObjects */ - virtual IntIteratorPtr getAllStoredObjects(); - - /** Core Data creation routine */ - virtual bool _create(int objID, const std::string& text); - - /** @see DataStorage::getFieldDescIterator */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void); - - /// String Data map - typedef std::map<int, std::string> StringDataMap; - - /// Holder of data (string) values - StringDataMap mStringPropMap; - - /// String prop. storage is a single-field construct. This is the field desc for the field - DataFieldDesc mFieldDesc; - - typedef MapKeyIterator<StringDataMap, int> StringDataMapKeyIterator; - }; - -// -// /// Bool property store. Stores 1 bool per object id in a packed array -// class BoolPropertyStorage : public PropertyStorage { -// public: -// BoolPropertyStorage(); -// ~BoolPropertyStorage(); -// -// protected: -// /** @see PropertyStorage::createProp */ -// virtual bool createProp(int objID); -// -// /** @see PropertyStorage::destroyProp */ -// virtual bool destroyProp(int objID); -// -// /** @see PropertyStorage::hasProp */ -// virtual bool hasProp(int objID); -// -// /** @see PropertyStorage::cloneProp */ -// virtual bool cloneProp(int srcID, int dstID); -// -// /** @see PropertyStorage::getPropField */ -// virtual bool getPropField(int objID, const std::string& field, DVariant& target); -// -// /** @see PropertyStorage::setPropField */ -// virtual bool setPropField(int objID, const std::string& field, const DVariant& value); -// -// /** @see PropertyStorage::writeToFile */ -// virtual bool writeToFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::readFromFile */ -// virtual bool readFromFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::clear */ -// virtual void clear(); -// -// /** @see PropertyStorage::isEmpty */ -// virtual bool isEmpty(); -// -// /** @see PropertyStorage::getAllStoredObjects */ -// virtual BitArrayIteratorPtr getAllStoredObjects(); -// -// /// Handles the growth of the object ID range on the bitarrays -// virtual void setIDRange(int minID, int MaxID); -// -// /// mask of stored objects -// BitArray mMask; -// -// /// True/False storage for the objects -// BitArray mValues; -// } - -} - -#endif // __PROPERTYSTORAGE_H Modified: trunk/src/services/property/CMakeLists.txt =================================================================== --- trunk/src/services/property/CMakeLists.txt 2008-09-17 13:33:26 UTC (rev 836) +++ trunk/src/services/property/CMakeLists.txt 2008-09-17 14:03:20 UTC (rev 837) @@ -27,8 +27,6 @@ PropertyService.h PropertyGroup.h PropertyCommon.h - PropertyStorage.cpp - PropertyStorage.h ) #target_link_libraries(OpdePropertyService Modified: trunk/src/services/property/PropertyGroup.h =================================================================== --- trunk/src/services/property/PropertyGroup.h 2008-09-17 13:33:26 UTC (rev 836) +++ trunk/src/services/property/PropertyGroup.h 2008-09-17 14:03:20 UTC (rev 837) @@ -34,7 +34,7 @@ #include "OpdeException.h" #include "logger.h" #include "InheritService.h" -#include "PropertyStorage.h" +#include "DataStorage.h" #include "BitArray.h" namespace Opde { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-09-18 12:07:07
|
Revision: 839 http://opde.svn.sourceforge.net/opde/?rev=839&view=rev Author: volca Date: 2008-09-18 12:07:12 +0000 (Thu, 18 Sep 2008) Log Message: ----------- Common template for single field type data storages, some common storages implemented as well (a prelude to targetted property implementations) Modified Paths: -------------- trunk/src/base/dyntype/CMakeLists.txt trunk/src/base/dyntype/DataStorage.cpp trunk/src/base/dyntype/DataStorage.h trunk/src/main/PLDefScriptCompiler.cpp trunk/src/services/object/SymNamePropertyStorage.cpp trunk/src/services/object/SymNamePropertyStorage.h trunk/src/services/property/PropertyService.cpp trunk/src/services/property/PropertyService.h Added Paths: ----------- trunk/src/base/dyntype/SingleFieldDataStorage.h Modified: trunk/src/base/dyntype/CMakeLists.txt =================================================================== --- trunk/src/base/dyntype/CMakeLists.txt 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/base/dyntype/CMakeLists.txt 2008-09-18 12:07:12 UTC (rev 839) @@ -23,6 +23,7 @@ DTHelpers.h DataStorage.cpp DataStorage.h + SingleFieldDataStorage.h ) target_link_libraries( OpdeDynType Modified: trunk/src/base/dyntype/DataStorage.cpp =================================================================== --- trunk/src/base/dyntype/DataStorage.cpp 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/base/dyntype/DataStorage.cpp 2008-09-18 12:07:12 UTC (rev 839) @@ -52,20 +52,6 @@ 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) -------------------- // -------------------------------------------------------------------------- @@ -251,184 +237,4 @@ // return our pre-prepared field desc iterator return mFieldDesc.getIterator(); } - - // -------------------------------------------------------------------------- - // --------------- String Data Storage -------------------------------------- - // -------------------------------------------------------------------------- - StringDataStorage::StringDataStorage() { - mFieldDesc.enumerator = NULL; - mFieldDesc.name = ""; - mFieldDesc.size = -1; - mFieldDesc.type = DVariant::DV_STRING; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::create(int objID) { - return _create(objID, ""); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::destroy(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - mStringPropMap.erase(it); - - // true, erase went ok - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::has(int objID) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - return (it != mStringPropMap.end()); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::clone(int srcID, int dstID) { - StringDataMap::iterator it = mStringPropMap.find(srcID); - - if (it != mStringPropMap.end()) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(dstID, it->second)); - - return res.second; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::getField(int objID, const std::string& field, DVariant& target) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - target = it->second; - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::setField(int objID, const std::string& field, const DVariant& value) { - assert(field==""); - - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - it->second = value.toString(); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::writeToFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it != mStringPropMap.end()) { - const std::string& str = it->second; - - uint32_t size = str.size(); - uint32_t outer_size = size + sizeof(uint32_t); - - // Write the size (first size is the size of the string + 4 bytes of the internal size) - if (sizeStored) - file->writeElem(&outer_size, sizeof(uint32_t)); - - file->writeElem(&size, sizeof(uint32_t)); - - // write the data itself - file->write(str.c_str(), size); - - return true; - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::readFromFile(FilePtr& file, int objID, bool sizeStored) { - StringDataMap::iterator it = mStringPropMap.find(objID); - - if (it == mStringPropMap.end()) { - uint32_t outer_size, size; - - if (sizeStored) - file->readElem(&outer_size, sizeof(uint32_t)); - - file->readElem(&size, sizeof(uint32_t)); - - if (!sizeStored) - outer_size = size - sizeof(uint32_t); - - assert(outer_size == (size + sizeof(uint32_t))); - - // prepare the string temp buffer - char* str = new char[size + 1]; - - str[size] = 0; // terminate to be sure - - file->read(str, size); - - std::string sobj(str); - - _create(objID, sobj); - - delete[] str; - - return true; - } else { - // skip the prop... - uint32_t size; - - file->readElem(&size, sizeof(uint32_t)); - file->seek(size, File::FSEEK_CUR); - - LOG_ERROR("Data (str) already defined for object %d", objID); - } - - return false; - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::_create(int objID, const std::string& text) { - std::pair<StringDataMap::iterator, bool> res = mStringPropMap.insert(std::make_pair(objID, text)); - - return res.second; - } - - // -------------------------------------------------------------------------- - void StringDataStorage::clear() { - mStringPropMap.clear(); - } - - // -------------------------------------------------------------------------- - bool StringDataStorage::isEmpty() { - return mStringPropMap.empty(); - } - - // -------------------------------------------------------------------------- - IntIteratorPtr StringDataStorage::getAllStoredObjects() { - return new StringDataMapKeyIterator(mStringPropMap); - } - - // -------------------------------------------------------------------------- - DataFieldDescIteratorPtr StringDataStorage::getFieldDescIterator(void) { - return new SingleFieldDescIterator(mFieldDesc); - } - - // -------------------------------------------------------------------------- - // --------------- Bool Data Storage ---------------------------------------- - // -------------------------------------------------------------------------- - } Modified: trunk/src/base/dyntype/DataStorage.h =================================================================== --- trunk/src/base/dyntype/DataStorage.h 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/base/dyntype/DataStorage.h 2008-09-18 12:07:12 UTC (rev 839) @@ -146,27 +146,27 @@ DataFieldDescList mDataFieldDescList; }; - /** Structured data implementation of the DataStorage. */ + /** Structured data implementation of the DataStorage. Should only be used as a temporary solution or as a storage for properties for custom tools */ class OPDELIB_EXPORT StructuredDataStorage : public DataStorage { public: StructuredDataStorage(const DTypeDefPtr& type, bool useDataCache); - /** @see DataStorage::createProp */ + /** @see DataStorage::create */ virtual bool create(int objID); - /** @see DataStorage::destroyProp */ + /** @see DataStorage::destroy */ virtual bool destroy(int objID); - /** @see DataStorage::hasProp */ + /** @see DataStorage::has */ virtual bool has(int objID); - /** @see DataStorage::cloneProp */ + /** @see DataStorage::clone */ virtual bool clone(int srcID, int dstID); - /** @see DataStorage::getPropField */ + /** @see DataStorage::getField */ virtual bool getField(int objID, const std::string& field, DVariant& target); - /** @see DataStorage::setPropField */ + /** @see DataStorage::setField */ virtual bool setField(int objID, const std::string& field, const DVariant& value); /** @see DataStorage::writeToFile */ @@ -230,116 +230,6 @@ /// Field description pre-prepared iterator DTypeDefFieldDesc mFieldDesc; }; - - - /** Data storage targetted at storing variable length strings (One per id). */ - class OPDELIB_EXPORT StringDataStorage : public DataStorage { - public: - StringDataStorage(); - - protected: - /** @see DataStorage::createProp */ - virtual bool create(int objID); - - /** @see DataStorage::destroyProp */ - virtual bool destroy(int objID); - - /** @see DataStorage::hasProp */ - virtual bool has(int objID); - - /** @see DataStorage::cloneProp */ - virtual bool clone(int srcID, int dstID); - - /** @see DataStorage::getPropField */ - virtual bool getField(int objID, const std::string& field, DVariant& target); - - /** @see DataStorage::setPropField */ - virtual bool setField(int objID, const std::string& field, const DVariant& value); - - /** @see DataStorage::writeToFile */ - virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::readFromFile */ - virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored); - - /** @see DataStorage::clear */ - virtual void clear(); - - /** @see DataStorage::isEmpty */ - virtual bool isEmpty(); - - /** @see DataStorage::getAllStoredObjects */ - virtual IntIteratorPtr getAllStoredObjects(); - - /** Core Data creation routine */ - virtual bool _create(int objID, const std::string& text); - - /** @see DataStorage::getFieldDescIterator */ - virtual DataFieldDescIteratorPtr getFieldDescIterator(void); - - /// String Data map - typedef std::map<int, std::string> StringDataMap; - - /// Holder of data (string) values - StringDataMap mStringPropMap; - - /// String prop. storage is a single-field construct. This is the field desc for the field - DataFieldDesc mFieldDesc; - - typedef MapKeyIterator<StringDataMap, int> StringDataMapKeyIterator; - }; - -// -// /// Bool property store. Stores 1 bool per object id in a packed array -// class BoolPropertyStorage : public PropertyStorage { -// public: -// BoolPropertyStorage(); -// ~BoolPropertyStorage(); -// -// protected: -// /** @see PropertyStorage::createProp */ -// virtual bool createProp(int objID); -// -// /** @see PropertyStorage::destroyProp */ -// virtual bool destroyProp(int objID); -// -// /** @see PropertyStorage::hasProp */ -// virtual bool hasProp(int objID); -// -// /** @see PropertyStorage::cloneProp */ -// virtual bool cloneProp(int srcID, int dstID); -// -// /** @see PropertyStorage::getPropField */ -// virtual bool getPropField(int objID, const std::string& field, DVariant& target); -// -// /** @see PropertyStorage::setPropField */ -// virtual bool setPropField(int objID, const std::string& field, const DVariant& value); -// -// /** @see PropertyStorage::writeToFile */ -// virtual bool writeToFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::readFromFile */ -// virtual bool readFromFile(FilePtr& file, int objID); -// -// /** @see PropertyStorage::clear */ -// virtual void clear(); -// -// /** @see PropertyStorage::isEmpty */ -// virtual bool isEmpty(); -// -// /** @see PropertyStorage::getAllStoredObjects */ -// virtual BitArrayIteratorPtr getAllStoredObjects(); -// -// /// Handles the growth of the object ID range on the bitarrays -// virtual void setIDRange(int minID, int MaxID); -// -// /// mask of stored objects -// BitArray mMask; -// -// /// True/False storage for the objects -// BitArray mValues; -// } - } #endif // __PROPERTYSTORAGE_H Added: trunk/src/base/dyntype/SingleFieldDataStorage.h =================================================================== --- trunk/src/base/dyntype/SingleFieldDataStorage.h (rev 0) +++ trunk/src/base/dyntype/SingleFieldDataStorage.h 2008-09-18 12:07:12 UTC (rev 839) @@ -0,0 +1,368 @@ +/****************************************************************************** + * + * 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 __SINGLEDATASTORAGE_H +#define __SINGLEDATASTORAGE_H + +#include "config.h" + +#include "DataStorage.h" + +#include "DTypeDef.h" +#include "DVariant.h" +#include "File.h" +#include "Iterator.h" + +namespace Opde { + /// 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; + }; + + /** Common ancestor template for all the single value data storages (with fixed length data) + */ + template<typename T> class OPDELIB_EXPORT SingleFieldDataStorage : public DataStorage { + public: + /** @see DataStorage::create */ + virtual bool create(int objID) { + // call _create to handle the creation, with the default value + return _create(objID, T()); + } + + /** @see DataStorage::destroy */ + virtual bool destroy(int objID) { + typename DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + mDataMap.erase(it); + + // true, erase went ok + return true; + } + + return false; + } + + /** @see DataStorage::has */ + virtual bool has(int objID) { + typename DataMap::iterator it = mDataMap.find(objID); + + return (it != mDataMap.end()); + } + + /** @see DataStorage::clone */ + virtual bool clone(int srcID, int dstID) { + typename DataMap::iterator it = mDataMap.find(srcID); + + if (it != mDataMap.end()) { + return _create(dstID, it->second); + } + + return false; + } + + /** @see DataStorage::getField */ + virtual bool getField(int objID, const std::string& field, DVariant& target) { + assert(field==""); + + typename DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + target = it->second; + + return true; + } + + return false; + } + + /** @see DataStorage::setField */ + virtual bool setField(int objID, const std::string& field, const DVariant& value) { + assert(field==""); + + typename DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + it->second = fromVariant(value); + + return true; + } + + return false; + } + + /** @see DataStorage::writeToFile */ + virtual bool writeToFile(FilePtr& file, int objID, bool sizeStored) { + typename DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + const T& dta = it->second; + + uint32_t size = sizeof(T); + + // Write the size if requested + if (sizeStored) + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + file->write(&dta, size); + + return true; + } + + return false; + } + + /** @see DataStorage::readFromFile */ + virtual bool readFromFile(FilePtr& file, int objID, bool sizeStored) { + typename DataMap::iterator it = mDataMap.find(objID); + + if (it == mDataMap.end()) { + uint32_t size; + + if (sizeStored) + file->readElem(&size, sizeof(uint32_t)); + + assert(size == sizeof(T)); + + T dta; + + file->read(&dta, size); + + _create(objID, dta); + + return true; + } else { + // skip the data... + uint32_t size; + + file->readElem(&size, sizeof(uint32_t)); + file->seek(size, File::FSEEK_CUR); + } + + return false; + } + + /** @see DataStorage::clear */ + virtual void clear() { + mDataMap.clear(); + } + + /** @see DataStorage::isEmpty */ + virtual bool isEmpty() { + return mDataMap.empty(); + } + + /** @see DataStorage::getAllStoredObjects */ + virtual IntIteratorPtr getAllStoredObjects() { + return new DataMapKeyIterator(mDataMap); + } + + /** Core Data creation routine */ + virtual bool _create(int objID, const T& val) { + std::pair<typename DataMap::iterator, bool> res + = mDataMap.insert(std::make_pair(objID, val)); + + return res.second; + }; + + /** @see DataStorage::getFieldDescIterator */ + virtual DataFieldDescIteratorPtr getFieldDescIterator(void) { + return new SingleFieldDescIterator(mFieldDesc); + } + + protected: + explicit SingleFieldDataStorage() { + }; + + virtual ~SingleFieldDataStorage() { + } + + /// Converts from variant to the internal storage type. Should be overrided, or reimplemented by explicit specialization + virtual T fromVariant(const DVariant& v) const { + return T(); + } + + + /// Bool Data map + typedef typename std::map<int, T> DataMap; + + /// Holder of data (string) values + DataMap mDataMap; + + /// Bool prop. storage is a single-field construct. This is the field desc for the field + DataFieldDesc mFieldDesc; + + typedef MapKeyIterator<DataMap, int> DataMapKeyIterator; + }; + + // Various simple single-fielded data storages (it could be done more easily through some data definition structures): + + /// Boolean (4 byte) data storage + class OPDELIB_EXPORT BoolDataStorage : public SingleFieldDataStorage<bool> { + public: + BoolDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = 4; + mFieldDesc.type = DVariant::DV_BOOL; + } + + virtual bool fromVariant(const DVariant& v) { + return v.toBool(); + } + }; + + /// Float (4 byte) data storage + class OPDELIB_EXPORT FloatDataStorage : public SingleFieldDataStorage<float> { + public: + FloatDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = 4; + mFieldDesc.type = DVariant::DV_FLOAT; + } + + virtual float fromVariant(const DVariant& v) { + return v.toFloat(); + } + }; + + /// int (4 byte) data storage + class OPDELIB_EXPORT IntDataStorage : public SingleFieldDataStorage<int32_t> { + public: + IntDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = sizeof(int32_t); + mFieldDesc.type = DVariant::DV_INT; + } + + virtual int32_t fromVariant(const DVariant& v) { + return v.toInt(); + } + }; + + /// int (4 byte) data storage + class OPDELIB_EXPORT UIntDataStorage : public SingleFieldDataStorage<uint32_t> { + public: + UIntDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = sizeof(uint32_t); + mFieldDesc.type = DVariant::DV_UINT; + } + + virtual uint32_t fromVariant(const DVariant& v) { + return v.toUInt(); + } + }; + + /// Variable length string data storage + class OPDELIB_EXPORT StringDataStorage : public SingleFieldDataStorage<std::string> { + public: + StringDataStorage() { + mFieldDesc.enumerator = NULL; + mFieldDesc.name = ""; + mFieldDesc.size = -1; + mFieldDesc.type = DVariant::DV_STRING; + } + + bool writeToFile(FilePtr& file, int objID, bool sizeStored) { + DataMap::iterator it = mDataMap.find(objID); + + if (it != mDataMap.end()) { + const std::string& str = it->second; + + uint32_t size = str.size(); + uint32_t outer_size = size + sizeof(uint32_t); + + // Write the size (first size is the size of the string + 4 bytes of the internal size) + if (sizeStored) + file->writeElem(&outer_size, sizeof(uint32_t)); + + file->writeElem(&size, sizeof(uint32_t)); + + // write the data itself + file->write(str.c_str(), size); + + return true; + } + + return false; + } + + bool readFromFile(FilePtr& file, int objID, bool sizeStored) { + DataMap::iterator it = mDataMap.find(objID); + + if (it == mDataMap.end()) { + uint32_t outer_size, size; + + if (sizeStored) + file->readElem(&outer_size, sizeof(uint32_t)); + + file->readElem(&size, sizeof(uint32_t)); + + if (!sizeStored) + outer_size = size - sizeof(uint32_t); + + assert(outer_size == (size + sizeof(uint32_t))); + + // prepare the string temp buffer + char* str = new char[size + 1]; + + str[size] = 0; // terminate to be sure + + file->read(str, size); + + std::string sobj(str); + + _create(objID, sobj); + + delete[] str; + + return true; + } else { + // skip the data... + uint32_t size; + + file->readElem(&size, sizeof(uint32_t)); + file->seek(size, File::FSEEK_CUR); + } + + return false; + } + }; +} + +#endif // __PROPERTYSTORAGE_H Property changes on: trunk/src/base/dyntype/SingleFieldDataStorage.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/src/main/PLDefScriptCompiler.cpp =================================================================== --- trunk/src/main/PLDefScriptCompiler.cpp 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/main/PLDefScriptCompiler.cpp 2008-09-18 12:07:12 UTC (rev 839) @@ -30,7 +30,8 @@ #include <OgreException.h> #include <OgreStringConverter.h> #include "OpdeServiceManager.h" -#include "logger.h" +#include "logger.h" +#include "SingleFieldDataStorage.h" using namespace std; using namespace Ogre; Modified: trunk/src/services/object/SymNamePropertyStorage.cpp =================================================================== --- trunk/src/services/object/SymNamePropertyStorage.cpp 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/services/object/SymNamePropertyStorage.cpp 2008-09-18 12:07:12 UTC (rev 839) @@ -78,9 +78,9 @@ return false; // get the previous name of the object, free that record - StringDataMap::const_iterator sit = mStringPropMap.find(objID); + DataMap::const_iterator sit = mDataMap.find(objID); - assert(sit != mStringPropMap.end()); + assert(sit != mDataMap.end()); // name not in use yet, we can assign it if (StringDataStorage::setField(objID, field, value)) { Modified: trunk/src/services/object/SymNamePropertyStorage.h =================================================================== --- trunk/src/services/object/SymNamePropertyStorage.h 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/services/object/SymNamePropertyStorage.h 2008-09-18 12:07:12 UTC (rev 839) @@ -25,7 +25,7 @@ #ifndef __SYMNAMEPROPERTYSTORAGE_H #define __SYMNAMEPROPERTYSTORAGE_H -#include "DataStorage.h" +#include "SingleFieldDataStorage.h" namespace Opde { Modified: trunk/src/services/property/PropertyService.cpp =================================================================== --- trunk/src/services/property/PropertyService.cpp 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/services/property/PropertyService.cpp 2008-09-18 12:07:12 UTC (rev 839) @@ -71,12 +71,13 @@ // -------------------------------------------------------------------------- PropertyService::~PropertyService() { - PropertyGroupMap::iterator it = mPropertyGroupMap.begin(); + PropertyList::iterator it = mPropertiesToDelete.begin(); - for( ; it != mPropertyGroupMap.end(); ++it) { - delete it->second; + for( ; it != mPropertiesToDelete.end(); ++it) { + delete *it; } - + + mPropertiesToDelete.clear(); mPropertyGroupMap.clear(); } @@ -99,7 +100,7 @@ } std::pair<PropertyGroupMap::iterator, bool> res = mPropertyGroupMap.insert(make_pair(name, nr)); - + if (!res.second) { delete nr; @@ -107,12 +108,32 @@ "PropertyService::createPropertyGroup"); } + // insert the pointer into the to be freed list + mPropertiesToDelete.push_back(nr); + LOG_INFO("PropertyService::createPropertyGroup: Created a property group %s (With chunk name %s)", name.c_str(), chunkName.c_str()); return nr; } // -------------------------------------------------------------------------- + void PropertyService::registerPropertyGroup(PropertyGroup* group) { + mPropertyGroupMap.insert(make_pair(group->getName(), group)); + } + + // -------------------------------------------------------------------------- + void PropertyService::unregisterPropertyGroup(PropertyGroup* group) { + // try to find it by name, remove + assert(group); + + PropertyGroupMap::iterator it = mPropertyGroupMap.find(group->getName()); + + if (it != mPropertyGroupMap.end()) { + mPropertyGroupMap.erase(it); + } + } + + // -------------------------------------------------------------------------- void PropertyService::load(const FileGroupPtr& db) { // We just give the db to all registered groups PropertyGroupMap::iterator it = mPropertyGroupMap.begin(); Modified: trunk/src/services/property/PropertyService.h =================================================================== --- trunk/src/services/property/PropertyService.h 2008-09-17 14:11:55 UTC (rev 838) +++ trunk/src/services/property/PropertyService.h 2008-09-18 12:07:12 UTC (rev 839) @@ -41,7 +41,7 @@ PropertyService(ServiceManager *manager, const std::string& name); virtual ~PropertyService(); - /** Creates a property group using the specified property storage + /** 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) @@ -50,7 +50,14 @@ * @see PropertyGroup::PropertyGroup */ PropertyGroup* createPropertyGroup(const std::string& name, const std::string& chunkName, std::string inheritorName, const DataStoragePtr& storage, bool takeover = false); - + + /** Registers a custom property group to the property service. These properties are not destroyed at the end of the lifetime of this service. + */ + void registerPropertyGroup(PropertyGroup* group); + + /** Unregisters a custom property group from the property service. + */ + void unregisterPropertyGroup(PropertyGroup* group); /** 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 @@ -108,7 +115,9 @@ StringIteratorPtr getAllPropertyNames(); /// maps property groups to their names - typedef std::map< std::string, PropertyGroup* > PropertyGroupMap; + typedef std::map< std::string, PropertyGroup* > PropertyGroupMap; + + typedef std::list< PropertyGroup* > PropertyList; protected: /// service initialization @@ -118,7 +127,10 @@ void bootstrapFinished(); /// maps the properties by their names - PropertyGroupMap mPropertyGroupMap; + PropertyGroupMap mPropertyGroupMap; + + /// List of properties that will be freed upon service termination + PropertyList mPropertiesToDelete; /// Database service DatabaseServicePtr mDatabaseService; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-09-21 18:25:24
|
Revision: 843 http://opde.svn.sourceforge.net/opde/?rev=843&view=rev Author: volca Date: 2008-09-21 18:25:14 +0000 (Sun, 21 Sep 2008) Log Message: ----------- A few more fixes for VC Modified Paths: -------------- trunk/src/base/console/ConsoleFrontend.cpp trunk/src/base/logger/CMakeLists.txt trunk/src/base/logger/logger.h trunk/src/main/Root.cpp trunk/src/scenemanager/CMakeLists.txt Modified: trunk/src/base/console/ConsoleFrontend.cpp =================================================================== --- trunk/src/base/console/ConsoleFrontend.cpp 2008-09-21 16:50:46 UTC (rev 842) +++ trunk/src/base/console/ConsoleFrontend.cpp 2008-09-21 18:25:14 UTC (rev 843) @@ -22,9 +22,9 @@ *****************************************************************************/ #include "config.h" +#include "ConsoleFrontend.h" +#include "ConsoleBackend.h" -#include "ConsoleBackend.h" -#include "ConsoleFrontend.h" #include "OpdeException.h" #include <OIS.h> Modified: trunk/src/base/logger/CMakeLists.txt =================================================================== --- trunk/src/base/logger/CMakeLists.txt 2008-09-21 16:50:46 UTC (rev 842) +++ trunk/src/base/logger/CMakeLists.txt 2008-09-21 18:25:14 UTC (rev 843) @@ -4,14 +4,15 @@ ${OPDE_SOURCE_DIR}/src/base ) -file(GLOB OPDE_LOGGER_HEADERS *.h) - add_library(OpdeLogger logger.cpp - stdlog.cpp - filelog.cpp + logger.h + stdlog.cpp + stdlog.h + filelog.cpp + filelog.h OgreOpdeLogConnector.cpp - ${OPDE_LOGGER_HEADERS} + OgreOpdeLogConnector.h ) SET_TARGET_PROPERTIES(OpdeLogger PROPERTIES Modified: trunk/src/base/logger/logger.h =================================================================== --- trunk/src/base/logger/logger.h 2008-09-21 16:50:46 UTC (rev 842) +++ trunk/src/base/logger/logger.h 2008-09-21 18:25:14 UTC (rev 843) @@ -32,7 +32,7 @@ namespace Opde { // Forward declaration - class OPDELIB_EXPORT LogListener; + class LogListener; /** Main logger class. This class is intended for logging purposes. Logging listeners, registered using registerLogListener method recieve logging messages formated by vsnprintf function */ class OPDELIB_EXPORT Logger : public Singleton<Logger> { Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2008-09-21 16:50:46 UTC (rev 842) +++ trunk/src/main/Root.cpp 2008-09-21 18:25:14 UTC (rev 843) @@ -51,6 +51,8 @@ #include "ManualFonFileLoader.h" #include "logger.h" #include "OpdeException.h" +#include "ConsoleFrontend.h" +#include "stdlog.h" namespace Opde { // ------------------------------------------------------- Modified: trunk/src/scenemanager/CMakeLists.txt =================================================================== --- trunk/src/scenemanager/CMakeLists.txt 2008-09-21 16:50:46 UTC (rev 842) +++ trunk/src/scenemanager/CMakeLists.txt 2008-09-21 18:25:14 UTC (rev 843) @@ -1,31 +1,35 @@ -include_directories( - ${OGRE_INCLUDE_DIR} - ${OPDE_BINARY_DIR} -) - -link_directories ( - ${OGRE_LIB_DIR} -) - -add_library (DarkSceneManager - DarkBspNode.cpp - DarkBspNode.h - DarkBspTree.cpp - DarkBspTree.h - DarkSceneNode.cpp - DarkSceneNode.h - DarkConvexPolygon.cpp - DarkConvexPolygon.h - DarkPortal.cpp - DarkPortal.h - DarkPortalFrustum.cpp - DarkPortalFrustum.h - DarkCamera.cpp - DarkCamera.h - DarkSceneManager.cpp - DarkSceneManager.h - DarkLight.cpp - DarkLight.h - DarkGeometry.cpp - DarkGeometry.h - ) \ No newline at end of file +include_directories( + ${OGRE_INCLUDE_DIR} + ${OPDE_BINARY_DIR} +) + +link_directories ( + ${OGRE_LIB_DIR} +) + +add_library (DarkSceneManager + DarkBspNode.cpp + DarkBspNode.h + DarkBspTree.cpp + DarkBspTree.h + DarkSceneNode.cpp + DarkSceneNode.h + DarkConvexPolygon.cpp + DarkConvexPolygon.h + DarkPortal.cpp + DarkPortal.h + DarkPortalFrustum.cpp + DarkPortalFrustum.h + DarkCamera.cpp + DarkCamera.h + DarkSceneManager.cpp + DarkSceneManager.h + DarkLight.cpp + DarkLight.h + DarkGeometry.cpp + DarkGeometry.h +) + +SET_TARGET_PROPERTIES(DarkSceneManager PROPERTIES + COMPILE_DEFINITIONS "OPDELIB_DLL_TARGET" +) 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:35:18
|
Revision: 868 http://opde.svn.sourceforge.net/opde/?rev=868&view=rev Author: volca Date: 2008-10-06 20:34:16 +0000 (Mon, 06 Oct 2008) Log Message: ----------- win32 fixes Modified Paths: -------------- trunk/src/bindings/bindings.h trunk/src/main/CMakeLists.txt Modified: trunk/src/bindings/bindings.h =================================================================== --- trunk/src/bindings/bindings.h 2008-10-06 20:23:36 UTC (rev 867) +++ trunk/src/bindings/bindings.h 2008-10-06 20:34:16 UTC (rev 868) @@ -1,255 +1,255 @@ -/****************************************************************************** - * - * 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 __BINDINGS_H -#define __BINDINGS_H - -#include "DVariant.h" -#include "Root.h" - -#include <Python.h> -#include <OgreVector3.h> - -namespace Opde { - namespace Python { - // Type converters - enum VariableType { VT_INVALID, VT_BOOL, VT_INT, VT_LONG, VT_FLOAT, VT_CHARPTR, VT_STRING, VT_CUSTOM_TYPE }; - - struct TypeInfoBase { - }; - - template<typename T> struct TypeInfo : public TypeInfoBase { - char* typeName; - VariableType type; - - TypeInfo() : typeName("invalid"), type(VT_INVALID) {}; - - PyObject* toPyObject(T val) const { - PyErr_SetString(PyExc_TypeError, "Binding error: Type has no conversion or TypeInfo specified!"); - return NULL; - } - }; - - - template<> struct TypeInfo<bool> { - char* typeName; - VariableType type; - - TypeInfo() : typeName("bool"), type(VT_BOOL) {}; - - PyObject* toPyObject(bool val) const { - PyObject* res = val ? Py_True : Py_False; - - Py_INCREF(res); - - return res; - } - }; - - template<> struct TypeInfo<int> { - char* typeName; - VariableType type; - - TypeInfo() : typeName("int"), type(VT_INT) {}; - - PyObject* toPyObject(int val) const { - return PyLong_FromLong(val); - } - }; - - template<> struct TypeInfo<long> { - char* typeName; - VariableType type; - - TypeInfo() : typeName("long"), type(VT_LONG) {}; - - PyObject* toPyObject(long val) const { - return PyLong_FromLong(val); - } - }; - - - template<> struct TypeInfo<float> { - char* typeName; - VariableType type; - - TypeInfo() : typeName("float"), type(VT_FLOAT) {}; - - PyObject* toPyObject(float val) const { - return PyFloat_FromDouble(val); - } - }; - - template<> struct TypeInfo<std::string> { - char* typeName; - VariableType type; - - TypeInfo() : typeName("std::string"), type(VT_STRING) {}; - - PyObject* toPyObject(const std::string& val) const { - return PyString_FromString(val.c_str()); - } - }; - - // Global utilities - object conversion and such - PyObject* DVariantToPyObject(const DVariant& inst); - DVariant PyObjectToDVariant(PyObject* obj); - - // DVariant type info - template<> struct TypeInfo<DVariant> { - char* typeName; - VariableType type; - - TypeInfo() : typeName("DVariant"), type(VT_CUSTOM_TYPE) {}; - - PyObject* toPyObject(const DVariant& val) const { - return DVariantToPyObject(val); - } - }; - - /// Template definition of a Python instance holding a single object - template<typename T> struct ObjectBase { - PyObject_HEAD - T mInstance; - }; - - /// helper function to get type from Object - template<typename T> T python_cast(PyObject* obj, PyTypeObject* type) { - // More generic: Checks for ancestors as well - assert(PyObject_TypeCheck(obj, type)); - - return reinterpret_cast< T >(obj); - } - - /// A template that binds sharedptr typed classes - template <typename T> class shared_ptr_binder { - protected: - /// A python object type - typedef ObjectBase<T> Object; - - /// A sort-of constructor method. To be used to create a new NULL Object* - static Object* construct(PyTypeObject* type) { - Object* object; - - object = PyObject_New(Object, type); - - // At this point, the shared_ptr instance in the object is invalid (I.E. Allocated, but not initialized). - // If we try to assign into it, we'll segfault. Because of that, we have to do placed new to initialize the object - if (object != NULL) { - // Here, tidy! - ::new (&object->mInstance) T(); - } - - return object; - } - - /// Destructor for the python object. Safely decreases the reference to the shared_ptr. To be used in msType - static void dealloc(PyObject *self) { - // cast the object to T::Object - Object* o = reinterpret_cast<Object*>(self); - - // Decreases the shared_ptr counter - o->mInstance.setNull(); - - // Call the destructor to clean up - (&o->mInstance)->~T(); - - // Finally delete the object - PyObject_Del(self); - } - - /** Publishes the type as a member of a specified module - @param module The module to publish the type in - @param type The python type object to publish - @param name The name of the type to use - */ - static void publishType(PyObject* module, PyTypeObject* type, const char* name) { - PyType_Ready(type); - - PyDict_SetItemString(PyModule_GetDict(module), name, (PyObject*)type); - } - }; - - /// A template that binds a pointer to class (simmilar to shared_ptr_binder, but no special handling is used) - template <typename T> class class_ptr_binder { - protected: - /// A python object type - typedef ObjectBase<T*> Object; - - /// A sort-of constructor method. To be used to create a new NULL Object* - static Object* construct(PyTypeObject* type) { - Object* object; - - object = PyObject_New(Object, type); - - // At this point, the shared_ptr instance in the object is invalid (I.E. Allocated, but not initialized). - // If we try to assign into it, we'll segfault. Because of that, we have to do placed new to initialize the object - if (object != NULL) { - // Here, tidy! - object->mInstance = NULL; - } - - return object; - } - - /// Destructor for the python object. Safely decreases the reference to the shared_ptr. To be used in msType - static void dealloc(PyObject *self) { - // cast the object to LinkServiceBinder::Object - Object* o = reinterpret_cast<Object*>(self); - - // delete the object - PyObject_Del(self); - } - }; - - }; - - /** Central class for python bindings. Call PythonLanguage::Init() to prepare python environment */ - class PythonLanguage { - protected: - static Opde::Root* msRoot; - - public: - /** Initializes python lang and all the bindings */ - static void init(); - - /** Finalizes python lang */ - static void term(); - - /** Runs a script loaded in memory on a given address */ - static void runScriptPtr(const char* ptr); - - /** Runs a script from a file */ - static void runScript(const char* fname); - - /// Python side Root singleton handler - static PyObject* createRoot(PyObject *self, PyObject* args); - - /// Python side Root singleton handler - static PyObject* getRoot(PyObject *self, PyObject* args); - }; -} - - -#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 __BINDINGS_H +#define __BINDINGS_H + +#include "DVariant.h" +#include "Root.h" + +#include <Python.h> +#include <OgreVector3.h> + +namespace Opde { + namespace Python { + // Type converters + enum VariableType { VT_INVALID, VT_BOOL, VT_INT, VT_LONG, VT_FLOAT, VT_CHARPTR, VT_STRING, VT_CUSTOM_TYPE }; + + struct TypeInfoBase { + }; + + template<typename T> struct TypeInfo : public TypeInfoBase { + char* typeName; + VariableType type; + + TypeInfo() : typeName("invalid"), type(VT_INVALID) {}; + + PyObject* toPyObject(T val) const { + PyErr_SetString(PyExc_TypeError, "Binding error: Type has no conversion or TypeInfo specified!"); + return NULL; + } + }; + + + template<> struct TypeInfo<bool> { + char* typeName; + VariableType type; + + TypeInfo() : typeName("bool"), type(VT_BOOL) {}; + + PyObject* toPyObject(bool val) const { + PyObject* res = val ? Py_True : Py_False; + + Py_INCREF(res); + + return res; + } + }; + + template<> struct TypeInfo<int> { + char* typeName; + VariableType type; + + TypeInfo() : typeName("int"), type(VT_INT) {}; + + PyObject* toPyObject(int val) const { + return PyLong_FromLong(val); + } + }; + + template<> struct TypeInfo<long> { + char* typeName; + VariableType type; + + TypeInfo() : typeName("long"), type(VT_LONG) {}; + + PyObject* toPyObject(long val) const { + return PyLong_FromLong(val); + } + }; + + + template<> struct TypeInfo<float> { + char* typeName; + VariableType type; + + TypeInfo() : typeName("float"), type(VT_FLOAT) {}; + + PyObject* toPyObject(float val) const { + return PyFloat_FromDouble(val); + } + }; + + template<> struct TypeInfo<std::string> { + char* typeName; + VariableType type; + + TypeInfo() : typeName("std::string"), type(VT_STRING) {}; + + PyObject* toPyObject(const std::string& val) const { + return PyString_FromString(val.c_str()); + } + }; + + // Global utilities - object conversion and such + PyObject* DVariantToPyObject(const DVariant& inst); + DVariant PyObjectToDVariant(PyObject* obj); + + // DVariant type info + template<> struct TypeInfo<DVariant> { + char* typeName; + VariableType type; + + TypeInfo() : typeName("DVariant"), type(VT_CUSTOM_TYPE) {}; + + PyObject* toPyObject(const DVariant& val) const { + return DVariantToPyObject(val); + } + }; + + /// Template definition of a Python instance holding a single object + template<typename T> struct ObjectBase { + PyObject_HEAD + T mInstance; + }; + + /// helper function to get type from Object + template<typename T> T python_cast(PyObject* obj, PyTypeObject* type) { + // More generic: Checks for ancestors as well + assert(PyObject_TypeCheck(obj, type)); + + return reinterpret_cast< T >(obj); + } + + /// A template that binds sharedptr typed classes + template <typename T> class shared_ptr_binder { + protected: + /// A python object type + typedef ObjectBase<T> Object; + + /// A sort-of constructor method. To be used to create a new NULL Object* + static Object* construct(PyTypeObject* type) { + Object* object; + + object = PyObject_New(Object, type); + + // At this point, the shared_ptr instance in the object is invalid (I.E. Allocated, but not initialized). + // If we try to assign into it, we'll segfault. Because of that, we have to do placed new to initialize the object + if (object != NULL) { + // Here, tidy! + ::new (&object->mInstance) T(); + } + + return object; + } + + /// Destructor for the python object. Safely decreases the reference to the shared_ptr. To be used in msType + static void dealloc(PyObject *self) { + // cast the object to T::Object + Object* o = reinterpret_cast<Object*>(self); + + // Decreases the shared_ptr counter + o->mInstance.setNull(); + + // Call the destructor to clean up + (&o->mInstance)->~T(); + + // Finally delete the object + PyObject_Del(self); + } + + /** Publishes the type as a member of a specified module + @param module The module to publish the type in + @param type The python type object to publish + @param name The name of the type to use + */ + static void publishType(PyObject* module, PyTypeObject* type, const char* name) { + PyType_Ready(type); + + PyDict_SetItemString(PyModule_GetDict(module), name, (PyObject*)type); + } + }; + + /// A template that binds a pointer to class (simmilar to shared_ptr_binder, but no special handling is used) + template <typename T> class class_ptr_binder { + protected: + /// A python object type + typedef ObjectBase<T*> Object; + + /// A sort-of constructor method. To be used to create a new NULL Object* + static Object* construct(PyTypeObject* type) { + Object* object; + + object = PyObject_New(Object, type); + + // At this point, the shared_ptr instance in the object is invalid (I.E. Allocated, but not initialized). + // If we try to assign into it, we'll segfault. Because of that, we have to do placed new to initialize the object + if (object != NULL) { + // Here, tidy! + object->mInstance = NULL; + } + + return object; + } + + /// Destructor for the python object. Safely decreases the reference to the shared_ptr. To be used in msType + static void dealloc(PyObject *self) { + // cast the object to LinkServiceBinder::Object + Object* o = reinterpret_cast<Object*>(self); + + // delete the object + PyObject_Del(self); + } + }; + + }; + + /** Central class for python bindings. Call PythonLanguage::Init() to prepare python environment */ + class OPDELIB_EXPORT PythonLanguage { + protected: + static Opde::Root* msRoot; + + public: + /** Initializes python lang and all the bindings */ + static void init(); + + /** Finalizes python lang */ + static void term(); + + /** Runs a script loaded in memory on a given address */ + static void runScriptPtr(const char* ptr); + + /** Runs a script from a file */ + static void runScript(const char* fname); + + /// Python side Root singleton handler + static PyObject* createRoot(PyObject *self, PyObject* args); + + /// Python side Root singleton handler + static PyObject* getRoot(PyObject *self, PyObject* args); + }; +} + + +#endif Modified: trunk/src/main/CMakeLists.txt =================================================================== --- trunk/src/main/CMakeLists.txt 2008-10-06 20:23:36 UTC (rev 867) +++ trunk/src/main/CMakeLists.txt 2008-10-06 20:34:16 UTC (rev 868) @@ -105,7 +105,7 @@ ) # Script executor executable -add_executable (opdeScript WIN32 +add_executable (opdeScript OpdeScript.cpp ) @@ -114,8 +114,10 @@ ${OGRE_LIBRARIES} ${OIS_LIBRARIES} ${FREEIMAGE_LIBRARIES} + ${PYTHON_LIBRARIES} ) SET_TARGET_PROPERTIES( opdeScript PROPERTIES COMPILE_DEFINITIONS "OPDE_EXE_TARGET" ) + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-15 19:56:48
|
Revision: 873 http://opde.svn.sourceforge.net/opde/?rev=873&view=rev Author: volca Date: 2008-10-15 19:56:38 +0000 (Wed, 15 Oct 2008) Log Message: ----------- Python script execution fixes Modified Paths: -------------- trunk/src/bindings/bindings.cpp trunk/src/bindings/bindings.h trunk/src/main/OpdeScript.cpp Modified: trunk/src/bindings/bindings.cpp =================================================================== --- trunk/src/bindings/bindings.cpp 2008-10-15 16:01:43 UTC (rev 872) +++ trunk/src/bindings/bindings.cpp 2008-10-15 19:56:38 UTC (rev 873) @@ -193,17 +193,39 @@ } } - void PythonLanguage::runScript(const char* fname) { - FILE *fp = fopen (fname, "r+"); - PyRun_SimpleFile(fp, fname); - fclose(fp); + bool PythonLanguage::runScript(const char* fname) { + FILE *fp = fopen (fname, "rb"); + if (fp != NULL) { + /* A short explanation: + 1. The PyRun_SimpleFile has issues with FILE* type. Results in Access Violations on Windows + 2. The PyRun_SimpleString does not handle DOS line-endings. + */ + + std::ifstream pyfile(fname); + + if (!pyfile) + return false; + + std::string ftxt, line; + + while (!pyfile.eof()) { + getline(pyfile, line); + ftxt += line; + ftxt += '\n'; + } + pyfile.close(); + + PyRun_SimpleStringFlags(ftxt.c_str(), NULL); + } + if (PyErr_Occurred()) { - // TODO: Do something useful here, or forget it - // TODO: PythonException(BasicException) with the PyErr string probably. Same in the init PyErr_Print(); PyErr_Clear(); + return false; } + + return true; } PyObject* PythonLanguage::createRoot(PyObject *self, PyObject* args) { Modified: trunk/src/bindings/bindings.h =================================================================== --- trunk/src/bindings/bindings.h 2008-10-15 16:01:43 UTC (rev 872) +++ trunk/src/bindings/bindings.h 2008-10-15 19:56:38 UTC (rev 873) @@ -241,7 +241,7 @@ static void runScriptPtr(const char* ptr); /** Runs a script from a file */ - static void runScript(const char* fname); + static bool runScript(const char* fname); /// Python side Root singleton handler static PyObject* createRoot(PyObject *self, PyObject* args); Modified: trunk/src/main/OpdeScript.cpp =================================================================== --- trunk/src/main/OpdeScript.cpp 2008-10-15 16:01:43 UTC (rev 872) +++ trunk/src/main/OpdeScript.cpp 2008-10-15 19:56:38 UTC (rev 873) @@ -44,8 +44,8 @@ PythonLanguage::runScript(scriptName.c_str()); PythonLanguage::term(); } else { - std::cerr << "opdeScript: Script name epected as a parameter!" << std::endl; - return 1; + std::cerr << "opdeScript: Script name epected as a parameter!" << std::endl; + return 1; } return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-10-19 12:31:45
|
Revision: 888 http://opde.svn.sourceforge.net/opde/?rev=888&view=rev Author: patryn Date: 2008-10-19 12:31:35 +0000 (Sun, 19 Oct 2008) Log Message: ----------- A minor optimization and got rid of a typo. Modified Paths: -------------- trunk/src/base/dyntype/DTypeDef.cpp trunk/src/services/input/InputService.cpp Modified: trunk/src/base/dyntype/DTypeDef.cpp =================================================================== --- trunk/src/base/dyntype/DTypeDef.cpp 2008-10-19 08:02:20 UTC (rev 887) +++ trunk/src/base/dyntype/DTypeDef.cpp 2008-10-19 12:31:35 UTC (rev 888) @@ -222,16 +222,20 @@ for (; it != mSubTypes.end(); ++it) { size_t elemsz = (*it)->size(); - if (maxsz < elemsz) - maxsz = elemsz; - - sumsz += elemsz; + if (mUnioned) + { + if (maxsz < elemsz) + maxsz = elemsz; + } + else + sumsz += elemsz; } if (mUnioned) return maxsz; return sumsz; + } else { // Array assert(mSubTypes.size() > 0); Modified: trunk/src/services/input/InputService.cpp =================================================================== --- trunk/src/services/input/InputService.cpp 2008-10-19 08:02:20 UTC (rev 887) +++ trunk/src/services/input/InputService.cpp 2008-10-19 12:31:35 UTC (rev 888) @@ -116,7 +116,7 @@ registerValidKey(KC_MULTIPLY, "keypad_star"); // Keypad star? registerValidKey(KC_LMENU, "alt"); registerValidKey(KC_SPACE, "space"); - // registerValidKey(KC_CAPITAL, ""); // CUPS_LOCK? + // registerValidKey(KC_CAPITAL, ""); // CAPS_LOCK? registerValidKey(KC_F1, "f1"); registerValidKey(KC_F2, "f2"); registerValidKey(KC_F3, "f3"); @@ -337,7 +337,7 @@ mInputSystem = OIS::InputManager::createInputSystem( paramList ); // If possible create a buffered keyboard -#if OIS_VERSION>=66048 +#if OIS_VERSION >= 66048 if( mInputSystem->getNumberOfDevices(OIS::OISKeyboard) > 0 ) { #else if( mInputSystem->numKeyboards() > 0 ) { @@ -347,7 +347,7 @@ } // If possible create a buffered mouse -#if OIS_VERSION>=66048 +#if OIS_VERSION >= 66048 if( mInputSystem->getNumberOfDevices(OIS::OISMouse) > 0 ) { #else if( mInputSystem->numMice() > 0 ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-10-21 10:06:33
|
Revision: 908 http://opde.svn.sourceforge.net/opde/?rev=908&view=rev Author: patryn Date: 2008-10-21 10:06:18 +0000 (Tue, 21 Oct 2008) Log Message: ----------- Two minor optimizations. Modified Paths: -------------- trunk/src/base/dyntype/DTypeDef.cpp trunk/src/scenemanager/DarkBspNode.h Modified: trunk/src/base/dyntype/DTypeDef.cpp =================================================================== --- trunk/src/base/dyntype/DTypeDef.cpp 2008-10-21 07:06:46 UTC (rev 907) +++ trunk/src/base/dyntype/DTypeDef.cpp 2008-10-21 10:06:18 UTC (rev 908) @@ -217,11 +217,11 @@ // For struct, sum all the members. For Union, compute maximum. size_t maxsz = 0, sumsz = 0; - DTypeDefVector::const_iterator it = mSubTypes.begin(); + unsigned int Size = mSubTypes.size(); + for(unsigned int I = 0; I < Size; I++) + { + size_t elemsz = mSubTypes[I]->size(); - for (; it != mSubTypes.end(); ++it) { - size_t elemsz = (*it)->size(); - if (mUnioned) { if (maxsz < elemsz) Modified: trunk/src/scenemanager/DarkBspNode.h =================================================================== --- trunk/src/scenemanager/DarkBspNode.h 2008-10-21 07:06:46 UTC (rev 907) +++ trunk/src/scenemanager/DarkBspNode.h 2008-10-21 10:06:18 UTC (rev 908) @@ -198,7 +198,7 @@ // Invalidates the screen projection info (so refreshScreenRect will pass) void invalidateScreenRect(int frameNum) { mInitialized = false; mFrameNum = frameNum; mViewRect = PortalRect::EMPTY; }; - int getLeafID(void) const { return mLeafID; }; + inline int getLeafID(void) const { return mLeafID; }; protected: /// ID of the BSP row (order) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-20 15:58:11
|
Revision: 902 http://opde.svn.sourceforge.net/opde/?rev=902&view=rev Author: volca Date: 2008-10-20 15:58:07 +0000 (Mon, 20 Oct 2008) Log Message: ----------- Use fixed-size array for the cell fragment lists. A decent speedup! Modified Paths: -------------- trunk/src/scenemanager/DarkGeometry.cpp trunk/src/scenemanager/DarkGeometry.h trunk/src/services/worldrep/WorldRepService.cpp Modified: trunk/src/scenemanager/DarkGeometry.cpp =================================================================== --- trunk/src/scenemanager/DarkGeometry.cpp 2008-10-20 11:43:00 UTC (rev 901) +++ trunk/src/scenemanager/DarkGeometry.cpp 2008-10-20 15:58:07 UTC (rev 902) @@ -64,8 +64,13 @@ mSubGeometryMap.clear(); } - + // ----------------------------------------------------------------- + void DarkGeometry::setCellCount(size_t cellCount) { + mCellCount = cellCount; + } + + // ----------------------------------------------------------------- DarkSubGeometry * DarkGeometry::getSubGeometryForMaterial(const MaterialPtr& mat, bool createIfNotFound) { DarkSubGeometryMap::iterator it = mSubGeometryMap.find(mat->getName()); @@ -73,7 +78,7 @@ return it->second; } else { if (createIfNotFound) { - DarkSubGeometry *newg = new DarkSubGeometry(mat, mDefaultRenderQueueID); + DarkSubGeometry *newg = new DarkSubGeometry(mat, mCellCount, mDefaultRenderQueueID); mSubGeometryMap.insert(std::make_pair(mat->getName(), newg)); return newg; @@ -160,23 +165,36 @@ // -------------------------------------------------------------------------- // ------------------------- DarkSubGeometry -------------------------------- // -------------------------------------------------------------------------- - DarkSubGeometry::DarkSubGeometry(const MaterialPtr& material, uint8 renderQueueID) : m16BitIndices(false), mMaterial(material), mRenderQueueID(renderQueueID), mBuilt(false) { + DarkSubGeometry::DarkSubGeometry(const MaterialPtr& material, size_t cellCount, uint8 renderQueueID) : + m16BitIndices(false), + mMaterial(material), + mRenderQueueID(renderQueueID), + mBuilt(false), + mCellCount(cellCount) { + + assert(mCellCount > 0); + // Vertex data. For now, those are per-subgeom. Can be changed later (I'm trying to get 16-bit indices if possible) mRenderOp.vertexData = new VertexData(); - mRenderOp.indexData = new IndexData(); - - mRenderOp.indexData->indexStart = 0; - mRenderOp.indexData->indexCount = 0; - - // Will be filled later, by the filler - // mRenderOp.indexData->indexBuffer = NULL; + mRenderOp.indexData = new IndexData(); + + mRenderOp.indexData->indexStart = 0; + mRenderOp.indexData->indexCount = 0; + + // Will be filled later, by the filler + // mRenderOp.indexData->indexBuffer = NULL; - mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST; - mRenderOp.useIndexes = true; - - mAllocationList = NULL; - mAllocationEnd = NULL; + mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST; + mRenderOp.useIndexes = true; + + mFragmentList = new DarkFragment*[mCellCount]; + + // sane default + memset(mFragmentList, 0, mCellCount * sizeof(DarkFragment*)); + + mAllocationList = NULL; + mAllocationEnd = NULL; } // ----------------------------------------------------------------- @@ -185,14 +203,10 @@ mRenderOp.indexData = NULL; // delete all the fragments - FragmentList::iterator fit = mFragmentList.begin(); - FragmentList::iterator fendit = mFragmentList.end(); + for (size_t s = 0; s < mCellCount; ++s) + delete mFragmentList[s]; - for ( ; fit != fendit; ++fit) { - DarkFragment* f = fit->second; - delete f; - } - mFragmentList.clear(); + delete[] mFragmentList; // get rid of the rest of allocations DarkBufferAllocation* aloc = mAllocationList; @@ -216,8 +230,6 @@ BspNodeList::const_iterator nit = nodeList.begin(); BspNodeList::const_iterator endit = nodeList.end(); - FragmentList::iterator fendit = mFragmentList.end(); - uint32 indices = 0; // those fragments that are visible will get into the ibuf @@ -227,10 +239,10 @@ for ( ; nit != endit; ++nit) { uint16 size = 0; - FragmentList::iterator fit = mFragmentList.find((*nit)->getLeafID()); + DarkFragment* frag = mFragmentList[(*nit)->getLeafID()]; - if (fit != fendit) { - size = fit->second->cacheIndices(pidx, m16BitIndices); + if (frag) { + size = frag->cacheIndices(pidx, m16BitIndices); pidx += size; } @@ -241,10 +253,10 @@ for ( ; nit != endit; ++nit) { uint32 size = 0; - FragmentList::iterator fit = mFragmentList.find((*nit)->getLeafID()); + DarkFragment* frag = mFragmentList[(*nit)->getLeafID()]; - if (fit != fendit) { - size = fit->second->cacheIndices(pidx, m16BitIndices); + if (frag) { + size = frag->cacheIndices(pidx, m16BitIndices); pidx += size; } @@ -269,11 +281,12 @@ mVtxCount = 0; mIdxCount = 0; - FragmentList::iterator it = mFragmentList.begin(); - - for ( ; it != mFragmentList.end(); ++it) { - mVtxCount += it->second->getVertexCount(); - mIdxCount += it->second->getIndexCount(); + for (size_t s = 0; s < mCellCount; ++s) { + DarkFragment* frag = mFragmentList[s]; + if (frag) { + mVtxCount += frag->getVertexCount(); + mIdxCount += frag->getIndexCount(); + } } // Build the alloc. list @@ -335,34 +348,37 @@ mRenderOp.vertexData->vertexCount = mVtxCount; // now we can proceed to build the SG's - it = mFragmentList.begin(); - - for ( ; it != mFragmentList.end(); ++it) - it->second->build(); - + for (size_t s = 0; s < mCellCount; ++s) { + DarkFragment* frag = mFragmentList[s]; + if (frag) { + frag->build(); + } + } + mBuilt = true; } // ----------------------------------------------------------------- DarkFragment* DarkSubGeometry::createFragment(size_t cellID) { - if (mFragmentList.find(cellID) != mFragmentList.end()) + if (mFragmentList[cellID] != NULL) OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Fragment already defined for the given cell and material combination", "DarkSubGeometry::createFragment"); - + + if (cellID >= mCellCount) + OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Cell id beyond the specified maximum", "DarkSubGeometry::createFragment"); + DarkFragment* frag = new DarkFragment(this); - mFragmentList.insert(std::make_pair(cellID, frag)); + mFragmentList[cellID] = frag; return frag; } // ----------------------------------------------------------------- DarkFragment* DarkSubGeometry::getFragment(size_t cellID) { - FragmentList::iterator it = mFragmentList.find(cellID); + if (cellID >= mCellCount) + return NULL; // let the caller cope - if (it != mFragmentList.end()) - return it->second; - - return NULL; + return mFragmentList[cellID]; } // ----------------------------------------------------------------- Modified: trunk/src/scenemanager/DarkGeometry.h =================================================================== --- trunk/src/scenemanager/DarkGeometry.h 2008-10-20 11:43:00 UTC (rev 901) +++ trunk/src/scenemanager/DarkGeometry.h 2008-10-20 15:58:07 UTC (rev 902) @@ -43,6 +43,9 @@ /// Destructor ~DarkGeometry(); + + /// sets the cell count. Has to be done before submitting the fragments + void setCellCount(size_t cellCount); /// Notifies the DarkGeometry to update it's contents based on visible areas void updateFromCamera(const DarkCamera *cam); @@ -85,6 +88,9 @@ /// List of subgeometries to be queued (visible parts) DarkSubGeometryList mVisibleSubGeometries; + + /// Total count of the cells the static geometry contains + size_t mCellCount; }; @@ -240,7 +246,7 @@ friend class DarkFragment; public: - DarkSubGeometry(const MaterialPtr& material, uint8 renderQueueID); + DarkSubGeometry(const MaterialPtr& material, size_t cellCount, uint8 renderQueueID); ~DarkSubGeometry(); virtual const MaterialPtr& getMaterial(void) const; @@ -334,11 +340,11 @@ /// Endpoint pointer for the allocation DarkBufferAllocation* mAllocationEnd; - /// Map of fragments this SubGeometry holds - typedef std::map<size_t, DarkFragment*> FragmentList; + DarkFragment** mFragmentList; - FragmentList mFragmentList; + /// Total count of the cells the static geometry contains + size_t mCellCount; }; }; Modified: trunk/src/services/worldrep/WorldRepService.cpp =================================================================== --- trunk/src/services/worldrep/WorldRepService.cpp 2008-10-20 11:43:00 UTC (rev 901) +++ trunk/src/services/worldrep/WorldRepService.cpp 2008-10-20 15:58:07 UTC (rev 902) @@ -1,790 +1,791 @@ -/****************************************************************************** - * - * 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 <Ogre.h> -#include <OgreSceneNode.h> - -#include "config.h" - -#include "ServiceCommon.h" -#include "WorldRepService.h" -#include "ConfigService.h" -#include "WRTypes.h" - -#include "DarkBspNode.h" -#include "DarkSceneManager.h" - -#include "integers.h" -#include "OpdeException.h" -#include "WRCommon.h" -#include "logger.h" -#include "File.h" - -using namespace Ogre; - -// #define __SG - -namespace Opde { - // Implementation of the WorldRep service - WorldRepService::WorldRepService(ServiceManager *manager, const std::string& name) : Service(manager, name) { - // ResourceGroupManager::getSingleton().setWorldResourceGroupName(TEMPTEXTURE_RESOURCE_GROUP); - - } - - bool WorldRepService::init() { - mRenderService = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); - - if (mRenderService.isNull()) { - LOG_ERROR("RenderService instance was not found. Fatal"); - return false; - } - - mRoot = mRenderService->getOgreRoot(); - mSceneMgr = dynamic_cast<DarkSceneManager *>(mRenderService->getSceneManager()); - - return true; - } - - void WorldRepService::bootstrapFinished() { - // Get a reference to the sceneManager. We can get DarkSceneManager directly because of the format of the data we load (BSP/Portals) - - mCells = NULL; - mExtraPlanes = NULL; - - mAtlas = NULL; - - // Some standard image format extensions to try, when constructing the material manually - mTextureExtensions.insert(String(".tga")); - mTextureExtensions.insert(String(".jpg")); - mTextureExtensions.insert(String(".jpeg")); - mTextureExtensions.insert(String(".pcx")); - mTextureExtensions.insert(String(".png")); - - // try to create lightmap resource group used for lightmap storage - try { - ResourceGroupManager::getSingleton().createResourceGroup(TEMPTEXTURE_RESOURCE_GROUP); - } catch (Exception &e) { - LOG_ERROR("Cannot create temporary texture/materials resource group '%s'. Exception : %s", - TEMPTEXTURE_RESOURCE_GROUP, e.getDescription().c_str()); - } - - mTextures = NULL; - mFamilies = NULL; - - LOG_DEBUG("WorldRepService: Registering as a listener to the database messages"); - mDbCallback = new ClassCallback<DatabaseChangeMsg, WorldRepService>(this, &WorldRepService::onDBChange); - - mDatabaseService = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService("DatabaseService")); - mDatabaseService->registerListener(mDbCallback, DBP_WORLDREP); - - } - - WorldRepService::~WorldRepService() { - mDatabaseService->unregisterListener(mDbCallback); - clearData(); - } - - - void WorldRepService::addWorldMaterial(const MaterialPtr& material) { - mLoadedMaterials.push_back(material); - } - - // ---- The ServiceInterface mathods --- - void WorldRepService::onDBChange(const DatabaseChangeMsg& m) { - LOG_DEBUG("WorldRepService::onDBChange called by a callback"); - if (m.change == DBC_DROPPING) { - unload(); - return; - } - - if (m.change == DBC_LOADING && m.dbtype == DBT_MISSION) { - // Initialize materials here: - loadMaterials(m.db); - - int lightSize = 1; - - FilePtr wrChunk; - - if (m.db->hasFile("WR")) { - wrChunk = m.db->getFile("WR"); - } else if (m.db->hasFile("WRRGB")) { - lightSize = 2; - wrChunk = m.db->getFile("WRRGB"); - } else { - // Still no data? - OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Could not find WR nor WRRGB chunk...","WorldRepService::loadFromDarkDatabase"); - } - - loadFromChunk(wrChunk, lightSize); - - // --- Finally, set sky according to the SKY chunk - setSkyBox(m.db); - } - } - - - void WorldRepService::setSkyBox(const FileGroupPtr& db) { - FilePtr skyChunk = db->getFile("SKYMODE"); - - if (!skyChunk.isNull()) { // Thief1 sky. Thief2 has NewSky. Will need to make a custom scene node for this. - uint32_t skyMode; - - skyChunk->readElem(&skyMode, sizeof(skyMode), 1); - - if (skyMode == 0) { - mSceneMgr->setSkyBox(true, "Skybox/daysky", 1000); - } else { - mSceneMgr->setSkyBox(true, "Skybox/nightsky", 1000); - - } - } - } - - - void WorldRepService::unload() { - mIndexes.setNull(); - - mSceneMgr->clearScene(); - - mTxtScaleMap.clear(); - - clearData(); - } - - void WorldRepService::clearData() { - LOG_INFO("WorldRepService::clearData called"); - - if (mCells != NULL) { - for (uint32_t i = 0; i < mNumCells; i++) { - LOG_DEBUG("WorldRepService::clearData deleting cell %d of %d", i, mNumCells); - delete mCells[i]; - } - } - - delete[] mCells; - mCells = NULL; - - delete[] mExtraPlanes; - mExtraPlanes = NULL; - - delete mAtlas; - mAtlas = NULL; - - // Unregister all the resources in the WorldResourceGroup, including unreloadable - - // if there is a LightMap or WrTextures resource group, clean up those... - MaterialList::const_iterator it = mLoadedMaterials.begin(); - - while ( it != mLoadedMaterials.end() ) { - LOG_DEBUG("WorldRepService::clearData Removing material %s", (*it)->getName().c_str()); - MaterialManager::getSingleton().remove((*it)->getName()); - - ++it; - } - - mLoadedMaterials.clear(); - - delete[] mFamilies; - mFamilies = NULL; - - - delete[] mTextures; - mTextures = NULL; - - delete mAtlas; - mAtlas = NULL; - - mNumCells = 0; - - LOG_INFO("WorldRepService::clearData : finished cleaning up"); - } - - // ----------------------- The level loading methods follow - void WorldRepService::loadFromChunk(FilePtr& wrChunk, int lightSize) { - wr_hdr_t header; - wrChunk->read(&header, sizeof(wr_hdr_t)); - - // If there is some scene already, clear it - // clearData(); - - mNumCells = header.num_cells; - - mAtlas = new LightAtlasList(); - - mCells = new WRCell*[header.num_cells]; - - mWorldGeometry = mSceneMgr->createGeometry("LEVEL_GEOMETRY"); // will be deleted on clear_scene - - for (uint32_t i = 0; i<header.num_cells; i++) { - mCells[i] = new WRCell(this, mWorldGeometry); - } - - unsigned int idx; - for (idx=0; idx < header.num_cells; idx++) { - // Load one Cell - mCells[idx]->loadFromChunk(idx, wrChunk, lightSize); - } - - // -- Load the extra planes - wrChunk->read(&mExtraPlaneCount, sizeof(uint32_t)); - - mExtraPlanes = new wr_plane_t[mExtraPlaneCount]; - wrChunk->read(mExtraPlanes, sizeof(wr_plane_t) * mExtraPlaneCount); - - LOG_INFO("Worldrep: queueing lightmaps"); - // -- Atlas the lightmaps - for (idx=0; idx < header.num_cells; idx++) - mCells[idx]->atlasLightMaps(mAtlas); - - - LOG_INFO("Worldrep: Atlasing lightmaps"); - // Render the lmaps! This could be moved to a pre-run stage, as the mission difficulties alter the light states (and we do not know a s**t about that here) - mAtlas->render(); - - LOG_INFO("Worldrep: Atlasing Done"); - - - // -------------------------------------------------------------------------------- - // -- Load and process the BSP tree - uint32_t BspRows; - 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)); - - // Create the BspTree - createBSP(BspRows, Bsp); - - delete[] Bsp; - - // assign the leaf nodes - for (idx=0; idx < header.num_cells; idx++) { - BspNode* node = mSceneMgr->getBspLeaf(idx); - mCells[idx]->setBspNode(node); - } - - // -------------------------------------------------------------------------------- - // Attach the portals to the BSP tree leafs - int optimized = 0; - - for (idx=0; idx < header.num_cells; idx++) { - optimized += mCells[idx]->attachPortals(mSceneMgr); - } - - LOG_INFO("Worldrep: Optimization removed %d vertices", optimized); - - // -------------------------------------------------------------------------------- - // Now construct the static geometry -#ifdef __SG - Ogre::StaticGeometry* sg = mSceneMgr->createStaticGeometry("MISSION_GEOMETRY"); - - // 100 units per sg region - DVariant size = 100.0f; - - // Try to get an override from the ConfigService - ConfigServicePtr cfs = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); - - if (cfs->getParam("region_size", size)) { - LOG_INFO("Worldrep: Found a region size override in the config file... new value : %10.2f", size.toFloat()); - } - - sg->setRegionDimensions(Vector3(size.toFloat(), size.toFloat(), size.toFloat())); - - // no displacement - sg->setOrigin(Vector3(0, 0, 0)); - - std::vector< std::string > nodesToDestroy; -#endif - - //TODO: Portal meshes need to be constructed. This will guarantee the other meshes can be attached if this one works ok - // Hmm. Actually, it renders quite a lot of the meshes that should not be seen. - for (idx=0; idx < header.num_cells; idx++) { - mCells[idx]->constructPortalMeshes(mSceneMgr); - - -#ifdef __SG - Ogre::SceneNode* node = mCells[idx]->createSceneNode(mSceneMgr); - - // Non - sg rendering - slower - sg->addSceneNode(node); - // mSceneMgr->destroySceneNode(node->getName()); - nodesToDestroy.push_back(node->getName()); -#else - // mSceneMgr->getRootSceneNode()->addChild(node); - mCells[idx]->createCellGeometry(); -#endif - } - -#ifdef __SG - LOG_DEBUG("Worldrep: Building static geometry..."); - - sg->setCastShadows(false); - - sg->build(); - - std::vector<std::string>::iterator it = nodesToDestroy.begin(); - - for(; it != nodesToDestroy.end(); it++) - mSceneMgr->destroySceneNode(*it); - - // render SG before everything else - sg->setRenderQueueGroup(RENDER_QUEUE_MAIN - 1); -#else - mWorldGeometry->build(); - mSceneMgr->setActiveGeometry(mWorldGeometry); -#endif - - - // -------------------------------------------------------------------------------- - // We have done all we could, bringing the level data to the SceneManager. Now delete the used data - LOG_DEBUG("Worldrep: Freeing temporary buffers"); - - delete[] mCells; - mCells = NULL; - delete[] mExtraPlanes; - mExtraPlanes = NULL; - LOG_DEBUG("Worldrep: Freeing done"); - } - - // --------------------------------------------------------------------- - void WorldRepService::createBSP(unsigned int BspRows, wr_BSP_node_t *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]; - - if (_BSP_FLAGS(wr_node) & 0x01) { // leaf node - mSceneMgr->createBspNode(i, wr_node.front); - } else { - // split node - mSceneMgr->createBspNode(i); - } - } - - // 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]; - - // If this is a leaf node, go to next row - if (_BSP_FLAGS(wr_node) & 0x01) - continue; - - int front = -1; - int back = -1; - - if (wr_node.front != 0xFFFFFF) - front = wr_node.front; - - if (wr_node.back != 0xFFFFFF) - back = wr_node.back; - - // get the represented (pre-created) node - BspNode* node = mSceneMgr->getBspNode(i); - - // Set the split plane - if (wr_node.cell < 0) { - assert(wr_node.plane >= 0); - assert((unsigned int)(wr_node.plane) < mExtraPlaneCount); - node->setSplitPlane(constructPlane(mExtraPlanes[wr_node.plane])); // Extra planes - } else { - assert((unsigned int)(wr_node.cell) < mNumCells); - node->setSplitPlane(mCells[wr_node.cell]->getPlane(wr_node.plane)); - } - - // if swap flag set, swap front and back - if (_BSP_FLAGS(wr_node) & 0x04) { // inverted plane normal, swap front n' back child - if (front >= 0) - node->setBackChild(mSceneMgr->getBspNode(front)); - - if (back >= 0) - node->setFrontChild(mSceneMgr->getBspNode(back)); - } else { - if (front >= 0) - node->setFrontChild(mSceneMgr->getBspNode(front)); - - if (back >= 0) - node->setBackChild(mSceneMgr->getBspNode(back)); - } - } - - mSceneMgr->setRootBspNode(0); - // DONE! - - LOG_DEBUG("Worldrep: Finished the BSP build"); - } - - //----------------------------------------------------------------------- - Ogre::Plane WorldRepService::constructPlane(wr_plane_t plane) { - Vector3 normal(plane.normal.x, plane.normal.y, plane.normal.z); - float dist = plane.d; - Ogre::Plane oplane; - oplane.normal = normal; - oplane.d = dist; - return oplane; - } - - //----------------------------------------------------------------------- - // TODO: Move this into texture/flow service - void WorldRepService::loadFlowTextures(const FileGroupPtr& db) { - // Load the TXLIST chunk from the resource mission file. - Opde::FilePtr flow_tex; - try { - flow_tex = db->getFile("FLOW_TEX"); - } catch (FileException) { - LOG_INFO("Flow chunk does not exist. Water materials may not be correctly displayed", "WorldRepService::loadFlowTextures"); - return; - } - - // TODO: Exception handling on the chunk readout! - // Okay, we are ready to map the arrays - DarkDBChunkFLOW_TEX flows; - int flow_count = flow_tex->size() / 32; // The record is 32 bytes long, this way we do not fail if the chunk is shorter - - try { - // load - flow_tex->read(&flows, flow_tex->size()); // To be sure we do not overlap - } catch (Ogre::Exception& e) { - // Connect the original exception to the printout: - OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, String("Could not load flow textures : ") + e.getFullDescription(), "WorldRepService::loadFlowTextures"); - } - - - // now try to load non-zero flow textures as materials - for (int fnum = 0; fnum < flow_count; fnum++) { - if (strlen(flows.flow[fnum].name) > 0) { // nonzero name, try to load - // Construct the basic name of the material - std::string matname("water/"); - matname += flows.flow[fnum].name; - - // try to find the texture definition. If found, clone to the @template + the in_texture/out_texture number - if (MaterialManager::getSingleton().resourceExists(matname+"_in")) { - MaterialPtr origMat = MaterialManager::getSingleton().getByName(matname+"_in"); - - StringUtil::StrStreamType matName; - matName << "@template" << flows.flow[fnum].in_texture; - - if (MaterialManager::getSingleton().resourceExists(matName.str())) { - MaterialManager::getSingleton().remove(matName.str()); - } - - MaterialPtr shadMat = origMat->clone(matName.str() ); - shadMat->load(); - - addWorldMaterial(shadMat); - LOG_INFO("Flow now defined : %s (template %s_in)", matName.str().c_str(), matname.c_str()); - } else { - LOG_ERROR("Material not found : %s_in", matname.c_str()); - } - - // OUT - if (MaterialManager::getSingleton().resourceExists(matname+"_out")) { - MaterialPtr origMat = MaterialManager::getSingleton().getByName(matname+"_out"); - - StringUtil::StrStreamType matName; - matName << "@template" << flows.flow[fnum].out_texture; - - if (MaterialManager::getSingleton().resourceExists(matName.str())) { - MaterialManager::getSingleton().remove(matName.str()); - } - - MaterialPtr shadMat = origMat->clone(matName.str() ); - shadMat->load(); - - addWorldMaterial(shadMat); - LOG_INFO("Flow now defined : %s (template %s_in)", matName.str().c_str(), matname.c_str()); - } else { - LOG_ERROR("Material not found : %s_out", matname.c_str()); - } - - } - } - } - - //----------------------------------------------------------------------- - std::pair<float, float> WorldRepService::getTextureScale(const std::string& txtName) { - TxtScaleMap::const_iterator it = mTxtScaleMap.find(txtName); - - if (it != mTxtScaleMap.end()) { - return it->second; - } else { - // Default to 1,1 - return std::pair<float, float>(1.0f, 1.0f); - } - } - - //----------------------------------------------------------------------- - void WorldRepService::setTextureScale(const std::string& txtName, std::pair<float, float> scale) { - mTxtScaleMap.insert(make_pair(txtName, scale)); - } - - //----------------------------------------------------------------------- - void WorldRepService::createStandardMaterial(std::string matName, std::string textureName, std::string resourceGroup) { - Image tex; - bool loaded = false; // indicates we were succesful finding the texture - - // Let's try the extensions from the extensions vector - std::set< String >::iterator it = mTextureExtensions.begin(); - - for (;it != mTextureExtensions.end(); it++) { // Try loading - try { - tex.load(textureName + (*it), resourceGroup); - - TextureManager::getSingleton().loadImage(textureName, resourceGroup, tex, TEX_TYPE_2D, 5, 1.0f ); - - loaded = true; - - break; // we got it! - } catch (Ogre::Exception) { - // Nothing. We are trying more extensions - } - } - - if (!loaded) // TODO: Find a replacement? I don't think so... - LogManager::getSingleton().logMessage("Image " + textureName + " was not found, texture will be invalid!"); - - - // Construct a material out of this texture. We'll just clone the material upstairs to enable lmap-txture combinations - MaterialPtr shadMat = MaterialManager::getSingleton().create(matName, resourceGroup); - - shadMat->setReceiveShadows(true); - - Pass *shadPass = shadMat->getTechnique(0)->getPass(0); - - shadPass->setAmbient(0.5, 0.5, 0.5); - shadPass->setDiffuse(1, 1, 1, 1); - shadPass->setSpecular(1, 1, 1, 1); - - // Texture unit state for the main texture... - TextureUnitState* tus = shadPass->createTextureUnitState(textureName); - - // Set replace on all first layer textures for now - // tus->setColourOperation(LBO_REPLACE); - tus->setTextureAddressingMode(TextureUnitState::TAM_WRAP); - tus->setTextureCoordSet(0); - tus->setTextureFiltering(TFO_BILINEAR); - - tus->setTextureUScale(1.0f); - tus->setTextureVScale(1.0f); - // tus->setTextureFiltering(TFO_NONE); - - // Set culling mode to none - // shadMat->setCullingMode(CULL_ANTICLOCKWISE); - - // No dynamic lighting - shadMat->setLightingEnabled(false); - - // DYNL: - shadMat->load(); - - - addWorldMaterial(shadMat); - } - - // --------------------------------------------------------------------- - void WorldRepService::loadMaterials(const FileGroupPtr& db) { - if (!db->hasFile("TXLIST")) - throw Exception(Exception::ERR_ITEM_NOT_FOUND, - "Mission file does not contain Texture list chunk (TXLIST)", - "WorldRepService::loadMaterials"); - - // Load the TXLIST chunk from the resource mission file. - Opde::FilePtr txtList = db->getFile("TXLIST"); - - // TODO: Exception handling on the chunk readout! - // Okay, we are ready to map the arrays - if (mFamilies != NULL) - delete[] mFamilies; - - if (mTextures != NULL) - delete[] mTextures; - - try { - // TODO: This should be implemented using dtypes - // Read the header... - txtList->read(&mTxlistHeader, sizeof(DarkDBChunkTXLIST)); - - // now read all the families - - // allocate the needed space - mFamilies = new DarkDBTXLIST_fam[mTxlistHeader.fam_count]; - // load - txtList->read(&(mFamilies[0]), sizeof(DarkDBTXLIST_fam) * mTxlistHeader.fam_count); - - // Now read the textures. Same as before - - // allocate the needed space - mTextures = new DarkDBTXLIST_texture[mTxlistHeader.txt_count]; - // load texture names - txtList->read(&(mTextures[0]), sizeof(DarkDBTXLIST_texture) * mTxlistHeader.txt_count); - } catch (Ogre::Exception& e) { - if (mFamilies != NULL) - delete[] mFamilies; - if (mTextures != NULL) - delete[] mTextures; - - // Connect the original exception to the printout: - OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, String("Could not load texture list : ") + e.getFullDescription(), "BspLevel::loadMaterials"); - } - - // Okay, we are ready to load the materials now! - - // Our resource group - String resourceGroup = ResourceGroupManager::getSingleton().getWorldResourceGroupName(); - - createSkyHackMaterial(resourceGroup); - createJorgeMaterial(resourceGroup); - - // ------------- Following code loads the standard materials ------------------- - - // Iterate through all materials, and load them (tries to load material as a script (named family/texture), and if it fails, - // it constructs one with the default settings, and tries a few extensions too for the image) - - for (unsigned int id = 1; id < mTxlistHeader.txt_count; id++) { - // Try to find the family for the texture - std::string path = getMaterialName(id); - - // Resulting material name - StringUtil::StrStreamType matName; - matName << "@template" << id; - - if (MaterialManager::getSingleton().resourceExists(matName.str())) // if the material is already defined - // remove, as we have to redefine it - MaterialManager::getSingleton().remove(matName.str()); - - // See if the material is defined by a script. If so, clone it to be named @templateXXXX (XXXX = texture number) - // We seek material named: familly/texture - if (MaterialManager::getSingleton().resourceExists(path)) { - LOG_INFO("loadMaterials: Found material definition for %s", path.c_str()); - MaterialPtr origMat = MaterialManager::getSingleton().getByName(path); - - MaterialPtr shadMat = origMat->clone(matName.str(), true, resourceGroup); - - shadMat->load(); - - addWorldMaterial(shadMat); - } else { // The material script was not found - createStandardMaterial(matName.str(), path, resourceGroup); - } - // This is it. Material @templateXX created - } - - // Initialize the flow textures (do this first so water specialisation will override) - loadFlowTextures(db); - } - - // --------------------------------------------------------------------- - Ogre::SceneManager *WorldRepService::getSceneManager() { - return mSceneMgr; - } - - // --------------------------------------------------------------------- - void WorldRepService::createSkyHackMaterial(const Ogre::String& resourceGroup) { - // First, we'll create the sky materials, named SkyShader and WaterShader - // The sky material does basically only write the Z value (no color write), and should be rendered prior to any other material - // This is because we render sky(box/sphere/dome/plane) first, and we want it to be visible through the faces textured by this material - std::string shaderName("SkyShader"); - - if (!MaterialManager::getSingleton().resourceExists(shaderName)) { - MaterialPtr SkyShader = MaterialManager::getSingleton().create(shaderName, resourceGroup); - - Pass *shadPass = SkyShader->getTechnique(0)->getPass(0); - - // No texture for this pass - // Set the pass to be totally transparent - no color writing - shadPass->setColourWriteEnabled(false); - - // Set culling mode to none - shadPass->setCullingMode(CULL_NONE); - - // No dynamic lighting (Sky!) - shadPass->setLightingEnabled(false); - // ---- End of skyhack ---- - } - } - - // --------------------------------------------------------------------- - void WorldRepService::createJorgeMaterial(const Ogre::String& resourceGroup) { - std::string shaderName("@template0"); - - if (!MaterialManager::getSingleton().resourceExists(shaderName)) { - MaterialPtr shadMat = MaterialManager::getSingleton().create(shaderName, resourceGroup); - shadMat->setReceiveShadows(true); - - Pass *shadPass = shadMat->getTechnique(0)->getPass(0); - - shadPass->setAmbient(0.5, 0.5, 0.5); - shadPass->setDiffuse(1, 1, 1, 1); - shadPass->setSpecular(1, 1, 1, 1); - - // Texture unit state for the main texture... - TextureUnitState* tus = shadPass->createTextureUnitState("jorge.png"); - - // Set replace on all first layer textures for now - tus->setTextureAddressingMode(TextureUnitState::TAM_WRAP); - tus->setTextureCoordSet(0); - tus->setTextureFiltering(TFO_BILINEAR); - - tus->setTextureUScale(1.0f); - tus->setTextureVScale(1.0f); - - // No dynamic lighting - shadMat->setLightingEnabled(false); - - shadMat->load(); - addWorldMaterial(shadMat); - } - } - - // --------------------------------------------------------------------- - Ogre::String WorldRepService::getMaterialName(int mat_index) { - std::string path = ""; - if ((mTextures[mat_index].fam != 0) && ((mTextures[mat_index].fam - 1) < (int)mTxlistHeader.fam_count)) { - path = mFamilies[mTextures[mat_index].fam - 1].name; - path += "/"; - } - - path += mTextures[mat_index].name; // TODO: Multiplatformness... is it solved by ogre? - - return path; - } - - //-------------------------- Factory implementation - std::string WorldRepServiceFactory::mName = "WorldRepService"; - - WorldRepServiceFactory::WorldRepServiceFactory() : ServiceFactory() { - ServiceManager::getSingleton().addServiceFactory(this); - }; - - Service* WorldRepServiceFactory::createInstance(ServiceManager* manager) { - return new WorldRepService(manager, mName); - } - - const std::string& WorldRepServiceFactory::getName() { - return mName; - } - - const uint WorldRepServiceFactory::getMask() { - return SERVICE_DATABASE_LISTENER | SERVICE_RENDERER | SERVICE_ENGINE; - } -} +/****************************************************************************** + * + * 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 <Ogre.h> +#include <OgreSceneNode.h> + +#include "config.h" + +#include "ServiceCommon.h" +#include "WorldRepService.h" +#include "ConfigService.h" +#include "WRTypes.h" + +#include "DarkBspNode.h" +#include "DarkSceneManager.h" + +#include "integers.h" +#include "OpdeException.h" +#include "WRCommon.h" +#include "logger.h" +#include "File.h" + +using namespace Ogre; + +// #define __SG + +namespace Opde { + // Implementation of the WorldRep service + WorldRepService::WorldRepService(ServiceManager *manager, const std::string& name) : Service(manager, name) { + // ResourceGroupManager::getSingleton().setWorldResourceGroupName(TEMPTEXTURE_RESOURCE_GROUP); + + } + + bool WorldRepService::init() { + mRenderService = static_pointer_cast<RenderService>(ServiceManager::getSingleton().getService("RenderService")); + + if (mRenderService.isNull()) { + LOG_ERROR("RenderService instance was not found. Fatal"); + return false; + } + + mRoot = mRenderService->getOgreRoot(); + mSceneMgr = dynamic_cast<DarkSceneManager *>(mRenderService->getSceneManager()); + + return true; + } + + void WorldRepService::bootstrapFinished() { + // Get a reference to the sceneManager. We can get DarkSceneManager directly because of the format of the data we load (BSP/Portals) + + mCells = NULL; + mExtraPlanes = NULL; + + mAtlas = NULL; + + // Some standard image format extensions to try, when constructing the material manually + mTextureExtensions.insert(String(".tga")); + mTextureExtensions.insert(String(".jpg")); + mTextureExtensions.insert(String(".jpeg")); + mTextureExtensions.insert(String(".pcx")); + mTextureExtensions.insert(String(".png")); + + // try to create lightmap resource group used for lightmap storage + try { + ResourceGroupManager::getSingleton().createResourceGroup(TEMPTEXTURE_RESOURCE_GROUP); + } catch (Exception &e) { + LOG_ERROR("Cannot create temporary texture/materials resource group '%s'. Exception : %s", + TEMPTEXTURE_RESOURCE_GROUP, e.getDescription().c_str()); + } + + mTextures = NULL; + mFamilies = NULL; + + LOG_DEBUG("WorldRepService: Registering as a listener to the database messages"); + mDbCallback = new ClassCallback<DatabaseChangeMsg, WorldRepService>(this, &WorldRepService::onDBChange); + + mDatabaseService = static_pointer_cast<DatabaseService>(ServiceManager::getSingleton().getService("DatabaseService")); + mDatabaseService->registerListener(mDbCallback, DBP_WORLDREP); + + } + + WorldRepService::~WorldRepService() { + mDatabaseService->unregisterListener(mDbCallback); + clearData(); + } + + + void WorldRepService::addWorldMaterial(const MaterialPtr& material) { + mLoadedMaterials.push_back(material); + } + + // ---- The ServiceInterface mathods --- + void WorldRepService::onDBChange(const DatabaseChangeMsg& m) { + LOG_DEBUG("WorldRepService::onDBChange called by a callback"); + if (m.change == DBC_DROPPING) { + unload(); + return; + } + + if (m.change == DBC_LOADING && m.dbtype == DBT_MISSION) { + // Initialize materials here: + loadMaterials(m.db); + + int lightSize = 1; + + FilePtr wrChunk; + + if (m.db->hasFile("WR")) { + wrChunk = m.db->getFile("WR"); + } else if (m.db->hasFile("WRRGB")) { + lightSize = 2; + wrChunk = m.db->getFile("WRRGB"); + } else { + // Still no data? + OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Could not find WR nor WRRGB chunk...","WorldRepService::loadFromDarkDatabase"); + } + + loadFromChunk(wrChunk, lightSize); + + // --- Finally, set sky according to the SKY chunk + setSkyBox(m.db); + } + } + + + void WorldRepService::setSkyBox(const FileGroupPtr& db) { + FilePtr skyChunk = db->getFile("SKYMODE"); + + if (!skyChunk.isNull()) { // Thief1 sky. Thief2 has NewSky. Will need to make a custom scene node for this. + uint32_t skyMode; + + skyChunk->readElem(&skyMode, sizeof(skyMode), 1); + + if (skyMode == 0) { + mSceneMgr->setSkyBox(true, "Skybox/daysky", 1000); + } else { + mSceneMgr->setSkyBox(true, "Skybox/nightsky", 1000); + + } + } + } + + + void WorldRepService::unload() { + mIndexes.setNull(); + + mSceneMgr->clearScene(); + + mTxtScaleMap.clear(); + + clearData(); + } + + void WorldRepService::clearData() { + LOG_INFO("WorldRepService::clearData called"); + + if (mCells != NULL) { + for (uint32_t i = 0; i < mNumCells; i++) { + LOG_DEBUG("WorldRepService::clearData deleting cell %d of %d", i, mNumCells); + delete mCells[i]; + } + } + + delete[] mCells; + mCells = NULL; + + delete[] mExtraPlanes; + mExtraPlanes = NULL; + + delete mAtlas; + mAtlas = NULL; + + // Unregister all the resources in the WorldResourceGroup, including unreloadable + + // if there is a LightMap or WrTextures resource group, clean up those... + MaterialList::const_iterator it = mLoadedMaterials.begin(); + + while ( it != mLoadedMaterials.end() ) { + LOG_DEBUG("WorldRepService::clearData Removing material %s", (*it)->getName().c_str()); + MaterialManager::getSingleton().remove((*it)->getName()); + + ++it; + } + + mLoadedMaterials.clear(); + + delete[] mFamilies; + mFamilies = NULL; + + + delete[] mTextures; + mTextures = NULL; + + delete mAtlas; + mAtlas = NULL; + + mNumCells = 0; + + LOG_INFO("WorldRepService::clearData : finished cleaning up"); + } + + // ----------------------- The level loading methods follow + void WorldRepService::loadFromChunk(FilePtr& wrChunk, int lightSize) { + wr_hdr_t header; + wrChunk->read(&header, sizeof(wr_hdr_t)); + + // If there is some scene already, clear it + // clearData(); + + mNumCells = header.num_cells; + + mAtlas = new LightAtlasList(); + + mCells = new WRCell*[header.num_cells]; + + mWorldGeometry = mSceneMgr->createGeometry("LEVEL_GEOMETRY"); // will be deleted on clear_scene + mWorldGeometry->setCellCount(header.num_cells); + + for (uint32_t i = 0; i<header.num_cells; i++) { + mCells[i] = new WRCell(this, mWorldGeometry); + } + + unsigned int idx; + for (idx=0; idx < header.num_cells; idx++) { + // Load one Cell + mCells[idx]->loadFromChunk(idx, wrChunk, lightSize); + } + + // -- Load the extra planes + wrChunk->read(&mExtraPlaneCount, sizeof(uint32_t)); + + mExtraPlanes = new wr_plane_t[mExtraPlaneCount]; + wrChunk->read(mExtraPlanes, sizeof(wr_plane_t) * mExtraPlaneCount); + + LOG_INFO("Worldrep: queueing lightmaps"); + // -- Atlas the lightmaps + for (idx=0; idx < header.num_cells; idx++) + mCells[idx]->atlasLightMaps(mAtlas); + + + LOG_INFO("Worldrep: Atlasing lightmaps"); + // Render the lmaps! This could be moved to a pre-run stage, as the mission difficulties alter the light states (and we do not know a s**t about that here) + mAtlas->render(); + + LOG_INFO("Worldrep: Atlasing Done"); + + + // -------------------------------------------------------------------------------- + // -- Load and process the BSP tree + uint32_t BspRows; + 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)); + + // Create the BspTree + createBSP(BspRows, Bsp); + + delete[] Bsp; + + // assign the leaf nodes + for (idx=0; idx < header.num_cells; idx++) { + BspNode* node = mSceneMgr->getBspLeaf(idx); + mCells[idx]->setBspNode(node); + } + + // -------------------------------------------------------------------------------- + // Attach the portals to the BSP tree leafs + int optimized = 0; + + for (idx=0; idx < header.num_cells; idx++) { + optimized += mCells[idx]->attachPortals(mSceneMgr); + } + + LOG_INFO("Worldrep: Optimization removed %d vertices", optimized); + + // -------------------------------------------------------------------------------- + // Now construct the static geometry +#ifdef __SG + Ogre::StaticGeometry* sg = mSceneMgr->createStaticGeometry("MISSION_GEOMETRY"); + + // 100 units per sg region + DVariant size = 100.0f; + + // Try to get an override from the ConfigService + ConfigServicePtr cfs = ServiceManager::getSingleton().getService("ConfigService").as<ConfigService>(); + + if (cfs->getParam("region_size", size)) { + LOG_INFO("Worldrep: Found a region size override in the config file... new value : %10.2f", size.toFloat()); + } + + sg->setRegionDimensions(Vector3(size.toFloat(), size.toFloat(), size.toFloat())); + + // no displacement + sg->setOrigin(Vector3(0, 0, 0)); + + std::vector< std::string > nodesToDestroy; +#endif + + //TODO: Portal meshes need to be constructed. This will guarantee the other meshes can be attached if this one works ok + // Hmm. Actually, it renders quite a lot of the meshes that should not be seen. + for (idx=0; idx < header.num_cells; idx++) { + mCells[idx]->constructPortalMeshes(mSceneMgr); + + +#ifdef __SG + Ogre::SceneNode* node = mCells[idx]->createSceneNode(mSceneMgr); + + // Non - sg rendering - slower + sg->addSceneNode(node); + // mSceneMgr->destroySceneNode(node->getName()); + nodesToDestroy.push_back(node->getName()); +#else + // mSceneMgr->getRootSceneNode()->addChild(node); + mCells[idx]->createCellGeometry(); +#endif + } + +#ifdef __SG + LOG_DEBUG("Worldrep: Building static geometry..."); + + sg->setCastShadows(false); + + sg->build(); + + std::vector<std::string>::iterator it = nodesToDestroy.begin(); + + for(; it != nodesToDestroy.end(); it++) + mSceneMgr->destroySceneNode(*it); + + // render SG before everything else + sg->setRenderQueueGroup(RENDER_QUEUE_MAIN - 1); +#else + mWorldGeometry->build(); + mSceneMgr->setActiveGeometry(mWorldGeometry); +#endif + + + // -------------------------------------------------------------------------------- + // We have done all we could, bringing the level data to the SceneManager. Now delete the used data + LOG_DEBUG("Worldrep: Freeing temporary buffers"); + + delete[] mCells; + mCells = NULL; + delete[] mExtraPlanes; + mExtraPlanes = NULL; + LOG_DEBUG("Worldrep: Freeing done"); + } + + // --------------------------------------------------------------------- + void WorldRepService::createBSP(unsigned int BspRows, wr_BSP_node_t *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]; + + if (_BSP_FLAGS(wr_node) & 0x01) { // leaf node + mSceneMgr->createBspNode(i, wr_node.front); + } else { + // split node + mSceneMgr->createBspNode(i); + } + } + + // 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]; + + // If this is a leaf node, go to next row + if (_BSP_FLAGS(wr_node) & 0x01) + continue; + + int front = -1; + int back = -1; + + if (wr_node.front != 0xFFFFFF) + front = wr_node.front; + + if (wr_node.back != 0xFFFFFF) + back = wr_node.back; + + // get the represented (pre-created) node + BspNode* node = mSceneMgr->getBspNode(i); + + // Set the split plane + if (wr_node.cell < 0) { + assert(wr_node.plane >= 0); + assert((unsigned int)(wr_node.plane) < mExtraPlaneCount); + node->setSplitPlane(constructPlane(mExtraPlanes[wr_node.plane])); // Extra planes + } else { + assert((unsigned int)(wr_node.cell) < mNumCells); + node->setSplitPlane(mCells[wr_node.cell]->getPlane(wr_node.plane)); + } + + // if swap flag set, swap front and back + if (_BSP_FLAGS(wr_node) & 0x04) { // inverted plane normal, swap front n' back child + if (front >= 0) + node->setBackChild(mSceneMgr->getBspNode(front)); + + if (back >= 0) + node->setFrontChild(mSceneMgr->getBspNode(back)); + } else { + if (front >= 0) + node->setFrontChild(mSceneMgr->getBspNode(front)); + + if (back >= 0) + node->setBackChild(mSceneMgr->getBspNode(back)); + } + } + + mSceneMgr->setRootBspNode(0); + // DONE! + + LOG_DEBUG("Worldrep: Finished the BSP build"); + } + + //----------------------------------------------------------------------- + Ogre::Plane WorldRepService::constructPlane(wr_plane_t plane) { + Vector3 normal(plane.normal.x, plane.normal.y, plane.normal.z); + float dist = plane.d; + Ogre::Plane oplane; + oplane.normal = normal; + oplane.d = dist; + return oplane; + } + + //----------------------------------------------------------------------- + // TODO: Move this into texture/flow service + void WorldRepService::loadFlowTextures(const FileGroupPtr& db) { + // Load the TXLIST chunk from the resource mission file. + Opde::FilePtr flow_tex; + try { + flow_tex = db->getFile("FLOW_TEX"); + } catch (FileException) { + LOG_INFO("Flow chunk does not exist. Water materials may not be correctly displayed", "WorldRepService::loadFlowTextures"); + return; + } + + // TODO: Exception handling on the chunk readout! + // Okay, we are ready to map the arrays + DarkDBChunkFLOW_TEX flows; + int flow_count = flow_tex->size() / 32; // The record is 32 bytes long, this way we do not fail if the chunk is shorter + + try { + // load + flow_tex->read(&flows, flow_tex->size()); // To be sure we do not overlap + } catch (Ogre::Exception& e) { + // Connect the original exception to the printout: + OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, String("Could not load flow textures : ") + e.getFullDescription(), "WorldRepService::loadFlowTextures"); + } + + + // now try to load non-zero flow textures as materials + for (int fnum = 0; fnum < flow_count; fnum++) { + if (strlen(flows.flow[fnum].name) > 0) { // nonzero name, try to load + // Construct the basic name of the material + std::string matname("water/"); + matname += flows.flow[fnum].name; + + // try to find the texture definition. If found, clone to the @template + the in_texture/out_texture number + if (MaterialManager::getSingleton().resourceExists(matname+"_in")) { + MaterialPtr origMat = MaterialManager::getSingleton().getByName(matname+"_in"); + + StringUtil::StrStreamType matName; + matName << "@template" << flows.flow[fnum].in_texture; + + if (MaterialManager::getSingleton().resourceExists(matName.str())) { + MaterialManager::getSingleton().remove(matName.str()); + } + + MaterialPtr shadMat = origMat->clone(matName.str() ); + shadMat->load(); + + addWorldMaterial(shadMat); + LOG_INFO("Flow now defined : %s (template %s_in)", matName.str().c_str(), matname.c_str()); + } else { + LOG_ERROR("Material not found : %s_in", matname.c_str()); + } + + // OUT + if (MaterialManager::getSingleton().resourceExists(matname+"_out")) { + MaterialPtr origMat = MaterialManager::getSingleton().getByName(matname+"_out"); + + StringUtil::StrStreamType matName; + matName << "@template" << flows.flow[fnum].out_texture; + + if (MaterialManager::getSingleton().resourceExists(matName.str())) { + MaterialManager::getSingleton().remove(matName.str()); + } + + MaterialPtr shadMat = origMat->clone(matName.str() ); + shadMat->load(); + + addWorldMaterial(shadMat); + LOG_INFO("Flow now defined : %s (template %s_in)", matName.str().c_str(), matname.c_str()); + } else { + LOG_ERROR("Material not found : %s_out", matname.c_str()); + } + + } + } + } + + //----------------------------------------------------------------------- + std::pair<float, float> WorldRepService::getTextureScale(const std::string& txtName) { + TxtScaleMap::const_iterator it = mTxtScaleMap.find(txtName); + + if (it != mTxtScaleMap.end()) { + return it->second; + } else { + // Default to 1,1 + return std::pair<float, float>(1.0f, 1.0f); + } + } + + //----------------------------------------------------------------------- + void WorldRepService::setTextureScale(const std::string& txtName, std::pair<float, float> scale) { + mTxtScaleMap.insert(make_pair(txtName, scale)); + } + + //----------------------------------------------------------------------- + void WorldRepService::createStandardMaterial(std::string matName, std::string textureName, std::string resourceGroup) { + Image tex; + bool loaded = false; // indicates we were succesful finding the texture + + // Let's try the extensions from the extensions vector + std::set< String >::iterator it = mTextureExtensions.begin(); + + for (;it != mTextureExtensions.end(); it++) { // Try loading + try { + tex.load(textureName + (*it), resourceGroup); + + TextureManager::getSingleton().loadImage(textureName, resourceGroup, tex, TEX_TYPE_2D, 5, 1.0f ); + + loaded = true; + + break; // we got it! + } catch (Ogre::Exception) { + // Nothing. We are trying more extensions + } + } + + if (!loaded) // TODO: Find a replacement? I don't think so... + LogManager::getSingleton().logMessage("Image " + textureName + " was not found, texture will be invalid!"); + + + // Construct a material out of this texture. We'll just clone the material upstairs to enable lmap-txture combinations + MaterialPtr shadMat = MaterialManager::getSingleton().create(matName, resourceGroup); + + shadMat->setReceiveShadows(true); + + Pass *shadPass = shadMat->getTechnique(0)->getPass(0); + + shadPass->setAmbient(0.5, 0.5, 0.5); + shadPass->setDiffuse(1, 1, 1, 1); + shadPass->setSpecular(1, 1, 1, 1); + + // Texture unit state for the main texture... + TextureUnitState* tus = shadPass->createTextureUnitState(textureName); + + // Set replace on all first layer textures for now + // tus->setColourOperation(LBO_REPLACE); + tus->setTextureAddressingMode(TextureUnitState::TAM_WRAP); + tus->setTextureCoordSet(0); + tus->setTextureFiltering(TFO_BILINEAR); + + tus->setTextureUScale(1.0f); + tus->setTextureVScale(1.0f); + // tus->setTextureFiltering(TFO_NONE); + + // Set culling mode to none + // shadMat->setCullingMode(CULL_ANTICLOCKWISE); + + // No dynamic lighting + shadMat->setLightingEnabled(false); + + // DYNL: + shadMat->load(); + + + addWorldMaterial(shadMat); + } + + // --------------------------------------------------------------------- + void WorldRepService::loadMaterials(const FileGroupPtr& db) { + if (!db->hasFile("TXLIST")) + throw Exception(Exception::ERR_ITEM_NOT_FOUND, + "Mission file does not contain Texture list chunk (TXLIST)", + "WorldRepService::loadMaterials"); + + // Load the TXLIST chunk from the resource mission file. + Opde::FilePtr txtList = db->getFile("TXLIST"); + + // TODO: Exception handling on the chunk readout! + // Okay, we are ready to map the arrays + if (mFamilies != NULL) + delete[] mFamilies; + + if (mTextures != NULL) + delete[] mTextures; + + try { + // TODO: This should be implemented using dtypes + // Read the header... + txtList->read(&mTxlistHeader, sizeof(DarkDBChunkTXLIST)); + + // now read all the families + + // allocate the needed space + mFamilies = new DarkDBTXLIST_fam[mTxlistHeader.fam_count]; + // load + txtList->read(&(mFamilies[0]), sizeof(DarkDBTXLIST_fam) * mTxlistHeader.fam_count); + + // Now read the textures. Same as before + + // allocate the needed space + mTextures = new DarkDBTXLIST_texture[mTxlistHeader.txt_count]; + // load texture names + txtList->read(&(mTextures[0]), sizeof(DarkDBTXLIST_texture) * mTxlistHeader.txt_count); + } catch (Ogre::Exception& e) { + if (mFamilies != NULL) + delete[] mFamilies; + if (mTextures != NULL) + delete[] mTextures; + + // Connect the original exception to the printout: + OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, String("Could not load texture list : ") + e.getFullDescription(), "BspLevel::loadMaterials"); + } + + // Okay, we are ready to load the materials now! + + // Our resource group + String resourceGroup = ResourceGroupManager::getSingleton().getWorldResourceGroupName(); + + createSkyHackMaterial(resourceGroup); + createJorgeMaterial(resourceGroup); + + // ------------- Following code loads the standard materials ------------------- + + // Iterate through all materials, and load them (tries to load material as a script (named family/texture), and if it fails, + // it constructs one with the default settings, and tries a few extensions too for the image) + + for (unsigned int id = 1; id < mTxlistHeader.txt_count; id++) { + // Try to find the family for the texture + std::string path = getMaterialName(id); + + // Resulting material name + StringUtil::StrStreamType matName; + matName << "@template" << id; + + if (MaterialManager::getSingleton().resourceExists(matName.str())) // if the material is already defined + // remove, as we have to redefine it + MaterialManager::getSingleton().remove(matName.str()); + + // See if the material is defined by a script. If so, clone it to be named @templateXXXX (XXXX = texture number) + // We seek material named: familly/texture + if (MaterialManager::getSingleton().resourceExists(path)) { + LOG_INFO("loadMaterials: Found material definition for %s", path.c_str()); + MaterialPtr origMat = MaterialManager::getSingleton().getByName(path); + + MaterialPtr shadMat = origMat->clone(matName.str(), true, resourceGroup); + + shadMat->load(); + + addWorldMaterial(shadMat); + } else { // The material script was not found + createStandardMaterial(matName.str(), path, resourceGroup); + } + // This is it. Material @templateXX created + } + + // Initialize the flow textures (do this first so water specialisation will override) + loadFlowTextures(db); + } + + // --------------------------------------------------------------------- + Ogre::SceneManager *WorldRepService::getSceneManager() { + return mSceneMgr; + } + + // --------------------------------------------------------------------- + void WorldRepService::createSkyHackMaterial(const Ogre::String& resourceGroup) { + // First, we'll create the sky materials, named SkyShader and WaterShader + // The sky material does basically only write the Z value (no color write), and should be rendered prior to any other material + // This is because we render sky(box/sphere/dome/plane) first, and we want it to be visible through the faces textured by this material + std::string shaderName("SkyShader"); + + if (!MaterialManager::getSingleton().resourceExists(shaderName)) { + MaterialPtr SkyShader = MaterialManager::getSingleton().create(shaderName, resourceGroup); + + Pass *shadPass = SkyShader->getTechnique(0)->getPass(0); + + // No texture for this pass + // Set the pass to be totally transparent - no color writing + shadPass->setColourWriteEnabled(false); + + // Set culling mode to none + shadPass->setCullingMode(CULL_NONE); + + // No dynamic lighting (Sky!) + shadPass->setLightingEnabled(false); + // ---- End of skyhack ---- + } + } + + // --------------------------------------------------------------------- + void WorldRepService::createJorgeMaterial(const Ogre::String& resourceGroup) { + std::string shaderName("@template0"); + + if (!MaterialManager::getSingleton().resourceExists(shaderName)) { + MaterialPtr shadMat = MaterialManager::getSingleton().create(shaderName, resourceGroup); + shadMat->setReceiveShadows(true); + + Pass *shadPass = shadMat->getTechnique(0)->getPass(0); + + shadPass->setAmbient(0.5, 0.5, 0.5); + shadPass->setDiffuse(1, 1, 1, 1); + shadPass->setSpecular(1, 1, 1, 1); + + // Texture unit state for the main texture... + TextureUnitState* tus = shadPass->createTextureUnitState("jorge.png"); + + // Set replace on all first layer textures for now + tus->setTextureAddressingMode(TextureUnitState::TAM_WRAP); + tus->setTextureCoordSet(0); + tus->setTextureFiltering(TFO_BILINEAR); + + tus->setTextureUScale(1.0f); + tus->setTextureVScale(1.0f); + + // No dynamic lighting + shadMat->setLightingEnabl... [truncated message content] |
From: <vo...@us...> - 2008-10-21 17:57:54
|
Revision: 911 http://opde.svn.sourceforge.net/opde/?rev=911&view=rev Author: volca Date: 2008-10-21 17:57:42 +0000 (Tue, 21 Oct 2008) Log Message: ----------- Transitioned the inheritors to Array<> and BitArray Modified Paths: -------------- trunk/src/base/Array.h trunk/src/base/BitArray.h trunk/src/services/inherit/CachedInheritor.cpp trunk/src/services/inherit/CachedInheritor.h trunk/src/services/inherit/InheritCommon.h trunk/src/services/object/ObjectService.cpp trunk/src/services/object/ObjectService.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 Modified: trunk/src/base/Array.h =================================================================== --- trunk/src/base/Array.h 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/base/Array.h 2008-10-21 17:57:42 UTC (rev 911) @@ -98,7 +98,7 @@ /// member const reference array operator const T& operator[](int index) const { - if (index < mMinIndex) + if (index <= mMinIndex) OPDE_ARRAY_EXCEPT("Array: Index out of bounds"); if (index > mMaxIndex) @@ -109,7 +109,7 @@ /// member reference array operator T& operator[](int index) { - if (index < mMinIndex) + if (index <= mMinIndex) OPDE_ARRAY_EXCEPT("Array: Index out of bounds"); if (index > mMaxIndex) @@ -125,6 +125,9 @@ if (maxIdx < 0) OPDE_ARRAY_EXCEPT("Array: Max index has to be greater or equal to zero"); + + // the only single place we have to increment - negative array does NOT store element of index zero + minIdx++; growBuf(&mNegativeArray, -mMinIndex, -minIdx); mMinIndex = minIdx; Modified: trunk/src/base/BitArray.h =================================================================== --- trunk/src/base/BitArray.h 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/base/BitArray.h 2008-10-21 17:57:42 UTC (rev 911) @@ -26,6 +26,7 @@ #define __BITARRAY_H #include "config.h" +#include <cassert> #include "OpdeException.h" @@ -34,223 +35,297 @@ class BitArray { public: /// constructs a new empty bitarray - BitArray() : mArray(NULL), mByteSize(0), mMinIDX(0), mMaxIDX(-1) {}; + BitArray() : mNegativeArray(NULL), mPositiveArray(NULL), mMinIndex(0), mMaxIndex(-1) {}; /// constructs a new bitarray with a specified min and max boundaries (all values false) - BitArray(int min, int max) : mMinIDX(min), mMaxIDX(max) { - mArray = prepareBuffer(mMinIDX, mMaxIDX, mByteSize); + explicit BitArray(int min, int max) : mNegativeArray(NULL), mPositiveArray(NULL), mMinIndex(0), mMaxIndex(-1) { + grow(min, max); } + /// copy constructor + BitArray(const BitArray& b) { + // copy the bounds + mMinIndex = b.mMinIndex; + mMaxIndex = b.mMaxIndex; + + mPositiveArray = NULL; + mNegativeArray = NULL; + + // allocate space + if (b.mNegativeArray != NULL) { + size_t bsize = getSizeFromIndex(-mMinIndex); + mNegativeArray = (unsigned char*)(malloc(bsize)); + // copy the values + memcpy(mNegativeArray, b.mNegativeArray, bsize); + } + + if (b.mPositiveArray != NULL) { + size_t bsize = getSizeFromIndex(mMaxIndex); + mPositiveArray = (unsigned char*)(malloc(bsize)); + // copy the values + memcpy(mPositiveArray, b.mPositiveArray, bsize); + } + } + /// constructs a bitarray as a copy of a source buffer of a given size - BitArray(unsigned char* source, int size, int min, int max) { + BitArray(unsigned char* source, int size, int min, int max) + : mNegativeArray(NULL), mPositiveArray(NULL), mMinIndex(0), mMaxIndex(-1) { + assert(max > min); - // the source can be non-aligned. transfer the bits - - mMinIDX = min; - mMaxIDX = max; - + // sanity check assert((max - min) >> 3 <= size); - mArray = prepareBuffer(mMinIDX, mMaxIDX, mByteSize); + // prepare + grow(min, max); + // as we can have a different bit alignment, do this bit by bit for (int idx = min; idx <= max; ++idx) { - // transfer the id + // transfer the bits size_t pos = idx - min; bool val = ((source[pos >> 3] & (1 << (pos & 0x07))) != 0); - set(idx, val); + setBit(idx, val); } }; ~BitArray() { - delete[] mArray; + clear(); } - - bool get(int index) const { + + /// clear method - clears the array - reinitializes it to zero element sized + void clear() { + // now get rid of the arrays + free(mNegativeArray); + free(mPositiveArray); + + mNegativeArray = NULL; + mPositiveArray = NULL; + + mMinIndex = 0; + mMaxIndex = -1; + } + + bool getBit(int index) const { // look if we are in bounds - if (index < mMinIDX) + if (index < mMinIndex) OPDE_ARRAY_EXCEPT("Index out of bounds"); - if (index > mMaxIDX) + if (index > mMaxIndex) OPDE_ARRAY_EXCEPT("Index out of bounds"); - // remap the id - size_t cpos = (index - mMinIDX) >> 3; - size_t bpos = (index - mMinIDX) & 0x07; + // depending on the index sign, we either access negative + // or positive array + unsigned char* arrayRef; + // character and bit positions + size_t cpos; + size_t bpos; + + if (index < 0) { + arrayRef = mNegativeArray; + cpos = getIndex(-index - 1); + bpos = getOffset(-index - 1); + } else { + arrayRef = mPositiveArray; + cpos = getIndex(index); + bpos = getOffset(index); + } + + // get the value - return ((mArray[cpos] & (1 << bpos)) != 0); + return (arrayRef[cpos] & (1 << bpos)); }; /// sets a new value for index, returns the old value - bool set(int index, bool value) { + bool setBit(int index, bool value) { // look if we are in bounds - if (index < mMinIDX) - OPDE_ARRAY_EXCEPT("Index out of bounds"); + if (index < mMinIndex) + OPDE_ARRAY_EXCEPT("BitArray: Index out of bounds"); - if (index > mMaxIDX) - OPDE_ARRAY_EXCEPT("Index out of bounds"); + if (index > mMaxIndex) + OPDE_ARRAY_EXCEPT("BitArray: Index out of bounds"); // remap the id - size_t cpos = (index - mMinIDX) >> 3; - unsigned char bpos = (index - mMinIDX) & 0x07; + unsigned char* arrayRef; + // character and bit positions + size_t cpos; + size_t bpos; + + if (index < 0) { + arrayRef = mNegativeArray; + cpos = getIndex(-index - 1); + bpos = getOffset(-index - 1); + } else { + arrayRef = mPositiveArray; + cpos = getIndex(index); + bpos = getOffset(index); + } + // get the value - bool prev = ((mArray[cpos] & (1 << bpos)) != 0); + bool prev = ((arrayRef[cpos] & (1 << bpos)) != 0); // set the value if (value) { - mArray[cpos] |= (1 << bpos); + arrayRef[cpos] |= (1 << bpos); } else { // unset the bit - mArray[cpos] &= ~(1 << bpos); + arrayRef[cpos] &= ~(1 << bpos); } return prev; }; - int getMinIndex() const { return mMinIDX; }; - int getMaxIndex() const { return mMaxIDX; }; + int getMinIndex() const { return mMinIndex; }; + int getMaxIndex() const { return mMaxIndex; }; - /** sets new min index - * @param newidx The new minimal index - * @param clear - if true, the min index can be greater than the old one, and the bitarray is cleared as well - * @note if the new minimum is greater than the old, and clear is not set, the new value is ignored - */ - void setMinIndex(int newidx, bool clear) { - if (clear) { - delete[] mArray; - - mMinIDX = newidx; - - mArray = prepareBuffer(mMinIDX, mMaxIDX, mByteSize); - } else { - if (newidx < mMinIDX) - grow(newidx, mMaxIDX); - } + /// returns a byte size needed to hold the whole buffer + size_t getByteSize() const { + return getSizeFromIndex(-mMinIndex-1) + getSizeFromIndex(mMaxIndex); }; - /** sets new max index - * @param newidx The new maximal index - * @param clear - if true, the max index can be less than the old one, and the bitarray is cleared as well - * @note if the new maximum is less than the old, and clear is not set, the new value is ignored + /** fills a given buffer with bits from this bit array. + * The given buffer has to be allocated so it can hold up getByteSize() bytes */ - void setMaxIndex(int newidx, bool clear) { - if (clear) { - delete[] mArray; + void fillBuffer(char* buffer) const { + // sane default + memset(buffer, 0, getByteSize()); + + size_t bitoffset = 0; + for (int i = mMinIndex; i <= mMaxIndex; ++i, ++bitoffset) { + // each bit on it's own + bool val = getBit(i); - mMaxIDX = newidx; - - mArray = prepareBuffer(mMinIDX, mMaxIDX, mByteSize); - } else { - if (newidx > mMaxIDX) - grow(mMinIDX, newidx); + // i know this sucks to do on every bit, but well + // I Am lazy at the same time :) + if (val) + buffer[bitoffset>>3] |= (1 << (bitoffset & 0x07)); } }; - - const unsigned char* getRawBuf() const { return mArray; }; - size_t getRawBufSize() const { return mByteSize; }; - - /// clears all true values in bitarray, leaving the size intact - void clear() { - memset(mArray, 0, mByteSize); + /// clears the array values, setting all bits to false + void clearBits() { + memset(mNegativeArray, 0, getSizeFromIndex(-mMinIndex)); + memset(mPositiveArray, 0, getSizeFromIndex(mMaxIndex)); }; /// clears the array and sets new min and max boundary values void reset(int min, int max) { - mMinIDX = min; - mMaxIDX = max; + grow(min, max); - delete[] mArray; - - mArray = prepareBuffer(mMinIDX, mMaxIDX, mByteSize); + clearBits(); }; /// grows the bitArray to be able to index new min->max indices, preserving the previous values void grow(int min, int max) { - int oldMin = mMinIDX, oldMax = mMaxIDX; - bool changed = false; + growMinIndex(min); + growMaxIndex(max); + }; + + /// grows the min index part only + void growMinIndex(int min) { + if (min > 0) + OPDE_ARRAY_EXCEPT("BitArray: Min index has to be equal to zero or less"); - // new bounds are calculated - if (min < mMinIDX) { - mMinIDX = min; - changed = true; - } - - if (max > mMaxIDX) { - mMaxIDX = max; - changed = true; - } + growBuf(&mNegativeArray, -mMinIndex, -min); + mMinIndex = min; + } + + /// grows the max index part only + void growMaxIndex(int max) { + if (max < 0) + OPDE_ARRAY_EXCEPT("BitArray: Max index has to be greater or equal to zero"); - if (changed) { - size_t size; + growBuf(&mPositiveArray, mMaxIndex, max); + mMaxIndex = max; + } + + /// proxy for value setting with [] operator + class BitProxy { + public: + BitProxy(BitArray& array, int index) : mArray(array), mIndex(index) { }; - // prepare the new bit buffer. This'll also correct the boundaries - unsigned char* newbuf = prepareBuffer(mMinIDX, mMaxIDX, size); + BitProxy& operator =(BitProxy& b) { + mArray.setBit(mIndex, b.operator bool()); + return *this; + } - // transfer the values from the original... - if (mArray) { - // reusing the var err here for byte aligned min diff - int err = oldMin - mMinIDX; // mMinIDX < oldMin -> err > 0 + BitProxy& operator =(bool value) { + mArray.setBit(mIndex, value); - LOG_VERBOSE("BitArray growth: (%d-%d) to (%d-%d). Diff: %d (%d)", oldMin, oldMax, mMinIDX, mMaxIDX, err, err & 0x07); - - assert((err & 0x07) == 0); - - err >>= 3; - - // copy the prev values - memcpy(mArray, &newbuf[err], mByteSize); - - // there, the old values are copied + return *this; + }; + + operator bool() const { + return mArray.getBit(mIndex); } - - mByteSize = size; - - delete[] mArray; - mArray = newbuf; - } + + protected: + BitArray& mArray; + int mIndex; }; + BitProxy operator[](int index) { + return BitProxy(*this, index); + }; + + bool operator[](int index) const { + return getBit(index); + }; + protected: - /// prepares a new buffer with the specified min and max values, and corrects those as a side effect - unsigned char* prepareBuffer(int& min, int& max, size_t& byteSize) { - assert(min < max); + /// grows the specified buffer to accompany the new size + void growBuf(unsigned char**ptr, int oldIndex, int newIndex) { + if (newIndex < oldIndex) // if it would, we'd call placement destructor before realloc + OPDE_ARRAY_EXCEPT("BitArray: Shrinking not allowed"); - // allocate and clear the mem - byteSize = max - min + 1; // +1 to accompany the max index as well - - // align the new minimum - int err = byteSize & 0x07; + size_t oldByteSize; + if (oldIndex < 0) + oldByteSize = 0; + else + getSizeFromIndex(oldIndex); + + size_t newByteSize = getSizeFromIndex(newIndex); - if (err != 0) { - min -= (8 - err); - byteSize = max - min + 1; - } + if (newByteSize == oldByteSize) + return; - - if ((byteSize & 0x07) != 0) { - // alignment of size needed - byteSize += (8 - (byteSize & 0x07)); - } - // to the byte world - byteSize >>= 3; - byteSize++; // safety first + unsigned char* newptr = (unsigned char*)(realloc(*ptr, newByteSize)); - unsigned char *array = new unsigned char[byteSize]; + if (newptr == NULL) // realloc failed + OPDE_ARRAY_EXCEPT("BitArray: Growth failed"); - memset(array, 0, byteSize); + *ptr = newptr; - return array; + memset(&newptr[oldByteSize], 0, newByteSize - oldByteSize); } - unsigned char* mArray; - size_t mByteSize; - int mMinIDX, mMaxIDX; + /// byte offset of an address getter + inline size_t getIndex(int addr) const { + return size_t(addr) >> 3; + } + + /// Bit offset for address getter + inline int getOffset(int addr) const { + return size_t(addr) & 0x07; + } + + /// Helper size getter for index - needed byte size for array to hold certain index + inline size_t getSizeFromIndex(int index) const { + assert(index >= 0); + + return size_t(getIndex(index)) + 1; + } + + unsigned char* mNegativeArray; + unsigned char* mPositiveArray; + + int mMinIndex, mMaxIndex; }; + + }; #endif // __BITARRAY_H Modified: trunk/src/services/inherit/CachedInheritor.cpp =================================================================== --- trunk/src/services/inherit/CachedInheritor.cpp 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/inherit/CachedInheritor.cpp 2008-10-21 17:57:42 UTC (rev 911) @@ -42,87 +42,35 @@ //------------------------------------------------------ void CachedInheritor::setImplements(int objID, bool impl) { - ImplementsMap::iterator it = mImplements.find(objID); - bool modified = false; - - if (impl) { - - if (it != mImplements.end()) { - if (!it->second) { - it->second = true; // just set the new value - modified = true; - } - } else { - mImplements.insert(make_pair(objID, impl)); // insert if non-present - modified = true; - } - - } else { // false - only remove if present - - if (it != mImplements.end()) { - mImplements.erase(it); - modified = true; - } - - } - + bool oldval = mImplements.setBit(objID, impl); + // Did we change something? - if (modified) { + if (oldval != impl) { refresh(objID); // refresh the object ID and all the inheritance targets } } //------------------------------------------------------ bool CachedInheritor::getImplements(int objID) const { - ImplementsMap::const_iterator it = mImplements.find(objID); - - if (it != mImplements.end()) { - return it->second; - } else { - // does not have a record, so does not implement - return false; - } + return mImplements[objID]; } //------------------------------------------------------ int CachedInheritor::getEffectiveID(int srcID) const { - EffectiveObjectMap::const_iterator it = mEffObjMap.find(srcID); - - if (it != mEffObjMap.end()) { - return it->second; - } else - return 0; // Can't be self, as that is also recorded + return mEffObjMap[srcID]; } //------------------------------------------------------ bool CachedInheritor::setEffectiveID(int srcID, int effID) { - std::pair<EffectiveObjectMap::iterator, bool> result = mEffObjMap.insert(make_pair(srcID, effID)); + int prev = mEffObjMap[srcID]; + mEffObjMap[srcID] = effID; - if (result.second) { - // did insert, was not already there - return true; - } else { - // did not insert, already was there. - if (result.first->second != effID) { - result.first->second = effID; - return true; - } - - return false; - } + return prev != effID; } //------------------------------------------------------ bool CachedInheritor::unsetEffectiveID(int srcID) { - EffectiveObjectMap::iterator it = mEffObjMap.find(srcID); - bool changed = false; - - if (it != mEffObjMap.end()) { - changed = true; - mEffObjMap.erase(it); - } - - return changed; + return setEffectiveID(srcID, 0); } //------------------------------------------------------ @@ -226,6 +174,12 @@ // Received an even about inheritance change. Must refresh target object of such change refresh(msg.dstID); } + + //------------------------------------------------------ + void CachedInheritor::grow(int minID, int maxID) { + mEffObjMap.grow(minID, maxID); + mImplements.grow(minID, maxID); + } //------------------------------------------------------ void CachedInheritor::clear() { Modified: trunk/src/services/inherit/CachedInheritor.h =================================================================== --- trunk/src/services/inherit/CachedInheritor.h 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/inherit/CachedInheritor.h 2008-10-21 17:57:42 UTC (rev 911) @@ -23,6 +23,8 @@ #define __CACHEDINHERITOR_H #include "InheritService.h" +#include "Array.h" +#include "BitArray.h" namespace Opde { /** Base class for cached inheritor implementations. Works self as "always" inheritor, inheriting in every situation. @@ -52,6 +54,8 @@ virtual void clear(); void onInheritMsg(const InheritChangeMsg& msg); + + void grow(int minID, int maxID); protected: /** Sets new cached effective ID for the given object * @param srcID the object to set effective ID for @@ -87,13 +91,13 @@ InheritService::ListenerID mListenerID; /// Map of effective object ID's - typedef std::map < int, int > EffectiveObjectMap; + typedef Array< int > EffectiveObjectMap; /// Map of effective object ID's - instance EffectiveObjectMap mEffObjMap; /// Map of implementing object IDs - id->true means object implements the inherited property - typedef std::map <int, bool> ImplementsMap; + typedef BitArray ImplementsMap; ImplementsMap mImplements; }; Modified: trunk/src/services/inherit/InheritCommon.h =================================================================== --- trunk/src/services/inherit/InheritCommon.h 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/inherit/InheritCommon.h 2008-10-21 17:57:42 UTC (rev 911) @@ -103,6 +103,9 @@ /// Used upon total cleanout of the database virtual void clear() = 0; + + /// grows the internal tables of the inheritor to allow the storage of data about defined object range + virtual void grow(int minID, int maxID) {}; }; /// Shared pointer to Inheritor Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/object/ObjectService.cpp 2008-10-21 17:57:42 UTC (rev 911) @@ -81,7 +81,7 @@ //------------------------------------------------------ bool ObjectService::exists(int objID) { - return mAllocatedObjects.get(objID); + return mAllocatedObjects[objID]; } @@ -206,6 +206,17 @@ } //------------------------------------------------------ + void ObjectService::grow(int minID, int maxID) { + // grow the allocated objects to have enough room for new object flags + mAllocatedObjects.grow(minID, maxID); + + // grow the Properties + mPropertyService->grow(minID, maxID); + + // TODO: grow the links + } + + //------------------------------------------------------ bool ObjectService::init() { // Builtin properties are constructed: createBuiltinResources(); @@ -346,8 +357,8 @@ // bit array going to be used to merge the objects (from file, and those in mem) BitArray fileObjs(bitmap, bsize, minID, maxID); - // grow the allocated objects to have enough room for new object flags - mAllocatedObjects.grow(minID, maxID); + // grow the system to allow the stored object to flow in + grow(minID, maxID); delete[] bitmap; // not needed anymore, was copied into the fileObjs @@ -358,14 +369,14 @@ // Processes one byte a time for(id = minID; id < maxID ; ++id) { - if (fileObjs.get(id)) { + if (fileObjs[id]) { LOG_VERBOSE("Found object ID %d", id); - // object should not exist before - assert(!mAllocatedObjects.get(id)); + // object should not have existed before + assert(!mAllocatedObjects[id]); _prepareForObject(id); - mAllocatedObjects.set(id, true); + mAllocatedObjects[id] = true; lastID = id; } } @@ -386,7 +397,7 @@ // Free all id's that are not in use for reuse for (int i = 0; i < lastID; i++) { // if the bitmaps is zeroed on the position, free the ID for reuse - if (!fileObjs.get(i)) + if (!fileObjs[i]) freeID(i); // TODO: Check if the ID isn't used in properties/links! // TNH's purge bad object's that is @@ -394,7 +405,7 @@ for(id = minID; id < maxID ; ++id) { - if (fileObjs.get(id)) + if (fileObjs[id]) _endCreateObject(id); } } @@ -416,7 +427,7 @@ max = 0; for (; idx < max; ++idx) { - if (mAllocatedObjects.get(idx)) + if (mAllocatedObjects[idx]) _destroyObject(idx); // Will remove properties and links fine } } else { // Total cleanup @@ -450,13 +461,13 @@ for (int id = mAllocatedObjects.getMinIndex(); id < mAllocatedObjects.getMaxIndex(); ++id) { DVariant v; - if (mAllocatedObjects.get(id)) { // only gamesys object have donortype... + if (mAllocatedObjects[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 + objmask[id] = true; // yep, so include this object } else { if (saveMask & 0x02) // has no donortype, was concrete requested? - objmask.set(id, true); // yep, include this obj + objmask[id] = true; // yep, include this obj } } } @@ -465,12 +476,19 @@ int32_t minid = objmask.getMinIndex(); int32_t maxid = objmask.getMaxIndex(); - size_t siz = objmask.getRawBufSize(); + size_t siz = objmask.getByteSize(); + + char* buf = new char[siz]; + + objmask.fillBuffer(buf); + ovf->writeElem(&minid, 4); ovf->writeElem(&maxid, 4); - ovf->write(objmask.getRawBuf(), siz); + ovf->write(buf, siz); + delete[] buf; + // serialize the properties and links mLinkService->save(db, saveMask); mPropertyService->save(db, objmask); @@ -496,7 +514,7 @@ //------------------------------------------------------ void ObjectService::_endCreateObject(int objID) { // allocate the ID - mAllocatedObjects.set(objID, true); + mAllocatedObjects[objID] = true; // Prepare the message ObjectServiceMsg m; @@ -510,13 +528,13 @@ //------------------------------------------------------ void ObjectService::_destroyObject(int objID) { - if (mAllocatedObjects.get(objID)) { + if (mAllocatedObjects[objID]) { // Inform LinkService and PropertyService (those are somewhat slaves of ours. Other services need to listen) mLinkService->objectDestroyed(objID); mPropertyService->objectDestroyed(objID); // Insert the id into free id's - mAllocatedObjects.set(objID, false); + mAllocatedObjects[objID] = false; // Insert into free id's freeID(objID); @@ -548,6 +566,7 @@ //------------------------------------------------------ int ObjectService::getFreeID(bool archetype) { // first look into the stack of free id's + // TODO: Grow all the related structures as well! if (archetype) { if (mFreeArchetypeIDs.size() > 0) { int id = mFreeArchetypeIDs.top(); @@ -555,9 +574,11 @@ return id; } else { - int idx = mAllocatedObjects.getMinIndex() - 1; // New max ID object + int idx = mAllocatedObjects.getMinIndex() - 1; // New min ID + // wanted a new id, let's grow for them! - mAllocatedObjects.setMinIndex(idx - 256, false); + grow(idx - 256, mAllocatedObjects.getMaxIndex()); + LOG_INFO("Beware: Grew archetype id's by 256 to %d", mAllocatedObjects.getMinIndex()); return idx; } @@ -568,9 +589,11 @@ return id; } else { - int idx = mAllocatedObjects.getMaxIndex() + 1; // New max ID object + int idx = mAllocatedObjects.getMaxIndex() + 1; // New max ID + // wanted a new id, let's grow for them! - mAllocatedObjects.setMaxIndex(idx + 256, false); + grow(mAllocatedObjects.getMinIndex(), idx + 256); + LOG_INFO("Beware: Grew concrete id's by 256 to %d", mAllocatedObjects.getMinIndex()); return idx; } Modified: trunk/src/services/object/ObjectService.h =================================================================== --- trunk/src/services/object/ObjectService.h 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/object/ObjectService.h 2008-10-21 17:57:42 UTC (rev 911) @@ -153,6 +153,11 @@ */ bool hasMetaProperty(int id, const std::string& mpName); + /** Grows the whole object system to allow the storage of the given range of object ID's + * The id range has to be greater than the old one (no object id removal allowed) + */ + void grow(int minID, int maxID); + protected: bool init(); Modified: trunk/src/services/property/PropertyGroup.cpp =================================================================== --- trunk/src/services/property/PropertyGroup.cpp 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/property/PropertyGroup.cpp 2008-10-21 17:57:42 UTC (rev 911) @@ -141,7 +141,7 @@ while (!idit->end()) { int id = idit->next(); - if (!objMask.get(id)) + if (!objMask[id]) continue; if (!mPropertyStorage->writeToFile(fprop, id, true)) @@ -260,5 +260,11 @@ DataFieldDescIteratorPtr PropertyGroup::getFieldDescIterator(void) { return mPropertyStorage->getFieldDescIterator(); } + + // -------------------------------------------------------------------------- + void PropertyGroup::grow(int minID, int maxID) { + mPropertyStorage->grow(minID, maxID); + mInheritor->grow(minID, maxID); + } } Modified: trunk/src/services/property/PropertyGroup.h =================================================================== --- trunk/src/services/property/PropertyGroup.h 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/property/PropertyGroup.h 2008-10-21 17:57:42 UTC (rev 911) @@ -176,6 +176,10 @@ */ DataFieldDescIteratorPtr getFieldDescIterator(void); + /** Grows the property group to allow the storage of minID to maxID object id's + */ + void grow(int minID, int maxID); + protected: /** Does the internal handling related to the creation of a property for object * @param objID The object id to which a property was added Modified: trunk/src/services/property/PropertyService.cpp =================================================================== --- trunk/src/services/property/PropertyService.cpp 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/property/PropertyService.cpp 2008-10-21 17:57:42 UTC (rev 911) @@ -181,6 +181,16 @@ return new PropertyGroupMapKeyIterator(mPropertyGroupMap); } + //------------------------------------------------------ + void PropertyService::grow(int minID, int maxID) { + // grow all the properties + PropertyGroupMap::iterator it = mPropertyGroupMap.begin(); + + for (; it != mPropertyGroupMap.end(); ++it) { + it->second->grow(minID, maxID); + } + } + // -------------------------------------------------------------------------- PropertyGroup* PropertyService::getPropertyGroup(const std::string& name) { PropertyGroupMap::iterator it = mPropertyGroupMap.find(name); Modified: trunk/src/services/property/PropertyService.h =================================================================== --- trunk/src/services/property/PropertyService.h 2008-10-21 17:56:30 UTC (rev 910) +++ trunk/src/services/property/PropertyService.h 2008-10-21 17:57:42 UTC (rev 911) @@ -121,6 +121,11 @@ /** @return a property name iterator usable to iterate over all property types */ StringIteratorPtr getAllPropertyNames(); + /** Grows all the properties to allow the storage of the given range of object ID's + * The id range has to be greater than the old one (no object id removal allowed) + */ + void grow(int minID, int maxID); + /// maps property groups to their names typedef std::map< std::string, PropertyGroup* > PropertyGroupMap; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-10-23 03:54:38
|
Revision: 921 http://opde.svn.sourceforge.net/opde/?rev=921&view=rev Author: patryn Date: 2008-10-23 03:54:37 +0000 (Thu, 23 Oct 2008) Log Message: ----------- Reduced the calls to .size() at it is a slow function. Modified Paths: -------------- trunk/src/base/file/File.cpp trunk/src/main/DTypeScriptCompiler.cpp trunk/src/scenemanager/DarkConvexPolygon.cpp trunk/src/scenemanager/DarkPortal.cpp trunk/src/services/object/ObjectService.cpp trunk/src/services/worldrep/LightmapAtlas.cpp Modified: trunk/src/base/file/File.cpp =================================================================== --- trunk/src/base/file/File.cpp 2008-10-22 11:24:08 UTC (rev 920) +++ trunk/src/base/file/File.cpp 2008-10-23 03:54:37 UTC (rev 921) @@ -482,6 +482,7 @@ std::pair<size_t, int> pgp = decomposePos(actp); + unsigned int PagesSize = mPages.size(); while (resSize > 0) { // read from one page in one cycle pass file_size_t read = 0; @@ -489,10 +490,10 @@ uint toEnd; - if (pgp.first >= mPages.size()) { // last page. or error + if (pgp.first >= PagesSize) { // last page. or error toEnd = (mSize % MEMORY_FILE_BUF_LEN) - pgp.second; - if (toEnd == 0 || pgp.first >= mPages.size()) { + if (toEnd == 0 || pgp.first >= PagesSize) { // if this occurs, I've read the bytes I could // I also should set the important member vars prior to exception throw mEof = true; @@ -544,10 +545,11 @@ // actual position in the source buffer std::pair<size_t, int> pgp = decomposePos(actp); + unsigned int PagesSize = mPages.size(); while (resSize > 0) { file_size_t written = 0; - if (pgp.first >= mPages.size()) { // I've finished the already allocated pages + if (pgp.first >= PagesSize) { // I've finished the already allocated pages char *nbuf = new char[MEMORY_FILE_BUF_LEN]; if (nbuf == NULL) // this is quite fatal. something like out of disk space Modified: trunk/src/main/DTypeScriptCompiler.cpp =================================================================== --- trunk/src/main/DTypeScriptCompiler.cpp 2008-10-22 11:24:08 UTC (rev 920) +++ trunk/src/main/DTypeScriptCompiler.cpp 2008-10-23 03:54:37 UTC (rev 921) @@ -217,7 +217,7 @@ DTypeScriptCompiler::CompileState DTypeScriptCompiler::popState() { CompileState old = mCurrentState; - if (mStateStack.size() > 0) { + if (!mStateStack.empty()) { mCurrentState = mStateStack.top(); mStateStack.pop(); Modified: trunk/src/scenemanager/DarkConvexPolygon.cpp =================================================================== --- trunk/src/scenemanager/DarkConvexPolygon.cpp 2008-10-22 11:24:08 UTC (rev 920) +++ trunk/src/scenemanager/DarkConvexPolygon.cpp 2008-10-23 03:54:37 UTC (rev 921) @@ -52,9 +52,10 @@ ConvexPolygon::ConvexPolygon(const ConvexPolygon& src) { const PolygonPoints& pnts = src.getPoints(); - mPoints.reserve(pnts.size()); + unsigned int size = pnts.size(); + mPoints.reserve(size); - for (unsigned int x = 0; x < pnts.size(); x++) + for (unsigned int x = 0; x < size; x++) mPoints.push_back(pnts.at(x)); this->mPlane = src.getPlane(); @@ -140,7 +141,7 @@ if (negative == 0) { delete[] sides; - return mPoints.size(); // all the vertices were inside + return pointcount; // all the vertices were inside } didClip = true; @@ -261,8 +262,9 @@ Vector3 ip = ray.getPoint(intersection.second); Vector3 origin = ray.getOrigin(); - for (unsigned int idx = 0; idx < mPoints.size(); idx++) { - int iv2 = (idx + 1) % mPoints.size(); + unsigned int pointcount = mPoints.size(); + for (unsigned int idx = 0; idx < pointcount; idx++) { + int iv2 = (idx + 1) % pointcount; Vector3 v1 = mPoints[idx]; Vector3 v2 = mPoints[iv2]; @@ -288,8 +290,9 @@ // intersection circle radius Real irad = radius*radius - distance*distance; - for (unsigned int idx = 0; idx < mPoints.size(); idx++) { - int iv2 = (idx + 1) % mPoints.size(); + unsigned int pointcount = mPoints.size(); + for (unsigned int idx = 0; idx < pointcount; idx++) { + int iv2 = (idx + 1) % pointcount; Vector3 v1 = mPoints[idx]; Vector3 v2 = mPoints[iv2]; Modified: trunk/src/scenemanager/DarkPortal.cpp =================================================================== --- trunk/src/scenemanager/DarkPortal.cpp 2008-10-22 11:24:08 UTC (rev 920) +++ trunk/src/scenemanager/DarkPortal.cpp 2008-10-23 03:54:37 UTC (rev 921) @@ -148,25 +148,27 @@ // --------------------------------------------------------------------------------- void Portal::refreshBoundingVolume() { - if (mPoints.size() == 0) { + + unsigned int pointcount = mPoints.size(); + if (pointcount == 0) { mCenter = Vector3(0,0,0); mRadius = -1; return; } // first get the center. - Vector3 center(0,0,0); + Vector3 center(0,0,0); - for (unsigned int x = 0; x < mPoints.size(); x++) + for (unsigned int x = 0; x < pointcount; x++) center += mPoints[x]; - center /= mPoints.size(); + center /= pointcount; mCenter = center; // now the maximal radius float radius = 0; - for (unsigned int x = 0; x < mPoints.size(); x++) { + for (unsigned int x = 0; x < pointcount; x++) { Vector3 vdist = mPoints[x] - center; float len = vdist.squaredLength(); Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-10-22 11:24:08 UTC (rev 920) +++ trunk/src/services/object/ObjectService.cpp 2008-10-23 03:54:37 UTC (rev 921) @@ -568,7 +568,7 @@ // first look into the stack of free id's // TODO: Grow all the related structures as well! if (archetype) { - if (mFreeArchetypeIDs.size() > 0) { + if (!mFreeArchetypeIDs.empty()) { int id = mFreeArchetypeIDs.top(); mFreeArchetypeIDs.pop(); @@ -583,7 +583,7 @@ return idx; } } else { - if (mFreeConcreteIDs.size() > 0) { + if (!mFreeConcreteIDs.empty()) { int id = mFreeConcreteIDs.top(); mFreeConcreteIDs.pop(); Modified: trunk/src/services/worldrep/LightmapAtlas.cpp =================================================================== --- trunk/src/services/worldrep/LightmapAtlas.cpp 2008-10-22 11:24:08 UTC (rev 920) +++ trunk/src/services/worldrep/LightmapAtlas.cpp 2008-10-23 03:54:37 UTC (rev 921) @@ -259,7 +259,7 @@ } bool LightAtlasList::placeLightMap(LightMap* lmap) { - if (mList.size() == 0) + if (mList.empty()) mList.push_back(new LightAtlas(0)); int last = mList.size(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-29 21:23:00
|
Revision: 942 http://opde.svn.sourceforge.net/opde/?rev=942&view=rev Author: volca Date: 2008-10-29 21:22:57 +0000 (Wed, 29 Oct 2008) Log Message: ----------- * Grow inheritors as well * Array now has min/max ID getters * DonorType has 2.4 tag version, not 1.1 Modified Paths: -------------- trunk/src/base/Array.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/object/ObjectService.cpp Modified: trunk/src/base/Array.h =================================================================== --- trunk/src/base/Array.h 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/base/Array.h 2008-10-29 21:22:57 UTC (rev 942) @@ -151,7 +151,10 @@ growBuf(&mPositiveArray, mMaxIndex, maxIdx); mMaxIndex = maxIdx; } - + + int getMinIndex() { return mMinIndex; }; + int getMaxIndex() { return mMaxIndex; }; + protected: void growBuf(T**ptr, int oldSize, int newSize) { if (newSize < oldSize) // if it would, we'd call placement destructor before realloc Modified: trunk/src/services/inherit/CachedInheritor.cpp =================================================================== --- trunk/src/services/inherit/CachedInheritor.cpp 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/inherit/CachedInheritor.cpp 2008-10-29 21:22:57 UTC (rev 942) @@ -187,6 +187,22 @@ mImplements.clear(); } + + //------------------------------------------------------ + void CachedInheritor::valueChanged(int objID, const std::string& field, const DVariant& value) { + // TODO: search for all inheriting objects, broadcast for each + InheritValueChangeMsg msg; + + msg.change = INH_VAL_FIELD_CHANGED; + + msg.objectID = objID; + msg.srcID = 0; + msg.field = field; + msg.value = value; + + broadcastMessage(msg); + } + //------------------------------------------------------- Cached Inheritor Factory: string CachedInheritorFactory::mName = "always"; Modified: trunk/src/services/inherit/CachedInheritor.h =================================================================== --- trunk/src/services/inherit/CachedInheritor.h 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/inherit/CachedInheritor.h 2008-10-29 21:22:57 UTC (rev 942) @@ -84,6 +84,9 @@ */ virtual bool refresh(int objID); + /// @see Inheritor::valueChanged + void valueChanged(int objID, const std::string& field, const DVariant& value); + /// InheritService reference InheritService* mInheritService; Modified: trunk/src/services/inherit/InheritCommon.h =================================================================== --- trunk/src/services/inherit/InheritCommon.h 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/inherit/InheritCommon.h 2008-10-29 21:22:57 UTC (rev 942) @@ -40,7 +40,9 @@ /// Inheritance of the value was canceled (object stopped implementing a value) INH_VAL_REMOVED, /// Object changed the inheritance source, did implement before - INH_VAL_CHANGED + INH_VAL_CHANGED, + /// Object changed a certain field's value (effectively - not masked by metaprops), inheritance did not change + INH_VAL_FIELD_CHANGED } InheritValueChangeType; /// Inheritance change message @@ -49,8 +51,12 @@ InheritValueChangeType change; /// An ID of the affected object int objectID; - /// An ID of the new source, or zero if the inherited value has been removed + /// An ID of the new source, or zero if the inherited value has been removed (ignore for INH_VAL_FIELD_CHANGED) int srcID; + /// A field name of the change (only valid for INH_VAL_FIELD_CHANGED) + std::string field; + /// A new value of the field (only valid for INH_VAL_FIELD_CHANGED) + DVariant value; }; /** Inheritor interface @@ -106,6 +112,9 @@ /// grows the internal tables of the inheritor to allow the storage of data about defined object range virtual void grow(int minID, int maxID) {}; + + /// 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; }; /// Shared pointer to Inheritor Modified: trunk/src/services/inherit/InheritService.cpp =================================================================== --- trunk/src/services/inherit/InheritService.cpp 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/inherit/InheritService.cpp 2008-10-29 21:22:57 UTC (rev 942) @@ -220,6 +220,15 @@ } //------------------------------------------------------ + void InheritService::grow(int minID, int maxID) { + InheritorList::iterator it = mInheritors.begin(); + + for (; it != mInheritors.end(); ++it) { + (*it)->grow(minID, maxID); + } + } + + //------------------------------------------------------ InheritQueryResultPtr InheritService::getSources(int objID) const { InheritMap::const_iterator it = mInheritSources.find(objID); Modified: trunk/src/services/inherit/InheritService.h =================================================================== --- trunk/src/services/inherit/InheritService.h 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/inherit/InheritService.h 2008-10-29 21:22:57 UTC (rev 942) @@ -126,6 +126,9 @@ /// Clears out the inheritance map (leaves the other things intact) void clear(); + /// grows all the inheritors to be able to contain given range of object IDs + void grow(int minID, int maxID); + /// Map of object (src/dst) to inherit link typedef std::map< int, InheritLinkPtr > InheritLinkMap; Modified: trunk/src/services/inherit/NeverInheritor.cpp =================================================================== --- trunk/src/services/inherit/NeverInheritor.cpp 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/inherit/NeverInheritor.cpp 2008-10-29 21:22:57 UTC (rev 942) @@ -112,6 +112,21 @@ return false; } + //------------------------------------------------------ + void NeverInheritor::valueChanged(int objID, const std::string& field, const DVariant& value) { + // just for the original object here + InheritValueChangeMsg msg; + + msg.change = INH_VAL_FIELD_CHANGED; + + msg.objectID = objID; + msg.srcID = 0; + msg.field = field; + msg.value = value; + + broadcastMessage(msg); + } + //------------------------------------------------------- Never Inheritor Factory: string NeverInheritorFactory::mName = "never"; Modified: trunk/src/services/inherit/NeverInheritor.h =================================================================== --- trunk/src/services/inherit/NeverInheritor.h 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/inherit/NeverInheritor.h 2008-10-29 21:22:57 UTC (rev 942) @@ -43,9 +43,13 @@ /// @see Inheritor::getEffectiveID virtual int getEffectiveID(int srcID) const; - + /// @see Inheritor::validate virtual bool validate(int srcID, int dstID, unsigned int priority) const; + /// @see Inheritor::valueChanged + virtual void valueChanged(int objID, const std::string& field, const DVariant& value); + + /// @see Inheritor::clear virtual void clear(); protected: Modified: trunk/src/services/object/ObjectService.cpp =================================================================== --- trunk/src/services/object/ObjectService.cpp 2008-10-29 21:19:59 UTC (rev 941) +++ trunk/src/services/object/ObjectService.cpp 2008-10-29 21:22:57 UTC (rev 942) @@ -213,6 +213,9 @@ // grow the Properties mPropertyService->grow(minID, maxID); + // grow the inheritors + mInheritService->grow(minID, maxID); + // TODO: grow the links } @@ -234,6 +237,8 @@ // create the builtin DonorType property DataStoragePtr stor = new IntDataStorage(); mPropDonorType = mPropertyService->createPropertyGroup("DonorType", "DonorType", "never", stor); + // version of the property tag + mPropDonorType->setChunkVersions(2, 4); } //------------------------------------------------------ @@ -367,6 +372,13 @@ int lastID = 0; + /* + - The damn GAM file only contains negative object ID's - + + * Now this would not be a problem, if there was no default room introduced, with id 1 + * 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 for(id = minID; id < maxID ; ++id) { if (fileObjs[id]) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-10-29 21:28:58
|
Revision: 943 http://opde.svn.sourceforge.net/opde/?rev=943&view=rev Author: volca Date: 2008-10-29 21:28:49 +0000 (Wed, 29 Oct 2008) Log Message: ----------- * valueChanged callback - mostly for editor mode value propagation * ActiveProperty class added - ancestor of properties with implementation * RenderedProperty class added - targetted at all properties that modify entity visibility/look * HasRefsProperty class added - a bad (in function) implementation of a hasrefs property - take as an example before it is finished * A rewrite of some RenderService methods. Hopefully without any negative side-effects so far Modified Paths: -------------- trunk/src/main/Root.cpp trunk/src/services/property/PropertyGroup.cpp trunk/src/services/property/PropertyGroup.h trunk/src/services/render/RenderService.cpp trunk/src/services/render/RenderService.h Added Paths: ----------- trunk/src/services/render/HasRefsProperty.cpp trunk/src/services/render/HasRefsProperty.h trunk/src/services/render/RenderedProperty.cpp trunk/src/services/render/RenderedProperty.h Modified: trunk/src/main/Root.cpp =================================================================== --- trunk/src/main/Root.cpp 2008-10-29 21:22:57 UTC (rev 942) +++ trunk/src/main/Root.cpp 2008-10-29 21:28:49 UTC (rev 943) @@ -120,6 +120,8 @@ // ------------------------------------------------------- Root::~Root() { + LOG_INFO("openDarkEngine is shutting down"); + // if those are used, delete them delete mDTypeScriptLdr; delete mPLDefScriptLdr; Modified: trunk/src/services/property/PropertyGroup.cpp =================================================================== --- trunk/src/services/property/PropertyGroup.cpp 2008-10-29 21:22:57 UTC (rev 942) +++ trunk/src/services/property/PropertyGroup.cpp 2008-10-29 21:28:49 UTC (rev 943) @@ -54,6 +54,27 @@ } // -------------------------------------------------------------------------- + PropertyGroup::PropertyGroup(PropertyService* owner, const std::string& name, const std::string& chunk_name, + std::string inheritorName) : + mName(name), + mChunkName(chunk_name), + mVerMaj(1), + mVerMin(1), + mPropertyStorage(NULL), + mOwner(owner), + 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); + + // And as a final step, register as inheritor listener + Inheritor::ListenerPtr cil = new ClassCallback<InheritValueChangeMsg, PropertyGroup>(this, &PropertyGroup::onInheritChange); + + mInheritorListenerID = mInheritor->registerListener(cil); + } + + // -------------------------------------------------------------------------- PropertyGroup::~PropertyGroup() { } @@ -209,7 +230,13 @@ // -------------------------------------------------------------------------- bool PropertyGroup::set(int id, const std::string& field, const DVariant& value) { - return mPropertyStorage->setField(id, field, value); + if (mPropertyStorage->setField(id, field, value)) { + mInheritor->valueChanged(id, field, value); + + return true; + } + + return false; } // -------------------------------------------------------------------------- @@ -226,6 +253,7 @@ // -------------------------------------------------------------------------- void PropertyGroup::onInheritChange(const InheritValueChangeMsg& msg) { // Consult the inheritor value change, and build a property change message + onPropertyModification(msg); /* The broadcast of the property change is not done directly in the methods above but here. The reason for this is that only the inheritor knows the real character of the change, and the objects that the change inflicted @@ -238,7 +266,7 @@ case INH_VAL_ADDED: // Property was added to an object pmsg.change = PROP_ADDED; break; - case INH_VAL_CHANGED: // property changed inherit src or value + case INH_VAL_CHANGED: // property changed inherit value pmsg.change = PROP_CHANGED; break; case INH_VAL_REMOVED: // property does not exist any more on the object (and not inherited) @@ -250,6 +278,11 @@ broadcastMessage(pmsg); } + + // -------------------------------------------------------------------------- + void PropertyGroup::onPropertyModification(const InheritValueChangeMsg& msg) { + // nothing at all + } // -------------------------------------------------------------------------- void PropertyGroup::objectDestroyed(int id) { @@ -266,5 +299,38 @@ mPropertyStorage->grow(minID, maxID); mInheritor->grow(minID, maxID); } + + // -------------------------------------------------------------------------- + // ----------- ActiveProperty ----------------------------------------------- + // -------------------------------------------------------------------------- + ActiveProperty::ActiveProperty(PropertyService* owner, const std::string& name, + const std::string& chunk_name, std::string inheritorName) : + PropertyGroup(owner, name, chunk_name, inheritorName) { + }; + + // -------------------------------------------------------------------------- + void ActiveProperty::onPropertyModification(const InheritValueChangeMsg& msg) { + // we only handle concretes here + if (msg.objectID <= 0) + return; + + // dispatch based on the msg.change + switch (msg.change) { + case INH_VAL_ADDED: // Property was added to an object + addProperty(msg.objectID); + break; + case INH_VAL_CHANGED: // property changed inherit value + removeProperty(msg.objectID); + break; + case INH_VAL_REMOVED: // property does not exist any more on the object (and not inherited) + setPropertySource(msg.objectID, msg.srcID); + break; + case INH_VAL_FIELD_CHANGED: // property changed a value, affecting the given object + valueChanged(msg.objectID, msg.field, msg.value); + break; + default: + return; + } + } } Modified: trunk/src/services/property/PropertyGroup.h =================================================================== --- trunk/src/services/property/PropertyGroup.h 2008-10-29 21:22:57 UTC (rev 942) +++ trunk/src/services/property/PropertyGroup.h 2008-10-29 21:28:49 UTC (rev 943) @@ -127,7 +127,7 @@ /** Clears the whole property group. * Clears out all the properties, and broadcasts PROP_GROUP_CLEARED */ - void clear(); + virtual void clear(); /** Creates a property for given object ID, using the default values for the property fields * @param obj_id The id of the object to create the property for @@ -156,7 +156,7 @@ * @return true if the change was sucessful * @see owns * @note Will log error when object id does not own the property to be changed */ - bool set(int id, const std::string& field, const DVariant& value); + virtual bool set(int id, const std::string& field, const DVariant& value); /** Direct data getter * @param id object id @@ -165,7 +165,7 @@ * @see owns * @return false if field name was invalid, true if value was set in target */ - bool get(int id, const std::string& field, DVariant& target); + virtual bool get(int id, const std::string& field, DVariant& target); /** Notification that an object was destroyed. @see PropertyService::objectDestroyed */ void objectDestroyed(int id); @@ -181,6 +181,9 @@ void grow(int minID, int maxID); protected: + // storage-less property constructor. Used by properties which want to construct their storage on their own + PropertyGroup(PropertyService* owner, const std::string& name, const std::string& chunk_name, std::string inheritorName); + /** Does the internal handling related to the creation of a property for object * @param objID The object id to which a property was added */ @@ -189,6 +192,12 @@ /// The listener to the inheritance messages void onInheritChange(const InheritValueChangeMsg& msg); + /** A connection point usable for descendants to implement property behavior. + * Called from onInheritChange. In it's default this does nothing. + * @see ActiveProperty + */ + virtual void onPropertyModification(const InheritValueChangeMsg& msg); + /** Returns an ID of the object which is responsible for the current property values * As the properties can be inherited using both archetype links and MetaProps, * there must be a way to know what object currently represents the property values @@ -225,9 +234,46 @@ bool mBuiltin; }; - /// Shared pointer to property group - // typedef shared_ptr<PropertyGroup> PropertyGroupPtr; + /** Common ancestor to engine-implemented properties - those that handle property value in a "visible" way. + * Every class inheriting from this should implement all the abstract methods (sure) and also some of the + * virtual ones, for example clear, which can happen to be called instead of removeProperty when unloading data. + * @note All the methods introduced here are only called on concrete objects! + */ + class OPDELIB_EXPORT ActiveProperty : public PropertyGroup { + public: + ActiveProperty(PropertyService* owner, const std::string& name, + const std::string& chunk_name, std::string inheritorName); + protected: + /// Overriden from the ancestor, which handles the property life/value events + void onPropertyModification(const InheritValueChangeMsg& msg); + /** Handles the addition of the property to the object. + * Called when a property is effectively added to the object (regardless of it's source - inherited or direct). + * A function hooked here should initialise the internal structure that is used per object + */ + virtual void addProperty(int oid) = 0; + + /** Removes the property from the object. + * Called when the property stops it's existence + */ + virtual void removeProperty(int oid) = 0; + + /** Re-reads the values of the property from different source, rebuilds it's values. + * Called when, thanks to the inheritance/metaproperty changes, the oid object should re-set the internal values + * based on a different source object. + * @note Only properties which inherit values need this. + */ + virtual void setPropertySource(int oid, int effid) {}; + + /** A field of the property changed event. + * Called on all objects effectively inheriting values from some source object (not specified). + * @note This kind of event is typically only fired when changing the property of the object itself, or in editor mode. This is thanks to the fact that no archetype changes are possible in gameplay mode + * @param oid The object id of the object onto which the change applies + * @param field the field name of the property onto which the change applies (or empty for one-valued properties) + * @param value the new value of the propertie's field + */ + virtual void valueChanged(int oid, const std::string& field, const DVariant& value) = 0; + }; } #endif Added: trunk/src/services/render/HasRefsProperty.cpp =================================================================== --- trunk/src/services/render/HasRefsProperty.cpp (rev 0) +++ trunk/src/services/render/HasRefsProperty.cpp 2008-10-29 21:28:49 UTC (rev 943) @@ -0,0 +1,79 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2006 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * $Id$ + * + *****************************************************************************/ + +#include "RenderService.h" +#include "PropertyService.h" +#include "SingleFieldDataStorage.h" +#include "HasRefsProperty.h" + +namespace Opde { + /*--------------------------------------------------------*/ + /*--------------------- HasRefsProperty ------------------*/ + /*--------------------------------------------------------*/ + HasRefsProperty::HasRefsProperty(RenderService* rs, PropertyService* owner) : + RenderedProperty(rs, owner, "HasRefs", "HasRefs", "always") { + mPropertyStorage = new BoolDataStorage(); + }; + + // -------------------------------------------------------------------------- + HasRefsProperty::~HasRefsProperty(void) { + }; + + // -------------------------------------------------------------------------- + void HasRefsProperty::addProperty(int oid) { + // nothing special needed here. Just initialize the value of the hasrefs to the data value + // as hasRefs is inherited, just use our methods + DVariant val(false); + + if (!get(oid, "", val)) + OPDE_EXCEPT("Property not defined for object.", "HasRefsProperty::addProperty"); + + setHasRefs(oid, val.toBool()); + }; + + // -------------------------------------------------------------------------- + void HasRefsProperty::removeProperty(int oid) { + // reinit to true - the object's default + setHasRefs(oid, true); + }; + + // -------------------------------------------------------------------------- + void HasRefsProperty::setPropertySource(int oid, int effid) { + // re-read the property + addProperty(oid); + }; + + // -------------------------------------------------------------------------- + void HasRefsProperty::valueChanged(int oid, const std::string& field, const DVariant& value) { + // just call the setter + setHasRefs(oid, value.toBool()); + }; + + // -------------------------------------------------------------------------- + void HasRefsProperty::setHasRefs(int oid, bool hasRefs) { + EntityInfo* ei = getEntityInfo(oid); + ei->setHasRefs(hasRefs); + }; +}; + Property changes on: trunk/src/services/render/HasRefsProperty.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/render/HasRefsProperty.h =================================================================== --- trunk/src/services/render/HasRefsProperty.h (rev 0) +++ trunk/src/services/render/HasRefsProperty.h 2008-10-29 21:28:49 UTC (rev 943) @@ -0,0 +1,63 @@ +/****************************************************************************** + * + * 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 __HASREFSPROPERTY_H +#define __HASREFSPROPERTY_H + +#include "RenderedProperty.h" + +namespace Opde { + + /** a HasRefs implementation using rendered property handler. + * Uses simple bool data storage. Defaults to true. Inherits always. + * When set to false, the given object has NO rendered effect in the scene. + */ + class HasRefsProperty : public RenderedProperty { + public: + /// constructor + HasRefsProperty(RenderService* rs, PropertyService* owner); + + /// destructor + virtual ~HasRefsProperty(void); + + protected: + /// @see ActiveProperty::addProperty + void addProperty(int oid); + + /// @see ActiveProperty::removeProperty + void removeProperty(int oid); + + /// @see ActiveProperty::setPropertySource + void setPropertySource(int oid, int effid); + + /// @see ActiveProperty::valueChanged + void valueChanged(int oid, const std::string& field, const DVariant& value); + + /// core setter method. Called from other methods to set the hasrefs value + void setHasRefs(int oid, bool hasRefs); + }; +}; + +#endif Property changes on: trunk/src/services/render/HasRefsProperty.h ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/src/services/render/RenderService.cpp =================================================================== --- trunk/src/services/render/RenderService.cpp 2008-10-29 21:22:57 UTC (rev 942) +++ trunk/src/services/render/RenderService.cpp 2008-10-29 21:28:49 UTC (rev 943) @@ -59,8 +59,96 @@ const char* DEFAULT_RAMP_OBJECT_NAME = "DefaultRamp"; const char* FX_PARTICLE_OBJECT_NAME = "FX_PARTICLE"; - + /*--------------------------------------------------------*/ + /*--------------------- EntityInfo -----------------------*/ + /*--------------------------------------------------------*/ + EntityInfo::EntityInfo(Ogre::SceneManager* man, Ogre::Entity* entity, Ogre::SceneNode* node) : + mSceneMgr(man), + mRenderType(RENDER_TYPE_NORMAL), + mHasRefs(true), + mSkip(false), + mAlpha(1.0f), + mEntity(entity), + mNode(node), + mEmi(NULL) { + + mEmi = new EntityMaterialInstance(mEntity); + mEmi->setSceneBlending(SBT_TRANSPARENT_ALPHA); + // mEmi->setSceneBlending(SBT_MODULATE); + }; + // -------------------------------------------------------------------------- + EntityInfo::~EntityInfo() { + // + mNode->detachObject(mEntity); + + delete mEmi; + + mSceneMgr->destroyEntity(mEntity); + + mSceneMgr->destroySceneNode(mNode->getName()); + } + + // -------------------------------------------------------------------------- + void EntityInfo::setHasRefs(bool _hasRefs) { + mHasRefs = _hasRefs; + refreshVisibility(); + }; + + // -------------------------------------------------------------------------- + void EntityInfo::setRenderType(unsigned int _renderType) { + mRenderType = _renderType; + refreshVisibility(); + }; + + // -------------------------------------------------------------------------- + void EntityInfo::setSkip(bool _skip) { + mSkip = _skip; + refreshVisibility(); + }; + + // -------------------------------------------------------------------------- + void EntityInfo::setAlpha(float alpha) { + mAlpha = alpha; + mEmi->setTransparency(1.0f - mAlpha); + }; + + // -------------------------------------------------------------------------- + void EntityInfo::setEntity(Ogre::Entity* entity) { + if (mEntity == entity) + return; + + // detach the old entity + mNode->detachObject(mEntity); + + // attach the new entity + mNode->attachObject(entity); + + mEmi->setEntity(entity); + + // destroy the previous entity + mSceneMgr->destroyEntity(mEntity); + + mEntity = entity; + + refreshVisibility(); + }; + + // -------------------------------------------------------------------------- + void EntityInfo::refreshVisibility() { + // calculate the visibilities: + bool brType = false; + + switch (mRenderType) { + case RENDER_TYPE_NORMAL: brType = true; break; + case RENDER_TYPE_NOT_RENDERED: brType = false; break; + case RENDER_TYPE_NO_LIGHTMAP: brType = true; break; // Not sure. Seems to indicate shadow should not be cast on lmaps? + case RENDER_TYPE_EDITOR_ONLY: brType = true; break; // should be already converted to normal/not_rendered + } + + mNode->setVisible(mHasRefs && brType, true); + }; + /*--------------------------------------------------------*/ /*--------------------- RenderService --------------------*/ /*--------------------------------------------------------*/ @@ -103,23 +191,35 @@ clear(); + if (mHasRefsProperty) { + mPropertyService->unregisterPropertyGroup(mHasRefsProperty); + delete mHasRefsProperty; + mHasRefsProperty = NULL; + } + if (mPropPosition != NULL) mPropPosition->unregisterListener(mPropPositionListenerID); + mPropPosition = NULL; if (mPropModelName != NULL) mPropModelName->unregisterListener(mPropModelNameListenerID); - + mPropModelName = NULL; + if (mPropLight != NULL) mPropLight->unregisterListener(mPropLightListenerID); - + mPropLight = NULL; + if (mPropSpotlight != NULL) mPropSpotlight->unregisterListener(mPropSpotlightListenerID); - + mPropSpotlight = NULL; + if (mPropRenderType != NULL) mPropRenderType->unregisterListener(mPropRenderTypeListenerID); + mPropRenderType = NULL; if (mPropScale != NULL) mPropScale->unregisterListener(mPropScaleListenerID); + mPropScale = NULL; if (mRenderWindow) mRenderWindow->removeAllViewports(); @@ -182,6 +282,9 @@ // prepare the default models and textures prepareHardcodedMedia(); + + // create all the properties the render service uses + createProperties(); return true; } @@ -416,9 +519,8 @@ if (msg.objectID <= 0) // no action for archetypes return; - LOG_INFO("RenderService: Adding Light for object %d", msg.objectID); + LOG_VERBOSE("RenderService: Adding Light for object %d", msg.objectID); - // As a test, I'm loading cube.mesh switch (msg.change) { case PROP_CHANGED: // Will update the light's parameters @@ -440,7 +542,10 @@ case PROP_REMOVED: removeLight(msg.objectID); - + break; + + default: + OPDE_EXCEPT("Invalid message type for property message", "RenderService::onPropLightMsg"); } } @@ -455,7 +560,7 @@ if (msg.objectID <= 0) // no action for archetypes return; - LOG_INFO("RenderService: Adding Spotlight for object %d", msg.objectID); + LOG_VERBOSE("RenderService: Adding Spotlight for object %d", msg.objectID); switch(msg.change) { case PROP_CHANGED: @@ -520,37 +625,36 @@ switch(msg.change) { case PROP_CHANGED: case PROP_ADDED: { - // It seems this property !only! affects models - ObjectEntityMap::iterator it = mEntityMap.find(msg.objectID); - - if (it != mEntityMap.end()) { - SceneNode* node = it->second.node; - - assert(node != NULL); - - DVariant mode; - mPropRenderType->get(msg.objectID, "mode", mode); - - LOG_VERBOSE("RenderService: RenderType prop for obj. %d changed to %d", msg.objectID, mode.toUInt()); - - it->second.renderType = mode.toUInt(); - - setNodeRenderType(node, it->second); - } else { - LOG_ERROR("RenderService: Could not find an entity info for object %d, could not propagate RenderType", msg.objectID); + EntityInfo* ei = _getEntityInfo(msg.objectID); + + // if we don't have ei for the object, it is not initialized just yet + // that of course is error - ObjectService should have done this already + // But there is a catch - DefaultRoom has id 1, is in the GAM, but has no id in bitmap + // an expensive, and maybe not possible, way to deal with this? DonorType... + if (ei == NULL) { + LOG_ERROR("RenderService::onPropRenderTypeMsg: No EntityInfo for object %d", msg.objectID); + return; } + + DVariant mode; + mPropRenderType->get(msg.objectID, "mode", mode); + LOG_VERBOSE("RenderService: RenderType prop for obj. %d changed to %d", msg.objectID, mode.toUInt()); + + unsigned int uimode = mode.toUInt(); - return; + if (uimode == RENDER_TYPE_EDITOR_ONLY) + uimode = mEditorMode ? RENDER_TYPE_NORMAL : RENDER_TYPE_NOT_RENDERED; + + ei->setRenderType(uimode); + + break; } case PROP_REMOVED: - // Default is visible (?) - ObjectEntityMap::iterator it = mEntityMap.find(msg.objectID); - - if (it != mEntityMap.end()) { - it->second.node->setVisible(true); - } + EntityInfo* ei = _getEntityInfo(msg.objectID); + ei->setRenderType(RENDER_TYPE_NORMAL); + break; } } @@ -560,11 +664,6 @@ if (msg.objectID <= 0) // no action for archetypes return; - ObjectEntityMap::iterator it = mEntityMap.find(msg.objectID); - - if (it == mEntityMap.end()) - return; - switch(msg.change) { case PROP_CHANGED: case PROP_ADDED: { @@ -573,11 +672,13 @@ LOG_DEBUG("RenderService: RenderAlpha prop for obj. %d changed to %f", msg.objectID, alpha.toFloat()); - it->second.emi->setTransparency(1.0f - alpha.toFloat()); + EntityInfo* ei = _getEntityInfo(msg.objectID); + ei->setAlpha(alpha.toFloat()); return; } case PROP_REMOVED: - it->second.emi->setTransparency(0); + EntityInfo* ei = _getEntityInfo(msg.objectID); + ei->setAlpha(1.0f); return; } } @@ -722,31 +823,11 @@ } } - // -------------------------------------------------------------------------- - void RenderService::setNodeRenderType(Ogre::SceneNode* node, const EntityInfo& ei) { - // skip flag or hasRefs false will mean no rendering regardless of the renderType value - if (ei.skip || !ei.hasRefs) { - node->setVisible(false, true); - } else { - switch(ei.renderType) { - case RENDER_TYPE_NORMAL: node->setVisible(true, true); break; - case RENDER_TYPE_NOT_RENDERED: node->setVisible(false, true); break; - case RENDER_TYPE_NO_LIGHTMAP: node->setVisible(true, true); break;// Not sure. Seems to indicate shadow should not be cast on lmaps? - case RENDER_TYPE_EDITOR_ONLY: node->setVisible(mEditorMode, true); break; - } - } - } - - // -------------------------------------------------------------------------- void RenderService::prepareMesh(const Ogre::String& name) { String fname = name + ".mesh"; - try { - // First, try to load the mesh directly as a mesh file - Ogre::MeshPtr mesh1 = Ogre::MeshManager::getSingleton().load(fname, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); - - } catch (FileNotFoundException) { + 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 @@ -792,21 +873,9 @@ prepareEntity(ent); - EntityInfo ei; + EntityInfoPtr ei = new EntityInfo(mSceneMgr, ent, enode); + ei->refreshVisibility(); - ei.entity = ent; - ei.node = enode; - ei.emi = new EntityMaterialInstance(ent); - - ei.renderType = RENDER_TYPE_NORMAL; // seems to be the default. Affects Models, Particle effects (DynamicLights?) - ei.hasRefs = true; - ei.skip = false; - setNodeRenderType(node, ei); - - ei.emi->setSceneBlending(SBT_TRANSPARENT_ALPHA); - // ei.emi->setSceneBlending(SBT_MODULATE); - - mEntityMap.insert(make_pair(id, ei)); } @@ -818,79 +887,47 @@ if (it != mEntityMap.end()) { LOG_VERBOSE("RenderService: Destroying the entity for %d", id); - - destroyEntityInfo(it->second); - - // erase the record itself + + // erase the record itself - will destroy the EntityInfo mEntityMap.erase(it); } } // -------------------------------------------------------------------------- - void RenderService::destroyEntityInfo(EntityInfo& ei) { - SceneNode* node = ei.node; - - assert(node != NULL); + void RenderService::setObjectModel(int id, const std::string& name) { + EntityInfo* ei = _getEntityInfo(id); + + // if the new name is empty, just set skip and it's done + if (name == "") { + LOG_VERBOSE("RenderService: Mesh rendering for %d disabled", id); + ei->setSkip(true); + return; + } + + // name not empty. Prepare new entity, swap, destroy old - node->detachObject(ei.entity); - - // destroy the emi - delete ei.emi; + Ogre::String idstr = StringConverter::toString(id); - // destroy the detached entity - mSceneMgr->destroyEntity(ei.entity); - - // destroy the scenenode of the entity - mSceneMgr->destroySceneNode(node->getName()); - } + Entity *ent = NULL; - // -------------------------------------------------------------------------- - void RenderService::setObjectModel(int id, const std::string& name) { - ObjectEntityMap::iterator it = mEntityMap.find(id); - - if (it != mEntityMap.end()) { - Ogre::String idstr = StringConverter::toString(id); - - // destroy the prev. entity - SceneNode* node = it->second.node; + // load the new entity, set it as the current in the entity info + try { + ent = mSceneMgr->createEntity( "Object" + idstr + name, name); + } catch (Ogre::Exception& e) { + // TODO: This could also be handled by not setting the new entity at all + LOG_ERROR("RenderService: Could not load model %s for obj %d : %s", name.c_str(), id, e.getFullDescription().c_str()); + ent = mSceneMgr->createEntity( "Object" + idstr + "Ramp", DEFAULT_RAMP_OBJECT_NAME); + } - assert(node != NULL); - - node->detachObject(it->second.entity); - - if (name == "") { // emty model name means no render - // leave in the previous entity, set hidden flag - it->second.skip = true; - setNodeRenderType(node, it->second); - LOG_VERBOSE("RenderService: Mesh rendering for %d disabled", id); - } else { - Entity *ent; - // load the new entity, set it to emi - try { - ent = mSceneMgr->createEntity( "Object" + idstr + name, name); - } catch (Ogre::Exception& e) { - // TODO: This could also be handled by not setting the new entity at all - LOG_ERROR("RenderService: Could not load model %s for obj %d : %s", name.c_str(), id, e.getFullDescription().c_str()); - ent = mSceneMgr->createEntity( "Object" + idstr + "Ramp", DEFAULT_RAMP_OBJECT_NAME); - } - - it->second.skip = false; - Entity *prevent = it->second.entity; - prepareEntity(ent); - it->second.entity = ent; - it->second.emi->setEntity(ent); - - node->attachObject(ent); - - // set the visibility again, node does not propagate to new members! - setNodeRenderType(node, it->second); - - // last, destroy the detached entity - mSceneMgr->destroyEntity(prevent); - } - } else { - LOG_FATAL("RenderService: Entity info not found for object %d. Cannot set model!", id); - } + Entity *prevent = ei->getEntity(); + + prepareEntity(ent); + + // will destroy the previous + ei->setEntity(ent); + + // Last step - refresh the skip + ei->setSkip(false); } // -------------------------------------------------------------------------- @@ -917,14 +954,7 @@ // -------------------------------------------------------------------------- void RenderService::clear() { - // free the emi's - ObjectEntityMap::iterator it = mEntityMap.begin(); - - for (;it != mEntityMap.end(); ++it) { - destroyEntityInfo(it->second); - } - - // then clear the map + // will destroy all EntityInfos mEntityMap.clear(); } @@ -947,6 +977,17 @@ } // -------------------------------------------------------------------------- + EntityInfo* RenderService::_getEntityInfo(int oid) { + ObjectEntityMap::iterator it = mEntityMap.find(oid); + + if (it != mEntityMap.end()) { + return (it->second.ptr()); + } + + return NULL; + } + + // -------------------------------------------------------------------------- // ---- Scene Node handling routines ---------------------------------------- // -------------------------------------------------------------------------- Ogre::SceneNode* RenderService::getSceneNode(int objID) { @@ -1164,18 +1205,20 @@ // -------------------------------------------------------------------------- void RenderService::createProperties() { - // TODO: Fill this. We want all the properties used in services hardcoded in them // Ok, what do we have here? // Model Name. Simple fixed-length string prop // Fixed on version 2.16 + //mModelNameStorage = new FixedStringDataStorage(); + //mPropertyService->createPropertyGroup("ModelName", "ModelName", "always", mModelNameStorage); - // RenderType property - single int property // RenderAlpha property - single float prop // HasRefs - single bool prop + mHasRefsProperty = new HasRefsProperty(this, mPropertyService.ptr()); + // Light - a more complex property - this should be moved to LightService // Spotlight - as above Modified: trunk/src/services/render/RenderService.h =================================================================== --- trunk/src/services/render/RenderService.h 2008-10-29 21:22:57 UTC (rev 942) +++ trunk/src/services/render/RenderService.h 2008-10-29 21:28:49 UTC (rev 943) @@ -40,6 +40,8 @@ #include "ObjectService.h" #include "EntityMaterialInstance.h" +#include "HasRefsProperty.h" + #include <OgreEntity.h> #include <OgreLight.h> #include <OgreSceneNode.h> @@ -72,6 +74,54 @@ RenderWindowSize size; } RenderServiceMsg; + /// A package of an entity and a EntityMaterialInstance + class EntityInfo { + public: + EntityInfo(Ogre::SceneManager* man, Ogre::Entity* entity, Ogre::SceneNode* node); + + // destructor - destroys the + ~EntityInfo(); + + // setters: + void setHasRefs(bool _hasRefs); + void setRenderType(unsigned int _renderType); + void setSkip(bool _skip); + void setAlpha(float alpha); + + void setEntity(Ogre::Entity* newEntity); + + inline Ogre::Entity* getEntity(void) { return mEntity; }; + inline Ogre::SceneNode* getSceneNode(void) { return mNode; }; + + /// refreshes the visibilty of the object based on hasRefs, renderType and skip + void refreshVisibility(); + + protected: + Ogre::SceneManager* mSceneMgr; + + unsigned int mRenderType; + + bool mHasRefs; + + /// Used by FX_Particle and such. Hides without interfering with the previous two + bool mSkip; + + /// alpha transparency value of the object + float mAlpha; + + Ogre::Entity* mEntity; + Ogre::SceneNode* mNode; + EntityMaterialInstance* mEmi; + }; + + typedef shared_ptr<EntityInfo> EntityInfoPtr; + + /// Map of objectID -> Entity + typedef std::map<int, EntityInfoPtr> ObjectEntityMap; + + // forward declaration of the + class RenderService; + /** @brief Render service - service managing in-game object rendering * Some preliminary notes: VHot will probably be converted to TagPoints somehow * The 0,0,0 bug will reveal itself here too, maybe. This is caused by default object coordinates being 0,0,0 and we have to wait for Position prop message to come in order to move the node @@ -120,7 +170,12 @@ /** Camera is detached from the specified object */ void detachCamera(); + + /** Internal method that returns entity info for a given object ID, or NULL if such does not exist */ + EntityInfo* _getEntityInfo(int oid); + protected: + virtual bool init(); virtual void bootstrapFinished(); virtual void shutdown(); @@ -190,25 +245,6 @@ Ogre::SceneNode* node; }; - /// A package of an entity and a EntityMaterialInstance - struct EntityInfo { - unsigned int renderType; - bool hasRefs; - - /// Used by FX_Particle and such. Hides without interfering with the previous two - bool skip; - - Ogre::Entity* entity; - Ogre::SceneNode* node; - EntityMaterialInstance* emi; - }; - - - /** Destroys all the allocated resources in the given EntityInfo struct - */ - void destroyEntityInfo(EntityInfo& ei); - - /// Creates a new light with next to no initialization LightInfo& createLight(int objID); @@ -224,12 +260,6 @@ /// removes spotlight quality from a light (leaves the light as a point light) void removeSpotLight(int id); - /// set's the node's visibility based on the rendertype property value - void setNodeRenderType(Ogre::SceneNode* node, const EntityInfo& ei); - - /// Map of objectID -> Entity - typedef std::map<int, EntityInfo> ObjectEntityMap; - ObjectEntityMap mEntityMap; // Listener structs for property messages @@ -262,8 +292,6 @@ PropertyGroup::ListenerID mPropRenderAlphaListenerID; PropertyGroup* mPropRenderAlpha; - - /// Shared pointer to the property service PropertyServicePtr mPropertyService; @@ -317,6 +345,8 @@ /// editor mode display bool mEditorMode; + + HasRefsProperty* mHasRefsProperty; }; /// Shared pointer to Link service Added: trunk/src/services/render/RenderedProperty.cpp =================================================================== --- trunk/src/services/render/RenderedProperty.cpp (rev 0) +++ trunk/src/services/render/RenderedProperty.cpp 2008-10-29 21:28:49 UTC (rev 943) @@ -0,0 +1,43 @@ +/****************************************************************************** + * + * 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 "RenderedProperty.h" +#include "RenderService.h" + + +namespace Opde { + RenderedProperty::RenderedProperty(RenderService* rs, PropertyService* owner, const std::string& name, + const std::string& chunk_name, std::string inheritorName) : + ActiveProperty(owner, name, chunk_name, inheritorName), mOwner(rs) {}; + + EntityInfo* RenderedProperty::getEntityInfo(int oid) { + EntityInfo* ei = mOwner->_getEntityInfo(oid); + assert(ei); + + if (ei == NULL) + OPDE_EXCEPT("EntityInfo not found for object", "RenderedProperty::getEntityInfo"); + + return ei; + }; +}; Property changes on: trunk/src/services/render/RenderedProperty.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/render/RenderedProperty.h =================================================================== --- trunk/src/services/render/RenderedProperty.h (rev 0) +++ trunk/src/services/render/RenderedProperty.h 2008-10-29 21:28:49 UTC (rev 943) @@ -0,0 +1,51 @@ +/****************************************************************************** + * + * 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 __RENDEREDPROPERTY_H +#define __RENDEREDPROPERTY_H + +#include "PropertyGroup.h" + +namespace Opde { + // forward decl + class RenderService; + class EntityInfo; + + /// An ancestor to all classes that handle a certain aspect of rendering through a certain property + class RenderedProperty : public ActiveProperty { + public: + RenderedProperty(RenderService* rs, PropertyService* owner, const std::string& name, + const std::string& chunk_name, std::string inheritorName); + + protected: + // render service reference pointer + RenderService* mOwner; + + // shortcut getter for the entity info of a particular object + EntityInfo* getEntityInfo(int oid); + }; +}; + +#endif Property changes on: trunk/src/services/render/RenderedProperty.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: <pa...@us...> - 2008-10-29 23:14:58
|
Revision: 944 http://opde.svn.sourceforge.net/opde/?rev=944&view=rev Author: patryn Date: 2008-10-29 23:14:44 +0000 (Wed, 29 Oct 2008) Log Message: ----------- Added the SVN keywords. Property Changed: ---------------- trunk/src/base/console/ConsoleCommandListener.cpp trunk/src/services/render/HasRefsProperty.cpp trunk/src/services/render/HasRefsProperty.h trunk/src/services/render/RenderedProperty.cpp trunk/src/services/render/RenderedProperty.h Property changes on: trunk/src/base/console/ConsoleCommandListener.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Property changes on: trunk/src/services/render/HasRefsProperty.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Property changes on: trunk/src/services/render/HasRefsProperty.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Property changes on: trunk/src/services/render/RenderedProperty.cpp ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Property changes on: trunk/src/services/render/RenderedProperty.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-11-04 13:20:14
|
Revision: 962 http://opde.svn.sourceforge.net/opde/?rev=962&view=rev Author: volca Date: 2008-11-04 13:20:09 +0000 (Tue, 04 Nov 2008) Log Message: ----------- partial fix for zbias property - now relatively ok, but will need more work Modified Paths: -------------- trunk/src/base/loaders/ManualBinFileLoader.cpp trunk/src/services/render/ZBiasProperty.cpp trunk/src/services/render/ZBiasProperty.h Modified: trunk/src/base/loaders/ManualBinFileLoader.cpp =================================================================== --- trunk/src/base/loaders/ManualBinFileLoader.cpp 2008-11-04 12:55:44 UTC (rev 961) +++ trunk/src/base/loaders/ManualBinFileLoader.cpp 2008-11-04 13:20:09 UTC (rev 962) @@ -1385,9 +1385,6 @@ pass->setDiffuse(1,1,1,1); pass->setSpecular(0,0,0,0); - // Z Fighting of the bilboardy meshes - pass->setDepthBias(0.1, 0.1); - if (mat.type == MD_MAT_TMAP) { // Texture unit state for the main texture... Modified: trunk/src/services/render/ZBiasProperty.cpp =================================================================== --- trunk/src/services/render/ZBiasProperty.cpp 2008-11-04 12:55:44 UTC (rev 961) +++ trunk/src/services/render/ZBiasProperty.cpp 2008-11-04 13:20:09 UTC (rev 962) @@ -34,10 +34,9 @@ ZBiasProperty::ZBiasProperty(RenderService* rs, PropertyService* owner) : RenderedProperty(rs, owner, "RendererZBias", "Z-Bias", "always") { - mPropertyStorage = new FloatDataStorage(); + mPropertyStorage = new UIntDataStorage(); - // TODO: Check the version - setChunkVersions(1, 1); + setChunkVersions(2, 4); mSceneMgr = rs->getSceneManager(); }; @@ -53,13 +52,13 @@ if (!get(oid, "", val)) OPDE_EXCEPT("Property not defined for object.", "RenderAlphaProperty::addProperty"); - setZBias(oid, val.toFloat()); + setZBias(oid, val.toUInt()); }; // -------------------------------------------------------------------------- void ZBiasProperty::removeProperty(int oid) { - // reinit to 0.0 - no bias - setZBias(oid, 0.0f); + // reinit to 0 - no bias + setZBias(oid, 0); }; // -------------------------------------------------------------------------- @@ -71,14 +70,14 @@ // -------------------------------------------------------------------------- void ZBiasProperty::valueChanged(int oid, const std::string& field, const DVariant& value) { // just call the setter - setZBias(oid, value.toFloat()); + setZBias(oid, value.toUInt()); }; // -------------------------------------------------------------------------- - void ZBiasProperty::setZBias(int oid, float bias) { + void ZBiasProperty::setZBias(int oid, uint32_t bias) { EntityInfo* ei = getEntityInfo(oid); - - ei->setZBias(bias); + // TODO: The depth bias is in bits, not a float as supposed - conversion equation needed + ei->setZBias(static_cast<float>(1 << bias) / 0x0100); }; }; Modified: trunk/src/services/render/ZBiasProperty.h =================================================================== --- trunk/src/services/render/ZBiasProperty.h 2008-11-04 12:55:44 UTC (rev 961) +++ trunk/src/services/render/ZBiasProperty.h 2008-11-04 13:20:09 UTC (rev 962) @@ -32,7 +32,7 @@ /** a Z-Bias property implementation using rendered property handler. * Controls the rendering bias of the object (for Z-Fightning avoidance). SS2/T2 only. - * Uses simple unsigned float data storage. Defaults to 0.0 - No bias. Inherits always. + * Uses simple unsigned int data storage. Defaults to 0 - No bias. The stored bias is in bits. Inherits always. */ class ZBiasProperty : public RenderedProperty { public: @@ -56,7 +56,7 @@ void valueChanged(int oid, const std::string& field, const DVariant& value); /// core setter method. Called from other methods to set the hasrefs value - void setZBias(int oid, float bias); + void setZBias(int oid, uint32_t bias); Ogre::SceneManager* mSceneMgr; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2009-06-25 08:54:24
|
Revision: 1215 http://opde.svn.sourceforge.net/opde/?rev=1215&view=rev Author: volca Date: 2009-06-24 12:48:36 +0000 (Wed, 24 Jun 2009) Log Message: ----------- * clip rect in pixels now * more fixes Modified Paths: -------------- trunk/src/bindings/DrawServiceBinder.cpp trunk/src/bindings/DrawServiceBinder.h trunk/src/bindings/RenderedImageBinder.cpp trunk/src/bindings/RenderedLabelBinder.cpp trunk/src/bindings/bindings.h trunk/src/services/draw/DrawCommon.h trunk/src/services/draw/DrawOperation.cpp trunk/src/services/draw/DrawOperation.h trunk/src/services/draw/DrawService.cpp trunk/src/services/draw/DrawService.h trunk/src/services/draw/DrawSheet.cpp trunk/src/services/draw/DrawSheet.h trunk/src/services/draw/RenderedImage.cpp trunk/src/services/draw/RenderedLabel.cpp Modified: trunk/src/bindings/DrawServiceBinder.cpp =================================================================== --- trunk/src/bindings/DrawServiceBinder.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/bindings/DrawServiceBinder.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -465,7 +465,7 @@ 0, // ternaryfunc tp_call; /* __call__ */ 0, // reprfunc tp_str; /* __str__ */ PyObject_GenericGetAttr, // getattrofunc tp_getattro; */ - 0, // setattrofunc tp_setattro; */ + PyObject_GenericSetAttr, // setattrofunc tp_setattro; */ 0, // PyBufferProcs *tp_as_buffer; */ // for inheritance searches to work we need this Py_TPFLAGS_HAVE_CLASS, // long tp_flags; */ @@ -565,7 +565,17 @@ // ------------------------------------------ PyObject* DrawOperationBinder::setClipRect(PyObject* self, PyObject* args) { - if (setPClipRect(self, args, NULL) == 0) { // if succeeded + int len = PyTuple_Size(args); + + if (len != 1) + __PY_BADPARMS_RET; + + PyObject *tup = PyTuple_GetItem(args, 0); + + if (!PyTuple_Check(tup)) + __PY_BADPARMS_RET; + + if (setPClipRect(self, tup, NULL) == 0) { // if succeeded __PY_NONE_RET; } else { // otherwise return null to indicate a problem return NULL; @@ -651,24 +661,16 @@ return -1; } - PyObject *cr; - - if (PyArg_ParseTuple(value, "O", &cr)) { - // if it's a tuple, it should contain four floats - ClipRect rect; - if (!TypeInfo<ClipRect>::fromPyObject(cr, rect)) { - PyErr_SetString(PyExc_TypeError, "Expected 4 float tuple!"); - return -1; - }; + ClipRect rect; + if (!TypeInfo<ClipRect>::fromPyObject(value, rect)) { + PyErr_SetString(PyExc_TypeError, "Expected a 4 integer tuple(left,right,top,bottom)!"); + return -1; + }; - o->setClipRect(rect); + o->setClipRect(rect); - return 0; - } else { - // Invalid parameters - PyErr_SetString(PyExc_TypeError, "Expected an integer argument!"); - return -1; - } + return 0; + __PYTHON_EXCEPTION_GUARD_END_RVAL(-1); } Modified: trunk/src/bindings/DrawServiceBinder.h =================================================================== --- trunk/src/bindings/DrawServiceBinder.h 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/bindings/DrawServiceBinder.h 2009-06-24 12:48:36 UTC (rev 1215) @@ -83,10 +83,10 @@ static PyObject* toPyObject(const ClipRect& cr) { // tuple it is PyObject *crp = PyTuple_New(4); - PyTuple_SetItem(crp, 0, PyFloat_FromDouble(cr.left)); // Steals reference - PyTuple_SetItem(crp, 1, PyFloat_FromDouble(cr.right)); // Steals reference - PyTuple_SetItem(crp, 2, PyFloat_FromDouble(cr.top)); // Steals reference - PyTuple_SetItem(crp, 3, PyFloat_FromDouble(cr.bottom)); // Steals reference + PyTuple_SetItem(crp, 0, PyLong_FromLong(cr.left)); // Steals reference + PyTuple_SetItem(crp, 1, PyLong_FromLong(cr.right)); // Steals reference + PyTuple_SetItem(crp, 2, PyLong_FromLong(cr.top)); // Steals reference + PyTuple_SetItem(crp, 3, PyLong_FromLong(cr.bottom)); // Steals reference return crp; } @@ -94,8 +94,16 @@ static bool fromPyObject(PyObject* o, ClipRect& cr) { if (!PyTuple_Check(o)) return false; - - if (PyTuple_GET_SIZE(o) != 4) + + int size = PyTuple_GET_SIZE(o); + + // empty tuple means no clipping + if (size == 0) { + cr.noClip = true; + return true; + } + + if (size != 4) return false; // Type check all those before setting them @@ -105,16 +113,17 @@ pt = PyTuple_GetItem(o, 2); pb = PyTuple_GetItem(o, 3); - if (!PyFloat_Check(pl) || - !PyFloat_Check(pr) || - !PyFloat_Check(pt) || - !PyFloat_Check(pb) ) + if (!__PYINTLONG_CHECK(pl) || + !__PYINTLONG_CHECK(pr) || + !__PYINTLONG_CHECK(pt) || + !__PYINTLONG_CHECK(pb) ) return false; - cr.left = PyFloat_AsDouble(pl); - cr.right = PyFloat_AsDouble(pr); - cr.top = PyFloat_AsDouble(pt); - cr.bottom = PyFloat_AsDouble(pb); + cr.left = PyLong_AsLong(pl); + cr.right = PyLong_AsLong(pr); + cr.top = PyLong_AsLong(pt); + cr.bottom = PyLong_AsLong(pb); + cr.noClip = false; return true; } @@ -142,12 +151,12 @@ PyObject *arg = PyTuple_GetItem(o, 0); - if ((!PyLong_Check(arg)) && (!PyInt_Check(arg))) + if (!__PYINTLONG_CHECK(arg)) return false; PyObject *arg1 = PyTuple_GetItem(o, 1); - if ((!PyLong_Check(arg1)) && (!PyInt_Check(arg1))) + if (!__PYINTLONG_CHECK(arg1)) return false; pc.first = PyLong_AsLong(arg); Modified: trunk/src/bindings/RenderedImageBinder.cpp =================================================================== --- trunk/src/bindings/RenderedImageBinder.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/bindings/RenderedImageBinder.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -55,7 +55,7 @@ 0, // ternaryfunc tp_call; /* __call__ */ 0, // reprfunc tp_str; /* __str__ */ PyObject_GenericGetAttr, // getattrofunc tp_getattro; */ - 0, // setattrofunc tp_setattro; */ + PyObject_GenericSetAttr, // setattrofunc tp_setattro; */ 0, // PyBufferProcs *tp_as_buffer; */ // for inheritance searches to work we need this Py_TPFLAGS_HAVE_CLASS, // long tp_flags; */ Modified: trunk/src/bindings/RenderedLabelBinder.cpp =================================================================== --- trunk/src/bindings/RenderedLabelBinder.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/bindings/RenderedLabelBinder.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -54,8 +54,8 @@ 0, // hashfunc tp_hash; /* __hash__ */ 0, // ternaryfunc tp_call; /* __call__ */ 0, // reprfunc tp_str; /* __str__ */ - PyObject_GenericGetAttr, // getattrofunc tp_getattro; */ - 0, // setattrofunc tp_setattro; */ + PyObject_GenericGetAttr, // getattrofunc tp_getattro; */ + PyObject_GenericSetAttr, // setattrofunc tp_setattro; */ 0, // PyBufferProcs *tp_as_buffer; */ // for inheritance searches to work we need this Py_TPFLAGS_HAVE_CLASS, // long tp_flags; */ Modified: trunk/src/bindings/bindings.h =================================================================== --- trunk/src/bindings/bindings.h 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/bindings/bindings.h 2009-06-24 12:48:36 UTC (rev 1215) @@ -50,7 +50,8 @@ #define __PYTHON_EXCEPTION_GUARD_END_ __PYTHON_EXCEPTION_GUARD_END_RVAL(NULL) - +/// Checks if the specified PyObject is int or long +#define __PYINTLONG_CHECK(a) (PyLong_Check(a) || PyInt_Check(a)) namespace Opde { Modified: trunk/src/services/draw/DrawCommon.h =================================================================== --- trunk/src/services/draw/DrawCommon.h 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/DrawCommon.h 2009-06-24 12:48:36 UTC (rev 1215) @@ -72,6 +72,11 @@ const PixelSize& operator=(const PixelSize& b) { width = b.width; height = b.height; return *this; }; + inline OPDELIB_EXPORT friend std::ostream& operator <<(std::ostream& o, const PixelSize& ps) { + o << "PixelSize(" << ps.width << ", " << ps.height << ")"; + return o; + } + size_t width; size_t height; }; @@ -90,9 +95,35 @@ }; - /// A Clipping rectangle - used to set rendered boundaries for rendered (drawn) objects struct OPDELIB_EXPORT ClipRect { ClipRect() : left(0), right(0), top(0), bottom(0), noClip(true) {}; + int left; + int right; + int top; + int bottom; + + /// If set to true (default) the clipping is not done + bool noClip; + + void operator=(const ClipRect& b) { + left = b.left; + right = b.right; + top = b.top; + bottom = b.bottom; + noClip = b.noClip; + } + + inline OPDELIB_EXPORT friend std::ostream& operator <<(std::ostream& o, const ClipRect& cr) { + o << "ClipRect(" << cr.left << ", " << cr.right << ", " + << cr.top << ", " << cr.bottom << ", " << cr.noClip << ")"; + return o; + } + }; + + /// A Clipping rectangle (on-screen version, in -1 - 1 range). + /// This struct is used to set rendered boundaries for rendered (drawn) objects + struct OPDELIB_EXPORT ScreenRect { + ScreenRect() : left(0), right(0), top(0), bottom(0), noClip(true) {}; Ogre::Real left; Ogre::Real right; Ogre::Real top; @@ -101,7 +132,7 @@ /// If set to true (default) the clipping is not done bool noClip; - void operator=(const ClipRect& b) { + void operator=(const ScreenRect& b) { left = b.left; right = b.right; top = b.top; @@ -177,6 +208,12 @@ return true; }; + + inline OPDELIB_EXPORT friend std::ostream& operator <<(std::ostream& o, const ScreenRect& sr) { + o << "ScreenRect(" << sr.left << ", " << sr.right << ", " + << sr.top << ", " << sr.bottom << ", " << sr.noClip << ")"; + return o; + } }; @@ -333,6 +370,7 @@ // helper comparison operator for draw source shared_ptrs - to be able to put them into sets for example bool operator<(const DrawSheetPtr& a, const DrawSheetPtr& b); + }; #endif Modified: trunk/src/services/draw/DrawOperation.cpp =================================================================== --- trunk/src/services/draw/DrawOperation.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/DrawOperation.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -106,6 +106,13 @@ //------------------------------------------------------ void DrawOperation::rebuild() { + // update the clip rect -> on screen projection + if (mActiveSheet) { + mActiveSheet->convertClipToScreen(mClipRect, mClipOnScreen); + } else { + mClipOnScreen.noClip = true; + } + _rebuild(); mIsDirty = false; } @@ -113,6 +120,9 @@ //------------------------------------------------------ void DrawOperation::_notifyActiveSheet(DrawSheet* actsh) { mActiveSheet = actsh; + + // need rebuild thanks to different sheet dimensions, etc. + _markDirty(); } //------------------------------------------------------ Modified: trunk/src/services/draw/DrawOperation.h =================================================================== --- trunk/src/services/draw/DrawOperation.h 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/DrawOperation.h 2009-06-24 12:48:36 UTC (rev 1215) @@ -117,8 +117,12 @@ int mZOrder; + /// Clip rectangle in pixel coordinates ClipRect mClipRect; + /// clip rectangle after transforming via owning sheet to 0-1 coordinate range on screen. + ScreenRect mClipOnScreen; + // is the operation dirty? True means it needs to be rebuilt in order to produce valid quads bool mIsDirty; }; Modified: trunk/src/services/draw/DrawService.cpp =================================================================== --- trunk/src/services/draw/DrawService.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/DrawService.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -605,26 +605,26 @@ } //------------------------------------------------------ - Ogre::Real DrawService::convertToScreenSpaceX(int x, size_t width) { + Ogre::Real DrawService::convertToScreenSpaceX(int x, size_t width) const { Ogre::Real res = x; - res = ((res + mXTextelOffset) / width) * 2.0f - 1.0f; - + res = ((res + mXTextelOffset) / (Ogre::Real)(width)) * 2.0f - 1.0f; + return res; } //------------------------------------------------------ - Ogre::Real DrawService::convertToScreenSpaceY(int y, size_t height) { + Ogre::Real DrawService::convertToScreenSpaceY(int y, size_t height) const { Ogre::Real res = y; - res = ((res + mYTextelOffset) / height) * -2.0f + 1.0f; + res = ((res + mYTextelOffset) / (Ogre::Real)(height)) * -2.0f + 1.0f; return res; } //------------------------------------------------------ - Ogre::Real DrawService::convertToScreenSpaceZ(int z) { + Ogre::Real DrawService::convertToScreenSpaceZ(int z) const { Ogre::Real depth = mRenderSystem->getMaximumDepthInputValue() - mRenderSystem->getMinimumDepthInputValue(); if (z < 0) Modified: trunk/src/services/draw/DrawService.h =================================================================== --- trunk/src/services/draw/DrawService.h 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/DrawService.h 2009-06-24 12:48:36 UTC (rev 1215) @@ -122,17 +122,17 @@ /** Converts the given coordinate to the screen space x coordinate */ - Ogre::Real convertToScreenSpaceX(int x, size_t width); + Ogre::Real convertToScreenSpaceX(int x, size_t width) const; /** Converts the given coordinate to the screen space y coordinates */ - Ogre::Real convertToScreenSpaceY(int y, size_t height); + Ogre::Real convertToScreenSpaceY(int y, size_t height) const; /** Converts the given coordinate to the screen space y coordinates * @param z the depth in 0 - MAX_Z_VALUE range * @return Real number describing the depth */ - Ogre::Real convertToScreenSpaceZ(int z); + Ogre::Real convertToScreenSpaceZ(int z) const; /// Queues an atlas for rebuilding (on render queue started event) void _queueAtlasForRebuild(TextureAtlas* atlas); Modified: trunk/src/services/draw/DrawSheet.cpp =================================================================== --- trunk/src/services/draw/DrawSheet.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/DrawSheet.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -204,39 +204,35 @@ } //------------------------------------------------------ - Ogre::Real DrawSheet::convertToScreenSpaceX(int x) { + Ogre::Real DrawSheet::convertToScreenSpaceX(int x) const { return mOwner->convertToScreenSpaceX(x, mWidth); } //------------------------------------------------------ - Ogre::Real DrawSheet::convertToScreenSpaceY(int y) { + Ogre::Real DrawSheet::convertToScreenSpaceY(int y) const { return mOwner->convertToScreenSpaceY(y, mHeight); } //------------------------------------------------------ - Ogre::Real DrawSheet::convertToScreenSpaceZ(int z) { + Ogre::Real DrawSheet::convertToScreenSpaceZ(int z) const { return mOwner->convertToScreenSpaceZ(z); } //------------------------------------------------------ void DrawSheet::_setResolution(size_t width, size_t height) { if (!mResOverride) { - mWidth = width; - mHeight= height; + mWidth = width; + mHeight = height; } } //------------------------------------------------------ - ClipRect DrawSheet::getClipRect(int left, int right, int top, int bottom) { - ClipRect cr; - - cr.left = convertToScreenSpaceX(left); - cr.right = convertToScreenSpaceX(right); - cr.top = convertToScreenSpaceY(top); - cr.bottom = convertToScreenSpaceY(bottom); - cr.noClip = false; - - return cr; + void DrawSheet::convertClipToScreen(const ClipRect& cr, ScreenRect& tgt) const { + tgt.left = convertToScreenSpaceX(cr.left); + tgt.right = convertToScreenSpaceX(cr.right); + tgt.top = convertToScreenSpaceY(cr.top); + tgt.bottom = convertToScreenSpaceY(cr.bottom); + tgt.noClip = cr.noClip; } //------------------------------------------------------ Modified: trunk/src/services/draw/DrawSheet.h =================================================================== --- trunk/src/services/draw/DrawSheet.h 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/DrawSheet.h 2009-06-24 12:48:36 UTC (rev 1215) @@ -89,17 +89,17 @@ /** Converts the given coordinate to the screen space x coordinate */ - Ogre::Real convertToScreenSpaceX(int x); + Ogre::Real convertToScreenSpaceX(int x) const; /** Converts the given coordinate to the screen space y coordinates */ - Ogre::Real convertToScreenSpaceY(int y); + Ogre::Real convertToScreenSpaceY(int y) const; /** Converts the given coordinate to the screen space y coordinates * @param z the depth in 0 - MAX_Z_VALUE range * @return Real number describing the depth */ - Ogre::Real convertToScreenSpaceZ(int z); + Ogre::Real convertToScreenSpaceZ(int z) const; /** Informs this sheet the viewport resolution changed. Internal, do not use explicitly (use setResolutionOverride instead). */ @@ -107,7 +107,7 @@ /** Creates a clip rectangle with the specified screen coordinates. */ - ClipRect getClipRect(int left, int right, int top, int bottom); + void convertClipToScreen(const ClipRect& cr, ScreenRect& tgt) const; /** Queues all the Renderables into appropriate RenderQueueGroups */ Modified: trunk/src/services/draw/RenderedImage.cpp =================================================================== --- trunk/src/services/draw/RenderedImage.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/RenderedImage.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -88,7 +88,7 @@ mDrawQuad.positions.bottom = mActiveSheet->convertToScreenSpaceY(mPosition.second + ps.height); mDrawQuad.depth = mActiveSheet->convertToScreenSpaceZ(mZOrder); - mInClip = mClipRect.clip(mDrawQuad); + mInClip = mClipOnScreen.clip(mDrawQuad); _markDirty(); } Modified: trunk/src/services/draw/RenderedLabel.cpp =================================================================== --- trunk/src/services/draw/RenderedLabel.cpp 2009-06-24 10:41:13 UTC (rev 1214) +++ trunk/src/services/draw/RenderedLabel.cpp 2009-06-24 12:48:36 UTC (rev 1215) @@ -114,7 +114,7 @@ x += ds->getPixelSize().width; // if clipping produced some non-empty result - if (mClipRect.clip(dq)) { + if (mClipOnScreen.clip(dq)) { // the quad is queued (by making a dynamically allocated copy) DrawQuad* toStore = new DrawQuad(dq); mDrawQuadList.push_back(toStore); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pa...@us...> - 2008-11-05 04:33:51
|
Revision: 963 http://opde.svn.sourceforge.net/opde/?rev=963&view=rev Author: patryn Date: 2008-11-05 04:33:40 +0000 (Wed, 05 Nov 2008) Log Message: ----------- Made Max Atlas Size configurable. Modified Paths: -------------- trunk/src/main/GameStateManager.cpp trunk/src/services/worldrep/LightmapAtlas.cpp trunk/src/services/worldrep/LightmapAtlas.h Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-11-04 13:20:09 UTC (rev 962) +++ trunk/src/main/GameStateManager.cpp 2008-11-05 04:33:40 UTC (rev 963) @@ -21,6 +21,8 @@ * *****************************************************************************/ +#include <math.h> + #include "config.h" #include "GameStateManager.h" @@ -172,8 +174,19 @@ mConfigService->setParam("mission", "earth.mis"); else mConfigService->setParam("mission", "miss1.mis"); - } + } + int MaxAtlasSize = 512; + if (mConfigService->hasParam("MaxAtlasSize")) + { + MaxAtlasSize = mConfigService->getParam("MaxAtlasSize").toInt(); + MaxAtlasSize = 1 << (int)(log((double)MaxAtlasSize) / log((double) 2)); //Make sure it is a exponent of two + if((MaxAtlasSize < 128) || (MaxAtlasSize > 4096)) + MaxAtlasSize = 512; + } + LOG_INFO("Max Atlas Size : %d", MaxAtlasSize); + LightAtlas::setMaxSize(MaxAtlasSize); + // TODO: Remove this temporary nonsense. In fact. Remove the whole class this method is in! GamePlayState* ps = new GamePlayState(); GameLoadState* ls = new GameLoadState(); Modified: trunk/src/services/worldrep/LightmapAtlas.cpp =================================================================== --- trunk/src/services/worldrep/LightmapAtlas.cpp 2008-11-04 13:20:09 UTC (rev 962) +++ trunk/src/services/worldrep/LightmapAtlas.cpp 2008-11-05 04:33:40 UTC (rev 963) @@ -34,13 +34,12 @@ // TODO: This is dated... We should just return Width and Height for lightmaps (separate), to let the tuning be simpler // - this means some changes to the lmap allocation have to be made too -// size of lightmap atlas (both W and H) -#define ATLAS_MAX_SIZE 256 - using namespace Ogre; namespace Opde { +int LightAtlas::mMaxSize; + Vector3 operator*(float a, lmpixel b) { return Vector3(a * b.R,a * b.G,a * b.B); } @@ -126,7 +125,7 @@ // Dynamic allocation of lmap atlas size. If we didn't fit, try throwing // all the mapping away, then remap all while (!placeLightMap(lmap)) { - if (mSize >= ATLAS_MAX_SIZE) // have some sane maximum + if (mSize >= mMaxSize) // have some sane maximum return false; growAtlas(2 * mSize); Modified: trunk/src/services/worldrep/LightmapAtlas.h =================================================================== --- trunk/src/services/worldrep/LightmapAtlas.h 2008-11-04 13:20:09 UTC (rev 962) +++ trunk/src/services/worldrep/LightmapAtlas.h 2008-11-05 04:33:40 UTC (rev 963) @@ -348,10 +348,13 @@ /** Class holding one set of light maps. Uses a HardwarePixelBufferSharedPtr class for texture storage. * This class is used for atlasing a light map set into one bigger lightmap texture containing the light maps. * This accelerates rendering. */ - class LightAtlas { + class OPDELIB_EXPORT LightAtlas { private: /** The count of the stored light maps */ int mCount; + + /** The maximum atlas size */ + static int mMaxSize; /** Global index of this atlas in the atlas list */ int mIdx; @@ -442,6 +445,9 @@ /** returns the tag number of this atlas */ int getTag() {return mTag;}; + + /** Sets the maximum atlas size */ + static void setMaxSize(int Size) {mMaxSize = Size;}; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-11-05 20:35:45
|
Revision: 965 http://opde.svn.sourceforge.net/opde/?rev=965&view=rev Author: volca Date: 2008-11-05 20:35:38 +0000 (Wed, 05 Nov 2008) Log Message: ----------- Some comments added Modified Paths: -------------- trunk/src/main/Root.h trunk/src/services/inherit/InheritCommon.h trunk/src/services/worldrep/LightmapAtlas.cpp trunk/src/services/worldrep/LightmapAtlas.h Modified: trunk/src/main/Root.h =================================================================== --- trunk/src/main/Root.h 2008-11-05 08:05:51 UTC (rev 964) +++ trunk/src/main/Root.h 2008-11-05 20:35:38 UTC (rev 965) @@ -47,6 +47,7 @@ #include "DTypeScriptLoader.h" #include "PLDefScriptLoader.h" +/** OpenDarkEngine namespace. Holds the whole openDarkEngine project. */ namespace Opde { /** OPDE core class. Used to initialize the whole engine. Singleton */ Modified: trunk/src/services/inherit/InheritCommon.h =================================================================== --- trunk/src/services/inherit/InheritCommon.h 2008-11-05 08:05:51 UTC (rev 964) +++ trunk/src/services/inherit/InheritCommon.h 2008-11-05 20:35:38 UTC (rev 965) @@ -19,6 +19,11 @@ * *****************************************************************************/ +/*! + \file InheritCommon.h + \brief Common declarations for the inherit service + \ingroup InheritService + */ #ifndef __INHERITORCOMMON_H #define __INHERITORCOMMON_H Modified: trunk/src/services/worldrep/LightmapAtlas.cpp =================================================================== --- trunk/src/services/worldrep/LightmapAtlas.cpp 2008-11-05 08:05:51 UTC (rev 964) +++ trunk/src/services/worldrep/LightmapAtlas.cpp 2008-11-05 20:35:38 UTC (rev 965) @@ -223,20 +223,7 @@ return true; } - void LightAtlas::updateLightMapBuffer(FreeSpaceInfo& fsi, lmpixel* rgb) { - const PixelBox &pb = mAtlas->getCurrentLock(); - - uint32 *data = static_cast<uint32*>(pb.data) + fsi.y * pb.rowPitch; - for (int y = 0; y < fsi.h; y++) - { - uint32 w = (y * fsi.w); - for (int x = 0; x < fsi.w; x++) - data[x + fsi.x] = rgb[x + w].ARGB(); // Write a A8R8G8B8 conversion of the lmpixel - data += pb.rowPitch; - } - } - - inline void LightAtlas::updateLightMapBuffer(FreeSpaceInfo& fsi, uint32 *lR, uint32 *lG, uint32 *lB) + inline void LightAtlas::updateLightMapBuffer(FreeSpaceInfo& fsi, uint32_t *lR, uint32_t *lG, uint32_t *lB) { const PixelBox &pb = mAtlas->getCurrentLock(); @@ -268,35 +255,6 @@ } } - void LightAtlas::updateLightMapBuffer(FreeSpaceInfo& fsi, Ogre::Vector3* rgb) { - const PixelBox &pb = mAtlas->getCurrentLock(); - - uint32 *data = static_cast<uint32*>(pb.data) + fsi.y * pb.rowPitch; - for (int y = 0; y < fsi.h; y++) - { - uint32 w = (y * fsi.w); - for (int x = 0; x < fsi.w; x++) { - Vector3 pixel = rgb[x + w]; - - uint32 R, G, B; - - R = (uint32) pixel.x; - G = (uint32) pixel.y; - B = (uint32) pixel.z; - - R = (R > 255) ? 255 : ((R < 0)? 0 : R); - G = (G > 255) ? 255 : ((G < 0)? 0 : G); - B = (B > 255) ? 255 : ((B < 0)? 0 : B); - - uint32 ARGB = (R << 16) | (G << 8) | B; - - // Write a A8R8G8B8 conversion of the lmpixel - data[x + fsi.x] = ARGB; - } - data += pb.rowPitch; - } - } - void LightAtlas::registerAnimLight(int id, LightMap* target) { // Try to find the set, if not make a new one... std::map< int, std::set<LightMap*> >::iterator light_it = mLights.find(id); @@ -348,9 +306,6 @@ Opde::ConsoleBackend::getSingleton().setCommandHint(std::string("light"), "Switch a light intensity: light LIGHT_NUMBER INTENSITY(0-1)"); Opde::ConsoleBackend::getSingleton().registerCommandListener(std::string("lmeff"), dynamic_cast<ConsoleCommandListener*>(this)); Opde::ConsoleBackend::getSingleton().setCommandHint(std::string("lmeff"), "lightmap atlas efficiency calculator"); - // TODO: short description of command could be useful (registerCommandListener(command, desc, classptr)) - - mSplitCount = 0; } LightAtlasList::~LightAtlasList() { @@ -435,12 +390,9 @@ // sort the lmap vector by the area of the lmaps, and insert those all std::sort(ti->second.begin(), ti->second.end(), lightMapLess()); - bool first = true; - // find a nice warm place for all those little lightmaps - for (std::vector< LightMap *>::iterator it = ti->second.begin(); it < ti->second.end(); it++, first = false) { - if (placeLightMap(*it) && !first) - mSplitCount++; + for (std::vector< LightMap *>::iterator it = ti->second.begin(); it < ti->second.end(); it++) { + placeLightMap(*it); } } @@ -475,7 +427,7 @@ if (total_pixels > 0) percentage = 100.0f * used_pixels / total_pixels; - LOG_INFO("Light Map Atlas: Total used light map atlasses pixels: %d of %d (%f%%). %d atlases total used. Total splits: %d", used_pixels, total_pixels, percentage, last, mSplitCount); + LOG_INFO("Light Map Atlas: Total used light map atlasses pixels: %d of %d (%f%%). %d atlases total used.", used_pixels, total_pixels, percentage, last); return true; } @@ -519,7 +471,7 @@ if (total_pixels > 0) percentage = 100.0f * unused_pixels / total_pixels; - LOG_INFO("Total unused light map atlasses pixels: %d of %d (%f%%). %d atlases total used. Total splits: %d", unused_pixels, total_pixels, percentage, last, mSplitCount); + LOG_INFO("Total unused light map atlasses pixels: %d of %d (%f%%). %d atlases total used.", unused_pixels, total_pixels, percentage, last); } else LOG_ERROR("Command %s not understood by LightAtlasList", command.c_str()); } Modified: trunk/src/services/worldrep/LightmapAtlas.h =================================================================== --- trunk/src/services/worldrep/LightmapAtlas.h 2008-11-05 08:05:51 UTC (rev 964) +++ trunk/src/services/worldrep/LightmapAtlas.h 2008-11-05 20:35:38 UTC (rev 965) @@ -37,16 +37,16 @@ namespace Opde { - /// A struct holding info for one atlas + /// A structure holding info for one texture in an atlas typedef struct { int atlasnum; - float u,v; // shift of the lmap in the atlas - float su,sv; // size of the lmap in the atlas + float u,v; // shift of the texture (UV) in the atlas (position) + float su,sv; // size of the texture (UV) in the atlas (relative to atlas size - 0-1) } AtlasInfo; /** Free space information storage - rectangular area in the lightmap (either used or free to use) - * Organized in a binary tree. + * Organized in a binary tree. - A sort of a 2D texture space allocator. * thanks to this article for a tip: http://www.blackpawn.com/texts/lightmaps/default.html */ class FreeSpaceInfo { @@ -54,6 +54,7 @@ int mMaxArea; bool mIsLeaf; + // Children of this node, if it's a node FreeSpaceInfo* mChild[2]; FreeSpaceInfo() { @@ -74,30 +75,8 @@ int y; int w; int h; - - /* TODO Construct a 2x bigger FreeSpaceInfo, holding the given one as a child - FreeSpaceInfo(FreeSpaceInfo* orig) { - x = 0; - y = 0; - - w = 2 * orig->w; - h = 2 * orig->h; - - // rest - // below our original - mChild[0] = new FreeSpaceInfo(orig->w, 0, orig->w, h); - - mChild[0]->mIsLeaf = false; - - mChild[0]->mChild[0] = orig; - // square one, bottom of the original - mChild[0]->mChild[1] = new FreeSpaceInfo(0, orig->h, orig->w, orig->h); - - // next to our original, rectangular - mChild[1] = new FreeSpaceInfo(orig->w, 0, orig->w, h); - } - */ + // Constructor with the specified dimensions and position (leaf constructor) FreeSpaceInfo(int x, int y, int w, int h) { this->x = x; this->y = y; @@ -111,6 +90,7 @@ mChild[1] = NULL; } + // destructor. Deletes the children if any. ~FreeSpaceInfo() { if (mChild[0] != NULL) delete mChild[0]; @@ -119,6 +99,7 @@ delete mChild[1]; } + // Tests if this node has free space somewhere to store the specified sized texture. bool Fits(int sw, int sh) const { if ((sw<=w) && (sh<=h)) return true; @@ -126,6 +107,7 @@ return false; } + // Returns the area this free space represents int getArea() const { return w*h; } @@ -136,6 +118,9 @@ } /** allocate a space in the free area. + * If this is a node, it searches both it's children. If it is a leaf, it either returns NULL if it can't hold + * the specified dimensions, or a new pointer to a leaf that holds the allocation requested (the space that was + * not taken up by the alocation is put as a child of the node) * @return A free space rectangle of the requested space, or null if the space could not be allocated */ FreeSpaceInfo* allocate(int sw, int sh) { if (!mIsLeaf) { // split node. @@ -187,7 +172,7 @@ } /** refreshes the maximal allocatable area for this node/leaf. - Non-leaf nodes get the maximum as the maximum area of the children */ + Non-leaf nodes get the maximum as the maximum of the areas of the children */ void refreshMaxArea() { if (mIsLeaf) { mMaxArea = w * h; @@ -249,10 +234,10 @@ /** A class representing a switchable lightmap. It holds one static lightmap, which can't be switched, and a set of lightmaps indexed by light number, * which can have their'e intensity modulated. The resulting lightmap is recalculated every time an actual chage happens. - * Please use Ogre::LightAtlasList.setLightIntensity if you want to set an intensity to a certain light. Calling the method here would not refresh the lightmap texture. + * Please use Opde::LightAtlasList::setLightIntensity if you want to set an intensity to a certain light. Calling the method here would not refresh the lightmap texture. * @see LightAtlasList */ class LightMap { - // So the atlasser is able to set uv && suv for us + // Friend of atlas, so the atlas is able to set uv && suv for us friend class LightAtlas; /** Information about the lightmap position in the atlas */ @@ -266,8 +251,10 @@ /** A map of the switchable lightmaps */ ObjectToLightMap mSwitchableLmaps; + typedef std::map< int, float > LightIntensityMap; + /** A map of the actual intensities */ - std::map< int, float > mIntensities; + LightIntensityMap mIntensities; /** Lightmap's size in pixels */ unsigned int mSizeX, mSizeY; @@ -294,6 +281,7 @@ mPosition = NULL; } + /** Destructor. Frees all allocated lightmaps */ ~LightMap() { delete[] mStaticLmap; @@ -314,40 +302,52 @@ return mOwner; } - /** Converts input UV coords to the Atlas coords */ + /** Converts input UV coords to the Atlassed coords (after UV transformation) */ Ogre::Vector2 toAtlasCoords(Ogre::Vector2 in_uv) { - in_uv = in_uv * mSizeUV; // dunno why, this one does not work written in_uv *= suv; + in_uv = in_uv * mSizeUV; // dunno why, this one does not work written in_uv *= mSizeUV; in_uv += mUV; return in_uv; } /** Helping static method. Prepares an RGB version of the given buffer containing v1 or v2 lightmap - * @note Returns NEW buffer that the caller is to manage! */ + * @note Returns NEW buffer that the caller is responsible to manage! + * @todo If somebody finds time, do this two stage - one return required size, two convert into supplied buffer */ static lmpixel* convert(char *data, int sx, int sy, int ver); /** Adds a switchable lightmap with identification id to the lightmap list (has to be of the same size). - * \param id the ID of the light the lightmaps belongs to. - * \param data are the actual values converted to RGB. Unallocation is handled in destructor */ + * @param id the ID of the light the lightmaps belongs to. + * @param data are the actual values converted to RGB. Unallocation is handled in destructor */ void AddSwitchableLightmap(int id, lmpixel *data); - /** The main intensity setting function */ + /** The main intensity setting function + * @param id The id of the light (not object id, but internal light id) + * @param intensity the new intensity of the light (0.0f-1.0f) + */ void setLightIntensity(int id, float intensity); - /** Refreshes the texture's pixel buffer with our new settings*/ + /** Refreshes the texture's pixel buffer with the final version of all lightmaps */ void refresh(); + /// @return the dimensions of this atlas in pixels std::pair<int, int> getDimensions() const; - /** Returns the atlas index */ + /** @return the atlas index */ int getAtlasIndex(); + /** Returns a freely specified lightmap's tag. + * Tags are used to identify the texture which the lightmap modulates. + * The atlas list tries to minimize the number of atlases containing the lightmaps of the same tag. + / That minimizes the batch count of the rendering, thus improving performance. + */ int getTag() {return mTag; }; }; /** Class holding one set of light maps. Uses a HardwarePixelBufferSharedPtr class for texture storage. * This class is used for atlasing a light map set into one bigger lightmap texture containing the light maps. - * This accelerates rendering. */ + * This accelerates rendering. + * This texture atlas implementation is targetted at lightmaps. Uses tag set to tell if the atlas already contains the specified tag of lightmap + */ class OPDELIB_EXPORT LightAtlas { private: /** The count of the stored light maps */ @@ -373,22 +373,18 @@ typedef std::vector < LightMap * > LightMapVector; - /** Already inserted lightmaps - mainly for dealocation */ + /** Already inserted lightmaps - held for dealocation and building */ LightMapVector mLightmaps; - /** Light number to the LightMap set mapping - changing light intensity will iterate throught the set of lmaps, and regenerate */ - std::map<int, std::set<LightMap*> > mLights; - - /** A buffer which holds a copy of the image data */ - lmpixel* mCopybuffer; // I keep the data of the lightmap here before I place them to Texture buffer. + typedef std::map<int, std::set<LightMap*> > LightIDMap; - /** return an origin - XY coords for the next free space (for a lightmap sized w*h) */ - std::pair<FreeSpaceInfo, bool> getOrigin(int w, int h); + /** Light ID number to the LightMap set mapping - changing light intensity will iterate throught the set of lmaps, and regenerate */ + LightIDMap mLights; /// set of tags this atlas contains (used to minimize the texture*atlas combinations) typedef std::set<int> TagSet; - /** Tag value of this atlas */ + /** Tag values of this atlas */ TagSet mTagSet; /** The dimension of the atlas (starts at 16x16 - 16 here). As the atlas is rectangular we only need one */ @@ -402,11 +398,16 @@ bool placeLightMap(LightMap *lmap); public: + /** constructor + * @param idx The atlas index + * @param tag The initial tag this atlas will hold + */ LightAtlas(int idx, int tag = 0); + /// Destructor. Frees all lightmaps ~LightAtlas(); - /// Builds the texture. Called once per life of the atlas, finds the appropriate dimensions of the atlas to store all the lightmaps requested + /// Builds the texture. Called once per life of the atlas, writes the initial version of the atlas texture void build(); /** Adds a light map to this atlas. @@ -416,22 +417,17 @@ /** renders the prepared light map buffers into a texture - copies the pixel data to the 'atlas' */ bool render(); - - /** Updated the pixel buffer with a new version of the lightmap. This version converts the Vector3 floats to 0-255 range (checks limits). - * \warning Must be called after atlas locking, otherwise the program will crash ! */ - void updateLightMapBuffer(FreeSpaceInfo& fsi, lmpixel* rgb); - - /** Updated the pixel buffer with a new version of the lightmap. This version converts the Vector3 floats to 0-255 range (checks limits) - * \warning Must be called after atlas locking, otherwise the program will crash ! */ - void updateLightMapBuffer(FreeSpaceInfo& fsi, Ogre::Vector3* rgb); - /** Updated the pixel buffer with a new version of the lightmap. This version converts the uint32 (shifted by 8) to 0-255 range (checks limits) + /** Updates the pixel buffer with a new version of the lightmap (for example after light intensity change). + * This version converts the uint32 (shifted by 8) to 0-255 range (checks limits) * \warning Must be called after atlas locking, otherwise the program will crash ! */ - inline void updateLightMapBuffer(FreeSpaceInfo& fsi, unsigned int *lR, unsigned int *lG, unsigned int *lB); + inline void updateLightMapBuffer(FreeSpaceInfo& fsi, uint32_t *lR, uint32_t *lG, uint32_t *lB); /** Register that animated light ID maps to the LightMap instance */ void registerAnimLight(int id, LightMap* target); + /** Sets the intensity of the light + * @see LightAtlasList::setLightIntensity */ void setLightIntensity(int id, float intensity); /** Returns the Light Map Atlas order number */ @@ -461,24 +457,27 @@ /** @brief A holder of a number of the light map atlases. - * + * The main class in the family of lightmap management. Responsible for all lightmap atlases. * Use this class to work with the light map storage and light switching. */ class LightAtlasList : public ConsoleCommandListener { public: + /// helper operator that compares on the pixel count of lightmaps. Used to sort the lightmaps by size (helps atlassing effectivity) struct lightMapLess { bool operator()(const LightMap* a, const LightMap* b) const; }; private: + typedef std::vector<LightAtlas *> LightAtlasVector; + /** A list of the light map atlases */ - std::vector<LightAtlas *> mList; + LightAtlasVector mList; /** Pre-render lightmap list*/ typedef std::map<int, std::vector<LightMap*> > TextureLightMapQueue; + + /// List of lightmaps that are waiting for processing TextureLightMapQueue mLightMapQueue; - int mSplitCount; /// The split count of the same-texture lightmaps (e.g. the spread number. Higher number -> worse performance) - protected: bool placeLightMap(LightMap* lmap); @@ -511,7 +510,8 @@ (*atlases)->setLightIntensity(id, value); } }; - + + /// console command listener virtual void commandExecuted(std::string command, std::string parameters); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-11-09 18:03:31
|
Revision: 973 http://opde.svn.sourceforge.net/opde/?rev=973&view=rev Author: volca Date: 2008-11-09 18:03:21 +0000 (Sun, 09 Nov 2008) Log Message: ----------- Enabling drag-n-drop possibility on lnk files Modified Paths: -------------- trunk/src/base/StringTokenizer.h trunk/src/main/GameStateManager.cpp trunk/src/main/Opde.cpp Modified: trunk/src/base/StringTokenizer.h =================================================================== --- trunk/src/base/StringTokenizer.h 2008-11-09 15:32:59 UTC (rev 972) +++ trunk/src/base/StringTokenizer.h 2008-11-09 18:03:21 UTC (rev 973) @@ -67,6 +67,7 @@ if (mEatEmpty) { while (mIsChar(*mCurPos)) ++mCurPos; + } else { // Or I'll end up with empty token on second if (mIsChar(*mCurPos)) ++mCurPos; @@ -137,13 +138,13 @@ // Look if the current char is quote. if it is, split on quotes if (mIsQuoteP(*mCurPos) && !mIgnoreQuotes) { - tok_end = std::find_if(mCurPos, mStr.end(), mIsQuoteP); + tok_end = std::find_if(++mCurPos, mStr.end(), mIsQuoteP); } else { tok_end = std::find_if(mCurPos, mStr.end(), mIsSpaceP); } - if (mCurPos < tok_end) { - std::string toRet = std::string(mCurPos, tok_end); + if (tok_end != mStr.end()) { + std::string toRet(mCurPos, tok_end); mCurPos = tok_end; return toRet; } Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2008-11-09 15:32:59 UTC (rev 972) +++ trunk/src/main/GameStateManager.cpp 2008-11-09 18:03:21 UTC (rev 973) @@ -198,10 +198,39 @@ setupInputSystem(); + /* a not bulletproof but possibly useful processing of the mission config parameter: + * The parameter is split to path and mission file name + * the path goes to the default resource group (if not already in) + * the name is then loaded + */ + if (mConfigService->hasParam("mission")) { + DVariant mis = mConfigService->getParam("mission"); + + // process + String path = "", fname = mis.toString(); + + StringUtil::splitFilename(mis.toString(), fname, path); + + LOG_INFO("GameStateManager: Adding %s resource path. Will load mission %s", path.c_str(), fname.c_str()); + + // now look if we need the path added into general + /* Commented for now, causes problems for some reason... + if (path != "") + mRoot->addResourceLocation(path, "Dir", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, false); + */ + LOG_INFO("GameStateManager: Mission name set to %s", fname.c_str()); + + mConfigService->setParam("mission", fname); + } + + LOG_INFO("GameStateManager: Finishing bootstrap"); + mRoot->bootstrapFinished(); - + ps->bootstrapFinished(); + LOG_INFO("GameStateManager: State"); + // Push the initial state pushState(ls); Modified: trunk/src/main/Opde.cpp =================================================================== --- trunk/src/main/Opde.cpp 2008-11-09 15:32:59 UTC (rev 972) +++ trunk/src/main/Opde.cpp 2008-11-09 18:03:21 UTC (rev 973) @@ -42,13 +42,17 @@ INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) { - std::string scmdline(strCmdLine); - + std::string scmd(strCmdLine); + // split on space, find if we have two arguments or just one - WhitespaceStringTokenizer wst(scmdline); + WhitespaceStringTokenizer wst(scmd, false); // false == obey the quotes std::string GameType = wst.next(); - std::string missionName = wst.next(); + + std::string missionName = ""; + + if (!wst.end()) + missionName = wst.next(); #else int main(int argc, char**argv) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-11-09 18:20:44
|
Revision: 974 http://opde.svn.sourceforge.net/opde/?rev=974&view=rev Author: volca Date: 2008-11-09 18:20:35 +0000 (Sun, 09 Nov 2008) Log Message: ----------- * Switching off the skybox for now * fixing next on last token if no quote found * adding logging of time spent on particular loading operation Modified Paths: -------------- trunk/src/base/StringTokenizer.h trunk/src/services/database/DatabaseService.cpp trunk/src/services/worldrep/WorldRepService.cpp Modified: trunk/src/base/StringTokenizer.h =================================================================== --- trunk/src/base/StringTokenizer.h 2008-11-09 18:03:21 UTC (rev 973) +++ trunk/src/base/StringTokenizer.h 2008-11-09 18:20:35 UTC (rev 974) @@ -131,19 +131,24 @@ std::string next() { // We tokenize a hardcoded way - all spaces, except those which are in quotes, are splitters std::string::const_iterator tok_end; + std::string::const_iterator strend = mStr.end(); + + bool canEnd = false; - if (mCurPos != mStr.end()) { + if (mCurPos != strend) { while (mIsSpaceP(*mCurPos)) // eat all the spaces ++mCurPos; // Look if the current char is quote. if it is, split on quotes if (mIsQuoteP(*mCurPos) && !mIgnoreQuotes) { - tok_end = std::find_if(++mCurPos, mStr.end(), mIsQuoteP); + tok_end = std::find_if(++mCurPos, strend, mIsQuoteP); } else { - tok_end = std::find_if(mCurPos, mStr.end(), mIsSpaceP); + tok_end = std::find_if(mCurPos, strend, mIsSpaceP); + // we can tolerate end here + canEnd = true; } - if (tok_end != mStr.end()) { + if (tok_end != strend || canEnd) { std::string toRet(mCurPos, tok_end); mCurPos = tok_end; return toRet; Modified: trunk/src/services/database/DatabaseService.cpp =================================================================== --- trunk/src/services/database/DatabaseService.cpp 2008-11-09 18:03:21 UTC (rev 973) +++ trunk/src/services/database/DatabaseService.cpp 2008-11-09 18:20:35 UTC (rev 974) @@ -24,6 +24,8 @@ #include "OpdeException.h" #include "logger.h" +#include <OgreRoot.h> +#include <OgreTimer.h> #include <OgreResourceGroupManager.h> using namespace std; @@ -188,10 +190,15 @@ //------------------------------------------------------ void DatabaseService::broadcastMessage(const DatabaseChangeMsg& msg) { 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); + unsigned long now = Ogre::Root::getSingleton().getTimer()->getMilliseconds(); + + LOG_INFO("DatabaseService: Operation took %f seconds", (float)(now-sttime) / 1000); // recalculate the status mLoadingStatus.currentCoarse++; Modified: trunk/src/services/worldrep/WorldRepService.cpp =================================================================== --- trunk/src/services/worldrep/WorldRepService.cpp 2008-11-09 18:03:21 UTC (rev 973) +++ trunk/src/services/worldrep/WorldRepService.cpp 2008-11-09 18:20:35 UTC (rev 974) @@ -150,12 +150,14 @@ loadFromChunk(wrChunk, lightSize); // --- Finally, set sky according to the SKY chunk - setSkyBox(m.db); + // TODO: A good sky implementation + // setSkyBox(m.db); } } void WorldRepService::setSkyBox(const FileGroupPtr& db) { + return; FilePtr skyChunk = db->getFile("SKYMODE"); if (!skyChunk.isNull()) { // Thief1 sky. Thief2 has NewSky. Will need to make a custom scene node for this. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2008-12-12 11:00:22
|
Revision: 1015 http://opde.svn.sourceforge.net/opde/?rev=1015&view=rev Author: volca Date: 2008-12-12 11:00:17 +0000 (Fri, 12 Dec 2008) Log Message: ----------- widescreen sort-of works now Modified Paths: -------------- trunk/src/main/GamePlayState.cpp trunk/src/services/render/RenderService.cpp Modified: trunk/src/main/GamePlayState.cpp =================================================================== --- trunk/src/main/GamePlayState.cpp 2008-12-12 10:58:54 UTC (rev 1014) +++ trunk/src/main/GamePlayState.cpp 2008-12-12 11:00:17 UTC (rev 1015) @@ -160,7 +160,7 @@ // mCamera->setDirection(-0.398078, 0.825408, -0.400297); // Thiefy FOV - mCamera->setFOVy(Degree(70)); + mCamera->setFOVy(Degree(60) * mCamera->getAspectRatio()); if (mConfigService->hasParam("debug")) { if (mConfigService->getParam("debug") == true) { Modified: trunk/src/services/render/RenderService.cpp =================================================================== --- trunk/src/services/render/RenderService.cpp 2008-12-12 10:58:54 UTC (rev 1014) +++ trunk/src/services/render/RenderService.cpp 2008-12-12 11:00:17 UTC (rev 1015) @@ -286,6 +286,9 @@ mDefaultCamera->setCastShadows(true); + // aspect derived from screen aspect (to avoid stretching) + mDefaultCamera->setAspectRatio(Real(mRenderWindow->getWidth()) / Real(mRenderWindow->getHeight())); + mRenderWindow->addViewport( mDefaultCamera ); // Last step: Get the loop service and register as a listener This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |