anchor.diff:                      let entity = get entityModel entityLens
                       let entityModelAddress = groupModelAddress @ [Lun.make entity.Name]
                       let entityModelTransform = getEntityModelTransform (Some world_.Camera) entityModel
  -                    let dragState = DragPosition (entityModelTransform.Position + world_.MouseState.MousePosition, world_.MouseState.MousePosition, entityModelAddress)
  +                    let dragState = DragEntityPosition (entityModelTransform.Position + world_.MouseState.MousePosition, world_.MouseState.MousePosition, entityModelAddress)
                       let editorState_ = world_.ExtData :?> EditorState
  -                    let editorState_ = { editorState_ with DragState = dragState }
  +                    let editorState_ = { editorState_ with DragEntityState = dragState }
                       let world_ = { world_ with ExtData = editorState_ }
                       let world_ = pushPastWorld pastWorld world_
                       refWorld := world_ // must be set for property grid
  
positive.code:                     (handle message, world_)
          | _ -> failwith <| "Expected MouseButtonData in message '" + str message + "'."
  
      let endDrag (form : NuEditForm) _ _ message world =
          match message.Data with
          | MouseButtonData (position, _) ->
              if form.interactButton.Checked then (message, world)
              else
                  let editorState_ = world.ExtData :?> EditorState
                  match editorState_.DragState with
                  | DragNone -> (handle message, world)
                  | DragPosition _
                  | DragRotation _ ->
                      let editorState_ = { editorState_ with DragState = DragNone }
                      form.propertyGrid.Refresh ()
                      (handle message, { world with ExtData = editorState_ })
          | _ -> failwith <| "Expected MouseButtonData in message '" + str message + "'."
  
      let updateDrag (form : NuEditForm) world_ =
          let editorState_ = world_.ExtData :?> EditorState
          match editorState_.DragState with
          | DragNone -> world_
          | DragPosition (pickOffset, origMousePosition, address) ->
              let entityModel_ = get world_ <| worldEntityModelLens address
              let transform_ = getEntityModelTransform (Some world_.Camera) entityModel_
              let transform_ = { transform_ with Position = (pickOffset - origMousePosition) + (world_.MouseState.MousePosition - origMousePosition) }
              let (positionSnap, rotationSnap) = getSnaps form
              let entityModel_ = setEntityModelTransform (Some world_.Camera) positionSnap rotationSnap transform_ entityModel_
              let world_ = set entityModel_ world_ <| worldEntityModelLens address
              let editorState_ = { editorState_ with DragState = DragPosition (pickOffset, origMousePosition, address) }
              let world_ = { world_ with ExtData = editorState_ }
              let world_ = propagateEntityModelPhysics address entityModel_ world_
              form.propertyGrid.Refresh ()
              world_
          | DragRotation (pickOffset, origPosition, address) -> world_
  
      /// Needed for physics system side-effects...
      let physicsHack world_ =
  
negative.code: 
  type WorldChangers = WorldChanger List
  
  type DragEntityState =
      | DragEntityNone
      | DragEntityPosition of Vector2 * Vector2 * Address
      | DragEntityRotation of Vector2 * Vector2 * Address
  
  type DragCameraState =
      | DragCameraNone
      | DragCameraPosition of Vector2 * Vector2
  
  type EditorState =
      { DragEntityState : DragEntityState
        DragCameraState : DragCameraState
        PastWorlds : World list
        FutureWorlds : World list
        Clipboard : (EntityModel option) ref }
  