public void BeginDraw_Ray(Ray3f ray, AnyRayHit rayHit, int nStep) { CreateNewPrimitive(); Vector3f hitPos = rayHit.hitPos; // try snap points SnapResult snap = Snaps.FindHitSnapPoint(ray); if (snap != null) { Frame3f snapF = scene.ToWorldFrame(snap.FrameS); hitPos = snapF.Origin; } Frame3f sceneW = scene.SceneFrame; if (rayHit.hitSO == null) { primStartW = sceneW; primStartW.Origin = hitPos; } else { if (scene.Context.TransformManager.ActiveFrameType == FrameType.WorldFrame) { primStartW = sceneW; primStartW.Origin = hitPos; } else if (rayHit.hitSO is PivotSO) { primStartW = (rayHit.hitSO as PivotSO).GetLocalFrame(CoordSpace.WorldCoords); primStartW.Origin = hitPos; } else if (rayHit.hitSO is PrimitiveSO) { // align with object frame as much as possible, given that we still want // to use hit normal... Frame3f objFrame = (rayHit.hitSO as PrimitiveSO).GetLocalFrame(CoordSpace.WorldCoords); int nBestAxis = MathUtil.MostParallelAxis(objFrame, rayHit.hitNormal); int nPerp = (nBestAxis + 1) % 3; primStartW = new Frame3f(hitPos, rayHit.hitNormal, 1); primStartW.ConstrainedAlignAxis(0, objFrame.GetAxis(nPerp), primStartW.Y); } else { primStartW = new Frame3f(hitPos, rayHit.hitNormal, 1); primStartW.ConstrainedAlignAxis(1, sceneW.Y, primStartW.Y); } } primitive.Frame = primStartW; primStartS = scene.ToSceneFrame(primStartW); }
public override bool UpdateCapture(ITransformable target, Ray3f worldRay) { // find hit SnapResult snap = Targets.FindHitSnapPoint(worldRay); snapState.UpdateState(snap); if (snapState.IsSnapped) { SnapResult useSnap = snapState.ActiveSnapTarget; Frame3f hitFrameS = Frame3f.Identity; if (useSnap != null) { hitFrameS = new Frame3f(useSnap.FrameS); } Frame3f targetF = originalTargetS; // target.GetLocalFrame(CoordSpace.WorldCoords); Frame3f pivotF = hitFrameS; targetF.Origin = pivotF.Origin; if (parent.CurrentFrameMode == FrameType.WorldFrame) { targetF.Rotation = Quaternion.identity; } else { targetF.Rotation = pivotF.Rotation; } Vector3f deltaInT = targetF.FromFrameV(SourceFrameL.Origin); targetF.Origin -= deltaInT; // why is this minus? target.SetLocalFrame(targetF, CoordSpace.SceneCoords); } else { Func <SceneObject, bool> filter = null; if (TargetObjects != null && TargetObjects.Count > 0) { filter = (x) => { return(TargetObjects.Contains(x) == false); } } ; AnyRayHit hit; if (scene.FindSceneRayIntersection(worldRay, out hit, true, filter)) { Vector3f hitPosS = scene.ToSceneP(hit.hitPos); Vector3f hitNormS = scene.ToSceneN(hit.hitNormal); Frame3f targetF = originalTargetS; targetF.Origin = hitPosS; targetF.AlignAxis(1, hitNormS); if (parent.CurrentFrameMode == FrameType.WorldFrame) { targetF.Rotation = Quaternion.identity; } Vector3f deltaInT = targetF.FromFrameV(SourceFrameL.Origin); targetF.Origin -= deltaInT; // why is this minus? target.SetLocalFrame(targetF, CoordSpace.SceneCoords); } else { target.SetLocalFrame(originalTargetS, CoordSpace.SceneCoords); } } return(true); }