/// <summary>
 /// Registers cube grid under given local coord system.
 /// </summary>
 /// <param name="cubeGrid">Cube grid to register.</param>
 /// <param name="coordSys">Local coord system.</param>
 private void RegisterCubeGrid(MyCubeGrid cubeGrid, MyLocalCoordSys coordSys)
 {
     cubeGrid.OnClose          += CubeGrid_OnClose;
     cubeGrid.OnPhysicsChanged += CubeGrid_OnPhysicsChanged;
     cubeGrid.LocalCoordSystem  = coordSys.Id;
     coordSys.EntityConuter++;
 }
        /// <summary>
        /// Unregisters cube grid from given local coord system.
        /// </summary>
        /// <param name="cubeGrid">Cube grid to be unregistered.</param>
        private void UnregisterCubeGrid(MyCubeGrid cubeGrid)
        {
            cubeGrid.OnClose          -= CubeGrid_OnClose;
            cubeGrid.OnPhysicsChanged -= CubeGrid_OnPhysicsChanged;

            long            coordSysId = cubeGrid.LocalCoordSystem;
            MyLocalCoordSys coordSys   = this.GetCoordSysById(coordSysId);

            // reset local coord after unregistering.
            cubeGrid.LocalCoordSystem = 0;

            if (coordSys == null)
            {
                return;
            }

            coordSys.EntityConuter--;

            // Empty coord system, Remove it.
            if (coordSys.EntityConuter <= 0)
            {
                this.RemoveCoordSys(coordSys.Id);
                MyMultiplayer.RaiseStaticEvent(x => CoorSysRemoved_Client, coordSysId);
            }
        }
        /// <summary>
        /// Only creates coord system. Call only on client in reaction on server create.
        /// </summary>
        /// <param name="transform">Origin of the coord system.</param>
        /// <param name="coordSysId">Coord system id that should be used in creation.</param>
        private void CreateCoordSys_ClientInternal(ref MyTransformD transform, long coordSysId)
        {
            MyLocalCoordSys localCoordSys = new MyLocalCoordSys(transform);

            localCoordSys.Id = coordSysId;
            m_localCoordSystems.Add(coordSysId, localCoordSys);
        }
        public override void Draw()
        {
            if (!m_enabled)
            {
                return;
            }

            if (this.m_selectedCoordSys == 0)// && this.m_lastSelectedCoordSys != 0)
            {
                this.m_drawBoundingBox = false;
            }
            else if (this.m_selectedCoordSys != 0)// && this.m_lastSelectedCoordSys == 0)
            {
                this.m_drawBoundingBox = true;
            }


            if (m_drawBoundingBox)
            {
                MyLocalCoordSys coordSys = this.GetCoordSysById(m_selectedCoordSys);
                if (coordSys != null)
                {
                    coordSys.Draw();
                }
            }

            base.Draw();

            if (!MyFakes.ENABLE_DEBUG_DRAW_COORD_SYS)
            {
                return;
            }

            // DEBUG DRAW BELOW

            foreach (MyLocalCoordSys coordSys in m_localCoordSystems.Values)
            {
                MyRenderProxy.DebugDrawSphere(coordSys.Origin.Position, 0.05f, Color.Orange, 1.0f, false);
                MyRenderProxy.DebugDrawLine3D(coordSys.Origin.Position, coordSys.Origin.Position + coordSys.Origin.Rotation.Forward, Color.Red, Color.Red, false);
                MyRenderProxy.DebugDrawLine3D(coordSys.Origin.Position, coordSys.Origin.Position + coordSys.Origin.Rotation.Up, Color.Green, Color.Green, false);
                MyRenderProxy.DebugDrawLine3D(coordSys.Origin.Position, coordSys.Origin.Position + coordSys.Origin.Rotation.Right, Color.Blue, Color.Blue, false);

                MyRenderProxy.DebugDrawLine3D(coordSys.Origin.Position, coordSys.Origin.Position + coordSys.Origin.TransformMatrix.Forward, Color.OrangeRed, Color.OrangeRed, false);
                MyRenderProxy.DebugDrawLine3D(coordSys.Origin.Position, coordSys.Origin.Position + coordSys.Origin.TransformMatrix.Up, Color.GreenYellow, Color.GreenYellow, false);
                MyRenderProxy.DebugDrawLine3D(coordSys.Origin.Position, coordSys.Origin.Position + coordSys.Origin.TransformMatrix.Right, Color.BlueViolet, Color.BlueViolet, false);

                MyRenderProxy.DebugDrawOBB(coordSys.BoundingBox, Color.Orange, 0.1f, true, false);
            }
        }
        void MyEntities_OnEntityCreate(MyEntity obj)
        {
            var cubeGrid = obj as MyCubeGrid;

            // If there is local coor sys under the cube. Try register
            if (cubeGrid != null && cubeGrid.LocalCoordSystem != 0)
            {
                MyLocalCoordSys coordSys = this.GetCoordSysById(cubeGrid.LocalCoordSystem);

                if (coordSys != null)
                {
                    RegisterCubeGrid(cubeGrid, coordSys);
                }
            }
        }
        /// <summary>
        /// Registers cube grid under closest coord system.
        /// </summary>
        /// <param name="cubeGrid">Cube grid to register.</param>
        public void RegisterCubeGrid(MyCubeGrid cubeGrid)
        {
            if (cubeGrid.LocalCoordSystem != 0)
            {
                return;
            }

            Vector3D        worldPos      = cubeGrid.PositionComp.GetPosition();
            MyLocalCoordSys localCoordSys = this.GetClosestCoordSys(ref worldPos);

            if (localCoordSys == null)
            {
                return;
            }
            this.RegisterCubeGrid(cubeGrid, localCoordSys);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Creates coord system and sends it to clients. Should be called only on server.
        /// </summary>
        /// <param name="cubeGrid">Cube grid that is an origin.</param>
        /// <param name="staticGridAlignToCenter">Indcates if grid should be aligned to center or no.</param>
        public void CreateCoordSys(MyCubeGrid cubeGrid, bool staticGridAlignToCenter, bool sync = false)
        {
            //In me this system is not working for now (will change after implementing planets there)
            //if(MyPerGameSettings.Game == GameEnum.ME_GAME)
            //{
            //    return;
            //}

            Debug.Assert(Sync.IsServer, "Called on client. This method should be called only on server.");

            MyTransformD origin = new MyTransformD(cubeGrid.PositionComp.WorldMatrix);

            origin.Rotation.Normalize();
            float gridSize = cubeGrid.GridSize;

            if (!staticGridAlignToCenter)
            {
                origin.Position -= (origin.Rotation.Forward + origin.Rotation.Right + origin.Rotation.Up) * gridSize * 0.5f;
            }

            MyLocalCoordSys localCoordSys = new MyLocalCoordSys(origin, m_coorsSystemSize);
            long            newId         = m_lastCoordSysId++; // Just raise by one. There wont be so much id's for long to be overflooded.

            localCoordSys.Id = newId;
            m_localCoordSystems.Add(newId, localCoordSys);

            if (cubeGrid.LocalCoordSystem != 0)
            {
                this.UnregisterCubeGrid(cubeGrid);
            }

            this.RegisterCubeGrid(cubeGrid, localCoordSys);

            MyCreateCoordSysBuffer createCoordSysBuffer = new MyCreateCoordSysBuffer();

            createCoordSysBuffer.Position = origin.Position;
            createCoordSysBuffer.Rotation = origin.Rotation;
            createCoordSysBuffer.Id       = newId;

            if (sync)
            {
                MyMultiplayer.RaiseStaticEvent(x => CoordSysCreated_Client, createCoordSysBuffer);
            }
        }
        /// <summary>
        /// Returns closest local coord system.
        /// </summary>
        /// <param name="position">World position.</param>
        /// <returns>Local coord system.</returns>
        private MyLocalCoordSys GetClosestCoordSys(ref Vector3D position, bool checkContain = true)
        {
            MyLocalCoordSys closestOne        = null;
            double          closestDistanceSq = double.MaxValue;

            foreach (MyLocalCoordSys coordSys in m_localCoordSystems.Values)
            {
                if (!checkContain || coordSys.Contains(ref position))
                {
                    double distnaceSq = (coordSys.Origin.Position - position).LengthSquared();
                    if (distnaceSq < closestDistanceSq)
                    {
                        closestOne        = coordSys;
                        closestDistanceSq = distnaceSq;
                    }
                }
            }

            return(closestOne);
        }
        public override void Init(MyObjectBuilder_SessionComponent sessionComponent)
        {
            base.Init(sessionComponent);
            var coordSysBuilder = sessionComponent as MyObjectBuilder_CoordinateSystem;

            this.m_lastCoordSysId = coordSysBuilder.LastCoordSysId;

            foreach (var coordSys in coordSysBuilder.CoordSystems)
            {
                MyTransformD origin = new MyTransformD();
                origin.Position = coordSys.Position;
                origin.Rotation = coordSys.Rotation;

                MyLocalCoordSys newCoordSys = new MyLocalCoordSys(origin);
                newCoordSys.Id            = coordSys.Id;
                newCoordSys.EntityConuter = coordSys.EntityCount;

                m_localCoordSystems.Add(coordSys.Id, newCoordSys);
            }
        }
        /// <summary>
        /// Converts world position to be snapped to closest grid.
        /// </summary>
        /// <param name="worldPos">World position.</param>
        /// <param name="gridSize">Grid size.</param>
        /// <param name="staticGridAlignToCenter">Is grid align to static.</param>
        /// <returns></returns>
        public MyTransformD SnapWorldPosToClosestGrid(ref Vector3D worldPos, double gridSize, bool staticGridAlignToCenter)
        {
            m_lastSelectedCoordSys = m_selectedCoordSys;

            MyLocalCoordSys localCoordSys = null;

            localCoordSys = this.GetClosestCoordSys(ref worldPos);

            // If no coord sys found, return origin(0,0,0) with no transformation!
            if (localCoordSys == null)
            {
                localCoordSys      = new MyLocalCoordSys();
                m_selectedCoordSys = 0;
            }
            else
            {
                m_selectedCoordSys = localCoordSys.Id;
            }

            if (m_selectedCoordSys == 0)
            {
                m_isSelection = false;
            }
            else
            {
                m_isSelection = true;
            }

            if (m_selectedCoordSys != m_lastSelectedCoordSys)
            {
                m_selectionChanged = true;
            }
            else
            {
                m_selectionChanged = false;
            }

            //if (!m_isSelection && m_selectionChanged)
            //{
            //    this.Disable();
            //}
            //else if (m_selectionChanged && m_lastSelectedCoordSys == 0)
            //{
            //    this.Enable();
            //}

            Quaternion rotation    = localCoordSys.Origin.Rotation;
            Quaternion invRotation = Quaternion.Inverse(rotation);
            Vector3D   position    = localCoordSys.Origin.Position;

            Vector3D vec = worldPos - position;

            vec = Vector3D.Transform(vec, invRotation);

            MyCoordinateSystem.GetPosRoundedToGrid(ref vec, gridSize, staticGridAlignToCenter);

            vec = Vector3D.Transform(vec, rotation);

            MyTransformD localCoordsTransform = new MyTransformD();

            localCoordsTransform.Position = position + vec;
            localCoordsTransform.Rotation = rotation;

            return(localCoordsTransform);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Converts world position to be snapped to closest grid.
        /// </summary>
        /// <param name="worldPos">World position.</param>
        /// <param name="gridSize">Grid size.</param>
        /// <param name="staticGridAlignToCenter">Is grid align to static.</param>
        /// <returns></returns>
        public CoordSystemData SnapWorldPosToClosestGrid(ref Vector3D worldPos, double gridSize, bool staticGridAlignToCenter)
        {
            m_lastSelectedCoordSys = m_selectedCoordSys;

            MyLocalCoordSys localCoordSys = null;

            localCoordSys = this.GetClosestCoordSys(ref worldPos);

            // If no coord sys found, return origin(0,0,0) with no rotation!
            if (localCoordSys == null)
            {
                localCoordSys      = new MyLocalCoordSys(m_coorsSystemSize);
                m_selectedCoordSys = 0;
            }
            else
            {
                m_selectedCoordSys = localCoordSys.Id;
            }

            if (m_selectedCoordSys == 0)
            {
                m_localCoordExist = false;
            }
            else
            {
                m_localCoordExist = true;
            }

            if (m_selectedCoordSys != m_lastSelectedCoordSys)
            {
                m_selectionChanged = true;
                if (OnCoordinateChange != null)
                {
                    OnCoordinateChange();
                }
            }
            else
            {
                m_selectionChanged = false;
            }

            //if (!m_localCoordExist && m_selectionChanged)
            //{
            //    this.Disable();
            //}
            //else if (m_selectionChanged && m_lastSelectedCoordSys == 0)
            //{
            //    this.Enable();
            //}

            CoordSystemData coordData = new CoordSystemData();

            Quaternion rotation    = localCoordSys.Origin.Rotation;
            Quaternion invRotation = Quaternion.Inverse(rotation);
            Vector3D   position    = localCoordSys.Origin.Position;

            Vector3D vec = worldPos - position;

            vec = Vector3D.Transform(vec, invRotation);

            MyCoordinateSystem.GetPosRoundedToGrid(ref vec, gridSize, staticGridAlignToCenter);

            coordData.LocalSnappedPos = vec;

            vec = Vector3D.Transform(vec, rotation);

            MyTransformD localCoordsTransform = new MyTransformD();

            localCoordsTransform.Position = position + vec;
            localCoordsTransform.Rotation = rotation;

            coordData.SnappedTransform = localCoordsTransform;
            coordData.Origin           = localCoordSys.Origin;

            return(coordData);
        }