示例#1
0
        private static BezierSegment3D[] GetModel_Symetrical_Segments(Point3D[] endPoints, AxeSymetricalProps arg)
        {
            const int TOPLEFT     = 0;
            const int BOTTOMLEFT  = 1;
            const int TOPRIGHT    = 2;
            const int BOTTOMRIGHT = 3;

            // Edge
            Point3D         controlTR = BezierUtil.GetControlPoint_End(endPoints[TOPRIGHT], endPoints[BOTTOMRIGHT], endPoints[TOPLEFT], true, arg.edgeAngle, arg.edgePercent);
            Point3D         controlBR = BezierUtil.GetControlPoint_End(endPoints[BOTTOMRIGHT], endPoints[TOPRIGHT], endPoints[BOTTOMLEFT], true, arg.edgeAngle, arg.edgePercent);
            BezierSegment3D edge      = new BezierSegment3D(TOPRIGHT, BOTTOMRIGHT, new[] { controlTR, controlBR }, endPoints);

            // Bottom
            Point3D controlBL = BezierUtil.GetControlPoint_End(endPoints[BOTTOMLEFT], endPoints[BOTTOMRIGHT], endPoints[TOPRIGHT], arg.leftAway, arg.leftAngle, arg.leftPercent);

            controlBR = BezierUtil.GetControlPoint_End(endPoints[BOTTOMRIGHT], endPoints[BOTTOMLEFT], endPoints[TOPRIGHT], arg.rightAway, arg.rightAngle, arg.rightPercent);
            BezierSegment3D bottom = new BezierSegment3D(BOTTOMLEFT, BOTTOMRIGHT, new[] { controlBL, controlBR }, endPoints);

            // Top
            Point3D controlTL = BezierUtil.GetControlPoint_End(endPoints[TOPLEFT], endPoints[TOPRIGHT], endPoints[BOTTOMRIGHT], arg.leftAway, arg.leftAngle, arg.leftPercent);

            controlTR = BezierUtil.GetControlPoint_End(endPoints[TOPRIGHT], endPoints[TOPLEFT], endPoints[BOTTOMRIGHT], arg.rightAway, arg.rightAngle, arg.rightPercent);
            BezierSegment3D top = new BezierSegment3D(TOPLEFT, TOPRIGHT, new[] { controlTL, controlTR }, endPoints);

            return(new[] { bottom, top, edge });
        }
示例#2
0
        private static Model3D GetModel_Symetrical_Axe(BezierSegment3D[][] segmentSets, MaterialGroup materialMiddle, MaterialGroup materialEdge, AxeSymetricalProps arg)
        {
            Model3DGroup retVal = new Model3DGroup();

            int squareCount = 8;

            // 2 is z=0.  0,4 are z=max.  1,3 are intermediate z's

            AddBezierPlates(squareCount, segmentSets[0], segmentSets[1], retVal, materialMiddle);

            AddBezierPlates(squareCount, new[] { segmentSets[1][0], segmentSets[1][1] }, new[] { segmentSets[2][0], segmentSets[2][1] }, retVal, materialMiddle);
            AddBezierPlate(squareCount, segmentSets[1][2], segmentSets[2][2], retVal, materialEdge);

            AddBezierPlates(squareCount, new[] { segmentSets[2][0], segmentSets[2][1] }, new[] { segmentSets[3][0], segmentSets[3][1] }, retVal, materialMiddle);
            AddBezierPlate(squareCount, segmentSets[2][2], segmentSets[3][2], retVal, materialEdge);

            AddBezierPlates(squareCount, segmentSets[3], segmentSets[4], retVal, materialMiddle);

            // End cap plates
            if (arg.isCenterFilled)
            {
                for (int cntr = 0; cntr < 2; cntr++)
                {
                    int index = cntr == 0 ? 0 : 4;

                    AddBezierPlate(squareCount, segmentSets[index][0], segmentSets[index][1], retVal, materialMiddle);        // top - bottom

                    BezierSegment3D extraSeg = new BezierSegment3D(segmentSets[index][2].EndIndex0, segmentSets[index][2].EndIndex1, null, segmentSets[index][2].AllEndPoints);
                    AddBezierPlate(squareCount, extraSeg, segmentSets[index][2], retVal, materialMiddle);     // edge
                }
            }
            else
            {
                AddBezierPlates(squareCount, segmentSets[0], segmentSets[4], retVal, materialMiddle);
            }

            return(retVal);
        }
