Core/Collision: Models with flag MOD_M2

Mostly trees, among some other objects should not be taken into account
for LoS checks, this check does not apply to gameobjects (yet)
This commit is contained in:
stormrage-project 2015-09-05 09:28:37 +02:00 committed by Antz
parent 24b2e50158
commit 4d3c02379c
5 changed files with 14 additions and 4 deletions

View File

@ -313,7 +313,7 @@ namespace VMAP
#endif #endif
if (!iIsTiled && ModelSpawn::readFromFile(rf, spawn)) if (!iIsTiled && ModelSpawn::readFromFile(rf, spawn))
{ {
WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name); WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name, spawn.flags);
DEBUG_FILTER_LOG(LOG_FILTER_MAP_LOADING, "StaticMapTree::InitMap(): loading %s", spawn.name.c_str()); DEBUG_FILTER_LOG(LOG_FILTER_MAP_LOADING, "StaticMapTree::InitMap(): loading %s", spawn.name.c_str());
if (model) if (model)
{ {
@ -383,7 +383,7 @@ namespace VMAP
if (result) if (result)
{ {
// acquire model instance // acquire model instance
WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name); WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name, spawn.flags);
if (!model) if (!model)
{ ERROR_LOG("StaticMapTree::LoadMapTile() could not acquire WorldModel pointer for '%s'!", spawn.name.c_str()); } { ERROR_LOG("StaticMapTree::LoadMapTile() could not acquire WorldModel pointer for '%s'!", spawn.name.c_str()); }

View File

@ -251,7 +251,7 @@ namespace VMAP
//========================================================= //=========================================================
WorldModel* VMapManager2::acquireModelInstance(const std::string& basepath, const std::string& filename) WorldModel* VMapManager2::acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags/* Only used when creating the model */)
{ {
ModelFileMap::iterator model = iLoadedModelFiles.find(filename); ModelFileMap::iterator model = iLoadedModelFiles.find(filename);
if (model == iLoadedModelFiles.end()) if (model == iLoadedModelFiles.end())
@ -264,6 +264,7 @@ namespace VMAP
return NULL; return NULL;
} }
DEBUG_FILTER_LOG(LOG_FILTER_MAP_LOADING, "VMapManager2: loading file '%s%s'.", basepath.c_str(), filename.c_str()); DEBUG_FILTER_LOG(LOG_FILTER_MAP_LOADING, "VMapManager2: loading file '%s%s'.", basepath.c_str(), filename.c_str());
worldmodel->Flags = flags;
model = iLoadedModelFiles.insert(std::pair<std::string, ManagedModel>(filename, ManagedModel())).first; model = iLoadedModelFiles.insert(std::pair<std::string, ManagedModel>(filename, ManagedModel())).first;
model->second.setModel(worldmodel); model->second.setModel(worldmodel);
} }

View File

@ -270,7 +270,7 @@ namespace VMAP
* @param filename * @param filename
* @return WorldModel * @return WorldModel
*/ */
WorldModel* acquireModelInstance(const std::string& basepath, const std::string& filename); WorldModel* acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags = 0);
/** /**
* @brief * @brief
* *

View File

@ -29,6 +29,11 @@
using G3D::Vector3; using G3D::Vector3;
using G3D::Ray; using G3D::Ray;
enum ModelFlags
{
MOD_M2 = 1
};
template<> struct BoundsTrait<VMAP::GroupModel> template<> struct BoundsTrait<VMAP::GroupModel>
{ {
static void getBounds(const VMAP::GroupModel& obj, G3D::AABox& out) { out = obj.GetBound(); } static void getBounds(const VMAP::GroupModel& obj, G3D::AABox& out) { out = obj.GetBound(); }
@ -433,6 +438,9 @@ namespace VMAP
bool WorldModel::IntersectRay(const G3D::Ray& ray, float& distance, bool stopAtFirstHit) const bool WorldModel::IntersectRay(const G3D::Ray& ray, float& distance, bool stopAtFirstHit) const
{ {
// M2 models are not taken into account for LoS calculation
if (Flags & MOD_M2)
return false;
// small M2 workaround, maybe better make separate class with virtual intersection funcs // small M2 workaround, maybe better make separate class with virtual intersection funcs
// in any case, there's no need to use a bound tree if we only have one submodel // in any case, there's no need to use a bound tree if we only have one submodel
if (groupModels.size() == 1) if (groupModels.size() == 1)

View File

@ -356,6 +356,7 @@ namespace VMAP
* @return bool * @return bool
*/ */
bool readFile(const std::string& filename); bool readFile(const std::string& filename);
uint32 Flags;
protected: protected:
uint32 RootWMOID; /**< TODO */ uint32 RootWMOID; /**< TODO */
std::vector<GroupModel> groupModels; /**< TODO */ std::vector<GroupModel> groupModels; /**< TODO */