Пример #1
0
        public override void UpdateBeforeSimulation()
        {
            int rayCount = 0;

            if (m_rayCastQueue.Count > 0 && m_rayCastCounter % 20 == 0)
            {
                while (rayCount < 50 && m_rayCastQueue.Count > 0)
                {
                    var rand     = MyUtils.GetRandomInt(m_rayCastQueue.Count - 1);
                    var entity   = m_rayCastQueue[rand].Entity;
                    var l        = m_rayCastQueue[rand].Ray;
                    var p        = m_rayCastQueue[rand].Position;
                    var particle = m_rayCastQueue[rand].Particle;
                    if (entity is MyCubeGrid)
                    {
                        particle.Stop();
                        var grid   = entity as MyCubeGrid;
                        var invMat = grid.PositionComp.GetWorldMatrixNormalizedInv();

                        if (grid.BlocksDestructionEnabled)
                        {
                            grid.Physics.ApplyDeformation(6f, 3f, 3f, Vector3.Transform(p, invMat), Vector3.Normalize(Vector3.Transform(m_directionFromSunNormalized, invMat)), MyDamageType.Environment);
                        }

                        //MyPhysics.HavokWorld.CastRay(l.From, l.To, m_hitLst);
                        //rayCount++;
                        //MyEntity ent = null;
                        //if (m_hitLst.Count != 0)
                        //    ent = m_hitLst[0].GetEntity();
                        //if (ent == grid)
                        //{
                        //    grid.Physics.ApplyDeformation(6f, 3f, 3f, Vector3.Transform(m_hitLst[0].Position, invMat), Vector3.Normalize(Vector3.Transform(m_directionFromSunNormalized, invMat)), Sandbox.Game.Weapons.MyDamageType.Environment);
                        //    //var block = grid.GetBlock(Vector3I.Floor(Vector3.Transform(m_hitLst[0].Position, invMat) / grid.GridSize));
                        //    //if (block != null)
                        //    //    grid.ApplyDestructionDeformation(block);
                        //    m_rayCastQueue.RemoveAt(0);
                        //    m_hitLst.Clear();
                        //    break;
                        //}
                        m_rayCastQueue.RemoveAt(rand);
                        m_hitLst.Clear();
                        break;
                    }
                }
            }
            m_rayCastCounter++;
            //  Update only if sun wind is active
            if (IsActive == false)
            {
                return;
            }

            //?
            float dT = ((float)MySandboxGame.TotalGamePlayTimeInMilliseconds - (float)m_timeLastUpdate) / 1000.0f;

            m_timeLastUpdate = MySandboxGame.TotalGamePlayTimeInMilliseconds;

            if (MySandboxGame.IsPaused)
            {
                return;
            }

            m_deltaTime += dT;

            float traveledDistance = m_speed * m_deltaTime;

            //  If sun wind finished its way, we will turn it off
            if (traveledDistance >= MySunWindConstants.SUN_WIND_LENGTH_TOTAL)
            {
                IsActive = false;
                StopCue();

                return;
            }

            Vector3D campos = MySession.LocalCharacter == null ? Vector3D.Zero : MySession.LocalCharacter.Entity.WorldMatrix.Translation;

            //  This is plane that goes through sun wind, it's in its middle
            m_planeMiddle       = new PlaneD(m_initialSunWindPosition + m_directionFromSunNormalized * traveledDistance, m_directionFromSunNormalized);
            m_distanceToSunWind = m_planeMiddle.DistanceToPoint(ref campos);

            //  We make sure that sound moves always on line that goes through camera. So it's not in the middle of sun wind, more like middle where is camera.
            //  Reason is that I want the sound always go through camera.
            m_positionOnCameraLine = /*MySession.Player.PlayerEntity.Entity.WorldMatrix.Translation*/ -m_directionFromSunNormalized * m_distanceToSunWind;

            Vector3D positionFront = m_positionOnCameraLine + m_directionFromSunNormalized * 2000;
            Vector3D positionBack  = m_positionOnCameraLine + m_directionFromSunNormalized * -2000;

            m_planeFront = new PlaneD(positionFront, m_directionFromSunNormalized);
            m_planeBack  = new PlaneD(positionBack, m_directionFromSunNormalized);

            var distanceToFrontPlane = m_planeFront.DistanceToPoint(ref campos);
            var distanceToBackPlane  = m_planeBack.DistanceToPoint(ref campos);

            #region commented

            //Vector3 positionOfSound;
            //if ((distanceToFrontPlane <= 0) && (distanceToBackPlane >= 0))
            //{
            //    positionOfSound = MySession.Player.PlayerEntity.Entity.WorldMatrix.Translation;
            //}
            //else if (distanceToFrontPlane > 0)
            //{
            //    positionOfSound = positionFront;
            //}
            //else
            //{
            //    positionOfSound = positionBack;
            //}

            //  Update position of sound. It works like this: we hear coming sound, then we are in the sound and then we hear it coming out.

            //MyAudio.Static.UpdateCuePosition(m_burningCue, positionOfSound, m_directionFromSunNormalized, -m_downVector, m_directionFromSunNormalized * m_speed);

            //MySounds.UpdateCuePosition(m_burningCue, positionOfSound, m_directionFromSunNormalized, Vector3.Up, Vector3.Zero);

            //MyLogManager.WriteLine("positionOfSound: " + MyUtils.GetFormatedVector3(positionOfSound, 3));
            //MyLogManager.WriteLine("m_directionFromSunNormalized: " + MyUtils.GetFormatedVector3(m_directionFromSunNormalized, 3));
            //MyLogManager.WriteLine("m_downVector: " + MyUtils.GetFormatedVector3(m_downVector, 3));

            //Position = positionOfSound;

            //  Shake player's head
            //float distanceToSound;
            //Vector3.Distance(ref positionOfSound, ref campos, out distanceToSound);
            //float shake = 1 - MathHelper.Clamp(distanceToSound / 1000, 0, 1);

            /*if (MySession.Player.Controller.ControlledEntity != null)
             * {
             *  MySession.PlayerShip.IncreaseHeadShake(
             *      MathHelper.Lerp(MyHeadShakeConstants.HEAD_SHAKE_AMOUNT_DURING_SUN_WIND_MIN,
             *                      MyHeadShakeConstants.HEAD_SHAKE_AMOUNT_DURING_SUN_WIND_MAX, shake));
             * }*/
            #endregion

            for (int i = 0; i < m_sunwindEntities.Count;)
            {
                if (m_sunwindEntities[i].MarkedForClose)
                {
                    m_sunwindEntities.RemoveAtFast(i);
                }
                else
                {
                    i++;
                }
            }
            var q = VRageMath.Quaternion.CreateFromRotationMatrix(Matrix.CreateFromDir(m_directionFromSunNormalized, m_downVector));
            var v = new Vector3(10000, 10000, 2000);
            MyRenderProxy.DebugDrawOBB(new MyOrientedBoundingBoxD(positionFront + m_directionFromSunNormalized * 2500, v, q), Color.Red.ToVector3(), 1, false, false);
            if (m_rayCastCounter == 120)
            {
                var pos = positionFront + m_directionFromSunNormalized * 2500;
                MyPhysics.GetPenetrationsBox(ref v, ref pos, ref q, m_intersectionLst, MyPhysics.DefaultCollisionLayer);

                foreach (var hit in m_intersectionLst)
                {
                    var entity = hit.GetCollisionEntity();
                    if (entity is MyVoxelMap)
                    {
                        continue;
                    }
                    if (!m_sunwindEntities.Contains(entity))
                    {
                        m_sunwindEntities.Add(entity);
                    }
                }
                m_intersectionLst.Clear();
                for (int i = 0; i < m_sunwindEntities.Count; i++)
                {
                    var entity = m_sunwindEntities[i];
                    if (entity is MyCubeGrid)
                    {
                        var grid = entity as MyCubeGrid;

                        var aabb         = grid.PositionComp.WorldAABB;
                        var halfDiagonal = (aabb.Center - aabb.Min).Length();
                        var rightMax     = ((aabb.Center - aabb.Min) / m_rightVector).AbsMin();
                        var downMax      = ((aabb.Center - aabb.Min) / m_downVector).AbsMin();

                        var size   = (grid.Max - grid.Min);
                        var max    = Math.Max(size.X, Math.Max(size.Y, size.Z));
                        var invMat = grid.PositionComp.GetWorldMatrixNormalizedInv();

                        var start = aabb.Center - rightMax * m_rightVector - downMax * m_downVector;

                        for (int x = 0; x < rightMax * 2; x += grid.GridSizeEnum == Common.ObjectBuilders.MyCubeSize.Large ? 25 : 10)
                        {
                            for (int y = 0; y < downMax * 2; y += grid.GridSizeEnum == Common.ObjectBuilders.MyCubeSize.Large ? 25 : 10)
                            {
                                var pivot = start + x * m_rightVector + y * m_downVector;
                                pivot += (float)halfDiagonal * m_directionFromSunNormalized;
                                var   circle = MyUtils.GetRandomVector3CircleNormalized();
                                float rand   = MyUtils.GetRandomFloat(0, grid.GridSizeEnum == Common.ObjectBuilders.MyCubeSize.Large ? 10 : 5);
                                pivot += m_rightVector * circle.X * rand + m_downVector * circle.Z * rand;
                                LineD l = new LineD(pivot - m_directionFromSunNormalized * (float)halfDiagonal, pivot);
                                if (grid.RayCastBlocks(l.From, l.To).HasValue)
                                {
                                    l.From = pivot - m_directionFromSunNormalized * 1000;

                                    MyPhysics.CastRay(l.From, l.To, m_hitLst);
                                    m_rayCastCounter++;
                                    if (m_hitLst.Count == 0 || m_hitLst[0].HkHitInfo.GetHitEntity() != grid.Components)
                                    {
                                        m_hitLst.Clear();
                                        continue;
                                    }
                                    MyParticleEffect particle;
                                    if (MyParticlesManager.TryCreateParticleEffect((int)MyParticleEffectsIDEnum.Prefab_LeakingFire, out particle))
                                    {
                                        particle.WorldMatrix = MatrixD.CreateWorld(m_hitLst[0].Position, Vector3D.Forward, Vector3D.Up);
                                    }
                                    m_rayCastQueue.Add(new MyEntityRayCastPair()
                                    {
                                        Entity = grid, Ray = l, Position = m_hitLst[0].Position, Particle = particle
                                    });
                                    //grid.Physics.ApplyDeformation(0.2f, 4, 2, Vector3.Transform(m_hitLst[0].Position, invMat), Vector3.Transform(m_directionFromSunNormalized, invMat), Sandbox.Game.Weapons.MyDamageType.Environment);
                                }
                            }
                        }
                        m_sunwindEntities.Remove(grid);
                        i--;
                    }
                    else
                    {
                        m_sunwindEntities.Remove(entity);
                        i--;
                    }
                }
                m_rayCastCounter = 0;
            }

            //  Apply force to all objects that aren't static and are hit by sun wind (ignoring voxels and large ships)
            //MyEntities.ApplySunWindForce(m_sunwindEntities, ref m_planeFront, ref m_planeBack, DoNotIgnoreTheseTypes, ref m_directionFromSunNormalized);

            //  Start small billboards
            if (m_distanceToSunWind <= MySunWindConstants.SWITCH_LARGE_AND_SMALL_BILLBOARD_DISTANCE)
            {
                Debug.Assert(m_computedMaxDistances == MySunWindConstants.SMALL_BILLBOARDS_SIZE.X * MySunWindConstants.SMALL_BILLBOARDS_SIZE.Y, "Not all small billboard MaxDistances are computed!");
                m_smallBillboardsStarted = true;
            }

            ComputeMaxDistances();

            base.UpdateBeforeSimulation();
        }
