/* Autor: Leandro Bernsmuller
Declara cenario.cpp */



class CCenario {

   // controle de um objeto do tipo temporario
   struct tagObjetoTemporario {
      BOOL bOcupado;
      float fTempo;
      DWORD dwGrupo;
      DWORD dwObjeto;
   };

public:

   CCenario ();
   ~CCenario ();

   BOOL m_bFuncionando; // T - operacional (iniciou com sucesso)
   int  m_nAltura;      // dimensoes da viewport
   int  m_nLargura;
   int  m_nIniX;        // coordenada inicial da viewport dentro da janela
   int  m_nIniY;

   // comunicacao com DX
   LPDIRECT3DRM m_lpD3DRM;             // aponta objeto D3DRM
   LPDIRECTDRAWCLIPPER m_lpDDClipper;  // aponta objeto DirectDrawClipper

   // modelos
   LPDIRECT3DRMMESHBUILDER m_lpModelos [ NUM_MODELOS ];  // modelos disponiveis

   // objetos e luzes
   LPDIRECT3DRMFRAME m_lpFrGrupos [ NUM_GRUPOS + 1 ];// frames dos grupos
          // o ultimo frame eh o "frame" principal: SRU, inclui os demais
   LPDIRECT3DRMFRAME m_lpFrObjetos [ NUM_GRUPOS ] [ MAX_OBJETOS ];
               // Frames com os elementos da cena.
               // Cada frame estah ligado ao frame do seu grupo e possui
               // um objeto: peixe, planta,... ou uma fonte de luz.
               // Os frames estao agrupados conforme seu uso.
               // Vantagens da criacao de grupos: otimiza deteccao de
               // colisao - so eh testado entre objetos do mesmo grupo;
               // Z buffer - soh eh usavel ou nao controle o grupo for
               // configurado.
   LPDIRECT3DRMLIGHT m_lpLuzAmbiente [ NUM_GRUPOS + 1 ]; // um por grupo
       // oque eh definido num frame pai eh herado automaticamente
       // para o filho.

   // controle dos objetos temporarios - objetos que sao removidos
   // automaticamente apohs algum tempo
   tagObjetoTemporario m_astTemporarios [ MAX_OBJETOS ];
   
   // objetos selecionados vao aqui
   LPDIRECT3DRMPICKEDARRAY m_pstSelecionados;
   

   // visualizacao
   LPDIRECT3DRMFRAME m_lpFrCamera;    // "frame" da camera (SRC)
   LPDIRECT3DRMDEVICE m_lpDisp;       // dispositivo (video) que serah usado pelo D3DRM
   LPDIRECT3DRMVIEWPORT m_lpJanVis;   // janela de visualizacao da cena (viewport)

   // imagem de fundo do cenario
   LPDIRECT3DRMTEXTURE     m_pstTex;

   // drivers
   GUID m_astDrvGUID [ MAX_DRIVERS ];             // GUIDs dos drivers para D3D
   char m_aszNomeDrv [ MAX_DRIVERS ] [ MAX_STR ]; // nomes
   int  m_nNumDrvs;                     // numero de drivers disponiveis
   int  m_nDrvSel;                      // driver selecionado para uso

   // qualidade de imagem
   int m_nNumBPP;                  // bits por pixel

public:

   BOOL mCria ( int nIniX, int nIniY, int nLargura, int nAltura, HWND hWnd );
   void mDestroi ();

   int mProcuraFrameLivre ( DWORD dwNumElems, LPDIRECT3DRMFRAME lpFrame );
   
   //  inicia partes especificas do D3D
   BOOL mDefineDrivers ( HWND hWnd );
   BOOL mCriaDispVis ( int nIniX, int nIniY, int nResX, int nResY, BOOL bSoJanVis = TRUE );
   BOOL mConfiguraQualidadeCena ();
   BOOL mDefineUsarZBuffer ( DWORD dwFrame, BOOL bZBuffer );
   BOOL mIncluiModelo ( DWORD dwNdxModelo, char* szArq );
   BOOL mCriaLuz ( DWORD dwTipo, DWORD dwFramePai, DWORD dwFrame,
                   float fX, float fY, float fZ,
                   float fR, float fG, float fB );
   BOOL mConfiguraImagemFundo ( char* szNome, DWORD dwNumCores,
                                DWORD dwXini, DWORD dwYini );

   // manipula objetos
   int mCriaObjeto ( DWORD dwGrupo, DWORD dwModelo,
                     float fX, float fY, float fZ,
                     float fDX, float fDY, float fDZ, 
                     float fRX, float fRY, float fRZ,
                     float fAng );
   void mDestroiObjeto ( DWORD dwGrupo, DWORD dwNdxFrame );
   void mMudaDirecaoDeslocamentoObjeto ( DWORD dwGrupo, DWORD dwNdxFrame, float fDX, float fDY, float fDZ );
   void mPegaDirecaoDeslocamentoObjeto ( DWORD dwGrupo, DWORD dwNdxFrame, float& fDX, float& fDY, float& fDZ );
   void mRotacionaObjeto ( DWORD dwGrupo, DWORD dwNdxFrame, float fRX, float fRY, float fRZ, float fAng );
   void mMudaPosicaoObjeto ( DWORD dwGrupo, DWORD dwNdxFrame, float fX, float fY, float fZ );
   void mPegaPosicaoObjeto ( DWORD dwGrupo, DWORD dwNdxFrame, float& fX, float& fY, float& fZ );
   void mMudaIntencidadeLuz ( DWORD dwGrupo, DWORD dwNdxFrame, float fR, float fG, float fB );
   void mCriaObjetoTemporario ( float fTempo,
                                DWORD dwGrupo, DWORD dwModelo,
                                float fX, float fY, float fZ,
                                float fDX, float fDY, float fDZ, 
                                float fRX, float fRY, float fRZ,
                                float fAng );
   DWORD mRetNumeroObjetos ( DWORD dwGrupo );
   LPDIRECT3DRMFRAME mSelecionaObjetos ( DWORD dwX, DWORD dwY );

   // manipula cena
   void mRetLimiteJanVis ( float& fSup, float& fInf, float& fDir, float& fEsq ) ;
   void mProcessaCena ( BOOL bMover );
};
