Пример #1
0
 /// <summary>
 /// NitroxTransform is always attached to an Entity
 /// </summary>
 public NitroxTransform(NitroxVector3 localPosition, NitroxQuaternion localRotation, NitroxVector3 scale, Entity entity)
 {
     LocalPosition = localPosition;
     LocalRotation = localRotation;
     LocalScale    = scale;
     Entity        = entity;
 }
Пример #2
0
        public void ChangingTransformTest()
        {
            NitroxVector3    beforeLocalPosition = new NitroxVector3(15, 2, -7);
            NitroxQuaternion beforeRotation      = NitroxQuaternion.FromEuler(45, 15, 1);

            NitroxVector3    beforeChildLocalPosition = new NitroxVector3(75, -10, 13.333f);
            NitroxQuaternion beforeChildRotation      = NitroxQuaternion.FromEuler(75, 11, 5);

            NitroxVector3    setGlobalPosition = new NitroxVector3(34.62131f, 45.99337f, -10.77733f);
            NitroxQuaternion setGlobalRotation = new NitroxQuaternion(0.6743798f, 0.2302919f, 0.02638498f, 0.7010573f);

            NitroxVector3    afterLocalPosition = new NitroxVector3(17, 14, -13);
            NitroxQuaternion afterLocalRotation = NitroxQuaternion.FromEuler(60, 25, 0);

            NitroxVector3    afterChildGlobalPosition = new NitroxVector3(379.541f, 109.6675f, -167.4466f);
            NitroxQuaternion afterChildGlobalRotation = NitroxQuaternion.FromEuler(17.81689f, 187.7957f, 151.9425f);

            NitroxTransform grandchild3      = new NitroxTransform(beforeLocalPosition, beforeRotation, new NitroxVector3(2.5f, 2.5f, 2.5f), null);
            NitroxTransform grandgrandchild1 = new NitroxTransform(beforeChildLocalPosition, beforeChildRotation, new NitroxVector3(1, 1, 1), null);

            grandgrandchild1.SetParent(grandchild3, false);
            grandchild3.SetParent(child1, true);

            grandchild3.Position.Equals(beforeLocalPosition, TOLERANCE).Should().BeTrue($"Expected: {beforeLocalPosition} Found: {grandchild3.Position}");
            grandchild3.Rotation.Equals(beforeRotation, TOLERANCE).Should().BeTrue($"Expected: {beforeRotation} Found: {grandchild3.Rotation}");

            grandchild3.Position = setGlobalPosition;
            grandchild3.Rotation = setGlobalRotation;

            grandchild3.LocalPosition.Equals(afterLocalPosition, TOLERANCE).Should().BeTrue($"Expected: {afterLocalPosition} Found: {grandchild3.LocalPosition}");
            grandchild3.LocalRotation.Equals(afterLocalRotation, TOLERANCE).Should().BeTrue($"Expected: {afterLocalRotation} Found: {grandchild3.LocalRotation}");

            grandgrandchild1.Position.Equals(afterChildGlobalPosition, TOLERANCE).Should().BeTrue($"Expected: {afterChildGlobalPosition} Found: {grandgrandchild1.Position}");
            grandgrandchild1.Rotation.Equals(afterChildGlobalRotation, TOLERANCE).Should().BeTrue($"Expected: {afterChildGlobalRotation} Found: {grandgrandchild1.Rotation}");
        }
Пример #3
0
 public InitialRemotePlayerData(PlayerContext playerContext, NitroxVector3 position, Optional <NitroxId> subRootId, List <NitroxTechType> equippedTechTypes)
 {
     PlayerContext     = playerContext;
     Position          = position;
     SubRootId         = subRootId;
     EquippedTechTypes = equippedTechTypes;
 }
Пример #4
0
        public static NitroxVector3 Normalize(NitroxVector3 value)
        {
            float ls     = value.X * value.X + value.Y * value.Y + value.Z * value.Z;
            float length = Mathf.Sqrt(ls);

            return(new NitroxVector3(value.X / length, value.Y / length, value.Z / length));
        }
