private void HandleRays(bool _begin) { if (m_context.ViewedProcessor.IsOutputValid()) { Event e = Event.current; Vector2 rayScreenPosition = new Vector2(e.mousePosition.x - m_sceneRect.xMin, m_sceneRect.height - (e.mousePosition.y - m_sceneRect.yMin)); sbyte selectionMode = UNSELECTED; if (e.shift) { selectionMode = SELECTED_TARGET; } else if (e.control) { selectionMode = SELECTED_SOURCE; } else { m_currentSelectionMode = UNSELECTED; } if (selectionMode != UNSELECTED) { Ray ray = m_context.m_camera.ScreenPointToRay(rayScreenPosition); NPVoxRayCastHit hit = m_context.VoxToUnity.Raycast(ray, m_context.PreviewObject.transform, 50); if (hit.IsHit) { sbyte selection = GetSelection(hit.Coord); if (_begin) { switch (selection) { case UNSELECTED: m_currentSelectionMode = selectionMode; break; case SELECTED_TARGET: case SELECTED_SOURCE: if (selectionMode == selection) { m_currentSelectionMode = UNSELECTED; } else { m_currentSelectionMode = selectionMode; } break; } } SetSelection(hit.Coord, m_currentSelectionMode); } } } }
private bool DrawBoneSelection() { if (viewModel.PreviousModelFactory == null) { return(false); } NPVoxBoneModel previewModel = viewModel.EditorModelFactory.GetProduct() as NPVoxBoneModel; if (previewModel == null) { return(false); } if (!viewModel.IsBoneSelectionActive()) { return(false); } NPVoxToUnity npVoxToUnity = new NPVoxToUnity(previewModel, viewModel.Animation.MeshFactory.VoxelSize); // affected area picker if (Event.current.isMouse && Event.current.type == EventType.MouseDown && Event.current.button == 0) { // NPVoxCoord someCoord = NPVoxCoord.INVALID; float mouseScale = NPVoxHandles.GetMouseScale(SceneView.currentDrawingSceneView.camera); Camera cam = SceneView.currentDrawingSceneView.camera; Ray r = SceneView.currentDrawingSceneView.camera.ScreenPointToRay( new Vector3(Event.current.mousePosition.x * mouseScale, -Event.current.mousePosition.y * mouseScale + Camera.current.pixelHeight) ); NPVoxRayCastHit raycastHit = npVoxToUnity.Raycast(r, ((NPVoxAnimationEditorSession)target).previewFilter.transform, 20); if (raycastHit.IsHit) { uint boneMask = previewModel.GetBoneMask(raycastHit.Coord); if (boneMask != 0) { if (Event.current.control || Event.current.command) { viewModel.ToggleBoneMask(boneMask, Event.current.shift); } else { viewModel.SetBoneMask(boneMask, Event.current.shift); } } } } return(true); }
public static NPVoxCoord VoxelPicker(NPVoxToUnity npVoxToUnity, NPVoxCoord previousSelectedCoord, int buttonNum, Transform transform) { if (npVoxToUnity == null) { return(NPVoxCoord.INVALID); } int controlID = GUIUtility.GetControlID(FocusType.Passive); EventType eventType = Event.current.GetTypeForControl(controlID); Vector3 voxelCenter = new Vector3(); NPVoxCoord impactCoord = NPVoxCoord.INVALID; // Vector3 offset = SceneView.currentDrawingSceneView.position; // Vector3 mp = Event.current.mousePosition - offset; float mouseScale = GetMouseScale(SceneView.currentDrawingSceneView.camera); Ray r = SceneView.currentDrawingSceneView.camera.ScreenPointToRay( new Vector3(Event.current.mousePosition.x * mouseScale, -Event.current.mousePosition.y * mouseScale + Camera.current.pixelHeight) ); NPVoxRayCastHit raycastHit = npVoxToUnity.Raycast(r, transform, 20); if (raycastHit.IsHit) { impactCoord = raycastHit.Coord; voxelCenter = npVoxToUnity.ToUnityPosition(impactCoord); // if (isMouseDown) { Handles.color = Color.yellow; Handles.CubeCap(controlID, voxelCenter, Quaternion.identity, npVoxToUnity.VoxeSize.x * 2.0f); // SceneView.currentDrawingSceneView.Repaint(); } } else { return(previousSelectedCoord); } switch (eventType) { case EventType.Layout: mouseStartPos = Event.current.mousePosition; // if (raycastHit.IsHit) { HandleUtility.AddControl( controlID, HandleUtility.DistanceToCircle(voxelCenter, npVoxToUnity.VoxeSize.x * 0.25f) ); } break; case EventType.MouseDown: if (HandleUtility.nearestControl == controlID && Event.current.button == buttonNum) { mouseStartPos = Event.current.mousePosition; GUIUtility.hotControl = controlID; Event.current.Use(); } break; case EventType.MouseUp: if (GUIUtility.hotControl == controlID) { GUI.changed = true; GUIUtility.hotControl = 0; Event.current.Use(); return(impactCoord); } break; case EventType.MouseDrag: if (GUIUtility.hotControl == controlID) { Event.current.Use(); } break; } return(previousSelectedCoord); }