mirror of
https://github.com/rrika/cdcEngineDXHR.git
synced 2024-11-23 13:39:54 +00:00
add texture copy feature to PCDX11Scene
This commit is contained in:
parent
dc5ad022fb
commit
0af9d22691
@ -50,10 +50,12 @@ void CommonRenderDevice::method_44() {
|
||||
void CommonRenderDevice::createSiblingScene(
|
||||
RenderViewport *viewport,
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer)
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth)
|
||||
{
|
||||
// TODO
|
||||
createSubScene(viewport, renderTarget, depthBuffer);
|
||||
createSubScene(viewport, renderTarget, depthBuffer, sourceColor, sourceDepth);
|
||||
// TODO
|
||||
}
|
||||
|
||||
|
@ -64,12 +64,16 @@ public:
|
||||
virtual CommonScene *createSubScene(
|
||||
RenderViewport *renderViewport,
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer) = 0;
|
||||
virtual void createSiblingScene(
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth) = 0;
|
||||
virtual void createSiblingScene( // CreatePartition
|
||||
RenderViewport *renderViewport,
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer);
|
||||
virtual void finishScene() = 0; // 50
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth);
|
||||
virtual void finishScene() = 0; // 50, EndScene
|
||||
virtual void method_54();
|
||||
virtual uint32_t getSceneCreationCount(); // frame count, basically
|
||||
virtual CommonScene *getScene();
|
||||
|
@ -11,15 +11,19 @@ CommonScene::CommonScene(
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
/* ... */
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth,
|
||||
RenderGlobalState *globalState,
|
||||
/* ... */
|
||||
RenderPasses *renderPasses)
|
||||
:
|
||||
renderTarget(renderTarget),
|
||||
depthBuffer(depthBuffer),
|
||||
sourceColor(sourceColor),
|
||||
sourceDepth(sourceDepth),
|
||||
parentScene(parentScene),
|
||||
nextScene(nullptr),
|
||||
prevScene(nullptr),
|
||||
depthBuffer(depthBuffer),
|
||||
numSubScenes(0)
|
||||
{
|
||||
this->viewport = *viewport;
|
||||
|
@ -70,8 +70,8 @@ public:
|
||||
CommonRenderTarget *renderTarget; //3F0
|
||||
CommonDepthBuffer *depthBuffer; // 3F4
|
||||
// uint32_t dword3F8;
|
||||
// uint32_t dword3FC;
|
||||
// uint32_t dword400;
|
||||
CommonRenderTarget *sourceColor; //3FC
|
||||
CommonDepthBuffer *sourceDepth; // 400
|
||||
CommonScene *parentScene; // 404
|
||||
CommonScene *nextScene; // 408
|
||||
CommonScene *prevScene; // 40C
|
||||
@ -122,6 +122,8 @@ public:
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
/* ... */
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth,
|
||||
RenderGlobalState *globalState,
|
||||
/* ... */
|
||||
RenderPasses *renderPasses);
|
||||
|
@ -139,16 +139,19 @@ void PCDX11RenderDevice::createDefaultVertexAttribLayouts() {
|
||||
attrs.push_back({VertexAttributeA::kTexcoord1, 0xffff, 1, 0});
|
||||
attrs.push_back({VertexAttributeA::kTexcoord2, 0xffff, 1, 0});
|
||||
drawVertexDecls[0] = VertexDecl::Create(attrs.data(), attrs.size(), /*stride=*/ 0);
|
||||
drawVertexDecls[0]->hash0 |= 1; // HACK
|
||||
|
||||
attrs.clear();
|
||||
attrs.push_back({VertexAttributeA::kPosition, 0xffff, 2, 0});
|
||||
attrs.push_back({VertexAttributeA::kColor1, 0xffff, 4, 0});
|
||||
attrs.push_back({VertexAttributeA::kTexcoord0, 0xffff, 1, 0}); // HACK
|
||||
drawVertexDecls[5] = VertexDecl::Create(attrs.data(), attrs.size(), /*stride=*/ 0);
|
||||
drawVertexDecls[5]->hash0 |= 5; // HACK
|
||||
|
||||
attrs.clear();
|
||||
attrs.push_back({VertexAttributeA::kPosition, 0xffff, 2, 0});
|
||||
drawVertexDecls[6] = VertexDecl::Create(attrs.data(), attrs.size(), /*stride=*/ 0);
|
||||
drawVertexDecls[6]->hash0 |= 6; // HACK
|
||||
|
||||
PCDX11VertexShader *vs;
|
||||
|
||||
@ -339,10 +342,12 @@ void PCDX11RenderDevice::method_30() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
CommonScene *PCDX11RenderDevice::createSubScene(
|
||||
CommonScene *PCDX11RenderDevice::createSubScene( // 48
|
||||
RenderViewport *viewport,
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth
|
||||
) {
|
||||
sceneCreationCount++;
|
||||
// TODO
|
||||
@ -352,6 +357,8 @@ CommonScene *PCDX11RenderDevice::createSubScene(
|
||||
viewport,
|
||||
renderTarget,
|
||||
depthBuffer,
|
||||
sourceColor,
|
||||
sourceDepth,
|
||||
getGlobalState(),
|
||||
&renderPasses);
|
||||
scene7C = scene;
|
||||
|
@ -126,7 +126,9 @@ public:
|
||||
CommonScene *createSubScene(
|
||||
RenderViewport *renderViewport,
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer) override;
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth) override;
|
||||
void finishScene() override;
|
||||
void getSceneRenderTarget() override;
|
||||
void method_64() override;
|
||||
|
@ -21,6 +21,12 @@ void PCDX11Scene::draw(uint32_t funcSetIndex, IRenderDrawable *other) {
|
||||
auto& sceneBuffer = stateManager->accessCommonCB(1);
|
||||
sceneBuffer.assignRow(27, globalState.m_aParams, 16);
|
||||
// TODO
|
||||
|
||||
if (sourceColor)
|
||||
stateManager->m_renderTarget->copyFromTexture(static_cast<PCDX11RenderTarget*>(sourceColor));
|
||||
if (sourceDepth)
|
||||
stateManager->m_depthBuffer->copyFromTexture(static_cast<PCDX11DepthBuffer*>(sourceDepth)); // not implemented in original binary
|
||||
|
||||
if (drawableListsAndMasks) {
|
||||
drawableListsAndMasks->renderPasses->sortAndDraw(
|
||||
drawableListsAndMasks->passType,
|
||||
|
@ -15,11 +15,13 @@ public:
|
||||
CommonRenderTarget *renderTarget,
|
||||
CommonDepthBuffer *depthBuffer,
|
||||
/* ... */
|
||||
CommonRenderTarget *sourceColor,
|
||||
CommonDepthBuffer *sourceDepth,
|
||||
RenderGlobalState *globalState,
|
||||
/* ... */
|
||||
RenderPasses *renderPasses)
|
||||
:
|
||||
CommonScene(renderDevice, parentScene, viewport, renderTarget, depthBuffer, globalState, renderPasses),
|
||||
CommonScene(renderDevice, parentScene, viewport, renderTarget, depthBuffer, sourceColor, sourceDepth, globalState, renderPasses),
|
||||
renderDevice(static_cast<PCDX11RenderDevice*>(renderDevice))
|
||||
{
|
||||
// TODO
|
||||
|
@ -44,6 +44,8 @@ ID3D11RenderTargetView *PCDX11DefaultRenderTarget::getRenderTargetView() {
|
||||
}
|
||||
|
||||
void PCDX11DefaultRenderTarget::copyFromTexture(PCDX11RenderTarget *sourceRT) {
|
||||
// used from PCDX11Scene::draw when it has been constructed with sourceColor != nullptr
|
||||
|
||||
if (sourceRT->method_3C())
|
||||
sourceRT->method_40();
|
||||
|
||||
|
@ -440,7 +440,8 @@ int spinnyCube(HWND window,
|
||||
bool mouseLook = false;
|
||||
bool useFrustumCulling = true;
|
||||
bool drawCellBoxes = false;
|
||||
bool applyFXAA = false;
|
||||
bool applyFXAA = true;
|
||||
bool pointlessCopy = true;
|
||||
cdc::Vector cameraPos{0, 0, 0};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -704,7 +705,7 @@ int spinnyCube(HWND window,
|
||||
|
||||
cdc::PCDX11RenderTarget *tempRenderTarget = nullptr;
|
||||
|
||||
if (applyFXAA)
|
||||
if (applyFXAA && !pointlessCopy)
|
||||
tempRenderTarget = static_cast<cdc::PCDX11RenderTarget*>(renderDevice->dx11_createRenderTarget(
|
||||
100, 100, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, 0x18, 0));
|
||||
|
||||
@ -712,8 +713,10 @@ int spinnyCube(HWND window,
|
||||
renderDevice->beginRenderList(nullptr);
|
||||
auto *scene = renderDevice->createSubScene(
|
||||
&renderViewport,
|
||||
applyFXAA ? tempRenderTarget : renderContext->renderTarget2C,
|
||||
renderContext->depthBuffer);
|
||||
tempRenderTarget ? tempRenderTarget : renderContext->renderTarget2C,
|
||||
renderContext->depthBuffer,
|
||||
nullptr,
|
||||
nullptr);
|
||||
scene->viewMatrix = viewMatrix;
|
||||
cdc::OrthonormalInverse3x4(&renderViewport.viewMatrix, viewMatrix);
|
||||
|
||||
@ -933,6 +936,30 @@ int spinnyCube(HWND window,
|
||||
}
|
||||
|
||||
if (applyFXAA) {
|
||||
if (pointlessCopy) {
|
||||
tempRenderTarget = static_cast<cdc::PCDX11RenderTarget*>(renderDevice->dx11_createRenderTarget(
|
||||
100, 100, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, 0x18, 0));
|
||||
tempRenderTarget->getRenderTexture11()->createRenderTargetView();
|
||||
|
||||
auto *fxaaDrawable = new (renderDevice, 0) cdc::PCDX11FXAADrawable(
|
||||
renderDevice,
|
||||
/*quality*/ 0,
|
||||
/*texture*/ renderContext->renderTarget2C->getRenderTexture(),
|
||||
/*renderTarget*/ tempRenderTarget,
|
||||
/*flags*/ 0,
|
||||
/*sortZ*/ 0.0f);
|
||||
|
||||
renderDevice->recordDrawable(fxaaDrawable, /*mask=*/ 0x100, 0);
|
||||
renderDevice->finishScene();
|
||||
|
||||
// restart the scene to cause a (pointless) copy
|
||||
renderDevice->createSubScene(
|
||||
&renderViewport,
|
||||
renderContext->renderTarget2C,
|
||||
renderContext->depthBuffer,
|
||||
tempRenderTarget,
|
||||
nullptr);
|
||||
} else {
|
||||
renderDevice->finishScene();
|
||||
tempRenderTarget->getRenderTexture11()->createRenderTargetView();
|
||||
|
||||
@ -948,9 +975,12 @@ int spinnyCube(HWND window,
|
||||
renderDevice->createSubScene(
|
||||
&renderViewport,
|
||||
renderContext->renderTarget2C,
|
||||
renderContext->depthBuffer);
|
||||
renderContext->depthBuffer,
|
||||
nullptr,
|
||||
nullptr);
|
||||
renderDevice->recordDrawable(fxaaDrawable, /*mask=*/ 0x100, 0);
|
||||
}
|
||||
}
|
||||
|
||||
renderDevice->recordDrawable(&imGuiDrawable, /*mask=*/ 0x100, /*addToParent=*/ 0);
|
||||
renderDevice->finishScene();
|
||||
|
Loading…
Reference in New Issue
Block a user