/// <summary> /// draws a 3d-polygon, which is stored in Array. See also <see cref="xyzArray"/> if the <see cref="OpenGlDevice.PolygonMode"/> = <b>Fill</b> and the array is planar then /// the polygon is drawn as filled polygon else as a lined polygon. /// </summary> /// <param name="Array"><see cref="xyzArray"/>hollds the array information</param> public void drawPolyLine(xyzArray Array) { Object Handle = null; if ((RenderKind == RenderKind.SnapBuffer)) { Handle = Selector.RegisterSnapItem(new PolyLineSnappItem3D(Array)); } if ((PolygonMode == PolygonMode.Fill) && (Array.Count > 2) && (Array.planar)) { Loxy L = new Loxy(); PushMatrix(); MulMatrix(Array.Base.ToMatrix()); xyArray A = Array.ToxyArray(); L.Add(A); drawFilledArray2d(this, L); PopMatrix(); if ((RenderKind == RenderKind.SnapBuffer)) { Selector.UnRegisterSnapItem(Handle); } if (PolygonMode == PolygonMode.Fill) { return; } } Primitives3d.drawArrayLined(this, Array); if ((RenderKind == RenderKind.SnapBuffer)) { Selector.UnRegisterSnapItem(Handle); } }
/// <summary> /// draws a list of <see cref="xyzArray"/>.The first array is the outer contur the other are holes. /// </summary> /// <param name="Loxyz">a list of <see cref="xyzArray"/></param> public void drawPolyPolyLine(Loxyz Loxyz) { Object Handle = null; if ((RenderKind == RenderKind.SnapBuffer)) { Handle = Selector.RegisterSnapItem(new PolyPolyLineSnappItem3D(Loxyz)); } if ((PolygonMode == PolygonMode.Fill) && (Loxyz.planar)) { Loxy L = Loxyz.ToLoxy(); PushMatrix(); MulMatrix(Loxyz.Base.ToMatrix()); drawFilledArray2d(this, L); PopMatrix(); if ((RenderKind == RenderKind.SnapBuffer)) { Selector.UnRegisterSnapItem(Handle); } return; } for (int i = 0; i < Loxyz.Count; i++) { Primitives3d.drawArrayLined(this, Loxyz[i]); } if ((RenderKind == RenderKind.SnapBuffer)) { Selector.UnRegisterSnapItem(Handle); } }
/// <summary> /// overrides the <see cref="Surface.OnDraw(OpenGlDevice)"/> method. /// </summary> /// <param name="Device">the <see cref="OpenGlDevice"/> in which will be painted.</param> protected override void OnDraw(OpenGlDevice Device) { if (!plane) { base.OnDraw(Device); return; } object Handle = null; if ((Device.RenderKind == RenderKind.SnapBuffer) || (Entity.Compiling)) { SurfaceSnappItem S = new SurfaceSnappItem(); Handle = Device.Selector.RegisterSnapItem(S); S.Surface = this; } IndexType[] Indices = null; xyzf[] Points = null; xyzf[] Normals = null; xyf[] Texture = null; // if ((BoundedCurves != null) && (BoundedCurves.Count > 0)) { Indices = new IndexType[] { 0, 1, 2, 0, 2, 3 }; Points = new xyzf[] { A, B, C, D }; Normals = new xyzf[] { N00.toXYZF(), N00.toXYZF(), N00.toXYZF(), N00.toXYZF() }; Texture = new xyf[] { new xyf(0, 0), new xyf(0, 0), new xyf(0, 0), new xyf(0, 0) }; } //else // GetTrianglesFull(ref Indices, ref Points, ref Normals, ref Texture); if (Device.PolygonMode == PolygonMode.Fill) { Primitives3d.drawTriangles(Device, Indices, Points, Normals, Texture, null); } else { Primitives3d.drawFouranglesLined(Device, Indices, Points, Normals, Texture); } Entity.CheckCompiling(); if ((Device.RenderKind == RenderKind.SnapBuffer) || (Entity.Compiling)) { Device.Selector.UnRegisterSnapItem(Handle); } }
/// <summary> /// internal. /// </summary> /// <param name="Device"></param> /// <param name="Indices"></param> /// <param name="Points"></param> /// <param name="Texture"></param> public static void drawTriangles2d(OpenGlDevice Device, List <IndexType> Indices, xyf[] Points, xyf[] Texture) { //ok refIndices = Indices.ToArray(); refPoints2d = Points; refTexture = Texture; double dir = 1; for (int i = 0; i < Indices.Count; i += 3) { xy A = new xy(Points[Indices[i + 1]].x - Points[Indices[i]].x, Points[Indices[i + 1]].y - Points[Indices[i]].y); xy B = new xy(Points[Indices[i + 2]].x - Points[Indices[i]].x, Points[Indices[i + 2]].y - Points[Indices[i]].y); double F = A & B; if (System.Math.Abs(F) > 0.0001) { if (F < 0) { dir = 1; // schaut welche Richtung der Normal vektor haben muss } else { dir = -1; } break; } } xyzf[] Normals = new xyzf[Points.Length]; for (int i = 0; i < Points.Length; i++) { Normals[i] = new xyz(0, 0, dir).toXYZF(); } xyzf[] _Points = new xyzf[Points.Length]; for (int i = 0; i < Points.Length; i++) { _Points[i] = new xyzf(Points[i].x, Points[i].y, 0); } refNormals = Normals; Primitives3d.drawTriangles(Device, Indices.ToArray(), _Points, Normals, Texture, null); }
protected internal override xyz Cross(LineType ViewLine) { if (this.PolygonMode == PolygonMode.Line) { Polygon = Primitives3d.GetBoxPoints(Position, Size); double Param = -1; double LineLam1 = -1; if (Polygon.Distance(ViewLine, 1e10, out Param, out LineLam1) < 1) { return(Polygon.Value(Param)); } return(new xyz(0, 0, 0)); } xyz[] Result = new xyz[5]; Plane Triangle = new Plane(TriangleInfo.Points[TriangleInfo.Indices[PrimId * 3]], TriangleInfo.Points[TriangleInfo.Indices[PrimId * 3 + 1]], TriangleInfo.Points[TriangleInfo.Indices[PrimId * 3 + 2]]); //Test switch (PrimId) {// Oben case 0: //Polygon.data = new xyz[] {TriangleInfo.Points[0].Toxyz(), // TriangleInfo.Points[2].Toxyz(), // TriangleInfo.Points[1].Toxyz(), // TriangleInfo.Points[3].Toxyz(), // TriangleInfo.Points[0].Toxyz()}; //Point = Position; //Result[0] = new xyz(Point.x, Point.y, Point.z + Size.z); //Result[1] = new xyz(Point.x, Point.y + Size.y, Point.z + Size.z); //Result[2] = new xyz(Point.x, Point.y + Size.y, Point.z); //Result[3] = new xyz(Point.x, Point.y, Point.z); //Result[4] = Result[0]; Result[0] = new xyz(Position.x, Position.y, Position.z + Size.Z); Result[1] = new xyz(Position.x + Size.x, Position.y, Position.z + Size.Z); Result[2] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z + Size.Z); Result[3] = new xyz(Position.x, Position.y + Size.y, Position.z + Size.Z); Result[4] = Result[0]; break; case 1: //Polygon.data = new xyz[] {TriangleInfo.Points[0].Toxyz(), // TriangleInfo.Points[2].Toxyz(), // TriangleInfo.Points[1].Toxyz(), // TriangleInfo.Points[3].Toxyz(), // TriangleInfo.Points[0].Toxyz() //}; Result[0] = new xyz(Position.x, Position.y, Position.z + Size.Z); Result[1] = new xyz(Position.x + Size.x, Position.y, Position.z + Size.Z); Result[2] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z + Size.Z); Result[3] = new xyz(Position.x, Position.y + Size.y, Position.z + Size.Z); Result[4] = Result[0]; break; case 2: // unten //Polygon.data = new xyz[] {TriangleInfo.Points[4].Toxyz(), // TriangleInfo.Points[6].Toxyz(), // TriangleInfo.Points[5].Toxyz(), // TriangleInfo.Points[7].Toxyz(), // TriangleInfo.Points[4].Toxyz() //}; Result[0] = new xyz(Position.x, Position.y, Position.z); Result[2] = new xyz(Position.x + Size.x, Position.y, Position.z); Result[1] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z); Result[3] = new xyz(Position.x, Position.y + Size.y, Position.z); Result[4] = Result[0]; break; case 3: //Polygon.data = new xyz[] {TriangleInfo.Points[4].Toxyz(), // TriangleInfo.Points[6].Toxyz(), // TriangleInfo.Points[5].Toxyz(), // TriangleInfo.Points[7].Toxyz(), // TriangleInfo.Points[4].Toxyz() //}; Result[0] = new xyz(Position.x, Position.y, Position.z); Result[2] = new xyz(Position.x + Size.x, Position.y, Position.z); Result[1] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z); Result[3] = new xyz(Position.x, Position.y + Size.y, Position.z); Result[4] = Result[0]; break; case 4: //Polygon.data = new xyz[] {TriangleInfo.Points[8].Toxyz(), // TriangleInfo.Points[10].Toxyz(), // TriangleInfo.Points[9].Toxyz(), // TriangleInfo.Points[11].Toxyz(), // TriangleInfo.Points[8].Toxyz() //}; Result[0] = new xyz(Position.x, Position.y, Position.z); Result[1] = new xyz(Position.x + Size.x, Position.y, Position.z); Result[2] = new xyz(Position.x + Size.x, Position.y, Position.z + Size.Z); Result[3] = new xyz(Position.x, Position.y, Position.z + Size.Z); Result[4] = Result[0]; break; case 5: //Polygon.data = new xyz[] {TriangleInfo.Points[8].Toxyz(), // TriangleInfo.Points[10].Toxyz(), // TriangleInfo.Points[9].Toxyz(), // TriangleInfo.Points[11].Toxyz(), // TriangleInfo.Points[8].Toxyz() //}; Result[0] = new xyz(Position.x, Position.y, Position.z); Result[1] = new xyz(Position.x + Size.x, Position.y, Position.z); Result[2] = new xyz(Position.x + Size.x, Position.y, Position.z + Size.Z); Result[3] = new xyz(Position.x, Position.y, Position.z + Size.Z); Result[4] = Result[0]; break; case 6: // Hinten //Polygon.data = new xyz[] {TriangleInfo.Points[12].Toxyz(), // TriangleInfo.Points[14].Toxyz(), // TriangleInfo.Points[13].Toxyz(), // TriangleInfo.Points[15].Toxyz(), // TriangleInfo.Points[12].Toxyz() //}; Result[0] = new xyz(Position.x + Size.x, Position.y + Size.Y, Position.z); Result[1] = new xyz(Position.x, Position.y + Size.Y, Position.z); Result[2] = new xyz(Position.x, Position.y + Size.y, Position.z + Size.Z); Result[3] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z + Size.Z); Result[4] = Result[0]; break; case 7: // Hinten //Polygon.data = new xyz[] {TriangleInfo.Points[12].Toxyz(), // TriangleInfo.Points[14].Toxyz(), // TriangleInfo.Points[13].Toxyz(), // TriangleInfo.Points[15].Toxyz(), // TriangleInfo.Points[12].Toxyz() //}; Result[0] = new xyz(Position.x + Size.x, Position.y + Size.Y, Position.z); Result[1] = new xyz(Position.x, Position.y + Size.Y, Position.z); Result[2] = new xyz(Position.x, Position.y + Size.y, Position.z + Size.Z); Result[3] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z + Size.Z); Result[4] = Result[0]; break; case 8: // Links)) //Polygon.data = new xyz[] {TriangleInfo.Points[16].Toxyz(), // TriangleInfo.Points[18].Toxyz(), // TriangleInfo.Points[17].Toxyz(), // TriangleInfo.Points[19].Toxyz(), // TriangleInfo.Points[16].Toxyz() //}; Result[0] = new xyz(Position.x, Position.y + Size.Y, Position.z); Result[1] = new xyz(Position.x, Position.y, Position.z); Result[2] = new xyz(Position.x, Position.y, Position.z + Size.Z); Result[3] = new xyz(Position.x, Position.y + Size.Y, Position.z + Size.Z); Result[4] = Result[0]; break; case 9: //Polygon.data = new xyz[] {TriangleInfo.Points[16].Toxyz(), // TriangleInfo.Points[18].Toxyz(), // TriangleInfo.Points[17].Toxyz(), // TriangleInfo.Points[19].Toxyz(), // TriangleInfo.Points[16].Toxyz() // }; Result[0] = new xyz(Position.x, Position.y + Size.Y, Position.z); Result[1] = new xyz(Position.x, Position.y, Position.z); Result[2] = new xyz(Position.x, Position.y, Position.z + Size.Z); Result[3] = new xyz(Position.x, Position.y + Size.Y, Position.z + Size.Z); Result[4] = Result[0]; break; case 10: //Rechts //Polygon.data = new xyz[] {TriangleInfo.Points[20].Toxyz(), // TriangleInfo.Points[22].Toxyz(), // TriangleInfo.Points[21].Toxyz(), // TriangleInfo.Points[23].Toxyz(), // TriangleInfo.Points[20].Toxyz() // }; Result[0] = new xyz(Position.x + Size.X, Position.y, Position.z); Result[1] = new xyz(Position.x + Size.x, Position.y + Size.Y, Position.z); Result[2] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z + Size.Z); Result[3] = new xyz(Position.x + Size.x, Position.y, Position.z + Size.z); Result[4] = Result[0]; break; case 11: //Rechts //Polygon.data = new xyz[] {TriangleInfo.Points[20].Toxyz(), // TriangleInfo.Points[22].Toxyz(), // TriangleInfo.Points[21].Toxyz(), // TriangleInfo.Points[23].Toxyz(), // TriangleInfo.Points[20].Toxyz() // }; Result[0] = new xyz(Position.x + Size.X, Position.y, Position.z); Result[1] = new xyz(Position.x + Size.x, Position.y + Size.Y, Position.z); Result[2] = new xyz(Position.x + Size.x, Position.y + Size.y, Position.z + Size.Z); Result[3] = new xyz(Position.x + Size.x, Position.y, Position.z + Size.z); Result[4] = Result[0]; break; default: break; } Polygon.data = Result; double Lam = -1; double LineLam = -1; double di = Polygon.Distance(ViewLine, Snapdist, out Lam, out LineLam); if (di <= Snapdist) { xyz P = Polygon.Value(Lam); doExchange = true; //xyz W = ViewLine.Value(LineLam); //double mm = P.dist(W); return(P); } return(base.Cross(ViewLine)); }