184 lines
4.3 KiB
C++
184 lines
4.3 KiB
C++
#include "StdAfx.h"
|
|
#include "BlockTexture.h"
|
|
#include "GrpBase.h"
|
|
#include "GrpDib.h"
|
|
#include "../eterbase/Stl.h"
|
|
#include "../eterlib/StateManager.h"
|
|
|
|
void CBlockTexture::SetClipRect(const RECT & c_rRect)
|
|
{
|
|
m_bClipEnable = TRUE;
|
|
m_clipRect = c_rRect;
|
|
}
|
|
|
|
void CBlockTexture::Render(int ix, int iy)
|
|
{
|
|
int isx = ix + m_rect.left;
|
|
int isy = iy + m_rect.top;
|
|
int iex = ix + m_rect.left + m_dwWidth;
|
|
int iey = iy + m_rect.top + m_dwHeight;
|
|
|
|
float su = 0.0f;
|
|
float sv = 0.0f;
|
|
float eu = 1.0f;
|
|
float ev = 1.0f;
|
|
|
|
if (m_bClipEnable)
|
|
{
|
|
if (isx > m_clipRect.right)
|
|
return;
|
|
if (iex < m_clipRect.left)
|
|
return;
|
|
|
|
if (isy > m_clipRect.bottom)
|
|
return;
|
|
if (iey < m_clipRect.top)
|
|
return;
|
|
|
|
if (m_clipRect.left > isx)
|
|
{
|
|
int idx = m_clipRect.left - isx;
|
|
isx += idx;
|
|
su += float(idx) / float(m_dwWidth);
|
|
}
|
|
if (iex > m_clipRect.right)
|
|
{
|
|
int idx = iex - m_clipRect.right;
|
|
iex -= idx;
|
|
eu -= float(idx) / float(m_dwWidth);
|
|
}
|
|
|
|
if (m_clipRect.top > isy)
|
|
{
|
|
int idy = m_clipRect.top - isy;
|
|
isy += idy;
|
|
sv += float(idy) / float(m_dwHeight);
|
|
}
|
|
if (iey > m_clipRect.bottom)
|
|
{
|
|
int idy = iey - m_clipRect.bottom;
|
|
iey -= idy;
|
|
ev -= float(idy) / float(m_dwHeight);
|
|
}
|
|
}
|
|
|
|
TPDTVertex vertices[4];
|
|
vertices[0].position.x = isx - 0.5f;
|
|
vertices[0].position.y = isy - 0.5f;
|
|
vertices[0].position.z = 0.0f;
|
|
vertices[0].texCoord = TTextureCoordinate(su, sv);
|
|
vertices[0].diffuse = 0xffffffff;
|
|
|
|
vertices[1].position.x = iex - 0.5f;
|
|
vertices[1].position.y = isy - 0.5f;
|
|
vertices[1].position.z = 0.0f;
|
|
vertices[1].texCoord = TTextureCoordinate(eu, sv);
|
|
vertices[1].diffuse = 0xffffffff;
|
|
|
|
vertices[2].position.x = isx - 0.5f;
|
|
vertices[2].position.y = iey - 0.5f;
|
|
vertices[2].position.z = 0.0f;
|
|
vertices[2].texCoord = TTextureCoordinate(su, ev);
|
|
vertices[2].diffuse = 0xffffffff;
|
|
|
|
vertices[3].position.x = iex - 0.5f;
|
|
vertices[3].position.y = iey - 0.5f;
|
|
vertices[3].position.z = 0.0f;
|
|
vertices[3].texCoord = TTextureCoordinate(eu, ev);
|
|
vertices[3].diffuse = 0xffffffff;
|
|
|
|
if (CGraphicBase::SetPDTStream(vertices, 4))
|
|
{
|
|
CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT);
|
|
|
|
STATEMANAGER.SetTexture(0, m_lpd3dTexture);
|
|
STATEMANAGER.SetTexture(1, NULL);
|
|
STATEMANAGER.SetVertexShader(D3DFVF_XYZ|D3DFVF_TEX1|D3DFVF_DIFFUSE);
|
|
STATEMANAGER.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 4, 0, 2);
|
|
}
|
|
}
|
|
|
|
void CBlockTexture::InvalidateRect(const RECT & c_rsrcRect)
|
|
{
|
|
RECT dstRect = m_rect;
|
|
if (c_rsrcRect.right < dstRect.left ||
|
|
c_rsrcRect.left > dstRect.right ||
|
|
c_rsrcRect.bottom < dstRect.top ||
|
|
c_rsrcRect.top > dstRect.bottom)
|
|
{
|
|
Tracef("InvalidateRect() - Strange rect");
|
|
return;
|
|
}
|
|
|
|
|
|
// DIBBAR_LONGSIZE_BUGFIX
|
|
const RECT clipRect = {
|
|
max(c_rsrcRect.left - dstRect.left, 0),
|
|
max(c_rsrcRect.top - dstRect.top, 0),
|
|
min(c_rsrcRect.right - dstRect.left, dstRect.right - dstRect.left),
|
|
min(c_rsrcRect.bottom - dstRect.top, dstRect.bottom - dstRect.top),
|
|
};
|
|
// END_OF_DIBBAR_LONGSIZE_BUGFIX
|
|
|
|
|
|
DWORD * pdwSrc;
|
|
pdwSrc = (DWORD *)m_pDIB->GetPointer();
|
|
pdwSrc += dstRect.left + dstRect.top*m_pDIB->GetWidth();
|
|
|
|
D3DLOCKED_RECT lockedRect;
|
|
if (FAILED(m_lpd3dTexture->LockRect(0, &lockedRect, &clipRect, 0)))
|
|
{
|
|
Tracef("InvalidateRect() - Failed to LockRect");
|
|
return;
|
|
}
|
|
|
|
int iclipWidth = clipRect.right - clipRect.left;
|
|
int iclipHeight = clipRect.bottom - clipRect.top;
|
|
DWORD * pdwDst = (DWORD *)lockedRect.pBits;
|
|
DWORD dwDstWidth = lockedRect.Pitch>>2;
|
|
DWORD dwSrcWidth = m_pDIB->GetWidth();
|
|
for (int i = 0; i < iclipHeight; ++i)
|
|
{
|
|
for (int i = 0; i < iclipWidth; ++i)
|
|
{
|
|
if (pdwSrc[i])
|
|
pdwDst[i] = pdwSrc[i] | 0xff000000;
|
|
else
|
|
pdwDst[i] = 0;
|
|
}
|
|
pdwDst += dwDstWidth;
|
|
pdwSrc += dwSrcWidth;
|
|
}
|
|
|
|
m_lpd3dTexture->UnlockRect(0);
|
|
}
|
|
|
|
bool CBlockTexture::Create(CGraphicDib * pDIB, const RECT & c_rRect, DWORD dwWidth, DWORD dwHeight)
|
|
{
|
|
if (FAILED(ms_lpd3dDevice->CreateTexture(dwWidth, dwHeight, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_lpd3dTexture)))
|
|
{
|
|
Tracef("Failed to create block texture %u, %u\n", dwWidth, dwHeight);
|
|
return false;
|
|
}
|
|
|
|
m_pDIB = pDIB;
|
|
m_rect = c_rRect;
|
|
m_dwWidth = dwWidth;
|
|
m_dwHeight = dwHeight;
|
|
m_bClipEnable = FALSE;
|
|
|
|
return true;
|
|
}
|
|
|
|
CBlockTexture::CBlockTexture()
|
|
{
|
|
m_pDIB = NULL;
|
|
m_lpd3dTexture = NULL;
|
|
}
|
|
|
|
CBlockTexture::~CBlockTexture()
|
|
{
|
|
safe_release(m_lpd3dTexture);
|
|
m_lpd3dTexture = NULL;
|
|
}
|