Esempio n. 1
0
        public WeaponAxe(WeaponMaterialCache materials, WeaponAxeDNA dna, bool isLeftSide)
        {
            _materials = materials;

            var model = GetModel(dna, materials, isLeftSide);

            this.Model = model.Item1;
            this.DNA   = model.Item2;
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        // 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);
        }
Esempio n. 5
0
        /// <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;
        }
Esempio n. 6
0
        // 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;
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        public WeaponAxe(WeaponMaterialCache materials, WeaponAxeDNA dna, bool isLeftSide)
        {
            _materials = materials;

            var model = GetModel(dna, materials, isLeftSide);

            this.Model = model.Item1;
            this.DNA = model.Item2;
        }
        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);
            }
        }