Пример #2
0
        public override void UpdateBeforeSimulation()
        {
            int rayCount = 0;
            if (m_rayCastQueue.Count > 0 && m_rayCastCounter % 20 == 0)
            {
                while (rayCount < 50 && m_rayCastQueue.Count > 0)
                {
                    var rand = MyUtils.GetRandomInt(m_rayCastQueue.Count - 1);
                    var entity = m_rayCastQueue[rand].Entity;
                    var l = m_rayCastQueue[rand]._Ray;
                    var p = m_rayCastQueue[rand].Position;
                    var particle = m_rayCastQueue[rand].Particle;
                    if (entity is MyCubeGrid)
                    {
                        particle.Stop();
                        var grid = entity as MyCubeGrid;
                        var invMat = grid.PositionComp.WorldMatrixNormalizedInv;

                        if (grid.BlocksDestructionEnabled)
                        {
                            grid.Physics.ApplyDeformation(6f, 3f, 3f, Vector3.Transform(p, invMat), Vector3.Normalize(Vector3.Transform(m_directionFromSunNormalized, invMat)), MyDamageType.Environment);
                        }

                        //MyPhysics.HavokWorld.CastRay(l.From, l.To, m_hitLst);
                        //rayCount++;
                        //MyEntity ent = null;
                        //if (m_hitLst.Count != 0)
                        //    ent = m_hitLst[0].GetEntity();
                        //if (ent == grid)
                        //{
                        //    grid.Physics.ApplyDeformation(6f, 3f, 3f, Vector3.Transform(m_hitLst[0].Position, invMat), Vector3.Normalize(Vector3.Transform(m_directionFromSunNormalized, invMat)), Sandbox.Game.Weapons.MyDamageType.Environment);
                        //    //var block = grid.GetBlock(Vector3I.Floor(Vector3.Transform(m_hitLst[0].Position, invMat) / grid.GridSize));
                        //    //if (block != null)
                        //    //    grid.ApplyDestructionDeformation(block);
                        //    m_rayCastQueue.RemoveAt(0);
                        //    m_hitLst.Clear();
                        //    break;
                        //}
                        m_rayCastQueue.RemoveAt(rand);
                        m_hitLst.Clear();
                        break;
                    }
                }
            }
            m_rayCastCounter++;
            //  Update only if sun wind is active
            if (IsActive == false) return;

            //?
            float dT = ((float)MySandboxGame.TotalGamePlayTimeInMilliseconds - (float)m_timeLastUpdate) / 1000.0f;
            m_timeLastUpdate = MySandboxGame.TotalGamePlayTimeInMilliseconds;

            if(MySandboxGame.IsPaused)
                return;

            m_deltaTime += dT;

            float traveledDistance = m_speed * m_deltaTime;

            //  If sun wind finished its way, we will turn it off
            if (traveledDistance >= MySunWindConstants.SUN_WIND_LENGTH_TOTAL)
            {
                IsActive = false;
                StopCue();
                
                return;
            }

            Vector3D campos = MySession.Static.LocalCharacter == null ? Vector3D.Zero : MySession.Static.LocalCharacter.Entity.WorldMatrix.Translation;

            //  This is plane that goes through sun wind, it's in its middle
            m_planeMiddle = new PlaneD(m_initialSunWindPosition + m_directionFromSunNormalized * traveledDistance, m_directionFromSunNormalized);
            m_distanceToSunWind = m_planeMiddle.DistanceToPoint(ref campos);

            //  We make sure that sound moves always on line that goes through camera. So it's not in the middle of sun wind, more like middle where is camera.
            //  Reason is that I want the sound always go through camera.            
            m_positionOnCameraLine = /*MySession.Static.Player.PlayerEntity.Entity.WorldMatrix.Translation*/ - m_directionFromSunNormalized * m_distanceToSunWind;

            Vector3D positionFront = m_positionOnCameraLine + m_directionFromSunNormalized * 2000;
            Vector3D positionBack = m_positionOnCameraLine + m_directionFromSunNormalized * -2000;

            m_planeFront = new PlaneD(positionFront, m_directionFromSunNormalized);
            m_planeBack = new PlaneD(positionBack, m_directionFromSunNormalized);

            var distanceToFrontPlane = m_planeFront.DistanceToPoint(ref campos);
            var distanceToBackPlane = m_planeBack.DistanceToPoint(ref campos);

            #region commented
            
            //Vector3 positionOfSound;
            //if ((distanceToFrontPlane <= 0) && (distanceToBackPlane >= 0))
            //{
            //    positionOfSound = MySession.Static.Player.PlayerEntity.Entity.WorldMatrix.Translation;
            //}
            //else if (distanceToFrontPlane > 0)
            //{
            //    positionOfSound = positionFront;
            //}
            //else
            //{
            //    positionOfSound = positionBack;
            //}

            //  Update position of sound. It works like this: we hear coming sound, then we are in the sound and then we hear it coming out.

            //MyAudio.Static.UpdateCuePosition(m_burningCue, positionOfSound, m_directionFromSunNormalized, -m_downVector, m_directionFromSunNormalized * m_speed);

            //MySounds.UpdateCuePosition(m_burningCue, positionOfSound, m_directionFromSunNormalized, Vector3.Up, Vector3.Zero);

            //MyLogManager.WriteLine("positionOfSound: " + MyUtils.GetFormatedVector3(positionOfSound, 3));
            //MyLogManager.WriteLine("m_directionFromSunNormalized: " + MyUtils.GetFormatedVector3(m_directionFromSunNormalized, 3));
            //MyLogManager.WriteLine("m_downVector: " + MyUtils.GetFormatedVector3(m_downVector, 3));

            //Position = positionOfSound;

            //  Shake player's head
            //float distanceToSound;
            //Vector3.Distance(ref positionOfSound, ref campos, out distanceToSound);
            //float shake = 1 - MathHelper.Clamp(distanceToSound / 1000, 0, 1);
            /*if (MySession.Static.Player.Controller.ControlledEntity != null)
            {
                MySession.Static.PlayerShip.IncreaseHeadShake(
                    MathHelper.Lerp(MyHeadShakeConstants.HEAD_SHAKE_AMOUNT_DURING_SUN_WIND_MIN,
                                    MyHeadShakeConstants.HEAD_SHAKE_AMOUNT_DURING_SUN_WIND_MAX, shake));
            }*/
            #endregion

            for (int i = 0; i < m_sunwindEntities.Count;)
			{
                if (m_sunwindEntities[i].MarkedForClose)
                {
                    m_sunwindEntities.RemoveAtFast(i);
                }
                else
                {
                    i++;
                }
            }
            var q = VRageMath.Quaternion.CreateFromRotationMatrix(Matrix.CreateFromDir(m_directionFromSunNormalized, m_downVector));
            var v = new Vector3(10000, 10000, 2000);
            MyRenderProxy.DebugDrawOBB(new MyOrientedBoundingBoxD(positionFront + m_directionFromSunNormalized * 2500, v, q), Color.Red.ToVector3(), 1, false, false);
            if (m_rayCastCounter == 120)
            {
                var pos = positionFront + m_directionFromSunNormalized * 2500;
                MyPhysics.GetPenetrationsBox(ref v, ref pos, ref q, m_intersectionLst, MyPhysics.CollisionLayers.DefaultCollisionLayer);
                
                foreach (var hit in m_intersectionLst)
                {
                    var entity = hit.GetCollisionEntity();
                    if (entity is MyVoxelMap)
                        continue;
                    if (!m_sunwindEntities.Contains(entity))
                        m_sunwindEntities.Add(entity);
                }
                m_intersectionLst.Clear();
                for (int i = 0; i < m_sunwindEntities.Count; i++)
                {
                    var entity = m_sunwindEntities[i];
                    if (entity is MyCubeGrid)
                    {
                        var grid = entity as MyCubeGrid;

                        var aabb = grid.PositionComp.WorldAABB;
                        var halfDiagonal = (aabb.Center - aabb.Min).Length();
                        var rightMax = ((aabb.Center - aabb.Min) / m_rightVector).AbsMin();
                        var downMax = ((aabb.Center - aabb.Min) / m_downVector).AbsMin();

                        var size = (grid.Max - grid.Min);
                        var max = Math.Max(size.X, Math.Max(size.Y, size.Z));
                        var invMat = grid.PositionComp.WorldMatrixNormalizedInv;

                        var start = aabb.Center - rightMax * m_rightVector - downMax * m_downVector;

                        for (int x = 0; x < rightMax * 2; x += grid.GridSizeEnum == MyCubeSize.Large ? 25 : 10)
                        {
                            for (int y = 0; y < downMax * 2; y += grid.GridSizeEnum == MyCubeSize.Large ? 25 : 10)
                            {
                                var pivot = start + x * m_rightVector + y * m_downVector;
                                pivot += (float)halfDiagonal * m_directionFromSunNormalized;
                                var circle = MyUtils.GetRandomVector3CircleNormalized();
                                float rand = MyUtils.GetRandomFloat(0, grid.GridSizeEnum == MyCubeSize.Large ? 10 : 5);
                                pivot += m_rightVector * circle.X * rand + m_downVector * circle.Z * rand;
                                LineD l = new LineD(pivot - m_directionFromSunNormalized * (float)halfDiagonal, pivot);
                                if (grid.RayCastBlocks(l.From, l.To).HasValue)
                                {
                                    l.From = pivot - m_directionFromSunNormalized * 1000;

                                    MyPhysics.CastRay(l.From, l.To, m_hitLst);
                                    m_rayCastCounter++;
                                    if (m_hitLst.Count == 0 || m_hitLst[0].HkHitInfo.GetHitEntity() != grid.Components)
                                    {
                                        m_hitLst.Clear();
                                        continue;
                                    }
                                    MyParticleEffect particle;
                                    if (MyParticlesManager.TryCreateParticleEffect((int)MyParticleEffectsIDEnum.Prefab_LeakingFire, out particle))
                                    {
                                        particle.WorldMatrix = MatrixD.CreateWorld(m_hitLst[0].Position, Vector3D.Forward, Vector3D.Up);
                                    }
                                    m_rayCastQueue.Add(new MyEntityRayCastPair() { Entity = grid, _Ray = l , Position = m_hitLst[0].Position, Particle = particle});
                                    //grid.Physics.ApplyDeformation(0.2f, 4, 2, Vector3.Transform(m_hitLst[0].Position, invMat), Vector3.Transform(m_directionFromSunNormalized, invMat), Sandbox.Game.Weapons.MyDamageType.Environment);
                                }
                            }
                        }
                        m_sunwindEntities.Remove(grid);
                        i--;
                    }
                    else
                    {
                        m_sunwindEntities.Remove(entity);
                        i--;
                    }

                }
                m_rayCastCounter = 0;
            }
            
            //  Apply force to all objects that aren't static and are hit by sun wind (ignoring voxels and large ships)
            //MyEntities.ApplySunWindForce(m_sunwindEntities, ref m_planeFront, ref m_planeBack, DoNotIgnoreTheseTypes, ref m_directionFromSunNormalized);

            //  Start small billboards
            if (m_distanceToSunWind <= MySunWindConstants.SWITCH_LARGE_AND_SMALL_BILLBOARD_DISTANCE)
            {
                Debug.Assert(m_computedMaxDistances == MySunWindConstants.SMALL_BILLBOARDS_SIZE.X * MySunWindConstants.SMALL_BILLBOARDS_SIZE.Y, "Not all small billboard MaxDistances are computed!");
                m_smallBillboardsStarted = true;
            }

            ComputeMaxDistances();

            base.UpdateBeforeSimulation();
        }
