示例#1
0
        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;
            }
        }
示例#2
0
 void OnPrefabStageDirtinessChanged(PrefabStage prefabStage)
 {
     if (m_SceneView.customScene == prefabStage.scene)
     {
         m_SceneView.Repaint();
     }
 }
示例#3
0
        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();
            }
        }
示例#4
0
 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();
     }
 }
示例#5
0
        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;
            }
        }
示例#6
0
        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();
            }
        }
示例#7
0
        // 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;
            }
        }
示例#12
0
	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();
				}
			}
		}
	}
示例#13
0
        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();
        }
示例#14
0
        /// <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();
 }
示例#21
0
        // 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;
                }
            }
        }
示例#22
0
        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();
      }
		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();
			}
		}
示例#26
0
        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();
                    }
                }
            }
        }
示例#29
0
        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();
        }