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