Undo-ing in a non-modal dialog

I'm developing a graphical engineering application for desktop environments. As of today the application uses mostly non-modal dialogs that immediately commit the changes to the selected object. So the user can see the effects of the changes he made. In some cases it would be helpful if the user could undo these changes.

I'm seeking advice on how to best implement this from a UX point of view.

My ideas so far:

  1. Add a "reset" button that replaces the current state with a saved state? But what point in time should be considered the last "correct" state?
  2. Use the application's undo functionality? Every applied state of the dialog could be saved to the undo queue. But that doesn't seem to be very obvious to the user because he'd have to jump out of the dialog to perform that undo.
  3. Add a "cancel" button that restores the state of the objects when the dialog was opened and closes the dialog? This would be very similar to a modal dialog. So:
  4. Forget the idea of non-modal dialogs when rolling back complex changes is required?

Personally I'm leaning toward option 1 and use the object's state when it was selected as the good state.