private void OnSceneGUI(UnityEditor.SceneView sceneview) { m_mousePosition = Event.current.mousePosition; switch (Event.current.type) { case EventType.MouseDown: m_MouseClickPosition = m_mousePosition; break; case EventType.KeyDown: switch (Event.current.keyCode) { case KeyCode.PageUp: ++m_DebugStep; sceneview.Repaint(); break; case KeyCode.PageDown: m_DebugStep = Mathf.Max(0, m_DebugStep - 1); sceneview.Repaint(); break; case KeyCode.End: // Usefull we you don't want to change the scene viewport but still update the mouse click position m_MouseClickPosition = m_mousePosition; sceneview.Repaint(); break; } break; } }
void OnPrefabStageDirtinessChanged(PrefabStage prefabStage) { if (m_SceneView.customScene == prefabStage.scene) { m_SceneView.Repaint(); } }
public static void DoViewTool(Transform cameraTransform, SceneView view) { Event current = Event.current; int num = SceneViewMotion.s_ViewToolID; EventType typeForControl = current.GetTypeForControl(num); float d = 0f; if (view && Tools.s_LockedViewTool == ViewTool.FPS) { view.FixNegativeSize(); d = (view.pivot - cameraTransform.position).magnitude; } switch (typeForControl) { case EventType.MouseDown: SceneViewMotion.HandleMouseDown(view, num, current.button); break; case EventType.MouseUp: SceneViewMotion.HandleMouseUp(view, num, current.button, current.clickCount); break; case EventType.MouseDrag: SceneViewMotion.HandleMouseDrag(cameraTransform, view, num); break; case EventType.KeyDown: SceneViewMotion.HandleKeyDown(view); break; case EventType.KeyUp: SceneViewMotion.HandleKeyUp(); break; case EventType.ScrollWheel: SceneViewMotion.HandleScrollWheel(view, !current.alt); break; case EventType.Layout: { Vector3 movementDirection = SceneViewMotion.GetMovementDirection(); if (GUIUtility.hotControl == num && movementDirection.sqrMagnitude != 0f) { cameraTransform.position += cameraTransform.rotation * movementDirection; } break; } } if (view && Tools.s_LockedViewTool == ViewTool.FPS) { if (!view.orthographic) { view.rotation = cameraTransform.rotation; } view.pivot = cameraTransform.position + cameraTransform.forward * d; view.Repaint(); } }
private static void RepaintAllSceneViews() { UnityEngine.Object[] array = Resources.FindObjectsOfTypeAll(typeof(SceneView)); for (int i = 0; i < array.Length; i++) { SceneView sceneView = (SceneView)array[i]; sceneView.Repaint(); } }
public static void DoViewTool(SceneView view) { Event current = Event.current; int num = SceneViewMotion.s_ViewToolID; EventType typeForControl = current.GetTypeForControl(num); if (view && Tools.s_LockedViewTool == ViewTool.FPS) { view.FixNegativeSize(); } switch (typeForControl) { case EventType.MouseDown: SceneViewMotion.HandleMouseDown(view, num, current.button); break; case EventType.MouseUp: SceneViewMotion.HandleMouseUp(view, num, current.button, current.clickCount); break; case EventType.MouseDrag: SceneViewMotion.HandleMouseDrag(view, num); break; case EventType.KeyDown: SceneViewMotion.HandleKeyDown(view); break; case EventType.KeyUp: SceneViewMotion.HandleKeyUp(); break; case EventType.ScrollWheel: SceneViewMotion.HandleScrollWheel(view, view.in2DMode == current.alt); break; case EventType.Layout: { Vector3 movementDirection = SceneViewMotion.GetMovementDirection(); if (GUIUtility.hotControl == num && movementDirection.sqrMagnitude != 0f) { view.pivot += view.rotation * movementDirection; view.Repaint(); } break; } case EventType.Used: if (GUIUtility.hotControl != num && SceneViewMotion.s_CurrentState != SceneViewMotion.MotionState.kInactive) { SceneViewMotion.ResetDragState(); } break; } }
void DrawListElement(Rect rect, string toggleName, bool value, Action <bool> setValue) { EditorGUI.BeginChangeCheck(); bool result = GUI.Toggle(rect, value, EditorGUIUtility.TempContent(toggleName), s_Styles.menuItem); if (EditorGUI.EndChangeCheck()) { setValue(result); m_SceneView.Repaint(); } }
// HANDLE THE VIEW TOOL & ALT COMBOS public static void DoViewTool(SceneView view) { Event evt = Event.current; // Ensure we always call the GetControlID the same number of times int id = s_ViewToolID; EventType eventType = evt.GetTypeForControl(id); // In FPS mode we update the pivot for Orbit mode (see below and inside HandleMouseDrag) if (view && Tools.s_LockedViewTool == ViewTool.FPS) { view.FixNegativeSize(); } switch (eventType) { case EventType.ScrollWheel: HandleScrollWheel(view, view.in2DMode == evt.alt); break; // Default to zooming to mouse position in 2D mode without alt case EventType.MouseDown: HandleMouseDown(view, id, evt.button); break; case EventType.MouseUp: HandleMouseUp(view, id, evt.button, evt.clickCount); break; case EventType.MouseDrag: HandleMouseDrag(view, id); break; case EventType.KeyDown: HandleKeyDown(view); break; case EventType.KeyUp: HandleKeyUp(); break; case EventType.Layout: { Vector3 motion = GetMovementDirection(); // This seems to be the best way to have a continuously repeating event if (GUIUtility.hotControl == id && motion.sqrMagnitude != 0) { view.pivot = view.pivot + view.rotation * motion; view.Repaint(); } } break; case EventType.Used: // since FPS tool acts on right click, nothing prevents a regular control // from taking the control ID on left click, so some cleanup is necessary // to not get locked into FPS mode (case 777346) if (GUIUtility.hotControl != id && s_CurrentState != MotionState.kInactive) { ResetDragState(); } break; } }
public static void DoViewTool(SceneView view) { Event current = Event.current; int controlID = s_ViewToolID; EventType typeForControl = current.GetTypeForControl(controlID); if ((view != null) && (Tools.s_LockedViewTool == UnityEditor.ViewTool.FPS)) { view.FixNegativeSize(); } switch (typeForControl) { case EventType.MouseDown: HandleMouseDown(view, controlID, current.button); break; case EventType.MouseUp: HandleMouseUp(view, controlID, current.button, current.clickCount); break; case EventType.MouseDrag: HandleMouseDrag(view, controlID); break; case EventType.KeyDown: HandleKeyDown(view); break; case EventType.KeyUp: HandleKeyUp(); break; case EventType.ScrollWheel: HandleScrollWheel(view, !current.alt); break; case EventType.Layout: { Vector3 movementDirection = GetMovementDirection(); if ((GUIUtility.hotControl == controlID) && (movementDirection.sqrMagnitude != 0f)) { view.pivot += view.rotation * movementDirection; view.Repaint(); } break; } } }
public static void DoViewTool(SceneView view) { Event current = Event.current; int viewToolId = SceneViewMotion.s_ViewToolID; EventType typeForControl = current.GetTypeForControl(viewToolId); if ((bool)((Object)view) && Tools.s_LockedViewTool == ViewTool.FPS) { view.FixNegativeSize(); } switch (typeForControl) { case EventType.MouseDown: SceneViewMotion.HandleMouseDown(view, viewToolId, current.button); break; case EventType.MouseUp: SceneViewMotion.HandleMouseUp(view, viewToolId, current.button, current.clickCount); break; case EventType.MouseDrag: SceneViewMotion.HandleMouseDrag(view, viewToolId); break; case EventType.KeyDown: SceneViewMotion.HandleKeyDown(view); break; case EventType.KeyUp: SceneViewMotion.HandleKeyUp(); break; case EventType.ScrollWheel: SceneViewMotion.HandleScrollWheel(view, !current.alt); break; case EventType.Layout: Vector3 movementDirection = SceneViewMotion.GetMovementDirection(); if (GUIUtility.hotControl != viewToolId || (double)movementDirection.sqrMagnitude == 0.0) { break; } view.pivot = view.pivot + view.rotation * movementDirection; view.Repaint(); break; } }
static void PastePlacement(SceneView view) { var tr = view.camera.transform; var placement = Clipboard.GetCustomValue <TransformWorldPlacement>(); tr.position = placement.position; tr.rotation = placement.rotation; tr.localScale = placement.scale; // Similar to what AlignViewToObject does, except we need to do that instantly // in case the shortcut key was pressed while FPS camera controls (right click drag) // were active. view.size = 10; view.LookAt(tr.position + tr.forward * view.cameraDistance, tr.rotation, view.size, view.orthographic, true); view.Repaint(); }
void DoBuiltinMode(ref Rect rect, SceneView.CameraMode mode) { using (new EditorGUI.DisabledScope(!m_SceneView.CheckDrawModeForRenderingPath(mode.drawMode))) { EditorGUI.BeginChangeCheck(); GUI.Toggle(rect, m_SceneView.cameraMode == mode, EditorGUIUtility.TextContent(mode.name), Styles.sMenuItem); if (EditorGUI.EndChangeCheck()) { m_SceneView.cameraMode = mode; m_SceneView.Repaint(); GUIUtility.ExitGUI(); } rect.y += EditorGUI.kSingleLineHeight; } }
Event currentEvent;// = (Event)0; void OnSceneGUI(SceneView scnView) { currentEvent = Event.current; if(editLevel == EditLevel.Geometry && currentEvent.Equals(Event.KeyboardEvent("v"))) { currentEvent.Use(); snapToVertex = true; } /** * Snap stuff */ if(currentEvent.type == EventType.KeyUp) snapToVertex = false; if(currentEvent.type == EventType.MouseDown && currentEvent.button == 1) rightMouseDown = true; if(currentEvent.type == EventType.MouseUp && currentEvent.button == 1 || currentEvent.type == EventType.Ignore) rightMouseDown = false; #if !PROTOTYPE // e.type == EventType.DragUpdated || if(currentEvent.type == EventType.DragPerform) { GameObject go = HandleUtility.PickGameObject(currentEvent.mousePosition, false); if(go != null && System.Array.Exists(DragAndDrop.objectReferences, x => x is Texture2D || x is Material)) { pb_Object pb = go.GetComponent<pb_Object>(); if( pb ) { Material mat = null; foreach(Object t in DragAndDrop.objectReferences) { if(t is Material) { mat = (Material)t; break; } /* This works, but throws some bullshit errors. Not creating a material leaks, so disable this functionality. */ else if(t is Texture2D) { mat = new Material(Shader.Find("Diffuse")); mat.mainTexture = (Texture2D)t; string texPath = AssetDatabase.GetAssetPath(mat.mainTexture); int lastDot = texPath.LastIndexOf("."); texPath = texPath.Substring(0, texPath.Length - (texPath.Length-lastDot)); texPath = AssetDatabase.GenerateUniqueAssetPath(texPath + ".mat"); AssetDatabase.CreateAsset(mat, texPath); AssetDatabase.Refresh(); break; } } if(mat != null) { if(editLevel == EditLevel.Geometry) { pbUndo.RecordObjects(selection, "Set Face Materials"); foreach(pb_Object pbs in selection) pbs.SetFaceMaterial(pbs.SelectedFaces.Length < 1 ? pbs.faces : pbs.SelectedFaces, mat); } else { pbUndo.RecordObject(pb, "Set Object Material"); pb.SetFaceMaterial(pb.faces, mat); } pb.ToMesh(); pb.Refresh(); pb.Optimize(); currentEvent.Use(); } } } } #endif DrawHandleGUI(scnView); if(editLevelToolbarRect.Contains(currentEvent.mousePosition)) scnView.Repaint(); if(!rightMouseDown && getKeyUp != KeyCode.None) { if(ShortcutCheck(currentEvent)) { currentEvent.Use(); return; } } // Finished moving vertices, scaling, or adjusting uvs #if PROTOTYPE if( (movingVertices || scaling) && GUIUtility.hotControl < 1) { OnFinishVertexModification(); } #else if( (movingVertices || movingPictures || scaling) && GUIUtility.hotControl < 1) { OnFinishVertexModification(); UpdateHandleRotation(); UpdateTextureHandles(); } #endif // Check mouse position in scene and determine if we should highlight something if(currentEvent.type == EventType.MouseMove) UpdateMouse(currentEvent.mousePosition); // Draw GUI Handles if(editLevel != EditLevel.Top && editLevel != EditLevel.Plugin) DrawHandles(); if(Tools.current != Tool.None && Tools.current != currentHandle) SetTool_Internal(Tools.current); if( (editLevel == EditLevel.Geometry || editLevel == EditLevel.Texture) && Tools.current != Tool.View) { if( selectedVertexCount > 0 ) { if(editLevel == EditLevel.Geometry) { switch(currentHandle) { case Tool.Move: VertexMoveTool(); break; case Tool.Scale: VertexScaleTool(); break; case Tool.Rotate: VertexRotateTool(); break; } } #if !PROTOTYPE // TEXTURE HANDLES else if(editLevel == EditLevel.Texture && selectedVertexCount > 0) { switch(currentHandle) { case Tool.Move: TextureMoveTool(); break; case Tool.Rotate: TextureRotateTool(); break; case Tool.Scale: TextureScaleTool(); break; } } #endif } } else { return; } // altClick || Tools.current == Tool.View || GUIUtility.hotControl > 0 || middleClick // Tools.viewTool == ViewTool.FPS || Tools.viewTool == ViewTool.Orbit if( pb_Handle_Utility.SceneViewInUse(currentEvent) || currentEvent.isKey || selection == null || selection.Length < 1) { dragging = false; return; } /* * * * * * * * * * * * * * * * * * * * * * Vertex & Quad Wranglin' Ahead! * * Everything from this point below * * overrides something Unity related. * * * * * * * * * * * * * * * * * * * * * */ // This prevents us from selecting other objects in the scene, // and allows for the selection of faces / vertices. int controlID = GUIUtility.GetControlID(FocusType.Passive); HandleUtility.AddDefaultControl(controlID); // If selection is made, don't use default handle -- set it to Tools.None if(selectedVertexCount > 0) Tools.current = Tool.None; if(leftClick) { // double clicking object if(currentEvent.clickCount > 1) { DoubleClick(currentEvent); } mousePosition_initial = mousePosition; } if(mouseDrag) dragging = true; if(ignore) { if(dragging) { dragging = false; DragCheck(); } if(doubleClicked) doubleClicked = false; } if(leftClickUp) { if(doubleClicked) { doubleClicked = false; } else { if(!dragging) { #if !PROTOTYPE if(pb_UV_Editor.instance) pb_UV_Editor.instance.ResetUserPivot(); #endif RaycastCheck(currentEvent.mousePosition); } else { dragging = false; #if !PROTOTYPE if(pb_UV_Editor.instance) pb_UV_Editor.instance.ResetUserPivot(); #endif DragCheck(); } } } }
void Draw() { Styles.Init(); var settings = m_SceneView.cameraSettings; m_Scroll = GUILayout.BeginScrollView(m_Scroll); GUILayout.BeginVertical(Styles.settingsArea); EditorGUI.BeginChangeCheck(); GUILayout.Space(k_HeaderSpacing); GUILayout.BeginHorizontal(); GUILayout.Label(m_SceneCameraLabel, EditorStyles.boldLabel); GUILayout.FlexibleSpace(); if (GUILayout.Button(EditorGUI.GUIContents.titleSettingsIcon, EditorStyles.iconButton)) { ShowContextMenu(); } GUILayout.EndHorizontal(); EditorGUIUtility.labelWidth = kPrefixLabelWidth; // fov isn't applicable in orthographic mode, and orthographic size is controlled by the user zoom using (new EditorGUI.DisabledScope(m_SceneView.orthographic)) { settings.fieldOfView = EditorGUILayout.Slider(m_FieldOfView, settings.fieldOfView, k_MinFieldOfView, k_MaxFieldOfView); } settings.dynamicClip = EditorGUILayout.Toggle(m_DynamicClip, settings.dynamicClip); using (new EditorGUI.DisabledScope(settings.dynamicClip)) { float near = settings.nearClip, far = settings.farClip; DrawClipPlanesField(EditorGUI.s_ClipingPlanesLabel, ref near, ref far, EditorGUI.kNearFarLabelsWidth); settings.SetClipPlanes(near, far); } settings.occlusionCulling = EditorGUILayout.Toggle(m_OcclusionCulling, settings.occlusionCulling); if (EditorGUI.EndChangeCheck()) { m_SceneView.Repaint(); } EditorGUILayout.Space(k_HeaderSpacing); GUILayout.Label(m_NavigationLabel, EditorStyles.boldLabel); settings.easingEnabled = EditorGUILayout.Toggle(m_EasingEnabled, settings.easingEnabled); settings.accelerationEnabled = EditorGUILayout.Toggle(m_AccelerationEnabled, settings.accelerationEnabled); EditorGUI.BeginChangeCheck(); float min = settings.speedMin, max = settings.speedMax, speed = settings.RoundSpeedToNearestSignificantDecimal(settings.speed); speed = EditorGUILayout.Slider(m_CameraSpeedSliderContent, speed, min, max); if (EditorGUI.EndChangeCheck()) { settings.speed = settings.RoundSpeedToNearestSignificantDecimal(speed); } EditorGUI.BeginChangeCheck(); m_Vector2Floats[0] = settings.speedMin; m_Vector2Floats[1] = settings.speedMax; DrawSpeedMinMaxFields(); if (EditorGUI.EndChangeCheck()) { settings.SetSpeedMinMax(m_Vector2Floats); } EditorGUIUtility.labelWidth = 0f; if (additionalSettingsGui != null) { EditorGUILayout.Space(k_HeaderSpacing); additionalSettingsGui(m_SceneView); } if (Event.current.type == EventType.Repaint) { m_WindowSize.y = Math.Min(GUILayoutUtility.GetLastRect().yMax + kContentPadding, kWindowHeight * 3); } GUILayout.EndVertical(); GUILayout.EndScrollView(); }
/// <summary> /// Метод обрабатывающий лучи добра, посланные в окно SceveView /// </summary> /// <param name="sceneView"></param> /// <param name="hitInfo">Объект, до которого дотронулись лучи добра</param> private void OnRaycast(SceneView sceneView, RaycastHit hitInfo) { Vector3 cameraPoint = sceneView.camera.transform.position + sceneView.camera.transform.forward + sceneView.camera.transform.right; Quaternion startRot = Quaternion.LookRotation(hitInfo.normal); if (windowGUI.consoleMode) { Handles.color = textColor; Handles.Label(hitInfo.collider.transform.position, new GUIContent(Utils.ToString(hitInfo.collider.transform.position))); Handles.Label(hitInfo.point, new GUIContent("\n"+Utils.ToString(hitInfo.normal)+"\n"+Utils.ToString(hitInfo.barycentricCoordinate))); Handles.Label(hitInfo.point, Utils.ToString(startRot)); } switch (currentMode) { case EEditorMode.ModeDelete: OnCleanGenerateObjects(); Handles.color = designDeleteColor; Handles.CircleCap(0, hitInfo.point, startRot, windowGUI.brushSize); Handles.CircleCap(2, hitInfo.point, startRot, windowGUI.brushSize*0.9f); Handles.CircleCap(3, hitInfo.point, startRot, windowGUI.brushSize*0.8f); if (deleteModeOn) foreach (AutoGen obj in UnityEngine.Object.FindObjectsOfType<AutoGen>()) if (Vector3.Distance(obj.transform.position, hitInfo.point) <= windowGUI.brushSize) DestroyImmediate(obj.gameObject); break; case EEditorMode.ModeAdd: if (windowGUI.PrefabObject!=null) { if (tmpData.Count != windowGUI.brushSensitivity) { OnGenerateObjects(hitInfo.point, startRot); } else { foreach (TempObject tmp in tmpData) OnSetupSettings(tmp, hitInfo.point, startRot, false); } if (addingModeOn) { OnAddObjectToTerrainData(); addingModeOn=false; } } if(Event.current.shift) Handles.color = designPickColor; else Handles.color = designAddColor; break; case EEditorMode.ModePick: Handles.color = designPickColor; Handles.DotCap(0, hitInfo.collider.bounds.center, startRot, 0.2f); // рисуем центр выбранного объекта if (selectModeOn) { // если надо захватить объект selection = hitInfo.collider.gameObject; doPickUpObject(); this.Repaint(); selectModeOn=false; } break; } Handles.DrawLine(hitInfo.point, cameraPoint); // рисуем разметку кисточки Handles.color = designToolsColor; Handles.DrawLine(hitInfo.point, hitInfo.point + (startRot * new Vector3(-windowGUI.brushSize, 0, 0))); Handles.DrawLine(hitInfo.point, hitInfo.point + (startRot * new Vector3(windowGUI.brushSize, 0, 0))); Handles.DrawLine(hitInfo.point, hitInfo.point + (startRot * new Vector3(0, windowGUI.brushSize, 0))); Handles.DrawLine(hitInfo.point, hitInfo.point + (startRot * new Vector3(0, -windowGUI.brushSize, 0))); // направление нормали Handles.DrawLine(hitInfo.point, hitInfo.point + (startRot * new Vector3(0, 0, windowGUI.brushSize*0.2f))); sceneView.Repaint(); }
static void OnSceneGUI(SceneView sceneview) { Event e = Event.current; if (isPainting) { switch(e.type){ case EventType.MouseDown: window.Paint(); e.Use(); break; case EventType.MouseDrag: window.Paint(); HandleUtility.Repaint(); e.Use(); break; case EventType.MouseUp: window.CreatePoly(); break; } } HandleUtility.AddDefaultControl(GUIUtility.GetControlID (painterHash, FocusType.Passive)); window.DrawHandles(); HandleUtility.Repaint(); sceneview.Repaint(); }
public static void DoViewTool(SceneView view) { Event current = Event.current; int viewToolId = SceneViewMotion.s_ViewToolID; EventType typeForControl = current.GetTypeForControl(viewToolId); if ((bool) ((Object) view) && Tools.s_LockedViewTool == ViewTool.FPS) view.FixNegativeSize(); switch (typeForControl) { case EventType.MouseDown: SceneViewMotion.HandleMouseDown(view, viewToolId, current.button); break; case EventType.MouseUp: SceneViewMotion.HandleMouseUp(view, viewToolId, current.button, current.clickCount); break; case EventType.MouseDrag: SceneViewMotion.HandleMouseDrag(view, viewToolId); break; case EventType.KeyDown: SceneViewMotion.HandleKeyDown(view); break; case EventType.KeyUp: SceneViewMotion.HandleKeyUp(); break; case EventType.ScrollWheel: SceneViewMotion.HandleScrollWheel(view, !current.alt); break; case EventType.Layout: Vector3 movementDirection = SceneViewMotion.GetMovementDirection(); if (GUIUtility.hotControl != viewToolId || (double) movementDirection.sqrMagnitude == 0.0) break; view.pivot = view.pivot + view.rotation * movementDirection; view.Repaint(); break; } }
public static void ArrowKeys(SceneView sv) { Event current = Event.current; int controlId = GUIUtility.GetControlID(FocusType.Passive); if (GUIUtility.hotControl != 0 && GUIUtility.hotControl != controlId || EditorGUI.actionKey) return; switch (current.GetTypeForControl(controlId)) { case EventType.KeyDown: switch (current.keyCode) { case KeyCode.UpArrow: sv.viewIsLockedToObject = false; if (sv.m_Ortho.value) SceneViewMotion.s_Motion.y = 1f; else SceneViewMotion.s_Motion.z = 1f; GUIUtility.hotControl = controlId; current.Use(); return; case KeyCode.DownArrow: sv.viewIsLockedToObject = false; if (sv.m_Ortho.value) SceneViewMotion.s_Motion.y = -1f; else SceneViewMotion.s_Motion.z = -1f; GUIUtility.hotControl = controlId; current.Use(); return; case KeyCode.RightArrow: sv.viewIsLockedToObject = false; SceneViewMotion.s_Motion.x = 1f; GUIUtility.hotControl = controlId; current.Use(); return; case KeyCode.LeftArrow: sv.viewIsLockedToObject = false; SceneViewMotion.s_Motion.x = -1f; GUIUtility.hotControl = controlId; current.Use(); return; default: return; } case EventType.KeyUp: if (GUIUtility.hotControl != controlId) break; switch (current.keyCode) { case KeyCode.UpArrow: case KeyCode.DownArrow: SceneViewMotion.s_Motion.z = 0.0f; SceneViewMotion.s_Motion.y = 0.0f; current.Use(); return; case KeyCode.RightArrow: case KeyCode.LeftArrow: SceneViewMotion.s_Motion.x = 0.0f; current.Use(); return; default: return; } case EventType.Layout: if (GUIUtility.hotControl != controlId) break; Vector3 forward; if (!sv.m_Ortho.value) { forward = Camera.current.transform.forward + Camera.current.transform.up * 0.3f; forward.y = 0.0f; forward.Normalize(); } else forward = Camera.current.transform.forward; Vector3 movementDirection = SceneViewMotion.GetMovementDirection(); sv.LookAtDirect(sv.pivot + Quaternion.LookRotation(forward) * movementDirection, sv.rotation); if ((double) SceneViewMotion.s_Motion.sqrMagnitude == 0.0) { sv.pivot = sv.pivot; SceneViewMotion.s_FlySpeed = 0.0f; GUIUtility.hotControl = 0; break; } sv.Repaint(); break; } }
void OnSceneGUI(SceneView sceneView) { deltaTime = EditorApplication.timeSinceStartup - lastTime; lastTime = EditorApplication.timeSinceStartup; if (jobs.Length == 0 && Selection.activeGameObject != null) { InitMeshes(); } if (!enabled || jobs.Length == 0 || Selection.activeGameObject == null) { return; } if (tab == Tab.Bake) { return; } if (VertexInstanceStream.vertexShaderMat != null) { VertexInstanceStream.vertexShaderMat.SetFloat("_time", (float)EditorApplication.timeSinceStartup); } RaycastHit hit; float distance = float.MaxValue; Vector3 mousePosition = Event.current.mousePosition; mousePosition.y = sceneView.camera.pixelHeight - mousePosition.y; Vector3 fakeMP = mousePosition; fakeMP.z = 20; Vector3 point = sceneView.camera.ScreenToWorldPoint(fakeMP); Vector3 normal = Vector3.forward; Ray ray = sceneView.camera.ScreenPointToRay(mousePosition); bool registerUndo = (Event.current.type == EventType.MouseDown && Event.current.button == 0 && Event.current.alt == false); bool toggleWireframe = (Event.current.type == EventType.KeyUp && Event.current.control); for (int i = 0; i < jobs.Length; ++i) { if (jobs[i] == null || jobs[i].meshFilter == null) continue; // Early out if we're not in the area.. Bounds b = jobs[i].renderer.bounds; b.Expand(brushSize*2); if (!b.IntersectRay(ray)) { continue; } if (registerUndo) { painting = true; // clear job edits for (int x = 0; x < jobEdits.Length; ++x) { jobEdits[x] = false; } } if (toggleWireframe) { EditorUtility.SetSelectedWireframeHidden(jobs[i].renderer, hideMeshWireframe); } Matrix4x4 mtx = jobs[i].meshFilter.transform.localToWorldMatrix; Mesh msh = jobs[i].meshFilter.sharedMesh; if (jobs[i].HasStream()) { msh = jobs[i].stream.GetModifierMesh(); if (msh == null) { msh = jobs[i].meshFilter.sharedMesh; } } if (RXLookingGlass.IntersectRayMesh(ray, msh, mtx, out hit)) { if (Event.current.shift == false) { if (hit.distance < distance) { distance = hit.distance; point = hit.point; oldpos = hit.point; normal = hit.normal; // if we don't have normal overrides, we have to recast against the shared mesh to get it's normal // This could get a little strange if you modify the mesh, then delete the normal data, but in that // case there's no real correct answer anyway without knowing the index of the vertex we're hitting. if (normal.magnitude < 0.1f) { RXLookingGlass.IntersectRayMesh(ray, jobs[i].meshFilter.sharedMesh, mtx, out hit); normal = hit.normal; } } } else { point = oldpos; } } else { if (Event.current.shift == true) { point = oldpos; } } } if (Event.current.type == EventType.KeyUp && Event.current.control && Event.current.keyCode == KeyCode.V) { showVertexShader = !showVertexShader; UpdateDisplayMode(); } strokeDir = Vector3.zero; if (tab == Tab.Flow || vertexMode == VertexMode.Smear) { if (Event.current.isMouse) { strokeDir = (point - oldMousePosition); strokeDir.x *= Event.current.delta.magnitude; strokeDir.y *= Event.current.delta.magnitude; strokeDir.z *= Event.current.delta.magnitude; oldMousePosition = point; } } else if (vertexMode == VertexMode.Adjust) { strokeDir = -sceneView.camera.transform.forward; } if (Event.current.type == EventType.MouseMove && Event.current.shift) { brushSize += Event.current.delta.x * (float)deltaTime * 6.0f; brushFalloff -= Event.current.delta.y * (float)deltaTime * 48.0f; } if (Event.current.rawType == EventType.MouseUp) { EndStroke(); } if (Event.current.type == EventType.MouseMove && Event.current.alt) { brushSize += Event.current.delta.y * (float)deltaTime; } // set brush color if (tab == Tab.Custom && customBrush != null) { Handles.color = customBrush.GetPreviewColor(); } else if (brushMode == BrushTarget.Color || brushMode == BrushTarget.UV0_AsColor || brushMode == BrushTarget.UV1_AsColor || brushMode == BrushTarget.UV2_AsColor || brushMode == BrushTarget.UV3_AsColor) { Handles.color = new Color(brushColor.r, brushColor.g, brushColor.b, 0.4f); } else if (brushMode == BrushTarget.ValueR || brushMode == BrushTarget.ValueG || brushMode == BrushTarget.ValueB || brushMode == BrushTarget.ValueA) { float v = (float)brushValue / 255.0f; Handles.color = new Color(v, v, v, 0.4f); } else { float v = (floatBrushValue - uvVisualizationRange.x) / Mathf.Max(0.00001f, uvVisualizationRange.y); Handles.color = new Color(v, v, v, 0.4f); } if (brushVisualization == BrushVisualization.Sphere) { Handles.SphereCap(0, point, Quaternion.identity, brushSize * 2); } else { Handles.color = new Color(0.8f, 0, 0, 1.0f); float r = Mathf.Pow(0.5f, brushFalloff); Handles.DrawWireDisc(point, normal, brushSize * r); Handles.color = new Color(0.9f, 0, 0, 0.8f); Handles.DrawWireDisc(point, normal, brushSize); } // eat current event if mouse event and we're painting if (Event.current.isMouse && painting) { Event.current.Use(); } if (Event.current.type == EventType.Layout) { HandleUtility.AddDefaultControl(GUIUtility.GetControlID(GetHashCode(), FocusType.Passive)); } // only paint once per frame if (tab != Tab.Flow && Event.current.type != EventType.Repaint) { return; } if (jobs.Length > 0 && painting) { var lerper = GetLerper(); var value = GetBrushValue(); for (int i = 0; i < jobs.Length; ++i) { Bounds b = jobs[i].renderer.bounds; b.Expand(brushSize*2); if (!b.IntersectRay(ray)) { continue; } if (jobEdits[i] == false) { jobEdits[i] = true; Undo.RegisterCompleteObjectUndo(jobs[i].stream, "Vertex Painter Stroke"); } PaintMesh(jobs[i], point, lerper, value); Undo.RecordObject(jobs[i].stream, "Vertex Painter Stroke"); } } if (jobs.Length > 0 && showVertexPoints) { for (int i = 0; i < jobs.Length; ++i) { DrawVertexPoints(jobs[i], point); } } // update views sceneView.Repaint(); HandleUtility.Repaint(); }
static void PasteSettings(SceneView view) { view.cameraSettings = Clipboard.GetCustomValue <SceneView.CameraSettings>(); view.Repaint(); }
static void ResetSettings(SceneView view) { view.ResetCameraSettings(); view.Repaint(); }
// CURSOR KEYS public static void ArrowKeys(SceneView sv) { Event evt = Event.current; int id = GUIUtility.GetControlID(FocusType.Passive); if (GUIUtility.hotControl == 0 || GUIUtility.hotControl == id) { if (EditorGUI.actionKey) { return; } switch (evt.GetTypeForControl(id)) { case EventType.KeyDown: switch (evt.keyCode) { case KeyCode.UpArrow: sv.viewIsLockedToObject = false; if (sv.m_Ortho.value) { s_Motion.y = 1; } else { s_Motion.z = 1; } GUIUtility.hotControl = id; evt.Use(); break; case KeyCode.DownArrow: sv.viewIsLockedToObject = false; if (sv.m_Ortho.value) { s_Motion.y = -1; } else { s_Motion.z = -1; } GUIUtility.hotControl = id; evt.Use(); break; case KeyCode.LeftArrow: sv.viewIsLockedToObject = false; s_Motion.x = -1; GUIUtility.hotControl = id; evt.Use(); break; case KeyCode.RightArrow: sv.viewIsLockedToObject = false; s_Motion.x = 1; GUIUtility.hotControl = id; evt.Use(); break; } break; case EventType.KeyUp: if (GUIUtility.hotControl == id) { switch (evt.keyCode) { case KeyCode.UpArrow: case KeyCode.DownArrow: s_Motion.z = 0; s_Motion.y = 0; evt.Use(); break; case KeyCode.LeftArrow: case KeyCode.RightArrow: s_Motion.x = 0; evt.Use(); break; } } break; case EventType.Layout: if (GUIUtility.hotControl == id) { Vector3 fwd; if (!sv.m_Ortho.value) { fwd = Camera.current.transform.forward + Camera.current.transform.up * .3f; fwd.y = 0; fwd.Normalize(); } else { fwd = Camera.current.transform.forward; } Vector3 motion = GetMovementDirection(); sv.LookAtDirect(sv.pivot + Quaternion.LookRotation(fwd) * motion, sv.rotation); // If we're done, stop animating if (s_Motion.sqrMagnitude == 0) { sv.pivot = sv.pivot; s_FlySpeed = 0; GUIUtility.hotControl = 0; } else { sv.Repaint(); } } break; } } }
private void OnSceneGUI(SceneView sceneView) { HandleSnapping(); if (repaintScene) { sceneView.Repaint(); repaintScene = false; } KeyCheck(); //if (snappingOverride) // sceneView.Focus(); if (!sceneView.camera.isOrthoGraphic) return; Vector3 facingDirection = sceneView.camera.transform.forward; axis = (Mathf.Approximately(Mathf.Abs(facingDirection.x), 1)) ? Axis.X : (Mathf.Approximately(Mathf.Abs(facingDirection.y), 1)) ? Axis.Y : (Mathf.Approximately(Mathf.Abs(facingDirection.z), 1)) ? Axis.Z : Axis.None; Color majorColour = (axis == Axis.X) ? settings.xColourMajor : (axis == Axis.Y) ? settings.yColourMajor : (axis == Axis.Z) ? settings.zColourMajor : Color.white; Color minorColour = (axis == Axis.X) ? settings.xColourMinor : (axis == Axis.Y) ? settings.yColourMinor : (axis == Axis.Z) ? settings.zColourMinor : Color.white; if (settings.DrawGrid && axis != Axis.None) { DrawGrid(sceneView.camera, settings.MinorGridSize, minorColour); if(settings.IsMajorGridEnabled) DrawGrid(sceneView.camera, Mul(settings.MajorGridSize, settings.MinorGridSize), majorColour, true); } }
public static void DoViewTool(SceneView view) { Init(); s_CurrentSceneView = view; // If a SceneView is currently taking input, don't let other views accept input if (s_ActiveSceneView != null && s_CurrentSceneView != s_ActiveSceneView) { return; } Event evt = Event.current; // Ensure we always call the GetControlID the same number of times int id = s_ViewToolID; EventType eventType = evt.GetTypeForControl(id); // In FPS mode we update the pivot for Orbit mode (see below and inside HandleMouseDrag) if (view && Tools.s_LockedViewTool == ViewTool.FPS) { view.FixNegativeSize(); } using (var inputSamplingScope = new CameraFlyModeContext.InputSamplingScope(s_CameraFlyModeContext, Tools.s_LockedViewTool, id, view, view.orthographic)) { if (inputSamplingScope.currentlyMoving) { view.viewIsLockedToObject = false; } s_Motion = inputSamplingScope.currentInputVector; } switch (eventType) { case EventType.ScrollWheel: HandleScrollWheel(view, view.in2DMode == evt.alt); break; // Default to zooming to mouse position in 2D mode without alt case EventType.MouseDown: HandleMouseDown(view, id, evt.button); break; case EventType.KeyUp: case EventType.MouseUp: HandleMouseUp(view, id, evt.button, evt.clickCount); break; case EventType.KeyDown: HandleKeyDown(view, id); break; case EventType.MouseMove: case EventType.MouseDrag: HandleMouseDrag(view, id); break; case EventType.Layout: if (GUIUtility.hotControl == id || s_FlySpeed.isAnimating || s_Moving) { view.pivot = view.pivot + view.rotation * GetMovementDirection(); view.Repaint(); } break; case EventType.Used: // since FPS tool acts on right click, nothing prevents a regular control // from taking the control ID on left click, so some cleanup is necessary // to not get locked into FPS mode (case 777346) if (GUIUtility.hotControl != id && s_CurrentState != MotionState.kInactive) { ResetDragState(); } break; } if (s_CurrentState == MotionState.kDragging && evt.type == EventType.Repaint) { HandleMouseDrag(view, id); } if (shortcutKey != KeyCode.None) { GUIUtility.hotControl = s_ViewToolID; } }
void OnSceneGUI(SceneView sceneView) { deltaTime = EditorApplication.timeSinceStartup - lastTime; lastTime = EditorApplication.timeSinceStartup; if (jobs.Length == 0 && Selection.activeGameObject != null) { InitMeshes(); } if (!enabled || jobs.Length == 0 || Selection.activeGameObject == null) { return; } if (tab == Tab.Bake) { return; } if (VertexInstanceStream.vertexShaderMat != null) { VertexInstanceStream.vertexShaderMat.SetFloat("_time", (float)EditorApplication.timeSinceStartup); } RaycastHit hit; float distance = float.MaxValue; Vector3 mousePosition = Event.current.mousePosition; mousePosition.y = sceneView.camera.pixelHeight - mousePosition.y; Vector3 fakeMP = mousePosition; fakeMP.z = 20; Vector3 point = sceneView.camera.ScreenToWorldPoint(fakeMP); Vector3 normal = Vector3.forward; Ray ray = sceneView.camera.ScreenPointToRay(mousePosition); for (int i = 0; i < jobs.Length; ++i) { if (jobs[i] == null || jobs[i].meshFilter == null) continue; Matrix4x4 mtx = jobs[i].meshFilter.transform.localToWorldMatrix; Mesh msh = jobs[i].meshFilter.sharedMesh; if (jobs[i].HasStream()) { msh = jobs[i].stream.GetModifierMesh(); if (msh == null) { msh = jobs[i].meshFilter.sharedMesh; } } if (RXLookingGlass.IntersectRayMesh(ray, msh, mtx, out hit)) { if (hit.distance < distance) { distance = hit.distance; point = hit.point; normal = hit.normal; } } } strokeDir = Vector3.zero; if (tab == Tab.Flow || vertexMode == VertexMode.Smear) { if (Event.current.isMouse) { strokeDir = (point - oldMousePosition); strokeDir.x *= Event.current.delta.magnitude; strokeDir.y *= Event.current.delta.magnitude; strokeDir.z *= Event.current.delta.magnitude; oldMousePosition = point; } } else if (vertexMode == VertexMode.Adjust) { strokeDir = -sceneView.camera.transform.forward; } if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && Event.current.alt == false) { painting = true; for (int i = 0; i < jobs.Length; ++i) { Undo.RegisterCompleteObjectUndo(jobs[i].stream, "Vertex Painter Stroke"); } } if (Event.current.rawType == EventType.MouseUp) { EndStroke(); } if (Event.current.type == EventType.MouseMove && Event.current.alt) { brushSize += Event.current.delta.y * (float)deltaTime; } // set brush color if (brushMode == BrushTarget.Color) { Handles.color = new Color(brushColor.r, brushColor.g, brushColor.b, 0.4f); } else if (brushMode == BrushTarget.ValueR || brushMode == BrushTarget.ValueG || brushMode == BrushTarget.ValueB || brushMode == BrushTarget.ValueA) { float v = (float)brushValue / 255.0f; Handles.color = new Color(v, v, v, 0.4f); } else { float v = (floatBrushValue - uvVisualizationRange.x) / Mathf.Max(0.00001f, uvVisualizationRange.y); Handles.color = new Color(v, v, v, 0.4f); } if (tab != Tab.Deform) { Handles.SphereCap(0, point, Quaternion.identity, brushSize * 2); } else { Handles.color = new Color(0.8f, 0, 0, 1.0f); float r = Mathf.Pow(0.5f, brushFalloff); Handles.DrawWireDisc(point, normal, brushSize * 2 * r); Handles.color = new Color(0.9f, 0, 0, 0.8f); Handles.DrawWireDisc(point, normal, brushSize * 2); } // eat current event if mouse event and we're painting if (Event.current.isMouse && painting) { Event.current.Use(); } if (Event.current.type == EventType.Layout) { HandleUtility.AddDefaultControl(GUIUtility.GetControlID(GetHashCode(), FocusType.Passive)); } // only paint once per frame if (tab != Tab.Flow && Event.current.type != EventType.Repaint) { return; } if (jobs.Length > 0 && painting) { for (int i = 0; i < jobs.Length; ++i) { PaintMesh(jobs[i], point); Undo.RecordObject(jobs[i].stream, "Vertex Painter Stroke"); } } // update views sceneView.Repaint(); HandleUtility.Repaint(); }
private void Draw(Rect rect) { var settings = m_SceneView.cameraSettings; Styles.Init(); const int k_SettingsIconPad = 2; Vector2 settingsSize = EditorStyles.iconButton.CalcSize(EditorGUI.GUIContents.titleSettingsIcon); Rect settingsRect = new Rect(rect.xMax - Styles.settingsArea.padding.right - k_SettingsIconPad - settingsSize.x, Styles.settingsArea.padding.top + k_SettingsIconPad, settingsSize.x, settingsSize.y); if (GUI.Button(settingsRect, EditorGUI.GUIContents.titleSettingsIcon, EditorStyles.iconButton)) { ShowContextMenu(); } GUILayout.BeginArea(rect, Styles.settingsArea); EditorGUI.BeginChangeCheck(); EditorGUIUtility.labelWidth = kPrefixLabelWidth; GUILayout.Label(EditorGUIUtility.TrTextContent("Scene Camera"), EditorStyles.boldLabel); // fov isn't applicable in orthographic mode, and orthographic size is controlled by the user zoom using (new EditorGUI.DisabledScope(m_SceneView.orthographic)) { settings.fieldOfView = EditorGUILayout.Slider(m_FieldOfView, settings.fieldOfView, 4f, 179f); } settings.dynamicClip = EditorGUILayout.Toggle(m_DynamicClip, settings.dynamicClip); using (new EditorGUI.DisabledScope(settings.dynamicClip)) { float near = settings.nearClip, far = settings.farClip; DrawClipPlanesField(EditorGUI.s_ClipingPlanesLabel, ref near, ref far, EditorGUI.kNearFarLabelsWidth); settings.nearClip = near; settings.farClip = far; settings.nearClip = Mathf.Max(kNearClipMin, settings.nearClip); if (settings.nearClip > settings.farClip) { settings.farClip = settings.nearClip + kNearClipMin; } } settings.occlusionCulling = EditorGUILayout.Toggle(m_OcclusionCulling, settings.occlusionCulling); if (EditorGUI.EndChangeCheck()) { m_SceneView.Repaint(); } GUILayout.Label(EditorGUIUtility.TrTextContent("Navigation"), EditorStyles.boldLabel); settings.easingEnabled = EditorGUILayout.Toggle(m_EasingEnabled, settings.easingEnabled); settings.accelerationEnabled = EditorGUILayout.Toggle(m_AccelerationEnabled, settings.accelerationEnabled); settings.speed = EditorGUILayout.Slider(m_CameraSpeedSliderContent, settings.speed, settings.speedMin, settings.speedMax); EditorGUI.BeginChangeCheck(); m_Vector2Floats[0] = settings.speedMin; m_Vector2Floats[1] = settings.speedMax; DrawSpeedMinMaxFields(); if (EditorGUI.EndChangeCheck()) { settings.SetSpeedMinMax(m_Vector2Floats); } EditorGUIUtility.labelWidth = 0f; GUILayout.EndArea(); }
public static void DoViewTool(SceneView view) { Event current = Event.current; int controlID = s_ViewToolID; EventType typeForControl = current.GetTypeForControl(controlID); if ((view != null) && (Tools.s_LockedViewTool == ViewTool.FPS)) { view.FixNegativeSize(); } switch (typeForControl) { case EventType.MouseDown: HandleMouseDown(view, controlID, current.button); break; case EventType.MouseUp: HandleMouseUp(view, controlID, current.button, current.clickCount); break; case EventType.MouseDrag: HandleMouseDrag(view, controlID); break; case EventType.KeyDown: HandleKeyDown(view); break; case EventType.KeyUp: HandleKeyUp(); break; case EventType.ScrollWheel: HandleScrollWheel(view, !current.alt); break; case EventType.Layout: { Vector3 movementDirection = GetMovementDirection(); if ((GUIUtility.hotControl == controlID) && (movementDirection.sqrMagnitude != 0f)) { view.pivot += view.rotation * movementDirection; view.Repaint(); } break; } } }
public static void ArrowKeys(SceneView sv) { Event current = Event.current; int controlID = GUIUtility.GetControlID(FocusType.Passive); if (((GUIUtility.hotControl == 0) || (GUIUtility.hotControl == controlID)) && !EditorGUI.actionKey) { EventType typeForControl = current.GetTypeForControl(controlID); if (typeForControl == EventType.KeyDown) { switch (current.keyCode) { case KeyCode.UpArrow: sv.viewIsLockedToObject = false; if (!sv.m_Ortho.value) { s_Motion.z = 1f; } else { s_Motion.y = 1f; } GUIUtility.hotControl = controlID; current.Use(); return; case KeyCode.DownArrow: sv.viewIsLockedToObject = false; if (!sv.m_Ortho.value) { s_Motion.z = -1f; } else { s_Motion.y = -1f; } GUIUtility.hotControl = controlID; current.Use(); return; case KeyCode.RightArrow: sv.viewIsLockedToObject = false; s_Motion.x = 1f; GUIUtility.hotControl = controlID; current.Use(); break; case KeyCode.LeftArrow: sv.viewIsLockedToObject = false; s_Motion.x = -1f; GUIUtility.hotControl = controlID; current.Use(); break; } } else if (typeForControl == EventType.KeyUp) { if (GUIUtility.hotControl == controlID) { switch (current.keyCode) { case KeyCode.UpArrow: case KeyCode.DownArrow: s_Motion.z = 0f; s_Motion.y = 0f; current.Use(); break; case KeyCode.RightArrow: case KeyCode.LeftArrow: s_Motion.x = 0f; current.Use(); break; } } } else if ((typeForControl == EventType.Layout) && (GUIUtility.hotControl == controlID)) { Vector3 forward; if (!sv.m_Ortho.value) { forward = Camera.current.transform.forward + ((Vector3) (Camera.current.transform.up * 0.3f)); forward.y = 0f; forward.Normalize(); } else { forward = Camera.current.transform.forward; } Vector3 movementDirection = GetMovementDirection(); sv.LookAtDirect(sv.pivot + (Quaternion.LookRotation(forward) * movementDirection), sv.rotation); if (s_Motion.sqrMagnitude == 0f) { sv.pivot = sv.pivot; s_FlySpeed = 0f; GUIUtility.hotControl = 0; } else { sv.Repaint(); } } } }
public static void ArrowKeys(SceneView sv) { Event current = Event.current; int controlID = GUIUtility.GetControlID(FocusType.Passive); if (GUIUtility.hotControl == 0 || GUIUtility.hotControl == controlID) { if (!EditorGUI.actionKey) { EventType typeForControl = current.GetTypeForControl(controlID); if (typeForControl != EventType.KeyDown) { if (typeForControl != EventType.KeyUp) { if (typeForControl == EventType.Layout) { if (GUIUtility.hotControl == controlID) { Vector3 forward; if (!sv.m_Ortho.value) { forward = Camera.current.transform.forward + Camera.current.transform.up * 0.3f; forward.y = 0f; forward.Normalize(); } else { forward = Camera.current.transform.forward; } Vector3 movementDirection = SceneViewMotion.GetMovementDirection(); sv.LookAtDirect(sv.pivot + Quaternion.LookRotation(forward) * movementDirection, sv.rotation); if (SceneViewMotion.s_Motion.sqrMagnitude == 0f) { sv.pivot = sv.pivot; SceneViewMotion.s_FlySpeed = 0f; GUIUtility.hotControl = 0; } else { sv.Repaint(); } } } } else if (GUIUtility.hotControl == controlID) { switch (current.keyCode) { case KeyCode.UpArrow: case KeyCode.DownArrow: SceneViewMotion.s_Motion.z = 0f; SceneViewMotion.s_Motion.y = 0f; current.Use(); break; case KeyCode.RightArrow: case KeyCode.LeftArrow: SceneViewMotion.s_Motion.x = 0f; current.Use(); break; } } } else { switch (current.keyCode) { case KeyCode.UpArrow: sv.viewIsLockedToObject = false; if (sv.m_Ortho.value) { SceneViewMotion.s_Motion.y = 1f; } else { SceneViewMotion.s_Motion.z = 1f; } GUIUtility.hotControl = controlID; current.Use(); break; case KeyCode.DownArrow: sv.viewIsLockedToObject = false; if (sv.m_Ortho.value) { SceneViewMotion.s_Motion.y = -1f; } else { SceneViewMotion.s_Motion.z = -1f; } GUIUtility.hotControl = controlID; current.Use(); break; case KeyCode.RightArrow: sv.viewIsLockedToObject = false; SceneViewMotion.s_Motion.x = 1f; GUIUtility.hotControl = controlID; current.Use(); break; case KeyCode.LeftArrow: sv.viewIsLockedToObject = false; SceneViewMotion.s_Motion.x = -1f; GUIUtility.hotControl = controlID; current.Use(); break; } } } } }
void OnSceneGUI(SceneView sceneView) { stroke.Clear(); deltaTime = EditorApplication.timeSinceStartup - lastTime; lastTime = EditorApplication.timeSinceStartup; if (jobs.Length == 0 && Selection.activeGameObject != null) { InitMeshes(); } if (!enabled || jobs.Length == 0 || Selection.activeGameObject == null) return; RaycastHit hit; float distance = float.MaxValue; Vector3 mousePosition = Event.current.mousePosition; mousePosition.y = sceneView.camera.pixelHeight - mousePosition.y; Vector3 fakeMP = mousePosition; fakeMP.z = 20; Vector3 point = sceneView.camera.ScreenToWorldPoint(fakeMP); Ray ray = sceneView.camera.ScreenPointToRay(mousePosition); for (int i = 0; i < jobs.Length; ++i) { if (RXLookingGlass.IntersectRayMesh(ray, jobs[i].meshFilter, out hit)) { stroke.Add(jobs[i]); if (hit.distance < distance) { distance = hit.distance; point = hit.point; } } } if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && Event.current.alt == false) { painting = true; } if (Event.current.type == EventType.MouseUp) { Undo.CollapseUndoOperations(Undo.GetCurrentGroup()); painting = false; } if (Event.current.type == EventType.MouseMove && Event.current.alt) { brushSize += Event.current.delta.y * (float)deltaTime; } if (stroke.Count > 0 && painting) { for (int i = 0; i < stroke.Count; ++i) { Undo.RecordObject(stroke[i].stream, "Vertex Painter Stroke"); PaintMesh(stroke[i], point); } } Handles.color = new Color(0, 0, 1, 0.5f); Handles.SphereCap(0, point, Quaternion.identity, brushSize*2); if (Event.current.isMouse && painting) Event.current.Use (); if (Event.current.type == EventType.layout) HandleUtility.AddDefaultControl(GUIUtility.GetControlID(GetHashCode(), FocusType.Passive)); HandleUtility.Repaint(); sceneView.Repaint(); }