public Egg(Point3D position, World world, int materialID, ItemOptions itemOptions, ShipDNA dna) { // The radius should be 20% the size of the adult ship this.Radius = dna.PartsByLayer.SelectMany(o => o.Value). Max(o => o.Position.ToVector().Length + Math1D.Max(o.Scale.X, o.Scale.Y, o.Scale.Z)) * .2d; Vector3D scale = new Vector3D(.75d, .75d, 1d); #region WPF Model // Material MaterialGroup materials = new MaterialGroup(); materials.Children.Add(new DiffuseMaterial(new SolidColorBrush(WorldColors.EggColor))); materials.Children.Add(WorldColors.EggSpecular); // Geometry Model GeometryModel3D geometry = new GeometryModel3D(); geometry.Material = materials; geometry.BackMaterial = materials; geometry.Geometry = UtilityWPF.GetSphere_LatLon(5, this.Radius); geometry.Transform = new ScaleTransform3D(scale); this.Model = geometry; // Model Visual ModelVisual3D model = new ModelVisual3D(); model.Content = geometry; #endregion #region Physics Body Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new RotateTransform3D(new QuaternionRotation3D(Math3D.GetRandomRotation()))); transform.Children.Add(new TranslateTransform3D(position.ToVector())); double volume = (4d / 3d) * Math.PI * scale.X * this.Radius * scale.Y * this.Radius * scale.Z * this.Radius; double mass = volume * itemOptions.Egg_Density; using (CollisionHull hull = CollisionHull.CreateSphere(world, 0, scale * this.Radius, null)) { this.PhysicsBody = new Body(hull, transform.Value, mass, new Visual3D[] { model }); this.PhysicsBody.MaterialGroupID = materialID; this.PhysicsBody.LinearDamping = .01f; this.PhysicsBody.AngularDamping = new Vector3D(.001f, .001f, .001f); } #endregion this.CreationTime = DateTime.UtcNow; }
public PanelFile(string sessionFolder, FlyingBeanSession session, FlyingBeanOptions options, ItemOptions itemOptions, SortedList<string, ShipDNA> defaultBeanList) { InitializeComponent(); _defaultBeanList = defaultBeanList; this.SessionFolder = sessionFolder; this.Session = session; this.Options = options; this.ItemOptions = itemOptions; _isInitialized = true; }
private void FinishLoad(FlyingBeanSession session, FlyingBeanOptions options, ItemOptions itemOptions, ShipDNA[] winningBeans, string saveFolder, bool startEmpty) { // Manually instantiate some of the properties that didn't get serialized options.DefaultBeanList = _defaultBeanList; if (options.NewBeanList == null) // if this was called by new, it will still be null { options.NewBeanList = new SortedList<string, ShipDNA>(); if (!startEmpty) { string[] beanKeys = options.DefaultBeanList.Keys.ToArray(); foreach (int keyIndex in UtilityCore.RandomRange(0, beanKeys.Length, Math.Min(3, beanKeys.Length))) // only do 3 of the defaults { string key = beanKeys[keyIndex]; options.NewBeanList.Add(key, options.DefaultBeanList[key]); } } } options.MutateArgs = PanelMutation.BuildMutateArgs(options); options.GravityField = new GravityFieldUniform(); options.Gravity = options.Gravity; // the property set modifies the gravity field options.WinnersLive = new WinnerList(true, options.TrackingMaxLineagesLive, options.TrackingMaxPerLineageLive); if (options.WinnersFinal == null) // if a previous save had winning ships, this will already be loaded with them { options.WinnersFinal = new WinnerList(false, options.TrackingMaxLineagesFinal, options.TrackingMaxPerLineageFinal); } options.WinnerCandidates = new CandidateWinners(); // These are already in the final list, there's no point in putting them in the candidate list as well //if (winningBeans != null) //{ // foreach (ShipDNA dna in winningBeans) // { // options.WinnerCandidates.Add(dna); // } //} // Make sure the session folder is up to date if (saveFolder == null) { this.SessionFolder = null; } else { string dirChar = Regex.Escape(System.IO.Path.DirectorySeparatorChar.ToString()); string pattern = dirChar + Regex.Escape(FlyingBeansWindow.SESSIONFOLDERPREFIX) + "[^" + dirChar + "]+(?<upto>" + dirChar + ")" + Regex.Escape(FlyingBeansWindow.SAVEFOLDERPREFIX); Match match = Regex.Match(saveFolder, pattern, RegexOptions.IgnoreCase); if (match.Success) { this.SessionFolder = saveFolder.Substring(0, match.Groups["upto"].Index); // the session folder is everything before the save subfolder } else { // They may have chosen a folder that they unziped onto their desktop, or wherever. Leaving this null so that if they hit save, it will be saved // in the appropriate location this.SessionFolder = null; } } // Swap out the settings this.Session = session; this.Options = options; this.ItemOptions = itemOptions; // Inform the world if (this.SessionChanged != null) { this.SessionChanged(this, new EventArgs()); } }
private void Window_Loaded(object sender, RoutedEventArgs e) { try { _itemOptions = new ItemOptions(); _itemOptions.MatterToEnergy_ConversionRate *= .12; _itemOptions.MatterToEnergy_AmountToDraw *= 1.25; //NOTE: In bot, the matter converter group doesn't check if empty often enough. So if you draw much more, then there will be noticable pulses of not refilling (I assume that's the cause anyway) #region Init World _boundryMin = new Point3D(-BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF); _boundryMax = new Point3D(BOUNDRYSIZEHALF, BOUNDRYSIZEHALF, BOUNDRYSIZEHALF); _world = new World(); _world.Updating += new EventHandler<WorldUpdatingArgs>(World_Updating); List<Point3D[]> innerLines, outerLines; _world.SetCollisionBoundry(out innerLines, out outerLines, _boundryMin, _boundryMax); //NOTE: No need to draw a boundry #endregion #region Materials _materialManager = new MaterialManager(_world); // Wall Game.Newt.v2.NewtonDynamics.Material material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Wall = _materialManager.AddMaterial(material); // Bot material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Bot = _materialManager.AddMaterial(material); // Item material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Item = _materialManager.AddMaterial(material); // Exploding Item material = new Game.Newt.v2.NewtonDynamics.Material(); material.IsCollidable = false; _material_ExplodingItem = _materialManager.AddMaterial(material); // Projectile material = new Game.Newt.v2.NewtonDynamics.Material(); _material_Projectile = _materialManager.AddMaterial(material); // Collisions //_materialManager.RegisterCollisionEvent(_material_Bot, _material_Bot, Collision_BotBot); //_materialManager.RegisterCollisionEvent(_material_Bot, _material_Item, Collision_BotItem); //TODO: projectile collisions #endregion #region Camera Pool //TODO: Make the number of threads more configurable, look at how many processors there are _cameraPool = new CameraPool(1, Colors.Black); #endregion #region Map _map = new Map(_viewport, _cameraPool, _world); _map.SnapshotFequency_Milliseconds = 250;// 125; _map.SnapshotMaxItemsPerNode = 10; _map.ShouldBuildSnapshots = true; _map.ShouldShowSnapshotLines = false; _map.ShouldSnapshotCentersDrift = true; _updateManager = new UpdateManager( new Type[] { typeof(DefenseBot) }, new Type[] { typeof(DefenseBot) }, _map); #endregion _world.UnPause(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
internal static Neuron_SensorPosition[] CreateNeurons(ShipPartDNA dna, ItemOptions itemOptions, double neuronDensity, bool hasHoleInMiddle, bool ignoreSetValue) { #region Calculate Counts // Figure out how many to make //NOTE: This radius isn't taking SCALE into account. The other neural parts do this as well, so the neural density properties can be more consistent double radius = (dna.Scale.X + dna.Scale.Y) / (2d * 2d); // XY should always be the same anyway (not looking at Z for this. Z is just to keep the sensors from getting too close to each other) double area = Math.Pow(radius, itemOptions.Sensor_NeuronGrowthExponent); int neuronCount = Convert.ToInt32(Math.Ceiling(neuronDensity * area)); if (neuronCount == 0) { neuronCount = 1; } #endregion Point3D[] staticPositions = null; if (hasHoleInMiddle) { staticPositions = new Point3D[] { new Point3D(0, 0, 0) }; } // Place them evenly within a circle. // I don't want a neuron in the center, so placing a static point there to force the neurons away from the center Vector3D[] positions = Brain.GetNeuronPositions_Even2D(dna.Neurons, staticPositions, 1d, neuronCount, radius); // Exit Function return positions.Select(o => new Neuron_SensorPosition(o.ToPoint(), true, ignoreSetValue)).ToArray(); }
internal static void GetMass(out double mass, out double volume, out double radius, out Vector3D actualScale, ShipPartDNA dna, ItemOptions itemOptions) { double radiusLocal = ((dna.Scale.X * SensorVisionDesign.SIZEPERCENTOFSCALE_XY) + (dna.Scale.Y * SensorVisionDesign.SIZEPERCENTOFSCALE_XY)) / (2d * 2d); // scale is diameter, so divide an extra two to get radius double heightLocal = dna.Scale.Z * SensorVisionDesign.SIZEPERCENTOFSCALE_Z; double halfHeightLocal = heightLocal / 2d; volume = Math.PI * radiusLocal * radiusLocal * heightLocal; // get volume of the cylinder // This isn't the radius of the cylinder, it is the radius of the bounding sphere radius = Math.Sqrt((radiusLocal * radiusLocal) + (halfHeightLocal * halfHeightLocal)); mass = volume * itemOptions.Sensor_Density; actualScale = new Vector3D(dna.Scale.X * SensorVisionDesign.SIZEPERCENTOFSCALE_XY, dna.Scale.Y * SensorVisionDesign.SIZEPERCENTOFSCALE_XY, dna.Scale.Z * SensorVisionDesign.SIZEPERCENTOFSCALE_Z); }
private void Window_Loaded(object sender, RoutedEventArgs e) { try { _itemOptions = new ItemOptions(); #region Init World _boundryMin = new Point3D(-BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF); _boundryMax = new Point3D(BOUNDRYSIZEHALF, BOUNDRYSIZEHALF, BOUNDRYSIZEHALF); _world = new World(); //_world.Updating += new EventHandler<WorldUpdatingArgs>(World_Updating); List<Point3D[]> innerLines, outerLines; _world.SetCollisionBoundry(out innerLines, out outerLines, _boundryMin, _boundryMax); #endregion #region Materials _materialManager = new MaterialManager(_world); // Asteroid Game.Newt.v2.NewtonDynamics.Material material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Asteroid = _materialManager.AddMaterial(material); // Collisions //_materialManager.RegisterCollisionEvent(_material_Asteroid, _material_Asteroid, Collision_AsteroidAsteroid); #endregion #region Map _map = new Map(_viewport, null, _world); _map.SnapshotFequency_Milliseconds = 250;// 125; _map.SnapshotMaxItemsPerNode = 10; _map.ShouldBuildSnapshots = false; _map.ShouldShowSnapshotLines = false; _map.ShouldSnapshotCentersDrift = true; // Asteroid doesn't implement up IPartUpdatable //_updateManager = new UpdateManager( // new Type[] { typeof(Asteroid) }, // new Type[] { typeof(Asteroid) }, // _map); #endregion _world.UnPause(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
public PanelBeanProps(FlyingBeanOptions options, ItemOptions itemOptions) { InitializeComponent(); _options = options; _itemOptions = itemOptions; //PropertyInfo[] propsOptions = typeof(FlyingBeanOptions).GetProperties(); PropertyInfo[] propsItems = typeof(ItemOptions).GetProperties(); // Consumption _propLinks.Add(new SliderShowValues.PropSync(trkThrustForce, propsItems.Where(o => o.Name == "ThrusterStrengthRatio").First(), _itemOptions, 5, 100)); _propLinks.Add(new SliderShowValues.PropSync(trkFuelDraw, propsItems.Where(o => o.Name == "FuelToThrustRatio").First(), _itemOptions, .001d, 5)); _propLinks.Add(new SliderShowValues.PropSync(trkGravitySensorEnergyDraw, propsItems.Where(o => o.Name == "GravitySensorAmountToDraw").First(), _itemOptions, .1, 10)); _propLinks.Add(new SliderShowValues.PropSync(trkSpinSensorEnergyDraw, propsItems.Where(o => o.Name == "SpinSensorAmountToDraw").First(), _itemOptions, .1, 10)); _propLinks.Add(new SliderShowValues.PropSync(trkBrainEnergyDraw, propsItems.Where(o => o.Name == "BrainAmountToDraw").First(), _itemOptions, .1, 10)); // Neural _propLinks.Add(new SliderShowValues.PropSync(trkGravSensorNeuronDensity, propsItems.Where(o => o.Name == "GravitySensorNeuronDensity").First(), _itemOptions, 4, 60)); _propLinks.Add(new SliderShowValues.PropSync(trkBrainNeuronDensity, propsItems.Where(o => o.Name == "BrainNeuronDensity").First(), _itemOptions, 4, 60)); _propLinks.Add(new SliderShowValues.PropSync(trkBrainChemicalDensity, propsItems.Where(o => o.Name == "BrainChemicalDensity").First(), _itemOptions, 0, 10)); _propLinks.Add(new SliderShowValues.PropSync(trkBrainInternalLinks, propsItems.Where(o => o.Name == "BrainLinksPerNeuron_Internal").First(), _itemOptions, .5, 8)); _propLinks.Add(new SliderShowValues.PropSync(trkBrainExternalLinkSensor, propsItems.Where(o => o.Name == "BrainLinksPerNeuron_External_FromSensor").First(), _itemOptions, .1, 5)); _propLinks.Add(new SliderShowValues.PropSync(trkBrainExternalLinkBrain, propsItems.Where(o => o.Name == "BrainLinksPerNeuron_External_FromBrain").First(), _itemOptions, .1, 5)); _propLinks.Add(new SliderShowValues.PropSync(trkThrusterExternalLinkSensor, propsItems.Where(o => o.Name == "ThrusterLinksPerNeuron_Sensor").First(), _itemOptions, .1, 5)); _propLinks.Add(new SliderShowValues.PropSync(trkThrusterExternalLinkBrain, propsItems.Where(o => o.Name == "ThrusterLinksPerNeuron_Brain").First(), _itemOptions, .1, 5)); // Density _propLinks.Add(new SliderShowValues.PropSync(trkBrainDensity, propsItems.Where(o => o.Name == "BrainDensity").First(), _itemOptions, 1, 5000)); _propLinks.Add(new SliderShowValues.PropSync(trkGravSensorDensity, propsItems.Where(o => o.Name == "SensorDensity").First(), _itemOptions, 1, 5000)); _propLinks.Add(new SliderShowValues.PropSync(trkEnergyTankDensity, propsItems.Where(o => o.Name == "EnergyTankDensity").First(), _itemOptions, 1, 5000)); _propLinks.Add(new SliderShowValues.PropSync(trkFuelTankDensity, propsItems.Where(o => o.Name == "FuelTankWallDensity").First(), _itemOptions, 1, 5000)); _propLinks.Add(new SliderShowValues.PropSync(trkFuelDensity, propsItems.Where(o => o.Name == "FuelDensity").First(), _itemOptions, 1, 5000)); _propLinks.Add(new SliderShowValues.PropSync(trkThrusterDensity, propsItems.Where(o => o.Name == "ThrusterDensity").First(), _itemOptions, 1, 5000)); // TODO: this one should have a log scale //trkMomentOfInertia.Normalize_SliderToValue += //convert a linear to nonlinear //trkMomentOfInertia.Normalize_ValueToSlider += //convert a nonlinear to linear _propLinks.Add(new SliderShowValues.PropSync(trkMomentOfInertia, propsItems.Where(o => o.Name == "MomentOfInertiaMultiplier").First(), _itemOptions, .01, 10)); //TODO: When I start saving the options to file, also need to set the min/max from options (in case the user changed the range) //TODO: This is a lot of hard coding. Store the linkage between slider and property in a list, and just have one event listener for all sliders //trkThrustForce.Value = _itemOptions.ThrusterStrengthRatio; //trkFuelDraw.Minimum = .000000001; //trkFuelDraw.Maximum = .000005; //trkFuelDraw.Value = _itemOptions.FuelToThrustRatio; //trkSensorEnergyDraw.Value = _itemOptions.GravitySensorAmountToDraw; //trkBrainEnergyDraw.Value = _itemOptions.BrainAmountToDraw; //trkLifespan.Value = _options.MaxAgeSeconds; //trkAngularVelocity.Value = _options.AngularVelocityDeath; //trkGroundCollisions.Value = _options.MaxGroundCollisions; //trkGravSensorNeuronDensity.Value = _itemOptions.GravitySensorNeuronDensity; //trkBrainNeuronDensity.Value = _itemOptions.BrainNeuronDensity; //trkBrainChemicalDensity.Value = _itemOptions.BrainChemicalDensity; //trkBrainInternalLinks.Value = _itemOptions.BrainLinksPerNeuron_Internal; //trkBrainExternalLinkSensor.Value = _itemOptions.BrainLinksPerNeuron_External_FromSensor; //trkBrainExternalLinkBrain.Value = _itemOptions.BrainLinksPerNeuron_External_FromBrain; //trkThrusterExternalLinkSensor.Value = _itemOptions.ThrusterLinksPerNeuron_Sensor; //trkThrusterExternalLinkBrain.Value = _itemOptions.ThrusterLinksPerNeuron_Brain; //trkBrainDensity.Value = _itemOptions.BrainDensity; //trkGravSensorDensity.Value = _itemOptions.SensorDensity; //trkEnergyTankDensity.Value = _itemOptions.EnergyTankDensity; //trkFuelTankDensity.Value = _itemOptions.FuelTankWallDensity; //trkFuelDensity.Value = _itemOptions.FuelDensity; //trkThrusterDensity.Value = _itemOptions.ThrusterDensity; //trkMomentOfInertia.Value = _itemOptions.MomentOfInertiaMultiplier; _isInitialized = true; }
private void PanelFile_SessionChanged(object sender, EventArgs e) { try { //NOTE: This method has many statements, and isn't very threadsafe, but even if there were several threads hitting these options there shouldn't //be any damage with the panels being momentarily out of sync // Kill all current if (_selectedBean != null && _selectedBean.Viewer != null) { _selectedBean.Viewer.Close(); } _selectedBean = null; foreach (Bean bean in _beans.ToArray()) // using toarray, because DisposeBean removes from the list { DisposeBean(bean); } foreach (ExplodingBean explosion in _explosions.ToArray()) { DisposeExplosion(explosion); } // Get the new session _session = _panelFile.Session; _options = _panelFile.Options; _itemOptions = _panelFile.ItemOptions; #region Refresh options panels if (_panelBeanTypes != null) { _panelBeanTypes.Options = _options; } if (_panelBeanProps != null) { _panelBeanProps.Options = _options; _panelBeanProps.ItemOptions = _itemOptions; } if (_panelMutation != null) { _panelMutation.Options = _options; } if (_panelTracking != null) { _panelTracking.Options = _options; } if (_panelSimulation != null) { _panelSimulation.Options = _options; } #endregion // Refresh winner manager if (_winnerManager != null) { _winnerManager.Live = _options.WinnersLive; _winnerManager.Candidates = _options.WinnerCandidates; _winnerManager.Final = _options.WinnersFinal; } RefreshStats(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private void Window_Loaded(object sender, RoutedEventArgs e) { try { double terrainHeight = TERRAINRADIUS / 20d; #region Load last save _session = new FlyingBeanSession(); _options = new FlyingBeanOptions(); _itemOptions = new ItemOptions(); _panelFile = new PanelFile(null, _session, _options, _itemOptions, GetDefaultBeans()); _panelFile.SessionChanged += new EventHandler(PanelFile_SessionChanged); if (!_panelFile.TryLoadLastSave(false)) { _panelFile.New(false, false); // by calling new, all of the options initialization is done by the file panel instead of doing it here } #endregion #region Winners _winnerManager = new WinnerManager(_options.WinnersLive, _options.WinnerCandidates, _options.WinnersFinal, _options.FinalistCount); #endregion #region Init World double boundryXY = TERRAINRADIUS * 1.25d; _boundryMin = new Point3D(-boundryXY, -boundryXY, terrainHeight * -2d); _boundryMax = new Point3D(boundryXY, boundryXY, TERRAINRADIUS * 25d); _world = new World(); _world.Updating += new EventHandler<WorldUpdatingArgs>(World_Updating); List<Point3D[]> innerLines, outerLines; _world.SetCollisionBoundry(out innerLines, out outerLines, _boundryMin, _boundryMax); // Draw the lines _boundryLines = new ScreenSpaceLines3D(true) { Thickness = 1d, Color = _colors.BoundryLines, }; _viewport.Children.Add(_boundryLines); foreach (Point3D[] line in innerLines) { _boundryLines.AddLine(line[0], line[1]); } #endregion #region Materials _materialManager = new MaterialManager(_world); // Terrain Game.Newt.v2.NewtonDynamics.Material material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Terrain = _materialManager.AddMaterial(material); // Bean material = new Game.Newt.v2.NewtonDynamics.Material(); _material_Bean = _materialManager.AddMaterial(material); // Exploding Bean material = new Game.Newt.v2.NewtonDynamics.Material(); material.IsCollidable = false; _material_ExplodingBean = _materialManager.AddMaterial(material); // Projectile material = new Game.Newt.v2.NewtonDynamics.Material(); _material_Projectile = _materialManager.AddMaterial(material); _materialManager.RegisterCollisionEvent(0, _material_Bean, Collision_BeanTerrain); // zero should be the boundry (it should be the default material if no other is applied) _materialManager.RegisterCollisionEvent(_material_Terrain, _material_Bean, Collision_BeanTerrain); _materialManager.RegisterCollisionEvent(_material_Bean, _material_Bean, Collision_BeanBean); #endregion #region Trackball // Trackball _trackball = new TrackBallRoam(_camera); _trackball.KeyPanScale = 15d; _trackball.EventSource = grdViewPort; //NOTE: If this control doesn't have a background color set, the trackball won't see events (I think transparent is ok, just not null) _trackball.AllowZoomOnMouseWheel = true; _trackball.Mappings.AddRange(TrackBallMapping.GetPrebuilt(TrackBallMapping.PrebuiltMapping.MouseComplete_NoLeft)); _trackball.Mappings.AddRange(TrackBallMapping.GetPrebuilt(TrackBallMapping.PrebuiltMapping.Keyboard_ASDW_In)); _trackball.ShouldHitTestOnOrbit = true; _trackball.UserMovedCamera += new EventHandler<UserMovedCameraArgs>(Trackball_UserMovedCamera); _trackball.GetOrbitRadius += new EventHandler<GetOrbitRadiusArgs>(Trackball_GetOrbitRadius); #endregion #region Map _map = new Map(_viewport, null, _world) { SnapshotFequency_Milliseconds = 125, SnapshotMaxItemsPerNode = 10, ShouldBuildSnapshots = false, ShouldShowSnapshotLines = false, ShouldSnapshotCentersDrift = true, }; _updateManager = new UpdateManager( new Type[] { typeof(Bean) }, new Type[] { typeof(Bean) }, _map); #endregion #region Terrain //TODO: Texture map this so it's not so boring #region WPF Model (plus collision hull) // Material MaterialGroup materials = new MaterialGroup(); materials.Children.Add(new DiffuseMaterial(new SolidColorBrush(_colors.Terrain))); materials.Children.Add(_colors.TerrainSpecular); // Geometry Model GeometryModel3D geometry = new GeometryModel3D(); geometry.Material = materials; geometry.BackMaterial = materials; geometry.Geometry = UtilityWPF.GetCylinder_AlongX(100, TERRAINRADIUS, terrainHeight); CollisionHull hull = CollisionHull.CreateCylinder(_world, 0, TERRAINRADIUS, terrainHeight, null); // Transform Transform3DGroup transform = new Transform3DGroup(); // rotate needs to be added before translate transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), -90))); transform.Children.Add(new TranslateTransform3D(new Vector3D(0, 0, terrainHeight / -2d))); // I want the objects to be able to add to z=0 // Model Visual ModelVisual3D model = new ModelVisual3D(); model.Content = geometry; model.Transform = transform; // Add to the viewport _viewport.Children.Add(model); #endregion // Make a physics body that represents this shape _terrain = new Body(hull, transform.Value, 0, new Visual3D[] { model }); // using zero mass tells newton it's static scenery (stuff bounces off of it, but it will never move) hull.Dispose(); _terrain.MaterialGroupID = _material_Terrain; #endregion #region Fields // gravity was done by the file panel _radiation = new RadiationField() { AmbientRadiation = 0d, }; _boundryField = new BoundryField(.5d, 7500d, 2d, _boundryMin, _boundryMax); #endregion // Doing this so that if they hit the import button, it will call a method in beantypes (not the best design, but it works) _panelBeanTypes = new PanelBeanTypes(_options, _world); _panelFile.BeanTypesPanel = _panelBeanTypes; this.TotalBeansText = _options.TotalBeans.ToString("N0"); _world.UnPause(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private void Window_Loaded(object sender, RoutedEventArgs e) { try { _itemOptions = new ItemOptions(); _itemOptions.Thruster_StrengthRatio *= 4.5; _itemOptions.FuelToThrustRatio *= .03; _itemOptions.Projectile_Color = UtilityWPF.ColorFromHex("FFE330"); // using bee/wasp colors, because white looks too much like the stars _progressBars = new ShipProgressBarManager(pnlProgressBars); _progressBars.Foreground = new SolidColorBrush(UtilityWPF.ColorFromHex("BBB")); #region Init World // Set the size of the world to something a bit random (gets boring when it's always the same size) double halfSize = 325 + StaticRandom.Next(500); //halfSize *= 2; _boundryMin = new Point3D(-halfSize, -halfSize, -35); _boundryMax = new Point3D(halfSize, halfSize, 35); _world = new World(); _world.Updating += new EventHandler<WorldUpdatingArgs>(World_Updating); List<Point3D[]> innerLines, outerLines; _world.SetCollisionBoundry(out innerLines, out outerLines, _boundryMin, _boundryMax); // Draw the lines _boundryLines = new ScreenSpaceLines3D(true); _boundryLines.Thickness = 1d; _boundryLines.Color = WorldColors.BoundryLines; _viewport.Children.Add(_boundryLines); foreach (Point3D[] line in innerLines) { _boundryLines.AddLine(line[0], line[1]); } #endregion #region Materials _materialManager = new MaterialManager(_world); // Ship Game.Newt.v2.NewtonDynamics.Material material = new Game.Newt.v2.NewtonDynamics.Material(); _material_Ship = _materialManager.AddMaterial(material); // Exploding Ship material = new Game.Newt.v2.NewtonDynamics.Material(); material.IsCollidable = false; _material_ExplodingShip = _materialManager.AddMaterial(material); // Space Station (force field) material = new Game.Newt.v2.NewtonDynamics.Material(); material.IsCollidable = false; //material.Elasticity = .99d; // uncomment these if it should be collidable (it's an ellipse, and briefly shows a force field) //material.StaticFriction = .02d; //material.KineticFriction = .01d; _material_SpaceStation = _materialManager.AddMaterial(material); //_materialManager.RegisterCollisionEvent(_material_SpaceStation, _material_Asteroid, Collision_SpaceStation); //_materialManager.RegisterCollisionEvent(_material_SpaceStation, _material_Mineral, Collision_SpaceStation); // Mineral material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .5d; material.StaticFriction = .9d; material.KineticFriction = .4d; _material_Mineral = _materialManager.AddMaterial(material); // Asteroid material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .25d; material.StaticFriction = .9d; material.KineticFriction = .75d; _material_Asteroid = _materialManager.AddMaterial(material); // Projectile material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .95d; _material_Projectile = _materialManager.AddMaterial(material); // Swarmbot material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .95d; _material_SwarmBot = _materialManager.AddMaterial(material); // Collisions _materialManager.RegisterCollisionEvent(_material_Ship, _material_Mineral, Collision_ShipMineral); _materialManager.RegisterCollisionEvent(_material_Ship, _material_Asteroid, Collision_ShipAsteroid); _materialManager.RegisterCollisionEvent(_material_Ship, _material_Projectile, Collision_ShipProjectile); _materialManager.RegisterCollisionEvent(_material_Asteroid, _material_Projectile, Collision_AsteroidProjectile); _materialManager.RegisterCollisionEvent(_material_Asteroid, _material_SwarmBot, Collision_AsteroidSwarmBot); _materialManager.RegisterCollisionEvent(_material_Asteroid, _material_Asteroid, Collision_AsteroidAsteroid); #endregion #region Trackball //TODO: Only use this when debugging the scene //// Trackball //_trackball = new TrackBallRoam(_camera); //_trackball.KeyPanScale = 15d; //_trackball.EventSource = grdViewPort; //NOTE: If this control doesn't have a background color set, the trackball won't see events (I think transparent is ok, just not null) //_trackball.AllowZoomOnMouseWheel = true; //_trackball.Mappings.AddRange(TrackBallMapping.GetPrebuilt(TrackBallMapping.PrebuiltMapping.MouseComplete_NoLeft)); ////_trackball.GetOrbitRadius += new GetOrbitRadiusHandler(Trackball_GetOrbitRadius); //_trackball.ShouldHitTestOnOrbit = true; #endregion #region Map _map = new Map(_viewport, null, _world); //_map.SnapshotFequency_Milliseconds = 250; // just use the map's default values //_map.SnapshotMaxItemsPerNode = 13; _map.ShouldBuildSnapshots = true; _map.ShouldShowSnapshotLines = false; _map.ShouldSnapshotCentersDrift = true; _map.ItemRemoved += new EventHandler<MapItemArgs>(Map_ItemRemoved); #endregion #region Radiation //TODO: Make radiation sources instead of a constant ambient -- sort of mini stars, or something manmade looking _radiation = new RadiationField() { AmbientRadiation = 1, }; #endregion #region UpdateManager //TODO: UpdateManager needs to inspect types as they are added to the map (map's ItemAdded event) _updateManager = new UpdateManager( new Type[] { typeof(ShipPlayer), typeof(SpaceStation2D), typeof(Projectile), typeof(Asteroid), typeof(SwarmBot1b) }, new Type[] { typeof(ShipPlayer), typeof(SwarmBot1b) }, _map); #endregion #region Brush Strokes _brushStrokes = new SwarmObjectiveStrokes(_world.WorldClock, _itemOptions.SwarmBay_BirthSize * 4, 6); // This would be for drawing the strokes //_brushStrokes.PointsChanged += BrushStrokes_PointsChanged; #endregion #region Player _player = new Player(); _player.Credits = 10; _player.ShipChanged += new EventHandler<ShipChangedArgs>(Player_ShipChanged); #endregion #region Minimap _miniMap = new MinimapHelper(_map, _viewportMap); #endregion #region Camera Helper _cameraHelper = new CameraHelper(_player, _camera, _cameraMap, _miniMap); #endregion #region MapPopulationManager _mapPopulationManager = new MapPopulationManager(_map, _world, new Point3D(_boundryMin.X, _boundryMin.Y, 0), new Point3D(_boundryMax.X, _boundryMax.Y, 0), _material_Asteroid, _material_Mineral, GetAsteroidMassByRadius, GetMineralsFromDestroyedAsteroid, ItemOptionsAstMin2D.MINASTEROIDRADIUS); _updateManager.AddNonMapItem(_mapPopulationManager, TokenGenerator.NextToken()); #endregion #region MapForcesManager _mapForcesManager = new MapForcesManager(_map, _boundryMin, _boundryMax); _updateManager.AddNonMapItem(_mapForcesManager, TokenGenerator.NextToken()); #endregion #region BackImageManager _backImageManager = new BackImageManager(backgroundCanvas, _player); #endregion #region Ship Extra _shipExtra = new ShipExtraArgs() { Options = _editorOptions, ItemOptions = _itemOptions, Material_Projectile = _material_Projectile, Material_SwarmBot = _material_SwarmBot, SwarmObjectiveStrokes = _brushStrokes, RunNeural = false, Radiation = _radiation, }; #endregion CreateStars3D(); //TODO: Move this to BackImageManager //CreateStars3DGrid(); //CreateShip(UtilityCore.GetRandomEnum<DefaultShipType>()); if (!LoadLatestSession()) { CreateNewSession(); } CreateAsteroids(); CreateMinerals(); //CreateProjectile(); _world.UnPause(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
public SpaceDockPanel(EditorOptions editorOptions, ItemOptions itemOptions, Map map, int material_Ship, ShipExtraArgs shipExtra) { InitializeComponent(); _editorOptions = editorOptions; _itemOptions = itemOptions; _map = map; _material_Ship = material_Ship; _shipExtra = shipExtra; }
public Bot(BotConstruction_Result construction) { _options = construction.ArgsExtra.Options; _itemOptions = construction.ArgsExtra.ItemOptions; _radiation = construction.ArgsExtra.Radiation; _gravity = construction.ArgsExtra.Gravity; _cameraPool = construction.ArgsExtra.CameraPool; _parts = construction.PartConstruction; _thrusters = construction.PartConstruction.GetStandardParts<Thruster>(Thruster.PARTTYPE).ToArray(); _projectileGuns = construction.PartConstruction.GetStandardParts<ProjectileGun>(ProjectileGun.PARTTYPE).ToArray(); _updatableParts_MainThread = construction.UpdatableParts_MainThread; _updatableParts_AnyThread = construction.UpdatableParts_AnyThread; _dna = construction.DNA; _dnaParts = construction.DNAParts; this.Model = construction.Model; _visualEffects = construction.VisualEffects; _isPhysicsStatic = construction.ArgsExtra.IsPhysicsStatic; this.PhysicsBody = construction.PhysicsBody; this.Radius = construction.Radius; _partTransformToModel = _parts.AllPartsArray. Select(o => { Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new TranslateTransform3D(-o.Position.ToVector())); transform.Children.Add(new RotateTransform3D(new QuaternionRotation3D(o.Orientation.ToReverse()))); return transform; }). ToArray(); // Hook up events if (!_isPhysicsStatic) { this.PhysicsBody.ApplyForceAndTorque += new EventHandler<BodyApplyForceAndTorqueArgs>(PhysicsBody_ApplyForceAndTorque); } foreach (var part in _parts.AllPartsArray) { part.RequestWorldLocation += new EventHandler<PartRequestWorldLocationArgs>(Part_RequestWorldLocation); part.RequestWorldSpeed += new EventHandler<PartRequestWorldSpeedArgs>(Part_RequestWorldSpeed); part.RequestParent += new EventHandler<PartRequestParentArgs>(Part_RequestParent); part.Resurrected += Part_Resurrected; part.Destroyed += Part_Destroyed; } // See if there are parts that can gradually change the ship's mass if ((_parts.Containers.Fuels.Count > 0 && _parts.StandardParts.ContainsKey(Thruster.PARTTYPE)) || (_parts.Containers.CargoBays.Count > 0 && (_parts.StandardParts.ContainsKey(ConverterMatterToEnergy.PARTTYPE) || _parts.StandardParts.ContainsKey(ConverterMatterToFuel.PARTTYPE))) || (_parts.Containers.Energies.Count > 0 && _parts.Containers.Fuels.Count > 0 && (_parts.StandardParts.ContainsKey(ConverterEnergyToFuel.PARTTYPE) || _parts.StandardParts.ContainsKey(ConverterFuelToEnergy.PARTTYPE))) ) { _hasMassChangingUpdatables_Small = true; } else { _hasMassChangingUpdatables_Small = false; } if (_parts.Containers.Ammos.Count > 0 && _parts.StandardParts.ContainsKey(ProjectileGun.PARTTYPE)) { _hasMassChangingUpdatables_Medium = true; } else { _hasMassChangingUpdatables_Medium = false; } // Set up a neural processor on its own thread/task _neuronLinks = construction.Links; if (_neuronLinks != null) { var bucketTask = AddToNeuralPool(_neuronLinks); _neuralPoolAddTask = bucketTask.Item1; _linkBucket = bucketTask.Item2; } _lifeEvents = construction.PartConstruction.LifeEventWatcher; this.ShouldRecalcMass_Large = false; this.ShouldRecalcMass_Small = false; this.CreationTime = DateTime.UtcNow; }
public ThrustController(Bot bot, Viewport3D viewport, ItemOptions itemOptions) { _bot = bot; _thrusters = bot.Thrusters; _viewport = viewport; _itemOptions = itemOptions; _lines = new ScreenSpaceLines3D(); _lines.Color = Colors.Orange; _lines.Thickness = 2d; _viewport.Children.Add(_lines); }
public void New(bool startEmpty, bool randomSettings) { FlyingBeanOptions beanOptions = new FlyingBeanOptions(); ItemOptions itemOptions = new ItemOptions(); if (randomSettings) { double newBeanProb = beanOptions.NewBeanProbOfWinner; double scanFrequency = beanOptions.TrackingScanFrequencySeconds; beanOptions = MutateUtility.MutateSettingsObject(beanOptions, new MutateUtility.MuateArgs(.5d)); beanOptions.NewBeanProbOfWinner = newBeanProb; // leave these one alone beanOptions.TrackingScanFrequencySeconds = scanFrequency; itemOptions = MutateUtility.MutateSettingsObject(itemOptions, new MutateUtility.MuateArgs(.5d)); } FinishLoad(new FlyingBeanSession(), beanOptions, itemOptions, null, null, startEmpty); }
private void Window_Loaded(object sender, RoutedEventArgs e) { try { _itemOptions = new ItemOptions(); #region Init World _boundryMin = new Point3D(-BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF); _boundryMax = new Point3D(BOUNDRYSIZEHALF, BOUNDRYSIZEHALF, BOUNDRYSIZEHALF); _world = new World(); _world.Updating += new EventHandler<WorldUpdatingArgs>(World_Updating); List<Point3D[]> innerLines, outerLines; _world.SetCollisionBoundry(out innerLines, out outerLines, _boundryMin, _boundryMax); //TODO: Only draw the boundry lines if options say to #endregion #region Materials _materialManager = new MaterialManager(_world); // Wall Game.Newt.v2.NewtonDynamics.Material material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Wall = _materialManager.AddMaterial(material); // Bot material = new Game.Newt.v2.NewtonDynamics.Material(); _material_Bot = _materialManager.AddMaterial(material); // Exploding Bot material = new Game.Newt.v2.NewtonDynamics.Material(); material.IsCollidable = false; _material_ExplodingBot = _materialManager.AddMaterial(material); // Food material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Food = _materialManager.AddMaterial(material); // Egg material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .5d; _material_Egg = _materialManager.AddMaterial(material); // Projectile material = new Game.Newt.v2.NewtonDynamics.Material(); _material_Projectile = _materialManager.AddMaterial(material); // Collisions _materialManager.RegisterCollisionEvent(_material_Bot, _material_Bot, Collision_BotBot); _materialManager.RegisterCollisionEvent(_material_Bot, _material_Food, Collision_BotFood); //TODO: May want to listen to projectile collisions #endregion #region Trackball // Trackball _trackball = new TrackBallRoam(_camera); _trackball.KeyPanScale = 15d; _trackball.EventSource = grdViewPort; //NOTE: If this control doesn't have a background color set, the trackball won't see events (I think transparent is ok, just not null) _trackball.AllowZoomOnMouseWheel = true; _trackball.Mappings.AddRange(TrackBallMapping.GetPrebuilt(TrackBallMapping.PrebuiltMapping.MouseComplete_NoLeft)); _trackball.Mappings.AddRange(TrackBallMapping.GetPrebuilt(TrackBallMapping.PrebuiltMapping.Keyboard_ASDW_In)); _trackball.ShouldHitTestOnOrbit = true; //_trackball.UserMovedCamera += new EventHandler<UserMovedCameraArgs>(Trackball_UserMovedCamera); //_trackball.GetOrbitRadius += new EventHandler<GetOrbitRadiusArgs>(Trackball_GetOrbitRadius); #endregion #region Camera Pool //TODO: Make the number of threads more configurable, look at how many processors there are //_cameraPool = new CameraPool(2, Colors.Black); _cameraPool = new CameraPool(1, Colors.Black); #endregion #region Map _map = new Map(_viewport, _cameraPool, _world) { SnapshotFequency_Milliseconds = 250, // 125 SnapshotMaxItemsPerNode = 10, ShouldBuildSnapshots = true, ShouldShowSnapshotLines = false, ShouldSnapshotCentersDrift = true, }; _updateManager = new UpdateManager( new Type[] { typeof(Swimbot) }, new Type[] { typeof(Swimbot) }, _map); #endregion #region Fields _radiation = new RadiationField() { AmbientRadiation = 0d, }; //_gravity = new GravityFieldUniform() //{ // Gravity = new Vector3D(0, 0, 0), //}; //TODO: Support a uniform fluid //FluidField #endregion #region ItemSelectDragLogic _selectionLogic = new ItemSelectDragLogic(_map, _camera, _viewport, grdViewPort) { ShouldMoveItemWithSpring = true, ShouldSpringCauseTorque = false, SpringColor = null, // Colors.Chartreuse ShowDebugVisuals = false, // true }; _selectionLogic.SelectableTypes.Add(typeof(Bot)); _selectionLogic.SelectableTypes.Add(typeof(Mineral)); _selectionLogic.SelectableTypes.Add(typeof(Egg)); _selectionLogic.ItemSelected += new EventHandler<ItemSelectedArgs>(SelectionLogic_ItemSelected); #endregion _world.UnPause(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }
private void Window_Loaded(object sender, RoutedEventArgs e) { try { _itemOptions = new ItemOptions(); #region Init World _boundryMin = new Point3D(-BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF, -BOUNDRYSIZEHALF); _boundryMax = new Point3D(BOUNDRYSIZEHALF, BOUNDRYSIZEHALF, BOUNDRYSIZEHALF); _world = new World(); _world.Updating += new EventHandler<WorldUpdatingArgs>(World_Updating); List<Point3D[]> innerLines, outerLines; _world.SetCollisionBoundry(out innerLines, out outerLines, _boundryMin, _boundryMax); #endregion #region Materials _materialManager = new MaterialManager(_world); // Wall Game.Newt.v2.NewtonDynamics.Material material = new Game.Newt.v2.NewtonDynamics.Material(); material.Elasticity = .1d; _material_Wall = _materialManager.AddMaterial(material); // Ball material = new Game.Newt.v2.NewtonDynamics.Material(); _material_Ball = _materialManager.AddMaterial(material); #endregion #region Trackball // Trackball _trackball = new TrackBallRoam(_camera); _trackball.KeyPanScale = 15d; _trackball.EventSource = grdViewPort; //NOTE: If this control doesn't have a background color set, the trackball won't see events (I think transparent is ok, just not null) _trackball.AllowZoomOnMouseWheel = true; _trackball.Mappings.AddRange(TrackBallMapping.GetPrebuilt(TrackBallMapping.PrebuiltMapping.MouseComplete_NoLeft)); _trackball.Mappings.AddRange(TrackBallMapping.GetPrebuilt(TrackBallMapping.PrebuiltMapping.Keyboard_ASDW_In)); _trackball.ShouldHitTestOnOrbit = true; //_trackball.UserMovedCamera += new EventHandler<UserMovedCameraArgs>(Trackball_UserMovedCamera); //_trackball.GetOrbitRadius += new EventHandler<GetOrbitRadiusArgs>(Trackball_GetOrbitRadius); #endregion #region Chased Ball _chasedBall = new ChasedBall(); _chasedBall.MotionType_Position = MotionType_Position.Stop; _chasedBall.MotionType_Orientation = MotionType_Orientation.Stop; _chasedBall.BoundrySizeChanged += new EventHandler(ChasedBall_BoundrySizeChanged); // Ball visual _chasedBallVisual = GetChaseBallVisual_Position(); _chasedBallTransform = new TranslateTransform3D(); _chasedBallVisual.Transform = _chasedBallTransform; _viewport.Children.Add(_chasedBallVisual); // Direction Visual var directionVisual = GetChaseBallVisual_Orientation(); _chasedDirectionModel = directionVisual.Item1; _chasedDirectionVisual = directionVisual.Item2; _viewport.Children.Add(_chasedDirectionVisual); // Panels (the act of instantiating them will update the ball's properties) pnlChasePosition.Content = new ChasedPosition(_chasedBall) { Foreground = Brushes.White, }; pnlChaseOrientation.Content = new ChasedOrientation(_chasedBall) { Foreground = Brushes.White, }; #endregion #region Debug Visuals // Put these on the viewport before the ball so that it is propertly semitransparent //TODO: Draw the bounding box. Use XYZ colors. This will help the user stay oriented #endregion #region Body Ball _bodyBall = new BodyBall(_world); //_bodyBall.PhysicsBody.AngularDamping = new Vector3D(.0001, .0001, .0001); //_bodyBall.PhysicsBody.AngularVelocity = new Vector3D(0, 0, 4 * Math.PI); _viewport.Children.AddRange(_bodyBall.Visuals3D); #endregion RedrawBoundry(); _world.UnPause(); } catch (Exception ex) { MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error); } }