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