private static void Middle_TubeHard(ref int pointOffset, ref double[] rotateAnglesForPerp, MeshGeometry3D geometry, Transform3D transform, int numSides, TubeRingRegularPolygon ring1, TubeRingRegularPolygon ring2, double curZ) { Point[] points = Math2D.GetCircle_Cached(numSides); int zOffset = pointOffset; for (int cntr = 0; cntr < numSides - 1; cntr++) { // Top/Left triangle (each triangle gets its own 3 points) geometry.Positions.Add(transform.Transform(new Point3D(points[cntr].X * ring1.RadiusX, points[cntr].Y * ring1.RadiusY, curZ))); geometry.Positions.Add(transform.Transform(new Point3D(points[cntr + 1].X * ring2.RadiusX, points[cntr + 1].Y * ring2.RadiusY, curZ + ring2.DistFromPrevRing))); geometry.Positions.Add(transform.Transform(new Point3D(points[cntr].X * ring2.RadiusX, points[cntr].Y * ring2.RadiusY, curZ + ring2.DistFromPrevRing))); Vector3D normal = GetNormal(geometry.Positions[zOffset + 0], geometry.Positions[zOffset + 1], geometry.Positions[zOffset + 2]); geometry.Normals.Add(normal); // the normals point straight out of the face geometry.Normals.Add(normal); geometry.Normals.Add(normal); geometry.TriangleIndices.Add(zOffset + 0); geometry.TriangleIndices.Add(zOffset + 1); geometry.TriangleIndices.Add(zOffset + 2); zOffset += 3; // Bottom/Right triangle geometry.Positions.Add(transform.Transform(new Point3D(points[cntr].X * ring1.RadiusX, points[cntr].Y * ring1.RadiusY, curZ))); geometry.Positions.Add(transform.Transform(new Point3D(points[cntr + 1].X * ring1.RadiusX, points[cntr + 1].Y * ring1.RadiusY, curZ))); geometry.Positions.Add(transform.Transform(new Point3D(points[cntr + 1].X * ring2.RadiusX, points[cntr + 1].Y * ring2.RadiusY, curZ + ring2.DistFromPrevRing))); normal = GetNormal(geometry.Positions[zOffset + 0], geometry.Positions[zOffset + 1], geometry.Positions[zOffset + 2]); geometry.Normals.Add(normal); // the normals point straight out of the face geometry.Normals.Add(normal); geometry.Normals.Add(normal); geometry.TriangleIndices.Add(zOffset + 0); geometry.TriangleIndices.Add(zOffset + 1); geometry.TriangleIndices.Add(zOffset + 2); zOffset += 3; } // Connecting the last 2 points to the first 2 // Top/Left triangle geometry.Positions.Add(transform.Transform(new Point3D(points[numSides - 1].X * ring1.RadiusX, points[numSides - 1].Y * ring1.RadiusY, curZ))); geometry.Positions.Add(transform.Transform(new Point3D(points[0].X * ring2.RadiusX, points[0].Y * ring2.RadiusY, curZ + ring2.DistFromPrevRing))); geometry.Positions.Add(transform.Transform(new Point3D(points[numSides - 1].X * ring2.RadiusX, points[numSides - 1].Y * ring2.RadiusY, curZ + ring2.DistFromPrevRing))); Vector3D normal2 = GetNormal(geometry.Positions[zOffset + 0], geometry.Positions[zOffset + 1], geometry.Positions[zOffset + 2]); geometry.Normals.Add(normal2); // the normals point straight out of the face geometry.Normals.Add(normal2); geometry.Normals.Add(normal2); geometry.TriangleIndices.Add(zOffset + 0); geometry.TriangleIndices.Add(zOffset + 1); geometry.TriangleIndices.Add(zOffset + 2); zOffset += 3; // Bottom/Right triangle geometry.Positions.Add(transform.Transform(new Point3D(points[numSides - 1].X * ring1.RadiusX, points[numSides - 1].Y * ring1.RadiusY, curZ))); geometry.Positions.Add(transform.Transform(new Point3D(points[0].X * ring1.RadiusX, points[0].Y * ring1.RadiusY, curZ))); geometry.Positions.Add(transform.Transform(new Point3D(points[0].X * ring2.RadiusX, points[0].Y * ring2.RadiusY, curZ + ring2.DistFromPrevRing))); normal2 = GetNormal(geometry.Positions[zOffset + 0], geometry.Positions[zOffset + 1], geometry.Positions[zOffset + 2]); geometry.Normals.Add(normal2); // the normals point straight out of the face geometry.Normals.Add(normal2); geometry.Normals.Add(normal2); geometry.TriangleIndices.Add(zOffset + 0); geometry.TriangleIndices.Add(zOffset + 1); geometry.TriangleIndices.Add(zOffset + 2); // Update ref param pointOffset = geometry.Positions.Count; }
private static Point[] GetPointsRegPoly(int numSides, TubeRingRegularPolygon ring) { // Multiply the returned unit circle by the ring's radius return Math2D.GetCircle_Cached(numSides).Select(o => new Point(ring.RadiusX * o.X, ring.RadiusY * o.Y)).ToArray(); }
private static void Middle_TubeSoft(ref int pointOffset, ref double[] rotateAnglesForPerp, MeshGeometry3D geometry, Transform3D transform, int numSides, TubeRingRegularPolygon ring1, TubeRingRegularPolygon ring2, double curZ) { if (ring1.MergeNormalWithPrevIfSoft || ring2.MergeNormalWithPrevIfSoft) { throw new ApplicationException("finish this"); } Point[] points = Math2D.GetCircle_Cached(numSides); #region Points/Normals //TODO: Don't add the bottom ring's points, only the top // Ring 1 for (int cntr = 0; cntr < numSides; cntr++) { geometry.Positions.Add(transform.Transform(new Point3D(points[cntr].X * ring1.RadiusX, points[cntr].Y * ring1.RadiusY, curZ))); geometry.Normals.Add(transform.Transform(new Vector3D(points[cntr].X * ring1.RadiusX, points[cntr].Y * ring1.RadiusY, 0d).ToUnit())); // the normals point straight out of the side } // Ring 2 for (int cntr = 0; cntr < numSides; cntr++) { geometry.Positions.Add(transform.Transform(new Point3D(points[cntr].X * ring2.RadiusX, points[cntr].Y * ring2.RadiusY, curZ + ring2.DistFromPrevRing))); geometry.Normals.Add(transform.Transform(new Vector3D(points[cntr].X * ring2.RadiusX, points[cntr].Y * ring2.RadiusY, 0d).ToUnit())); // the normals point straight out of the side } #endregion #region Triangles int zOffsetBottom = pointOffset; int zOffsetTop = zOffsetBottom + numSides; for (int cntr = 0; cntr < numSides - 1; cntr++) { // Top/Left triangle geometry.TriangleIndices.Add(zOffsetBottom + cntr + 0); geometry.TriangleIndices.Add(zOffsetTop + cntr + 1); geometry.TriangleIndices.Add(zOffsetTop + cntr + 0); // Bottom/Right triangle geometry.TriangleIndices.Add(zOffsetBottom + cntr + 0); geometry.TriangleIndices.Add(zOffsetBottom + cntr + 1); geometry.TriangleIndices.Add(zOffsetTop + cntr + 1); } // Connecting the last 2 points to the first 2 // Top/Left triangle geometry.TriangleIndices.Add(zOffsetBottom + (numSides - 1) + 0); geometry.TriangleIndices.Add(zOffsetTop); // wrapping back around geometry.TriangleIndices.Add(zOffsetTop + (numSides - 1) + 0); // Bottom/Right triangle geometry.TriangleIndices.Add(zOffsetBottom + (numSides - 1) + 0); geometry.TriangleIndices.Add(zOffsetBottom); geometry.TriangleIndices.Add(zOffsetTop); #endregion pointOffset = geometry.Positions.Count; }
private void RebuildCustom() { try { pnlCustomError.Visibility = Visibility.Collapsed; #region Fix the row numbers for (int cntr = 0; cntr < _customRows.Count; cntr++) { ((TextBlock)_customRows[cntr].Item2.Children[0]).Text = (cntr + 1).ToString(); } txtCustomInsertIndex.Text = (_customRows.Count + 1).ToString(); #endregion List<TubeRingBase> rings = new List<TubeRingBase>(); #region Parse the rows for (int cntr = 0; cntr < _customRows.Count; cntr++) { StackPanel panel = _customRows[cntr].Item2; // Distance double distance = double.Parse(((TextBox)panel.Children[2]).Text); switch (_customRows[cntr].Item1) { case "Poly": TubeRingRegularPolygon poly = new TubeRingRegularPolygon(distance, false, double.Parse(((TextBox)panel.Children[4]).Text), double.Parse(((TextBox)panel.Children[6]).Text), ((CheckBox)panel.Children[7]).IsChecked.Value); rings.Add(poly); break; case "Point": TubeRingPoint point = new TubeRingPoint(distance, false); rings.Add(point); break; case "Dome": TubeRingDome dome = new TubeRingDome(distance, false, int.Parse(((TextBox)panel.Children[4]).Text)); rings.Add(dome); break; default: throw new ApplicationException("Unknown type: " + _customRows[cntr].Item1); } } #endregion MeshGeometry3D mesh = UtilityWPF.GetMultiRingedTube(int.Parse(txtNumSides.Text), rings, chkSoftSides.IsChecked.Value, true); // Material MaterialGroup material = new MaterialGroup(); Color color = UtilityWPF.ColorFromHex(txtDiffuse.Text); material.Children.Add(new DiffuseMaterial(new SolidColorBrush(color))); if (chkSpecular.IsChecked.Value) { color = UtilityWPF.ColorFromHex(txtSpecular.Text); double power = double.Parse(txtSpecularPower.Text); material.Children.Add(new SpecularMaterial(new SolidColorBrush(color), power)); } if (chkEmissive.IsChecked.Value) { color = UtilityWPF.ColorFromHex(txtEmissive.Text); material.Children.Add(new EmissiveMaterial(new SolidColorBrush(color))); } // Geometry Model GeometryModel3D geometry = new GeometryModel3D(); geometry.Material = material; geometry.BackMaterial = material; geometry.Geometry = mesh; // Model Visual ModelVisual3D visual = new ModelVisual3D(); visual.Content = geometry; // Store it SetCurrentVisual(visual); } catch (Exception ex) { pnlCustomError.Visibility = Visibility.Visible; lblCustomError.Text = ex.Message; } }