Example #1
0
        private unsafe void UpdateWheels(TrackMarksBuilderComponent builder, ChassisAnimationComponent chassis, TrackMarksRenderComponent render, TrackMarksComponent trackMarks, int track, WheelData[] currentWheelsPositions, WheelData[] prevWheelsPosition, WheelData[] temp)
        {
            float      highDistance = chassis.highDistance;
            WheelData  data         = prevWheelsPosition[prevWheelsPosition.Length / 2];
            WheelData  data2        = currentWheelsPositions[currentWheelsPositions.Length / 2];
            float      num2         = (data.position - data2.position).magnitude + builder.remaingDistance[track];
            int        num3         = (int)(num2 / builder.moveStep);
            Vector3    lhs          = Vector3.Cross(trackMarks.transform.up, this.GetVelocity(builder) * Time.smoothDeltaTime).normalized *builder.side[track];
            float      b            = Mathf.Max(Mathf.Abs(Vector3.Dot(lhs, this.ComputeTrackDiagonal(builder, trackMarks, currentWheelsPositions, ref lhs))) / 2f, trackMarks.markWidth);
            float      a            = Mathf.Max(Mathf.Abs(Vector3.Dot(lhs, this.ComputeTrackDiagonal(builder, trackMarks, prevWheelsPosition, ref lhs))) / 2f, trackMarks.markWidth);
            bool       flag         = false;
            RaycastHit hit          = new RaycastHit();

            for (int i = 0; i < num3; i++)
            {
                float t     = ((float)i) / ((float)num3);
                float width = Mathf.Lerp(a, b, t);
                float num9  = Mathf.Min((float)(width / trackMarks.markWidth), (float)2f);
                this.InterpolateWheelsPosition(t, prevWheelsPosition, currentWheelsPositions, temp);
                flag = this.IsHit(builder, trackMarks, temp, highDistance, out hit);
                RaycastHit *hitPtr1 = &hit;
                hitPtr1.point -= (builder.side[track] * trackMarks.transform.right) * trackMarks.shiftToCenter;
                this.UpdateTrack(builder, render, trackMarks, track, flag, ref hit, width, num9 - 1f);
                num2 -= builder.moveStep;
            }
            builder.remaingDistance[track] = num2;
        }
Example #2
0
 private void UpdateSingleTrack(TrackMarksBuilderComponent builder, ChassisAnimationComponent chassis, TrackMarksRenderComponent render, TrackMarksComponent trackMarks, int track, Transform[] wheels, WheelData[] prevWheelsData, WheelData[] currentWheelsData, WheelData[] tempWheelsData)
 {
     this.CheckResetWheels(builder, track, wheels, prevWheelsData);
     this.CopyWheelsPositionFromTransforms(wheels, currentWheelsData);
     this.UpdateWheels(builder, chassis, render, trackMarks, track, currentWheelsData, prevWheelsData, tempWheelsData);
     Array.Copy(currentWheelsData, prevWheelsData, currentWheelsData.Length);
 }
Example #3
0
 public void OnUpdate(UpdateEvent evt, TrackMarkUpdateNode node, [JoinAll] CameraNode cameraNode)
 {
     if (cameraNode.camera.Enabled)
     {
         int num = 6 - GraphicsSettings.INSTANCE.CurrentQualityLevel;
         if (num > 0)
         {
             long num2;
             node.trackMarks.tick = num2 = node.trackMarks.tick + 1L;
             if ((num2 % ((long)num)) != 0L)
             {
                 return;
             }
         }
         node.trackMarks.tick = 0L;
         TrackMarksRenderComponent  trackMarksRender  = node.trackMarksRender;
         TrackMarksBuilderComponent trackMarksBuilder = node.trackMarksBuilder;
         ChassisAnimationComponent  chassisAnimation  = node.chassisAnimation;
         TrackMarksComponent        trackMarks        = node.trackMarks;
         trackMarksBuilder.rigidbody = node.rigidbody.Rigidbody;
         if (this.NeedUpdateMarks(trackMarksBuilder, trackMarks))
         {
             this.UpdateSingleTrack(trackMarksBuilder, chassisAnimation, trackMarksRender, trackMarks, 0, trackMarksBuilder.leftWheels, trackMarksBuilder.prevLeftWheelsData, trackMarksBuilder.currentLeftWheelsData, trackMarksBuilder.tempLeftWheelsData);
             this.UpdateSingleTrack(trackMarksBuilder, chassisAnimation, trackMarksRender, trackMarks, 1, trackMarksBuilder.rightWheels, trackMarksBuilder.prevRightWheelsData, trackMarksBuilder.currentRightWheelsData, trackMarksBuilder.tempRightWheelsData);
         }
         if (trackMarksRender.dirty)
         {
             this.UpdateMesh(trackMarksRender);
             trackMarksRender.dirty = false;
         }
     }
 }
