void CGSH_Direct3D9::SetupDepthBuffer(uint64 zbufReg, uint64 frameReg) { auto frame = make_convertible<FRAME>(frameReg); auto zbuf = make_convertible<ZBUF>(zbufReg); auto depthbuffer = FindDepthbuffer(zbufReg, frameReg); if(!depthbuffer) { depthbuffer = DepthbufferPtr(new CDepthbuffer(m_device, zbuf.GetBasePtr(), frame.GetWidth(), 1024, zbuf.nPsm)); m_depthbuffers.push_back(depthbuffer); } switch(CGsPixelFormats::GetPsmPixelSize(zbuf.nPsm)) { case 16: m_nMaxZ = 32768.0f; break; case 24: m_nMaxZ = 8388608.0f; break; default: case 32: m_nMaxZ = 2147483647.0f; break; } HRESULT result = m_device->SetDepthStencilSurface(depthbuffer->m_depthSurface); assert(SUCCEEDED(result)); m_device->SetRenderState(D3DRS_ZWRITEENABLE, (zbuf.nMask == 0) ? TRUE : FALSE); }
void CGSH_Direct3D9::SetupFramebuffer(uint64 frameReg, uint64 scissorReg) { if(frameReg == 0) return; auto frame = make_convertible<FRAME>(frameReg); auto scissor = make_convertible<SCISSOR>(scissorReg); { bool r = (frame.nMask & 0x000000FF) == 0; bool g = (frame.nMask & 0x0000FF00) == 0; bool b = (frame.nMask & 0x00FF0000) == 0; bool a = (frame.nMask & 0xFF000000) == 0; UINT colorMask = (r ? D3DCOLORWRITEENABLE_RED : 0) | (g ? D3DCOLORWRITEENABLE_GREEN : 0) | (b ? D3DCOLORWRITEENABLE_BLUE : 0) | (a ? D3DCOLORWRITEENABLE_ALPHA : 0); m_device->SetRenderState(D3DRS_COLORWRITEENABLE, colorMask); } bool newFramebuffer = false; auto framebuffer = FindFramebuffer(frameReg); if(!framebuffer) { framebuffer = FramebufferPtr(new CFramebuffer(m_device, frame.GetBasePtr(), frame.GetWidth(), 1024, frame.nPsm)); m_framebuffers.push_back(framebuffer); newFramebuffer = true; } //Any framebuffer selected at this point can be used as a texture framebuffer->m_canBeUsedAsTexture = true; float projWidth = static_cast<float>(framebuffer->m_width); float projHeight = static_cast<float>(framebuffer->m_height); HRESULT result = S_OK; Framework::Win32::CComPtr<IDirect3DSurface9> renderSurface; result = framebuffer->m_renderTarget->GetSurfaceLevel(0, &renderSurface); assert(SUCCEEDED(result)); result = m_device->SetRenderTarget(0, renderSurface); assert(SUCCEEDED(result)); if(newFramebuffer) { //TODO: Get actual contents from GS RAM m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); m_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0); } RECT scissorRect = {}; scissorRect.left = scissor.scax0; scissorRect.top = scissor.scay0; scissorRect.right = scissor.scax1 + 1; scissorRect.bottom = scissor.scay1 + 1; m_device->SetScissorRect(&scissorRect); m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); SetReadCircuitMatrix(projWidth, projHeight); }
CGSH_Direct3D9::FramebufferPtr CGSH_Direct3D9::FindFramebuffer(uint64 frameReg) const { auto frame = make_convertible<FRAME>(frameReg); auto framebufferIterator = std::find_if(std::begin(m_framebuffers), std::end(m_framebuffers), [&] (const FramebufferPtr& framebuffer) { return (framebuffer->m_basePtr == frame.GetBasePtr()) && (framebuffer->m_width == frame.GetWidth()); } ); return (framebufferIterator != std::end(m_framebuffers)) ? *(framebufferIterator) : FramebufferPtr(); }
int __stdcall GetSkillTier(UINT16 skill, DWORD address) { address -= (DWORD)GetBasePtr(0); if (address == 0xA7DFC)//player return thirdSkillLevels[skill & 0x1FF][0]; if (address == 0xA85EC)//main pawn return thirdSkillLevels[skill & 0x1FF][1]; if (address == 0xA9C4C)//pawn 1 return thirdSkillLevels[skill & 0x1FF][2]; if (address == 0xAB2AC)//pawn 2 return thirdSkillLevels[skill & 0x1FF][3]; return 0; }
CGSH_Direct3D9::DepthbufferPtr CGSH_Direct3D9::FindDepthbuffer(uint64 zbufReg, uint64 frameReg) const { auto zbuf = make_convertible<ZBUF>(zbufReg); auto frame = make_convertible<FRAME>(frameReg); auto depthbufferIterator = std::find_if(std::begin(m_depthbuffers), std::end(m_depthbuffers), [&] (const DepthbufferPtr& depthBuffer) { return (depthBuffer->m_basePtr == zbuf.GetBasePtr()) && (depthBuffer->m_width == frame.GetWidth()); } ); return (depthbufferIterator != std::end(m_depthbuffers)) ? *(depthbufferIterator) : DepthbufferPtr(); }
void CGSH_Direct3D9::SetupFramebuffer(uint64 frameReg) { if(frameReg == 0) return; auto frame = make_convertible<FRAME>(frameReg); { bool r = (frame.nMask & 0x000000FF) == 0; bool g = (frame.nMask & 0x0000FF00) == 0; bool b = (frame.nMask & 0x00FF0000) == 0; bool a = (frame.nMask & 0xFF000000) == 0; UINT colorMask = (r ? D3DCOLORWRITEENABLE_RED : 0) | (g ? D3DCOLORWRITEENABLE_GREEN : 0) | (b ? D3DCOLORWRITEENABLE_BLUE : 0) | (a ? D3DCOLORWRITEENABLE_ALPHA : 0); m_device->SetRenderState(D3DRS_COLORWRITEENABLE, colorMask); } auto framebuffer = FindFramebuffer(frameReg); if(!framebuffer) { framebuffer = FramebufferPtr(new CFramebuffer(m_device, frame.GetBasePtr(), frame.GetWidth(), 1024, frame.nPsm)); m_framebuffers.push_back(framebuffer); } //Any framebuffer selected at this point can be used as a texture framebuffer->m_canBeUsedAsTexture = true; float projWidth = static_cast<float>(framebuffer->m_width); float projHeight = static_cast<float>(framebuffer->m_height); HRESULT result = S_OK; Framework::Win32::CComPtr<IDirect3DSurface9> renderSurface; result = framebuffer->m_renderTarget->GetSurfaceLevel(0, &renderSurface); assert(SUCCEEDED(result)); result = m_device->SetRenderTarget(0, renderSurface); assert(SUCCEEDED(result)); SetReadCircuitMatrix(projWidth, projHeight); }