Files
Client/Engine/Zalla3D Base Class/NTexture.cpp
LGram16 e067522598 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>
2025-11-29 16:24:34 +09:00

272 lines
6.0 KiB
C++

#include ".\ntexture.h"
#include <d3dx8.h>
#include "./GraphicLayerError.h"
#include "GMMemory.h"
namespace CROSSM {
char CNTexture::m_strPath[256];
LPDIRECT3DDEVICE8 CNTexture::ms_pd3dDevice = NULL;
int CNTexture::m_SkipMipLevel=0;
IDirect3DTexture8* CNTexture::ms_pNullTexture = NULL;
bool CNTexture::ms_bNullTextureMode = false;
void CNTexture::Init(LPDIRECT3DDEVICE8 lpDevice)
{
ms_pd3dDevice = lpDevice;
ms_pd3dDevice->AddRef();
// create 1x1 texture
if (FAILED(ms_pd3dDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &ms_pNullTexture)))
{
ms_pd3dDevice->Release();
}
D3DLOCKED_RECT lr;
ms_pNullTexture->LockRect(0, &lr, NULL, 0);
*((D3DCOLOR*)(lr.pBits)) = D3DCOLOR_ARGB(0xFF, 0xFF, 0xFF, 0xFF);
ms_pNullTexture->UnlockRect(0);
ms_bNullTextureMode = false;
}
void CNTexture::Close()
{
if (NULL != ms_pNullTexture)
{
ms_pNullTexture->Release();
ms_pNullTexture = NULL;
}
if (NULL != ms_pd3dDevice)
{
ms_pd3dDevice->Release();
}
}
CNTexture::CNTexture(void) :m_pddTexture(NULL), m_bInterface(false)
{
m_dwWidth = m_dwHeight = 0;
m_bCreateEmpty = false;
}
CNTexture::~CNTexture(void)
{
if(m_pddTexture)
{
SafeRelease(m_pddTexture);
m_pddTexture =NULL;
}
}
bool CNTexture::Load()
{
DDS_HEADER ddsh;
if(strstr(m_strPath,"Interface")==0)
{
m_bInterface = false;
}
else
{
m_bInterface = true;
}
if(m_bInterface)
{
if(!m_pByteDataObj)
{
return false;
}
// magic header(ignore)
m_pByteDataObj->Read(&m_dwValue[0],sizeof(DWORD),1);
// DDS HEADER
m_pByteDataObj->Read(&ddsh,sizeof(ddsh),1);
m_dwWidth=ddsh.dwWidth;
m_dwHeight=ddsh.dwHeight;
// num mip
m_dwValue[0] = (ddsh.dwMipMapCount == 0) ? 1 : ddsh.dwMipMapCount;
// depth
m_dwValue[1] = (ddsh.dwHeaderFlags & DDS_HEADER_FLAGS_VOLUME) ? ddsh.dwDepth : 0;
if (ddsh.ddspf.dwFourCC == D3DFMT_DXT1)
m_fmt = D3DFMT_DXT1;
else if (ddsh.ddspf.dwFourCC == D3DFMT_DXT2)
m_fmt = D3DFMT_DXT2;
else if (ddsh.ddspf.dwFourCC == D3DFMT_DXT3)
m_fmt = D3DFMT_DXT3;
else if (ddsh.ddspf.dwFourCC == D3DFMT_DXT4)
m_fmt = D3DFMT_DXT4;
else if (ddsh.ddspf.dwFourCC == D3DFMT_DXT5)
m_fmt = D3DFMT_DXT5;
else if (ddsh.ddspf.dwFlags == DDS_RGBA && ddsh.ddspf.dwRGBBitCount == 32 && ddsh.ddspf.dwABitMask == 0xff000000)
m_fmt = D3DFMT_A8R8G8B8;
else if (ddsh.ddspf.dwFlags == DDS_RGB && ddsh.ddspf.dwRGBBitCount == 24)
m_fmt = D3DFMT_R8G8B8;
else if (ddsh.ddspf.dwFlags == DDS_RGB && ddsh.ddspf.dwRGBBitCount == 16 && ddsh.ddspf.dwGBitMask == 0x000007e0)
m_fmt = D3DFMT_R5G6B5;
else if (ddsh.ddspf.dwFlags == DDS_RGBA && ddsh.ddspf.dwRGBBitCount == 16 && ddsh.ddspf.dwABitMask == 0x00008000)
m_fmt = D3DFMT_A1R5G5B5;
else if (ddsh.ddspf.dwFlags == DDS_RGBA && ddsh.ddspf.dwRGBBitCount == 16 && ddsh.ddspf.dwABitMask == 0x0000f000)
m_fmt = D3DFMT_A4R4G4B4;
else
return false;
}
return true;
}
bool CNTexture::Unload()
{
return true;
}
bool CNTexture::PostLoad()
{
if(!m_pByteDataObj)
return false;
LPDIRECT3DTEXTURE8 pmiptex = NULL;
if(!m_bInterface)
{
DWORD dwMagic=MAKEFOURCC('D','D','S',' ');
DWORD *pHeader = NULL;
pHeader = (DWORD *)m_pByteDataObj->GetReadPtr();
if(pHeader == NULL)
return false;
*pHeader = dwMagic;
HRESULT hr=D3DXCreateTextureFromFileInMemory(ms_pd3dDevice,pHeader,m_pByteDataObj->GetByteSize(),&pmiptex);
if(hr != D3D_OK)
{
printf("");
}
if(pmiptex == NULL)
{
printf("");
}
}
else
{
if (FAILED(ms_pd3dDevice->CreateTexture(m_dwWidth>>m_SkipMipLevel, m_dwHeight>>m_SkipMipLevel, m_dwValue[0]-m_SkipMipLevel, 0, m_fmt, D3DPOOL_MANAGED, &pmiptex)))
{
CGraphicLayerError("CTexture:ReadDDSTexture , CreateTexture is failed");
}
if (FAILED(LoadAllMipSurfaces(pmiptex, m_dwValue[0])))
{
MessageBox(NULL,"LoadAllMipSurface Load Failed",0,0);
CGraphicLayerError("CTexture:ReadDDSTexture , LoadAllMipSurfaces is failed");
}
}
m_pddTexture = pmiptex;
return true;
}
HRESULT CNTexture::LoadAllMipSurfaces(LPDIRECT3DBASETEXTURE8 ptex, long numMips)
{
HRESULT hr;
LPDIRECT3DSURFACE8 psurf;
D3DSURFACE_DESC sd;
D3DLOCKED_RECT lr;
LPDIRECT3DTEXTURE8 pmiptex = NULL;
DWORD dwBytesPerRow;
pmiptex = (LPDIRECT3DTEXTURE8)ptex;
long iLevel;
for (iLevel = 0; iLevel < numMips; iLevel++)
{
if (pmiptex != NULL)
hr = pmiptex->GetSurfaceLevel(iLevel-m_SkipMipLevel, &psurf);
if (FAILED(hr))
return hr;
psurf->GetDesc(&sd);
switch (sd.Format)
{
case D3DFMT_DXT1:
case D3DFMT_DXT2:
case D3DFMT_DXT3:
case D3DFMT_DXT4:
case D3DFMT_DXT5:
dwBytesPerRow = 0; // magic value indicates texture's memory is contiguous
break;
case D3DFMT_A8R8G8B8:
dwBytesPerRow = 4 * sd.Width;
break;
case D3DFMT_R8G8B8:
dwBytesPerRow = 3 * sd.Width;
break;
case D3DFMT_A1R5G5B5:
case D3DFMT_A4R4G4B4:
case D3DFMT_R5G6B5:
dwBytesPerRow = 2 * sd.Width;
break;
default:
return E_FAIL;
}
if (pmiptex != NULL)
hr = pmiptex->LockRect(iLevel, &lr, NULL, 0);
if (FAILED(hr))
return hr;
if (dwBytesPerRow == 0)
{
//fread(lr.pBits,sd.Size,1,fp);
m_pByteDataObj->Read(lr.pBits,sd.Size,1);
}
else
{
DWORD yp;
BYTE* pbDest = (BYTE*)lr.pBits;
for (yp = 0; yp < sd.Height; yp++)
{
//fread(pbDest,dwBytesPerRow,1,fp);
m_pByteDataObj->Read(pbDest,dwBytesPerRow,1);
pbDest += lr.Pitch;
}
}
if (pmiptex != NULL)
hr = pmiptex->UnlockRect(iLevel);
ReleasePpo(&psurf);
}
return S_OK;
}
LPDIRECT3DBASETEXTURE8 CNTexture::GetTexture()
{
if (ms_bNullTextureMode)
{
return ms_pNullTexture;
}
return m_pddTexture;
}
void CNTexture::NullTextureMode(bool bNullTexture)
{
ms_bNullTextureMode = bNullTexture;
}
}