You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.9 KiB
185 lines
6.9 KiB
/*****************************************************************************\
|
|
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
|
|
|