示例#3
0
        private static AxeSymetricalProps GetModel_Symetrical_Props(SortedList <string, double> from, SortedList <string, double> to)
        {
            AxeSymetricalProps retVal = new AxeSymetricalProps();

            Random rand = StaticRandom.GetRandomForThread();

            // Center Filled
            retVal.isCenterFilled = WeaponDNA.GetKeyValue_Bool("isCenterFilled", from, to, rand.NextBool());

            // Edge
            retVal.edgeAngle   = WeaponDNA.GetKeyValue("edgeAngle", from, to, rand.NextPercent(45, 1));
            retVal.edgePercent = WeaponDNA.GetKeyValue("edgePercent", from, to, rand.NextPercent(.33, .75));

            // Left
            retVal.leftAway = WeaponDNA.GetKeyValue_Bool("leftAway", from, to, rand.NextBool());

            if (retVal.leftAway)
            {
                retVal.leftAngle   = WeaponDNA.GetKeyValue("leftAngle", from, to, rand.NextDouble(0, 15));
                retVal.leftPercent = WeaponDNA.GetKeyValue("leftPercent", from, to, rand.NextPercent(.25, .5));
            }
            else
            {
                retVal.leftAngle   = WeaponDNA.GetKeyValue("leftAngle", from, to, rand.NextPercent(20, .5));
                retVal.leftPercent = WeaponDNA.GetKeyValue("leftPercent", from, to, rand.NextPercent(.25, .75));
            }

            // Right
            retVal.rightAway = retVal.leftAway ? true : WeaponDNA.GetKeyValue_Bool("rightAway", from, to, rand.NextBool());        // it looks like a vase when left is away, and right is toward

            if (retVal.rightAway)
            {
                retVal.rightAngle   = WeaponDNA.GetKeyValue("rightAngle", from, to, rand.NextDouble(0, 15));
                retVal.rightPercent = WeaponDNA.GetKeyValue("rightPercent", from, to, rand.NextPercent(.25, .5));
            }
            else
            {
                retVal.rightAngle   = WeaponDNA.GetKeyValue("rightAngle", from, to, rand.NextPercent(20, .75));
                retVal.rightPercent = WeaponDNA.GetKeyValue("rightPercent", from, to, rand.NextPercent(.25, .75));
            }

            // Points
            retVal.leftX = -WeaponDNA.GetKeyValue("leftX", from, to, rand.NextDouble(1, 3));
            if (retVal.leftAway)
            {
                retVal.leftY = WeaponDNA.GetKeyValue("leftY", from, to, rand.NextDouble(2, 2.5));
            }
            else
            {
                retVal.leftY = WeaponDNA.GetKeyValue("leftY", from, to, rand.NextDouble(1.25, 2.5));
            }

            retVal.rightX = 2;
            retVal.rightY = 3.4;

            // Z
            retVal.Scale1X = WeaponDNA.GetKeyValue("Scale1X", from, to, rand.NextDouble(.6, .8));
            retVal.Scale1Y = WeaponDNA.GetKeyValue("Scale1Y", from, to, rand.NextDouble(.8, .95));
            retVal.Z1      = WeaponDNA.GetKeyValue("Z1", from, to, rand.NextPercent(.2, .5));

            retVal.Scale2X = WeaponDNA.GetKeyValue("Scale2X", from, to, rand.NextPercent(.4, .25));
            retVal.Scale2Y = WeaponDNA.GetKeyValue("Scale2Y", from, to, rand.NextPercent(.4, .25));
            retVal.Z2L     = WeaponDNA.GetKeyValue("Z2L", from, to, rand.NextPercent(.55, .25));
            retVal.Z2R     = WeaponDNA.GetKeyValue("Z2R", from, to, rand.NextPercent(.33, .25));

            return(retVal);
        }
