public WeaponAxe(WeaponMaterialCache materials, WeaponAxeDNA dna, bool isLeftSide) { _materials = materials; var model = GetModel(dna, materials, isLeftSide); this.Model = model.Item1; this.DNA = model.Item2; }
/// <summary> /// This returns a random axe, with some optional fixed values /// </summary> public static WeaponAxeDNA GetRandomDNA(double?sizeSingleSide = null, WeaponAxeType?axeType = null, WeaponAxeSides?sides = null, WeaponAxeStye?style = null) { WeaponAxeDNA retVal = new WeaponAxeDNA(); Random rand = StaticRandom.GetRandomForThread(); // Size if (sizeSingleSide != null) { retVal.SizeSingle = sizeSingleSide.Value; } else { retVal.SizeSingle = rand.NextDouble(.4, 1); } // AxeType if (axeType != null) { retVal.AxeType = axeType.Value; } else { retVal.AxeType = UtilityCore.GetRandomEnum <WeaponAxeType>(); } // Sides if (sides != null) { retVal.Sides = sides.Value; } else { retVal.Sides = UtilityCore.GetRandomEnum <WeaponAxeSides>(); } // Style if (style != null) { retVal.Style = style.Value; } else { retVal.Style = UtilityCore.GetRandomEnum <WeaponAxeStye>(); } return(retVal); }
private static Tuple <Model3DGroup, WeaponAxeDNA> GetModel(WeaponAxeDNA dna, WeaponMaterialCache materials, bool isLeftSide) { WeaponAxeDNA finalDNA = UtilityCore.Clone(dna); if (finalDNA.KeyValues == null) { finalDNA.KeyValues = new SortedList <string, double>(); } Model3DGroup model = null; switch (finalDNA.AxeType) { case WeaponAxeType.Symetrical: model = GetModel_Symetrical(dna, finalDNA, materials); break; case WeaponAxeType.Lumber: case WeaponAxeType.Bearded: model = GetModel_Second(dna, finalDNA, materials, finalDNA.AxeType == WeaponAxeType.Bearded); break; default: throw new ApplicationException("Unknown WeaponAxeType: " + finalDNA.AxeType.ToString()); } Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), 90))); if (dna.IsBackward) { // This won't make a difference if it's a double sided axe, but will for single sided transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 180))); } if (isLeftSide) { transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 180))); } model.Transform = transform; return(Tuple.Create(model, finalDNA)); }
// Second design private static Model3DGroup GetModel_Second(WeaponAxeDNA dna, WeaponAxeDNA finalDNA, WeaponMaterialCache materials, bool hasBeard) { Model3DGroup retVal = new Model3DGroup(); var from = dna.KeyValues; var to = finalDNA.KeyValues; // Define the curves AxeSecondProps arg = GetModel_Second_Props(from, to, hasBeard); BezierSegment3D[][] segmentSets = GetModel_Second_Curves(arg); //TODO: Use WeaponMaterialCache MaterialGroup materialMiddle = new MaterialGroup(); materialMiddle.Children.Add(new DiffuseMaterial(new SolidColorBrush(Colors.DimGray))); Color derivedColor = UtilityWPF.AlphaBlend(Colors.DimGray, Colors.White, .8d); materialMiddle.Children.Add(new SpecularMaterial(new SolidColorBrush(Color.FromArgb(128, derivedColor.R, derivedColor.G, derivedColor.B)), 2d)); MaterialGroup materialEdge = new MaterialGroup(); materialEdge.Children.Add(new DiffuseMaterial(new SolidColorBrush(Colors.GhostWhite))); materialEdge.Children.Add(new SpecularMaterial(new SolidColorBrush(UtilityWPF.AlphaBlend(Colors.GhostWhite, Colors.White, .5d)), 5d)); #region Axe Blade (right) Model3D model = GetModel_Second_Axe(segmentSets, materialMiddle, materialEdge); double scale = dna.SizeSingle / (((arg.EndBL_2 ?? arg.EndBL_1).Y - arg.EndTL.Y) * 2); Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new TranslateTransform3D(-arg.EndTL.X, 0, 0)); transform.Children.Add(new ScaleTransform3D(scale, scale, scale)); model.Transform = transform; retVal.Children.Add(model); #endregion if (dna.Sides == WeaponAxeSides.Double) { #region Axe Blade (left) model = GetModel_Second_Axe(segmentSets, materialMiddle, materialEdge); transform = new Transform3DGroup(); transform.Children.Add(new TranslateTransform3D(-arg.EndTL.X, 0, 0)); transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 180))); transform.Children.Add(new ScaleTransform3D(scale, scale, scale)); model.Transform = transform; retVal.Children.Add(model); #endregion } Point3D topLeft = segmentSets[2][0].EndPoint0; Point3D bottomLeft = segmentSets[2][segmentSets[2].Length - 1].EndPoint1; double z = Math.Abs(segmentSets[0][0].EndPoint0.Z); if (dna.Sides == WeaponAxeSides.Single_BackSpike) { // Spike retVal.Children.Add(GetAxeSpike(z * .9, Math.Abs(topLeft.Y - bottomLeft.Y) * WeaponDNA.GetKeyValue("spikeLength", from, to, StaticRandom.NextDouble(.9, 1.4)), scale, -.2, materialMiddle, materialEdge)); } if (dna.Sides != WeaponAxeSides.Double) // double centerfilled is the only case that shouldn't have a collar { // Collar retVal.Children.Add(GetAxeCylinder(z * 1.33, Math.Abs(topLeft.Y - bottomLeft.Y) * 1.15, scale, -.2, materialMiddle)); } return(retVal); }
/// <summary> /// This returns a random axe, with some optional fixed values /// </summary> public static WeaponAxeDNA GetRandomDNA(double? sizeSingleSide = null, WeaponAxeType? axeType = null, WeaponAxeSides? sides = null, WeaponAxeStye? style = null) { WeaponAxeDNA retVal = new WeaponAxeDNA(); Random rand = StaticRandom.GetRandomForThread(); // Size if (sizeSingleSide != null) { retVal.SizeSingle = sizeSingleSide.Value; } else { retVal.SizeSingle = rand.NextDouble(.4, 1); } // AxeType if (axeType != null) { retVal.AxeType = axeType.Value; } else { retVal.AxeType = UtilityCore.GetRandomEnum<WeaponAxeType>(); } // Sides if (sides != null) { retVal.Sides = sides.Value; } else { retVal.Sides = UtilityCore.GetRandomEnum<WeaponAxeSides>(); } // Style if (style != null) { retVal.Style = style.Value; } else { retVal.Style = UtilityCore.GetRandomEnum<WeaponAxeStye>(); } return retVal; }
// Second design private static Model3DGroup GetModel_Second(WeaponAxeDNA dna, WeaponAxeDNA finalDNA, WeaponMaterialCache materials, bool hasBeard) { Model3DGroup retVal = new Model3DGroup(); var from = dna.KeyValues; var to = finalDNA.KeyValues; // Define the curves AxeSecondProps arg = GetModel_Second_Props(from, to, hasBeard); BezierSegment3D[][] segmentSets = GetModel_Second_Curves(arg); //TODO: Use WeaponMaterialCache MaterialGroup materialMiddle = new MaterialGroup(); materialMiddle.Children.Add(new DiffuseMaterial(new SolidColorBrush(Colors.DimGray))); Color derivedColor = UtilityWPF.AlphaBlend(Colors.DimGray, Colors.White, .8d); materialMiddle.Children.Add(new SpecularMaterial(new SolidColorBrush(Color.FromArgb(128, derivedColor.R, derivedColor.G, derivedColor.B)), 2d)); MaterialGroup materialEdge = new MaterialGroup(); materialEdge.Children.Add(new DiffuseMaterial(new SolidColorBrush(Colors.GhostWhite))); materialEdge.Children.Add(new SpecularMaterial(new SolidColorBrush(UtilityWPF.AlphaBlend(Colors.GhostWhite, Colors.White, .5d)), 5d)); #region Axe Blade (right) Model3D model = GetModel_Second_Axe(segmentSets, materialMiddle, materialEdge); double scale = dna.SizeSingle / (((arg.EndBL_2 ?? arg.EndBL_1).Y - arg.EndTL.Y) * 2); Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new TranslateTransform3D(-arg.EndTL.X, 0, 0)); transform.Children.Add(new ScaleTransform3D(scale, scale, scale)); model.Transform = transform; retVal.Children.Add(model); #endregion if (dna.Sides == WeaponAxeSides.Double) { #region Axe Blade (left) model = GetModel_Second_Axe(segmentSets, materialMiddle, materialEdge); transform = new Transform3DGroup(); transform.Children.Add(new TranslateTransform3D(-arg.EndTL.X, 0, 0)); transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 180))); transform.Children.Add(new ScaleTransform3D(scale, scale, scale)); model.Transform = transform; retVal.Children.Add(model); #endregion } Point3D topLeft = segmentSets[2][0].EndPoint0; Point3D bottomLeft = segmentSets[2][segmentSets[2].Length - 1].EndPoint1; double z = Math.Abs(segmentSets[0][0].EndPoint0.Z); if (dna.Sides == WeaponAxeSides.Single_BackSpike) { // Spike retVal.Children.Add(GetAxeSpike(z * .9, Math.Abs(topLeft.Y - bottomLeft.Y) * WeaponDNA.GetKeyValue("spikeLength", from, to, StaticRandom.NextDouble(.9, 1.4)), scale, -.2, materialMiddle, materialEdge)); } if (dna.Sides != WeaponAxeSides.Double) // double centerfilled is the only case that shouldn't have a collar { // Collar retVal.Children.Add(GetAxeCylinder(z * 1.33, Math.Abs(topLeft.Y - bottomLeft.Y) * 1.15, scale, -.2, materialMiddle)); } return retVal; }
private static Tuple<Model3DGroup, WeaponAxeDNA> GetModel(WeaponAxeDNA dna, WeaponMaterialCache materials, bool isLeftSide) { WeaponAxeDNA finalDNA = UtilityCore.Clone(dna); if (finalDNA.KeyValues == null) { finalDNA.KeyValues = new SortedList<string, double>(); } Model3DGroup model = null; switch (finalDNA.AxeType) { case WeaponAxeType.Symetrical: model = GetModel_Symetrical(dna, finalDNA, materials); break; case WeaponAxeType.Lumber: case WeaponAxeType.Bearded: model = GetModel_Second(dna, finalDNA, materials, finalDNA.AxeType == WeaponAxeType.Bearded); break; default: throw new ApplicationException("Unknown WeaponAxeType: " + finalDNA.AxeType.ToString()); } Transform3DGroup transform = new Transform3DGroup(); transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), 90))); if (isLeftSide) { transform.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 180))); } model.Transform = transform; return Tuple.Create(model, finalDNA); }
private void btnGenerateAxe_Click(object sender, RoutedEventArgs e) { try { _viewport.Children.RemoveAll(_visuals); string selectedItem = cboAxeType.SelectedItem as string; WeaponAxeType axeType; if (selectedItem == null || !Enum.TryParse(selectedItem, out axeType)) { MessageBox.Show("Unrecognized axe type", "CharacterStatsPanel", MessageBoxButton.OK, MessageBoxImage.Warning); return; } WeaponAxeSides sides; if(chkAxeDouble.IsChecked.Value) { sides = WeaponAxeSides.Double; } else if(StaticRandom.NextBool()) { sides = WeaponAxeSides.Single_BackSpike; } else { sides = WeaponAxeSides.Single_BackFlat; } WeaponAxeDNA dna = new WeaponAxeDNA() { SizeSingle = 1d, AxeType = axeType, Sides = sides, Style = WeaponAxeStye.Basic }; ModelVisual3D visual = new ModelVisual3D(); visual.Content = new WeaponAxe(new WeaponMaterialCache(), dna, true).Model; _visuals.Add(visual); _viewport.Children.Add(visual); } catch (Exception ex) { MessageBox.Show(ex.ToString(), "CharacterStatsPanel", MessageBoxButton.OK, MessageBoxImage.Error); } }