text: /*****************************************************************************\
      FILE: util.h
  
      DESCRIPTION:
  
      BryanSt 12/22/2000
      Copyright (C) Microsoft Corp 2000-2001. All rights reserved.
  \*****************************************************************************/
  
  #ifndef UTIL_H
  #define UTIL_H
  
  #ifndef ARRAYSIZE
  #define ARRAYSIZE(a)        (sizeof(a)/sizeof(*a))
  #endif
  
  //-----------------------------------------------------------------------------
  // Name: enum CULLSTATE
  // Desc: Represents the result of the culling calculation on an object.
  //-----------------------------------------------------------------------------
  enum CULLSTATE
  {
      CS_UNKNOWN,      // cull state not yet computed
      CS_INSIDE,       // object bounding box is at least partly inside the frustum
      CS_OUTSIDE,      // object bounding box is outside the frustum
      CS_INSIDE_SLOW,  // OBB is inside frustum, but it took extensive testing to determine this
      CS_OUTSIDE_SLOW, // OBB is outside frustum, but it took extensive testing to determine this
  };
  
  
  //-----------------------------------------------------------------------------
  // Name: struct CULLINFO
  // Desc: Stores information that will be used when culling objects.  It needs
  //       to be recomputed whenever the view matrix or projection matrix changes.
  //-----------------------------------------------------------------------------
  struct CULLINFO
  {
      D3DXVECTOR3 vecFrustum[8];    // corners of the view frustum
      D3DXPLANE planeFrustum[6];    // planes of the view frustum
      D3DXVECTOR3 vecFrustumCenter; // center of the view frustum
  };
  
  #include "main.h"
  
  
  #define HINST_THISDLL       g_hMainInstance
  
  
  extern BOOL g_fOverheadViewTest;
  extern HINSTANCE g_hMainInstance;
  
  
  void FloatToString(float fValue, int nDecimalDigits, LPTSTR pszString, DWORD cchSize);
  void PrintLocation(LPTSTR pszTemplate, D3DXVECTOR3 vLoc, D3DXVECTOR3 vTangent);
  
  
  HRESULT SetBoxStripVertexes(MYVERTEX * ppvVertexs, D3DXVECTOR3 vLocation, D3DXVECTOR3 vSize, D3DXVECTOR3 vNormal);
  float GetSurfaceRatio(IDirect3DTexture8 * pTexture);
  float AddVectorComponents(D3DXVECTOR3 vDir);
  
  int CALLBACK DPALocalFree_Callback(LPVOID p, LPVOID pData);
  int CALLBACK DPAStrCompare(void * pv1, void * pv2, LPARAM lParam);
  BOOL Is3DRectViewable(CULLINFO* pCullInfo, D3DXMATRIX* pMatWorld, 
                        D3DXVECTOR3 vMin, D3DXVECTOR3 vMax);
  
  int GetTextureHeight(IDirect3DTexture8 * pTexture);
  int GetTextureWidth(IDirect3DTexture8 * pTexture);
  
  
  BOOL PathDeleteDirectoryRecursively(LPCTSTR pszDir);
  ULONGLONG PathGetFileSize(LPCTSTR pszPath);
  
  
  
  int GetRandomInt(int nMin, int nMax);
  HRESULT GetCurrentUserCustomName(LPWSTR pszDisplayName, DWORD cchSize);
  HRESULT ShellFolderParsePath(LPCWSTR pszPath, LPITEMIDLIST * ppidl);
  HRESULT ShellFolderGetPath(LPCITEMIDLIST pidl, LPWSTR pszPath, DWORD cchSize);
  
  
  // Reg Wrappers
  HRESULT HrRegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
  HRESULT HrRegCreateKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved, LPTSTR lpClass, DWORD dwOptions, 
         REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition);
  HRESULT HrRegGetDWORD(IN HKEY hKey, IN LPCTSTR pszSubKey, OPTIONAL IN LPCTSTR pszValue, LPDWORD pdwValue, DWORD dwDefaultValue);
  HRESULT HrRegSetDWORD(IN HKEY hKey, IN LPCTSTR pszSubKey, OPTIONAL IN LPCTSTR pszValue, DWORD dwValue);
  HRESULT HrRegGetValueString(IN HKEY hKey, IN LPCTSTR pszSubKey, IN LPCTSTR pszValueName, IN LPWSTR pszString, IN DWORD cchSize);
  HRESULT HrRegSetValueString(IN HKEY hKey, IN LPCTSTR pszSubKey, IN LPCTSTR pszValueName, OUT LPCWSTR pszString);
  
  
  // UI Wrappers
  void SetCheckBox(HWND hwndDlg, UINT idControl, BOOL fChecked);
  BOOL GetCheckBox(HWND hwndDlg, UINT idControl);
  
  
  // Prototypes for the culling functions
  VOID UpdateCullInfo( CULLINFO* pCullInfo, D3DXMATRIX* pMatView, D3DXMATRIX* pMatProj );
  CULLSTATE CullObject( CULLINFO* pCullInfo, D3DXVECTOR3* pVecBounds, D3DXPLANE* pPlaneBounds );
  BOOL EdgeIntersectsFace( D3DXVECTOR3* pEdges, D3DXVECTOR3* pFaces, D3DXPLANE* pPlane );
  
  // Other
  void DebugStartWatch(void);
  DWORD DebugStopWatch(void);
  
  D3DXVECTOR3 D3DXVec3Multiply(CONST D3DXVECTOR3 v1, CONST D3DXVECTOR3 v2);
  
  
  typedef struct
  {
      float fTimeToRotate;
      float fTimeToWalk;
      float fTimeToLookAtPaintings;
      int nMinTurnFrames;
      int nMinWalkFrames;
      int nMaxTurnFrames;
      int nMaxWalkFrames;
  } SPEED_SETTING;
  
  #define MAX_SPEED                   11
  
  extern SPEED_SETTING s_SpeedSettings[MAX_SPEED];
  
  #define TaskBar_SetRange(hwndControl, fRedraw, nMin, nMax)  SendMessage(hwndControl, TBM_SETRANGE, (WPARAM) (BOOL) fRedraw, (LPARAM) MAKELONG(nMin, nMax))
  #define TaskBar_SetPos(hwndControl, fRedraw, nPosition)  SendMessage(hwndControl, TBM_SETPOS, (WPARAM) (BOOL) fRedraw, (LPARAM) (LONG) nPosition)
  #define TaskBar_GetPos(hwndControl)  (int) SendMessage(hwndControl, TBM_GETPOS, 0, 0)
  
  
  
  float rnd(void);
  
  #define ABS(i)  (((i) < 0) ? -(i) : (i))
  
  
  
  //------------------------------------------------------------------------
  
  ////////////////
  //
  //  Critical section stuff
  //
  //  Helper macros that give nice debug support
  //
  EXTERN_C CRITICAL_SECTION g_csDll;
  #ifdef DEBUG
  EXTERN_C UINT g_CriticalSectionCount;
  EXTERN_C DWORD g_CriticalSectionOwner;
  EXTERN_C void Dll_EnterCriticalSection(CRITICAL_SECTION*);
  EXTERN_C void Dll_LeaveCriticalSection(CRITICAL_SECTION*);
  #if defined(__cplusplus) && defined(AssertMsg)
  class DEBUGCRITICAL {
  protected:
      BOOL fClosed;
  public:
      DEBUGCRITICAL() {fClosed = FALSE;};
      void Leave() {fClosed = TRUE;};
      ~DEBUGCRITICAL() 
      {
          AssertMsg(fClosed, TEXT("you left scope while holding the critical section"));
      }
  };
  #define ENTERCRITICAL DEBUGCRITICAL debug_crit; Dll_EnterCriticalSection(&g_csDll)
  #define LEAVECRITICAL debug_crit.Leave(); Dll_LeaveCriticalSection(&g_csDll)
  #define ENTERCRITICALNOASSERT Dll_EnterCriticalSection(&g_csDll)
  #define LEAVECRITICALNOASSERT Dll_LeaveCriticalSection(&g_csDll)
  #else // __cplusplus
  #define ENTERCRITICAL Dll_EnterCriticalSection(&g_csDll)
  #define LEAVECRITICAL Dll_LeaveCriticalSection(&g_csDll)
  #define ENTERCRITICALNOASSERT Dll_EnterCriticalSection(&g_csDll)
  #define LEAVECRITICALNOASSERT Dll_LeaveCriticalSection(&g_csDll)
  #endif // __cplusplus
  #define ASSERTCRITICAL ASSERT(g_CriticalSectionCount > 0 && GetCurrentThreadId() == g_CriticalSectionOwner)
  #define ASSERTNONCRITICAL ASSERT(GetCurrentThreadId() != g_CriticalSectionOwner)
  #else // DEBUG
  #define ENTERCRITICAL EnterCriticalSection(&g_csDll)
  #define LEAVECRITICAL LeaveCriticalSection(&g_csDll)
  #define ENTERCRITICALNOASSERT EnterCriticalSection(&g_csDll)
  #define LEAVECRITICALNOASSERT LeaveCriticalSection(&g_csDll)
  #define ASSERTCRITICAL 
  #define ASSERTNONCRITICAL
  #endif // DEBUG
  
  
  
  #endif // UTIL_H
  
  