Initial commit: ROW Client source code

Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 16:24:34 +09:00
commit e067522598
5135 changed files with 1745744 additions and 0 deletions

View File

@@ -0,0 +1,178 @@
//
// CEnvironment
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
//
#include <d3dx8.h>
#include "CEnvironment.h"
//////////////////////////////////////////////////////////////////////////////
// Types /////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#pragma pack(4)
typedef struct ENV_VERTEX
{
D3DXVECTOR3 m_vecPos;
D3DXVECTOR2 m_vecTex;
} ENV_VERTEX;
#define ENV_FVF (D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0))
//////////////////////////////////////////////////////////////////////////////
// CEnvironment implementation ///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
CEnvironment::CEnvironment()
{
m_fSize = 1.0f;
m_pDevice = NULL;
memset(m_pSurf, 0x00, sizeof(m_pSurf));
}
CEnvironment::~CEnvironment()
{
}
HRESULT
CEnvironment::Initialize(float fSize)
{
m_fSize = fSize;
return S_OK;
}
HRESULT
CEnvironment::OnCreateDevice(IDirect3DDevice8* pDevice)
{
m_pDevice = pDevice;
return S_OK;
}
HRESULT
CEnvironment::OnResetDevice()
{
return S_OK;
}
HRESULT
CEnvironment::OnLostDevice()
{
return S_OK;
}
HRESULT
CEnvironment::OnDestroyDevice()
{
return S_OK;
}
HRESULT
CEnvironment::SetSurfaces(
IDirect3DTexture8* pXNeg, IDirect3DTexture8* pXPos,
IDirect3DTexture8* pYNeg, IDirect3DTexture8* pYPos,
IDirect3DTexture8* pZNeg, IDirect3DTexture8* pZPos)
{
m_pSurf[0] = pXNeg;
m_pSurf[1] = pXPos;
m_pSurf[2] = pYNeg;
m_pSurf[3] = pYPos;
m_pSurf[4] = pZNeg;
m_pSurf[5] = pZPos;
return S_OK;
}
HRESULT
CEnvironment::Draw()
{
float f;
ENV_VERTEX vert[4];
f = 0.5f / 512.0f;
vert[0].m_vecTex = D3DXVECTOR2(0.0f + f, 0.0f + f);
vert[1].m_vecTex = D3DXVECTOR2(0.0f + f, 1.0f - f);
vert[2].m_vecTex = D3DXVECTOR2(1.0f - f, 0.0f + f);
vert[3].m_vecTex = D3DXVECTOR2(1.0f - f, 1.0f - f);
m_pDevice->SetVertexShader(ENV_FVF);
f = m_fSize * 0.5f;
// XNeg
vert[0].m_vecPos = D3DXVECTOR3(-f, f, f);
vert[1].m_vecPos = D3DXVECTOR3(-f, -f, f);
vert[2].m_vecPos = D3DXVECTOR3(-f, f, -f);
vert[3].m_vecPos = D3DXVECTOR3(-f, -f, -f);
m_pDevice->SetTexture(0, m_pSurf[0]);
m_pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID) vert, sizeof(ENV_VERTEX));
// XPos
vert[0].m_vecPos = D3DXVECTOR3( f, f, -f);
vert[1].m_vecPos = D3DXVECTOR3( f, -f, -f);
vert[2].m_vecPos = D3DXVECTOR3( f, f, f);
vert[3].m_vecPos = D3DXVECTOR3( f, -f, f);
m_pDevice->SetTexture(0, m_pSurf[1]);
m_pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID) vert, sizeof(ENV_VERTEX));
// YNeg
vert[1].m_vecPos = D3DXVECTOR3(-f, -f, -f);
vert[3].m_vecPos = D3DXVECTOR3(-f, -f, f);
vert[0].m_vecPos = D3DXVECTOR3( f, -f, -f);
vert[2].m_vecPos = D3DXVECTOR3( f, -f, f);
m_pDevice->SetTexture(0, m_pSurf[2]);
m_pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID) vert, sizeof(ENV_VERTEX));
// YPos
vert[0].m_vecPos = D3DXVECTOR3(-f, f, f);
vert[1].m_vecPos = D3DXVECTOR3(-f, f, -f);
vert[2].m_vecPos = D3DXVECTOR3( f, f, f);
vert[3].m_vecPos = D3DXVECTOR3( f, f, -f);
m_pDevice->SetTexture(0, m_pSurf[3]);
m_pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID) vert, sizeof(ENV_VERTEX));
// ZNeg
vert[0].m_vecPos = D3DXVECTOR3(-f, f, -f);
vert[1].m_vecPos = D3DXVECTOR3(-f, -f, -f);
vert[2].m_vecPos = D3DXVECTOR3( f, f, -f);
vert[3].m_vecPos = D3DXVECTOR3( f, -f, -f);
m_pDevice->SetTexture(0, m_pSurf[4]);
m_pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID) vert, sizeof(ENV_VERTEX));
// ZPos
vert[0].m_vecPos = D3DXVECTOR3( f, f, f);
vert[1].m_vecPos = D3DXVECTOR3( f, -f, f);
vert[2].m_vecPos = D3DXVECTOR3(-f, f, f);
vert[3].m_vecPos = D3DXVECTOR3(-f, -f, f);
m_pDevice->SetTexture(0, m_pSurf[5]);
m_pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, (LPVOID) vert, sizeof(ENV_VERTEX));
return S_OK;
}

View File

@@ -0,0 +1,38 @@
//
// CEnvironment
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
//
#pragma once
#ifndef __CENVIRONMENT_H__
#define __CENVIRONMENT_H__
class CEnvironment
{
public:
CEnvironment();
~CEnvironment();
HRESULT Initialize(float fSize);
HRESULT OnCreateDevice(IDirect3DDevice8* pDevice);
HRESULT OnResetDevice();
HRESULT OnLostDevice();
HRESULT OnDestroyDevice();
HRESULT SetSurfaces(
IDirect3DTexture8* pXNeg, IDirect3DTexture8* pXPos,
IDirect3DTexture8* pYNeg, IDirect3DTexture8* pYPos,
IDirect3DTexture8* pZNeg, IDirect3DTexture8* pZPos);
HRESULT Draw();
protected:
float m_fSize;
IDirect3DDevice8* m_pDevice;
IDirect3DTexture8* m_pSurf[6];
};
#endif // __CENVIRONMENT_H__

View File

