/*
* Copyright (c) 2009 Stanford University, School of Medicine All rights reserved.
*
* STANFORD ACADEMIC SOFTWARE LICENSE AGREEMENT
* FOR AngioLocalize SOURCE CODE:
*
* 1.  This is a legal agreement between you, RECIPIENT, and STANFORD UNIVERSITY.
*       By accepting, receiving, and using AngioLocalize.including any accompanying information, materials or
*       manuals (Program), you are agreeing to be bound by the terms of this Agreement.
*       If you do not agree to the terms of this Agreement, promptly return the Program to the STANFORD.

* 2.  STANFORD grants to RECIPIENT a royalty-free, nonexclusive, and nontransferable license to use the Program
*       and accompanying source code furnished hereunder, upon the terms and conditions set out below.
*       documentation and/or other materials provided with the distribution.
* 3.  RECIPIENT acknowledges that the Program is a research tool still in the development stage and that
*       it is being supplied as is, without any accompanying services, support or improvements from STANFORD.
* 4.  RECIPIENT agrees to use the Program solely for internal non-commercial purposes.
* 5.  RECIPIENT may create derivatives and further transfer the Program under the following terms and conditions:
*        A) Recipient agrees to not commercially exploit the Program and agrees all uses will be for non-commercial purposes; and,
*        B) Recipient may not mark any derivatives with the title of Program and may not to use iPad mark for any derivatives; and,
*        C) Recipient agrees to mark and acknowledge all derivatives as follows: "This is a derivative work based on AngioLocalize:
*           Frameless AVM localization with 2D Digital Subtraction Angiography (DSA) and 3D Rotational Angiography (DRA) Images developed
*           by Dimitre Hristov, Lina Liu.
*        D) Recipient agrees to make all improvements, enhancements and derivatives available under
*           similar terms and conditions to the research community.
* 6.   RECIPIENT warrants that RECIPIENT will not remove or export any part of the software or Program from the United
*       States except in full compliance with all United States and other applicable laws and regulations.
* 7.  RECIPIENT will use the Program in compliance with all applicable laws, policies and regulations including, but not
*       limited to, any approvals, informed consent and patient confidentiality principles.
* 8.   RECIPIENT will indemnify, hold harmless, and defend Stanford against any claim of any kind arising out of or
*       related to the exercise of any rights granted under this Agreement or the breach of this Agreement by RECIPIENT.
* 9.  Title and copyright to the Program and any associated documentation shall at all times remain with STANFORD,
*       and RECIPIENT agrees to preserve same.
*/
//----------------------------------------------------------------------------------
//! The ML module class AngioTransformEdit.
/*!
// \file    mlAngioTransformEdit.h
// \author  linaliu
// \date    2009-12-09
//
//
*/
//----------------------------------------------------------------------------------


#ifndef __mlAngioTransformEdit_H
#define __mlAngioTransformEdit_H


// Local includes
#include "STUAngioTransformEditSystem.h"

// ML includes
#include "mlOperatorIncludes.h"
#include "mlRotation.h"

ML_START_NAMESPACE

#define  PI  3.1415926
//!
class STUANGIOTRANSFORMEDIT_EXPORT AngioTransformEdit : public BaseOp
{
public:

  //! Constructor.
  AngioTransformEdit ();

  inline Vec3fField  &getTranslationFld()      const { return *_translationFld; }
  inline Vec3fField  &getRotationFld()         const { return *_rotationFld; }

  inline NotifyField  &getAddxtranslationFld()      const { return *_addxtranslationFld; }
  inline NotifyField  &getAddytranslationFld()      const { return *_addytranslationFld; }
  inline NotifyField  &getAddztranslationFld()      const { return *_addztranslationFld; }

  inline NotifyField  &getSubxtranslationFld()      const { return *_subxtranslationFld; }
  inline NotifyField  &getSubytranslationFld()      const { return *_subytranslationFld; }
  inline NotifyField  &getSubztranslationFld()      const { return *_subztranslationFld; }

  inline NotifyField  &getAddxrotationFld()      const { return *_addxrotationFld; }
  inline NotifyField  &getAddyrotationFld()      const { return *_addyrotationFld; }
  inline NotifyField  &getAddzrotationFld()      const { return *_addzrotationFld; }

  inline NotifyField  &getSubxrotationFld()      const { return *_subxrotationFld; }
  inline NotifyField  &getSubyrotationFld()      const { return *_subyrotationFld; }
  inline NotifyField  &getSubzrotationFld()      const { return *_subzrotationFld; }

  inline DoubleField  &getRotationxincreFld()  const {return *_rotationxincreFld; }
  inline DoubleField  &getRotationyincreFld()  const {return *_rotationyincreFld; }
  inline DoubleField  &getRotationzincreFld()  const {return *_rotationzincreFld; }

  inline DoubleField  &getTransxincreFld()  const {return *_transxincreFld; }
  inline DoubleField  &getTransyincreFld()  const {return *_transyincreFld; }
  inline DoubleField  &getTranszinceFld()  const {return *_transzincreFld; }


private:

   //! The translation offset value; default is (0,0,0).
  Vec3fField    *_translationFld;

  Vec3fField    *_rotationFld;

  NotifyField   *_addxtranslationFld;
  NotifyField   *_addytranslationFld;
  NotifyField   *_addztranslationFld;

  NotifyField   *_subxtranslationFld;
  NotifyField   *_subytranslationFld;
  NotifyField   *_subztranslationFld;


  NotifyField   *_addxrotationFld;
  NotifyField   *_addyrotationFld;
  NotifyField   *_addzrotationFld;

  NotifyField   *_subxrotationFld;
  NotifyField   *_subyrotationFld;
  NotifyField   *_subzrotationFld;

  DoubleField   *_rotationxincreFld;
  DoubleField   *_rotationyincreFld;
  DoubleField   *_rotationzincreFld;

  DoubleField   *_transxincreFld;
  DoubleField   *_transyincreFld;
  DoubleField   *_transzincreFld;

  MatrixField   *_matrixFld;
  NotifyField   *_resetFld;

  //! Handle field changes of the field field.
  virtual void  handleNotification (Field *field);
  //! Update internal state after initializing fields
  virtual void  activateAttachments();
  void          updateMatrix();

  //! Implements interface for the runtime type system of the ML.
  ML_BASEOP_CLASS_HEADER(AngioTransformEdit)
};


ML_END_NAMESPACE

#endif // __mlAngioTransformEdit_H

