// This method initializes voxel map (size, position, etc) but doesn't load voxels // It only presets all materials to values specified in 'defaultMaterial' - so it will become material everywhere. protected virtual void InitVoxelMap(MatrixD worldMatrix, Vector3I size, bool useOffset = true) { ProfilerShort.Begin("InitVoxelMap"); NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; NeedsUpdate |= MyEntityUpdateEnum.EACH_10TH_FRAME; var defaultMaterial = MyDefinitionManager.Static.GetDefaultVoxelMaterialDefinition(); SizeInMetres = size * MyVoxelConstants.VOXEL_SIZE_IN_METRES; SizeInMetresHalf = SizeInMetres / 2.0f; PositionComp.LocalAABB = new BoundingBox(-SizeInMetresHalf, SizeInMetresHalf); if (MyPerGameSettings.OffsetVoxelMapByHalfVoxel && useOffset) { worldMatrix.Translation += MyVoxelConstants.VOXEL_SIZE_IN_METRES_HALF; PositionLeftBottomCorner += MyVoxelConstants.VOXEL_SIZE_IN_METRES_HALF; } PositionComp.SetWorldMatrix(worldMatrix); /*Debug.Assert((Size.X & MyVoxelConstants.DATA_CELL_SIZE_IN_VOXELS_MASK) == 0); * Debug.Assert((Size.Y & MyVoxelConstants.DATA_CELL_SIZE_IN_VOXELS_MASK) == 0); * Debug.Assert((Size.Z & MyVoxelConstants.DATA_CELL_SIZE_IN_VOXELS_MASK) == 0); * * Debug.Assert((Size.X % MyVoxelCoordSystems.RenderCellSizeInLodVoxels(0)) == 0); * Debug.Assert((Size.Y % MyVoxelCoordSystems.RenderCellSizeInLodVoxels(0)) == 0); * Debug.Assert((Size.Z % MyVoxelCoordSystems.RenderCellSizeInLodVoxels(0)) == 0);*/ ContentChanged = false; ProfilerShort.End(); }
// This method initializes voxel map (size, position, etc) but doesn't load voxels // It only presets all materials to values specified in 'defaultMaterial' - so it will become material everywhere. virtual protected void InitVoxelMap(Vector3D positionMinCorner, Vector3I size, bool useOffset = true) { NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; NeedsUpdate |= MyEntityUpdateEnum.EACH_10TH_FRAME; var defaultMaterial = MyDefinitionManager.Static.GetDefaultVoxelMaterialDefinition(); SizeInMetres = size * MyVoxelConstants.VOXEL_SIZE_IN_METRES; SizeInMetresHalf = SizeInMetres / 2.0f; PositionComp.LocalAABB = new BoundingBox(-SizeInMetresHalf, SizeInMetresHalf); if (MyPerGameSettings.OffsetVoxelMapByHalfVoxel && useOffset) { positionMinCorner += MyVoxelConstants.VOXEL_SIZE_IN_METRES_HALF; } PositionLeftBottomCorner = positionMinCorner; PositionComp.SetWorldMatrix(MatrixD.CreateTranslation(PositionLeftBottomCorner + SizeInMetresHalf)); // Voxel map size must be multiple of a voxel data cell size. MyDebug.AssertRelease((Size.X & MyVoxelConstants.DATA_CELL_SIZE_IN_VOXELS_MASK) == 0); MyDebug.AssertRelease((Size.Y & MyVoxelConstants.DATA_CELL_SIZE_IN_VOXELS_MASK) == 0); MyDebug.AssertRelease((Size.Z & MyVoxelConstants.DATA_CELL_SIZE_IN_VOXELS_MASK) == 0); // Voxel map size must be multiple of a voxel data cell size. MyDebug.AssertRelease((Size.X % MyVoxelConstants.RENDER_CELL_SIZE_IN_VOXELS) == 0); MyDebug.AssertRelease((Size.Y % MyVoxelConstants.RENDER_CELL_SIZE_IN_VOXELS) == 0); MyDebug.AssertRelease((Size.Z % MyVoxelConstants.RENDER_CELL_SIZE_IN_VOXELS) == 0); }
public virtual void Init(MyObjectBuilder_EntityBase objectBuilder) { ProfilerShort.Begin("MyEntity.Init(objectBuilder)"); MarkedForClose = false; Closed = false; this.Render.PersistentFlags = MyPersistentEntityFlags2.CastShadows; if (objectBuilder != null) { if (objectBuilder.EntityDefinitionId.HasValue) { DefinitionId = objectBuilder.EntityDefinitionId; InitFromDefinition(objectBuilder, DefinitionId.Value); } if (objectBuilder.PositionAndOrientation.HasValue) { var posAndOrient = objectBuilder.PositionAndOrientation.Value; MatrixD matrix = MatrixD.CreateWorld(posAndOrient.Position, posAndOrient.Forward, posAndOrient.Up); MyUtils.AssertIsValid(matrix); PositionComp.SetWorldMatrix((MatrixD)matrix); if (MyPerGameSettings.LimitedWorld) { ClampToWorld(); } } // Do not copy EntityID if it gets overwritten later. It might // belong to some existing entity that we're making copy of. if (objectBuilder.EntityId != 0) { this.EntityId = objectBuilder.EntityId; } this.Name = objectBuilder.Name; this.Render.PersistentFlags = objectBuilder.PersistentFlags; this.Components.Deserialize(objectBuilder.ComponentContainer); } AllocateEntityID(); this.InScene = false; MyEntities.SetEntityName(this, false); if (SyncFlag) { CreateSync(); } GameLogic.Init(objectBuilder); ProfilerShort.End(); }
public MyAreaMarker(MyPositionAndOrientation positionAndOrientation, MyAreaMarkerDefinition definition) { m_definition = definition; Debug.Assert(definition != null, "Area marker definition cannot be null!"); if (definition == null) return; MatrixD matrix = MatrixD.CreateWorld(positionAndOrientation.Position, positionAndOrientation.Forward, positionAndOrientation.Up); PositionComp.SetWorldMatrix((MatrixD)matrix); if (MyPerGameSettings.LimitedWorld) { ClampToWorld(); } InitInternal(); }
public void InitFromDefinition(MyObjectBuilder_EntityBase entityBuilder, MyDefinitionId definitionId) { Debug.Assert(entityBuilder != null, "Invalid arguments!"); MyPhysicalItemDefinition entityDefinition; if (!MyDefinitionManager.Static.TryGetDefinition(definitionId, out entityDefinition)) { Debug.Fail("Definition: " + DefinitionId.ToString() + " was not found!"); return; } DefinitionId = definitionId; Flags |= EntityFlags.Visible | EntityFlags.NeedsDraw | EntityFlags.Sync | EntityFlags.InvalidateOnMove; StringBuilder name = new StringBuilder(entityDefinition.DisplayNameText); Init(name, entityDefinition.Model, null, null, null); CreateSync(); if (entityBuilder.PositionAndOrientation.HasValue) { MatrixD worldMatrix = MatrixD.CreateWorld( (Vector3D)entityBuilder.PositionAndOrientation.Value.Position, (Vector3)entityBuilder.PositionAndOrientation.Value.Forward, (Vector3)entityBuilder.PositionAndOrientation.Value.Up); PositionComp.SetWorldMatrix(worldMatrix); } Name = name.Append("_(").Append(entityBuilder.EntityId).Append(")").ToString(); Render.UpdateRenderObject(true); Physics = new Engine.Physics.MyPhysicsBody(this, RigidBodyFlag.RBF_DEFAULT); if (ModelCollision != null && ModelCollision.HavokCollisionShapes.Length >= 1) { HkMassProperties massProperties = HkInertiaTensorComputer.ComputeBoxVolumeMassProperties(entityDefinition.Size / 2, (MyPerGameSettings.Destruction ? MyDestructionHelper.MassToHavok(entityDefinition.Mass) : entityDefinition.Mass));; Physics.CreateFromCollisionObject(ModelCollision.HavokCollisionShapes[0], Vector3.Zero, WorldMatrix, massProperties); Physics.RigidBody.AngularDamping = 2; Physics.RigidBody.LinearDamping = 1; } Physics.Enabled = true; EntityId = entityBuilder.EntityId; }
public virtual void Start(Vector3D position, Vector3D initialVelocity, Vector3D direction, long owner) { System.Diagnostics.Debug.Assert(Closed); System.Diagnostics.Debug.Assert(this.EntityId == 0); Closed = false; GuidedInMultiplayer = false; this.EntityId = MyEntityIdentifier.AllocateId(); m_isExploded = false; m_cascadeExplosionLevel = 0; m_origin = position + direction * m_ammoOffsetSize; m_previousPosition = m_origin; m_initialVelocity = initialVelocity; m_elapsedMiliseconds = 0; MarkedToDestroy = false; MatrixD ammoWorld = MatrixD.CreateWorld(m_origin, direction, Vector3D.CalculatePerpendicularVector(direction)); PositionComp.SetWorldMatrix(ammoWorld); this.Physics.Clear(); this.Physics.Enabled = true; MyEntities.Add(this); //if (owner.Physics != null) // this.Physics.GroupMask = owner.Physics.GroupMask; //else // this.Physics.GroupMask = MyGroupMask.Empty; //this.Physics.Enabled = true; this.Physics.LinearVelocity = initialVelocity; NeedsUpdate = MyEntityUpdateEnum.EACH_FRAME; //this.Physics.ApplyImpulse(direction * this.Physics.Mass * impulseMultiplier, position); }
// This method initializes voxel map (size, position, etc) but doesn't load voxels // It only presets all materials to values specified in 'defaultMaterial' - so it will become material everywhere. protected virtual void InitVoxelMap(MatrixD worldMatrix, Vector3I size, bool useOffset = true) { ProfilerShort.Begin("InitVoxelMap"); NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; NeedsUpdate |= MyEntityUpdateEnum.EACH_10TH_FRAME; SizeInMetres = size * MyVoxelConstants.VOXEL_SIZE_IN_METRES; SizeInMetresHalf = SizeInMetres / 2.0f; PositionComp.LocalAABB = new BoundingBox(-SizeInMetresHalf, SizeInMetresHalf); if (MyPerGameSettings.OffsetVoxelMapByHalfVoxel && useOffset) { worldMatrix.Translation += MyVoxelConstants.VOXEL_SIZE_IN_METRES_HALF; PositionLeftBottomCorner += MyVoxelConstants.VOXEL_SIZE_IN_METRES_HALF; } PositionComp.SetWorldMatrix(worldMatrix); ContentChanged = false; ProfilerShort.End(); }
void IMyEntity.SetWorldMatrix(VRageMath.MatrixD worldMatrix, object source) { PositionComp.SetWorldMatrix(worldMatrix, source); }