Пример #5
0
 public static NitroxVector3 Cross(NitroxVector3 vector1, NitroxVector3 vector2)
 {
     return(new NitroxVector3(
                vector1.Y * vector2.Z - vector1.Z * vector2.Y,
                vector1.Z * vector2.X - vector1.X * vector2.Z,
                vector1.X * vector2.Y - vector1.Y * vector2.X));
 }
Пример #6
0
        public static NitroxQuaternion LookRotation(NitroxVector3 forward, NitroxVector3 up)
        {
            NitroxVector3 vector  = NitroxVector3.Normalize(forward);
            NitroxVector3 vector2 = NitroxVector3.Normalize(NitroxVector3.Cross(up, vector));
            NitroxVector3 vector3 = NitroxVector3.Cross(vector, vector2);
            float         m00     = vector2.X;
            float         m01     = vector2.Y;
            float         m02     = vector2.Z;
            float         m10     = vector3.X;
            float         m11     = vector3.Y;
            float         m12     = vector3.Z;
            float         m20     = vector.X;
            float         m21     = vector.Y;
            float         m22     = vector.Z;


            float            num8 = (m00 + m11) + m22;
            NitroxQuaternion quaternion;

            if (num8 > 0f)
            {
                float num = Mathf.Sqrt(num8 + 1f);
                quaternion.W = num * 0.5f;
                num          = 0.5f / num;
                quaternion.X = (m12 - m21) * num;
                quaternion.Y = (m20 - m02) * num;
                quaternion.Z = (m01 - m10) * num;
                return(quaternion);
            }
            if ((m00 >= m11) && (m00 >= m22))
            {
                float num7 = Mathf.Sqrt(((1f + m00) - m11) - m22);
                float num4 = 0.5f / num7;
                quaternion.X = 0.5f * num7;
                quaternion.Y = (m01 + m10) * num4;
                quaternion.Z = (m02 + m20) * num4;
                quaternion.W = (m12 - m21) * num4;
                return(quaternion);
            }
            if (m11 > m22)
            {
                float num6 = Mathf.Sqrt(((1f + m11) - m00) - m22);
                float num3 = 0.5f / num6;
                quaternion.X = (m10 + m01) * num3;
                quaternion.Y = 0.5f * num6;
                quaternion.Z = (m21 + m12) * num3;
                quaternion.W = (m20 - m02) * num3;
                return(quaternion);
            }
            float num5 = Mathf.Sqrt(((1f + m22) - m00) - m11);
            float num2 = 0.5f / num5;

            quaternion.X = (m20 + m02) * num2;
            quaternion.Y = (m21 + m12) * num2;
            quaternion.Z = 0.5f * num5;
            quaternion.W = (m01 - m10) * num2;
            return(quaternion);
        }
Пример #7
0
        public static NitroxMatrix4x4 TRS(NitroxVector3 localPos, NitroxQuaternion localRotation, NitroxVector3 localScale)
        {
            NitroxMatrix4x4 scaleMatrix       = SetScale(localScale);
            NitroxMatrix4x4 rotationMatrix    = SetRotation(localRotation);
            NitroxMatrix4x4 translationMatrix = SetTranslation(localPos);
            NitroxMatrix4x4 result            = translationMatrix * rotationMatrix * scaleMatrix;

            return(result);
        }
Пример #8
0
        public static void DecomposeMatrix(ref NitroxMatrix4x4 matrix, out NitroxVector3 localPosition, out NitroxQuaternion localRotation, out NitroxVector3 localScale)
        {
            NitroxMatrix4x4 before = new NitroxMatrix4x4(matrix);

            localScale    = ExtractScale(ref matrix);
            localRotation = ExtractRotation(ref matrix);
            localPosition = ExtractTranslation(ref matrix);

            matrix = before;
        }