@@ -0,0 +1,633 @@
//
// CWater
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
//
#include <d3dx8.h>
#include "CWater.h"
#define WATER_SHIFT 6
#define WATER_SIZE (1 << WATER_SHIFT)
#define WATER_AREA (WATER_SIZE * WATER_SIZE)
#define WATER_MASK (WATER_SIZE - 1)
#define WATER_SPHERE_HEIGHT 20.0f
#define WATER_SPHERE_RADIUS2 (35.0f * 35.0f)
#define WATER_INDEX(x, y) \
((x) | ((y) << WATER_SHIFT))
#define WATER_INDEX_WRAP(x, y) \
(((x) & WATER_MASK) | (((y) & WATER_MASK) << WATER_SHIFT))
#if defined(_X86) && !defined(_WIN64)
inline int f2i(float flt)
{
volatile int n;
__asm
{
fld flt
fistp n
}
return n;
}
#else
inline int f2i(float flt)
{
return (int) flt;
}
#endif
//////////////////////////////////////////////////////////////////////////////
// Types /////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#pragma pack(1)
typedef struct WATER_VERTEX
{
D3DXVECTOR3 m_vecPos;
D3DXVECTOR3 m_vecNormal;
D3DCOLOR m_dwDiffuse;
D3DXVECTOR2 m_vecTex;
} WATER_VERTEX;
#define WATER_FVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0))
typedef struct CAUSTICS_VERTEX
{
D3DXVECTOR3 m_vecPos;
D3DCOLOR m_dwDiffuse;
} CAUSTICS_VERTEX;
#define CAUSTICS_FVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
#pragma pack()
//////////////////////////////////////////////////////////////////////////////
// CWater implementation /////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
CWater::CWater()
{
m_fDepth = 0.0f;
m_fScaleTex = 1.0f;
m_uIndices = 0;
m_uVertices = 0;
m_pRefract = NULL;
m_pSurface = NULL;
m_pDevice = NULL;
m_pibIndices = NULL;
m_pvbVertices = NULL;
m_pvbCaustics = NULL;
}
CWater::~CWater()
{
if(m_pSurface)
delete [] m_pSurface;
}
HRESULT
CWater::Initialize(float fSize, float fDepth)
{
m_fSize = fSize;
m_fDepth = fDepth;
m_fScaleTex = 1.0f / fSize;
// Calculate number of vertices and indices
m_uVertices = WATER_AREA;
m_uIndices = m_uVertices * 2;
// Create refraction table
static WATER_REFRACT Refract[512];
if(!m_pRefract)
{
m_pRefract = &Refract[256];
for(UINT u = 0; u < 256; u++)
{
float fCos0 = (float) u / (float) 256.0f;
float f0 = acosf(fCos0);
float fSin0 = sinf(f0);
float fSin1 = fSin0 / 1.333f; // water
float f1 = asinf(fSin1);
float fCos1 = cosf(f1);
m_pRefract[u].fRefract = fSin0 / fSin1 * fCos1 - fCos0;
m_pRefract[u].fRefractNorm = - fSin1 / fSin0;
m_pRefract[u].dwDiffuse = ((((0xff - u)*(0xff - u)*(0xff - u)) << 8) & 0xff000000);
Refract[u] = Refract[256];
}
}
// Create maps
if(!m_pSurface)
{
if(!(m_pSurface = new WATER_SURFACE[WATER_AREA]))
return E_OUTOFMEMORY;
memset(m_pSurface, 0x00, WATER_AREA * sizeof(WATER_SURFACE));
}
return S_OK;
}
HRESULT
CWater::OnCreateDevice(IDirect3DDevice8 *pDevice)
{
m_pDevice = pDevice;
return S_OK;
}
HRESULT
CWater::OnResetDevice()
{
HRESULT hr;
// Create indices
if(!m_pibIndices)
{
WORD *pwIndices;
if(FAILED(hr = m_pDevice->CreateIndexBuffer(m_uIndices * sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_pibIndices)))
return hr;
if(FAILED(hr = m_pibIndices->Lock(0, m_uIndices * sizeof(WORD), (BYTE**) &pwIndices, 0)))
return hr;
// Fill in indicies
UINT uX = 0, uZ = 0;
WORD *pwIndex = pwIndices;
for(UINT uSize = WATER_SIZE; uSize != 0; uSize -= 2)
{
UINT u;
// Top
for(u = 0; u < uSize; u++)
{
*pwIndex++ = uX + uZ * WATER_SIZE;
*pwIndex++ = uX + uZ * WATER_SIZE + WATER_SIZE;
uX++;
}
uX--;
uZ++;
// Right
for(u = 1; u < uSize; u++)
{
*pwIndex++ = uX + uZ * WATER_SIZE;
*pwIndex++ = uX + uZ * WATER_SIZE - 1;
uZ++;
}
uZ--;
uX--;
// Bottom
for(u = 1; u < uSize; u++)
{
*pwIndex++ = uX + uZ * WATER_SIZE;
*pwIndex++ = uX + uZ * WATER_SIZE - WATER_SIZE;
uX--;
}
uX++;
uZ--;
// Left
for(u = 2; u < uSize; u++)
{
*pwIndex++ = uX + uZ * WATER_SIZE;
*pwIndex++ = uX + uZ * WATER_SIZE + 1;
uZ--;
}
uZ++;
uX++;
}
for(pwIndex = pwIndices; pwIndex < pwIndices + m_uIndices; pwIndex++)
{
if(*pwIndex >= m_uVertices)
*pwIndex = 0;
}
m_pibIndices->Unlock();
}
// Create vertices
if(!m_pvbVertices)
{
if(FAILED(hr = m_pDevice->CreateVertexBuffer(m_uVertices * sizeof(WATER_VERTEX),
D3DUSAGE_DYNAMIC, WATER_FVF, D3DPOOL_DEFAULT, &m_pvbVertices)))
{
return hr;
}
}
// Create caustics
if(!m_pvbCaustics)
{
if(FAILED(hr = m_pDevice->CreateVertexBuffer(m_uVertices * sizeof(CAUSTICS_VERTEX),
D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, CAUSTICS_FVF, D3DPOOL_DEFAULT, &m_pvbCaustics)))
{
return hr;
}
}
return S_OK;
}
HRESULT
CWater::OnLostDevice()
{
if(m_pibIndices)
{
m_pibIndices->Release();
m_pibIndices = NULL;
}
if(m_pvbVertices)
{
m_pvbVertices->Release();
m_pvbVertices = NULL;
}
if(m_pvbCaustics)
{
m_pvbCaustics->Release();
m_pvbCaustics = NULL;
}
return S_OK;
}
HRESULT
CWater::OnDestroyDevice()
{
m_pDevice = NULL;
return S_OK;
}
HRESULT
CWater::Drop()
{
UINT uX = rand();
UINT uY = rand();
m_pSurface[WATER_INDEX_WRAP(uX, uY)].fVelocity -= 0.25f;
m_pSurface[WATER_INDEX_WRAP(uX - 1, uY)].fVelocity -= 0.125f;
m_pSurface[WATER_INDEX_WRAP(uX + 1, uY)].fVelocity -= 0.125f;
m_pSurface[WATER_INDEX_WRAP(uX, uY - 1)].fVelocity -= 0.125f;
m_pSurface[WATER_INDEX_WRAP(uX, uY + 1)].fVelocity -= 0.125f;
m_pSurface[WATER_INDEX_WRAP(uX - 1, uY - 1)].fVelocity -= 0.0625f;
m_pSurface[WATER_INDEX_WRAP(uX + 1, uY + 1)].fVelocity -= 0.0625f;
m_pSurface[WATER_INDEX_WRAP(uX + 1, uY - 1)].fVelocity -= 0.0625f;
m_pSurface[WATER_INDEX_WRAP(uX - 1, uY + 1)].fVelocity -= 0.0625f;
return S_OK;
}
HRESULT
CWater::Update(D3DXVECTOR3 &vecPos, D3DXVECTOR3 &vecLight, BOOL bCalcCaustics)
{
HRESULT hr;
UINT uXN, uX, uXP, uY, uYN, uY0, uYP;
// Compute desired height
m_fAvgHeight = 0.0f;
WATER_SURFACE *pSurface = m_pSurface;
uYN = WATER_AREA - WATER_SIZE;
uY0 = 0;
uYP = WATER_SIZE;
do
{
uXN = WATER_SIZE - 1;
uX = 0;
uXP = 1;
do
{
// Bowl
float fX = (float) uX - (WATER_SIZE >> 1);
float fZ = (float) (uY0 >> WATER_SHIFT) - (WATER_SIZE >> 1);
float fDesire;
if((fX * fX + fZ * fZ) < (WATER_SPHERE_RADIUS2 - WATER_SPHERE_HEIGHT * WATER_SPHERE_HEIGHT))
{
fDesire =
(m_pSurface[uXN + uYN].fHeight +
m_pSurface[uXP + uYN].fHeight +
m_pSurface[uXN + uYP].fHeight +
m_pSurface[uXP + uYP].fHeight) * (1.0f / 12.0f)
+
(m_pSurface[uX + uYN].fHeight +
m_pSurface[uXN + uY0].fHeight +
m_pSurface[uXP + uY0].fHeight +
m_pSurface[uX + uYP].fHeight) * (2.0f / 12.0f);
}
else
{
fDesire = 0.0f;
pSurface->fHeight = 0.0f;
pSurface->fVelocity = 0.0f;
}
// Update velocity
if(pSurface->fVelocity > 0.01f || pSurface->fVelocity < -0.01f)
pSurface->fVelocity *= 0.99f;
pSurface->fVelocity += 0.25f * (fDesire - pSurface->fHeight);
m_fAvgHeight += pSurface->fHeight + pSurface->fVelocity;
pSurface++;
uXN = uX;
uX = uXP;
uXP = (uXP + 1) & WATER_MASK;
}
while(uX);
uYN = uY0;
uY0 = uYP;
uYP = (uYP + WATER_SIZE) & (WATER_MASK << WATER_SHIFT);
}
while(uY0);
m_fAvgHeight /= (float) m_uVertices;
// Calculate surface normals
WATER_VERTEX *pVertices, *pVertex, *pVertexLim;
D3DXVECTOR3 vec;
D3DXVECTOR3 vecP, vecN;
if(FAILED(hr = m_pvbVertices->Lock(0, m_uVertices * sizeof(WATER_VERTEX), (BYTE **) &pVertices, 0)))
return hr;
pVertex = pVertices;
pVertexLim = pVertex + m_uVertices;
pSurface = m_pSurface;
float fInc = m_fSize / (float) (WATER_SIZE - 1);
float fZ = m_fSize * -0.5f;
uYN = WATER_AREA - WATER_SIZE;
uY0 = 0;
uYP = WATER_SIZE;
do
{
float fX = m_fSize * -0.5f;
uXN = WATER_SIZE - 1;
uX = 0;
uXP = 1;
do
{
// Update position and normal
vecP.x = fX;
vecP.y = pSurface->fHeight = pSurface->fHeight + pSurface->fVelocity - m_fAvgHeight;
vecP.z = fZ;
float f;
f = m_pSurface[uXN + uYN].fHeight - m_pSurface[uXP + uYP].fHeight; vecN.x = vecN.z = f;
f = m_pSurface[uX + uYN].fHeight - m_pSurface[uX + uYP].fHeight; vecN.z += f;
f = m_pSurface[uXP + uYN].fHeight - m_pSurface[uXN + uYP].fHeight; vecN.x -= f; vecN.z += f;
f = m_pSurface[uXN + uY0].fHeight - m_pSurface[uXP + uY0].fHeight; vecN.x += f;
vecN.y = 1.0f;
D3DXVec3Normalize(&vecN, &vecN);
pSurface++;
// Update texture coords and diffuse based upon refraction
D3DXVec3Subtract(&vec, &vecPos, &vecP);
D3DXVec3Normalize(&vec, &vec);
WATER_REFRACT *pRefract;
pRefract = m_pRefract + f2i(D3DXVec3Dot(&vec, &vecN) * 255.0f);
pVertex->m_vecPos = vecP;
pVertex->m_vecNormal = vecN;
pVertex->m_dwDiffuse = pRefract->dwDiffuse;
// Bowl
D3DXVECTOR3 vecD;
vecD = (vecN * pRefract->fRefract + vec) * pRefract->fRefractNorm;
vecP.y -= WATER_SPHERE_HEIGHT;
float fC = D3DXVec3Dot(&vecP, &vecP) - WATER_SPHERE_RADIUS2;
if(fC < 0.0f)
{
float fB = D3DXVec3Dot(&vecD, &vecP) * 2.0f;
float fD = fB * fB - 4.0f * fC;
float fScale = (-fB + sqrtf(fD)) * 0.5f;
pVertex->m_vecTex.x = (vecD.x * fScale + vecP.x) * m_fScaleTex + 0.5f;
pVertex->m_vecTex.y = (vecD.z * fScale + vecP.z) * m_fScaleTex + 0.5f;
}
else
{
pVertex->m_vecTex.x = vecP.x * m_fScaleTex + 0.5f;
pVertex->m_vecTex.y = vecP.z * m_fScaleTex + 0.5f;
}
pVertex++;
fX += fInc;
uXN = uX;
uX = uXP;
uXP = (uXP + 1) & WATER_MASK;
}
while(uX);
fZ += fInc;
uYN = uY0;
uY0 = uYP;
uYP = (uYP + WATER_SIZE) & (WATER_MASK << WATER_SHIFT);
}
while(uY0);
// Calculate caustics
if(bCalcCaustics)
{
CAUSTICS_VERTEX *pCaustics, *pCaustic;
if(FAILED(hr = m_pvbCaustics->Lock(0, m_uVertices * sizeof(CAUSTICS_VERTEX), (BYTE **) &pCaustics, 0)))
return hr;
#define TABLE_SIZE 8
static DWORD Table[TABLE_SIZE];
if(!Table[0])
{
for(UINT u = 0; u < TABLE_SIZE; u++)
Table[u] = (0x40 / (u + 1)) * 0x00010101;
}
pVertex = pVertices;
pCaustic = pCaustics;
for(uY = 0; uY < WATER_SIZE; uY++)
{
for(uX = 0; uX < WATER_SIZE; uX++)
{
WATER_REFRACT *pRefract;
pRefract = m_pRefract + f2i(pVertex->m_vecNormal.y * 255.0f);
// Bowl
D3DXVECTOR3 vecD, vecP;
vecD = (pVertex->m_vecNormal * pRefract->fRefract + vecLight) * pRefract->fRefractNorm;
vecP = pVertex->m_vecPos;
vecP.y -= WATER_SPHERE_HEIGHT;
float fC = D3DXVec3Dot(&vecP, &vecP) - WATER_SPHERE_RADIUS2;
if(fC < 0.0f)
{
float fB = D3DXVec3Dot(&vecD, &vecP) * 2.0f;
float fD = fB * fB - 4.0f * fC;
float fScale = (-fB + sqrtf(fD)) * 0.5f;
pCaustic->m_vecPos.x = vecD.x * fScale + vecP.x;
pCaustic->m_vecPos.y = 0.0f;
pCaustic->m_vecPos.z = vecD.z * fScale + vecP.z;
}
else
{
pCaustic->m_vecPos.x = vecP.x;
pCaustic->m_vecPos.y = 0.0f;
pCaustic->m_vecPos.z = vecP.z;
}
if(uX && uY)
{
float fArea;
fArea = (pCaustic[-WATER_SIZE - 1].m_vecPos.x - pCaustic->m_vecPos.x) *
(pCaustic[-WATER_SIZE ].m_vecPos.z - pCaustic->m_vecPos.z) -
(pCaustic[-WATER_SIZE - 1].m_vecPos.z - pCaustic->m_vecPos.z) *
(pCaustic[-WATER_SIZE ].m_vecPos.x - pCaustic->m_vecPos.x);
if(fArea < 0.0f)
fArea = -fArea;
UINT u = f2i(fArea * fArea * 4.0f);
pCaustic->m_dwDiffuse = u < TABLE_SIZE ? Table[u] : 0;
}
pCaustic++;
pVertex++;
}
pCaustic[-WATER_SIZE].m_dwDiffuse = pCaustic[-1].m_dwDiffuse;
}
for(uX = 0; uX < WATER_SIZE; uX++)
{
pCaustics[uX].m_dwDiffuse = pCaustics[uX + (WATER_AREA - WATER_SIZE)].m_dwDiffuse;
}
m_pvbCaustics->Unlock();
}
m_pvbVertices->Unlock();
return S_OK;
}
HRESULT
CWater::DrawCaustics()
{
HRESULT hr;
if(FAILED(hr = m_pDevice->SetVertexShader(CAUSTICS_FVF)))
return hr;
if(FAILED(hr = m_pDevice->SetStreamSource(0, m_pvbCaustics, sizeof(CAUSTICS_VERTEX))))
return hr;
if(FAILED(hr = m_pDevice->SetIndices(m_pibIndices, 0)))
return hr;
if(FAILED(hr = m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, m_uVertices, 0, m_uIndices -2)))
return hr;
return S_OK;
}
HRESULT
CWater::DrawSurface()
{
HRESULT hr;
if(FAILED(hr = m_pDevice->SetStreamSource(0, m_pvbVertices, sizeof(WATER_VERTEX))))
return hr;
if(FAILED(hr = m_pDevice->SetIndices(m_pibIndices, 0)))
return hr;
if(FAILED(hr = m_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, m_uVertices, 0, m_uIndices -2)))
return hr;
return S_OK;
}

