// madnessEditorView.h : interfaccia della classe CmadnessEditorView
//
#pragma once

#include "MadMap.h"
#include "CCamera.h"
#include "Selection.h"
#include "Marbleenemy.h"
class CmadnessEditorView : public CView
{
protected: 
    CmadnessEditorView();
    DECLARE_DYNCREATE(CmadnessEditorView)

public:
    //========================
    //restituisce il documento
    // associato alla vista
    //========================
    CmadnessEditorDoc* GetDocument() const;
    
    //=================
    //DC della finestra
    //=================
    CClientDC   *m_pDC; 

    //=================
    //Contesto OpenGL
    //=================
    HGLRC       m_hrc;

    //===========================
    //valore di ritorno del primo 
    // Pick nella multiselezione 
    //===========================
    int returnFirstPick;
    
    //=========================== 
    //valore di ritorno 
    // dell'ultimo Pick nella 
    // multiselezione
    //===========================
    int returnLastPick;

    //=======inittexture=========
    //true se le texture sono 
    //state inizializzate, 
    //false altrimenti
    //===========================
    bool inittexture;

    //===========================
    //opzione di disegno corrente 
    // della vista: WIREFRAME o
    // SOLID o TEXTURED
    //===========================
    int optionDraw;

/**opzione di editing corrente della vista */
  int optionEdit;
/**opzione di editing precendentemente selezionata della vista */
  int oldoptionEdit;

/**ampiezza X della vista */
  int ViewSizeX;
/**altezza Y della vista */
  int ViewSizeY;
/**camera della vista OpenGL*/
   CCamera camera;
/**Ultima posizione catturata del mouse*/
   CPoint now;

/**penultima posizione catturata del mouse*/
   CPoint old;

/**true se è in modalità di selezione*/
  bool b_Selection;
/**true se è in modalità di Zoom Camera*/
  bool b_CameraZoom;
/**Area Selezionata nella vista*/
  Selection Sel;

/**coordinata X centrale nell'aria selezionata*/
  float SelX;
/**coordinata Z centrale nell'aria selezionata*/
  float SelZ;

/**distanza corrente dal punto di vista*/
  double h;
/**angolo corrente intorno all'asse Y del punto di vista*/
  double k;
/** angolo corrente intorno agli assi X/Z del punto di vista*/
  double v;
/** limite distanza dal punto di vista  */  
  double hl;
/** limite angolo intorno all'asse Y del punto di vista*/  
  double kl;
 /** limite angolo intorno agli assi X/Z del punto di vista*/ 
  double vl;



// Operazioni
public:
    BOOL CmadnessEditorView::SetupPixelFormat( CDC * pDC );
 void glInit();
  inline BOOL SetGL()
{
    if(!(m_pDC && m_hrc)) {
        TRACE("Failed SetGL\n");
        return false;
    }
 if(!wglMakeCurrent(m_pDC->GetSafeHdc(), m_hrc)){
        AfxMessageBox("GlMakeCurrent Error");
        return FALSE;
      }
  return TRUE;
}

// Sostituzioni
    public:
    virtual void OnDraw(CDC* pDC);  // sottoposto a overriding per creare questa vista
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);


// Implementazione
public:
    virtual ~CmadnessEditorView();
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

protected:
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
    virtual afx_msg void OnDestroy();
    virtual afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    virtual afx_msg void OnSize(UINT nType, int cx, int cy);
// Funzioni generate per la mappa dei messaggi
protected:
    DECLARE_MESSAGE_MAP()
public:
    
    //=============SetFirstPick===============
    //setta il primo Pick della selezione
    //=======================================
    bool SetFirstPick(int x, int y); 
    //=============SetLastPick===============
    //setta l'ultimo Pick della selezione
    //=======================================
    bool SetLastPick(int x, int y);
    
    //=================CameraMove================
    //muove la camera nella vista.            <br>
    //due tipi movimento indicato in option   <br>
    //x, y coordinate all'interno della View  <br>
    //option: ROTATE o ZOOM                   <br>                      
    //============================================
    int CameraMove(int x, int y, int option);

    //================TargetCamera===========================
    //cambia il punto di vista della camera.              <br>
    //inoltre corregge l'angolazione di vista nel caso in <br>
    //cui il punto di vista nn sia visibile               <br>
    //mp: puntatore alla mappa.                           <br>
    //target_x: coordinata x del nuovo punto di vista     <br>
    //target_y: coordinata z del nuovo punto di vista     <br>
    //========================================================
    void TargetCamera(MadMap *mp, float target_x, float target_z);
    
    
    /**metodi per l'interfaccia grafica MFC*/
    virtual void OnInitialUpdate();
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    
    afx_msg void OnVistaWireframe();
    afx_msg void OnVistaSolid();
    afx_msg void OnFunzioniFranare();

    afx_msg void OnFunzioniLivellare();
    afx_msg void OnFunzioniInclinare();
    afx_msg void OnFunzioniSpianare();
    afx_msg void OnFunzioniAlzare();
    afx_msg void OnFunzioniPiramide();
    afx_msg void OnFunzioniNemici();
    afx_msg void OnFunzioniAreagoal();
    afx_msg void OnFunzioniStart();

    afx_msg void OnEditCopy();
    afx_msg void OnEditPaste();
    afx_msg void OnEditMerge();
    afx_msg void OnEditUndo();
    afx_msg void OnEditCut();


    afx_msg void OnUpdateFunzioniFranare(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniLivellare(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniInclinare(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniSpianare(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniAreagoal(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniStart(CCmdUI *pCmdUI);
    afx_msg void OnUpdateEditMerge(CCmdUI *pCmdUI);
    afx_msg void OnUpdateEditPaste(CCmdUI *pCmdUI);
    afx_msg void OnUpdateEditUndo(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniNemici(CCmdUI *pCmdUI);
    afx_msg void OnUpdateVistaSolid(CCmdUI *pCmdUI);
    afx_msg void OnUpdateVistaWireframe(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniPiramide(CCmdUI *pCmdUI);
    afx_msg void OnUpdateEditCut(CCmdUI *pCmdUI);
    afx_msg void OnUpdateFunzioniAlzare(CCmdUI *pCmdUI);

};


#ifndef _DEBUG  // versione di debug in madnessEditorView.cpp
inline CmadnessEditorDoc* CmadnessEditorView::GetDocument() const
   { return reinterpret_cast<CmadnessEditorDoc*>(m_pDocument); }
#endif