public ModelInstance(ModelSpawn spawn, WorldModel model) : base(spawn) { iModel = model; iInvRot = Matrix3.fromEulerAnglesZYX(MathF.PI * iRot.Y / 180.0f, MathF.PI * iRot.X / 180.0f, MathF.PI * iRot.Z / 180.0f).inverse(); iInvScale = 1.0f / iScale; }
public void SetModel(WorldModel model) { _model = model; }
public bool LoadMapTile(uint tileX, uint tileY, VMapManager2 vm) { if (_treeValues == null) { Console.WriteLine("StaticMapTree.LoadMapTile() : tree has not been initialized [{tileX}, {tileY}]"); return(false); } string tilefile = _basePath + GetTileFileName(_mapId, tileX, tileY); if (File.Exists(tilefile)) { using BinaryReader binaryReader = new(File.Open(tilefile, FileMode.Open, FileAccess.Read, FileShare.Read)); if (binaryReader.ReadStringFromChars(8) != SharedConst.VMAP_MAGIC) { return(false); } uint numSpawns = binaryReader.ReadUInt32(); for (uint i = 0; i < numSpawns; ++i) { // read model spawns var result = ModelSpawn.ReadFromFile(binaryReader, out ModelSpawn spawn); if (result) { // acquire model instance WorldModel model = vm.AcquireModelInstance(_basePath, spawn.name); if (model == null) { Console.WriteLine($"StaticMapTree.LoadMapTile() : could not acquire WorldModel pointer [{tileX}, {tileY}]"); } // update tree if (_spawnIndices.ContainsKey(spawn.ID)) { uint referencedVal = _spawnIndices[spawn.ID]; if (!_loadedSpawns.ContainsKey(referencedVal)) { if (referencedVal > _nTreeValues) { Console.WriteLine($"StaticMapTree.LoadMapTile() : invalid tree element ({referencedVal}/{_nTreeValues}) referenced in tile {tilefile}"); continue; } _treeValues[referencedVal] = new ModelInstance(spawn, model); _loadedSpawns[referencedVal] = 1; } else { ++_loadedSpawns[referencedVal]; } } } } _loadedTiles[PackTileID(tileX, tileY)] = true; } else { _loadedTiles[PackTileID(tileX, tileY)] = false; } //TC_METRIC_EVENT("map_events", "LoadMapTile", "Map: " + std::to_string(iMapID) + " TileX: " + std::to_string(tileX) + " TileY: " + std::to_string(tileY)); return(true); }