View File

@@ -0,0 +1,69 @@
//
// CWater
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
//
#pragma once
#ifndef __CWATER_H__
#define __CWATER_H__
typedef struct WATER_REFRACT
{
// Vrefract = (V + refract * N) * norm
float fRefract;
float fRefractNorm;
DWORD dwDiffuse;
} WATER_REFRACT;
typedef struct WATER_SURFACE
{
float fHeight;
float fVelocity;
} WATER_SURFACE;
class CWater
{
FLOAT m_fSize;
FLOAT m_fDepth;
FLOAT m_fScaleTex;
FLOAT m_fAvgHeight;
FLOAT m_fSphereHeight;
FLOAT m_fSphereRadius2;
UINT m_uIndices;
UINT m_uVertices;
WATER_SURFACE *m_pSurface;
WATER_REFRACT *m_pRefract;
IDirect3DDevice8 *m_pDevice;
IDirect3DIndexBuffer8 *m_pibIndices;
IDirect3DVertexBuffer8 *m_pvbVertices;
IDirect3DVertexBuffer8 *m_pvbCaustics;
public:
CWater();
~CWater();
HRESULT Initialize(float fSize, float fDepth);
HRESULT OnCreateDevice(IDirect3DDevice8 *pDevice);
HRESULT OnResetDevice();
HRESULT OnLostDevice();
HRESULT OnDestroyDevice();
HRESULT Drop();
HRESULT Update(D3DXVECTOR3 &vecPos, D3DXVECTOR3 &vecLight, BOOL bCalcCaustics);
HRESULT DrawCaustics();
HRESULT DrawSurface();
};
#endif // __CWATER_H__