Example #4
0
        private void FindWheels(TrackMarksBuilderComponent builder, ChassisAnimationComponent chassis, TrackMarksComponent trackMarks)
        {
            List <Transform> list  = this.FindAllNodes(trackMarks.transform, chassis.movingWheelName, null);
            List <Transform> list2 = new List <Transform>();
            List <Transform> list3 = new List <Transform>();

            for (int i = 0; i < list.Count; i++)
            {
                Transform item = list[i];
                if (item.name.Contains("left_"))
                {
                    list2.Add(item);
                }
                if (item.name.Contains("right_"))
                {
                    list3.Add(item);
                }
            }
            ZSorter comparer = new ZSorter();

            list2.Sort(comparer);
            list3.Sort(comparer);
            builder.leftWheels  = list2.ToArray();
            builder.rightWheels = list3.ToArray();
        }
        public void OnInit(ChassisInitEvent e, ChassisAnimationInitNode node)
        {
            Transform root = node.tankVisualRoot.transform;
            ChassisAnimationComponent       chassisAnimation = node.chassisAnimation;
            ChassisTrackControllerComponent component        = new ChassisTrackControllerComponent {
                LeftTrack  = this.ConstructController(chassisAnimation.leftTrackData, root),
                RightTrack = this.ConstructController(chassisAnimation.rightTrackData, root)
            };

            chassisAnimation.TracksMaterial = TankMaterialsUtil.GetTrackMaterial(node.trackRenderer.Renderer);
            node.Entity.AddComponent(component);
        }
Example #6
0
 public void AnimateWheelsAndTracksRotation(TimeUpdateEvent evt, AliveChassisAnimationNode node)
 {
     if (node.cameraVisibleTrigger.IsVisibleAtRange(50f))
     {
         ChassisAnimationComponent chassisAnimation = node.chassisAnimation;
         TrackComponent            track            = node.track;
         TrackController           leftTrack        = node.chassisTrackController.LeftTrack;
         TrackController           rightTrack       = node.chassisTrackController.RightTrack;
         float maxSpeed  = node.effectiveSpeed.MaxSpeed;
         float deltaTime = evt.DeltaTime;
         this.CalculateTrackAnimationSpeed(track.LeftTrack, node, maxSpeed, deltaTime);
         chassisAnimation.LeftTrackPosition += (track.LeftTrack.animationSpeed * deltaTime) * 0.5f;
         leftTrack.UpdateWheelsRotation(chassisAnimation.LeftTrackPosition);
         this.CalculateTrackAnimationSpeed(track.RightTrack, node, maxSpeed, deltaTime);
         chassisAnimation.RightTrackPosition += (track.RightTrack.animationSpeed * deltaTime) * 0.5f;
         rightTrack.UpdateWheelsRotation(chassisAnimation.RightTrackPosition);
         if (chassisAnimation.TracksMaterial != null)
         {
             float   num4   = -chassisAnimation.RightTrackPosition * chassisAnimation.tracksMaterialSpeedMultiplyer;
             Vector2 vector = new Vector2((-chassisAnimation.LeftTrackPosition * chassisAnimation.tracksMaterialSpeedMultiplyer) % 1f, num4 % 1f);
             chassisAnimation.TracksMaterial.SetVector(TankMaterialPropertyNames.TRACKS_OFFSET, vector);
         }
     }
 }
Example #7
0
 public void AnimateWheelsAndTracksPosition(TimeUpdateEvent evt, ChassisAnimationNode node)
 {
     if (((GraphicsSettings.INSTANCE.CurrentQualityLevel > 1) || !node.Entity.HasComponent <SelfTankComponent>()) ? ((GraphicsSettings.INSTANCE.CurrentQualityLevel > 1) && node.cameraVisibleTrigger.IsVisibleAtRange(50f)) : true)
     {
         ChassisAnimationComponent chassisAnimation = node.chassisAnimation;
         TrackController           leftTrack        = node.chassisTrackController.LeftTrack;
         TrackController           rightTrack       = node.chassisTrackController.RightTrack;
         leftTrack.highDistance  = chassisAnimation.highDistance;
         leftTrack.lowDistance   = chassisAnimation.lowDistance;
         rightTrack.highDistance = chassisAnimation.highDistance;
         rightTrack.lowDistance  = chassisAnimation.lowDistance;
         Transform transform = node.tankVisualRoot.transform;
         if (chassisAnimation.additionalRaycastsEnabled)
         {
             leftTrack.AnimateWithAdditionalRays(transform, chassisAnimation.smoothSpeed, chassisAnimation.maxStretchingCoeff);
             rightTrack.AnimateWithAdditionalRays(transform, chassisAnimation.smoothSpeed, chassisAnimation.maxStretchingCoeff);
         }
         else
         {
             leftTrack.Animate(transform, chassisAnimation.smoothSpeed, chassisAnimation.maxStretchingCoeff);
             rightTrack.Animate(transform, chassisAnimation.smoothSpeed, chassisAnimation.maxStretchingCoeff);
         }
     }
 }