Пример #9
0
 public void InitEscapePodModel(NitroxId id, NitroxVector3 location, NitroxId fabricatorId, NitroxId medicalFabricatorId, NitroxId storageContainerId, NitroxId radioId, bool damaged, bool radioDamaged)
 {
     Id                  = id;
     Location            = location;
     FabricatorId        = fabricatorId;
     MedicalFabricatorId = medicalFabricatorId;
     StorageContainerId  = storageContainerId;
     RadioId             = radioId;
     Damaged             = damaged;
     RadioDamaged        = radioDamaged;
 }
Пример #10
0
        public AbsoluteEntityCell(NitroxVector3 worldSpace, int level)
        {
            Level = level;

            NitroxVector3 localPosition = (worldSpace + Map.Main.BatchDimensionCenter) / Map.Main.BatchSize;

            BatchId = Int3.Floor(localPosition);

            NitroxVector3 cell = (localPosition - BatchId) * GetCellsPerBlock();

            CellId = Int3.Floor(new NitroxVector3(cell.X + 0.0001f, cell.Y + 0.0001f, cell.Z + 0.0001f));
        }
Пример #11
0
 public VehicleMovementData(NitroxTechType techType, NitroxId id, NitroxVector3 position, NitroxQuaternion rotation)
 {
     TechType           = techType;
     Id                 = id;
     Position           = position;
     Rotation           = rotation;
     Velocity           = NitroxVector3.Zero;
     AngularVelocity    = NitroxVector3.Zero;
     SteeringWheelYaw   = 0f;
     SteeringWheelPitch = 0f;
     AppliedThrottle    = false;
 }
Пример #12
0
 public VehicleMovementData(NitroxTechType techType, NitroxId id, NitroxVector3 position, NitroxQuaternion rotation, NitroxVector3 velocity, NitroxVector3 angularVelocity, float steeringWheelYaw, float steeringWheelPitch, bool appliedThrottle)
 {
     TechType           = techType;
     Id                 = id;
     Position           = position;
     Rotation           = rotation;
     Velocity           = velocity;
     AngularVelocity    = angularVelocity;
     SteeringWheelYaw   = steeringWheelYaw;
     SteeringWheelPitch = steeringWheelPitch;
     AppliedThrottle    = appliedThrottle;
 }
Пример #13
0
 public VehicleModel(NitroxTechType techType, NitroxId id, NitroxVector3 position, NitroxQuaternion rotation, IEnumerable <InteractiveChildObjectIdentifier> interactiveChildIdentifiers, Optional <NitroxId> dockingBayId, string name, NitroxVector3[] hsb, float health)
 {
     TechType = techType;
     Id       = id;
     Position = position;
     Rotation = rotation;
     InteractiveChildIdentifiers = new ThreadSafeCollection <InteractiveChildObjectIdentifier>(interactiveChildIdentifiers);
     DockingBayId = dockingBayId;
     Name         = name;
     HSB          = hsb;
     Health       = health;
 }
Пример #14
0
 public Entity(NitroxVector3 position, NitroxQuaternion rotation, NitroxVector3 scale, NitroxTechType techType, int level, string classId, bool spawnedByServer, NitroxId waterParkId, byte[] serializedGameObject, bool existsInGlobalRoot, NitroxId id)
 {
     Transform                    = new NitroxTransform(position, rotation, scale, this);
     TechType                     = techType;
     Id                           = id;
     Level                        = level;
     ClassId                      = classId;
     SpawnedByServer              = spawnedByServer;
     WaterParkId                  = waterParkId;
     SerializedGameObject         = serializedGameObject;
     ExistsInGlobalRoot           = existsInGlobalRoot;
     ExistingGameObjectChildIndex = null;
 }
