static Option <Vector3> projectToLine( Ray ray, Vector3 originPosition, Vector3 shiftedPosition, ObjectCloner.LockedAxis lockedAxis, LockedAxis2 secondaryLockedAxis ) => projectToPlane(ray, originPosition, shiftedPosition).map(inPlane => { var lineP1 = originPosition; var lineP2 = lockedAxis == ObjectCloner.LockedAxis.X ? new Vector3( originPosition.x, (secondaryLockedAxis == LockedAxis2.B ? originPosition : shiftedPosition).y, (secondaryLockedAxis == LockedAxis2.A ? originPosition : shiftedPosition).z ) : lockedAxis == ObjectCloner.LockedAxis.Y ? new Vector3( (secondaryLockedAxis == LockedAxis2.A ? originPosition : shiftedPosition).x, originPosition.y, (secondaryLockedAxis == LockedAxis2.B ? originPosition : shiftedPosition).z ) : new Vector3( (secondaryLockedAxis == LockedAxis2.B ? originPosition : shiftedPosition).x, (secondaryLockedAxis == LockedAxis2.A ? originPosition : shiftedPosition).y, originPosition.z ); var direction = (lineP2 - lineP1) * 10000; Handles.DrawLine(originPosition - direction, originPosition + direction); var projected = Vector3.Project(inPlane - originPosition, direction) + originPosition; return(projected); });
// Determines where on screen we are currently pointing, given that we have one // axis locked. static Option <Vector3> newObjPosition( Vector2 mousePosition, Vector3 originPosition, ObjectCloner.LockedAxis lockedAxis, Option <LockedAxis2> secondaryLockedAxis ) { var ray = posInWorld(mousePosition); var shiftedPosition = new Vector3( lockedAxis == ObjectCloner.LockedAxis.X ? originPosition.x : originPosition.x - 1, lockedAxis == ObjectCloner.LockedAxis.Y ? originPosition.y : originPosition.y - 1, lockedAxis == ObjectCloner.LockedAxis.Z ? originPosition.z : originPosition.z - 1 ); return(secondaryLockedAxis.isSome ? projectToLine(ray, originPosition, shiftedPosition, lockedAxis, secondaryLockedAxis.get) : projectToPlane(ray, originPosition, shiftedPosition)); }