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>
681 lines
20 KiB
C++
681 lines
20 KiB
C++
// BaseGraphic.cpp: implementation of the BaseGraphic class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "BaseGraphicsLayer.h"
|
||
#include <d3d8.h>
|
||
#include <d3dx8.h>
|
||
#include "Vertex.h"
|
||
#include "FastMath.h"
|
||
#include "dxutil.h"
|
||
#include "NTexture.h"
|
||
#include "GMMemory.h"
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
CViewCamera BaseGraphicsLayer::m_ViewCamera;
|
||
|
||
LPDIRECT3DDEVICE8 BaseGraphicsLayer::m_pd3dDevice;
|
||
LPDIRECT3D8 BaseGraphicsLayer:: m_pD3D;
|
||
D3DPRESENT_PARAMETERS BaseGraphicsLayer::m_d3dpp;
|
||
|
||
long BaseGraphicsLayer::m_lScreenSx;
|
||
long BaseGraphicsLayer::m_lScreenSy;
|
||
color BaseGraphicsLayer::m_ClearColor;
|
||
|
||
HWND BaseGraphicsLayer::m_hWnd;
|
||
|
||
bool BaseGraphicsLayer::m_VoodooOption=false;
|
||
int BaseGraphicsLayer::m_iGraphicCards = 0;
|
||
|
||
char BaseGraphicsLayer::m_aszCustomMsg[10][300];
|
||
CD3DFont* BaseGraphicsLayer::m_pFont = NULL;
|
||
|
||
|
||
BaseGraphicsLayer::BaseGraphicsLayer()
|
||
{
|
||
m_hWnd=NULL;
|
||
m_pd3dDevice=NULL;
|
||
m_pD3D=NULL;
|
||
m_fFov=m_fNear=m_fFar=0.0f;
|
||
m_ClearColor.c=0x0;
|
||
m_bEditorMode=false;
|
||
m_iGraphicCards = 0;
|
||
|
||
memset(m_aszCustomMsg, 0, sizeof(m_aszCustomMsg));
|
||
}
|
||
|
||
BaseGraphicsLayer::~BaseGraphicsLayer()
|
||
{
|
||
CROSSM::CNTexture::Close();
|
||
CTexture::Close();
|
||
|
||
if(m_pd3dDevice) {
|
||
m_pd3dDevice->Release();
|
||
m_pd3dDevice = NULL;
|
||
}
|
||
if(m_pD3D) {
|
||
m_pD3D->Release();
|
||
m_pD3D = NULL;
|
||
}
|
||
if(m_pFont) {
|
||
delete m_pFont;
|
||
m_pFont = NULL;
|
||
}
|
||
}
|
||
|
||
void BaseGraphicsLayer::Create(HWND hWnd, bool bWindowed,bool Editor, long screenx, long screeny, long screenwidth, long screenheight)
|
||
{
|
||
//LogMessage("BaseGraphicsLayer Create Start");
|
||
m_hWnd=hWnd;
|
||
m_bWindowed=bWindowed;
|
||
m_bEditorMode=Editor;
|
||
GetWindowRect( m_hWnd, &m_rcWindowBounds );
|
||
GetClientRect( m_hWnd, &m_rcWindowClient );
|
||
|
||
if(NULL == (m_pD3D=Direct3DCreate8(D3D_SDK_VERSION)))
|
||
{
|
||
throw CGraphicLayerError("BaseGraphicsLayer:Create,GetDirect3D Interface getting fail");
|
||
}
|
||
//LogMessage("Direct3D 8.0 Create");
|
||
/*
|
||
D3DAdapterInfo* pAdapterInfo = &CEnumD3D::m_Adapters[CEnumD3D::m_dwAdapter];
|
||
D3DDeviceInfo* pDeviceInfo = &pAdapterInfo->devices[pAdapterInfo->dwCurrentDevice];
|
||
D3DModeInfo* pModeInfo = &pDeviceInfo->modes[pDeviceInfo->dwCurrentMode];
|
||
*/
|
||
|
||
D3DAdapterInfo* pAdapterInfo = &CEnumD3D::m_Adapters[CEnumD3D::m_nAdapter];
|
||
D3DDeviceInfo* pDeviceInfo = &pAdapterInfo->devices[CEnumD3D::m_nDevice];
|
||
D3DModeInfo* pModeInfo = &pDeviceInfo->modes[CEnumD3D::m_nMode];
|
||
|
||
if(strstr(pAdapterInfo->d3dAdapterIdentifier.Description,"Voodoo"))
|
||
{
|
||
m_VoodooOption=true;
|
||
m_iGraphicCards = 0;
|
||
//MessageBox(NULL,"Voodoo",0,0);
|
||
}
|
||
else
|
||
{
|
||
m_VoodooOption=false;
|
||
if(strstr(pAdapterInfo->d3dAdapterIdentifier.Description,"TNT")) {
|
||
m_iGraphicCards = 1;
|
||
}
|
||
else if(strstr(pAdapterInfo->d3dAdapterIdentifier.Description,"GeForce2")) {
|
||
m_iGraphicCards = 2;
|
||
}
|
||
else if(strstr(pAdapterInfo->d3dAdapterIdentifier.Description,"GeForce3")) {
|
||
m_iGraphicCards = 3;
|
||
}
|
||
else if(strstr(pAdapterInfo->d3dAdapterIdentifier.Description,"GeForce4")) {
|
||
m_iGraphicCards = 4;
|
||
|
||
}
|
||
else {
|
||
m_iGraphicCards = 5;
|
||
}
|
||
}
|
||
|
||
// Set up the presentation parameters
|
||
ZeroMemory( &m_d3dpp, sizeof(m_d3dpp) );
|
||
m_d3dpp.Windowed = bWindowed;
|
||
m_d3dpp.BackBufferCount = 1;
|
||
m_d3dpp.MultiSampleType = pDeviceInfo->MultiSampleType;
|
||
//m_d3dpp.SwapEffect = D3DSWAPEFFECT_COPY ;
|
||
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD ;
|
||
m_d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
|
||
|
||
m_d3dpp.hDeviceWindow=m_hWnd;
|
||
m_d3dpp.EnableAutoDepthStencil=TRUE;
|
||
|
||
m_d3dpp.AutoDepthStencilFormat = pModeInfo->DepthStencilFormat;
|
||
m_d3dpp.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
|
||
|
||
if(bWindowed)
|
||
{
|
||
m_lScreenSx=m_d3dpp.BackBufferWidth = screenwidth ; //m_rcWindowClient.right - m_rcWindowClient.left;
|
||
m_lScreenSy=m_d3dpp.BackBufferHeight = screenheight ;//m_rcWindowClient.bottom - m_rcWindowClient.top;
|
||
|
||
if(pAdapterInfo->d3ddmDesktop.Format==D3DFMT_X8R8G8B8)
|
||
{
|
||
m_d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
|
||
}
|
||
else
|
||
{
|
||
m_d3dpp.BackBufferFormat=pAdapterInfo->d3ddmDesktop.Format;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
m_lScreenSx=m_d3dpp.BackBufferWidth = screenwidth ; //pModeInfo->Width;
|
||
m_lScreenSy=m_d3dpp.BackBufferHeight = screenheight ; //pModeInfo->Height;
|
||
m_d3dpp.BackBufferFormat = pModeInfo->Format;
|
||
m_d3dpp.FullScreen_PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
|
||
}
|
||
if(Editor)
|
||
{
|
||
if(FAILED(m_pD3D->CreateDevice( CEnumD3D::m_dwAdapter, pDeviceInfo->DeviceType,
|
||
m_hWnd,
|
||
//D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||
//D3DCREATE_MIXED_VERTEXPROCESSING,
|
||
pModeInfo->dwBehavior,
|
||
&m_d3dpp,
|
||
&m_pd3dDevice )))
|
||
{
|
||
throw CGraphicLayerError("BaseGraphicsLayer:Create, CreateDevice is failed");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(FAILED(m_pD3D->CreateDevice( CEnumD3D::m_dwAdapter, pDeviceInfo->DeviceType,
|
||
m_hWnd,
|
||
//D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||
//D3DCREATE_MIXED_VERTEXPROCESSING,
|
||
pModeInfo->dwBehavior,
|
||
&m_d3dpp,
|
||
&m_pd3dDevice )))
|
||
{
|
||
throw CGraphicLayerError("BaseGraphicsLayer:Create, CreateDevice is failed");
|
||
}
|
||
}
|
||
|
||
/*
|
||
D3DVIEWPORT8 d3dViewport ;
|
||
d3dViewport.Width = screenwidth ;
|
||
d3dViewport.Height = screenheight ;
|
||
d3dViewport.X = screenx ;
|
||
d3dViewport.Y = screeny ;
|
||
d3dViewport.MaxZ = 1.0f ;
|
||
d3dViewport.MinZ = 0.0f ;
|
||
|
||
m_pd3dDevice->SetViewport( &d3dViewport ) ;
|
||
*/
|
||
m_dwStartRemainTextureMemory=m_pd3dDevice->GetAvailableTextureMem();
|
||
|
||
//LogMessage("Direct3D Device Create");
|
||
//LogMessage("Direct3D 7.0 Create");
|
||
// Follow code is to Initial RenderState( light ,matrix,material);
|
||
CTexture::Init(m_pd3dDevice);
|
||
matrix matProj;
|
||
float fAspect=(float)m_d3dpp.BackBufferWidth/(float)m_d3dpp.BackBufferHeight;
|
||
fAspect=1.0f/fAspect;
|
||
//fAspect=1.0f;
|
||
|
||
// edith <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||
matProj.MakeProjection(3.1415f/3.0f,fAspect,50.0f, 320000.0f);
|
||
m_pd3dDevice->SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&matProj);
|
||
matrix matView;
|
||
matView.MakeIdent();
|
||
m_pd3dDevice->SetTransform(D3DTS_VIEW,(D3DMATRIX*)&matView);
|
||
matrix matWorld;
|
||
matWorld.MakeIdent();
|
||
m_pd3dDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&matWorld);
|
||
m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
|
||
m_pd3dDevice->SetRenderState(D3DRS_LOCALVIEWER,FALSE);
|
||
m_pd3dDevice->SetRenderState(D3DRS_CLIPPING,TRUE);
|
||
|
||
m_pd3dDevice->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(0,D3DTSS_MIPFILTER,D3DTEXF_LINEAR);
|
||
|
||
m_pd3dDevice->SetTextureStageState(1,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(1,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(1,D3DTSS_MIPFILTER,D3DTEXF_LINEAR);
|
||
|
||
m_pd3dDevice->SetTextureStageState(2,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(2,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(2,D3DTSS_MIPFILTER,D3DTEXF_LINEAR);
|
||
|
||
m_pd3dDevice->SetTextureStageState(3,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(3,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
|
||
m_pd3dDevice->SetTextureStageState(3,D3DTSS_MIPFILTER,D3DTEXF_LINEAR);
|
||
|
||
CROSSM::CNTexture::Init(m_pd3dDevice);
|
||
|
||
//m_pd3dDevice->SetRenderState(D3DRS_CLIPPING,FALSE);
|
||
|
||
|
||
D3DLIGHT8 light;
|
||
|
||
ZeroMemory( &light, sizeof(D3DLIGHT8) );
|
||
light.Type = D3DLIGHT_DIRECTIONAL;
|
||
light.Diffuse.r = 1.0f;
|
||
light.Diffuse.g = 1.0f;
|
||
light.Diffuse.b = 1.0f;
|
||
light.Position.x = light.Direction.x = 0.0f;
|
||
light.Position.y = light.Direction.y = -1.0f;
|
||
light.Position.z = light.Direction.z = 0.0f;
|
||
light.Direction.x = 0.0f;
|
||
light.Range = 1000.0f;
|
||
m_pd3dDevice->SetLight( 0,&light );
|
||
m_pd3dDevice->LightEnable( 0,TRUE);
|
||
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
|
||
m_pd3dDevice->SetRenderState( D3DRS_AMBIENT,0xffffffff);
|
||
|
||
|
||
D3DMATERIAL8 mtrl;
|
||
ZeroMemory( &mtrl, sizeof(D3DMATERIAL8) );
|
||
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
|
||
mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
|
||
mtrl.Diffuse.b = mtrl.Ambient.b = 1.0f;
|
||
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
|
||
m_pd3dDevice->SetMaterial( &mtrl );
|
||
|
||
|
||
if(m_bEditorMode)
|
||
{
|
||
m_pFont= new CD3DFont( _T("Arial"), 10, 0 );
|
||
m_pFont->InitDeviceObjects( m_pd3dDevice );
|
||
m_pFont->RestoreDeviceObjects();
|
||
}
|
||
else
|
||
m_pFont = NULL;
|
||
|
||
// For Init View Frustum //
|
||
m_ViewCamera.BuildFrustum(fAspect,3.1415f/3.0f,40.0f,1300000.0f);
|
||
//LogMessage("Setting Default Device RenderState");
|
||
|
||
CFastMath::Init();
|
||
|
||
m_pd3dDevice->SetRenderState(D3DRS_RANGEFOGENABLE,TRUE);
|
||
|
||
//float fMipLodBias=-2.0f;
|
||
//m_pd3dDevice->SetTextureStageState(0,D3DTSS_MIPMAPLODBIAS,*((LPDWORD)(&fMipLodBias)));
|
||
//LogMessage("FastMath Class Init");
|
||
}
|
||
void BaseGraphicsLayer::GetPickPoint(long lScreenX, long lScreenY, float &fsX, float &fsY, float &fsZ)
|
||
{
|
||
RECT rect;
|
||
rect.left=lScreenX;
|
||
rect.right=lScreenX+1;
|
||
rect.top=lScreenY;
|
||
rect.bottom=lScreenY+1;
|
||
POINT p;
|
||
p.x=0;
|
||
p.y=0;
|
||
D3DLOCKED_RECT d3dlocked_rect;
|
||
|
||
LPDIRECT3DSURFACE8 pBackBuffer;
|
||
m_pd3dDevice->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer);
|
||
pBackBuffer->LockRect(&d3dlocked_rect,NULL,D3DLOCK_READONLY|D3DLOCK_NO_DIRTY_UPDATE );
|
||
DWORD *e=(DWORD*)d3dlocked_rect.pBits;
|
||
pBackBuffer->UnlockRect();
|
||
pBackBuffer->Release();
|
||
|
||
|
||
LPDIRECT3DSURFACE8 pZBuffer;
|
||
m_pd3dDevice->GetDepthStencilSurface( &pZBuffer );
|
||
pZBuffer->LockRect(&d3dlocked_rect,&rect,D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_READONLY);
|
||
|
||
if(d3dlocked_rect.pBits==NULL)
|
||
return;
|
||
BYTE *pb=(BYTE*)d3dlocked_rect.pBits;
|
||
WORD wLen=0;
|
||
wLen|=*(pb+1)<<8;
|
||
wLen|=*(pb);
|
||
pZBuffer->UnlockRect();
|
||
pZBuffer->Release();
|
||
|
||
matrix matView,matProj;
|
||
m_pd3dDevice->GetTransform(D3DTS_VIEW,(D3DMATRIX*)&matView);
|
||
m_pd3dDevice->GetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&matProj);
|
||
|
||
matrix matSet=matView*matProj;
|
||
|
||
matrix matInv;
|
||
|
||
//matInv.Inverse(matSet);
|
||
float d;
|
||
D3DXMatrixInverse((D3DXMATRIX*)&matInv,&d,(D3DXMATRIX*)&matSet);
|
||
|
||
float fX,fY,fZ;
|
||
fX=2.0/m_d3dpp.BackBufferWidth;
|
||
fY=2.0/m_d3dpp.BackBufferHeight;
|
||
|
||
fZ=(float)wLen/(float)0xffff;
|
||
fX=lScreenX*(fX)-1.0f;
|
||
fY=1.0f-(lScreenY)*(fY);
|
||
|
||
float fXp=matInv._11*fX + matInv._21*fY + matInv._31*fZ + matInv._41;
|
||
float fYp=matInv._12*fX + matInv._22*fY + matInv._32*fZ + matInv._42;
|
||
float fZp=matInv._13*fX + matInv._23*fY + matInv._33*fZ + matInv._43;
|
||
float fWp=matInv._14*fX + matInv._24*fY + matInv._34*fZ + matInv._44;
|
||
|
||
fsX=fXp/fWp;
|
||
fsY=fYp/fWp;
|
||
fsZ=fZp/fWp;
|
||
}
|
||
|
||
void BaseGraphicsLayer::Flip()
|
||
{
|
||
//RECT rect={100,100,800,600};
|
||
m_pd3dDevice->Present(NULL,NULL,m_hWnd,NULL);
|
||
//m_pd3dDevice->Present(&rect,&rect,NULL,NULL);
|
||
|
||
/*
|
||
LPDIRECT3DSURFACE8 pddsFrontBuffer,pddsBackBuffer;
|
||
m_pd3dDevice->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&pddsBackBuffer);
|
||
m_pd3dDevice->GetFrontBuffer(&pddsFrontBuffer);
|
||
RECT rect={0,0,800,600};
|
||
POINT pt={0,0};
|
||
m_pd3dDevice->CopyRects(pddsBackBuffer,&rect,0,pddsFrontBuffer,&pt);
|
||
pddsFrontBuffer->Release();
|
||
pddsBackBuffer->Release();
|
||
*/
|
||
}
|
||
|
||
void BaseGraphicsLayer::PrefareRender()
|
||
{
|
||
m_pd3dDevice->SetTransform(D3DTS_VIEW,m_ViewCamera.GetMatView());
|
||
m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET, m_ClearColor.c, 1.0f, 0 );
|
||
}
|
||
|
||
void BaseGraphicsLayer::ShowState()
|
||
{
|
||
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING,FALSE);
|
||
m_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,FALSE);
|
||
/*
|
||
TLVertex NSVertex[4];
|
||
float fZvalue=0.01f;
|
||
float fProjectedPositionW=0.01f;
|
||
|
||
NSVertex[0].v=vector3(0.0f,100.0f,fZvalue);
|
||
NSVertex[0].tu=0.0f;
|
||
NSVertex[0].tv=1.0f;
|
||
NSVertex[1].v=vector3(0.0f,0.0f,fZvalue);
|
||
NSVertex[1].tu=0.0f;
|
||
NSVertex[1].tv=0.0f;
|
||
NSVertex[2].v=vector3(100.0f,100.0f,fZvalue);
|
||
NSVertex[2].tu=1.0f;
|
||
NSVertex[2].tv=1.0f;
|
||
NSVertex[3].v=vector3(100.0f,0.0f,fZvalue);
|
||
NSVertex[3].tu=1.0f;
|
||
NSVertex[3].tv=0.0f;
|
||
|
||
NSVertex[0].v=vector3(100.0f,100.0f,fZvalue);
|
||
NSVertex[1].v=vector3(100.0f,100.0f,fZvalue);
|
||
NSVertex[2].v=vector3(100.0f,100.0f,fZvalue);
|
||
NSVertex[3].v=vector3(100.0f,100.0f,fZvalue);
|
||
|
||
float fNsSize=100.0f;
|
||
|
||
NSVertex[0].v.x+=fNsSize*cosf(0.0f + 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
NSVertex[0].v.y+=fNsSize*sinf(0.0f + 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
|
||
NSVertex[1].v.x+=fNsSize*cosf(3.1415f*0.5f+ 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
NSVertex[1].v.y+=fNsSize*sinf(3.1415f*0.5f+ 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
|
||
NSVertex[2].v.x+=fNsSize*cosf(3.1415f*1.5f+ 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
NSVertex[2].v.y+=fNsSize*sinf(3.1415f*1.5f+ 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
|
||
NSVertex[3].v.x+=fNsSize*cosf(3.1415f+ 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
NSVertex[3].v.y+=fNsSize*sinf(3.1415f+ 3.14159f*(0.75f) - m_ViewCamera.GetRotationY() );
|
||
|
||
|
||
NSVertex[0].w=fProjectedPositionW;
|
||
NSVertex[1].w=fProjectedPositionW;
|
||
NSVertex[2].w=fProjectedPositionW;
|
||
NSVertex[3].w=fProjectedPositionW;
|
||
|
||
NSVertex[0].Diffuse.c=0xff000000;
|
||
NSVertex[1].Diffuse.c=0xff000000;
|
||
NSVertex[2].Diffuse.c=0xff000000;
|
||
NSVertex[3].Diffuse.c=0xff000000;
|
||
NSVertex[0].Specular.c=0x0;
|
||
NSVertex[1].Specular.c=0x0;
|
||
NSVertex[2].Specular.c=0x0;
|
||
NSVertex[3].Specular.c=0x0;
|
||
|
||
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
||
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
||
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
||
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
|
||
|
||
m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,TRUE);
|
||
m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||
m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
||
|
||
|
||
m_pd3dDevice->SetVertexShader(TLVERTEXFVF);
|
||
m_pd3dDevice->SetTexture(0,m_NsTexture.GetTexture());
|
||
m_pd3dDevice->SetTexture(1,NULL);
|
||
m_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,NSVertex,sizeof(TLVertex));
|
||
m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
||
//*/
|
||
|
||
static FLOAT fLastTime = 0.0f;
|
||
static DWORD dwFrames = 0L;
|
||
|
||
static char strFrameStats[256];
|
||
FLOAT fTime = DXUtil_Timer( TIMER_GETABSOLUTETIME );
|
||
++dwFrames;
|
||
|
||
// Update the scene stats once per second
|
||
if( fTime - fLastTime > 1.0f )
|
||
{
|
||
float fFPS = dwFrames / (fTime - fLastTime);
|
||
fLastTime = fTime;
|
||
dwFrames = 0L;
|
||
sprintf( strFrameStats, "%.02f fps", fFPS);
|
||
}
|
||
|
||
// edith 2008.01.18 ShowState
|
||
if(m_bEditorMode)
|
||
{
|
||
m_pFont->DrawText( 2, 40, D3DCOLOR_ARGB(255,255,0,0),strFrameStats);
|
||
|
||
static char strSectorPos[256];
|
||
|
||
matrix *matPos=m_ViewCamera.GetMatPosition();
|
||
sprintf(strSectorPos,"sSector-X = %d , Sector-Y = %d",(int)(matPos->_41/(63.0f*500.0f)),(int)(matPos->_43/(63.0f*500.0f)));
|
||
m_pFont->DrawText( 2, 60, D3DCOLOR_ARGB(255,255,0,0),strSectorPos);
|
||
|
||
sprintf(strSectorPos,"Viewer Position x=%.2f y=%.2f z=%.2f",matPos->_41,matPos->_42,matPos->_43);
|
||
m_pFont->DrawText( 2, 80, D3DCOLOR_ARGB(255,255,0,0),strSectorPos);
|
||
|
||
m_dwAbleTextureMemory=m_pd3dDevice->GetAvailableTextureMem();
|
||
|
||
sprintf(strSectorPos,"Total used texture memory %d ",m_dwStartRemainTextureMemory-m_dwAbleTextureMemory);
|
||
m_pFont->DrawText( 2, 100, D3DCOLOR_ARGB(255,255,0,0),strSectorPos);
|
||
|
||
sprintf(strSectorPos,"Remain Texture memory %d ",m_dwAbleTextureMemory);
|
||
m_pFont->DrawText( 2, 120, D3DCOLOR_ARGB(255,255,0,0),strSectorPos);
|
||
|
||
for (size_t i = 0; i < 10; ++i)
|
||
{
|
||
if(strlen(m_aszCustomMsg[i]) == 0)
|
||
continue;
|
||
|
||
m_pFont->DrawText( 2, 155 + i*20, D3DCOLOR_ARGB(255,255,0,0),m_aszCustomMsg[i]);
|
||
}
|
||
}
|
||
}
|
||
bool BaseGraphicsLayer::TransformVector(vector3 &t,vector3 &vecResult,float &w)
|
||
{
|
||
DWORD dwClipWidth;
|
||
DWORD dwClipHeight;
|
||
|
||
|
||
dwClipWidth=m_d3dpp.BackBufferWidth/2;
|
||
dwClipHeight=m_d3dpp.BackBufferHeight/2;
|
||
|
||
//dwClipWidth=256/2.0f;
|
||
//dwClipHeight=256/2.0f;
|
||
|
||
|
||
|
||
matrix matWorld,matView,matProj;
|
||
m_pd3dDevice->GetTransform(D3DTS_WORLD,(D3DMATRIX*)&matWorld);
|
||
m_pd3dDevice->GetTransform(D3DTS_VIEW,(D3DMATRIX*)&matView);
|
||
m_pd3dDevice->GetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&matProj);
|
||
//matrix matSet=matProj*matView;
|
||
matrix matSet=matView*matProj;
|
||
|
||
float x,y,z;
|
||
x=t.x;
|
||
y=t.y;
|
||
z=t.z;
|
||
|
||
float xp = matSet._11*x + matSet._21*y + matSet._31*z + matSet._41;
|
||
float yp = matSet._12*x + matSet._22*y + matSet._32*z + matSet._42;
|
||
float zp = matSet._13*x + matSet._23*y + matSet._33*z + matSet._43;
|
||
float wp = matSet._14*x + matSet._24*y + matSet._34*z + matSet._44;
|
||
vector3 vecTansform;
|
||
vecTansform.x= ( 1.0f + (xp/wp) ) * dwClipWidth;
|
||
vecTansform.y= ( 1.0f - (yp/wp) ) * dwClipHeight;
|
||
vecTansform.z= zp / wp;
|
||
w = wp;
|
||
|
||
vecResult=vecTansform;
|
||
if( 0.0f < vecTansform.x &&
|
||
vecTansform.x < m_d3dpp.BackBufferWidth &&
|
||
0.0f < vecTansform.y &&
|
||
vecTansform.y < m_d3dpp.BackBufferHeight)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool BaseGraphicsLayer::TransformVector(const vector3 &vSource, const matrix& mTransform, vector3 &vResult,float &w)
|
||
{
|
||
DWORD dwClipWidth;
|
||
DWORD dwClipHeight;
|
||
|
||
dwClipWidth=m_d3dpp.BackBufferWidth/2;
|
||
dwClipHeight=m_d3dpp.BackBufferHeight/2;
|
||
|
||
float x,y,z;
|
||
x=vSource.x;
|
||
y=vSource.y;
|
||
z=vSource.z;
|
||
|
||
float xp = mTransform._11*x + mTransform._21*y + mTransform._31*z + mTransform._41;
|
||
float yp = mTransform._12*x + mTransform._22*y + mTransform._32*z + mTransform._42;
|
||
float zp = mTransform._13*x + mTransform._23*y + mTransform._33*z + mTransform._43;
|
||
float wp = mTransform._14*x + mTransform._24*y + mTransform._34*z + mTransform._44;
|
||
vector3 vecTansform;
|
||
vecTansform.x= ( 1.0f + (xp/wp) ) * dwClipWidth;
|
||
vecTansform.y= ( 1.0f - (yp/wp) ) * dwClipHeight;
|
||
vecTansform.z= zp / wp;
|
||
w = wp;
|
||
|
||
vResult=vecTansform;
|
||
if( 0.0f < vecTansform.x &&
|
||
vecTansform.x < m_d3dpp.BackBufferWidth &&
|
||
0.0f < vecTansform.y &&
|
||
vecTansform.y < m_d3dpp.BackBufferHeight)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void BaseGraphicsLayer::ManyTransformVector(vector3 *t, vector3 *result, float *w)
|
||
{
|
||
/*
|
||
DWORD dwClipWidth=m_d3dpp.BackBufferWidth/2;
|
||
DWORD dwClipHeight=m_d3dpp.BackBufferHeight/2;
|
||
|
||
matrix matView,matProj;
|
||
m_pd3dDevice->GetTransform(D3DTS_VIEW,(D3DMATRIX*)&matView);
|
||
m_pd3dDevice->GetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&matProj);
|
||
//matrix matSet=matProj*matView;
|
||
matrix matSet=matView*matProj;
|
||
|
||
float x,y,z;
|
||
x=t.x;
|
||
y=t.y;
|
||
z=t.z;
|
||
|
||
float xp = matSet._11*x + matSet._21*y + matSet._31*z + matSet._41;
|
||
float yp = matSet._12*x + matSet._22*y + matSet._32*z + matSet._42;
|
||
float zp = matSet._13*x + matSet._23*y + matSet._33*z + matSet._43;
|
||
float wp = matSet._14*x + matSet._24*y + matSet._34*z + matSet._44;
|
||
vector3 vecTansform;
|
||
vecTansform.x= ( 1.0f + (xp/wp) ) * dwClipWidth;
|
||
vecTansform.y= ( 1.0f - (yp/wp) ) * dwClipHeight;
|
||
vecTansform.z= zp / wp;
|
||
w = wp;
|
||
|
||
vecResult=vecTansform;
|
||
if( 0.0f < vecTansform.x &&
|
||
vecTansform.x < m_d3dpp.BackBufferWidth &&
|
||
0.0f < vecTansform.y &&
|
||
vecTansform.y < m_d3dpp.BackBufferHeight)
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
*/
|
||
}
|
||
|
||
void BaseGraphicsLayer::RectFlip(std::vector<RECT> &RectList)
|
||
{
|
||
for(int i=0;i<(int)RectList.size();i++)
|
||
{
|
||
m_pd3dDevice->Present(&RectList[i],&RectList[i],NULL,NULL);
|
||
}
|
||
}
|
||
|
||
bool BaseGraphicsLayer::ProjectiveTextureMapping(vector3 vecPoint, float &fTu, float &fTv)
|
||
{
|
||
vector3 vecFrontPlaneNormal=(m_ViewCamera.m_vecFrustumNear[1]-m_ViewCamera.m_vecFrustumNear[0])^(m_ViewCamera.m_vecFrustumNear[2]-m_ViewCamera.m_vecFrustumNear[1]);
|
||
vecFrontPlaneNormal.Normalize();
|
||
//vecFrontPlaneNormal=-vecFrontPlaneNormal;
|
||
|
||
vector3 vecPos=m_ViewCamera.GetMatPosition()->GetLoc();
|
||
|
||
float fInter=CIntersection::PointFromPlane(vecFrontPlaneNormal,vecPos,vecPoint);
|
||
|
||
// TU
|
||
float fUInter=CIntersection::PointFromPlane(m_ViewCamera.m_vecCenterAxis[0],vecPos,vecPoint);
|
||
|
||
// TV
|
||
float fVInter=CIntersection::PointFromPlane(m_ViewCamera.m_vecCenterAxis[1],vecPos,vecPoint);
|
||
|
||
float fNormalSize=tanf(3.14159f/6.0f)*fInter;
|
||
|
||
fTu=fUInter/fNormalSize;
|
||
fTu=fTu*0.5f+0.5f;
|
||
|
||
float fAspect=(float)m_lScreenSx/(float)m_lScreenSy;
|
||
|
||
fNormalSize=tanf((3.14159f/6.0f))*fInter*fAspect;
|
||
fTv=fVInter/fNormalSize;
|
||
fTv=fTv*0.5f+0.5f;
|
||
|
||
vecFrontPlaneNormal^vector3(0.0f,1.0f,0.0f);
|
||
|
||
return false;
|
||
|
||
/*
|
||
if(fInter>=0.0f)
|
||
return true;
|
||
return false;
|
||
*/
|
||
}
|
||
|
||
void BaseGraphicsLayer::SetCustomMsg(size_t index, const char* sz)
|
||
{
|
||
if (index >= 10)
|
||
{
|
||
return;
|
||
}
|
||
|
||
strncpy(m_aszCustomMsg[index], sz, 299);
|
||
m_aszCustomMsg[index][299] = '\0';
|
||
}
|
||
|
||
void BaseGraphicsLayer::DrawText(float x, float y, DWORD dwColor, char*szText)
|
||
{
|
||
if (NULL == m_pFont)
|
||
{
|
||
return;
|
||
}
|
||
|
||
m_pFont->DrawText(x, y, dwColor, szText);
|
||
} |