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 }); }
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); }
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); }
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); }
// 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); }
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; }
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 }; }
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; }
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; }