View File

@@ -0,0 +1,797 @@
//-----------------------------------------------------------------------------
// File: CWaterApp.cpp
//
// Desc:
//
// Copyright (c) 1999-2001 Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#define STRICT
#include <tchar.h>
#include <stdio.h>
#include <d3dx8.h>
#include "D3DApp.h"
#include "D3DFont.h"
#include "DXUtil.h"
#include "CEnvironment.h"
#include "CWater.h"
#include "resource.h"
#define WATER_DEPTH 20.0f
#define WATER_CAUSTICS_SIZE 128
//-----------------------------------------------------------------------------
// Name: CMyD3DApplication
// Desc:
//-----------------------------------------------------------------------------
class CMyD3DApplication : public CD3DApplication
{
public:
CMyD3DApplication();
HRESULT GetNextTechnique(INT nDir, BOOL bBypassValidate);
virtual HRESULT OneTimeSceneInit();
virtual HRESULT InitDeviceObjects();
virtual HRESULT RestoreDeviceObjects();
virtual HRESULT InvalidateDeviceObjects();
virtual HRESULT DeleteDeviceObjects();
virtual HRESULT FrameMove();
virtual HRESULT Render();
virtual LRESULT MsgProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
private:
// Water
CWater m_Water;
CEnvironment m_Environment;
LPD3DXEFFECT m_pEffect;
UINT_PTR m_iTechnique;
LPD3DXRENDERTOSURFACE m_pRenderToSurface;
D3DXVECTOR4 m_vecLight;
D3DXCOLOR m_colorLight;
LPDIRECT3DTEXTURE8 m_pFloorTex;
LPDIRECT3DTEXTURE8 m_pCausticTex;
LPDIRECT3DSURFACE8 m_pCausticSurf;
LPDIRECT3DTEXTURE8 m_pSkyTex[6];
LPDIRECT3DCUBETEXTURE8 m_pSkyCubeTex;
CD3DFont* m_pFont;
CD3DFont* m_pFontSmall;
// Interface
BYTE m_bKey[256];
BOOL m_bPause;
BOOL m_bDrawWater;
BOOL m_bDrawCaustics;
BOOL m_bDrawEnvironment;
BOOL m_bShowHelp;
FLOAT m_fSpeed;
FLOAT m_fAngularSpeed;
FLOAT m_fTime;
FLOAT m_fSecsPerFrame;
D3DXVECTOR3 m_vecVelocity;
D3DXVECTOR3 m_vecAngularVelocity;
D3DXMATRIX m_matIdentity;
D3DXMATRIX m_matView;
D3DXMATRIX m_matPosition;
D3DXMATRIX m_matProjection;
};
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point to the program. Initializes everything, and goes into a
// message-processing loop. Idle time is used to render the scene.
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
CMyD3DApplication d3dApp;
if(FAILED(d3dApp.Create(hInst)))
return 0;
return d3dApp.Run();
}
//-----------------------------------------------------------------------------
// Name: CMyD3DApplication
// Desc:
//-----------------------------------------------------------------------------
CMyD3DApplication::CMyD3DApplication()
{
m_strWindowTitle = _T("Water");
m_bUseDepthBuffer = TRUE;
m_pFont = new CD3DFont( _T("Arial"), 12, D3DFONT_BOLD );
m_pFontSmall = new CD3DFont( _T("Arial"), 9, D3DFONT_BOLD );
// Water
m_pEffect = NULL;
m_iTechnique = 0;
m_vecLight = D3DXVECTOR4(0.5f, -1.0f, 1.0f, 0.0f);
m_colorLight = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
m_pFloorTex = NULL;
m_pCausticTex = NULL;
m_pCausticSurf = NULL;
m_pSkyCubeTex = NULL;
for(UINT i = 0; i < 6; i++)
m_pSkyTex[i] = NULL;
// Misc
memset(m_bKey, 0x00, sizeof(m_bKey));
m_fSpeed = 25.0f;
m_fAngularSpeed = 1.0f;
m_fSecsPerFrame = 0.0f;
m_fTime = 0.0f;
m_vecVelocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
m_vecAngularVelocity = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
D3DXMatrixIdentity(&m_matIdentity);
D3DXMatrixIdentity(&m_matView);
D3DXMatrixIdentity(&m_matPosition);
D3DXMatrixIdentity(&m_matProjection);
m_bShowHelp = FALSE;
m_bPause = FALSE;
}
//-----------------------------------------------------------------------------
// Name: GetNextTechnique
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::GetNextTechnique(INT nDir, BOOL bBypassValidate)
{
D3DXEFFECT_DESC effect;
UINT_PTR iTechnique = m_iTechnique;
m_pEffect->GetDesc(&effect);
for(;;)
{
iTechnique += nDir;
if(((INT_PTR) iTechnique) < 0)
iTechnique = effect.Techniques - 1;
if(iTechnique >= effect.Techniques)
iTechnique = 0;
if(nDir && (iTechnique == m_iTechnique))
break;
if(!nDir)
nDir = 1;
m_pEffect->SetTechnique((LPCSTR) iTechnique);
if(bBypassValidate || (iTechnique == effect.Techniques - 1) ||
(m_bDrawCaustics || !m_pEffect->IsParameterUsed("tCAU")) && SUCCEEDED(m_pEffect->Validate()))
{
m_iTechnique = iTechnique;
char szText[256];
sprintf(szText, "Water - Technique %d", m_iTechnique);
SetWindowText(m_hWnd, szText);
return S_OK;
}
}
m_pEffect->SetTechnique((LPCSTR) m_iTechnique);
return E_FAIL;
}
//-----------------------------------------------------------------------------
// Name: OneTimeSceneInit
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::OneTimeSceneInit()
{
HRESULT hr;
// Initialize Water
if(FAILED(hr = m_Water.Initialize(64.0f, WATER_DEPTH)))
return hr;
// Initialize Environment
if(FAILED(hr = m_Environment.Initialize(1000.0f)))
return hr;
// Misc stuff
D3DXMatrixRotationX(&m_matPosition, D3DX_PI * -0.3f);
m_matPosition._42 = 15.0f;
m_matPosition._43 = 15.0f;
D3DXMatrixInverse(&m_matView, NULL, &m_matPosition);
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InitDeviceObjects
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
HRESULT hr;
TCHAR sz[512];
m_bDrawWater = TRUE;
m_bDrawCaustics = TRUE;
m_bDrawEnvironment = TRUE;
// Initialize the font's internal textures
m_pFont->InitDeviceObjects( m_pd3dDevice );
m_pFontSmall->InitDeviceObjects( m_pd3dDevice );
// Floor
DXUtil_FindMediaFile(sz, _T("Water.bmp"));
D3DXCreateTextureFromFileEx(m_pd3dDevice, sz, D3DX_DEFAULT, D3DX_DEFAULT,
D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT,
D3DX_DEFAULT, 0, NULL, NULL, &m_pFloorTex);
// Sky
TCHAR* szSkyTex[6] =
{
_T("lobbyxpos.bmp"), _T("lobbyxneg.bmp"),
_T("lobbyypos.bmp"), _T("lobbyyneg.bmp"),
_T("lobbyzneg.bmp"), _T("lobbyzpos.bmp")
};
for(UINT i = 0; i < 6; i++)
{
DXUtil_FindMediaFile(sz, szSkyTex[i]);
D3DXCreateTextureFromFileEx(m_pd3dDevice, sz, D3DX_DEFAULT, D3DX_DEFAULT,
1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT,
0, NULL, NULL, &m_pSkyTex[i]);
}
if(SUCCEEDED(D3DXCreateCubeTexture(m_pd3dDevice, 128, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, &m_pSkyCubeTex)))
{
for(UINT i = 0; i < 6; i++)
{
if(m_pSkyTex[i])
{
IDirect3DSurface8 *pSrc;
IDirect3DSurface8 *pDest;
m_pSkyTex[i]->GetSurfaceLevel(0, &pSrc);
m_pSkyCubeTex->GetCubeMapSurface((D3DCUBEMAP_FACES) i, 0, &pDest);
if(pSrc && pDest)
D3DXLoadSurfaceFromSurface(pDest, NULL, NULL, pSrc, NULL, NULL, D3DX_DEFAULT, 0);
SAFE_RELEASE(pDest);
SAFE_RELEASE(pSrc);
}
}
D3DXFilterCubeTexture(m_pSkyCubeTex, NULL, 0, D3DX_DEFAULT);
}
// OnCreateDevice
if(FAILED(hr = m_Water.OnCreateDevice(m_pd3dDevice)))
return hr;
if(FAILED(hr = m_Environment.OnCreateDevice(m_pd3dDevice)))
return hr;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
HRESULT hr;
// Restore the font
m_pFont->RestoreDeviceObjects();
m_pFontSmall->RestoreDeviceObjects();
// Create light
D3DLIGHT8 light;
ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_DIRECTIONAL;
light.Diffuse.r = m_colorLight.r;
light.Diffuse.g = m_colorLight.g;
light.Diffuse.b = m_colorLight.b;
light.Diffuse.a = m_colorLight.a;
light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 0.0f;
light.Direction.x = m_vecLight.x;
light.Direction.y = m_vecLight.y;
light.Direction.z = m_vecLight.z;
m_pd3dDevice->SetLight(0, &light);
m_pd3dDevice->LightEnable(0, TRUE);
// Create material
D3DMATERIAL8 material;
ZeroMemory(&material, sizeof(material));
material.Diffuse.a = 1.0f;
material.Specular.r = 0.5f;
material.Specular.g = 0.5f;
material.Specular.b = 0.5f;
material.Power = 20.0f;
m_pd3dDevice->SetMaterial(&material);
// Setup render states
m_pd3dDevice->SetVertexShader(D3DFVF_XYZ);
m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView);
m_pd3dDevice->SetTransform(D3DTS_WORLD, &m_matIdentity);
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
m_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
m_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
m_pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_POINT);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_POINT);
m_pd3dDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);
// Create caustic texture
D3DDISPLAYMODE mode;
m_pd3dDevice->GetDisplayMode(&mode);
if(FAILED(hr = D3DXCreateTexture(m_pd3dDevice, WATER_CAUSTICS_SIZE, WATER_CAUSTICS_SIZE, 1, D3DUSAGE_RENDERTARGET, mode.Format, D3DPOOL_DEFAULT, &m_pCausticTex)) &&
FAILED(hr = D3DXCreateTexture(m_pd3dDevice, WATER_CAUSTICS_SIZE, WATER_CAUSTICS_SIZE, 1, 0, mode.Format, D3DPOOL_DEFAULT, &m_pCausticTex)))
{
return hr;
}
D3DSURFACE_DESC desc;
m_pCausticTex->GetSurfaceLevel(0, &m_pCausticSurf);
m_pCausticSurf->GetDesc(&desc);
if(FAILED(hr = D3DXCreateRenderToSurface(m_pd3dDevice, desc.Width, desc.Height,
desc.Format, FALSE, D3DFMT_UNKNOWN, &m_pRenderToSurface)))
{
return hr;
}
// Shader
TCHAR sz[512];
DXUtil_FindMediaFile(sz, _T("water.sha"));
if(FAILED(hr = D3DXCreateEffectFromFile(m_pd3dDevice, sz, &m_pEffect, NULL)))
return hr;
m_pEffect->SetMatrix("mID", &m_matIdentity);
m_pEffect->SetMatrix("mENV", &m_matIdentity);
m_pEffect->SetTexture("tFLR", m_pFloorTex);
m_pEffect->SetTexture("tCAU", m_pCausticTex);
m_pEffect->SetTexture("tENV", m_pSkyCubeTex);
if(FAILED(hr = GetNextTechnique(0, FALSE)))
return hr;
// Set surfaces
if(FAILED(hr = m_Environment.SetSurfaces(
m_pSkyTex[D3DCUBEMAP_FACE_NEGATIVE_X], m_pSkyTex[D3DCUBEMAP_FACE_POSITIVE_X],
m_pSkyTex[D3DCUBEMAP_FACE_NEGATIVE_Y], m_pSkyTex[D3DCUBEMAP_FACE_POSITIVE_Y],
m_pSkyTex[D3DCUBEMAP_FACE_POSITIVE_Z], m_pSkyTex[D3DCUBEMAP_FACE_NEGATIVE_Z])))
{
return hr;
}
// OnResetDevice
if(FAILED(hr = m_Water.OnResetDevice()))
return hr;
if(FAILED(hr = m_Environment.OnResetDevice()))
return hr;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
HRESULT hr;
m_pFont->InvalidateDeviceObjects();
m_pFontSmall->InvalidateDeviceObjects();
if(FAILED(hr = m_Water.OnLostDevice()))
return hr;
if(FAILED(hr = m_Environment.OnLostDevice()))
return hr;
SAFE_RELEASE(m_pRenderToSurface);
SAFE_RELEASE(m_pEffect);
SAFE_RELEASE(m_pCausticSurf);
SAFE_RELEASE(m_pCausticTex);
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: DeleteDeviceObjects
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
HRESULT hr;
m_pFont->DeleteDeviceObjects();
m_pFontSmall->DeleteDeviceObjects();
if(FAILED(hr = m_Water.OnDestroyDevice()))
return hr;
if(FAILED(hr = m_Environment.OnDestroyDevice()))
return hr;
SAFE_RELEASE(m_pFloorTex);
SAFE_RELEASE(m_pSkyCubeTex);
for(UINT i = 0; i < 6; i++)
SAFE_RELEASE(m_pSkyTex[i]);
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: FrameMove
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FrameMove()
{
HRESULT hr;
//
// Process keyboard input
//
D3DXVECTOR3 vecT(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vecR(0.0f, 0.0f, 0.0f);
if(m_bKey[VK_NUMPAD1] || m_bKey[VK_LEFT]) vecT.x -= 1.0f; // Slide Left
if(m_bKey[VK_NUMPAD3] || m_bKey[VK_RIGHT]) vecT.x += 1.0f; // Slide Right
if(m_bKey[VK_DOWN]) vecT.y -= 1.0f; // Slide Down
if(m_bKey[VK_UP]) vecT.y += 1.0f; // Slide Up
if(m_bKey['W']) vecT.z -= 2.0f; // Move Forward
if(m_bKey['S']) vecT.z += 2.0f; // Move Backward
if(m_bKey['A'] || m_bKey[VK_NUMPAD8]) vecR.x -= 1.0f; // Pitch Down
if(m_bKey['Z'] || m_bKey[VK_NUMPAD2]) vecR.x += 1.0f; // Pitch Up
if(m_bKey['E'] || m_bKey[VK_NUMPAD6]) vecR.y -= 1.0f; // Turn Right
if(m_bKey['Q'] || m_bKey[VK_NUMPAD4]) vecR.y += 1.0f; // Turn Left
if(m_bKey[VK_NUMPAD9]) vecR.z -= 2.0f; // Roll CW
if(m_bKey[VK_NUMPAD7]) vecR.z += 2.0f; // Roll CCW
m_vecVelocity = m_vecVelocity * 0.9f + vecT * 0.1f;
m_vecAngularVelocity = m_vecAngularVelocity * 0.9f + vecR * 0.1f;
//
// Update position and view matricies
//
D3DXMATRIX matT, matR;
D3DXQUATERNION qR;
vecT = m_vecVelocity * m_fElapsedTime * m_fSpeed;
vecR = m_vecAngularVelocity * m_fElapsedTime * m_fAngularSpeed;
D3DXMatrixTranslation(&matT, vecT.x, vecT.y, vecT.z);
D3DXMatrixMultiply(&m_matPosition, &matT, &m_matPosition);
D3DXQuaternionRotationYawPitchRoll(&qR, vecR.y, vecR.x, vecR.z);
D3DXMatrixRotationQuaternion(&matR, &qR);
D3DXMatrixMultiply(&m_matPosition, &matR, &m_matPosition);
D3DXMatrixInverse(&m_matView, NULL, &m_matPosition);
//
// Update simulation
//
if(!m_bPause && m_bDrawWater)
{
BOOL bCaustics = m_bDrawCaustics && m_pEffect->IsParameterUsed("tCAU");
D3DXVECTOR3 vecPos(m_matPosition._41, m_matPosition._42, m_matPosition._43);
D3DXVECTOR3 vecLight(0.0f, 1.0f, 0.0f);
m_Water.Update(vecPos, vecLight, bCaustics);
m_fTime += m_fSecsPerFrame;
if(bCaustics)
{
if(SUCCEEDED(m_pRenderToSurface->BeginScene(m_pCausticSurf, NULL)))
{
D3DXMATRIX matProj;
D3DXMATRIX matView;
D3DXMatrixOrthoRH(&matProj, 63.0f, 63.0f, 1.0f, 100.0f);
D3DXMatrixRotationX(&matView, 0.5f * D3DX_PI);
matView._43 = -50.0f;
m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
m_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0xff000000, 0.0f, 0);
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_Water.DrawCaustics();
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
m_pRenderToSurface->EndScene();
}
else
{
m_bDrawCaustics = FALSE;
m_pEffect->SetTexture("tCAU", NULL);
if(FAILED(hr = GetNextTechnique(0, FALSE)))
return hr;
}
}
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: Render
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::Render()
{
HRESULT hr;
if(FAILED(hr = m_pd3dDevice->BeginScene()))
return hr;
// Draw Environment
FLOAT fAspectRatio = (FLOAT)m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height;
D3DXMatrixPerspectiveFovRH(&m_matProjection, D3DXToRadian(60.0f), fAspectRatio, 0.1f, 2000.0f);
m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProjection);
if(m_bDrawEnvironment)
{
D3DXMATRIX mat(m_matView);
mat._41 = mat._42 = mat._43 = 0.0f;
m_pd3dDevice->SetTransform(D3DTS_VIEW, &mat);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
m_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
m_Environment.Draw();
m_pd3dDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE);
}
else
{
m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
}
m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView);
// Draw water
if(m_bDrawWater)
{
// Setup matrices
if(m_pEffect->IsParameterUsed("mENV"))
{
D3DXMATRIX matP(m_matPosition);
matP._41 = matP._42 = matP._43 = 0.0f;
D3DXMATRIX mat;
D3DXMatrixScaling(&mat, 1.0f, 1.0f, -1.0f);
D3DXMatrixMultiply(&mat, &matP, &mat);
// matCube
m_pEffect->SetMatrix("mENV", &mat);
}
// Draw water
UINT uPasses;
m_pEffect->Begin(&uPasses, 0);
for(UINT uPass = 0; uPass < uPasses; uPass++)
{
m_pEffect->Pass(uPass);
m_Water.DrawSurface();
}
m_pEffect->End();
}
// Show info
m_pFont->DrawText( 2, 0, D3DCOLOR_ARGB(255,255,255,0), m_strFrameStats );
m_pFont->DrawText( 2, 20, D3DCOLOR_ARGB(255,255,255,0), m_strDeviceStats );
TCHAR szText[100];
wsprintf( szText, _T("Using Technique %d"), m_iTechnique );
m_pFontSmall->DrawText( 2, 40, D3DCOLOR_ARGB(255,255,100,100), szText );
if( m_bShowHelp )
{
m_pFontSmall->DrawText( 2, 60, D3DCOLOR_ARGB(255,100,100,200),
_T("Keyboard controls:") );
m_pFontSmall->DrawText( 20, 80, D3DCOLOR_ARGB(255,100,100,200),
_T("Add Drop\n")
_T("Next Technique\n")
_T("Next Tech. (no validate)\n")
_T("Prev Technique\n")
_T("Prev Tech. (no validate)\n")
_T("Move\nTurn\nPitch\nSlide\n")
_T("Help\nChange device\nExit") );
m_pFontSmall->DrawText( 210, 80, D3DCOLOR_ARGB(255,100,100,200),
_T("D\n")
_T("PageDn\nShift-PageDn\n")
_T("PageUp\nShift-PageUp\n")
_T("W,S\nE,Q\nA,Z\nArrow keys\n")
_T("F1\nF2\nEsc") );
}
else
{
m_pFontSmall->DrawText( 2, 60, D3DCOLOR_ARGB(255,100,100,200),
_T("Press F1 for help") );
}
if(FAILED(hr = m_pd3dDevice->EndScene()))
return hr;
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: MsgProc
// Desc:
//-----------------------------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam )
{
switch( uMsg )
{
case WM_KEYDOWN:
m_bKey[wParam] = TRUE;
break;
case WM_KEYUP:
m_bKey[wParam] = FALSE;
break;
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDM_ADDDROP:
m_Water.Drop();
break;
case IDM_NEXT_TECHNIQUE:
GetNextTechnique(1, FALSE);
break;
case IDM_NEXT_TECHNIQUE_NOVALIDATE:
GetNextTechnique(1, TRUE);
break;
case IDM_PREV_TECHNIQUE:
GetNextTechnique(-1, FALSE);
break;
case IDM_PREV_TECHNIQUE_NOVALIDATE:
GetNextTechnique(-1, TRUE);
break;
case IDM_TOGGLEHELP:
m_bShowHelp = !m_bShowHelp;
break;
}
}
}
return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,44 @@
//-----------------------------------------------------------------------------
// Name: Water Direct3D Sample
//
// Copyright (c) 1998-2001 Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
Description
===========
The Water sample illustrates using D3DX techniques stored in shader files.
The sample shows a square pound inside a building, with rippling water
effects including water caustics.
Path
====
Source: DXSDK\Samples\Multimedia\D3D\Water
Executable: DXSDK\Samples\Multimedia\D3D\Bin
User's Guide
============
The following keys are implemented. The dropdown menus can be used for the
same controls.
<Enter> Starts and stops the scene
<Space> Advances the scene by a small increment
<F1> Shows help or available commands.
<F2> Prompts user to select a new rendering device or display mode
<Alt+Enter> Toggles between fullscreen and windowed modes
<Esc> Exits the app.
<D> Starts a water drop
NumPad Navigates the scene
Programming Notes
=================
The D3DX shaders technique is the focus of this sample.
This sample makes use of common DirectX code (consisting of helper functions,
etc.) that is shared with other samples on the DirectX SDK. All common
headers and source code can be found in the following directory:
DXSDK\Samples\Multimedia\Common

