bool GameObjectModel::initialize(const GameObject& go, const GameObjectDisplayInfoEntry& info) { ModelList::const_iterator it = model_list.find(info.Displayid); if (it == model_list.end()) return false; G3D::AABox mdl_box(it->second.bound); // ignore models with no bounds if (mdl_box == G3D::AABox::zero()) { VMAP_ERROR_LOG("misc", "GameObject model %s has zero bounds, loading skipped", it->second.name.c_str()); return false; } iModel = ((VMAP::VMapManager2*)VMAP::VMapFactory::createOrGetVMapManager())->acquireModelInstance(sWorld->GetDataPath() + "vmaps/", it->second.name); if (!iModel) return false; name = it->second.name; //flags = VMAP::MOD_M2; //adtId = 0; //ID = 0; iPos = Vector3(go.GetPositionX(), go.GetPositionY(), go.GetPositionZ()); phasemask = go.GetPhaseMask(); iScale = go.GetObjectScale(); iInvScale = 1.f / iScale; G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(go.GetOrientation(), 0, 0); iInvRot = iRotation.inverse(); // transform bounding box: mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale); AABox rotated_bounds; for (int i = 0; i < 8; ++i) rotated_bounds.merge(iRotation * mdl_box.corner(i)); iBound = rotated_bounds + iPos; #ifdef SPAWN_CORNERS // test: for (int i = 0; i < 8; ++i) { Vector3 pos(iBound.corner(i)); go.SummonCreature(1, pos.x, pos.y, pos.z, 0, TEMPSUMMON_MANUAL_DESPAWN); } #endif return true; }
bool GameObjectModel::initialize(std::unique_ptr<GameObjectModelOwnerBase> modelOwner, std::string const& dataPath) { ModelList::const_iterator it = model_list.find(modelOwner->GetDisplayId()); if (it == model_list.end()) return false; G3D::AABox mdl_box(it->second.bound); // ignore models with no bounds if (mdl_box == G3D::AABox::zero()) { VMAP_ERROR_LOG("misc", "GameObject model %s has zero bounds, loading skipped", it->second.name.c_str()); return false; } iModel = ((VMAP::VMapManager2*)VMAP::VMapFactory::createOrGetVMapManager())->acquireModelInstance(dataPath + "vmaps/", it->second.name); if (!iModel) return false; name = it->second.name; //flags = VMAP::MOD_M2; //adtId = 0; //ID = 0; iPos = modelOwner->GetPosition(); phasemask = modelOwner->GetPhaseMask(); iScale = modelOwner->GetScale(); iInvScale = 1.f / iScale; G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(modelOwner->GetOrientation(), 0, 0); iInvRot = iRotation.inverse(); // transform bounding box: mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale); AABox rotated_bounds; for (int i = 0; i < 8; ++i) rotated_bounds.merge(iRotation * mdl_box.corner(i)); iBound = rotated_bounds + iPos; #ifdef SPAWN_CORNERS // test: for (int i = 0; i < 8; ++i) { Vector3 pos(iBound.corner(i)); modelOwner->DebugVisualizeCorner(pos); } #endif owner = std::move(modelOwner); return true; }
void LoadGameObjectModelList() { FILE* model_list_file = fopen((sWorld->GetDataPath() + "vmaps/" + VMAP::GAMEOBJECT_MODELS).c_str(), "rb"); if (!model_list_file) return; uint32 name_length, displayId; char buff[500]; while (!feof(model_list_file)) { Vector3 v1, v2; if (fread(&displayId, sizeof(uint32), 1, model_list_file) != 1 || fread(&name_length, sizeof(uint32), 1, model_list_file) != 1 || name_length >= sizeof(buff) || fread(&buff, sizeof(char), name_length, model_list_file) != name_length || fread(&v1, sizeof(Vector3), 1, model_list_file) != 1 || fread(&v2, sizeof(Vector3), 1, model_list_file) != 1) { printf("\nFile '%s' seems to be corrupted", VMAP::GAMEOBJECT_MODELS); break; } model_list.insert ( ModelList::value_type( displayId, GameobjectModelData(std::string(buff,name_length),AABox(v1,v2)) ) ); } fclose(model_list_file); }
void LoadGameObjectModelList() { //#ifndef NO_CORE_FUNCS uint32 oldMSTime = getMSTime(); //#endif FILE* model_list_file = fopen((sWorld->GetDataPath() + "vmaps/" + VMAP::GAMEOBJECT_MODELS).c_str(), "rb"); if (!model_list_file) { sLog->outError("Unable to open '%s' file.", VMAP::GAMEOBJECT_MODELS); return; } uint32 name_length, displayId; char buff[500]; while (true) { Vector3 v1, v2; if (fread(&displayId, sizeof(uint32), 1, model_list_file) != 1) if (feof(model_list_file)) // EOF flag is only set after failed reading attempt break; if (fread(&name_length, sizeof(uint32), 1, model_list_file) != 1 || name_length >= sizeof(buff) || fread(&buff, sizeof(char), name_length, model_list_file) != name_length || fread(&v1, sizeof(Vector3), 1, model_list_file) != 1 || fread(&v2, sizeof(Vector3), 1, model_list_file) != 1) { sLog->outError("File '%s' seems to be corrupted!", VMAP::GAMEOBJECT_MODELS); break; } model_list.insert ( ModelList::value_type( displayId, GameobjectModelData(std::string(buff, name_length), AABox(v1, v2)) ) ); } fclose(model_list_file); sLog->outString(">> Loaded %u GameObject models in %u ms", uint32(model_list.size()), GetMSTimeDiffToNow(oldMSTime)); sLog->outString(); }
bool GameObjectModel::UpdatePosition() { if (!iModel) return false; ModelList::const_iterator it = model_list.find(owner->GetDisplayId()); if (it == model_list.end()) return false; G3D::AABox mdl_box(it->second.bound); // ignore models with no bounds if (mdl_box == G3D::AABox::zero()) { TC_LOG_ERROR("misc", "GameObject model %s has zero bounds, loading skipped", it->second.name.c_str()); return false; } iPos = owner->GetPosition(); G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(owner->GetOrientation(), 0, 0); iInvRot = iRotation.inverse(); // transform bounding box: mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale); AABox rotated_bounds; for (int i = 0; i < 8; ++i) rotated_bounds.merge(iRotation * mdl_box.corner(i)); iBound = rotated_bounds + iPos; #ifdef SPAWN_CORNERS // test: for (int i = 0; i < 8; ++i) { Vector3 pos(iBound.corner(i)); owner->DebugVisualizeCorner(pos); } #endif return true; }
bool GameObjectModel::Relocate(const GameObject& go) { if (!iModel) return false; ModelList::const_iterator it = model_list.find(go.GetDisplayId()); if (it == model_list.end()) return false; G3D::AABox mdl_box(it->second.bound); // ignore models with no bounds if (mdl_box == G3D::AABox::zero()) { VMAP_ERROR_LOG("misc", "GameObject model %s has zero bounds, loading skipped", it->second.name.c_str()); return false; } iPos = Vector3(go.GetPositionX(), go.GetPositionY(), go.GetPositionZ()); G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(go.GetOrientation(), 0, 0); iInvRot = iRotation.inverse(); // transform bounding box: mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale); AABox rotated_bounds; for (int i = 0; i < 8; ++i) rotated_bounds.merge(iRotation * mdl_box.corner(i)); iBound = rotated_bounds + iPos; #ifdef SPAWN_CORNERS // test: for (int i = 0; i < 8; ++i) { Vector3 pos(iBound.corner(i)); go.SummonCreature(1, pos.x, pos.y, pos.z, 0, TEMPSUMMON_MANUAL_DESPAWN); } #endif return true; }
void LoadGameObjectModelList(std::string const& dataPath) { #ifndef NO_CORE_FUNCS uint32 oldMSTime = getMSTime(); #endif FILE* model_list_file = fopen((dataPath + "vmaps/" + VMAP::GAMEOBJECT_MODELS).c_str(), "rb"); if (!model_list_file) { VMAP_ERROR_LOG("misc", "Unable to open '%s' file.", VMAP::GAMEOBJECT_MODELS); return; } uint32 name_length, displayId; char buff[500]; while (true) { Vector3 v1, v2; if (fread(&displayId, sizeof(uint32), 1, model_list_file) != 1) if (feof(model_list_file)) // EOF flag is only set after failed reading attempt break; if (fread(&name_length, sizeof(uint32), 1, model_list_file) != 1 || name_length >= sizeof(buff) || fread(&buff, sizeof(char), name_length, model_list_file) != name_length || fread(&v1, sizeof(Vector3), 1, model_list_file) != 1 || fread(&v2, sizeof(Vector3), 1, model_list_file) != 1) { VMAP_ERROR_LOG("misc", "File '%s' seems to be corrupted!", VMAP::GAMEOBJECT_MODELS); break; } if (v1.isNaN() || v2.isNaN()) { VMAP_ERROR_LOG("misc", "File '%s' Model '%s' has invalid v1%s v2%s values!", VMAP::GAMEOBJECT_MODELS, std::string(buff, name_length).c_str(), v1.toString().c_str(), v2.toString().c_str()); continue; } model_list.insert ( ModelList::value_type(displayId, GameobjectModelData(std::string(buff, name_length), AABox(v1, v2))) ); } fclose(model_list_file); VMAP_INFO_LOG("server.loading", ">> Loaded %u GameObject models in %u ms", uint32(model_list.size()), GetMSTimeDiffToNow(oldMSTime)); }
AbstractWordSubstitutionModel::AbstractWordSubstitutionModel( ModelList& modelList, const std::string& prefix) : AbstractParameterAliasable(prefix), AbstractSubstitutionModel( modelList.getWordAlphabet(), new CanonicalStateMap(modelList.getWordAlphabet(), false), prefix), new_alphabet_ (true), VSubMod_ (), VnestedPrefix_(), Vrate_ (modelList.size()) { enableEigenDecomposition(false); size_t i, j; size_t n = modelList.size(); // test whether two models are identical bool flag = 0; i = 0; j = 1; while (!flag && i < (n - 1)) { if (modelList.getModel(i) == modelList.getModel(j)) flag = 1; else { j++; if (j == n) { i++; j = i + 1; } } } if (!flag) { for (i = 0; i < n; i++) { VSubMod_.push_back(modelList.getModel(i)); VnestedPrefix_.push_back(modelList.getModel(i)->getNamespace()); VSubMod_[i]->setNamespace(prefix + TextTools::toString(i + 1) + "_" + VnestedPrefix_[i]); addParameters_(VSubMod_[i]->getParameters()); } } else { string t = ""; for (i = 0; i < n; i++) { VSubMod_.push_back(modelList.getModel(0)); VnestedPrefix_.push_back(modelList.getModel(0)->getNamespace()); t += TextTools::toString(i + 1); } VSubMod_[0]->setNamespace(prefix + t + "_" + VnestedPrefix_[0]); addParameters_(VSubMod_[0]->getParameters()); } for (i = 0; i < n; i++) { Vrate_[i] = 1.0 / static_cast<double>(n); } }