/// <summary> /// Process mouse drag and hover events and draw velocity vectors if enabled /// </summary> private void ProcessVelocityArrows() { if (!_simControl.SceneElementsDisplayParameters.DrawVelocityVectors) { return; } Vector3d velocity = new Vector3d(); Vector3 hpos = new Vector3(); Vector3 pos = new Vector3(); for (int i = 0; i < _bodies.Length; i++) { if (_bodies[i].isActiveAndEnabled) { velocity = _simControl.SceneElementsDisplayParameters.EditGlobalVelocity ? _bodies[i].Velocity : _bodies[i].RelativeVelocity; pos = (Vector3)(_bodies[i].Position + velocity * _simControl.SceneElementsDisplayParameters.VelocitiesArrowsScale); Handles.CapFunction capFunc; switch (_simControl.SceneElementsDisplayParameters.VelocityHandlerType) { case VelocityHandlerType.Circle: capFunc = Handles.CircleHandleCap; break; case VelocityHandlerType.Sphere: capFunc = Handles.SphereHandleCap; break; case VelocityHandlerType.Dot: capFunc = Handles.DotHandleCap; break; default: continue; } Handles.color = Color.white; hpos = Handles.FreeMoveHandle(pos, Quaternion.identity, _simControl.SceneElementsDisplayParameters.HandleScale * HandleUtility.GetHandleSize(pos), Vector3.zero, capFunc); if (pos != hpos) { // Project onto orbit plane. if (_bodies[i].AttractorRef != null && !_simControl.SceneElementsDisplayParameters.EditGlobalVelocity && (_simControl.SceneElementsDisplayParameters.KeepOrbitPlaneWhileChangeVelocity || _simControl.KeepBodiesOnEclipticPlane)) { Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); hpos = CelestialBodyUtils.GetRayPlaneIntersectionPoint((Vector3)_bodies[i].Position, (Vector3)_bodies[i].OrbitData.OrbitNormal, ray.origin, ray.direction); } velocity = (new Vector3d(hpos) - _bodies[i].Position) / _simControl.SceneElementsDisplayParameters.VelocitiesArrowsScale; Undo.RecordObject(_bodies[i], "Velocity change"); if (_simControl.SceneElementsDisplayParameters.EditGlobalVelocity) { _bodies[i].Velocity = velocity; } else { _bodies[i].RelativeVelocity = velocity; } _bodies[i].OrbitData.IsDirty = true; if (_simControl.SceneElementsDisplayParameters.SelectBodyWhenDraggingVelocity) { Selection.activeGameObject = _bodies[i].gameObject; } } } } ShowAllVelocitiesVectors(); }