Esempio n. 1
0
        //  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();
        }
Esempio n. 2
0
        //  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);
        }
Esempio n. 3
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();
        }
Esempio n. 4
0
		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();
        }
Esempio n. 5
0
        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;
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        //  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);
 }