View File

@@ -0,0 +1,41 @@
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by winmain.rc
//
#define IDI_MAIN_ICON 101
#define IDR_MAIN_ACCEL 113
#define IDR_MENU 141
#define IDR_POPUP 142
#define IDD_SELECTDEVICE 144
#define IDC_DEVICE_COMBO 1000
#define IDC_MODE_COMBO 1001
#define IDC_ADAPTER_COMBO 1002
#define IDC_FULLSCREENMODES_COMBO 1003
#define IDC_MULTISAMPLE_COMBO 1005
#define IDC_WINDOWED_CHECKBOX 1012
#define IDC_FULLSCREEN_TEXT 1014
#define IDC_WINDOW 1016
#define IDC_FULLSCREEN 1018
#define IDM_TOGGLEHELP 40001
#define IDM_CHANGEDEVICE 40002
#define IDM_TOGGLEFULLSCREEN 40003
#define IDM_TOGGLESTART 40004
#define IDM_SINGLESTEP 40005
#define IDM_EXIT 40006
#define IDM_ADDDROP 40012
#define IDM_NEXT_TECHNIQUE 40013
#define IDM_NEXT_TECHNIQUE_NOVALIDATE 40014
#define IDM_PREV_TECHNIQUE 40015
#define IDM_PREV_TECHNIQUE_NOVALIDATE 40016
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 146
#define _APS_NEXT_COMMAND_VALUE 40017
#define _APS_NEXT_CONTROL_VALUE 1027
#define _APS_NEXT_SYMED_VALUE 102
#endif
#endif