示例#4
0
        private static BezierSegment3D[][] GetModel_Symetrical_Curves(AxeSymetricalProps arg)
        {
            BezierSegment3D[][] retVal = new BezierSegment3D[5][];

            //TODO: Come up with a transform based on arg's extremes and dna.Scale
            Transform3D transform = Transform3D.Identity;

            for (int cntr = 0; cntr < 5; cntr++)
            {
                #region scale, z

                double zL, zR, scaleX, scaleY;

                switch (cntr)
                {
                case 0:
                case 4:
                    zL     = arg.Z2L;
                    zR     = arg.Z2R;
                    scaleX = arg.Scale2X;
                    scaleY = arg.Scale2Y;
                    break;

                case 1:
                case 3:
                    zL     = zR = arg.Z1;
                    scaleX = arg.Scale1X;
                    scaleY = arg.Scale1Y;
                    break;

                case 2:
                    zL     = zR = 0;
                    scaleX = scaleY = 1;
                    break;

                default:
                    throw new ApplicationException("Unknown cntr: " + cntr.ToString());
                }

                if (cntr < 2)
                {
                    zL *= -1d;
                    zR *= -1d;
                }

                #endregion

                Point3D[] endPoints = new[]
                {
                    new Point3D(arg.leftX, -arg.leftY * scaleY, zL),            // top left
                    new Point3D(arg.leftX, arg.leftY * scaleY, zL),             // bottom left
                    new Point3D(arg.rightX * scaleX, -arg.rightY * scaleY, zR), // top right
                    new Point3D(arg.rightX * scaleX, arg.rightY * scaleY, zR),  // bottom right
                }.Select(o => transform.Transform(o)).ToArray();

                BezierSegment3D[] segments = GetModel_Symetrical_Segments(endPoints, arg);
                retVal[cntr] = segments;
            }

            return(retVal);
        }
