private double CalculateMagnitude(double currentStrength, double elapsedTime) { // Add to history _magnitudeHistory.StoreMagnitude(currentStrength, elapsedTime); // Figure out the percent return(SensorGravity.CalculateMagnitudePercent(currentStrength, _magnitudeHistory.CurrentMax)); }
public SensorVelocity(EditorOptions options, ItemOptions itemOptions, ShipPartDNA dna, IContainer energyTanks) : base(options, dna, itemOptions.Sensor_Damage.HitpointMin, itemOptions.Sensor_Damage.HitpointSlope, itemOptions.Sensor_Damage.Damage) { _itemOptions = itemOptions; _energyTanks = energyTanks; this.Design = new SensorVelocityDesign(options, true); this.Design.SetDNA(dna); double radius; SensorGravity.GetMass(out _mass, out _volume, out radius, out _scaleActual, dna, itemOptions); this.Radius = radius; _neurons = SensorGravity.CreateNeurons(dna, itemOptions, itemOptions.VelocitySensor_NeuronDensity); _neuronMaxRadius = _neurons.Max(o => o.PositionLength); }
public void Update_AnyThread(double elapsedTime) { lock (_lock) { if (IsDestroyed || _energyTanks == null || _energyTanks.RemoveQuantity(elapsedTime * _volume * _itemOptions.VelocitySensor_AmountToDraw * ItemOptions.ENERGYDRAWMULT, true) > 0d) { // The energy tank didn't have enough //NOTE: To be clean, I should set the neuron outputs to zero, but anything pulling from them should be checking this //anyway. So save the processor (also, because of threading, setting them to zero isn't as atomic as this property) _isOn = false; return; } _isOn = true; //Vector3D velocity = GetVelocityModelCoords(); // this shouldn't be translated to model coords, it makes the vector appear to wobble if the ship is spinning, even when the ship has a constant velocity var worldSpeed = GetWorldSpeed(null); // Figure out the magnitude to use double magnitude = CalculateMagnitude(worldSpeed.Item1.Length, elapsedTime); SensorGravity.UpdateNeurons(_neurons, _neuronMaxRadius, worldSpeed.Item1, magnitude); } }
private void btnThreeCubesRand_Click(object sender, RoutedEventArgs e) { try { ShipPartDNA dnaGrav = new ShipPartDNA() { PartType = SensorGravity.PARTTYPE, Position = Math3D.GetRandomVector(2d).ToPoint(), Orientation = Math3D.GetRandomRotation(), Scale = new Vector3D(10, 10, 10) }; ShipPartDNA dnaSpin = new ShipPartDNA() { PartType = SensorSpin.PARTTYPE, Position = Math3D.GetRandomVector(2d).ToPoint(), Orientation = Math3D.GetRandomRotation(), Scale = new Vector3D(10, 10, 10) }; ShipPartDNA dnaVel = new ShipPartDNA() { PartType = SensorVelocity.PARTTYPE, Position = Math3D.GetRandomVector(2d).ToPoint(), Orientation = Math3D.GetRandomRotation(), Scale = new Vector3D(10, 10, 10) }; SensorGravity grav = new SensorGravity(_editorOptions, _itemOptions, dnaGrav, null, null); SensorSpin spin = new SensorSpin(_editorOptions, _itemOptions, dnaSpin, null); SensorVelocity vel = new SensorVelocity(_editorOptions, _itemOptions, dnaVel, null); StartScene(new PartBase[] { grav, spin, vel }, 7); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private void btnTwoCubes3_Click(object sender, RoutedEventArgs e) { try { //PartDNA dnaGrav = new PartDNA() { PartType = SensorGravity.PARTTYPE, Position = new Point3D(-1.01, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(10, 10, 10) }; //PartDNA dnaSpin = new PartDNA() { PartType = SensorSpin.PARTTYPE, Position = new Point3D(1.01, 0, 0), Orientation = new Quaternion(new Vector3D(0, 0, 1), 30), Scale = new Vector3D(10, 10, 10) }; ShipPartDNA dnaGrav = new ShipPartDNA() { PartType = SensorGravity.PARTTYPE, Position = new Point3D(-1.01, 0, 0), Orientation = new Quaternion(new Vector3D(0, 0, -1), 15), Scale = new Vector3D(10, 10, 10) }; ShipPartDNA dnaSpin = new ShipPartDNA() { PartType = SensorSpin.PARTTYPE, Position = new Point3D(1.01, 0, 0), Orientation = new Quaternion(new Vector3D(0, 0, 1), 45), Scale = new Vector3D(10, 10, 10) }; SensorGravity grav = new SensorGravity(_editorOptions, _itemOptions, dnaGrav, null, null); SensorSpin spin = new SensorSpin(_editorOptions, _itemOptions, dnaSpin, null); StartScene(new PartBase[] { grav, spin }, 7); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private void btnIntersectingCubes3_Click(object sender, RoutedEventArgs e) { try { EnsureWorldStarted(); ClearCurrent(); //PartDNA dnaGrav = new PartDNA() { PartType = SensorGravity.PARTTYPE, Position = new Point3D(-1.01, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(10, 10, 10) }; //PartDNA dnaSpin = new PartDNA() { PartType = SensorSpin.PARTTYPE, Position = new Point3D(1.01, 0, 0), Orientation = new Quaternion(new Vector3D(0, 0, 1), 30), Scale = new Vector3D(10, 10, 10) }; ShipPartDNA dnaGrav = new ShipPartDNA() { PartType = SensorGravity.PARTTYPE, Position = new Point3D(-1.01, 0, 0), Orientation = new Quaternion(new Vector3D(0, 0, -1), 15), Scale = new Vector3D(10, 10, 10) }; ShipPartDNA dnaSpin = new ShipPartDNA() { PartType = SensorSpin.PARTTYPE, Position = new Point3D(1.01, 0, 0), Orientation = new Quaternion(new Vector3D(0, 0, 1), 45), Scale = new Vector3D(10, 10, 10) }; SensorGravity grav = new SensorGravity(_editorOptions, _itemOptions, dnaGrav, null, null); SensorSpin spin = new SensorSpin(_editorOptions, _itemOptions, dnaSpin, null); PartBase[] parts = new PartBase[] { grav, spin }; // Draw before DrawParts(parts, new Vector3D(-5, 0, 0)); // Separate them CollisionHull.IntersectionPoint[] intersections; EnsurePartsNotIntersecting.Separate(out intersections, parts, _world, .01d); DrawLines(intersections.Select(o => Tuple.Create(o.ContactPoint, o.Normal.ToUnit() * o.PenetrationDistance)).ToArray(), new Vector3D(-5, -5, 0), Colors.Red); // Draw after DrawParts(parts, new Vector3D(5, 0, 0)); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private void btnIntersectingCubes_Click(object sender, RoutedEventArgs e) { try { EnsureWorldStarted(); ClearCurrent(); ShipPartDNA dnaGrav = new ShipPartDNA() { PartType = SensorGravity.PARTTYPE, Position = new Point3D(-.5, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(10, 10, 10) }; ShipPartDNA dnaSpin = new ShipPartDNA() { PartType = SensorSpin.PARTTYPE, Position = new Point3D(.5, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(10, 10, 10) }; //PartDNA dnaGrav = new PartDNA() { PartType = SensorGravity.PARTTYPE, Position = new Point3D(-1, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(10, 10, 10) }; //PartDNA dnaSpin = new PartDNA() { PartType = SensorSpin.PARTTYPE, Position = new Point3D(1, 0, 0), Orientation = Quaternion.Identity, Scale = new Vector3D(10, 10, 10) }; SensorGravity grav = new SensorGravity(_editorOptions, _itemOptions, dnaGrav, null, null); SensorSpin spin = new SensorSpin(_editorOptions, _itemOptions, dnaSpin, null); PartBase[] parts = new PartBase[] { grav, spin }; // Draw before DrawParts(parts, new Vector3D(-5, 0, 0)); // Separate them CollisionHull.IntersectionPoint[] intersections; EnsurePartsNotIntersecting.Separate(out intersections, parts, _world, .01d); DrawLines(intersections.Select(o => Tuple.Create(o.ContactPoint, o.Normal.ToUnit() * o.PenetrationDistance)).ToArray(), new Vector3D(-5, -5, 0), Colors.Red); // Draw after DrawParts(parts, new Vector3D(5, 0, 0)); #region Test //CollisionHull hull1a, hull2a; //Transform3DGroup dummy2; //Quaternion dummy3; //DiffuseMaterial dummy4; //double size = 10d * .2d; //Visual3D model = GetWPFModel(out hull1a, out dummy2, out dummy3, out dummy4, CollisionShapeType.Box, Colors.Tan, Colors.Tan, 1d, new Vector3D(size, size, size), new Point3D(-.6, 5, 0), _defaultDirectionFacing, true); // this doesn't use the offset in the collision hull //_currentVisuals.Add(model); //_viewport.Children.Add(model); //model = GetWPFModel(out hull2a, out dummy2, out dummy3, out dummy4, CollisionShapeType.Box, Colors.Chartreuse, Colors.Chartreuse, 1d, new Vector3D(size, size, size), new Point3D(.6, 5, 0), _defaultDirectionFacing, true); //_currentVisuals.Add(model); //_viewport.Children.Add(model); //TranslateTransform3D offset1 = new TranslateTransform3D(-.6, 0, 0); //TranslateTransform3D offset2 = new TranslateTransform3D(.6, 0, 0); //CollisionHull.IntersectionPoint[] points1a = hull1a.GetIntersectingPoints_HullToHull(100, hull2a, 0, offset1, offset2); //CollisionHull.IntersectionPoint[] points2a = hull2a.GetIntersectingPoints_HullToHull(100, hull1a, 0, offset2, offset1); //CollisionHull hull1b = CollisionHull.CreateBox(_world, 0, new Vector3D(size, size, size), offset1.Value); //CollisionHull hull2b = CollisionHull.CreateBox(_world, 0, new Vector3D(size, size, size), offset2.Value); //CollisionHull.IntersectionPoint[] points1b = hull1b.GetIntersectingPoints_HullToHull(100, hull2b, 0, null, null); //CollisionHull.IntersectionPoint[] points2b = hull2b.GetIntersectingPoints_HullToHull(100, hull1b, 0, null, null); #endregion } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }