Exemple #1
0
        public override List <ISnapPoint> GeneratePoints(SceneObject so)
        {
            List <ISnapPoint> v = new List <ISnapPoint>();

            if (so is PolyCurveSO)
            {
                PolyCurveSO curveSO = so as PolyCurveSO;
                DCurve3     curve   = curveSO.Curve;

                Frame3f f = Frame3f.Identity;

                Frame3f startFrame = new Frame3f((Vector3f)curve.Start, -(Vector3f)curve.Tangent(0), 1);
                v.Add(new SOFrameSnapPoint(curveSO)
                {
                    frame = f.FromFrame(startFrame)
                });
                Frame3f endFrame = new Frame3f((Vector3f)curve.End, (Vector3f)curve.Tangent(curve.VertexCount - 1), 1);
                v.Add(new SOFrameSnapPoint(curveSO)
                {
                    frame = f.FromFrame(endFrame)
                });
            }

            if (base.EnableGeometry)
            {
                base.build_geometry(so, v);
            }

            return(v);
        }
Exemple #2
0
        public fGraph(DCurve3 curve, bool bInitializeFrames, IList <Colorf> colors = null, IList <float> sizes = null)
        {
            graph = new Mesh();

            int NV = curve.VertexCount;

            Vector3[] verts   = new Vector3[NV];
            int[]     indices = new int[NV * 2];
            for (int i = 0; i < curve.VertexCount; ++i)
            {
                indices[2 * i]     = i;
                indices[2 * i + 1] = (i + 1) % NV;
                verts[i]           = (Vector3)curve[i];
            }
            graph.vertices = verts;

            if (bInitializeFrames)
            {
                Vector3[] normals  = new Vector3[NV];
                Vector4[] tangents = new Vector4[NV];

                Frame3f vf = new Frame3f(curve[0], curve.Tangent(0));
                for (int i = 0; i < curve.VertexCount; ++i)
                {
                    Vector3d tan = curve.Tangent(i);
                    vf.AlignAxis(2, (Vector3f)tan);
                    normals[i] = vf.X;
                    float s = (sizes == null) ? 1.0f : sizes[i];
                    tangents[i] = new Vector4(vf.Y.x, vf.Y.y, vf.Y.z, s);
                }

                graph.normals  = normals;
                graph.tangents = tangents;
            }

            if (colors != null)
            {
                Color[] ucolors = new Color[NV];
                for (int i = 0; i < curve.VertexCount; ++i)
                {
                    ucolors[i] = colors[i];
                }
                graph.colors = ucolors;
            }

            graph.SetIndices(indices, MeshTopology.Lines, 0);
        }
Exemple #3
0
        public void smooth_append(DCurve3 curve, Vector3f newPos, float fDistThresh)
        {
            // empty curve, always append
            if (curve.VertexCount == 0)
            {
                curve.AppendVertex(newPos);
                last_append          = newPos;
                appended_last_update = true;
                have_temp_append     = false;
                return;
            }
            else if (curve.VertexCount == 1)
            {
                curve.AppendVertex(newPos);
                last_append          = newPos;
                appended_last_update = true;
                have_temp_append     = true;
                return;
            }
            else if (curve.VertexCount <= 3)
            {
                curve[curve.VertexCount - 1] = newPos;
            }

            double d = (newPos - last_append).Length;

            if (d < fDistThresh)
            {
                // have not gone far enough for a real new vertex!

                Vector3f usePos = new Vector3f(newPos);
                bool     bValid = false;

                // do we have enough vertices to do a good job?
                if (curve.VertexCount > 3)
                {
                    int      nLast = (have_temp_append) ? curve.VertexCount - 2 : curve.VertexCount - 1;
                    Vector3d tan   = curve.Tangent(nLast);
                    double   fDot  = tan.Dot((usePos - curve[nLast]).Normalized);
                    if (fDot > 0.9f)        // cos(25) ~= 0.9f
                    // new vtx is aligned with tangent of last "real" vertex
                    {
                        bValid = true;
                    }
                    else
                    {
                        // not aligned, try projection onto tangent
                        Line3d l = new Line3d(curve[nLast], tan);
                        double t = l.Project(newPos);
                        if (t > 0)
                        {
                            // projection of new vtx is 'ahead' so we can use it
                            usePos = (Vector3f)l.PointAt(t);
                            bValid = true;
                        }
                    }
                }

                if (bValid)
                {
                    if (appended_last_update)
                    {
                        curve.AppendVertex(usePos);
                        have_temp_append = true;
                    }
                    else if (have_temp_append)
                    {
                        curve[curve.VertexCount - 1] = usePos;
                    }
                }

                appended_last_update = false;
            }
            else
            {
                // ok we drew far enough, add this position

                if (have_temp_append)
                {
                    // re-use temp vertex
                    curve[curve.VertexCount - 1] = newPos;
                    have_temp_append             = false;
                }
                else
                {
                    curve.AppendVertex(newPos);
                }
                last_append          = newPos;
                appended_last_update = true;

                // do smoothing pass
                smoother.End   = curve.VertexCount - 1;
                smoother.Start = MathUtil.Clamp(smoother.End - 5, 0, smoother.End);
                smoother.UpdateDeformation(2);
            }
        }
 public virtual Vector3d Tangent(int i)
 {
     return(curve.Tangent(i));
 }