mirror of
https://github.com/thug1src/thug.git
synced 2025-01-22 05:43:47 +00:00
155 lines
5.4 KiB
C++
155 lines
5.4 KiB
C++
#pragma once
|
|
//-----------------------------------------------------------------------------
|
|
// File: XBFur.h
|
|
//
|
|
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
#include <xtl.h>
|
|
//#include "xfvf.h"
|
|
#include <gfx/xbox/p_nxgeom.h>
|
|
|
|
#define XBFUR_MAXSLICE_LOG2 5
|
|
#define XBFUR_MAXSLICE (1 << XBFUR_MAXSLICE_LOG2)
|
|
|
|
extern float g_fOneInch;
|
|
|
|
#define FVF_XYZDIFF (D3DFVF_XYZ|D3DFVF_DIFFUSE)
|
|
|
|
typedef struct sFVFT_XYZDIFF
|
|
{
|
|
D3DVECTOR v;
|
|
DWORD diff;
|
|
} FVFT_XYZDIFF;
|
|
|
|
|
|
// patch generation
|
|
|
|
// a fuzz is a single hair follicle, blade of grass, etc.
|
|
struct Fuzz
|
|
{
|
|
D3DVECTOR dp; // velocity
|
|
D3DVECTOR ddp; // acceleration
|
|
D3DXCOLOR colorBase;
|
|
D3DXCOLOR colorTip;
|
|
};
|
|
|
|
// a fuzz instance is a single instance of a fuzz
|
|
// located at x, z on the patch
|
|
// we create only a limited number of unique fuzzes
|
|
// and index the library with lidx.
|
|
struct FuzzInst
|
|
{
|
|
float x, z; // fuzz location
|
|
int lidx; // library index
|
|
};
|
|
|
|
// a fur patch is a volume that holds fuzzes.
|
|
// xsize and zsize are chosen by the user
|
|
// ysize is calculated using the height of the
|
|
// tallest fuzz
|
|
class CXBFur
|
|
{
|
|
friend class CXBFurMesh;
|
|
public:
|
|
DWORD m_dwSeed; // patch seed
|
|
|
|
float m_fXSize; // patch size in world coords
|
|
float m_fYSize;
|
|
float m_fZSize;
|
|
|
|
// fuzz library
|
|
DWORD m_dwNumSegments; // # of segments in highest LOD
|
|
Fuzz m_fuzzCenter; // fuzz constant
|
|
Fuzz m_fuzzRandom; // random offset around center
|
|
DWORD m_dwNumFuzzLib; // # of fuzz in the library
|
|
Fuzz *m_pFuzzLib; // fuzz library
|
|
|
|
// fuzz instances
|
|
DWORD m_dwNumFuzz; // # of fuzz in this patch
|
|
FuzzInst *m_pFuzz;
|
|
|
|
// patch volume
|
|
DWORD m_dwNumSlices; // # of layers in the volume
|
|
DWORD m_dwSliceSize; // width*height
|
|
DWORD m_dwSliceXSize; // width of volume texture slice
|
|
DWORD m_dwSliceZSize; // height of volume texture slice
|
|
LPDIRECT3DTEXTURE8 m_apSliceTexture[XBFUR_MAXSLICE * 2 - 1]; // slices of volume texture
|
|
// ... followed by level-of-detail textures N/2, N/4, N/8, ... 1
|
|
|
|
// LOD textures
|
|
DWORD m_dwNumSlicesLOD; // number of slices in current level of detail
|
|
float m_fLevelOfDetail; // current LOD value
|
|
DWORD m_iLOD; // current integer LOD value
|
|
float m_fLODFraction; // fraction towards next coarser level-of-detail
|
|
DWORD m_dwLODMax; // maximum LOD index
|
|
LPDIRECT3DTEXTURE8 *m_pSliceTextureLOD; // current level of detail pointer into m_apSliceTexture array
|
|
|
|
// hair lighting texture
|
|
D3DMATERIAL8 m_HairLightingMaterial;
|
|
LPDIRECT3DTEXTURE8 m_pHairLightingTexture;
|
|
|
|
// fin texture
|
|
DWORD m_finWidth, m_finHeight; // size of fin texture
|
|
float m_fFinXFraction, m_fFinZFraction; // portion of hair texture to put into fin
|
|
LPDIRECT3DTEXTURE8 m_pFinTexture; // texture projected from the side
|
|
|
|
CXBFur();
|
|
~CXBFur();
|
|
void InitFuzz(DWORD nfuzz, DWORD nfuzzlib);
|
|
void GenSlices(DWORD nslices, DWORD slicexsize, DWORD slicezsize);
|
|
void GenFin(DWORD finWidth, DWORD finHeight, float fFinXFraction, float fFinZFraction);
|
|
void GetLinesVertexBuffer(IDirect3DVertexBuffer8 **ppVB);
|
|
void RenderLines();
|
|
void Save(char *fname, int flags);
|
|
void Load(char *fname);
|
|
HRESULT SetHairLightingMaterial(D3DMATERIAL8 *pMaterial);
|
|
void SetPatchSize(float x, float z)
|
|
{
|
|
m_fXSize = x;
|
|
m_fZSize = z;
|
|
InitFuzz(m_dwNumFuzz, m_dwNumFuzzLib); // re-init the fuzz. automatically sets ysize
|
|
};
|
|
void SetFVel(float cx, float cy, float cz, float rx, float ry, float rz)
|
|
{
|
|
m_fuzzCenter.dp.x = cx; m_fuzzCenter.dp.y = cy; m_fuzzCenter.dp.z = cz;
|
|
m_fuzzRandom.dp.x = rx; m_fuzzRandom.dp.y = ry; m_fuzzRandom.dp.z = rz;
|
|
};
|
|
void SetFAcc(float cx, float cy, float cz, float rx, float ry, float rz)
|
|
{
|
|
m_fuzzCenter.ddp.x = cx; m_fuzzCenter.ddp.y = cy; m_fuzzCenter.ddp.z = cz;
|
|
m_fuzzRandom.ddp.x = rx; m_fuzzRandom.ddp.y = ry; m_fuzzRandom.ddp.z = rz;
|
|
};
|
|
|
|
// fLevelOfDetail can range from 0 to log2(NumSlices)
|
|
HRESULT SetLevelOfDetail(float fLevelOfDetail);
|
|
HRESULT ComputeLevelOfDetailTextures();
|
|
inline UINT LevelOfDetailCount(UINT iLOD)
|
|
{
|
|
return m_dwNumSlices >> iLOD;
|
|
}
|
|
inline UINT LevelOfDetailIndex(UINT iLOD)
|
|
{
|
|
UINT offset = 0;
|
|
for (UINT i = 1; i <= iLOD; i++)
|
|
offset += LevelOfDetailCount(i-1);
|
|
return offset;
|
|
}
|
|
inline UINT TotalTextureCount()
|
|
{
|
|
UINT TextureCount = 0;
|
|
for (UINT iLOD = 0; m_dwNumSlices >> iLOD; iLOD++)
|
|
TextureCount += LevelOfDetailCount(iLOD);
|
|
return TextureCount;
|
|
}
|
|
|
|
// Compress textures one at a time until all are done.
|
|
// Returns S_OK when all the textures are in fmtNew format.
|
|
// Returns S_FALSE if there are textures still to be done.
|
|
HRESULT CompressNextTexture(D3DFORMAT fmtNew, UINT *pTextureIndex);
|
|
};
|
|
|
|
HRESULT FillHairLightingTexture(D3DMATERIAL8 *pMaterial, LPDIRECT3DTEXTURE8 pTexture);
|
|
bool AddGrass( Nx::CXboxGeom *p_geom, NxXbox::sMesh *p_mesh );
|
|
HRESULT LoadBumpTextures( void );
|
|
|