public override void draw(bool isTop) { //visualize the point on the plane if (onPlane && isTop) { //ray casting to the pre-defind planes OpenTK.Vector4 controller_p = UtilOld.getControllerTipPosition(ref mScene, primaryDeviceIndex == mScene.leftControllerIdx) * new OpenTK.Vector4(0, 0, 0, 1); OpenTK.Vector4 controller_pZ = UtilOld.getControllerTipPosition(ref mScene, primaryDeviceIndex == mScene.leftControllerIdx) * new OpenTK.Vector4(0, 0, -1, 1); Point3d controller_pRhino = UtilOld.openTkToRhinoPoint(UtilOld.vrToPlatformPoint(ref mScene, new OpenTK.Vector3(controller_p.X, controller_p.Y, controller_p.Z))); Point3d controller_pZRhin = UtilOld.openTkToRhinoPoint(UtilOld.vrToPlatformPoint(ref mScene, new OpenTK.Vector3(controller_pZ.X, controller_pZ.Y, controller_pZ.Z))); Rhino.Geometry.Vector3d direction = new Rhino.Geometry.Vector3d(controller_pZRhin.X - controller_pRhino.X, controller_pZRhin.Y - controller_pRhino.Y, controller_pZRhin.Z - controller_pRhino.Z); Ray3d ray = new Ray3d(controller_pRhino, direction); Rhino.DocObjects.ObjectEnumeratorSettings settings = new Rhino.DocObjects.ObjectEnumeratorSettings(); settings.ObjectTypeFilter = Rhino.DocObjects.ObjectType.Brep; //settings.NameFilter = "plane"; float mimD = 1000000f; hitPlane = false; if (!lockPlane) { foreach (Rhino.DocObjects.RhinoObject rhObj in mScene.rhinoDoc.Objects.GetObjectList(settings)) { //only drawing on planes for now rhObj.Attributes.Name.Contains("brepMesh") || rhObj.Attributes.Name.Contains("aprint") || rhObj.Attributes.Name.Contains("plane") if (rhObj.Attributes.Name.Contains("plane")) { List <GeometryBase> geometries = new List <GeometryBase>(); geometries.Add(rhObj.Geometry); //must be a brep or surface, not mesh Point3d[] rayIntersections = Rhino.Geometry.Intersect.Intersection.RayShoot(ray, geometries, 1); if (rayIntersections != null) { //get the nearest one OpenTK.Vector3 tmpP = UtilOld.platformToVRPoint(ref mScene, new OpenTK.Vector3((float)rayIntersections[0].X, (float)rayIntersections[0].Y, (float)rayIntersections[0].Z)); float distance = (float)Math.Sqrt(Math.Pow(tmpP.X - controller_p.X, 2) + Math.Pow(tmpP.Y - controller_p.Y, 2) + Math.Pow(tmpP.Z - controller_p.Z, 2)); if (distance < mimD) { hitPlane = true; targetPRhObj = rhObj; mimD = distance; projectP = UtilOld.platformToVRPoint(ref mScene, new OpenTK.Vector3((float)rayIntersections[0].X, (float)rayIntersections[0].Y, (float)rayIntersections[0].Z)); } } } } } else { if (targetPRhObj != null) { List <GeometryBase> geometries = new List <GeometryBase>(); geometries.Add(targetPRhObj.Geometry); //must be a brep or surface, not mesh Point3d[] rayIntersections = Rhino.Geometry.Intersect.Intersection.RayShoot(ray, geometries, 1); if (rayIntersections != null) { //get the nearest one OpenTK.Vector3 tmpP = UtilOld.platformToVRPoint(ref mScene, new OpenTK.Vector3((float)rayIntersections[0].X, (float)rayIntersections[0].Y, (float)rayIntersections[0].Z)); float distance = (float)Math.Sqrt(Math.Pow(tmpP.X - controller_p.X, 2) + Math.Pow(tmpP.Y - controller_p.Y, 2) + Math.Pow(tmpP.Z - controller_p.Z, 2)); if (distance < mimD) { hitPlane = true; mimD = distance; projectP = UtilOld.platformToVRPoint(ref mScene, new OpenTK.Vector3((float)rayIntersections[0].X, (float)rayIntersections[0].Y, (float)rayIntersections[0].Z)); } } } } if (!hitPlane) { targetPRhObj = null; projectP = new OpenTK.Vector3(100, 100, 100); //make it invisable } //visualize the projection points // inverted rotation first OpenTK.Matrix4 t = OpenTK.Matrix4.CreateTranslation(UtilOld.transformPoint(mScene.tableGeometry.transform.Inverted(), projectP)); t.Transpose(); drawPoint.transform = t; } if (currentState != State.PAINT || !isTop) { return; } // drawing curve Vector3 pos = new Vector3(); if (onPlane) { pos = projectP; if (hitPlane) { //GeometryStroke handle rotation ((Geometry.GeometryStroke)stroke_g).addPoint(pos); rhihoPointList.Add(UtilOld.openTkToRhinoPoint(UtilOld.vrToPlatformPoint(ref mScene, pos))); } } else { pos = Util.Math.GetTranslationVector3(UtilOld.getControllerTipPosition(ref mScene, primaryDeviceIndex == mScene.leftControllerIdx)); //GeometryStroke handle rotation already ((Geometry.GeometryStroke)stroke_g).addPoint(pos); rhihoPointList.Add(UtilOld.openTkToRhinoPoint(UtilOld.vrToPlatformPoint(ref mScene, pos))); } if (((Geometry.GeometryStroke)stroke_g).mNumPrimitives == 1) { SceneNode stroke = new SceneNode("Stroke", ref stroke_g, ref stroke_m); mScene.tableGeometry.add(ref stroke); //mScene.staticGeometry.add(ref stroke); strokeId = stroke.guid; } //testing the performance of rhino curve if (rhihoPointList.Count == 2) { rcurve = Curve.CreateInterpolatedCurve(rhihoPointList.ToArray(), 3); } else if (rhihoPointList.Count > 2) { rcurve.Extend(Rhino.Geometry.CurveEnd.End, Rhino.Geometry.CurveExtensionStyle.Line, rhihoPointList[rhihoPointList.Count - 1]); } }