public static MeshPrimitive GetCircularTabMesh(Point p0, Point p1, Direction normal, double angle, bool isMale) { Circle circle = GetCircularTabCircle(p0, p1, normal, angle, isMale); double centerParam = Math.PI / 2; if (!isMale) { angle *= -1; centerParam += Math.PI; } ITrimmedCurve circleSegment = CurveSegment.Create(circle, Interval.Create(centerParam - angle / 2, centerParam + angle / 2)); IList <Point> points = circleSegment.GetPolyline(); Debug.Assert(points.Count > 3, "Not enough points for tab faceting."); var facets = new List <Facet>(); for (int i = 1; i < points.Count - 1; i++) { facets.Add(new Facet(0, i, i + 1)); } return(MeshPrimitive.Create(points, normal, facets)); }
public override void GenerateGeometry(string scenePath, List <PrimitiveBase> output) { var fileInfo = new System.IO.FileInfo(scenePath); string p = System.IO.Path.Combine(fileInfo.DirectoryName, Path); //List<Mesh> meshes = null; Mesh[] meshArray = null; if (meshes.ContainsKey(p)) { meshArray = meshes[p]; } else { meshArray = Mesh.CreateFromFile(p); if (meshArray != null) { meshes[p] = meshArray; } } if (meshArray != null) { for (int i = 0; i < meshArray.Length; i++) { MeshPrimitive meshprimitive = MeshPrimitive.Create(); meshprimitive.position = Position; meshprimitive.euler = Euler; meshprimitive.scale = Scale; meshprimitive.mesh = meshArray[i]; meshprimitive.material = shaders[0]; output.Add(meshprimitive); } } }
public static Graphic GetGraphic(double p, double q, double circleAngle, Vector inverseOffset) { var graphics = new List <Graphic>(); int bandCount = 2; int iSteps = bandCount * 32; //32 int jSteps = 34; //34 double uStep = 2 * Math.PI / iSteps; double vStep = 2 * Math.PI / jSteps; bool uSwap = false, vSwap = false; for (int j = 0; j < jSteps; j++) { double v = 2 * Math.PI * j / jSteps; for (int i = 0; i < iSteps; i++) { double u = 2 * Math.PI * i / iSteps; Direction n00, n10, n11, n01; Point p00 = Lawson.Evaluate(PointUV.Create(u, v), p, q, circleAngle, inverseOffset, true, out n00); Point p10 = Lawson.Evaluate(PointUV.Create(u + uStep, v), p, q, circleAngle, inverseOffset, true, out n10); Point p11 = Lawson.Evaluate(PointUV.Create(u + uStep, v + vStep), p, q, circleAngle, inverseOffset, true, out n11); Point p01 = Lawson.Evaluate(PointUV.Create(u, v + vStep), p, q, circleAngle, inverseOffset, true, out n01); var facetVertices = new List <FacetVertex>(); facetVertices.Add(new FacetVertex(p00, n00)); facetVertices.Add(new FacetVertex(p10, n10)); facetVertices.Add(new FacetVertex(p11, n11)); facetVertices.Add(new FacetVertex(p01, n01)); var facets = new List <Facet>(); facets.Add(new Facet(0, 1, 2)); facets.Add(new Facet(0, 2, 3)); HSBColor hsbFill = new HSBColor(Window.ActiveWindow.ActiveLayer.GetColor(null)); hsbFill.H = (float)(u / 2 / Math.PI * 360); hsbFill.A = vSwap ? 127 : 255; HSBColor hsbLine = new HSBColor(System.Drawing.Color.MidnightBlue); hsbLine.H = (float)(u / 2 / Math.PI * 360); var style = new GraphicStyle { EnableDepthBuffer = true, LineColor = hsbLine.Color, LineWidth = 1, FillColor = hsbFill.Color }; graphics.Add(Graphic.Create(style, MeshPrimitive.Create(facetVertices, facets))); uSwap = !uSwap; } vSwap = !vSwap; } return(Graphic.Create(null, null, graphics)); }
public static Graphic GetGraphic() { var graphics = new List <Graphic>(); int iSteps = 64; //32 int jSteps = 64; //34 double uStep = (double)1 / iSteps; double vStep = (double)2 * Math.PI / jSteps; bool uSwap = false, vSwap = false; for (int i = 0; i < iSteps; i++) { double u = (double)i * uStep; for (int j = 0; j < jSteps; j++) { double v = (double)j * vStep; Direction n00, n10, n11, n01; Point p00 = BoySurface.Evaluate(Complex.CreatePolar(u, v), out n00); Point p10 = BoySurface.Evaluate(Complex.CreatePolar(u + uStep, v), out n10); Point p11 = BoySurface.Evaluate(Complex.CreatePolar(u + uStep, v + vStep), out n11); Point p01 = BoySurface.Evaluate(Complex.CreatePolar(u, v + vStep), out n01); var facetVertices = new List <FacetVertex>(); facetVertices.Add(new FacetVertex(p00, n00)); facetVertices.Add(new FacetVertex(p10, n10)); facetVertices.Add(new FacetVertex(p11, n11)); facetVertices.Add(new FacetVertex(p01, n01)); var facets = new List <Facet>(); facets.Add(new Facet(0, 1, 2)); facets.Add(new Facet(0, 2, 3)); HSBColor hsbFill = new HSBColor(Window.ActiveWindow.ActiveLayer.GetColor(null)); hsbFill.H = (float)(u / 2 / Math.PI * 360); hsbFill.A = vSwap ? 127 : 255; HSBColor hsbLine = new HSBColor(System.Drawing.Color.MidnightBlue); hsbLine.H = (float)(u / 2 / Math.PI * 360); var style = new GraphicStyle { EnableDepthBuffer = true, LineColor = hsbLine.Color, LineWidth = 1, FillColor = hsbFill.Color }; graphics.Add(Graphic.Create(style, MeshPrimitive.Create(facetVertices, facets))); vSwap = !vSwap; } uSwap = !uSwap; } return(Graphic.Create(null, null, graphics)); }
public static Graphic GetGraphics(Point[] positions, double radius) { var meshPrimitive = MeshPrimitive.Create(facetVertices, facets); var graphics = new Graphic[positions.Length]; for (int i = 0; i < positions.Length; i++) { graphics[i] = Graphic.Create(null, new[] { meshPrimitive }, null, Matrix.CreateTranslation(positions[i].Vector) * Matrix.CreateScale(radius) ); } return(Graphic.Create(null, null, graphics)); }
public static ICollection <Primitive> GetMesh(this Body body, double surfaceDeviation, double angleDeviation) { IDictionary <Face, FaceTessellation> tessellationMap = body.GetTessellation(null, FacetSense.RightHanded, new TessellationOptions(surfaceDeviation, angleDeviation)); var primitives = new List <Primitive>(); foreach (FaceTessellation faceTessellation in tessellationMap.Values) { var facets = new List <Facet>(); foreach (FacetStrip facetStrip in faceTessellation.FacetStrips) { facets.AddRange(facetStrip.Facets); } primitives.Add(MeshPrimitive.Create(faceTessellation.Vertices, facets)); } return(primitives); }
//private Point GetFivePointNurbsAverage(int[,] indices) { // var knots = new Knot[] { // new Knot(0, 4), // new Knot(1, 4) // }; // var controlPoints = new ControlPoint[] { // new ControlPoint(Point.Create(tabAngles[indices[0,0]][indices[0,1]], GetSpanAt(indices[0,0], indices[0,1]),0), 1), // new ControlPoint(Point.Create(tabAngles[indices[1,0]][indices[1,1]], GetSpanAt(indices[1,0], indices[1,1]),0), 1), // new ControlPoint(Point.Create(tabAngles[indices[2,0]][indices[2,1]], GetSpanAt(indices[2,0], indices[2,1]),0), 1), // new ControlPoint(Point.Create(tabAngles[indices[3,0]][indices[3,1]], GetSpanAt(indices[3,0], indices[3,1]),0), 1), // new ControlPoint(Point.Create(tabAngles[indices[4,0]][indices[4,1]], GetSpanAt(indices[4,0], indices[4,1]),0), 1) // }; // NurbsData data = new NurbsData(5, false, false, knots); // NurbsCurve curve = NurbsCurve.CreateFromControlPoints(data, controlPoints); // Point midpoint = curve.Evaluate(0.5).Point; // return midpoint; //} //private Circle GetTabFromPoints(bool swap, int i, int j, int iOther) { // Point p0 = points[i,j]; // Point p1 = points[i,j + 1]; // Point pn = (new Point[] { points[iOther,j], points[iOther,j + 1] }).Average(); // Direction normal = Vector.Cross(p0 - pn, p1 - pn).Direction; // return Tabs.GetCircularTabCircle(p0, p1, normal, tabAngles[i,j], swap); //} //private double GetSpanAt(int i, int j) { // return (vParameters[i][j + 1] - vParameters[i][j] + Math.PI * 2) % (Math.PI * 2); //} public Graphic GetGraphic() { var graphics = new List <Graphic>(); int iSteps = points.GetLength(0); int jSteps = points.GetLength(1); bool swap = false; for (int i = 0; i < iSteps - 1; i++) { var facetVertices = new List <FacetVertex>(); var facets = new List <Facet>(); var tabMeshes = new List <MeshPrimitive>(); var porcupineCurves = new List <CurvePrimitive>(); for (int j = 0; j < jSteps - 1; j++) { int facetOffset = facetVertices.Count; // Main ring Point p00 = points[i, j]; Point p01 = points[i, j + 1]; Point p10 = points[i + 1, j]; Point p11 = points[i + 1, j + 1]; Vector n0 = Vector.Cross(p00 - p01, p00 - p10); Vector n1 = Vector.Cross(p11 - p10, p11 - p01); Direction n = (n0 + n1).Direction; facetVertices.Add(new FacetVertex(p00, n)); facetVertices.Add(new FacetVertex(p01, n)); facetVertices.Add(new FacetVertex(p10, n)); facetVertices.Add(new FacetVertex(p11, n)); if ((p00 - p11).Magnitude < (p10 - p01).Magnitude) { facets.Add(new Facet(0 + facetOffset, 1 + facetOffset, 3 + facetOffset)); facets.Add(new Facet(0 + facetOffset, 3 + facetOffset, 2 + facetOffset)); } else { facets.Add(new Facet(0 + facetOffset, 2 + facetOffset, 1 + facetOffset)); facets.Add(new Facet(1 + facetOffset, 3 + facetOffset, 2 + facetOffset)); } tabMeshes.Add(MeshPrimitive.Create(facetVertices, facets)); Point basePoint = points[i, j]; Point endPoint = basePoint + Gradient(basePoint) / 10; if (basePoint != endPoint) { porcupineCurves.Add(CurvePrimitive.Create(CurveSegment.Create(basePoint, endPoint))); } swap = !swap; } HSBColor hsbFill = new HSBColor(255, (float)i / iSteps * 360, 122, 88); HSBColor hsbLine = new HSBColor(System.Drawing.Color.MidnightBlue); hsbLine.H = (float)i / iSteps * 360; var style = new GraphicStyle { EnableDepthBuffer = true, LineColor = hsbLine.Color, LineWidth = 1, FillColor = hsbFill.Color, EnableCulling = false }; // graphics.Add(Graphic.Create(style, MeshPrimitive.Create(facetVertices, facets))); foreach (MeshPrimitive mesh in tabMeshes) { graphics.Add(Graphic.Create(style, mesh)); } foreach (CurvePrimitive curve in porcupineCurves) { graphics.Add(Graphic.Create(style, curve)); } } return(Graphic.Create(null, null, graphics)); }
public MeshPrimitive GetPrimitive() { int revolveSteps = 24; var profileFacetVertices = new List <FacetVertex>(); Direction perpendicular = Direction.DirY; CurveSegment[] curveSegments = GetProfile().ToArray(); foreach (CurveSegment curveSegement in curveSegments) { if (curveSegement.Geometry is Circle) { int steps = (int)(curveSegement.Bounds.Span / Const.Tau * (revolveSteps + 1)); for (int i = 0; i < steps; i++) { double t = curveSegement.Bounds.Start + curveSegement.Bounds.Span * i / steps; var eval = curveSegement.Geometry.Evaluate(t); profileFacetVertices.Add(new FacetVertex( eval.Point, -Direction.Cross(eval.Tangent, perpendicular) )); } continue; } if (curveSegement.Geometry is Line) { profileFacetVertices.Add(new FacetVertex( curveSegement.StartPoint, -Direction.Cross(((Line)curveSegement.Geometry).Direction, perpendicular) )); profileFacetVertices.Add(new FacetVertex( curveSegement.EndPoint, -Direction.Cross(((Line)curveSegement.Geometry).Direction, perpendicular) )); continue; } throw new NotImplementedException("Only lines and circles supported in tool profiles"); } profileFacetVertices.Add(new FacetVertex( curveSegments.Last().EndPoint, Direction.DirZ )); int count = profileFacetVertices.Count; var facetVertices = new FacetVertex[revolveSteps * count]; for (int i = 0; i < revolveSteps; i++) { for (int j = 0; j < count; j++) { facetVertices[i * count + j] = profileFacetVertices[j].Transform(Matrix.CreateRotation(Frame.World.AxisZ, (double)i / revolveSteps * Const.Tau)); } } var facets = new List <Facet>(); for (int j = 0; j < count - 1; j++) { int jj = j + 1; if (facetVertices[j].Position == facetVertices[jj].Position) { continue; } for (int i = 0; i < revolveSteps; i++) { int ii = (i + 1) % revolveSteps; facets.Add(new Facet( i * count + j, ii * count + j, ii * count + jj )); facets.Add(new Facet( i * count + j, i * count + jj, ii * count + jj )); } } return(MeshPrimitive.Create(facetVertices, facets)); }
public static ICollection <Primitive> CreateCylinderMesh(Point point1, Point point2, double diameter, int sides) { Vector heightVector = point2 - point1; Circle circle1 = Circle.Create(Frame.Create(point1, heightVector.Direction), diameter / 2); Circle circle2 = Circle.Create(Frame.Create(point2, heightVector.Direction), diameter / 2); var cylinderVertices = new List <FacetVertex>(); var end1Vertices = new List <FacetVertex>(); var end2Vertices = new List <FacetVertex>(); var tempVertices = new List <Point>(); //TBD remove when we can do seletction on meshes double angle = 2 * Math.PI / (double)sides; for (int i = 0; i < sides; i++) { CurveEvaluation eval1 = circle1.Evaluate((double)i * angle); CurveEvaluation eval2 = circle2.Evaluate(((double)i + 0.5) * angle); cylinderVertices.Add(new FacetVertex(eval1.Point, (eval1.Point - circle1.Frame.Origin).Direction)); cylinderVertices.Add(new FacetVertex(eval2.Point, (eval2.Point - circle2.Frame.Origin).Direction)); end1Vertices.Add(new FacetVertex(eval1.Point, heightVector.Direction)); end2Vertices.Add(new FacetVertex(eval2.Point, -heightVector.Direction)); tempVertices.Add(eval1.Point); tempVertices.Add(eval2.Point); } var cylinderFacets = new List <Facet>(); for (int i = 0; i < sides; i++) { int f00 = 2 * i; int f01 = f00 + 1; int f10 = f00 + 2 >= sides * 2 ? 0 : f00 + 2; int f11 = f10 + 1; cylinderFacets.Add(new Facet(f00, f10, f01)); cylinderFacets.Add(new Facet(f10, f11, f01)); } var end1Facets = new List <Facet>(); var end2Facets = new List <Facet>(); for (int i = 1; i < sides - 1; i++) { end1Facets.Add(new Facet(0, i + 1, i)); end2Facets.Add(new Facet(0, i, i + 1)); } var primitives = new List <Primitive>(); primitives.Add(MeshPrimitive.Create(cylinderVertices, cylinderFacets)); primitives.Add(MeshPrimitive.Create(end1Vertices, end1Facets)); primitives.Add(MeshPrimitive.Create(end2Vertices, end2Facets)); primitives.Add(PolylinePrimitive.Create(tempVertices)); //TBD remove return(primitives); }