Пример #3
0
        public override void UpdateBeforeSimulation()
        {
            int num = 0;

            if ((m_rayCastQueue.Count > 0) && ((this.m_rayCastCounter % 20) == 0))
            {
                while ((num < 50) && (m_rayCastQueue.Count > 0))
                {
                    int                 randomInt = MyUtils.GetRandomInt(m_rayCastQueue.Count - 1);
                    MyEntity            entity    = m_rayCastQueue[randomInt].Entity;
                    MyEntityRayCastPair local1    = m_rayCastQueue[randomInt];
                    Vector3D            position  = m_rayCastQueue[randomInt].Position;
                    MyParticleEffect    particle  = m_rayCastQueue[randomInt].Particle;
                    if (entity is MyCubeGrid)
                    {
                        particle.Stop(true);
                        MyCubeGrid grid = entity as MyCubeGrid;
                        MatrixD    worldMatrixNormalizedInv = grid.PositionComp.WorldMatrixNormalizedInv;
                        if (grid.BlocksDestructionEnabled)
                        {
                            grid.Physics.ApplyDeformation(6f, 3f, 3f, (Vector3)Vector3.Transform((Vector3)position, worldMatrixNormalizedInv), Vector3.Normalize(Vector3.Transform((Vector3)m_directionFromSunNormalized, worldMatrixNormalizedInv)), MyDamageType.Environment, 0f, 0f, 0L);
                        }
                        m_rayCastQueue.RemoveAt(randomInt);
                        this.m_hitLst.Clear();
                        break;
                    }
                }
            }
            this.m_rayCastCounter++;
            if (IsActive)
            {
                float num2 = (MySandboxGame.TotalGamePlayTimeInMilliseconds - m_timeLastUpdate) / 1000f;
                m_timeLastUpdate = MySandboxGame.TotalGamePlayTimeInMilliseconds;
                if (!MySandboxGame.IsPaused)
                {
                    m_deltaTime += num2;
                    float num3 = m_speed * m_deltaTime;
                    if (num3 >= 60000f)
                    {
                        IsActive = false;
                        StopCue();
                    }
                    else
                    {
                        Vector3D translation;
                        if (MySession.Static.LocalCharacter != null)
                        {
                            translation = MySession.Static.LocalCharacter.Entity.WorldMatrix.Translation;
                        }
                        else
                        {
                            translation = Vector3D.Zero;
                        }
                        Vector3D point = translation;
                        m_planeMiddle          = new PlaneD(m_initialSunWindPosition + (m_directionFromSunNormalized * num3), m_directionFromSunNormalized);
                        m_distanceToSunWind    = m_planeMiddle.DistanceToPoint(ref point);
                        m_positionOnCameraLine = -m_directionFromSunNormalized * m_distanceToSunWind;
                        Vector3D position = m_positionOnCameraLine + (m_directionFromSunNormalized * 2000.0);
                        Vector3D vectord3 = m_positionOnCameraLine + (m_directionFromSunNormalized * -2000.0);
                        m_planeFront = new PlaneD(position, m_directionFromSunNormalized);
                        m_planeBack  = new PlaneD(vectord3, m_directionFromSunNormalized);
                        m_planeFront.DistanceToPoint(ref point);
                        m_planeBack.DistanceToPoint(ref point);
                        int index = 0;
                        while (index < m_sunwindEntities.Count)
                        {
                            if (m_sunwindEntities[index].MarkedForClose)
                            {
                                m_sunwindEntities.RemoveAtFast <IMyEntity>(index);
                                continue;
                            }
                            index++;
                        }
                        Quaternion orientation = Quaternion.CreateFromRotationMatrix(Matrix.CreateFromDir((Vector3)m_directionFromSunNormalized, (Vector3)m_downVector));
                        Vector3    halfExtents = new Vector3(10000f, 10000f, 2000f);
                        MyRenderProxy.DebugDrawOBB(new MyOrientedBoundingBoxD(position + (m_directionFromSunNormalized * 2500.0), halfExtents, orientation), Color.Red.ToVector3(), 1f, false, false, false);
                        if (this.m_rayCastCounter == 120)
                        {
                            Vector3D translation = position + (m_directionFromSunNormalized * 2500.0);
                            MyPhysics.GetPenetrationsBox(ref halfExtents, ref translation, ref orientation, m_intersectionLst, 15);
                            using (List <HkBodyCollision> .Enumerator enumerator = m_intersectionLst.GetEnumerator())
                            {
                                while (enumerator.MoveNext())
                                {
                                    IMyEntity collisionEntity = enumerator.Current.GetCollisionEntity();
                                    if (!(collisionEntity is MyVoxelMap) && !m_sunwindEntities.Contains(collisionEntity))
                                    {
                                        m_sunwindEntities.Add(collisionEntity);
                                    }
                                }
                            }
                            m_intersectionLst.Clear();
                            int num6 = 0;
                            while (true)
                            {
                                if (num6 >= m_sunwindEntities.Count)
                                {
                                    this.m_rayCastCounter = 0;
                                    break;
                                }
                                IMyEntity item = m_sunwindEntities[num6];
                                if (item is MyCubeGrid)
                                {
                                    MyCubeGrid   grid2     = item as MyCubeGrid;
                                    BoundingBoxD worldAABB = grid2.PositionComp.WorldAABB;
                                    double       num7      = (worldAABB.Center - worldAABB.Min).Length();
                                    double       num8      = ((worldAABB.Center - worldAABB.Min) / m_rightVector).AbsMin();
                                    double       num9      = ((worldAABB.Center - worldAABB.Min) / m_downVector).AbsMin();
                                    Vector3I     vectori   = grid2.Max - grid2.Min;
                                    Math.Max(vectori.X, Math.Max(vectori.Y, vectori.Z));
                                    MatrixD  worldMatrixNormalizedInv = grid2.PositionComp.WorldMatrixNormalizedInv;
                                    Vector3D vectord6 = (worldAABB.Center - (num8 * m_rightVector)) - (num9 * m_downVector);
                                    int      num10    = 0;
                                    while (true)
                                    {
                                        if (num10 >= (num8 * 2.0))
                                        {
                                            m_sunwindEntities.Remove(grid2);
                                            num6--;
                                            break;
                                        }
                                        int num11 = 0;
                                        while (true)
                                        {
                                            if (num11 >= (num9 * 2.0))
                                            {
                                                num10 += (grid2.GridSizeEnum == MyCubeSize.Large) ? 0x19 : 10;
                                                break;
                                            }
                                            Vector3D to          = ((vectord6 + (num10 * m_rightVector)) + (num11 * m_downVector)) + (((float)num7) * m_directionFromSunNormalized);
                                            Vector3  vector2     = MyUtils.GetRandomVector3CircleNormalized();
                                            float    randomFloat = MyUtils.GetRandomFloat(0f, (grid2.GridSizeEnum == MyCubeSize.Large) ? ((float)10) : ((float)5));
                                            to += ((m_rightVector * vector2.X) * randomFloat) + ((m_downVector * vector2.Z) * randomFloat);
                                            LineD ed = new LineD(to - (m_directionFromSunNormalized * ((float)num7)), to);
                                            if (grid2.RayCastBlocks(ed.From, ed.To) != null)
                                            {
                                                ed.From = to - (m_directionFromSunNormalized * 1000.0);
                                                MyPhysics.CastRay(ed.From, ed.To, this.m_hitLst, 0);
                                                this.m_rayCastCounter++;
                                                if ((this.m_hitLst.Count == 0) || !ReferenceEquals(this.m_hitLst[0].HkHitInfo.GetHitEntity(), grid2.Components))
                                                {
                                                    this.m_hitLst.Clear();
                                                }
                                                else
                                                {
                                                    MyParticleEffect effect2;
                                                    MyParticlesManager.TryCreateParticleEffect("Dummy", MatrixD.CreateWorld(this.m_hitLst[0].Position, Vector3D.Forward, Vector3D.Up), out effect2);
                                                    MyEntityRayCastPair pair = new MyEntityRayCastPair {
                                                        Entity   = grid2,
                                                        _Ray     = ed,
                                                        Position = this.m_hitLst[0].Position,
                                                        Particle = effect2
                                                    };
                                                    m_rayCastQueue.Add(pair);
                                                }
                                            }
                                            num11 += (grid2.GridSizeEnum == MyCubeSize.Large) ? 0x19 : 10;
                                        }
                                    }
                                }
                                else
                                {
                                    m_sunwindEntities.Remove(item);
                                    num6--;
                                }
                                num6++;
                            }
                        }
                        if (m_distanceToSunWind <= 10000.0)
                        {
                            m_smallBillboardsStarted = true;
                        }
                        ComputeMaxDistances();
                        base.UpdateBeforeSimulation();
                    }
                }
            }
        }