Пример #1
0
        public override bool Activate(SpellCursor cursor)
        {
            float baseEnergy = this.GetEnergyConsumption();
            float usedEnergy = cursor.BoundTo.DrainEnergy(baseEnergy);

            Vector2     boundPos        = cursor.BoundTo.Pos;
            PositionVar posVar          = cursor.GetAnnotation <PositionVar>();
            ObjectVar   objVar          = cursor.GetAnnotation <ObjectVar>();
            ObjectVar   selectedObjects = new ObjectVar();

            if (objVar != null)
            {
                var weightedPos = objVar.Elements.Select(e => new {
                    Weight     = e.Weight,
                    Interactor = e.Interactor,
                    Pos        = e.Interactor.Pos
                });
                foreach (var p in weightedPos)
                {
                    float energyMult = Spell.GetEfficiency((p.Pos - boundPos).Length) * p.Weight / objVar.Count;
                    foreach (T magic in this.Create(p.Pos, usedEnergy * energyMult))
                    {
                        ICmpSpellInteractor interactor = magic.GameObj.GetComponent <ICmpSpellInteractor>();
                        if (interactor != null)
                        {
                            selectedObjects.Add(interactor, energyMult);
                        }
                    }
                }
            }
            else if (posVar != null)
            {
                Vector2 targetPos  = posVar.Position;
                float   energyMult = Spell.GetEfficiency((targetPos - boundPos).Length);
                foreach (T magic in this.Create(posVar.Position, usedEnergy * energyMult))
                {
                    ICmpSpellInteractor interactor = magic.GameObj.GetComponent <ICmpSpellInteractor>();
                    if (interactor != null)
                    {
                        selectedObjects.Add(interactor, energyMult);
                    }
                }
            }
            else
            {
                foreach (T magic in this.Create(boundPos, usedEnergy))
                {
                    ICmpSpellInteractor interactor = magic.GameObj.GetComponent <ICmpSpellInteractor>();
                    if (interactor != null)
                    {
                        selectedObjects.Add(interactor);
                    }
                }
            }

            if (selectedObjects.Count > 0.0f)
            {
                cursor.Annotate(selectedObjects);
            }

            return(true);
        }
Пример #2
0
        public void Update()
        {
            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("ParticleLight-Update");

            bool created = false;

            if (Enabled)
            {
                if (m_renderObjectID == MyRenderProxy.RENDER_ID_UNASSIGNED)
                {
                    InitLight();
                    created = true;
                }
            }
            else
            {
                if (m_renderObjectID != MyRenderProxy.RENDER_ID_UNASSIGNED)
                {
                    CloseLight();
                }
                VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
                return;
            }

            Vector3 localPosition;

            Position.GetInterpolatedValue(m_effect.GetElapsedTime(), out localPosition);
            Vector3 localPositionVar;

            PositionVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out localPositionVar);
            Vector3 localPositionVarRnd = new Vector3(
                MyUtils.GetRandomFloat(-localPositionVar.X, localPositionVar.X),
                MyUtils.GetRandomFloat(-localPositionVar.Y, localPositionVar.Y),
                MyUtils.GetRandomFloat(-localPositionVar.Z, localPositionVar.Z));

            localPosition += localPositionVarRnd;


            Vector4 color;

            Color.GetInterpolatedValue(m_effect.GetElapsedTime(), out color);
            float colorVar;

            ColorVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out colorVar);
            float colorVarRnd = MyUtils.GetRandomFloat(1 - colorVar, 1 + colorVar);

            color.X = MathHelper.Clamp(color.X * colorVarRnd, 0, 1);
            color.Y = MathHelper.Clamp(color.Y * colorVarRnd, 0, 1);
            color.Z = MathHelper.Clamp(color.Z * colorVarRnd, 0, 1);

            float range;

            Range.GetInterpolatedValue(m_effect.GetElapsedTime(), out range);
            float rangeVar;

            RangeVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out rangeVar);
            float rangeVarRnd = MyUtils.GetRandomFloat(-rangeVar, rangeVar);

            range += rangeVarRnd;

            float intensity;

            Intensity.GetInterpolatedValue(m_effect.GetElapsedTime(), out intensity);
            float intensityVar;

            IntensityVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out intensityVar);
            float intensityRnd = MyUtils.GetRandomFloat(-intensityVar, intensityVar);

            intensity += intensityRnd;
            if (m_effect.IsStopped)
            {
                intensity = 0;
            }

            Vector3D position = Vector3D.Transform(localPosition * m_effect.GetEmitterScale(), m_effect.WorldMatrix);

            if ((m_position != position) ||
                (m_color != color) ||
                (m_range != range) ||
                (m_intensity != intensity) ||
                created)
            {
                m_color     = color;
                m_intensity = intensity;
                m_range     = range;
                m_position  = position;

                MyLightLayout light = new MyLightLayout()
                {
                    Range         = m_range * m_effect.GetEmitterScale(),
                    Color         = new Vector3(m_color),
                    Falloff       = 1,
                    GlossFactor   = 1,
                    DiffuseFactor = 1,
                };

                UpdateRenderLightData renderLightData = new UpdateRenderLightData()
                {
                    ID                  = m_renderObjectID,
                    Position            = m_position,
                    Type                = LightTypeEnum.PointLight,
                    ParentID            = -1,
                    UseInForwardRender  = true,
                    SpecularColor       = new Vector3(m_color),
                    PointLightOn        = true,
                    PointLightIntensity = m_intensity,
                    PointLight          = light,
                };
                MyRenderProxy.UpdateRenderLight(ref renderLightData);
            }

            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
        }