Пример #15
0
        public void TestToEuler()
        {
            NitroxVector3 euler1               = defaultVal.ToEuler();
            NitroxVector3 euler2               = new NitroxQuaternion(0.5f, 0.5f, -0.5f, 0.5f).ToEuler();
            NitroxVector3 euler3               = new NitroxQuaternion(-0.5f, 0.5f, -0.5f, -0.5f).ToEuler();
            NitroxVector3 expectedResult1      = new NitroxVector3(45f, 300f, 255f);
            NitroxVector3 expectedResult1Other = new NitroxVector3(104.5108f, 50.75358f, 316.9205f); //defaultVal can be interpreted as both euler :shrug:
            NitroxVector3 expectedResult2      = new NitroxVector3(90f, 90f, 0f);
            NitroxVector3 expectedResult3      = new NitroxVector3(90f, 270f, 0f);

            (euler1.Equals(expectedResult1, TOLERANCE) || euler1.Equals(expectedResult1Other, TOLERANCE)).Should().BeTrue($"Expected: {expectedResult1} or {expectedResult1Other}- Found: {euler1}");
            euler2.Equals(expectedResult2, TOLERANCE).Should().BeTrue($"Expected: {expectedResult2} - Found: {euler2}");
            euler3.Equals(expectedResult3, TOLERANCE).Should().BeTrue($"Expected: {expectedResult3} - Found: {euler3}");
        }
Пример #16
0
        public void PositionTest()
        {
            NitroxVector3 rootResult        = new NitroxVector3(1, 1, 1);
            NitroxVector3 child1Result      = new NitroxVector3(6, 4, -5);
            NitroxVector3 child2Result      = new NitroxVector3(12, 1, 0.5f);
            NitroxVector3 grandchild1Result = new NitroxVector3(28.82663f, 6.55587f, 31.11665f);
            NitroxVector3 grandchild2Result = new NitroxVector3(5.79976f, -2.040047f, 6.966463f);

            root.Position.Equals(rootResult, TOLERANCE).Should().BeTrue($"Expected: {rootResult} Found: {root.Position}");
            child1.Position.Equals(child1Result, TOLERANCE).Should().BeTrue($"Expected: {child1Result} Found: {child1.Position}");
            child2.Position.Equals(child2Result, TOLERANCE).Should().BeTrue($"Expected: {child2Result} Found: {child2.Position}");
            grandchild1.Position.Equals(grandchild1Result, TOLERANCE).Should().BeTrue($"Expected: {grandchild1Result} Found: {grandchild1.Position}");
            grandchild2.Position.Equals(grandchild2Result, TOLERANCE).Should().BeTrue($"Expected: {grandchild2Result} Found: {grandchild2.Position}");
        }
Пример #17
0
 public BasePiece(NitroxId id, NitroxVector3 itemPosition, NitroxQuaternion rotation, NitroxVector3 cameraPosition, NitroxQuaternion cameraRotation, NitroxTechType techType, Optional <NitroxId> parentId, bool isFurniture, Optional <RotationMetadata> rotationMetadata)
 {
     Id                    = id;
     ItemPosition          = itemPosition;
     Rotation              = rotation;
     TechType              = techType;
     CameraPosition        = cameraPosition;
     CameraRotation        = cameraRotation;
     ParentId              = parentId;
     IsFurniture           = isFurniture;
     ConstructionAmount    = 0.0f;
     ConstructionCompleted = false;
     RotationMetadata      = rotationMetadata;
     Metadata              = Optional.Empty;
 }
Пример #18
0
        public NitroxVector3 MultiplyPoint(NitroxVector3 localPosition)
        {
            float x = M[0, 0] * localPosition.X + M[0, 1] * localPosition.Y + M[0, 2] * localPosition.Z + M[0, 3];
            float y = M[1, 0] * localPosition.X + M[1, 1] * localPosition.Y + M[1, 2] * localPosition.Z + M[1, 3];
            float z = M[2, 0] * localPosition.X + M[2, 1] * localPosition.Y + M[2, 2] * localPosition.Z + M[2, 3];
            float w = M[3, 0] * localPosition.X + M[3, 1] * localPosition.Y + M[3, 2] * localPosition.Z + M[3, 3];

            if (w == 1)
            {
                return(new NitroxVector3(x, y, z));
            }
            else
            {
                NitroxVector3 vector = new NitroxVector3(x, y, z) / w;
                return(vector);
            }
        }