View File

@@ -0,0 +1,171 @@
# Microsoft Developer Studio Project File - Name="Water" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Application" 0x0101
CFG=Water - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "water.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "water.mak" CFG="Water - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "Water - Win32 Release" (based on "Win32 (x86) Application")
!MESSAGE "Water - Win32 Debug" (based on "Win32 (x86) Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "Water - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "..\..\common\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
# ADD LINK32 dxguid.lib d3dx8.lib d3d8.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:windows /machine:I386 /stack:0x200000,0x200000
!ELSEIF "$(CFG)" == "Water - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\..\common\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
# ADD LINK32 dxguid.lib d3dx8dt.lib d3d8.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /stack:0x200000,0x200000
!ENDIF
# Begin Target
# Name "Water - Win32 Release"
# Name "Water - Win32 Debug"
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\directx.ico
# End Source File
# Begin Source File
SOURCE=.\resource.h
# End Source File
# Begin Source File
SOURCE=.\winmain.rc
# End Source File
# End Group
# Begin Group "Common"
# PROP Default_Filter ""
# Begin Source File
SOURCE=..\..\common\src\d3dapp.cpp
# End Source File
# Begin Source File
SOURCE=..\..\common\include\d3dapp.h
# End Source File
# Begin Source File
SOURCE=..\..\common\include\d3dfile.h
# End Source File
# Begin Source File
SOURCE=..\..\common\src\d3dfont.cpp
# End Source File
# Begin Source File
SOURCE=..\..\common\include\d3dfont.h
# End Source File
# Begin Source File
SOURCE=..\..\common\src\d3dutil.cpp
# End Source File
# Begin Source File
SOURCE=..\..\common\include\d3dutil.h
# End Source File
# Begin Source File
SOURCE=..\..\common\src\dxutil.cpp
# End Source File
# Begin Source File
SOURCE=..\..\common\include\dxutil.h
# End Source File
# End Group
# Begin Source File
SOURCE=.\CEnvironment.cpp
# End Source File
# Begin Source File
SOURCE=.\CEnvironment.h
# End Source File
# Begin Source File
SOURCE=.\CWater.cpp
# End Source File
# Begin Source File
SOURCE=.\CWater.h
# End Source File
# Begin Source File
SOURCE=.\CWaterApp.cpp
# End Source File
# Begin Source File
SOURCE=.\readme.txt
# End Source File
# End Target
# End Project

View File

@@ -0,0 +1,29 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "Water"=.\water.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@@ -0,0 +1,259 @@
# Microsoft Developer Studio Generated NMAKE File, Based on water.dsp
!IF "$(CFG)" == ""
CFG=Water - Win32 Debug
!MESSAGE No configuration specified. Defaulting to Water - Win32 Debug.
!ENDIF
!IF "$(CFG)" != "Water - Win32 Release" && "$(CFG)" != "Water - Win32 Debug"
!MESSAGE Invalid configuration "$(CFG)" specified.
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "water.mak" CFG="Water - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "Water - Win32 Release" (based on "Win32 (x86) Application")
!MESSAGE "Water - Win32 Debug" (based on "Win32 (x86) Application")
!MESSAGE
!ERROR An invalid configuration is specified.
!ENDIF
!IF "$(OS)" == "Windows_NT"
NULL=
!ELSE
NULL=nul
!ENDIF
!IF "$(CFG)" == "Water - Win32 Release"
OUTDIR=.\Release
INTDIR=.\Release
# Begin Custom Macros
OutDir=.\Release
# End Custom Macros
ALL : "$(OUTDIR)\water.exe"
CLEAN :
-@erase "$(INTDIR)\CEnvironment.obj"
-@erase "$(INTDIR)\CWater.obj"
-@erase "$(INTDIR)\CWaterApp.obj"
-@erase "$(INTDIR)\d3dapp.obj"
-@erase "$(INTDIR)\d3dfont.obj"
-@erase "$(INTDIR)\d3dutil.obj"
-@erase "$(INTDIR)\dxutil.obj"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(INTDIR)\winmain.res"
-@erase "$(OUTDIR)\water.exe"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
CPP=cl.exe
CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "..\..\common\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\water.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
.c{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.c{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
MTL=midl.exe
MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
RSC=rc.exe
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\winmain.res" /d "NDEBUG"
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\water.bsc"
BSC32_SBRS= \
LINK32=link.exe
LINK32_FLAGS=dxguid.lib d3dx8.lib d3d8.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)\water.pdb" /machine:I386 /out:"$(OUTDIR)\water.exe" /stack:0x200000,0x200000
LINK32_OBJS= \
"$(INTDIR)\d3dapp.obj" \
"$(INTDIR)\d3dfont.obj" \
"$(INTDIR)\d3dutil.obj" \
"$(INTDIR)\dxutil.obj" \
"$(INTDIR)\CEnvironment.obj" \
"$(INTDIR)\CWater.obj" \
"$(INTDIR)\CWaterApp.obj" \
"$(INTDIR)\winmain.res"
"$(OUTDIR)\water.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
!ELSEIF "$(CFG)" == "Water - Win32 Debug"
OUTDIR=.\Debug
INTDIR=.\Debug
# Begin Custom Macros
OutDir=.\Debug
# End Custom Macros
ALL : "$(OUTDIR)\water.exe"
CLEAN :
-@erase "$(INTDIR)\CEnvironment.obj"
-@erase "$(INTDIR)\CWater.obj"
-@erase "$(INTDIR)\CWaterApp.obj"
-@erase "$(INTDIR)\d3dapp.obj"
-@erase "$(INTDIR)\d3dfont.obj"
-@erase "$(INTDIR)\d3dutil.obj"
-@erase "$(INTDIR)\dxutil.obj"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(INTDIR)\vc60.pdb"
-@erase "$(INTDIR)\winmain.res"
-@erase "$(OUTDIR)\water.exe"
-@erase "$(OUTDIR)\water.ilk"
-@erase "$(OUTDIR)\water.pdb"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
CPP=cl.exe
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /I "..\..\common\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\water.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
.c{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.obj::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.c{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cpp{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
.cxx{$(INTDIR)}.sbr::
$(CPP) @<<
$(CPP_PROJ) $<
<<
MTL=midl.exe
MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
RSC=rc.exe
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\winmain.res" /d "_DEBUG"
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\water.bsc"
BSC32_SBRS= \
LINK32=link.exe
LINK32_FLAGS=dxguid.lib d3dx8dt.lib d3d8.lib winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\water.pdb" /debug /machine:I386 /out:"$(OUTDIR)\water.exe" /pdbtype:sept /stack:0x200000,0x200000
LINK32_OBJS= \
"$(INTDIR)\d3dapp.obj" \
"$(INTDIR)\d3dfont.obj" \
"$(INTDIR)\d3dutil.obj" \
"$(INTDIR)\dxutil.obj" \
"$(INTDIR)\CEnvironment.obj" \
"$(INTDIR)\CWater.obj" \
"$(INTDIR)\CWaterApp.obj" \
"$(INTDIR)\winmain.res"
"$(OUTDIR)\water.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)
<<
!ENDIF
!IF "$(NO_EXTERNAL_DEPS)" != "1"
!IF EXISTS("water.dep")
!INCLUDE "water.dep"
!ELSE
!MESSAGE Warning: cannot find "water.dep"
!ENDIF
!ENDIF
!IF "$(CFG)" == "Water - Win32 Release" || "$(CFG)" == "Water - Win32 Debug"
SOURCE=.\winmain.rc
"$(INTDIR)\winmain.res" : $(SOURCE) "$(INTDIR)"
$(RSC) $(RSC_PROJ) $(SOURCE)
SOURCE=..\..\common\src\d3dapp.cpp
"$(INTDIR)\d3dapp.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) $(CPP_PROJ) $(SOURCE)
SOURCE=..\..\common\src\d3dfont.cpp
"$(INTDIR)\d3dfont.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) $(CPP_PROJ) $(SOURCE)
SOURCE=..\..\common\src\d3dutil.cpp
"$(INTDIR)\d3dutil.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) $(CPP_PROJ) $(SOURCE)
SOURCE=..\..\common\src\dxutil.cpp
"$(INTDIR)\dxutil.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) $(CPP_PROJ) $(SOURCE)
SOURCE=.\CEnvironment.cpp
"$(INTDIR)\CEnvironment.obj" : $(SOURCE) "$(INTDIR)"
SOURCE=.\CWater.cpp
"$(INTDIR)\CWater.obj" : $(SOURCE) "$(INTDIR)"
SOURCE=.\CWaterApp.cpp
"$(INTDIR)\CWaterApp.obj" : $(SOURCE) "$(INTDIR)"
!ENDIF

View File

@@ -0,0 +1,185 @@
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define IDC_STATIC -1
#include <windows.h>
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_MAIN_ICON ICON DISCARDABLE "DirectX.ico"
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#define IDC_STATIC -1\r\n"
"#include <windows.h>\r\n"
"\r\n"
"\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Accelerator
//
IDR_MAIN_ACCEL ACCELERATORS DISCARDABLE
BEGIN
"D", IDM_ADDDROP, VIRTKEY, NOINVERT
VK_ESCAPE, IDM_EXIT, VIRTKEY, NOINVERT
VK_F1, IDM_TOGGLEHELP, VIRTKEY, NOINVERT
VK_F2, IDM_CHANGEDEVICE, VIRTKEY, NOINVERT
VK_NEXT, IDM_NEXT_TECHNIQUE, VIRTKEY, NOINVERT
VK_NEXT, IDM_NEXT_TECHNIQUE_NOVALIDATE, VIRTKEY, SHIFT, NOINVERT
VK_PRIOR, IDM_PREV_TECHNIQUE, VIRTKEY, NOINVERT
VK_PRIOR, IDM_PREV_TECHNIQUE_NOVALIDATE, VIRTKEY, SHIFT, NOINVERT
VK_RETURN, IDM_TOGGLESTART, VIRTKEY, NOINVERT
VK_RETURN, IDM_TOGGLEFULLSCREEN, VIRTKEY, ALT, NOINVERT
VK_SPACE, IDM_SINGLESTEP, VIRTKEY, NOINVERT
"X", IDM_EXIT, VIRTKEY, ALT, NOINVERT
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_SELECTDEVICE, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 259
TOPMARGIN, 7
BOTTOMMARGIN, 143
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_SELECTDEVICE DIALOG DISCARDABLE 0, 0, 267, 138
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Select Device"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Rendering device",IDC_STATIC,5,5,200,45
LTEXT "&Adapter:",IDC_STATIC,22,17,65,10,SS_CENTERIMAGE
COMBOBOX IDC_ADAPTER_COMBO,90,15,105,100,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
LTEXT "&Device:",IDC_STATIC,22,32,65,10,SS_CENTERIMAGE
COMBOBOX IDC_DEVICE_COMBO,90,30,105,100,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
GROUPBOX "Rendering mode",IDC_STATIC,5,52,200,45
CONTROL "Use desktop &window",IDC_WINDOW,"Button",
BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,10,62,85,15
CONTROL "&Fullscreen mode:",IDC_FULLSCREEN,"Button",
BS_AUTORADIOBUTTON,10,77,75,15
COMBOBOX IDC_FULLSCREENMODES_COMBO,90,77,105,204,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_GROUP | WS_TABSTOP
GROUPBOX "Multisample",IDC_STATIC,5,101,200,28
LTEXT "&Multisample Type:",IDC_STATIC,22,113,62,10,
SS_CENTERIMAGE
COMBOBOX IDC_MULTISAMPLE_COMBO,90,111,105,100,CBS_DROPDOWNLIST |
WS_VSCROLL | WS_TABSTOP
DEFPUSHBUTTON "OK",IDOK,210,10,50,14
PUSHBUTTON "Cancel",IDCANCEL,210,30,50,14
END
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_MENU MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&Go/stop\tEnter", IDM_TOGGLESTART
MENUITEM "&Single step\tSpace", IDM_SINGLESTEP
MENUITEM SEPARATOR
MENUITEM "&Change device...\tF2", IDM_CHANGEDEVICE
MENUITEM SEPARATOR
MENUITEM "E&xit\tESC", IDM_EXIT
END
END
IDR_POPUP MENU DISCARDABLE
BEGIN
POPUP "Popup"
BEGIN
MENUITEM "&Go/stop", IDM_TOGGLESTART
MENUITEM "&Single step", IDM_SINGLESTEP
MENUITEM SEPARATOR
MENUITEM "&Change device...", IDM_CHANGEDEVICE
MENUITEM SEPARATOR
MENUITEM "E&xit", IDM_EXIT
END
END
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED