diff --git a/DroneSimulator/Drone.cs b/DroneSimulator/Drone.cs index 6c8e7fd..061c070 100644 --- a/DroneSimulator/Drone.cs +++ b/DroneSimulator/Drone.cs @@ -81,16 +81,28 @@ namespace DroneSimulator return mem; } - public struct DataVisual + public VisualData.VisualDrone GetVisual(int count, int index) { - public int ID; // Идентификатор - public float W, X, Y, Z; // Кватернион вращения - public float PosX, PosY, PosZ; // Координаты в пространстве - } + VisualData.VisualDrone drone = new VisualData.VisualDrone(); - public DataVisual GetVisual() - { - return new DataVisual() { ID = this.ID, W = this.Quat.W, X = this.Quat.X, Y = this.Quat.Y, Z = this.Quat.Z, PosX = this.PosXYZ.X, PosY = this.PosXYZ.Y, PosZ = this.PosXYZ.Z }; + drone.Head.Size = Marshal.SizeOf(typeof(VisualData.VisualDrone)); + drone.Head.Type = VisualData.VisualHead.VisualType.Drone; + + drone.Count = count; + drone.Index = index; + + drone.ID = ID; + drone.Color.A = 255; drone.Color.R = 255; drone.Color.G = 0; drone.Color.B = 0; + + drone.Rotate.X = Quat.X; drone.Rotate.Y = Quat.Y; drone.Rotate.Z = Quat.Z; drone.Rotate.W = Quat.W; + drone.Position.X = PosXYZ.X; drone.Position.Y = PosXYZ.Y; drone.Position.Z = PosXYZ.Z; + drone.Scale = 1.0f; + + drone.State = VisualData.VisualDrone.DroneState.Active; + + drone.Power = Power; + + return drone; } private void ThreadFunction() @@ -189,7 +201,7 @@ namespace DroneSimulator SpdPRY += AccPRY * (Dynamic * time / (Mass * Length)); - float wind_x = 0, wind_y = 0; + float wind_x = 0, wind_y = 0, wind_z = 0; if (Area.Wind.Enable) { @@ -201,13 +213,15 @@ namespace DroneSimulator float spd_x = spd.X - SpdXYZ.X; float spd_y = spd.Y - SpdXYZ.Y; + float spd_z = spd.Z - SpdXYZ.Z; wind_x = 0.5f * Area.Wind.Density * Area.Wind.Resist * (spd_x * MathF.Abs(spd_x)); wind_y = 0.5f * Area.Wind.Density * Area.Wind.Resist * (spd_y * MathF.Abs(spd_y)); + wind_z = 0.5f * Area.Wind.Density * Area.Wind.Resist * (spd_z * MathF.Abs(spd_z)); } Quaternion pow = Quaternion.Inverse(Quat) * new Quaternion(0, 0, flow, 0) * Quat; - AccXYZ = new Vector3(pow.X + wind_x, pow.Y + wind_y, pow.Z) * (Gravity / Mass); + AccXYZ = new Vector3(pow.X + wind_x, pow.Y + wind_y, pow.Z + wind_z) * (Gravity / Mass); SpdXYZ += (AccXYZ + new Vector3(0, 0, -Gravity)) * time; PosXYZ += SpdXYZ * time; diff --git a/DroneSimulator/FormMain.cs b/DroneSimulator/FormMain.cs index 7d0a514..10ceaff 100644 --- a/DroneSimulator/FormMain.cs +++ b/DroneSimulator/FormMain.cs @@ -183,9 +183,11 @@ namespace DroneSimulator { NetServerVisual.ReceiveData data = (NetServerVisual.ReceiveData)o; + int index = 0; + foreach (Drone d in AllDrones) { - Drone.DataVisual v = d.GetVisual(); + VisualData.VisualDrone v = d.GetVisual(AllDrones.Count, index++); try { data.Client.Send(Drone.getBytes(v)); } catch { } diff --git a/DroneSimulator/VisualData.cs b/DroneSimulator/VisualData.cs new file mode 100644 index 0000000..8469466 --- /dev/null +++ b/DroneSimulator/VisualData.cs @@ -0,0 +1,39 @@ +using System.Numerics; + +namespace VisualData +{ + public struct VisualHead + { + public enum VisualType : int { None = 0, Drone = 1 } // Тип объекта + + public int Size; // Размер данных этой структуры в байтах (проверка для соответствия передачи структуры) + + public VisualType Type; // Тип передоваемого объекта + } + + public struct VisualDrone + { + public VisualHead Head; + public enum DroneState : int { Dead = 0, Disabled = 1, Waiting = 2, Active = 3 } // Переключения типа 3D модели + + public int Count; // Всего дронов на полигоне + public int Index; // Номер дрона + + public int ID; // Идентификатор (для привязки камеры) + + public struct ARGB { public byte A, R, G, B; } + public struct Quat { public float X, Y, Z, W; } + public struct Vect3 { public float X, Y, Z; } + + public ARGB Color; // Цвет корпуса + public Quat Rotate; // Кватернион вращения + public Vect3 Position; // Координаты в пространстве + + public float Scale; // Масштаб модельки (1=оригинальный) + + public DroneState State; // Тип прорисовываемой модели + + public float Power; // Скорость всех двигателей + } + +} \ No newline at end of file