summaryrefslogtreecommitdiff
path: root/src/d/d_gfx.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-07-27 16:45:04 +0200
committerrobojumper <robojumper@gmail.com>2025-07-27 16:45:04 +0200
commite4e4be4fceb93720fd99d604759cf0e362cc2f12 (patch)
tree30572ef1df20e5521845ce1b2dc6e84e8a6b9518 /src/d/d_gfx.cpp
parent4ec5128eb4f6cdc8985f83f4c8b540115daf47fb (diff)
d_gfx mostly OK
Diffstat (limited to 'src/d/d_gfx.cpp')
-rw-r--r--src/d/d_gfx.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/d/d_gfx.cpp b/src/d/d_gfx.cpp
new file mode 100644
index 00000000..e3baa629
--- /dev/null
+++ b/src/d/d_gfx.cpp
@@ -0,0 +1,163 @@
+#include "d/d_gfx.h"
+
+#include "common.h"
+#include "d/d_d2d.h"
+#include "d/d_heap.h"
+#include "d/d_sys.h"
+#include "egg/gfx/eggDrawGX.h"
+#include "egg/gfx/eggGfxEngine.h"
+#include "egg/gfx/eggScreen.h"
+#include "egg/gfx/eggTextureBuffer.h"
+#include "m/m2d.h"
+#include "m/m3d/m3d.h"
+#include "m/m_heap.h"
+#include "m/m_mtx.h"
+#include "m/m_video.h"
+#include "rvl/GX/GXTexture.h"
+#include "rvl/GX/GXTransform.h"
+#include "rvl/GX/GXTypes.h"
+#include "rvl/GX/GXVert.h"
+#include "rvl/MTX/mtx.h"
+#include "rvl/MTX/mtx44.h"
+#include "toBeSorted/d_d3d.h"
+
+dGfx_c *dGfx_c::sInstance;
+
+dGfx_c::dGfx_c() : mpTextureBuffer(nullptr), field_0x08(0), field_0x09(0) {
+ mDrawCallback = nullptr;
+
+ d3d::create(mHeap::g_gameHeaps[0]);
+ initGfxConstants();
+ EGG::GfxEngine::Configuration cfg;
+ u32 texBufSize = cfg.bufferSize;
+ texBufSize += GXGetTexBufferSize(
+ mVideo::m_video->pRenderMode->fbWidth, mVideo::m_video->pRenderMode->efbHeight, GX_TF_RGB5A3, GX_FALSE, 1
+ );
+ EGG::TextureBuffer::setIncludesHeader(true);
+ {
+ mHeap guard(mHeap::g_gameHeaps[0]);
+ EGG::TextureBuffer::initialize(texBufSize, dSys_c::ms_RootHeapMem2);
+ }
+ m2d::create(dHeap::layoutHeap.heap, 0);
+ d2d::create(dHeap::layoutExHeap.heap);
+ sInstance = this;
+}
+
+EGG::TextureBuffer *dGfx_c::getTextureBuffer() {
+ EGG::TextureBuffer *ret = nullptr;
+ if (mpTextureBuffer == nullptr) {
+ mpTextureBuffer = EGG::TextureBuffer::alloc(
+ mVideo::m_video->pRenderMode->fbWidth, mVideo::m_video->pRenderMode->efbHeight, GX_TF_RGBA8
+ );
+ mpTextureBuffer->onCapFlag(0x20); // TODO
+ ret = mpTextureBuffer;
+ }
+ field_0x08++;
+ return ret;
+}
+
+void dGfx_c::releaseTextureBuffer() {
+ field_0x08--;
+ if (field_0x08 == 0 && mpTextureBuffer != nullptr) {
+ mpTextureBuffer->free();
+ mpTextureBuffer = nullptr;
+ }
+}
+
+void dGfx_c::drawBefore() {
+ if (mDrawCallback != nullptr) {
+ (mDrawCallback)();
+ }
+ d2d::drawBefore();
+ m3d::clear();
+ m2d::reset();
+}
+
+void dGfx_c::drawLetterbox() {
+ if (field_0x09 != 0 && isTvMode4To3()) {
+ EGG::Screen screen(*EGG::Screen::GetRoot());
+ screen.SetNearFar(-1.0f, 1.0f);
+ screen.SetProjectionGX();
+ EGG::DrawGX::BeginDrawScreen(true, false, true);
+
+ mMtx_c mtx1;
+ mMtx_c mtx2;
+ mMtx_c mtx3;
+
+ mtx1.transS(0.0f, 0.0f, 0.0f);
+ MTXScale(mtx2, getCurrentScreenWidthF(), getEFBHeightDifferenceF(), 0.0f);
+ MTXConcat(mtx1, mtx2, mtx1);
+ EGG::DrawGX::DrawDL17(mtx1, EGG::DrawGX::BLACK);
+
+ mtx1.transS(0.0f, getCurrentScreenHeightF() - getEFBHeightDifferenceF() - 1.0f, 0.0f);
+ MTXScale(mtx3, getCurrentScreenWidthF(), getEFBHeightDifferenceF() + 1.0f, 0.0f);
+ MTXConcat(mtx1, mtx3, mtx1);
+ EGG::DrawGX::DrawDL17(mtx1, EGG::DrawGX::BLACK);
+ }
+}
+
+void dGfx_c::create(EGG::Heap *heap) {
+ new (heap) dGfx_c();
+}
+
+void dGfx_c::drawCapTexture(EGG::TextureBuffer *buf, nw4r::ut::Color *clr) {
+ if (buf == nullptr) {
+ return;
+ }
+
+ s32 width = mVideo::m_video->pRenderMode->fbWidth;
+ s32 height = mVideo::m_video->pRenderMode->efbHeight;
+ s32 offsetY = 0;
+
+ if (buf->getHeight() == getEFBHeightLimit()) {
+ height = getEFBHeight();
+ offsetY = getLetterboxAmount();
+ }
+ GXSetViewport(0.0f, offsetY, width, height, 0.0f, 1.0f);
+ GXSetScissor(0, offsetY, width, height);
+ GXSetScissorBoxOffset(0, 0);
+
+ Mtx44 mtx;
+ MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
+ GXSetProjection(mtx, GX_ORTHOGRAPHIC);
+ buf->load(GX_TEXMAP0);
+ GXSetNumChans(0);
+ GXSetNumTexGens(1);
+ GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3c, 0, 0x7d);
+ GXSetNumIndStages(0);
+ GXSetNumTevStages(1);
+ GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
+ GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO);
+ GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV);
+ GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
+ GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
+ GXSetZCompLoc(1);
+ GXSetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ONE, GX_LO_SET);
+ GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
+ GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
+
+ GXSetFog(GX_FOG_NONE, (GXColor){0}, 0.0, 0.0, 0.0, 0.0);
+ GXSetFogRangeAdj(GX_FALSE, 0, 0);
+ GXSetCullMode(GX_CULL_NONE);
+ GXSetTevColor(GX_TEVREG0, *clr);
+ GXLoadPosMtxImm(mMtx_c::Identity, 0);
+ GXSetCurrentMtx(0);
+ GXClearVtxDesc();
+ GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
+ GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
+ GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_U8, 0);
+ GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_U8, 0);
+
+ GXBegin(GX_QUADS, GX_VTXFMT0, 4);
+
+ GXPosition2u8(0, 0);
+ GXPosition2u8(0, 0);
+ GXPosition2u8(1, 0);
+ GXPosition2u8(1, 0);
+ GXPosition2u8(1, 1);
+ GXPosition2u8(1, 1);
+ GXPosition2u8(0, 1);
+ GXPosition2u8(0, 1);
+
+ GXEnd();
+}