/// <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); }
/// <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); }
/// <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); }