示例#5
0
        // Symetrical
        private static Model3DGroup GetModel_Symetrical(WeaponAxeDNA dna, WeaponAxeDNA finalDNA, WeaponMaterialCache materials)
        {
            Model3DGroup retVal = new Model3DGroup();
            var          from   = dna.KeyValues;
            var          to     = finalDNA.KeyValues;

            // Define the curves
            AxeSymetricalProps arg = GetModel_Symetrical_Props(from, to);

            BezierSegment3D[][] segmentSets = GetModel_Symetrical_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_Symetrical_Axe(segmentSets, materialMiddle, materialEdge, arg);

            double scale = dna.SizeSingle / (arg.leftY * 2d);

            Transform3DGroup transform = new Transform3DGroup();
            transform.Children.Add(new TranslateTransform3D(-arg.leftX, 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_Symetrical_Axe(segmentSets, materialMiddle, materialEdge, arg);

                transform = new Transform3DGroup();
                transform.Children.Add(new TranslateTransform3D(-arg.leftX, 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][1].EndPoint0;
            double  z          = Math.Abs(segmentSets[0][0].EndPoint0.Z);

            if (dna.Sides == WeaponAxeSides.Single_BackSpike)
            {
                // Spike
                retVal.Children.Add(GetAxeSpike(z * 1.1, Math.Abs(topLeft.Y - bottomLeft.Y) * WeaponDNA.GetKeyValue("spikeLength", from, to, StaticRandom.NextDouble(.7, 1.1)), scale, 0, materialMiddle, materialEdge));
            }

            if (!(dna.Sides == WeaponAxeSides.Double && arg.isCenterFilled))     // 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, 0, materialMiddle));
            }

            return(retVal);
        }
示例#6
0
        private static Model3D GetModel_Symetrical_Axe(BezierSegment3D[][] segmentSets, MaterialGroup materialMiddle, MaterialGroup materialEdge, AxeSymetricalProps arg)
        {
            Model3DGroup retVal = new Model3DGroup();

            int squareCount = 8;

            // 2 is z=0.  0,4 are z=max.  1,3 are intermediate z's

            AddBezierPlates(squareCount, segmentSets[0], segmentSets[1], retVal, materialMiddle);

            AddBezierPlates(squareCount, new[] { segmentSets[1][0], segmentSets[1][1] }, new[] { segmentSets[2][0], segmentSets[2][1] }, retVal, materialMiddle);
            AddBezierPlate(squareCount, segmentSets[1][2], segmentSets[2][2], retVal, materialEdge);

            AddBezierPlates(squareCount, new[] { segmentSets[2][0], segmentSets[2][1] }, new[] { segmentSets[3][0], segmentSets[3][1] }, retVal, materialMiddle);
            AddBezierPlate(squareCount, segmentSets[2][2], segmentSets[3][2], retVal, materialEdge);

            AddBezierPlates(squareCount, segmentSets[3], segmentSets[4], retVal, materialMiddle);

            // End cap plates
            if (arg.isCenterFilled)
            {
                for (int cntr = 0; cntr < 2; cntr++)
                {
                    int index = cntr == 0 ? 0 : 4;

                    AddBezierPlate(squareCount, segmentSets[index][0], segmentSets[index][1], retVal, materialMiddle);        // top - bottom

                    BezierSegment3D extraSeg = new BezierSegment3D(segmentSets[index][2].EndIndex0, segmentSets[index][2].EndIndex1, null, segmentSets[index][2].AllEndPoints);
                    AddBezierPlate(squareCount, extraSeg, segmentSets[index][2], retVal, materialMiddle);     // edge
                }
            }
            else
            {
                AddBezierPlates(squareCount, segmentSets[0], segmentSets[4], retVal, materialMiddle);
            }

            return retVal;
        }
示例#7
0
        private static BezierSegment3D[] GetModel_Symetrical_Segments(Point3D[] endPoints, AxeSymetricalProps arg)
        {
            const int TOPLEFT = 0;
            const int BOTTOMLEFT = 1;
            const int TOPRIGHT = 2;
            const int BOTTOMRIGHT = 3;

            // Edge
            Point3D controlTR = BezierUtil.GetControlPoint_End(endPoints[TOPRIGHT], endPoints[BOTTOMRIGHT], endPoints[TOPLEFT], true, arg.edgeAngle, arg.edgePercent);
            Point3D controlBR = BezierUtil.GetControlPoint_End(endPoints[BOTTOMRIGHT], endPoints[TOPRIGHT], endPoints[BOTTOMLEFT], true, arg.edgeAngle, arg.edgePercent);
            BezierSegment3D edge = new BezierSegment3D(TOPRIGHT, BOTTOMRIGHT, new[] { controlTR, controlBR }, endPoints);

            // Bottom
            Point3D controlBL = BezierUtil.GetControlPoint_End(endPoints[BOTTOMLEFT], endPoints[BOTTOMRIGHT], endPoints[TOPRIGHT], arg.leftAway, arg.leftAngle, arg.leftPercent);
            controlBR = BezierUtil.GetControlPoint_End(endPoints[BOTTOMRIGHT], endPoints[BOTTOMLEFT], endPoints[TOPRIGHT], arg.rightAway, arg.rightAngle, arg.rightPercent);
            BezierSegment3D bottom = new BezierSegment3D(BOTTOMLEFT, BOTTOMRIGHT, new[] { controlBL, controlBR }, endPoints);

            // Top
            Point3D controlTL = BezierUtil.GetControlPoint_End(endPoints[TOPLEFT], endPoints[TOPRIGHT], endPoints[BOTTOMRIGHT], arg.leftAway, arg.leftAngle, arg.leftPercent);
            controlTR = BezierUtil.GetControlPoint_End(endPoints[TOPRIGHT], endPoints[TOPLEFT], endPoints[BOTTOMRIGHT], arg.rightAway, arg.rightAngle, arg.rightPercent);
            BezierSegment3D top = new BezierSegment3D(TOPLEFT, TOPRIGHT, new[] { controlTL, controlTR }, endPoints);

            return new[] { bottom, top, edge };
        }
示例#8
0
        private static BezierSegment3D[][] GetModel_Symetrical_Curves(AxeSymetricalProps arg)
        {
            BezierSegment3D[][] retVal = new BezierSegment3D[5][];

            //TODO: Come up with a transform based on arg's extremes and dna.Scale
            Transform3D transform = Transform3D.Identity;

            for (int cntr = 0; cntr < 5; cntr++)
            {
                #region scale, z

                double zL, zR, scaleX, scaleY;

                switch (cntr)
                {
                    case 0:
                    case 4:
                        zL = arg.Z2L;
                        zR = arg.Z2R;
                        scaleX = arg.Scale2X;
                        scaleY = arg.Scale2Y;
                        break;

                    case 1:
                    case 3:
                        zL = zR = arg.Z1;
                        scaleX = arg.Scale1X;
                        scaleY = arg.Scale1Y;
                        break;

                    case 2:
                        zL = zR = 0;
                        scaleX = scaleY = 1;
                        break;

                    default:
                        throw new ApplicationException("Unknown cntr: " + cntr.ToString());
                }

                if (cntr < 2)
                {
                    zL *= -1d;
                    zR *= -1d;
                }

                #endregion

                Point3D[] endPoints = new[]
                    {
                        new Point3D(arg.leftX, -arg.leftY * scaleY, zL),     // top left
                        new Point3D(arg.leftX, arg.leftY * scaleY, zL),     // bottom left
                        new Point3D(arg.rightX * scaleX, -arg.rightY * scaleY, zR),       // top right
                        new Point3D(arg.rightX * scaleX, arg.rightY * scaleY, zR),        // bottom right
                    }.Select(o => transform.Transform(o)).ToArray();

                BezierSegment3D[] segments = GetModel_Symetrical_Segments(endPoints, arg);
                retVal[cntr] = segments;
            }

            return retVal;
        }
示例#9
0
        private static AxeSymetricalProps GetModel_Symetrical_Props(SortedList<string, double> from, SortedList<string, double> to)
        {
            AxeSymetricalProps retVal = new AxeSymetricalProps();

            Random rand = StaticRandom.GetRandomForThread();

            // Center Filled
            retVal.isCenterFilled = WeaponDNA.GetKeyValue_Bool("isCenterFilled", from, to, rand.NextBool());

            // Edge
            retVal.edgeAngle = WeaponDNA.GetKeyValue("edgeAngle", from, to, rand.NextPercent(45, 1));
            retVal.edgePercent = WeaponDNA.GetKeyValue("edgePercent", from, to, rand.NextPercent(.33, .75));

            // Left
            retVal.leftAway = WeaponDNA.GetKeyValue_Bool("leftAway", from, to, rand.NextBool());

            if (retVal.leftAway)
            {
                retVal.leftAngle = WeaponDNA.GetKeyValue("leftAngle", from, to, rand.NextDouble(0, 15));
                retVal.leftPercent = WeaponDNA.GetKeyValue("leftPercent", from, to, rand.NextPercent(.25, .5));
            }
            else
            {
                retVal.leftAngle = WeaponDNA.GetKeyValue("leftAngle", from, to, rand.NextPercent(20, .5));
                retVal.leftPercent = WeaponDNA.GetKeyValue("leftPercent", from, to, rand.NextPercent(.25, .75));
            }

            // Right
            retVal.rightAway = retVal.leftAway ? true : WeaponDNA.GetKeyValue_Bool("rightAway", from, to, rand.NextBool());        // it looks like a vase when left is away, and right is toward

            if (retVal.rightAway)
            {
                retVal.rightAngle = WeaponDNA.GetKeyValue("rightAngle", from, to, rand.NextDouble(0, 15));
                retVal.rightPercent = WeaponDNA.GetKeyValue("rightPercent", from, to, rand.NextPercent(.25, .5));
            }
            else
            {
                retVal.rightAngle = WeaponDNA.GetKeyValue("rightAngle", from, to, rand.NextPercent(20, .75));
                retVal.rightPercent = WeaponDNA.GetKeyValue("rightPercent", from, to, rand.NextPercent(.25, .75));
            }

            // Points
            retVal.leftX = -WeaponDNA.GetKeyValue("leftX", from, to, rand.NextDouble(1, 3));
            if (retVal.leftAway)
            {
                retVal.leftY = WeaponDNA.GetKeyValue("leftY", from, to, rand.NextDouble(2, 2.5));
            }
            else
            {
                retVal.leftY = WeaponDNA.GetKeyValue("leftY", from, to, rand.NextDouble(1.25, 2.5));
            }

            retVal.rightX = 2;
            retVal.rightY = 3.4;

            // Z
            retVal.Scale1X = WeaponDNA.GetKeyValue("Scale1X", from, to, rand.NextDouble(.6, .8));
            retVal.Scale1Y = WeaponDNA.GetKeyValue("Scale1Y", from, to, rand.NextDouble(.8, .95));
            retVal.Z1 = WeaponDNA.GetKeyValue("Z1", from, to, rand.NextPercent(.2, .5));

            retVal.Scale2X = WeaponDNA.GetKeyValue("Scale2X", from, to, rand.NextPercent(.4, .25));
            retVal.Scale2Y = WeaponDNA.GetKeyValue("Scale2Y", from, to, rand.NextPercent(.4, .25));
            retVal.Z2L = WeaponDNA.GetKeyValue("Z2L", from, to, rand.NextPercent(.55, .25));
            retVal.Z2R = WeaponDNA.GetKeyValue("Z2R", from, to, rand.NextPercent(.33, .25));

            return retVal;
        }