|
|
/*****************************************************************************\
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
|