public void Init(MyEnvironmentSector sector, List<int> items) { m_sector = sector; if (Sync.IsServer) m_sector.OnContactPoint += SectorOnContactPoint; }
private bool DisableRenderInstanceIfInRadius(Vector3D center, double radiusSq, int itemInstanceId, bool hasPhysics = false) { MyEnvironmentItemData itemData = m_itemsData[itemInstanceId]; Vector3 translation = itemData.Transform.Position; if (Vector3D.DistanceSquared(new Vector3D(translation), center) <= radiusSq) { int physicsInstanceId; bool itemRemoved = false; if (m_localIdToPhysicsShapeInstanceId.TryGetValue(itemInstanceId, out physicsInstanceId)) { m_physicsShapeInstanceIdToLocalId.Remove(physicsInstanceId); m_localIdToPhysicsShapeInstanceId.Remove(itemInstanceId); itemRemoved = true; } if (!hasPhysics || itemRemoved) { Vector3I sectorId = MyEnvironmentSector.GetSectorId(translation, m_definition.SectorSize); bool disabled = Sectors[sectorId].DisableInstance(itemData.SectorInstanceId, itemData.ModelId); Debug.Assert(disabled, "Env. item render not disabled"); if (disabled) { m_updatedSectorsTmp.Add(sectorId); itemData.Enabled = false; m_itemsData[itemInstanceId] = itemData; } return(true); } } return(false); }
protected bool RemoveItem(int itemInstanceId, int physicsInstanceId, bool sync) { Debug.Assert(sync == false || Sync.IsServer, "Synchronizing env. item removal from the client is forbidden!"); Debug.Assert(m_physicsShapeInstanceIdToLocalId.ContainsKey(physicsInstanceId), "Could not find env. item shape!"); Debug.Assert(m_localIdToPhysicsShapeInstanceId.ContainsKey(itemInstanceId), "Could not find env. item instance!"); m_physicsShapeInstanceIdToLocalId.Remove(physicsInstanceId); m_localIdToPhysicsShapeInstanceId.Remove(itemInstanceId); MyEnvironmentItemData itemData = m_itemsData[itemInstanceId]; itemData.Enabled = false; m_itemsData[itemInstanceId] = itemData; HkStaticCompoundShape shape = (HkStaticCompoundShape)Physics.RigidBody.GetShape(); var shapeKey = shape.ComposeShapeKey(physicsInstanceId, 0); shape.EnableShapeKey(shapeKey, false); Matrix matrix = itemData.Transform.TransformMatrix; var sectorId = MyEnvironmentSector.GetSectorId(matrix.Translation - m_cellsOffset, Definition.SectorSize); var disabled = Sectors[sectorId].DisableInstance(itemData.SectorInstanceId, itemData.ModelId); Debug.Assert(disabled, "Env. item instance render not disabled"); Sectors[sectorId].UpdateRenderInstanceData(); OnRemoveItem(itemInstanceId, ref matrix, itemData.SubtypeId); if (sync) { MySyncEnvironmentItems.RemoveEnvironmentItem(EntityId, itemInstanceId); } return(true); }
protected bool RemoveNonPhysicalItem(int itemInstanceId, bool sync) { Debug.Assert(sync == false || Sync.IsServer, "Synchronizing env. item removal from the client is forbidden!"); Debug.Assert(m_itemsData.ContainsKey(itemInstanceId), "Could not find env. item shape!"); MyEnvironmentItemData itemData = m_itemsData[itemInstanceId]; itemData.Enabled = false; m_itemsData[itemInstanceId] = itemData; Matrix matrix = itemData.Transform.TransformMatrix; var sectorId = MyEnvironmentSector.GetSectorId(matrix.Translation, Definition.SectorSize); var disabled = Sectors[sectorId].DisableInstance(itemData.SectorInstanceId, itemData.ModelId); Debug.Assert(disabled, "Env. item instance render not disabled"); Sectors[sectorId].UpdateRenderInstanceData(); OnRemoveItem(itemInstanceId, ref matrix, itemData.SubtypeId); if (sync) { MySyncEnvironmentItems.RemoveEnvironmentItem(EntityId, itemInstanceId); } return(true); }
public MyModelInstanceData(MyEnvironmentSector parent, MyStringHash subtypeId, ModelId model, MyInstanceFlagsEnum flags, float maxViewDistance, BoundingBox modelBox) { Parent = parent; SubtypeId = subtypeId; Flags = flags; MaxViewDistance = maxViewDistance; ModelBox = modelBox; Model = model; }
public MyModelInstanceData(MyEnvironmentSector parent, MyStringHash subtypeId, int model, MyInstanceFlagsEnum flags, float maxViewDistance, BoundingBox modelBox) { this.Parent = parent; this.SubtypeId = subtypeId; this.Flags = flags; this.MaxViewDistance = maxViewDistance; this.ModelBox = modelBox; this.Model = model; }
public void GetItems(ref Vector3D point, List <ItemInfo> output) { Vector3I sectorId = MyEnvironmentSector.GetSectorId(point, m_definition.SectorSize); MyEnvironmentSector sector = null; if (m_sectors.TryGetValue(sectorId, out sector)) { sector.GetItems(WorldMatrix, output); } }
public bool ModifyItemModel(int itemInstanceId, int localModelId, bool updateSector, bool sync) { MyEnvironmentItemData data; if (!m_itemsData.TryGetValue(itemInstanceId, out data)) { Debug.Assert(false, "Item instance not found."); return(false); } int modelId = MyEnvironmentItems.GetModelId(data.SubtypeId, localModelId); if (data.Enabled && data.ModelId != modelId) { Matrix matrix = data.Transform.TransformMatrix; var sectorId = MyEnvironmentSector.GetSectorId(matrix.Translation - CellsOffset, Definition.SectorSize); MyModel modelData = MyModels.GetModelOnlyData(MyModel.GetById(modelId)); var sector = Sectors[sectorId]; Matrix invOffset = Matrix.Invert(sector.SectorMatrix); matrix = matrix * invOffset; sector.DisableInstance(data.SectorInstanceId, data.ModelId); int newSectorInstanceId = sector.AddInstance(data.SubtypeId, modelId, itemInstanceId, ref matrix, modelData.BoundingBox, m_instanceFlags, m_definition.MaxViewDistance); data.ModelId = modelId; data.SectorInstanceId = newSectorInstanceId; m_itemsData[itemInstanceId] = data; if (updateSector) { sector.UpdateRenderInstanceData(); sector.UpdateRenderEntitiesData(WorldMatrix); } if (ItemModified != null) { ItemModified(this, new ItemInfo() { LocalId = data.Id, SubtypeId = data.SubtypeId, Transform = data.Transform }); } if (sync) { MySyncEnvironmentItems.SendModifyModelMessage(EntityId, itemInstanceId, localModelId); } } return(true); }
public MyEnvironmentSector GetSector(ref Vector3I sectorId) { MyEnvironmentSector sector = null; if (m_sectors.TryGetValue(sectorId, out sector)) { return(sector); } return(null); }
public MyEnvironmentSector GetSector(ref Vector3D worldPosition) { Vector3I sectorId = MyEnvironmentSector.GetSectorId(worldPosition, m_definition.SectorSize); MyEnvironmentSector sector = null; if (m_sectors.TryGetValue(sectorId, out sector)) { return(sector); } return(null); }
void Physics_ContactPointCallback(ref MyPhysics.MyContactPointEvent e) { var vel = Math.Abs(e.ContactPointEvent.SeparatingVelocity); var other = e.ContactPointEvent.GetOtherEntity(this); if (other == null || other.Physics == null) { return; } float otherMass = MyDestructionHelper.MassFromHavok(other.Physics.Mass); if (other is Sandbox.Game.Entities.Character.MyCharacter) { otherMass = other.Physics.Mass; } float impactEnergy = vel * vel * otherMass; // If environment item is hit by a gun, nothing happens here. If you want a weapon damage to env. items, call DoDamage there if (impactEnergy > 350000 && !(other is IMyHandheldGunObject <MyDeviceBase>)) { int bodyId = e.ContactPointEvent.Base.BodyA.GetEntity() == this ? 0 : 1; var shapeKey = e.ContactPointEvent.GetShapeKey(bodyId); var position = Physics.ClusterToWorld(e.ContactPointEvent.ContactPoint.Position); var sectorId = MyEnvironmentSector.GetSectorId(position, m_definition.SectorSize); HkStaticCompoundShape shape = (HkStaticCompoundShape)Physics.RigidBody.GetShape(); int physicsInstanceId; uint childKey; if (shapeKey == uint.MaxValue) //jn: TODO find out why this happens, there is ticket for it https://app.asana.com/0/9887996365574/26645443970236 { ProfilerShort.End(); return; } shape.DecomposeShapeKey(shapeKey, out physicsInstanceId, out childKey); int itemInstanceId; if (m_physicsShapeInstanceIdToLocalId.TryGetValue(physicsInstanceId, out itemInstanceId)) { DoDamage(1.0f, itemInstanceId, e.Position, -e.ContactPointEvent.ContactPoint.Normal); } } }
/// <summary> /// Adds environment item to internal collections. Creates render and physics data. /// </summary> /// <returns>True if successfully added, otherwise false.</returns> private bool AddItem( MyEnvironmentItemDefinition itemDefinition, ref MatrixD worldMatrix, ref BoundingBoxD aabbWorld, bool silentOverlaps = false) { if (!MyFakes.ENABLE_ENVIRONMENT_ITEMS) return true; Debug.Assert(m_definition.ContainsItemDefinition(itemDefinition), String.Format("Environment item with definition '{0}' not found in class '{1}'", itemDefinition.Id, m_definition.Id)); if (!m_definition.ContainsItemDefinition(itemDefinition)) { return false; } if (itemDefinition.Model == null) return false; //MyDefinitionId defId = new MyDefinitionId(envItemObjectBuilderType, subtypeId.ToString()); int modelId = MyEnvironmentItems.GetModelId(itemDefinition.Id.SubtypeId); string modelName = MyModel.GetById(modelId); MyModel model = MyModels.GetModelOnlyData(modelName); if (model == null) { //Debug.Fail(String.Format("Environment item model of '{0}' not found, skipping the item...", itemDefinition.Id)); return false; } CheckModelConsistency(itemDefinition); int localId = worldMatrix.Translation.GetHashCode(); if (m_itemsData.ContainsKey(localId)) { if (!silentOverlaps) { Debug.Fail("More items on same place! " + worldMatrix.Translation.ToString()); MyLog.Default.WriteLine("WARNING: items are on the same place."); } return false; } MyEnvironmentItemData data = new MyEnvironmentItemData() { Id = localId, SubtypeId = itemDefinition.Id.SubtypeId, Transform = new MyTransformD(ref worldMatrix), Enabled = true, SectorInstanceId = -1, Model = model, }; //Preload split planes //VRageRender.MyRenderProxy.PreloadMaterials(model.AssetName); aabbWorld.Include(model.BoundingBox.Transform(worldMatrix)); MatrixD transform = data.Transform.TransformMatrix; float sectorSize = MyFakes.ENVIRONMENT_ITEMS_ONE_INSTANCEBUFFER ? 20000 : m_definition.SectorSize; Vector3I sectorId = MyEnvironmentSector.GetSectorId(transform.Translation - CellsOffset, sectorSize); MyEnvironmentSector sector; if (!m_sectors.TryGetValue(sectorId, out sector)) { sector = new MyEnvironmentSector(sectorId, sectorId * sectorSize + CellsOffset); m_sectors.Add(sectorId, sector); } // Adds instance of the given model. Local matrix specified might be changed internally in renderer. MatrixD sectorOffsetInv = MatrixD.CreateTranslation(-sectorId * sectorSize - CellsOffset); Matrix transformL = (Matrix)(data.Transform.TransformMatrix * sectorOffsetInv); data.SectorInstanceId = sector.AddInstance(itemDefinition.Id.SubtypeId, modelId, localId, ref transformL, model.BoundingBox, m_instanceFlags, m_definition.MaxViewDistance); data.Transform = new MyTransformD(transform); m_itemsData.Add(localId, data); if (ItemAdded != null) { ItemAdded(this, new ItemInfo() { LocalId = localId, SubtypeId = data.SubtypeId, Transform = data.Transform, }); } return true; }
/// <summary> /// Adds environment item to internal collections. Creates render and physics data. /// </summary> /// <returns>True if successfully added, otherwise false.</returns> private bool AddItem( MyEnvironmentItemDefinition itemDefinition, ref MatrixD worldMatrix, ref BoundingBoxD aabbWorld, HkStaticCompoundShape sectorRootShape, Dictionary<MyStringHash, HkShape> subtypeIdToShape, int localModelId = MAIN_MODEL_LOCAL_ID) { if (!MyFakes.ENABLE_ENVIRONMENT_ITEMS) return true; Debug.Assert(m_definition.ContainsItemDefinition(itemDefinition), String.Format("Environment item with definition '{0}' not found in class '{1}'", itemDefinition.Id, m_definition.Id)); if (!m_definition.ContainsItemDefinition(itemDefinition)) { return false; } if (itemDefinition.Model == null) return false; //MyDefinitionId defId = new MyDefinitionId(envItemObjectBuilderType, subtypeId.ToString()); int modelId = MyEnvironmentItems.GetModelId(itemDefinition.Id.SubtypeId, localModelId); string modelName = MyModel.GetById(modelId); MyModel model = MyModels.GetModelOnlyData(modelName); if (model == null) { //Debug.Fail(String.Format("Environment item model of '{0}' not found, skipping the item...", itemDefinition.Id)); return false; } CheckModelConsistency(itemDefinition); int localId = worldMatrix.Translation.GetHashCode(); MyEnvironmentItemData data = new MyEnvironmentItemData() { Id = localId, SubtypeId = itemDefinition.Id.SubtypeId, Transform = new MyTransformD(ref worldMatrix), Enabled = true, SectorInstanceId = -1, ModelId = modelId, }; //Preload split planes //VRageRender.MyRenderProxy.PreloadMaterials(model.AssetName); aabbWorld.Include(model.BoundingBox.Transform(worldMatrix)); MatrixD transform = data.Transform.TransformMatrix; Vector3I sectorId = MyEnvironmentSector.GetSectorId(transform.Translation - CellsOffset, m_definition.SectorSize); MyEnvironmentSector sector; if (!m_sectors.TryGetValue(sectorId, out sector)) { sector = new MyEnvironmentSector(sectorId, sectorId * m_definition.SectorSize + CellsOffset); m_sectors.Add(sectorId, sector); } // Adds instance of the given model. Local matrix specified might be changed internally in renderer. MatrixD sectorOffset = MatrixD.CreateTranslation(-sectorId * m_definition.SectorSize - CellsOffset); Matrix transformL = (Matrix)(transform * sectorOffset); data.SectorInstanceId = sector.AddInstance(itemDefinition.Id.SubtypeId, data.ModelId, localId, ref transformL, model.BoundingBox, m_instanceFlags, m_definition.MaxViewDistance); int physicsShapeInstanceId; if (AddPhysicsShape(data.SubtypeId, model, ref transform, sectorRootShape, subtypeIdToShape, out physicsShapeInstanceId)) { // Map to data index - note that itemData is added after this to its list! m_physicsShapeInstanceIdToLocalId[physicsShapeInstanceId] = localId; m_localIdToPhysicsShapeInstanceId[localId] = physicsShapeInstanceId; } data.Transform = new MyTransformD(transform); if (m_itemsData.ContainsKey(localId)) { //Debug.Fail("More items on same place! " + transform.Translation.ToString()); } else { m_itemsData.Add(localId, data); } if (ItemAdded != null) { ItemAdded(this, new ItemInfo() { LocalId = localId, SubtypeId = data.SubtypeId, Transform = data.Transform, }); } return true; }
/// <summary> /// Adds environment item to internal collections. Creates render and physics data. /// </summary> /// <returns>True if successfully added, otherwise false.</returns> private bool AddItem( MyEnvironmentItemDefinition itemDefinition, ref MatrixD worldMatrix, ref BoundingBoxD aabbWorld, HkStaticCompoundShape sectorRootShape, Dictionary <MyStringHash, HkShape> subtypeIdToShape, int localModelId = MAIN_MODEL_LOCAL_ID) { if (!MyFakes.ENABLE_ENVIRONMENT_ITEMS) { return(true); } Debug.Assert(m_definition.ContainsItemDefinition(itemDefinition), String.Format("Environment item with definition '{0}' not found in class '{1}'", itemDefinition.Id, m_definition.Id)); if (!m_definition.ContainsItemDefinition(itemDefinition)) { return(false); } if (itemDefinition.Model == null) { return(false); } //MyDefinitionId defId = new MyDefinitionId(envItemObjectBuilderType, subtypeId.ToString()); int modelId = MyEnvironmentItems.GetModelId(itemDefinition.Id.SubtypeId, localModelId); string modelName = MyModel.GetById(modelId); MyModel model = MyModels.GetModelOnlyData(modelName); if (model == null) { //Debug.Fail(String.Format("Environment item model of '{0}' not found, skipping the item...", itemDefinition.Id)); return(false); } CheckModelConsistency(itemDefinition); int localId = worldMatrix.Translation.GetHashCode(); MyEnvironmentItemData data = new MyEnvironmentItemData() { Id = localId, SubtypeId = itemDefinition.Id.SubtypeId, Transform = new MyTransformD(ref worldMatrix), Enabled = true, SectorInstanceId = -1, ModelId = modelId, }; //Preload split planes //VRageRender.MyRenderProxy.PreloadMaterials(model.AssetName); aabbWorld.Include(model.BoundingBox.Transform(worldMatrix)); MatrixD transform = data.Transform.TransformMatrix; Vector3I sectorId = MyEnvironmentSector.GetSectorId(transform.Translation - CellsOffset, m_definition.SectorSize); MyEnvironmentSector sector; if (!m_sectors.TryGetValue(sectorId, out sector)) { sector = new MyEnvironmentSector(sectorId, sectorId * m_definition.SectorSize + CellsOffset); m_sectors.Add(sectorId, sector); } // Adds instance of the given model. Local matrix specified might be changed internally in renderer. MatrixD sectorOffset = MatrixD.CreateTranslation(-sectorId * m_definition.SectorSize - CellsOffset); Matrix transformL = (Matrix)(transform * sectorOffset); data.SectorInstanceId = sector.AddInstance(itemDefinition.Id.SubtypeId, data.ModelId, localId, ref transformL, model.BoundingBox, m_instanceFlags, m_definition.MaxViewDistance); int physicsShapeInstanceId; if (AddPhysicsShape(data.SubtypeId, model, ref transform, sectorRootShape, subtypeIdToShape, out physicsShapeInstanceId)) { // Map to data index - note that itemData is added after this to its list! m_physicsShapeInstanceIdToLocalId[physicsShapeInstanceId] = localId; m_localIdToPhysicsShapeInstanceId[localId] = physicsShapeInstanceId; } data.Transform = new MyTransformD(transform); if (m_itemsData.ContainsKey(localId)) { //Debug.Fail("More items on same place! " + transform.Translation.ToString()); } else { m_itemsData.Add(localId, data); } if (ItemAdded != null) { ItemAdded(this, new ItemInfo() { LocalId = localId, SubtypeId = data.SubtypeId, Transform = data.Transform, }); } return(true); }
public Vector3I GetSectorId(ref Vector3D worldPosition) { return(MyEnvironmentSector.GetSectorId(worldPosition, m_definition.SectorSize)); }