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); }
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); }
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)); }