Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        /// <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);
            }
        }
Exemplo n.º 4
0
      /// <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);
      }
Exemplo n.º 5
0
        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));
        }