Пример #3
0
        public void Update()
        {
            VRageRender.MyRenderProxy.GetRenderProfiler().StartProfilingBlock("ParticleLight-Update");

            bool created = false;

            if (Enabled && m_renderObjectID == MyRenderProxy.RENDER_ID_UNASSIGNED)
            {
                InitLight();
                created = true;
            }
            if (!Enabled && m_renderObjectID != MyRenderProxy.RENDER_ID_UNASSIGNED)
            {
                CloseLight();
                VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
                return;
            }
            if (!Enabled)
            {
                VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
                return;
            }

            Vector3 localPosition;

            Position.GetInterpolatedValue(m_effect.GetElapsedTime(), out localPosition);
            Vector3 localPositionVar;

            PositionVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out localPositionVar);
            Vector3 localPositionVarRnd = new Vector3(
                MyUtils.GetRandomFloat(-localPositionVar.X, localPositionVar.X),
                MyUtils.GetRandomFloat(-localPositionVar.Y, localPositionVar.Y),
                MyUtils.GetRandomFloat(-localPositionVar.Z, localPositionVar.Z));

            localPosition += localPositionVarRnd;


            Vector4 color;

            Color.GetInterpolatedValue(m_effect.GetElapsedTime(), out color);
            float colorVar;

            ColorVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out colorVar);
            float colorVarRnd = MyUtils.GetRandomFloat(1 - colorVar, 1 + colorVar);

            color.X = MathHelper.Clamp(color.X * colorVarRnd, 0, 1);
            color.Y = MathHelper.Clamp(color.Y * colorVarRnd, 0, 1);
            color.Z = MathHelper.Clamp(color.Z * colorVarRnd, 0, 1);

            float range;

            Range.GetInterpolatedValue(m_effect.GetElapsedTime(), out range);
            float rangeVar;

            RangeVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out rangeVar);
            float rangeVarRnd = MyUtils.GetRandomFloat(-rangeVar, rangeVar);

            range += rangeVarRnd;

            float intensity;

            Intensity.GetInterpolatedValue(m_effect.GetElapsedTime(), out intensity);
            float intensityVar;

            IntensityVar.GetInterpolatedValue(m_effect.GetElapsedTime(), out intensityVar);
            float intensityRnd = MyUtils.GetRandomFloat(-intensityVar, intensityVar);

            intensity += intensityRnd;

            Vector3D position = Vector3D.Transform(localPosition, m_effect.WorldMatrix);

            if (m_position != position || created)
            {
                m_position = position;

                MatrixD lightMatrix = MatrixD.CreateTranslation(m_position);
                VRageRender.MyRenderProxy.UpdateRenderObject(
                    m_renderObjectID,
                    ref lightMatrix,
                    true);
            }

            if ((m_color != color) ||
                (m_range != range) ||
                (m_intensity != intensity) ||
                created)
            {
                m_color     = color;
                m_intensity = intensity;
                m_range     = range;

                VRageRender.MyRenderProxy.UpdateRenderLight(
                    m_renderObjectID,
                    VRageRender.LightTypeEnum.PointLight,
                    m_position,
                    -1,
                    0,
                    m_color,
                    m_color,
                    1,
                    m_range,
                    m_intensity,
                    true,
                    true,
                    0,
                    false,
                    Vector3.Zero,
                    Vector3.Zero,
                    0,
                    Vector4.Zero,
                    0,
                    0,
                    null,
                    0,
                    false,
                    false,
                    VRageRender.Lights.MyGlareTypeEnum.Normal,
                    0,
                    0,
                    0,
                    null,
                    0);
            }



            VRageRender.MyRenderProxy.GetRenderProfiler().EndProfilingBlock();
        }
