public List <double> GetForce(JOYSTICK_INPUT joystickInput, Dictionary <string, object> structDictonary, double elapsedTime) { SET_EFFECT eff = (SET_EFFECT)structDictonary["SET_EFFECT"]; PERIOD periodic = (PERIOD)structDictonary["PERIOD"]; ENVELOPE env = (ENVELOPE)structDictonary["ENVELOPE"]; List <double> forces = new List <double>(); double offset = periodic.offset; double magnitude = periodic.magnitude; double phase = periodic.phase; double period = periodic.period; magnitude = _calculationProvider.ApplyGain(magnitude, eff.gain); double angle = ((elapsedTime / period) + (phase / _reportDescriptorProperties.MAX_PHASE) * period) * 2 * Math.PI; double sine = Math.Sin(angle); double tempforce = sine * magnitude; tempforce += offset; double envelope = _calculationProvider.ApplyGain(_calculationProvider.GetEnvelope(env, elapsedTime, eff.duration), eff.gain); List <double> directions = _calculationProvider.GetDirection(eff); foreach (var direction in directions) { forces.Add(tempforce * envelope * direction); } return(forces); }
public List <double> GetForce(JOYSTICK_INPUT joystickInput, Dictionary <string, object> structDictonary, double elapsedTime) { SET_EFFECT eff = (SET_EFFECT)structDictonary["SET_EFFECT"]; RAMP rmp = (RAMP)structDictonary["RAMP"]; ENVELOPE env = (ENVELOPE)structDictonary["ENVELOPE"]; List <double> forces = new List <double>(); double end = rmp.end; double start = rmp.start; double duration = eff.duration; double slope = (end - start) / duration; double magnitude = start + slope * elapsedTime; magnitude = _calculationProvider.ApplyGain(magnitude, eff.gain); double envelope = _calculationProvider.ApplyGain(_calculationProvider.GetEnvelope(env, elapsedTime, eff.duration), eff.gain); List <double> directions = _calculationProvider.GetDirection(eff); foreach (var direction in directions) { forces.Add(magnitude * envelope * direction); } return(forces); }
public List <double> GetForce(JOYSTICK_INPUT joystickInput, Dictionary <string, object> structDictonary, double elapsedTime) { SET_EFFECT eff = (SET_EFFECT)structDictonary["SET_EFFECT"]; PERIOD periodic = (PERIOD)structDictonary["PERIOD"]; ENVELOPE env = (ENVELOPE)structDictonary["ENVELOPE"]; List <double> forces = new List <double>(); double offset = periodic.offset; double magnitude = periodic.magnitude; double phase = periodic.phase; double period = periodic.period; magnitude = _calculationProvider.ApplyGain(magnitude, eff.gain); double max = offset + magnitude; double min = offset - magnitude; double phasetime = (phase * period) / _reportDescriptorProperties.MAX_PHASE; double time = elapsedTime + phasetime; double reminder = time % period; double slope = (max - min) / period; double tempforce = 0; tempforce = slope * reminder; tempforce += min; double envelope = _calculationProvider.ApplyGain(_calculationProvider.GetEnvelope(env, elapsedTime, eff.duration), eff.gain); List <double> directions = _calculationProvider.GetDirection(eff); foreach (var direction in directions) { forces.Add(tempforce * envelope * direction); } return(forces); }
public List <double> GetForce(JOYSTICK_INPUT joystickInput, Dictionary <string, object> structDictonary, double elapsedTime) { SET_EFFECT eff = (SET_EFFECT)structDictonary["SET_EFFECT"]; List <CONDITION> cond = (List <CONDITION>)structDictonary["CONDITION"]; ENVELOPE env = (ENVELOPE)structDictonary["ENVELOPE"]; List <double> forces = joystickInput.axesPositions.Select(x => 0d).ToList(); if (previousAxesPositions != null) { var axesSpeeds = joystickInput.axesPositions.Zip(previousAxesPositions, (u, v) => u - v).ToList(); if (previousAxesSpeeds != null) { var axesAccelerations = axesSpeeds.Zip(previousAxesSpeeds, (u, v) => u - v).ToList(); forces = _calculationProvider.GetCondition(cond, axesAccelerations); } previousAxesSpeeds = axesSpeeds; } previousAxesPositions = joystickInput.axesPositions; return(forces); }
public void SetDuration(int effectBlockIndex, long loopCount) { IEffect effect = _effects.GetEffect(effectBlockIndex); SET_EFFECT setEffect = (SET_EFFECT)effect.GetParameter("SET_EFFECT"); if (loopCount == _reportDescriptorProperties.MAX_LOOP) { ENVELOPE envelope = (ENVELOPE)effect.GetParameter("ENVELOPE"); setEffect.duration = _reportDescriptorProperties.DURATION_INFINITE; envelope.fadeTime = 0d; } else { setEffect.duration *= loopCount; } }
public List <double> GetForce(JOYSTICK_INPUT joystickInput, Dictionary <string, object> structDictonary, double elapsedTime) { ENVELOPE env = (ENVELOPE)structDictonary["ENVELOPE"]; SET_EFFECT eff = (SET_EFFECT)structDictonary["SET_EFFECT"]; CONSTANT constant = (CONSTANT)structDictonary["CONSTANT"]; List <double> forces = new List <double>(); double magnitude = _calculationProvider.ApplyGain(constant.magnitude, eff.gain); double envelope = _calculationProvider.ApplyGain(_calculationProvider.GetEnvelope(env, elapsedTime, eff.duration), eff.gain); List <double> directions = _calculationProvider.GetDirection(eff); foreach (var direction in directions) { forces.Add(magnitude * envelope * direction); } return(forces); }
public double GetEnvelope(ENVELOPE envParms, double elapsedTime, double duration) { double attackTime = envParms.attackTime; double fadeTime = envParms.fadeTime; double attackLevel = envParms.attackLevel; double fadeLevel = envParms.fadeLevel; double envelope = 1; if (elapsedTime < attackTime) { double attackSlope = (_reportDescriptorProperties.ENVELOPE_MAX - attackLevel) / attackTime; envelope = (attackLevel + (attackSlope * elapsedTime)) / _reportDescriptorProperties.ENVELOPE_MAX; } if (elapsedTime > (duration - fadeTime)) { double fadeSlope = (_reportDescriptorProperties.ENVELOPE_MAX - fadeLevel) / fadeTime; envelope = (fadeLevel + (fadeSlope * (duration - elapsedTime))) / _reportDescriptorProperties.ENVELOPE_MAX; } return(envelope); }