Пример #19
0
        public static NitroxMatrix4x4 SetScale(NitroxVector3 localScale)
        {
            NitroxMatrix4x4 scaleMatrix;

            scaleMatrix.M     = new float[4, 4];
            scaleMatrix[0, 0] = 1f;
            scaleMatrix[1, 1] = 1f;
            scaleMatrix[2, 2] = 1f;
            scaleMatrix[3, 3] = 1f;


            scaleMatrix[0, 0] = localScale.X;
            scaleMatrix[1, 1] = localScale.Y;
            scaleMatrix[2, 2] = localScale.Z;

            return(scaleMatrix);
        }
Пример #20
0
        public static NitroxMatrix4x4 SetTranslation(NitroxVector3 localPosition)
        {
            NitroxMatrix4x4 transMatrix;

            transMatrix.M     = new float[4, 4];
            transMatrix[0, 0] = 1f;
            transMatrix[1, 1] = 1f;
            transMatrix[2, 2] = 1f;
            transMatrix[3, 3] = 1f;



            transMatrix[0, 3] = localPosition.X;
            transMatrix[1, 3] = localPosition.Y;
            transMatrix[2, 3] = localPosition.Z;

            return(transMatrix);
        }
Пример #21
0
        public Entity(NitroxVector3 localPosition, NitroxQuaternion localRotation, NitroxVector3 scale, NitroxTechType techType, int level, string classId, bool spawnedByServer, NitroxId id, int?existingGameObjectChildIndex, Entity parentEntity = null)
        {
            Transform                    = new NitroxTransform(localPosition, localRotation, scale, this);
            TechType                     = techType;
            Id                           = id;
            Level                        = level;
            ClassId                      = classId;
            SpawnedByServer              = spawnedByServer;
            WaterParkId                  = null;
            SerializedGameObject         = null;
            Metadata                     = null;
            ExistsInGlobalRoot           = false;
            ExistingGameObjectChildIndex = existingGameObjectChildIndex;

            if (parentEntity != null)
            {
                ParentId = parentEntity.Id;
                Transform.SetParent(parentEntity.Transform);
            }
        }
Пример #22
0
        public static NitroxVector3 ExtractScale(ref NitroxMatrix4x4 matrix)
        {
            NitroxVector3 scale;

            scale.X = NitroxVector3.Length(new NitroxVector3(matrix[0, 0], matrix[0, 1], matrix[0, 2]));
            scale.Y = NitroxVector3.Length(new NitroxVector3(matrix[1, 0], matrix[1, 1], matrix[1, 2]));
            scale.Z = NitroxVector3.Length(new NitroxVector3(matrix[2, 0], matrix[2, 1], matrix[2, 2]));

            matrix[0, 0] /= scale.X;
            matrix[0, 1] /= scale.X;
            matrix[0, 2] /= scale.X;

            matrix[1, 0] /= scale.Y;
            matrix[1, 1] /= scale.Y;
            matrix[1, 2] /= scale.Y;

            matrix[2, 0] /= scale.Z;
            matrix[2, 1] /= scale.Z;
            matrix[2, 2] /= scale.Z;

            return(scale);
        }
Пример #23
0
        public static float Length(NitroxVector3 value)
        {
            float ls = value.X * value.X + value.Y * value.Y + value.Z * value.Z;

            return(Mathf.Sqrt(ls));
        }
Пример #24
0
 public BasePiece(NitroxId id, NitroxVector3 itemPosition, NitroxQuaternion rotation, NitroxVector3 cameraPosition, NitroxQuaternion cameraRotation, NitroxTechType techType, Optional <NitroxId> parentId, bool isFurniture, Optional <RotationMetadata> rotationMetadata, Optional <BasePieceMetadata> metadata) : this(id, itemPosition, rotation, cameraPosition, cameraRotation, techType, parentId, isFurniture, rotationMetadata)
 {
     Metadata = metadata;
 }