Пример #4
0
        public override bool Activate(SpellCursor cursor)
        {
            int baseEnergy = 25;

            // Determine target position
            Vector2 targetPos = cursor.BoundTo.Pos;

            {
                List <SpellVar> selection = new List <SpellVar>();
                foreach (SpellGlyph param in cursor.Parameters)
                {
                    if (param is SelectionGlyph)
                    {
                        SpellVar selectionVar = (param as SelectionGlyph).Select(cursor);
                        if (selectionVar != null)
                        {
                            selection.Add(selectionVar);
                        }
                    }
                }
                PositionVar posVar = selection.OfType <PositionVar>().FirstOrDefault();
                ObjectVar   objVar = selection.OfType <ObjectVar>().FirstOrDefault();
                if (posVar != null)
                {
                    targetPos = posVar.Position;
                }
                else if (objVar != null && objVar.Count > 0.0f)
                {
                    Vector2 acc = Vector2.Zero;
                    foreach (var e in objVar.Elements)
                    {
                        acc += e.Weight * (e.Interactor as Component).GameObj.Transform.Pos.Xy;
                    }
                    targetPos = acc / objVar.Count;
                }
            }


            // Move object
            {
                ObjectVar objVar = cursor.GetAnnotation <ObjectVar>();
                if (objVar != null)
                {
                    var moveObj = objVar.Elements.Select(e => new {
                        Weight     = e.Weight,
                        Interactor = e.Interactor,
                        Transform  = (e.Interactor as Component).GameObj.Transform,
                        Body       = (e.Interactor as Component).GameObj.GetComponent <RigidBody>()
                    });
                    foreach (var p in moveObj)
                    {
                        Vector2 targetDir = (targetPos - p.Transform.Pos.Xy);
                        float   distance  = targetDir.Length;
                        targetDir /= MathF.Max(distance, 1.0f);

                        float efficiency = Spell.GetEfficiency((p.Transform.Pos.Xy - cursor.BoundTo.Pos).Length);

                        bool negativeForce = this.IsNegated;
                        if (p.Weight < 0.0f)
                        {
                            negativeForce = !negativeForce;
                        }
                        float targetSpeed;
                        if (negativeForce)
                        {
                            if (distance <= 1.0f)
                            {
                                distance  = 1.0f;
                                targetDir = MathF.Rnd.NextVector2();
                            }
                            targetSpeed = -15.0f * (1.0f - MathF.Min(distance / 500.0f, 1.0f));
                        }
                        else
                        {
                            targetSpeed = 15.0f * MathF.Min(distance / 500.0f, 1.0f);
                        }

                        Vector2 targetVel         = targetDir * targetSpeed;
                        Vector2 targetVelChange   = (targetVel - p.Body.LinearVelocity);
                        float   targetForceFactor = targetVelChange.Length;
                        Vector2 targetVelDir      = targetVelChange / MathF.Max(0.01f, targetForceFactor);

                        float requestedEnergy =
                            (baseEnergy * MathF.Abs(p.Weight) / (float)objVar.Count) *
                            MathF.Clamp(targetForceFactor * p.Body.Mass / 150.0f, 0.0f, 1.0f);
                        float usedEnergy = cursor.BoundTo.DrainEnergy(requestedEnergy);

                        p.Body.ApplyWorldImpulse(5.0f * efficiency * targetVelDir * usedEnergy);
                    }
                }
            }

            return(true);
        }