From: <vo...@us...> - 2010-08-27 08:32:53
|
Revision: 1322 http://opde.svn.sourceforge.net/opde/?rev=1322&view=rev Author: volca Date: 2010-08-27 08:32:46 +0000 (Fri, 27 Aug 2010) Log Message: ----------- * Getting rid of Ogre:: namespace on some places - part 2. Usage, removal of vector3.h (replaced by Vector3.h). * Fixing the recent NULL pointer access problem (it really is an Ogre's bug, but well...). Thanks BPS for the report and patience :) * Some random improvements to the physics code Modified Paths: -------------- trunk/proto/PHYS_SYSTEM/readphs.cpp trunk/src/base/dyntype/DTypeDef.cpp trunk/src/base/dyntype/DTypeDef.h trunk/src/base/dyntype/DVariant.h trunk/src/base/dyntype/Serializer.h trunk/src/base/file/File.cpp trunk/src/base/file/File.h trunk/src/base/file/FileCompat.cpp trunk/src/base/file/FileCompat.h trunk/src/main/GameStateManager.cpp trunk/src/services/material/MaterialService.cpp trunk/src/services/physics/PhysModel.cpp trunk/src/services/physics/PhysModel.h trunk/src/services/physics/PhysicsService.cpp trunk/src/services/physics/PhysicsService.h trunk/src/services/physics/config.cmake trunk/src/services/render/RenderService.h trunk/src/services/room/Room.cpp trunk/src/services/room/Room.h trunk/src/services/room/RoomPortal.cpp trunk/src/services/room/RoomPortal.h trunk/src/services/room/RoomService.cpp trunk/src/services/room/RoomService.h trunk/src/services/worldrep/WRCell.h trunk/src/services/worldrep/WRTypes.h Added Paths: ----------- trunk/src/services/physics/PhysCommon.cpp trunk/src/services/physics/PhysCommon.h Removed Paths: ------------- trunk/src/compat/vector3.h Modified: trunk/proto/PHYS_SYSTEM/readphs.cpp =================================================================== --- trunk/proto/PHYS_SYSTEM/readphs.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/proto/PHYS_SYSTEM/readphs.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -70,7 +70,7 @@ } t_subObject; -typedef struct { +typedef struct { // Size is fixed at 20 bytes! uint32 contact_type; // 1-5? uint32 object_num; uint32 unknown; @@ -79,16 +79,21 @@ /* PHYS. OBJECT FLAGS */ -#define PHYS_OBJ_INACTIVE 0x0000004 -#define PHYS_OBJ_PLAYER 0x0000008 -#define PHYS_OBJ_SLEEPING 0x0000080 -#define PHYS_OBJ_ROPE 0x0001000 -#define PHYS_OBJ_DEPLOYED_ROPE 0x0004000 -#define PHYS_FACE_VEL 0x0040000 -#define PHYS_OBJ_MTERRAIN 0x0100000 -#define PHYS_OBJ_DOOR 0x0200000 -#define PHYS_AI_COLLIDE 0x0400000 // Originally pPhysAICollideProp? -#define PHYS_OBJ_PROJECTILE 0x0800000 +#define PHYS_OBJ_INACTIVE 0x000000004 +#define PHYS_OBJ_TRANSLATING 0x000000200 +#define PHYS_OBJ_PLAYER 0x000000800 +#define PHYS_OBJ_SLEEPING 0x000000080 +#define PHYS_OBJ_PPLATE 0x000008000 +#define PHYS_OBJ_ROPE 0x000001000 +#define PHYS_OBJ_DEPLOYED_ROPE 0x000004000 +#define PHYS_FACE_VEL 0x000040000 +#define PHYS_OBJ_MTERRAIN 0x000100000 +#define PHYS_OBJ_DOOR 0x000200000 +#define PHYS_AI_COLLIDE 0x000400000 // Originally pPhysAICollideProp? +#define PHYS_OBJ_PROJECTILE 0x000800000 +// This thing is set on objects that should collide with player as if with maximal radius 1.0f +// TODO: Which one is the one? +#define PHYS_OBJ_PROJECTILE1 0x010000000 /* Control flags*/ #define CF_LOC_CTRL 4 @@ -571,7 +576,7 @@ fpos(f); - printf("\tCOG Offset : "); readVector3(f); + printf("\tCOG Offset : "); readVector3(f); // nope? // Sub Object direction Vectors (translations from the center) fpos(f); Modified: trunk/src/base/dyntype/DTypeDef.cpp =================================================================== --- trunk/src/base/dyntype/DTypeDef.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/dyntype/DTypeDef.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -47,7 +47,6 @@ using Ogre::Math; using Ogre::Radian; using Ogre::Matrix3; -using Ogre::Quaternion; namespace Opde { class DTypeDef; Modified: trunk/src/base/dyntype/DTypeDef.h =================================================================== --- trunk/src/base/dyntype/DTypeDef.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/dyntype/DTypeDef.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -36,7 +36,7 @@ #include <typeinfo> #include <sstream> -#include "vector3.h" +#include "Vector3.h" #include "integers.h" #include "SharedPtr.h" #include "DVariant.h" Modified: trunk/src/base/dyntype/DVariant.h =================================================================== --- trunk/src/base/dyntype/DVariant.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/dyntype/DVariant.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -28,8 +28,9 @@ #include "config.h" #include <stdexcept> -#include "vector3.h" #include "integers.h" +#include "Vector3.h" +#include "Quaternion.h" #include "OpdeException.h" #include <OgreQuaternion.h> Modified: trunk/src/base/dyntype/Serializer.h =================================================================== --- trunk/src/base/dyntype/Serializer.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/dyntype/Serializer.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -27,12 +27,12 @@ #include "compat.h" #include <OgreMatrix3.h> -#include <OgreQuaternion.h> +#include "Quaternion.h" #include <OgreMath.h> #include "File.h" #include "NonCopyable.h" -#include "vector3.h" +#include "Vector3.h" namespace Opde { /// Data serializer - used to fill the values of data based on File contents, and the other way round Modified: trunk/src/base/file/File.cpp =================================================================== --- trunk/src/base/file/File.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/file/File.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -181,6 +181,13 @@ } //------------------------------------ + File& operator<<(File& st, bool val) { + int32_t vi = val ? 1 : 0; + st.writeElem(&vi, sizeof(int32_t)); + return st; + } + + //------------------------------------ File& operator>>(File& st, uint8_t& val) { st.read(&val, sizeof(uint8_t)); return st; @@ -222,6 +229,17 @@ return st; } + //------------------------------------ + File& operator>>(File& st, bool& val) { + // Okay okay, I just don't wan't + // to guarantee bool is 32bit on all platforms + + int vi; + st.readElem(&vi, sizeof(int32_t)); + val = vi; + return st; + } + /*------------------------------------------------------*/ /*---------------------- StdFile -----------------------*/ /*------------------------------------------------------*/ Modified: trunk/src/base/file/File.h =================================================================== --- trunk/src/base/file/File.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/file/File.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -27,8 +27,9 @@ #include "config.h" +#include <OgreDataStream.h> + #include "OpdeException.h" -#include "OgreDataStream.h" #include "SharedPtr.h" #include "integers.h" #include <fstream> @@ -180,6 +181,7 @@ File& operator<<(File& st, uint32_t val); File& operator<<(File& st, int32_t val); File& operator<<(File& st, float val); + File& operator<<(File& st, bool val); File& operator>>(File& st, uint8_t& val); File& operator>>(File& st, int8_t& val); @@ -188,8 +190,8 @@ File& operator>>(File& st, uint32_t& val); File& operator>>(File& st, int32_t& val); File& operator>>(File& st, float& val); + File& operator>>(File& st, bool& val); - /** Shared file pointer */ typedef shared_ptr<File> FilePtr; Modified: trunk/src/base/file/FileCompat.cpp =================================================================== --- trunk/src/base/file/FileCompat.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/file/FileCompat.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -27,41 +27,84 @@ #include "config.h" + +#include <OgreMatrix3.h> +#include <OgreMath.h> #include "FileCompat.h" namespace Opde { // Vector2 - File& operator<<(File& st, const Ogre::Vector2& val) { + File& operator<<(File& st, const Vector2& val) { st << val.x << val.y; return st; } - File& operator>>(File& st, Ogre::Vector2& val) { + File& operator>>(File& st, Vector2& val) { st >> val.x >> val.y; return st; } // Vector3 - File& operator<<(File& st, const Ogre::Vector3& val) { + File& operator<<(File& st, const Vector3& val) { st << val.x << val.y << val.z; return st; } - File& operator>>(File& st, Ogre::Vector3& val) { + File& operator>>(File& st, Vector3& val) { st >> val.x >> val.y >> val.z; return st; } // Plane - File& operator<<(File& st, const Ogre::Plane& val) { + File& operator<<(File& st, const Plane& val) { st << val.normal << val.d; return st; } - File& operator>>(File& st, Ogre::Plane& val) { + File& operator>>(File& st, Plane& val) { st >> val.normal >> val.d; return st; } + + File& operator<<(File& st, const Quaternion& val) { + int16_t xi,yi,zi; + Ogre::Matrix3 m; + + val.ToRotationMatrix(m); + + Ogre::Radian x,y,z; + + m.ToEulerAnglesZYX(z, y, x); + + xi = static_cast<int16_t>(x.valueRadians() * 32768 / Ogre::Math::PI); + yi = static_cast<int16_t>(y.valueRadians() * 32768 / Ogre::Math::PI); + zi = static_cast<int16_t>(z.valueRadians() * 32768 / Ogre::Math::PI); + + st << xi << yi << zi; + + return st; + } + + File& operator>>(File& st, Quaternion& val) { + int16_t xi,yi,zi; + float x,y,z; + + st >> xi >> yi >> zi; + + x = ((float)(xi) / 32768) * Ogre::Math::PI; + y = ((float)(yi) / 32768) * Ogre::Math::PI; + z = ((float)(zi) / 32768) * Ogre::Math::PI; + + Ogre::Matrix3 m; + + // Still not there, but close + m.FromEulerAnglesZYX(Ogre::Radian(z), Ogre::Radian(y), Ogre::Radian(x)); + Quaternion q; + val.FromRotationMatrix(m); + + return st; + } + } Modified: trunk/src/base/file/FileCompat.h =================================================================== --- trunk/src/base/file/FileCompat.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/base/file/FileCompat.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -31,22 +31,27 @@ #include "config.h" #include "File.h" -#include <OgreVector2.h> -#include <OgreVector3.h> -#include <OgrePlane.h> +#include "Vector2.h" +#include "Vector3.h" +#include "Plane.h" +#include "Quaternion.h" namespace Opde { // Vector2 - File& operator<<(File& st, const Ogre::Vector2& val); - File& operator>>(File& st, Ogre::Vector2& val); + File& operator<<(File& st, const Vector2& val); + File& operator>>(File& st, Vector2& val); // Vector3 - File& operator<<(File& st, const Ogre::Vector3& val); - File& operator>>(File& st, Ogre::Vector3& val); + File& operator<<(File& st, const Vector3& val); + File& operator>>(File& st, Vector3& val); // Plane - File& operator<<(File& st, const Ogre::Plane& val); - File& operator>>(File& st, Ogre::Plane& val); + File& operator<<(File& st, const Plane& val); + File& operator>>(File& st, Plane& val); + + // Quaternion + File& operator<<(File& st, const Quaternion& val); + File& operator>>(File& st, Quaternion& val); } #endif Deleted: trunk/src/compat/vector3.h =================================================================== --- trunk/src/compat/vector3.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/compat/vector3.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -1,32 +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 - * - *****************************************************************************/ - -#ifndef __VECTOR3_H -#define __VECTOR3_H - -#include <OgreVector3.h> - -namespace Opde { - typedef Ogre::Vector3 Vector3; -} - -#endif - Modified: trunk/src/main/GameStateManager.cpp =================================================================== --- trunk/src/main/GameStateManager.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/main/GameStateManager.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -152,6 +152,7 @@ mConfigService = GET_SERVICE(ConfigService); + // TODO: Temporary till we come up with a commandline parsing ability mConfigService->setConfigPathOverride("."); mConfigService->loadParams("opde.cfg"); Modified: trunk/src/services/material/MaterialService.cpp =================================================================== --- trunk/src/services/material/MaterialService.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/material/MaterialService.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -193,6 +193,8 @@ //------------------------------------------------------ void MaterialService::addWorldMaterialTemplate(unsigned int idx, const Ogre::MaterialPtr& material) { + assert(!material.isNull()); + mTemplateMaterials.insert(make_pair(idx, material)); TextureDimensions2D dimensions; @@ -203,14 +205,17 @@ if (material->getNumTechniques() > 0) { Pass *shadPass = material->getTechnique(0)->getPass(0); - - // TXT scale to fit the size texture had originally if (shadPass->getNumTextureUnitStates() > 0) { + TextureUnitState* tus = shadPass->getTextureUnitState(0); - if (shadPass->getNumTextureUnitStates() > 0) { - TextureUnitState* tus = shadPass->getTextureUnitState(0); - - try { + try { + // ensure the material is loaded before getting the dimensions + material->escalateLoading(); + + // This is stupid, but can happen - the getTextureDimensions seems buggy in this regard + if (tus->getNumFrames() <= 0) { + LOG_ERROR("MaterialService: Error getting texture dimensions (Mat. %s) : Zero frame count!", material->getName().c_str()); + } else { dimensions = tus->getTextureDimensions(); // register the scale @@ -228,10 +233,10 @@ dimensions.first = static_cast<unsigned int> (tscale.first * dimensions.first); dimensions.second = static_cast<unsigned int> (tscale.second * dimensions.second); - } catch (Ogre::Exception &e) { - // Nothing, just log it could not be done - LOG_ERROR("MaterialService: Error getting texture dimensions : %s", e.getFullDescription().c_str()); } + } catch (Ogre::Exception &e) { + // Nothing, just log it could not be done + LOG_ERROR("MaterialService: Error getting texture dimensions : %s", e.getFullDescription().c_str()); } } } @@ -432,22 +437,26 @@ std::string matname("water/"); matname += flows.flow[fnum].name; + LOG_INFO("MaterialService::loadFlowTextures: Loading flow %d : %d/%d '%s'", fnum, flows.flow[fnum].in_texture, flows.flow[fnum].out_texture, matname.c_str()); + // 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; + StringUtil::StrStreamType strb; + strb << "@template" << flows.flow[fnum].in_texture; + + std::string templn(strb.str()); - if (MaterialManager::getSingleton().resourceExists(matName.str())) { - MaterialManager::getSingleton().remove(matName.str()); + if (MaterialManager::getSingleton().resourceExists(templn)) { + MaterialManager::getSingleton().remove(templn); } - MaterialPtr shadMat = origMat->clone(matName.str()); + MaterialPtr shadMat = origMat->clone(templn); shadMat->load(); - + addWorldMaterialTemplate(flows.flow[fnum].in_texture, shadMat); - LOG_INFO("Flow now defined : %s (template %s_in)", matName.str().c_str(), matname.c_str()); + LOG_INFO("Flow now defined : %s (template %s_in)", templn.c_str(), matname.c_str()); } else { LOG_ERROR("Material not found : %s_in", matname.c_str()); } @@ -457,18 +466,20 @@ if (MaterialManager::getSingleton().resourceExists(matname + "_out")) { MaterialPtr origMat = MaterialManager::getSingleton().getByName(matname + "_out"); - StringUtil::StrStreamType matName; - matName << "@template" << flows.flow[fnum].out_texture; + StringUtil::StrStreamType strb; + strb << "@template" << flows.flow[fnum].in_texture; + + std::string templn(strb.str()); - if (MaterialManager::getSingleton().resourceExists(matName.str())) { - MaterialManager::getSingleton().remove(matName.str()); + if (MaterialManager::getSingleton().resourceExists(templn)) { + MaterialManager::getSingleton().remove(templn); } - MaterialPtr shadMat = origMat->clone(matName.str()); + MaterialPtr shadMat = origMat->clone(templn); shadMat->load(); addWorldMaterialTemplate(flows.flow[fnum].out_texture, shadMat); - LOG_INFO("Flow now defined : %s (template %s_in)", matName.str().c_str(), matname.c_str()); + LOG_INFO("Flow now defined : %s (template %s_in)", templn.c_str(), matname.c_str()); } else { LOG_ERROR("Material not found : %s_out", matname.c_str()); } Added: trunk/src/services/physics/PhysCommon.cpp =================================================================== --- trunk/src/services/physics/PhysCommon.cpp (rev 0) +++ trunk/src/services/physics/PhysCommon.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -0,0 +1,76 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#include "PhysCommon.h" +#include "File.h" +#include "FileCompat.h" +#include "integers.h" + +namespace Opde { + /*----------------------------------------------------*/ + /*----------------- PhysCompat helpers ---------------*/ + /*----------------------------------------------------*/ + + File& operator<<(File& st, const PhysLocation& val) { + st << val.location + << val.state1 + << val.state2 + << val.facing; + + return st; + } + + File& operator>>(File& st, PhysLocation& val) { + st >> val.location >> val.state1 >> val.state2 >> val.facing; + + return st; + } + + File& operator<<(File& st, const SubModel& val) { + st << val.location + << val.end_location + << val.target_location + << val.unknown; + + // 32bit pointer. skipped + st << uint32_t(0); + + return st; + } + + File& operator>>(File& st, SubModel& val) { + st >> val.location + >> val.end_location + >> val.target_location + >> val.unknown; + + // value of the owner is not read, ignored + val.owner = NULL; + + // this is just to skip the owner pointer + uint32_t vl = 0; + st >> vl; + + return st; + } +} \ No newline at end of file Property changes on: trunk/src/services/physics/PhysCommon.cpp ___________________________________________________________________ Added: svn:eol-style + native Added: trunk/src/services/physics/PhysCommon.h =================================================================== --- trunk/src/services/physics/PhysCommon.h (rev 0) +++ trunk/src/services/physics/PhysCommon.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -0,0 +1,79 @@ +/****************************************************************************** + * + * This file is part of openDarkEngine project + * Copyright (C) 2005-2009 openDarkEngine team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + * + *****************************************************************************/ + +#ifndef __PHYSCOMMON_H +#define __PHYSCOMMON_H + +#include "compat.h" +#include "integers.h" +#include "Vector3.h" +#include "Quaternion.h" + +namespace Opde { + // Forward decls. + class PhysModel; + class File; + + /// Phys model flags. Incomplete & may be wrong + typedef enum { + PHYS_MDL_INACTIVE = 0x000000004, + PHYS_MDL_MOVABLE = 0x000000200, + PHYS_MDL_PLAYER = 0x000000800, + PHYS_MDL_SLEEPING = 0x000000080, + PHYS_MDL_PPLATE = 0x000008000, + PHYS_MDL_ROPE = 0x000001000, + /// Deployed rope + PHYS_MDL_DEPL_ROPE = 0x000004000, + PHYS_MDL_FACE_VEL = 0x000040000, + PHYS_MDL_MTERRAIN = 0x000100000, + PHYS_MDL_DOOR = 0x000200000, + PHYS_MDL_AI_COLLIDE = 0x000400000, + PHYS_MDL_PROJECTILE = 0x000800000, + /// Flag indicating the refs should be updated - ignored here + PHYS_MDL_UPDATEREFS = 0x002000000 + } PhysModelFlags; + + struct PhysLocation { + Vector3 location; + int16_t state1; // unknown - some kind of manipulation is done on every location setting + int16_t state2; + Quaternion facing; + }; + + struct SubModel { + PhysLocation location; + PhysLocation end_location; + PhysLocation target_location; + + uint16_t unknown; // Maybe cell id? + PhysModel* owner; + }; + + File& operator<<(File& st, const PhysLocation& val); + File& operator>>(File& st, PhysLocation& val); + + File& operator<<(File& st, const SubModel& val); + File& operator>>(File& st, SubModel& val); +}; + +#endif \ No newline at end of file Property changes on: trunk/src/services/physics/PhysCommon.h ___________________________________________________________________ Added: svn:eol-style + native Modified: trunk/src/services/physics/PhysModel.cpp =================================================================== --- trunk/src/services/physics/PhysModel.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/physics/PhysModel.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -25,6 +25,7 @@ #include "PhysModel.h" #include "logger.h" #include "File.h" +#include "FileCompat.h" #include "PhysSphereModel.h" #include "PhysOBBModel.h" @@ -54,21 +55,18 @@ //------------------------------------------------------ PhysModel::~PhysModel() { - // Delete all the data used - delete mSubModelTypes; - mSubModelTypes = NULL; - - delete mSprings; - mSprings = NULL; + clear(); } //------------------------------------------------------ void PhysModel::read(const FilePtr& sf, unsigned int physVersion) { STUB_WARN(); + clear(); + *sf >> mObjectID >> mSubModelCount >> mFlags >> mGravity; - delete[] mSubModelTypes; + // TODO: FaceVel, MovingTerrain and Door (2z) properties to set the flags mSubModelTypes = new uint32_t[mSubModelCount]; for (size_t n = 0; n < mSubModelCount; ++n) @@ -77,7 +75,6 @@ *sf >> mFriction >> mMediaType; // spring parameters - delete[] mSprings; mSprings = new Spring[mSubModelCount]; for (size_t n = 0; n < mSubModelCount; ++n) { @@ -86,28 +83,69 @@ // some unknown 3 fields uint32_t unk; - *sf >> unk; - *sf >> unk; + *sf >> mRopeVsTerrain; // Rope v.s. terrain bool + *sf >> mTime; // Dunno what exactly this is + // attachment related (nonzero if attachments are in use) *sf >> mPhysAttachments; - *sf >> mPhysAttached; + *sf >> mPhysAttached; // Could be bool, eh? // flags for rotation and resting - *sf >> mRotFlags >> mRestFlags; + *sf >> mRotAxes >> mRestAxes; - // TODO: another set of attachment data - *sf >> unk >> unk >> unk; + // Rope attachment. + *sf >> mRopeAttObjID >> mRopeAttSubModel >> mRopeSegPos; // mantling state (T2 and such) if (physVersion >= 32) { *sf >> mMantlingState; + *sf >> mMantlingVec; } - // TODO: Unknowns: 4 floats, one integer - *sf >> unk >> unk >> unk >> unk >> unk; + // Dunno what this is... + *sf >> unk >> unk; + // SubModels... + mSubModels.grow(mSubModelCount); + for (unsigned int i = 0; i < mSubModelCount; ++i) { + SubModel& sm = mSubModels[i]; + *sf >> sm; + + // fix the owner + sm.owner = this; + } + + *sf >> mMainSubModel; + + // Following are what seems to be relative submodel positions + for (unsigned int i = 0; i < mSubModelCount; ++i) { + *sf >> mRelPos[i]; + } + + // translation limit for pplate - if such exists + if (mFlags & PHYS_MDL_PPLATE) { + // see of there is a translation limit + uint32_t stat; + + *sf >> stat; + + // this logic is in the original... + if ((stat == 3) || (stat == 2)) { + Vector3 transl; + + *sf >> transl; + + // TODO: addTranslationLimit(transl); + } + } + + // Dynamics follow + + // Rot vel. controls. + + // only after this block, the object type specific parameters are read - e,g, here } //------------------------------------------------------ @@ -139,4 +177,16 @@ * mIsAsleep? */ } + + //------------------------------------------------------ + void PhysModel::clear(void) { + // Delete all the data used + delete mSubModelTypes; + mSubModelTypes = NULL; + + delete mSprings; + mSprings = NULL; + + mSubModels.clear(); + } } \ No newline at end of file Modified: trunk/src/services/physics/PhysModel.h =================================================================== --- trunk/src/services/physics/PhysModel.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/physics/PhysModel.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -26,16 +26,31 @@ #include "integers.h" #include "File.h" +#include "PhysCommon.h" +#include "Array.h" namespace Opde { - /** @brief Physics model. Contains all data on physics for particular object + /** @brief Physics model. Contains all data on physics for particular object (Both static and dynamic). + * This class presents the encapsulation of the whole physical definition of the given object. + * Internally, this class is a composition of a multiple of other classes, logically separating the + * different aspects of the physical behavior of the model. */ class OPDELIB_EXPORT PhysModel { public: PhysModel(int objid); ~PhysModel(); + /** standard read method. Additional parameter indicates which physics version we are using. + * @note This method should be called prior to the specializations used in various phys. model types,\ + * as in the file the common parameters precede the special ones. + * @param sf The file stream to read from + * @param physVersion The version of the PHYS_SYSTEM chunk(tag file) as indicated by it's header + */ virtual void read(const FilePtr& sf, unsigned int physVersion); + + /** Writes the physical model object back to a file. + * @see read For comments. + */ virtual void write(const FilePtr& sf, unsigned int physVersion); /// @return the object id of this model @@ -58,6 +73,7 @@ void setSleep(bool sleep); protected: + void clear(void); int32_t mObjectID; uint32_t mSubModelCount; @@ -69,17 +85,48 @@ * Mapping: 3->8, 2->1, 1->0, otherwise it stays the same */ int32_t mMediaType; + Spring *mSprings; + + /// Some frame time accumulator + float mTime; + + /// @todo Unknown meaning + bool mRopeVsTerrain; + /// nonzero if the object has attachments uint32_t mPhysAttachments; + /// nonzero if the object is attached uint32_t mPhysAttached; + /// Rotational flags - uint32_t mRotFlags; + uint32_t mRotAxes; + /// Resting flags - uint32_t mRestFlags; + uint32_t mRestAxes; + /// Mantling state uint32_t mMantlingState; + + /// Mantling related vector (or so it seems) + Vector3 mMantlingVec; + + /// This contains the positions and orientations of SubModels + SimpleArray<SubModel> mSubModels; + SubModel mMainSubModel; + + /// relative submodel positions + SimpleArray<Vector3> mRelPos; + + /// Object to which this one is attached (rope climbing) + int32_t mRopeAttObjID; + + /// Submodel of the rope attachment + int32_t mRopeAttSubModel; + + /// Position on the rope, between the two specified rope segments (i.e. mRopeAttSubModel && mRopeAttSubModel-1) + float mRopeSegPos; }; }; Modified: trunk/src/services/physics/PhysicsService.cpp =================================================================== --- trunk/src/services/physics/PhysicsService.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/physics/PhysicsService.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -30,10 +30,7 @@ #include "PhysModel.h" #include "PhysModels.h" - using namespace std; -using Ogre::Quaternion; -using Ogre::Vector3; namespace Opde { @@ -158,14 +155,14 @@ } //------------------------------------------------------ - const Ogre::Vector3& PhysicsService::getSubModelPosition(int objId, size_t submdl) { + const Vector3& PhysicsService::getSubModelPosition(int objId, size_t submdl) { // TODO: Stub. Code STUB_WARN(); return Vector3::ZERO; } //------------------------------------------------------ - const Ogre::Quaternion& PhysicsService::getSubModelOrientation(int objId, size_t submdl) { + const Quaternion& PhysicsService::getSubModelOrientation(int objId, size_t submdl) { // TODO: Stub. Code STUB_WARN(); return Quaternion::IDENTITY; Modified: trunk/src/services/physics/PhysicsService.h =================================================================== --- trunk/src/services/physics/PhysicsService.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/physics/PhysicsService.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -33,10 +33,10 @@ #include "FileGroup.h" #include "SharedPtr.h" #include "PhysModels.h" +#include "Vector3.h" +#include "Quaternion.h" #include <ode/ode.h> -#include <OgreVector3.h> -#include <OgreQuaternion.h> namespace Opde { @@ -67,20 +67,20 @@ * @param objId the object id * @param submdl the submodel id * @return Position if the given submodel exists, otherwise Vector3::ZERO */ - const Ogre::Vector3& getSubModelPosition(int objId, size_t submdl); + const Vector3& getSubModelPosition(int objId, size_t submdl); /** Returns the orientation of given submodel if exists * @param objId the object id * @param submdl the submodel id * @return Orientation if the given submodel exists, otherwise Quaternion::IDENTITY */ - const Ogre::Quaternion& getSubModelOrientation(int objId, size_t submdl); + const Quaternion& getSubModelOrientation(int objId, size_t submdl); /** Sets the given submodel orientation * @param objId the object id * @param submdl the submodel id * @param rot the rotation to set * @return true if the value was set */ - void setSubModelOrientation(int objId, size_t submdl, const Ogre::Quaternion& rot); + void setSubModelOrientation(int objId, size_t submdl, const Quaternion& rot); protected: bool init(); Modified: trunk/src/services/physics/config.cmake =================================================================== --- trunk/src/services/physics/config.cmake 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/physics/config.cmake 2010-08-27 08:32:46 UTC (rev 1322) @@ -9,4 +9,6 @@ LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/physics/PhysBSPModel.cpp) LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/physics/PhysBSPModel.h) LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/physics/PhysModels.cpp) -LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/physics/PhysModels.h) \ No newline at end of file +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/physics/PhysModels.h) +LIST(APPEND OPDE_SERVICE_SOURCES ${OPDE_SOURCE_DIR}/src/services/physics/PhysCommon.cpp) +LIST(APPEND OPDE_SERVICE_HEADERS ${OPDE_SOURCE_DIR}/src/services/physics/PhysCommon.h) \ No newline at end of file Modified: trunk/src/services/render/RenderService.h =================================================================== --- trunk/src/services/render/RenderService.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/render/RenderService.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -93,7 +93,7 @@ void setSkip(bool _skip); void setAlpha(float alpha); void setZBias(size_t bias); - void setScale(const Ogre::Vector3& scale); + void setScale(const Vector3& scale); void setEntity(Ogre::Entity* newEntity); Modified: trunk/src/services/room/Room.cpp =================================================================== --- trunk/src/services/room/Room.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/room/Room.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -135,10 +135,10 @@ //------------------------------------------------------ - bool Room::isInside(const Ogre::Vector3& point) { + bool Room::isInside(const Vector3& point) { // iterate over all the planes. Have to have positive side for (size_t i = 0; i < 6;++i) { - if (mPlanes[i].getSide(point) == Ogre::Plane::NEGATIVE_SIDE) + if (mPlanes[i].getSide(point) == Plane::NEGATIVE_SIDE) return false; } @@ -146,7 +146,7 @@ } //------------------------------------------------------ - RoomPortal* Room::getPortalForPoint(const Ogre::Vector3& pos) { + RoomPortal* Room::getPortalForPoint(const Vector3& pos) { for (size_t i = 0; i < mPortalCount; ++i) { RoomPortal * rp = mPortals[i]; if (rp->isInside(pos)) @@ -180,7 +180,7 @@ void Room::clear() { mObjectID = 0; mRoomID = 0; - mCenter = Ogre::Vector3::ZERO; + mCenter = Vector3::ZERO; for (size_t i = 0; i < mPortalCount; ++i) delete mPortals[i]; Modified: trunk/src/services/room/Room.h =================================================================== --- trunk/src/services/room/Room.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/room/Room.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -33,11 +33,10 @@ #include "RoomCommon.h" #include "File.h" #include "Array.h" +#include "Vector3.h" +#include "Quaternion.h" +#include "Plane.h" -#include <OgreVector3.h> -#include <OgrePlane.h> - - namespace Opde { /** @brief A single Room. Rooms are space bounded elements that are used * for sound propagation, path finding and as a script message sources. @@ -53,12 +52,12 @@ int32_t getObjectID() const { return mObjectID; }; int16_t getRoomID() const { return mRoomID; }; - bool isInside(const Ogre::Vector3& point); + bool isInside(const Vector3& point); /** Gets portal for a given position * @param pos The position to find portal for * @return RoomPortal for the given point, or NULL if none found */ - RoomPortal* getPortalForPoint(const Ogre::Vector3& pos); + RoomPortal* getPortalForPoint(const Vector3& pos); /** Attaches the given object to the room (into specified id set) * @param idset the id set to use (0/1 typically) @@ -84,9 +83,9 @@ /// Room number int16_t mRoomID; /// Center point of the room. Should not be in solid space or overlapping another room - Ogre::Vector3 mCenter; + Vector3 mCenter; /// Bounding box as described by 6 enclosing planes - Ogre::Plane mPlanes[6]; + Plane mPlanes[6]; /// Portal count uint32_t mPortalCount; /// Portal list Modified: trunk/src/services/room/RoomPortal.cpp =================================================================== --- trunk/src/services/room/RoomPortal.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/room/RoomPortal.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -80,10 +80,10 @@ } //------------------------------------------------------ - bool RoomPortal::isInside(const Ogre::Vector3& point) { + bool RoomPortal::isInside(const Vector3& point) { // iterate over all the planes. Have to have positive side for (size_t i = 0; i < mEdgeCount;++i) { - if (mEdges[i].getSide(point) == Ogre::Plane::NEGATIVE_SIDE) + if (mEdges[i].getSide(point) == Plane::NEGATIVE_SIDE) return false; } @@ -94,12 +94,12 @@ void RoomPortal::clear() { mID = 0; mIndex = 0; - mPlane = Ogre::Plane(); + mPlane = Plane(); mEdgeCount = 0; mEdges.clear(); mSrcRoom = NULL; mDestRoom = NULL; - mCenter = Ogre::Vector3::ZERO; + mCenter = Vector3::ZERO; mDestPortal = 0; } Modified: trunk/src/services/room/RoomPortal.h =================================================================== --- trunk/src/services/room/RoomPortal.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/room/RoomPortal.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -32,8 +32,8 @@ #include "File.h" #include "Array.h" -#include <OgreVector3.h> -#include <OgrePlane.h> +#include "Vector3.h" +#include "Plane.h" namespace Opde { /** @brief A room portal. Room portals connect two Room instances (doorways) @@ -49,7 +49,7 @@ /// writes the room portal into the specified file void write(const FilePtr& sf); - bool isInside(const Ogre::Vector3& point); + bool isInside(const Vector3& point); /// getter for the room that is the target of this portal inline Room* getFarRoom() const { return mDestRoom; }; @@ -67,18 +67,18 @@ /// The index of this portal in the room's portal list uint32_t mIndex; /// Plane this portal lies on - Ogre::Plane mPlane; + Plane mPlane; /// Number of portal edges uint32_t mEdgeCount; /// Plane list - planes that make up the portal - SimpleArray<Ogre::Plane> mEdges; + SimpleArray<Plane> mEdges; // Source and destination rooms /// room number this portal goes to Room* mDestRoom; /// the source room number Room* mSrcRoom; /// center point of the portal. (should not be in solid space) - Ogre::Vector3 mCenter; + Vector3 mCenter; /// portal ID on the other side of this portal int32_t mDestPortal; }; Modified: trunk/src/services/room/RoomService.cpp =================================================================== --- trunk/src/services/room/RoomService.cpp 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/room/RoomService.cpp 2010-08-27 08:32:46 UTC (rev 1322) @@ -52,7 +52,7 @@ } //------------------------------------------------------ - Room* RoomService::findObjRoom(size_t idset, int objID, const Ogre::Vector3& pos) { + Room* RoomService::findObjRoom(size_t idset, int objID, const Vector3& pos) { Room* r = roomFromPoint(pos); if (r) { @@ -65,7 +65,7 @@ } //------------------------------------------------------ - Room* RoomService::roomFromPoint(const Ogre::Vector3& pos) { + Room* RoomService::roomFromPoint(const Vector3& pos) { // iterate through all rooms.... RoomsByID::iterator it, end = mRoomsByID.end(); @@ -81,7 +81,7 @@ } //------------------------------------------------------ - void RoomService::updateObjRoom(size_t idset, int objID, const Ogre::Vector3& pos) { + void RoomService::updateObjRoom(size_t idset, int objID, const Vector3& pos) { // suppose we have a room? Room* r = getCurrentObjRoom(idset, objID); Modified: trunk/src/services/room/RoomService.h =================================================================== --- trunk/src/services/room/RoomService.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/room/RoomService.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -32,6 +32,7 @@ #include "DatabaseService.h" #include "FileGroup.h" #include "SharedPtr.h" +#include "Vector3.h" namespace Opde { /** @brief Room service - service providing a Room database. @@ -55,20 +56,20 @@ * @param pos The position of the object * @return Room pointer if room was found, NULL otherwise */ - Room* findObjRoom(size_t idset, int objID, const Ogre::Vector3& pos); + Room* findObjRoom(size_t idset, int objID, const Vector3& pos); /** Finds a room which encloses the specified point * @param pos The position to locate room for * @return Room pointer if the position is enclosed in a room, NULL otherwise */ - Room* roomFromPoint(const Ogre::Vector3& pos); + Room* roomFromPoint(const Vector3& pos); /** Updates the object's room (preferably incrementally without doing room search) * @param idset The id set to use (typically 0-objects, 1-AI) * @param objID The id of the object to track down * @param pos The position of the object */ - void updateObjRoom(size_t idset, int objID, const Ogre::Vector3& pos); + void updateObjRoom(size_t idset, int objID, const Vector3& pos); /** Attaches the specified object to a room instance * @param idset the object id set Modified: trunk/src/services/worldrep/WRCell.h =================================================================== --- trunk/src/services/worldrep/WRCell.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/worldrep/WRCell.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -68,7 +68,7 @@ WRCellHeader mHeader; /** the list of the cell's vertices (count is in the header) */ - Ogre::Vector3 *mVertices; + Vector3 *mVertices; /** the list of the polygon map headers */ WRPolygon *mFaceMaps; @@ -81,7 +81,7 @@ uint8_t **mPolyIndices; /** Planes forming the cell */ - Ogre::Plane *mPlanes; + Plane *mPlanes; /** Indicates the fact that the cell data have already been loaded */ bool mLoaded; Modified: trunk/src/services/worldrep/WRTypes.h =================================================================== --- trunk/src/services/worldrep/WRTypes.h 2010-08-27 08:30:38 UTC (rev 1321) +++ trunk/src/services/worldrep/WRTypes.h 2010-08-27 08:32:46 UTC (rev 1322) @@ -31,7 +31,7 @@ #include "File.h" #include "FileCompat.h" -#include <OgreVector3.h> +#include "Vector3.h" // the only one which collided is wr_cell_hdr, but to be sure... #pragma pack(push, 1) @@ -70,7 +70,7 @@ uint8_t flowGroup; // 0-no flow group, otherwise the flow group no. // cell's bounding sphere - Ogre::Vector3 center; + Vector3 center; float radius; // Only an approximation, but enough to guarantee that every point in the cell is enclosed by this sphere. friend File& operator<<(File& st, const WRCellHeader& ch) { @@ -109,8 +109,8 @@ }; struct WRPolygonTexturing { // SIZE: 12+12+12+12 = 48 - Ogre::Vector3 axisU; // U axis - Ogre::Vector3 axisV; // V axis - both directions of texture growth (e.g. U axis and V axis) - and they are not normalised! (in some way related to scale) + Vector3 axisU; // U axis + Vector3 axisV; // V axis - both directions of texture growth (e.g. U axis and V axis) - and they are not normalised! (in some way related to scale) int16_t u; // txt shift u (must divide by 1024 to get float number (and I dunno why, I had to invert it too)) int16_t v; // txt shift v @@ -120,7 +120,7 @@ uint16_t unk; // something related to texture cache float scale; // scale of the texture - Ogre::Vector3 center; + Vector3 center; friend File& operator<<(File& st, const WRPolygonTexturing& ch) { st << ch.axisU << ch.axisV << ch.u << ch.v << ch.txt << ch.originVertex << ch.unk << ch.scale << ch.center; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <vo...@us...> - 2010-09-05 11:52:32
|
Revision: 1325 http://opde.svn.sourceforge.net/opde/?rev=1325&view=rev Author: volca Date: 2010-09-05 11:52:26 +0000 (Sun, 05 Sep 2010) Log Message: ----------- Formating: astyle options file, dev. comment on formatting Modified Paths: -------------- trunk/doc/DEVELOPERS Added Paths: ----------- trunk/scripts/astyle.conf Modified: trunk/doc/DEVELOPERS =================================================================== --- trunk/doc/DEVELOPERS 2010-09-05 11:51:33 UTC (rev 1324) +++ trunk/doc/DEVELOPERS 2010-09-05 11:52:26 UTC (rev 1325) @@ -21,6 +21,8 @@ * Think about the way the code looks - will it be readable by others? * Test before commiting * Think twice, code once :) +* Formatting, simply put - every curly brace indents, curly braces do not break (on the same line) + - if not sure, use astyle with scripts/astyle.conf as options file (astyle --options=SOME_PATH/scripts/astyle.conf file.cpp) Be sure to update ChangeLog file sometimes. On linux, it can be updated using svn2cl script. Added: trunk/scripts/astyle.conf =================================================================== --- trunk/scripts/astyle.conf (rev 0) +++ trunk/scripts/astyle.conf 2010-09-05 11:52:26 UTC (rev 1325) @@ -0,0 +1,11 @@ +-C +-S +-G +-N +-a +--mode=c +-t8 +-T +-U +-A2 +-E Property changes on: trunk/scripts/astyle.conf ___________________________________________________________________ Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |