Files
tww/src/m_Do/m_Do_graphic.cpp
T
2025-05-31 23:53:05 -04:00

1762 lines
64 KiB
C++

//
// Generated by dtk
// Translation Unit: m_Do_graphic.cpp
//
#include "m_Do/m_Do_graphic.h"
#include "SSystem/SComponent/c_lib.h"
#include "d/d_com_inf_game.h"
#include "d/d_drawlist.h"
#include "d/d_meter.h"
#include "d/d_s_play.h"
#include "dolphin/gf/GF.h"
#include "f_ap/f_ap_game.h"
#include "f_op/f_op_camera.h"
#include "m_Do/m_Do_machine.h"
#include "m_Do/m_Do_main.h"
#include "m_Do/m_Do_mtx.h"
#include "m_Do/m_Do_printf.h"
#include "JSystem/J2DGraph/J2DOrthoGraph.h"
#include "JSystem/J2DGraph/J2DPrint.h"
#include "JSystem/JFramework/JFWDisplay.h"
#include "JSystem/JFramework/JFWSystem.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "JSystem/JParticle/JPAEmitterManager.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "JSystem/JUtility/JUTConsole.h"
#include "JSystem/JUtility/JUTDbPrint.h"
#include "JSystem/JUtility/JUTGamePad.h"
#include "JSystem/JUtility/JUTProcBar.h"
#include "JSystem/JUtility/JUTVideo.h"
#include "JSystem/JUtility/JUTXfb.h"
#include "dolphin/base/PPCArch.h"
#include "weak_bss_936_to_1036.h" // IWYU pragma: keep
#include "weak_data_1811.h" // IWYU pragma: keep
JUTFader * mDoGph_gInf_c::mFader;
ResTIMG * mDoGph_gInf_c::mFrameBufferTimg;
GXTexObj mDoGph_gInf_c::mFrameBufferTexObj;
void * mDoGph_gInf_c::mFrameBufferTex;
GXTexObj mDoGph_gInf_c::mZbufferTexObj;
void * mDoGph_gInf_c::mZbufferTex;
u8 mDoGph_gInf_c::mCurrentHeap;
Mtx mDoGph_gInf_c::mBlureMtx;
bool mDoGph_gInf_c::mBlureFlag;
u8 mDoGph_gInf_c::mBlureRate;
u8 mDoGph_gInf_c::mFade;
f32 mDoGph_gInf_c::mFadeRate;
f32 mDoGph_gInf_c::mFadeSpeed;
bool mDoGph_gInf_c::mAutoForcus;
u8 mDoGph_gInf_c::mMonotone;
s16 mDoGph_gInf_c::mMonotoneRate;
s16 mDoGph_gInf_c::mMonotoneRateSpeed;
mDoGph_gInf_c g_mDoGph_graphicInfo;
OSThread mCaptureThread;
#if VERSION > VERSION_DEMO
OSAlarm mCaptureTimeOutAlarm;
#endif
s16 mCaptureStep;
#if VERSION > VERSION_DEMO
bool mCaptureCansel;
#endif
bool mCaptureEnableGXSetCopyFilter;
u8* mCaptureThreadStackHead;
u8* mCaptureCaptureBuffer;
u8* mCaptureTextureBuffer;
u32 mCaptureTextureSize;
u32 mCaptureCaptureSize;
GXDrawSyncCallback mCaptureOldCB;
OSThreadQueue mCaptureThreadQueue;
u64 mCaptureTimeOutTicks = OS_TIMER_CLOCK;
JKRHeap * mDoGph_gInf_c::mHeap[2] = {};
GXColor mDoGph_gInf_c::mBackColor = {};
GXColor mDoGph_gInf_c::mFadeColor = {};
/* 80007BBC-80007DDC .text create__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::create() {
#if VERSION == VERSION_DEMO
JKRHeap* heap = mDoExt_getZeldaHeap();
#else
JKRHeap* heap = JKRHeap::getCurrentHeap();
#endif
JFWDisplay::createManager(heap, JUTXfb::Double, true);
JFWDisplay::getManager()->setDrawDoneMethod(JFWDisplay::Async);
JUTFader* faderPtr = new JUTFader(0, 0, JUTVideo::getManager()->getRenderMode()->fb_width, JUTVideo::getManager()->getRenderMode()->efb_height, JUtility::TColor(0, 0, 0, 0));
JUT_ASSERT(VERSION_SELECT(414, 416, 416, 416), faderPtr != NULL);
setFader(faderPtr);
JFWDisplay::getManager()->setFader(faderPtr);
JUTProcBar::getManager()->setVisibleHeapBar(false);
JUTProcBar::getManager()->setVisible(false);
JUTDbPrint::getManager()->setVisible(false);
createHeap();
u32 framebufferSize = GXGetTexBufferSize(320, 240, GX_TF_RGBA8, GX_FALSE, GX_FALSE) + 0x20;
mFrameBufferTimg = (ResTIMG*) JKRAllocFromHeap(NULL, framebufferSize, 0x20);
mFrameBufferTex = (void*)(&mFrameBufferTimg[1]);
cLib_memSet(mFrameBufferTimg, 0, framebufferSize);
mFrameBufferTimg->format = GX_TF_RGBA8;
mFrameBufferTimg->alphaEnabled = false;
mFrameBufferTimg->width = 320;
mFrameBufferTimg->height = 240;
mFrameBufferTimg->minFilter = GX_LINEAR;
mFrameBufferTimg->magFilter = GX_LINEAR;
mFrameBufferTimg->imageOffset = sizeof(ResTIMG);
u32 zbufferSize = GXGetTexBufferSize(320, 240, GX_TF_IA8, GX_FALSE, GX_FALSE);
mZbufferTex = JKRAllocFromHeap(NULL, zbufferSize, 0x20);
cLib_memSet(mZbufferTex, 0, zbufferSize);
J2DPrint::setBuffer(0x400);
mBlureFlag = 0;
mFade = 0;
mBackColor = g_clearColor;
mFadeColor = g_clearColor;
VISetBlack(TRUE);
}
/* 80007DDC-80007EA8 .text createHeap__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::createHeap() {
#if VERSION == VERSION_DEMO
JKRHeap* parentHeap = mDoExt_getZeldaHeap();
#else
JKRHeap* parentHeap = JKRHeap::getCurrentHeap();
#endif
mHeap[0] = JKRSolidHeap::create(0x10000, parentHeap, false);
JUT_ASSERT(VERSION_SELECT(488, 491, 491, 491), mHeap[0] != NULL);
mHeap[1] = JKRSolidHeap::create(0x10000, parentHeap, false);
JUT_ASSERT(VERSION_SELECT(490, 493, 493, 493), mHeap[1] != NULL);
mCurrentHeap = 0;
}
/* 80007EA8-80007EE4 .text alloc__13mDoGph_gInf_cFUli */
void* mDoGph_gInf_c::alloc(u32 size, int align) {
return mHeap[mCurrentHeap]->alloc(size, align);
}
/* 80007EE4-80007F1C .text free__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::free() {
mHeap[mCurrentHeap ^= 1]->freeAll();
}
/* 80007F1C-80007F6C .text fadeOut__13mDoGph_gInf_cFfR8_GXColor */
void mDoGph_gInf_c::fadeOut(f32 speed, GXColor& color) {
mFade = true;
mFadeSpeed = speed;
mFadeColor = color;
mFadeRate = speed >= 0.0f ? 0.0f : 1.0f;
}
/* 80007F6C-80007F94 .text onBlure__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::onBlure() {
onBlure(cMtx_getIdentity());
}
/* 80007F94-80007FC4 .text onBlure__13mDoGph_gInf_cFPA4_Cf */
void mDoGph_gInf_c::onBlure(const Mtx mtx) {
mBlureFlag = true;
mDoMtx_copy(mtx, mBlureMtx);
}
/* 80007FC4-80007FE8 .text fadeOut__13mDoGph_gInf_cFf */
void mDoGph_gInf_c::fadeOut(f32 speed) {
fadeOut(speed, g_clearColor);
}
/* 80007FE8-800082D8 .text calcFade__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::calcFade() {
if (mFade) {
mFadeRate += mFadeSpeed;
if (mFadeRate < 0.0f) {
mFadeRate = 0.0f;
mFade = false;
} else if (mFadeRate > 1.0f) {
mFadeRate = 1.0f;
}
mFadeColor.a = mFadeRate * 255.0f;
} else {
if (dComIfG_getBrightness() != 0xFF) {
mFadeColor.r = 0;
mFadeColor.g = 0;
mFadeColor.b = 0;
mFadeColor.a = 0xFF - dComIfG_getBrightness();
} else {
mFadeColor.a = 0;
}
}
#if VERSION > VERSION_DEMO
if (mFadeColor.a != 0) {
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, false, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetChanMatColor(GX_COLOR0A0, mFadeColor);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_OR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetFogRangeAdj(GX_FALSE, 0, NULL);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_TRUE);
GXSetNumIndStages(0);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXPosition3s8(1, 0, -5);
GXPosition3s8(1, 1, -5);
GXPosition3s8(0, 1, -5);
GXEnd();
}
#endif
}
/* 800082D8-80008314 .text onMonotone__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::onMonotone() {
mMonotone = true;
mFrameBufferTimg->format = GX_TF_I8;
dComIfGp_particle_swapFrameBufferTexture();
}
/* 80008314-80008354 .text offMonotone__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::offMonotone() {
mMonotone = false;
mFrameBufferTimg->format = GX_TF_RGBA8;
dComIfGp_particle_swapFrameBufferTexture();
}
/* 80008354-800083B8 .text calcMonotone__13mDoGph_gInf_cFv */
void mDoGph_gInf_c::calcMonotone() {
if (cLib_chaseS(&mMonotoneRate, mMonotoneRateSpeed < 0 ? 400 : -600, abs(mMonotoneRateSpeed)) != 0 && mMonotoneRateSpeed > 0)
offMonotone();
}
/* 800083B8-800083BC .text mDoGph_BlankingON__Fv */
void mDoGph_BlankingON() {
}
/* 800083BC-800083C0 .text mDoGph_BlankingOFF__Fv */
void mDoGph_BlankingOFF() {
}
/* 800083C0-800083EC .text dScnPly_BeforeOfPaint__Fv */
void dScnPly_BeforeOfPaint() {
dComIfGd_reset();
}
/* 800083EC-80008410 .text mDoGph_BeforeOfDraw__Fv */
bool mDoGph_BeforeOfDraw() {
dScnPly_BeforeOfPaint();
return true;
}
/* 80008410-80008600 .text mDoGph_AfterOfDraw__Fv */
bool mDoGph_AfterOfDraw() {
if (fapGmHIO_isMenu()) {
JUTProcBar::getManager()->setVisible(false);
JUTProcBar::getManager()->setVisibleHeapBar(false);
JUTDbPrint::getManager()->setVisible(true);
} else {
#if VERSION == VERSION_DEMO
BOOL procVisible = false;
BOOL printVisible = false;
#else
BOOL consoleVisible = JFWSystem::getSystemConsole()->isVisible();
BOOL pad3Connected = JUTGamePad::getPortStatus(JUTGamePad::Port_3).error == 0;
BOOL procVisible = pad3Connected && fapGmHIO_getMeter() && !consoleVisible;
BOOL printVisible = pad3Connected && fapGmHIO_isPrint();
if (mDoMain::developmentMode == 0) {
procVisible = FALSE;
printVisible = FALSE;
}
#endif
JUTProcBar::getManager()->setVisible(procVisible);
JUTProcBar::getManager()->setVisibleHeapBar(procVisible);
JUTDbPrint::getManager()->setVisible(printVisible);
}
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR);
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetFogRangeAdj(GX_FALSE, 0, NULL);
GXSetCoPlanar(GX_FALSE);
GXSetZTexture(GX_ZT_DISABLE, GX_TF_Z8, 0);
#if VERSION == VERSION_DEMO
GXSetDither(GX_FALSE);
#else
GXSetDither(GX_TRUE);
#endif
GXSetClipMode(GX_CLIP_ENABLE);
GXSetCullMode(GX_CULL_NONE);
mDoMch_render_c::setFbWidth(fapGmHIO_getFbWidth());
mDoMch_render_c::setEfbHeight(fapGmHIO_getEfbHeight());
JUTVideo::getManager()->setRenderMode(mDoMch_render_c::getRenderModeObj());
dComIfGd_peekZdata();
mDoGph_gInf_c::endFrame();
return true;
}
#if VERSION == VERSION_DEMO
void clearAlphaBuffer(view_class* view) {
#include "assets/l_matDL__clearAlphaBuffer__FP10view_class.h"
#include "assets/l_DL__clearAlphaBuffer__FP10view_class.h"
static s8 l_pos[][3] = {
{0x00, 0x00, 0xFB},
{0x01, 0x00, 0xFB},
{0x01, 0x01, 0xFB},
{0x00, 0x01, 0xFB},
};
static GXVtxDescList l_vtxDescList[] = {
{GX_VA_POS, GX_INDEX8},
{GX_VA_NULL, GX_NONE},
};
static GXVtxAttrFmtList l_vtxAttrFmtList[] = {
{GX_VA_POS, GX_POS_XYZ, GX_S8, 0x00},
{GX_VA_NULL, GX_POS_XYZ, GX_F32, 0x00},
};
GXCallDisplayList(l_matDL, 0x80);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GFSetVtxDescv(l_vtxDescList);
GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList);
GFSetArray(GX_VA_POS, l_pos, sizeof(*l_pos));
GFLoadPosMtxImm(cMtx_getIdentity(), 0);
GXCallDisplayList(l_DL, 0x20);
GFSetBlendModeEtc(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_CLEAR, 1, 0, 1);
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
}
#else
/* 80008600-80008880 .text clearAlphaBuffer__FP10view_classUc */
void clearAlphaBuffer(view_class* view, u8 alpha) {
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, false, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_OR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetFogRangeAdj(GX_FALSE, 0, NULL);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_TRUE);
GXSetColorUpdate(GX_FALSE);
GXSetAlphaUpdate(GX_TRUE);
GXSetNumIndStages(0);
GXColor color = { 0x00, 0x00, 0x00, 0x00 };
color.a = alpha;
GXSetTevColor(GX_TEVREG0, color);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXPosition3s8(1, 0, -5);
GXPosition3s8(1, 1, -5);
GXPosition3s8(0, 1, -5);
GXEnd();
GXSetColorUpdate(GX_TRUE);
GXSetAlphaUpdate(GX_FALSE);
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
}
#endif
#if VERSION == VERSION_DEMO
static void dummy() {
#include "assets/l_matDL__4454.h"
#include "assets/l_DL__4455.h"
static s8 l_pos[][3] = {
{0x00, 0x00, 0x9C},
{0x01, 0x00, 0x9C},
{0x01, 0x01, 0x9C},
{0x00, 0x01, 0x9C},
};
static GXVtxDescList l_vtxDescList[] = {
{GX_VA_POS, GX_INDEX8},
{GX_VA_NULL, GX_NONE},
};
static GXVtxAttrFmtList l_vtxAttrFmtList[] = {
{GX_VA_POS, GX_POS_XYZ, GX_S8, 0x00},
{GX_VA_NULL, GX_POS_XYZ, GX_F32, 0x00},
};
}
#endif
/* 80008880-80008B0C .text drawAlphaBuffer__FP10view_class8_GXColor */
void drawAlphaBuffer(view_class* view, GXColor color) {
#if VERSION == VERSION_DEMO
#include "assets/l_matDL__drawAlphaBuffer__FP10view_class8_GXColor.h"
#include "assets/l_DL__drawAlphaBuffer__FP10view_class8_GXColor.h"
static s8 l_pos[][3] = {
{0x00, 0x00, 0xFB},
{0x01, 0x00, 0xFB},
{0x01, 0x01, 0xFB},
{0x00, 0x01, 0xFB},
};
static GXVtxDescList l_vtxDescList[] = {
{GX_VA_POS, GX_INDEX8},
{GX_VA_NULL, GX_NONE},
};
static GXVtxAttrFmtList l_vtxAttrFmtList[] = {
{GX_VA_POS, GX_POS_XYZ, GX_S8, 0x00},
{GX_VA_NULL, GX_POS_XYZ, GX_F32, 0x00},
};
GXCallDisplayList(l_matDL, 0x80);
GFSetChanMatColor(GX_COLOR0, color);
GFSetDstAlpha(GX_TRUE, 0);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GFSetVtxDescv(l_vtxDescList);
GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList);
GFSetArray(GX_VA_POS, l_pos, sizeof(*l_pos));
GFLoadPosMtxImm(cMtx_getIdentity(), 0);
GXCallDisplayList(l_DL, 0x20);
GFSetBlendModeEtc(GX_BM_NONE, GX_BL_ZERO, GX_BL_ZERO, GX_LO_CLEAR, 1, 0, 1);
GFSetDstAlpha(GX_FALSE, 0);
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
#else
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, false, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetChanMatColor(GX_COLOR0, color);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, 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(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_BLEND, GX_BL_DST_ALPHA, GX_BL_ONE, GX_LO_OR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetFogRangeAdj(GX_FALSE, 0, NULL);
GXSetCullMode(GX_CULL_NONE);
GXSetDstAlpha(GX_TRUE, 0);
GXSetDither(GX_TRUE);
GXSetColorUpdate(GX_TRUE);
GXSetAlphaUpdate(GX_TRUE);
GXSetNumIndStages(0);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXPosition3s8(1, 0, -5);
GXPosition3s8(1, 1, -5);
GXPosition3s8(0, 1, -5);
GXEnd();
GXSetColorUpdate(GX_TRUE);
GXSetAlphaUpdate(GX_FALSE);
GXSetDstAlpha(GX_FALSE, 0);
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
#endif
}
/* 80008B0C-80008F34 .text drawSpot__FP10view_class */
void drawSpot(view_class* view) {
#if VERSION == VERSION_DEMO
#include "assets/l_DL__drawSpot__FP10view_class.h"
static s8 l_pos[][3] = {
{0x00, 0x00, 0xFB},
{0x01, 0x00, 0xFB},
{0x01, 0x01, 0xFB},
{0x00, 0x01, 0xFB},
};
static GXVtxDescList l_vtxDescList[] = {
{GX_VA_POS, GX_INDEX8},
{GX_VA_NULL, GX_NONE},
};
static GXVtxAttrFmtList l_vtxAttrFmtList[] = {
{GX_VA_POS, GX_POS_XYZ, GX_S8, 0x00},
{GX_VA_NULL, GX_POS_XYZ, GX_F32, 0x00},
};
GFSetVtxDescv(l_vtxDescList);
GFSetVtxAttrFmtv(GX_VTXFMT0, l_vtxAttrFmtList);
GFSetArray(GX_VA_POS, l_pos, sizeof(*l_pos));
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GFLoadPosMtxImm(cMtx_getIdentity(), 0);
GXCallDisplayList(l_DL, 0xE0);
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
#else
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, false, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetChanAmbColor(GX_COLOR0A0, g_clearColor);
GXSetChanMatColor(GX_COLOR0A0, g_clearColor);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevColor(GX_TEVREG0, g_whiteColor);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_BLEND, GX_BL_DST_ALPHA, GX_BL_ONE, GX_LO_OR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetFogRangeAdj(GX_FALSE, 0, NULL);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_TRUE);
GXSetColorUpdate(GX_FALSE);
GXSetAlphaUpdate(GX_TRUE);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXPosition3s8(1, 0, -5);
GXPosition3s8(1, 1, -5);
GXPosition3s8(0, 1, -5);
GXEnd();
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_RASA);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetBlendMode(GX_BM_BLEND, GX_BL_ONE, GX_BL_ONE, GX_LO_OR);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXPosition3s8(1, 0, -5);
GXPosition3s8(1, 1, -5);
GXPosition3s8(0, 1, -5);
GXEnd();
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_RASC);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, 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);
GXSetBlendMode(GX_BM_BLEND, GX_BL_DST_ALPHA, GX_BL_DST_ALPHA, GX_LO_OR);
GXSetNumIndStages(0);
GXSetColorUpdate(GX_TRUE);
GXSetAlphaUpdate(GX_FALSE);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXPosition3s8(1, 0, -5);
GXPosition3s8(1, 1, -5);
GXPosition3s8(0, 1, -5);
GXEnd();
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
#endif
}
/* 80008F34-8000990C .text drawDepth__FP10view_classP15view_port_classi */
void drawDepth(view_class* view, view_port_class* viewport, int depth) {
/* Nonmatching */
if (mDoGph_gInf_c::isAutoForcus()) {
f32 projv[7];
f32 viewv[6];
f32 x, y, z;
GXGetProjectionv(projv);
GXGetViewportv(viewv);
GXProject(view->mLookat.mCenter.x, view->mLookat.mCenter.y, view->mLookat.mCenter.z, view->mViewMtx, projv, viewv, &x, &y, &z);
int temp = z * 0xFFFFFF;
depth = (0xFF0000 - temp) >> 8;
depth = cLib_minMaxLimit(depth, -0x400, 0);
}
static GXColorS10 l_tevColor0 = { 0, 0, 0, 0 };
if (mDoGph_gInf_c::isMonotone()) {
mDoGph_gInf_c::calcMonotone();
l_tevColor0.a = mDoGph_gInf_c::getMonotoneRate();
} else {
dStage_FileList_dt_c * fili_p = NULL;
s32 roomNo = dComIfGp_roomControl_getStayNo();
if (roomNo >= 0)
fili_p = dComIfGp_roomControl_getStatusRoomDt(roomNo)->getFileListInfo();
if (fili_p == NULL) {
if (!mDoGph_gInf_c::isAutoForcus()) {
l_tevColor0.a = depth - g_envHIO.mOther.field_0x40;
} else {
int photoDepth = -g_envHIO.mOther.field_0x40;
l_tevColor0.a = cLib_maxLimit<s16>(photoDepth, depth);
}
} else {
if (!mDoGph_gInf_c::isAutoForcus()) {
l_tevColor0.a = depth - dStage_FileList_dt_PhotoDepth(fili_p);
} else {
int photoDepth = -dStage_FileList_dt_PhotoDepth(fili_p);
l_tevColor0.a = cLib_maxLimit<int>(photoDepth, depth);
}
}
}
s16 x = (s16)viewport->mXOrig & ~0x07;
s16 y = (s16)viewport->mYOrig & ~0x07;
s16 y2 = (y < 0) ? 0 : y;
s16 w = (s16)viewport->mWidth & ~0x07;
s16 h = (s16)viewport->mHeight & ~0x07;
char* zbuf = (char*)mDoGph_gInf_c::getZbufferTex();
char* fbbuf = (char*)mDoGph_gInf_c::getFrameBufferTex();
if (y < 0) {
h += y;
s16 hh = -y >> 1;
zbuf += GXGetTexBufferSize(320, hh, GX_TF_IA8, GX_FALSE, 0);
fbbuf += GXGetTexBufferSize(320, hh, mDoGph_gInf_c::getFrameBufferTimg()->format, GX_FALSE, 0);
}
y = y2;
u16 hw = w >> 1;
u16 hh = h >> 1;
GXSetCopyFilter(GX_FALSE, NULL, GX_TRUE, JUTVideo::getManager()->getRenderMode()->vfilter);
GXSetTexCopySrc(x, y, w, h);
GXSetTexCopyDst(hw, hh, GX_TF_Z16, GX_TRUE);
GXCopyTex(zbuf, GX_FALSE);
GXSetTexCopySrc(x, y, w, h);
GXSetTexCopyDst(hw, hh, (GXTexFmt)mDoGph_gInf_c::getFrameBufferTimg()->format, GX_TRUE);
GXCopyTex(fbbuf, GX_FALSE);
GXInitTexObj(mDoGph_gInf_c::getZbufferTexObj(), zbuf, w, h, GX_TF_IA8, GX_CLAMP, GX_CLAMP, GX_FALSE);
GXInitTexObjLOD(mDoGph_gInf_c::getZbufferTexObj(), GX_NEAR, GX_NEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
GXInitTexObj(mDoGph_gInf_c::getFrameBufferTexObj(), fbbuf, w, h, (GXTexFmt)mDoGph_gInf_c::getFrameBufferTimg()->format, GX_CLAMP, GX_CLAMP, GX_FALSE);
GXInitTexObjLOD(mDoGph_gInf_c::getFrameBufferTexObj(), GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, GX_FALSE, GX_FALSE, GX_ANISO_1);
GXPixModeSync();
GXLoadTexObj(mDoGph_gInf_c::getFrameBufferTexObj(), GX_TEXMAP1);
GXLoadTexObj(mDoGph_gInf_c::getZbufferTexObj(), GX_TEXMAP0);
#if VERSION == VERSION_DEMO
mDoGph_gInf_c::calcFade();
#endif
GXSetNumChans(0);
GXSetNumTexGens(2);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
GXSetTexCoordGen(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
GXSetNumTevStages(3);
GXSetTevColorS10(GX_TEVREG0, l_tevColor0);
#if VERSION == VERSION_DEMO
GXSetTevColor(GX_TEVREG2, mDoGph_gInf_c::getFadeColor());
#endif
GXSetTevSwapModeTable(GX_TEV_SWAP3, GX_CH_ALPHA, GX_CH_GREEN, GX_CH_BLUE, GX_CH_RED);
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP3);
GXSetTevKAlphaSel(GX_TEVSTAGE0, GX_TEV_KASEL_1);
GXSetTevKAlphaSel(GX_TEVSTAGE2, GX_TEV_KASEL_1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_KONST, GX_CA_TEXA, GX_CA_KONST, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_COMP_RGB8_EQ, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_APREV, GX_CA_TEXA, GX_CA_A0);
GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_4, GX_TRUE, GX_TEVPREV);
GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL);
#if VERSION == VERSION_DEMO
GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_TEXC, GX_CC_C2, GX_CC_A2, GX_CC_ZERO);
#else
GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC);
#endif
GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
#if VERSION == VERSION_DEMO
GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_APREV, GX_CA_KONST, GX_CA_A2, GX_CA_ZERO);
#else
GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_APREV);
#endif
GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR);
GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_TRUE);
GXSetNumIndStages(0);
#if VERSION == VERSION_DEMO
GXSetTevDirect(GX_TEVSTAGE0);
GXSetTevDirect(GX_TEVSTAGE1);
GXSetTevDirect(GX_TEVSTAGE2);
#endif
Mtx44 mtx;
C_MTXOrtho(mtx, viewport->mYOrig, viewport->mYOrig + viewport->mHeight, viewport->mXOrig, viewport->mXOrig + viewport->mWidth, 0.0, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S8, 0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s16(x, y, -5);
GXTexCoord2s8(0, 0);
GXPosition3s16(w, y, -5);
GXTexCoord2s8(1, 0);
GXPosition3s16(w, h, -5);
GXTexCoord2s8(1, 1);
GXPosition3s16(x, h, -5);
GXTexCoord2s8(0, 1);
GXEnd();
GXSetTevSwapModeTable(GX_TEV_SWAP3, GX_CH_BLUE, GX_CH_BLUE, GX_CH_BLUE, GX_CH_ALPHA);
GXSetTevSwapMode(GX_TEVSTAGE0, GX_TEV_SWAP0, GX_TEV_SWAP0);
if (y == 0) {
s16 h = (s16)viewport->mScissor.mYOrig;
if (h != 0) {
h += (f32)viewport->mScissor.mHeight;
GXSetNumChans(1);
GXSetChanCtrl(GX_ALPHA0, false, GX_SRC_REG, GX_SRC_REG, 0, GX_DF_NONE, GX_AF_NONE);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, 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);
GXSetBlendMode(GX_BM_NONE, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXBegin(GX_QUADS, GX_VTXFMT0, 8);
GXPosition3s16(0, 0, -5);
GXPosition3s16(640, 0, -5);
GXPosition3s16(640, y, -5);
GXPosition3s16(0, y, -5);
GXPosition3s16(0, h, -5);
GXPosition3s16(640, h, -5);
GXPosition3s16(640, 480, -5);
GXPosition3s16(0, 480, -5);
GXEnd();
}
}
GXSetScissor(viewport->mScissor.mXOrig, viewport->mScissor.mYOrig, viewport->mScissor.mWidth, viewport->mScissor.mHeight);
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
}
/* 80009914-80009BBC .text motionBlure__FP10view_class */
void motionBlure(view_class* view) {
if (mDoGph_gInf_c::isBlure()) {
GXLoadTexObj(mDoGph_gInf_c::getFrameBufferTexObj(), GX_TEXMAP0);
GXColor color;
color.a = mDoGph_gInf_c::getBlureRate();
GXSetNumChans(0);
GXSetNumTexGens(1);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_TEXMTX0);
GXLoadTexMtxImm(mDoGph_gInf_c::getBlureMtx(), GX_TEXMTX0, GX_MTX2x4);
GXSetNumTevStages(1);
GXSetTevColor(GX_TEVREG0, color);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO, GX_CC_TEXC);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_A0);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_CLEAR);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_TRUE);
Mtx44 mtx;
C_MTXOrtho(mtx, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S8, 0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s8(0, 0, -5);
GXTexCoord2s8(0, 0);
GXPosition3s8(1, 0, -5);
GXTexCoord2s8(1, 0);
GXPosition3s8(1, 1, -5);
GXTexCoord2s8(1, 1);
GXPosition3s8(0, 1, -5);
GXTexCoord2s8(0, 1);
GXEnd();
GXSetProjection(view->mProjMtx, GX_PERSPECTIVE);
}
}
u8 mCaptureDraw = 1;
u8 mCaptureTextureFormat = GX_TF_CMPR;
u8 mCaptureCaptureFormat = GX_TF_RGB565;
u8 mCaptureSizeWidth = 152;
u8 mCaptureSizeHeight = 104;
s16 mCaptureCenterX = 320;
s16 mCaptureCenterY = 180;
GXColor mCaptureMonoColor0 = { 0x00, 0x00, 0x00, 0x00 };
GXColor mCaptureMonoColor1 = { 0xFF, 0xFF, 0xFF, 0xFF };
u32 mCaptureThreadStackSize = 0x2000;
s32 mCaptureThreadPriority = 30;
/* 80009BBC-80009BE0 .text mCaptureAlarmHandler__FP7OSAlarmP9OSContext */
void mCaptureAlarmHandler(OSAlarm*, OSContext*) {
OSWakeupThread(&mCaptureThreadQueue);
}
/* 80009BE0-80009BE8 .text mDoGph_setCaptureStep__Fs */
void mDoGph_setCaptureStep(s16 step) {
mCaptureStep = step;
}
/* 80009BE8-80009BF0 .text mDoGph_getCaptureStep__Fv */
s16 mDoGph_getCaptureStep() {
return mCaptureStep;
}
/* 80009BF0-80009BF8 .text mDoGph_getCaptureTextureBuffer__Fv */
void* mDoGph_getCaptureTextureBuffer() {
return mCaptureTextureBuffer;
}
/* 80009BF8-80009C00 .text mDoGph_setCaptureTextureFormat__FUc */
void mDoGph_setCaptureTextureFormat(u8 fmt) {
mCaptureTextureFormat = fmt;
}
/* 80009C00-80009C08 .text mDoGph_setCaptureCaptureFormat__FUc */
void mDoGph_setCaptureCaptureFormat(u8 fmt) {
mCaptureCaptureFormat = fmt;
}
#if VERSION > VERSION_DEMO
/* 80009C08-80009C38 .text mDoGph_CaptureCansel__Fv */
void mDoGph_CaptureCansel() {
if (mCaptureStep < 0) {
mCaptureStep = 0;
mCaptureCansel = false;
} else if (mCaptureStep != 0) {
mCaptureCansel = true;
}
}
#endif
#define COLOR_SQUARE_MAG(r0, g0, b0, r1, g1, b1) (r0 - r1)*(r0 - r1) + (g0 - g1)*(g0 - g1) + (b0 - b1)*(b0 - b1)
/* 80009C38-8000A180 .text blockenc__FPUc */
void blockenc(u8* block) {
/* Nonmatching */
u8 colors[16*3]; // sp18
u32 color_mags[4]; // sp08
u32 pix_idx;
u32 color_num = 0; // r11
u32 i = 0; // r8
pix_idx = 0; // r10
for (; i < 0x30; i += 3, pix_idx += 4) {
u32 r9 = 0; // r9
u8* pix = &block[pix_idx];
for (int j = 0; j < color_num; j++) {
u8* temp = &colors[r9*3];
if (temp[0] == pix[0] && temp[1] == pix[1] && temp[2] == pix[2]) {
break;
}
r9++;
}
if (r9 == color_num) {
colors[r9*3 + 0] = pix[0];
colors[r9*3 + 1] = pix[1];
colors[r9*3 + 2] = pix[2];
color_num += 1;
}
}
u32 color_0_idx = 0; // r17
u32 color_1_idx = 0; // r16
if (color_num > 1) {
u32 r23 = 0;
u32 r18 = INT32_MAX;
for (; r23 < color_num*3 - 3; r23 += 3) {
u32 r0 = colors[r23+0] * 30;
u32 g0 = colors[r23+1] * 59;
u32 b0 = colors[r23+2] * 11;
for (u32 r21 = r23+3; r21 < color_num*3 - 3; r21 += 3) {
u32 r1 = colors[r21+0] * 30;
u32 g1 = colors[r21+1] * 59;
u32 b1 = colors[r21+2] * 11;
u32 r20 = 0; // r20
u32 pix_idx = 0; // r19
u32 r22 = 0; // r22
for (; r22 < 0x10; r22++, pix_idx += 4) {
// u32 b2 = block[pix_idx + 2] * 11;
// u32 r2 = block[pix_idx + 0] * 30;
// u32 g2 = block[pix_idx + 1] * 59;
color_mags[0] = COLOR_SQUARE_MAG(r0, g0, b0, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
color_mags[1] = COLOR_SQUARE_MAG(r1, g1, b1, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
u32 r3 = (r0 * 5 + r1 * 3) / 8;
u32 g3 = (g0 * 5 + g1 * 3) / 8;
u32 b3 = (b0 * 5 + b1 * 3) / 8;
color_mags[2] = COLOR_SQUARE_MAG(r3, g3, b3, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
u32 r4 = (r1 * 5 + r0 * 3) / 8;
u32 g4 = (g1 * 5 + g0 * 3) / 8;
u32 b4 = (b1 * 5 + b0 * 3) / 8;
color_mags[3] = COLOR_SQUARE_MAG(r4, g4, b4, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
u32 r5 = 0;
u32 r6 = INT32_MAX;
for (; r5 < ARRAY_SIZE(color_mags); r5++) {
if (color_mags[r5] < r6) {
r6 = color_mags[r5];
}
}
r20 += r6;
}
if (r20 < r18) {
r18 = r20;
color_0_idx = r23;
color_1_idx = r21;
}
}
}
}
u32 r11 = (colors[color_0_idx + 0] & 0xF8) << 8 |
(colors[color_0_idx + 1] & 0xFC) << 3 |
(colors[color_0_idx + 2] & 0xF8) >> 3;
u32 r4 = (colors[color_1_idx + 0] & 0xF8) << 8 |
(colors[color_1_idx + 1] & 0xFC) << 3 |
(colors[color_1_idx + 2] & 0xF8) >> 3;
if (r11 < r4) {
u32 temp = r11;
r11 = r4;
r4 = temp;
} else if (r11 == r4) {
r4 = 0;
}
block[0x40] = r11 >> 8;
block[0x41] = r11 & 0xFF;
block[0x42] = r4 >> 8;
block[0x43] = r4 & 0xFF;
u32 r0 = ((r11 >> 8) & 0xF8) * 30;
u32 g0 = ((r11 >> 3) & 0xFC) * 59;
u32 b0 = ((r11 << 3) & 0xFC) * 11;
u32 r1 = ((r4 >> 8) & 0xF8) * 30;
u32 g1 = ((r4 >> 3) & 0xFC) * 59;
u32 b1 = ((r4 << 3) & 0xFC) * 11;
u32 r6 = 30; // r6 (bit offset within r8)
u32 r8 = 0; // r8 (bitfield of color indexes)
for (pix_idx = 0; pix_idx < 0x40; pix_idx += 4) {
// u32 b2 = block[pix_idx + 2] * 11;
// u32 r2 = block[pix_idx + 0] * 30;
// u32 g2 = block[pix_idx + 1] * 59;
color_mags[0] = COLOR_SQUARE_MAG(r0, g0, b0, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
color_mags[1] = COLOR_SQUARE_MAG(r1, g1, b1, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
u32 r3 = (r0 * 5 + r1 * 3) / 8;
u32 g3 = (g0 * 5 + g1 * 3) / 8;
u32 b3 = (b0 * 5 + b1 * 3) / 8;
color_mags[2] = COLOR_SQUARE_MAG(r3, g3, b3, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
u32 r4 = (r1 * 5 + r0 * 3) / 8;
u32 g4 = (g1 * 5 + g0 * 3) / 8;
u32 b4 = (b1 * 5 + b0 * 3) / 8;
color_mags[3] = COLOR_SQUARE_MAG(r4, g4, b4, block[pix_idx+0] * 30, block[pix_idx+1] * 59, block[pix_idx+2] * 11);
u32 r5 = 0;
u32 r24;
u32 r25 = INT32_MAX;
for (; r5 < ARRAY_SIZE(color_mags); r5++) {
if (color_mags[r5] < r25) {
r25 = color_mags[r5];
r24 = r5;
}
}
r8 |= (r24 & 0x03) << r6;
r6 -= 2;
}
block[0x44] = r8 >> 24;
block[0x45] = r8 >> 16;
block[0x46] = r8 >> 8;
block[0x47] = r8 & 0xFF;
}
/* 8000A180-8000A530 .text encode_s3tc__FPUcPUcii9_GXTexFmt */
u32 encode_s3tc(u8* r25, u8* r26, int r27, int r28, GXTexFmt fmt) {
/* Nonmatching */
// params: capture_buffer, texture_buffer, width, height, fmt
u8 block[0x40 + 0x8]; // sp08;
u32 r31 = 0;
if (fmt == GX_TF_I8) {
u32 i8low = 255; // r30
u32 i8high = 0; // r29
for (int r18 = 0; r18 < r28; r18 += 8) {
for (int r19 = 0, r24 = 0; r19 < r27; r19 += 8, r24 += 0x20) {
for (int r20 = 0; r20 < 8; r20 += 4) {
int r21 = 0;
u32 r23 = r24 + r27 * (r18 + r20);
for (; r21 < 8; r21 += 4) {
u32 r5 = 0;
int r3 = 0;
u32 r10 = r21 + r23;
for (; r3 < 4; r3++) {
u32 r4 = r3*8 + r10;
u32 r9 = 219;
u32 r8 = 255; // r8 (alpha)
u8* r7 = &r25[r4];
for (int i = 0; i < 4; r5++, i++) {
u32 r11 = r7[i];
if (i8low > r11) {
i8low = r11;
}
if (i8high < r11) {
i8high = r11;
}
u32 r0 = ((r11 - 16) * 255) / r9;
block[r5*4+0] = r0 & 0xF8;
block[r5*4+1] = r0 & 0xFC;
block[r5*4+2] = r0 & 0xF8;
block[r5*4+3] = r8;
}
}
blockenc(block);
memcpy(&r26[r31], &block[0x40], 8);
r31 += 8;
}
}
}
}
JUT_ASSERT(0x8A7, 16 <= i8low && i8high <= 235);
} else if (fmt == GX_TF_RGB565) {
for (int r24 = 0; r24 < r28; r24 += 8) {
for (int r29 = 0; r29 < r27; r29 += 8) {
for (int r30 = 0; r30 < 8; r30 += 4) {
int r21 = 0;
u32 r22 = 2 * (r27 * (r24 + r30));
for (; r21 < 8; r21 += 4) {
u32 r8 = 0;
int r9 = 0;
// u32 r3 = 0;
u32 r6 = r22 + 8 * (r29 + r21);
u32 r5 = 255; // r5 (alpha)
for (; r9 < 4; r9++) {//, r3 += 8) {
u32 r10 = r9*8 + r6;
u16* r4 = (u16*)&r25[r10];
for (int i = 0; i < 4; i++, r8++, r10 += 2, r4++) {
u32 r11 = *r4;
block[r8*4+0] = (r11 >> 8) & 0xF8;
block[r8*4+1] = (r11 >> 3) & 0xFC;
block[r8*4+2] = (r11 << 3) & 0xF8;
block[r8*4+3] = r5;
}
}
blockenc(block);
memcpy(&r26[r31], &block[0x40], 8);
r31 += 8;
}
}
}
}
} else if (fmt == GX_TF_RGBA8) {
for (int r24 = 0; r24 < r28; r24 += 8) {
for (int r29 = 0; r29 < r27; r29 += 8) {
for (int r30 = 0; r30 < 8; r30 += 4) {
int r21 = 0;
u32 r22 = 4 * (r27 * (r24 + r30));
for (; r21 < 8; r21 += 4) {
u32 r4 = 0;
for (int r5 = 0; r5 < 4; r5++) {
u32 r6 = r5 * 8 + r22 + 16 * (r29 + r21);
u32 r7 = r6 + 0x20;
u32 r9 = 255; // r9 (alpha)
for (int i = 0; i < 4; i++, r4++, r6 += 2, r7 += 2) {
u8* r3 = &r25[r6];
block[r4*4+0] = r3[1] & 0xF8;
u8* r12 = &r25[r7];
block[r4*4+1] = r12[0] & 0xFC;
block[r4*4+2] = r12[1] & 0xF8;
block[r4*4+3] = r3[0];
block[r4*4+3] = r9;
}
}
blockenc(block);
memcpy(&r26[r31], &block[0x40], 8);
r31 += 8;
}
}
}
}
}
return r31;
}
/* 8000A530-8000A744 .text setUpRectangle__Fv */
void setUpRectangle() {
GXSetNumChans(0);
GXSetNumTexGens(1);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
GXSetNumTevStages(1);
GXSetTevColor(GX_TEVREG0, mCaptureMonoColor0);
GXSetTevColor(GX_TEVREG1, mCaptureMonoColor1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C0, GX_CC_C1, GX_CC_TEXC, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO, GX_CA_KONST);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetZCompLoc(GX_TRUE);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRC_ALPHA, GX_BL_INV_SRC_ALPHA, GX_LO_COPY);
GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_OR, GX_ALWAYS, 0);
GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, g_clearColor);
GXSetClipMode(GX_CLIP_DISABLE);
GXSetCullMode(GX_CULL_NONE);
GXSetDither(GX_TRUE);
GXSetNumIndStages(0);
GXSetTevDirect(GX_TEVSTAGE0);
Mtx44 mtx;
C_MTXOrtho(mtx, -21.0f, 503.0f, -9.0f, 650.0f, 0.0f, 10.0f);
GXSetProjection(mtx, GX_ORTHOGRAPHIC);
GXLoadPosMtxImm(cMtx_getIdentity(), GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S8, 0);
}
/* 8000A744-8000A7F0 .text drawRectangle__Fiiii */
void drawRectangle(int x0, int y0, int x1, int y1) {
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s16(x0, y0, -5);
GXTexCoord2s8(0, 0);
GXPosition3s16(x1, y0, -5);
GXTexCoord2s8(1, 0);
GXPosition3s16(x1, y1, -5);
GXTexCoord2s8(1, 1);
GXPosition3s16(x0, y1, -5);
GXTexCoord2s8(0, 1);
GXEnd();
}
#if VERSION > VERSION_DEMO
/* 8000A7F0-8000A8B8 .text mDoGph_allocFromAny__FUli */
u8* mDoGph_allocFromAny(u32 size, int align) {
void* mem = JKRAllocFromHeap(mDoExt_getZeldaHeap(), size, align);
if (mem == NULL)
mem = JKRAllocFromHeap(mDoExt_getGameHeap(), size, align);
if (mem == NULL)
mem = JKRAllocFromHeap(mDoExt_getArchiveHeap(), size, align);
if (mem == NULL)
mem = JKRAllocFromSysHeap(size, align);
if (mem == NULL)
mem = mDoGph_gInf_c::getZbufferTex();
memset(mem, 0, size);
return (u8*)mem;
}
#endif
/* 8000A8B8-8000AAC4 .text mDoGph_screenCaptureDraw__Fv */
void mDoGph_screenCaptureDraw() {
s32 sizeW = mCaptureSizeWidth;
s32 sizeH = mCaptureSizeHeight;
s32 sizeW_double = sizeW * 2;
s32 sizeH_double = sizeH * 2;
s32 sizeW_half = sizeW / 2;
s32 sizeH_half = sizeH / 2;
s32 centerX = mCaptureCenterX;
s32 centerY = mCaptureCenterY;
f32 projv[7];
f32 viewv[6];
u32 left, top, width, height;
GXTexObj texObj;
GXGetProjectionv(projv);
GXGetViewportv(viewv);
GXGetScissor(&left, &top, &width, &height);
GXSetViewport(0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f);
setUpRectangle();
if (mCaptureCaptureBuffer != NULL) {
GXInitTexObj(&texObj, mCaptureCaptureBuffer, sizeW, sizeH, (GXTexFmt)mCaptureCaptureFormat, GX_CLAMP, GX_CLAMP, GX_FALSE);
} else if (mCaptureTextureBuffer != NULL) {
GXInitTexObj(&texObj, mCaptureTextureBuffer, sizeW, sizeH, (GXTexFmt)mCaptureTextureFormat, GX_CLAMP, GX_CLAMP, GX_FALSE);
} else {
goto out;
}
GXLoadTexObj(&texObj, GX_TEXMAP0);
if (mCaptureDraw == 1) {
drawRectangle(centerX - sizeW, centerY - sizeH, centerX + sizeW, centerY + sizeH);
} else if (mCaptureDraw == 2) {
drawRectangle(centerX - sizeW_half, centerY - sizeH_half, centerX + sizeW_half, centerY + sizeH_half);
} else if (mCaptureDraw == 3) {
drawRectangle(centerX - sizeW_double, centerY - sizeH_double, centerX + sizeW_double, centerY + sizeH_double);
} else if (mCaptureDraw == 4) {
drawRectangle(centerX - sizeW, centerY - sizeH, centerX, centerY);
drawRectangle(centerX, centerY - sizeH, centerX + sizeW, centerY);
drawRectangle(centerX - sizeW, centerY, centerX, centerY + sizeH);
drawRectangle(centerX, centerY, centerX + sizeW, centerY + sizeH);
}
out:
GXSetProjectionv(projv);
GXSetViewport(viewv[0], viewv[1], viewv[2], viewv[3], viewv[4], viewv[5]);
GXSetScissor(left, top, width, height);
GXSetClipMode(GX_CLIP_ENABLE);
}
/* 8000AAC4-8000AB1C .text mCaptureProc__FPv */
u32 mCaptureProc(void* dummy) {
u32 bytesCopied = encode_s3tc(mCaptureCaptureBuffer, mCaptureTextureBuffer, mCaptureSizeWidth, mCaptureSizeHeight, (GXTexFmt)mCaptureCaptureFormat);
#if VERSION > VERSION_DEMO
DCStoreRange(mCaptureTextureBuffer, mCaptureTextureSize);
#endif
OSExitThread((void*)bytesCopied);
return bytesCopied;
}
/* 8000AB1C-8000ABC4 .text mCaptureGXDrawSyncCallback__FUs */
void mCaptureGXDrawSyncCallback(u16) {
#if VERSION > VERSION_DEMO
OSCancelAlarm(&mCaptureTimeOutAlarm);
BOOL interrupt = OSDisableInterrupts();
if (mCaptureStep == 2) {
#endif
void* oldcb = (void*)GXSetDrawSyncCallback(mCaptureOldCB);
JUT_ASSERT(VERSION_SELECT(2580, 2655, 2655, 2655), oldcb == mCaptureGXDrawSyncCallback);
mCaptureOldCB = NULL;
mCaptureStep++;
#if VERSION > VERSION_DEMO
}
OSRestoreInterrupts(interrupt);
#endif
}
#if VERSION > VERSION_DEMO
/* 8000ABC4-8000AC3C .text mCaptureGXDrawSyncTimeOut__FP7OSAlarmP9OSContext */
void mCaptureGXDrawSyncTimeOut(OSAlarm*, OSContext*) {
OSReport_Error("キャプチャタイムアウト\n");
mCaptureGXDrawSyncCallback(0);
if (mCaptureCaptureBuffer != NULL) {
JKRFreeToHeap(NULL, mCaptureCaptureBuffer);
mCaptureCaptureBuffer = NULL;
}
if (mCaptureTextureBuffer != NULL) {
JKRFreeToHeap(NULL, mCaptureTextureBuffer);
mCaptureTextureBuffer = NULL;
}
mCaptureStep = -1;
}
#endif
/* 8000AC3C-8000AEA4 .text mDoGph_screenCapture__Fv */
bool mDoGph_screenCapture() {
s32 sizeW = mCaptureSizeWidth;
s32 sizeH = mCaptureSizeHeight;
s32 sizeW2 = sizeW << 1;
s32 sizeH2 = sizeH << 1;
s32 centerX = mCaptureCenterX;
s32 centerY = mCaptureCenterY;
f32 projv[7];
f32 viewv[6];
u32 left, top, width, height;
mCaptureTextureSize = GXGetTexBufferSize(sizeW, sizeH, mCaptureTextureFormat, GX_FALSE, 0);
#if VERSION == VERSION_DEMO
mCaptureTextureBuffer = (u8*)JKRAlloc(mCaptureTextureSize, 0x20);
#else
mCaptureTextureBuffer = mDoGph_allocFromAny(mCaptureTextureSize, 0x20);
#endif
if (mCaptureTextureBuffer == NULL) {
mCaptureStep = -1;
return false;
}
if (mCaptureTextureFormat == GX_TF_CMPR) {
mCaptureCaptureSize = GXGetTexBufferSize(sizeW, sizeH, mCaptureCaptureFormat, GX_FALSE, 0);
#if VERSION == VERSION_DEMO
mCaptureCaptureBuffer = (u8*)JKRAlloc(mCaptureCaptureSize, 0x20);
#else
mCaptureCaptureBuffer = mDoGph_allocFromAny(mCaptureCaptureSize, 0x20);
#endif
if (mCaptureCaptureBuffer == NULL) {
JKRFreeToHeap(NULL, mCaptureTextureBuffer);
mCaptureTextureBuffer = NULL;
mCaptureStep = -1;
return false;
}
} else {
mCaptureCaptureFormat = mCaptureTextureFormat;
mCaptureCaptureBuffer = mCaptureTextureBuffer;
}
GXGetProjectionv(projv);
GXGetViewportv(viewv);
GXGetScissor(&left, &top, &width, &height);
GXSetViewport(0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f);
if (mCaptureEnableGXSetCopyFilter)
GXSetCopyFilter(GX_FALSE, NULL, GX_FALSE, NULL);
setUpRectangle();
GXSetTexCopySrc(centerX - sizeW, centerY - sizeH, sizeW2, sizeH2);
GXSetTexCopyDst(sizeW, sizeH, (GXTexFmt)mCaptureCaptureFormat, GX_TRUE);
#if VERSION > VERSION_DEMO
DCInvalidateRange(mCaptureCaptureBuffer, mCaptureCaptureSize);
#endif
GXCopyTex(mCaptureCaptureBuffer, GX_FALSE);
GXPixModeSync();
JUT_ASSERT(VERSION_SELECT(2657, 2753, 2753, 2753), mCaptureOldCB == NULL);
mCaptureOldCB = GXSetDrawSyncCallback(mCaptureGXDrawSyncCallback);
#if VERSION > VERSION_DEMO
OSCreateAlarm(&mCaptureTimeOutAlarm);
OSSetAlarm(&mCaptureTimeOutAlarm, mCaptureTimeOutTicks, mCaptureGXDrawSyncTimeOut);
#endif
mCaptureStep++;
GXSetDrawSync(GX_FALSE);
GXSetProjectionv(projv);
GXSetViewport(viewv[0], viewv[1], viewv[2], viewv[3], viewv[4], viewv[5]);
GXSetScissor(left, top, width, height);
GXSetClipMode(GX_CLIP_ENABLE);
return true;
}
/* 8000AEA4-8000AF2C .text setLight__Fv */
void setLight() {
GXLightObj lightObj;
GXInitLightPos(&lightObj, -35000.0f, 0.0f,-30000.0f);
GXInitLightDir(&lightObj, 0.0f, 0.0f, 0.0f);
GXInitLightColor(&lightObj, g_whiteColor);
GXInitLightDistAttn(&lightObj, 0.0f, 0.0f, GX_DA_GENTLE);
GXInitLightSpot(&lightObj, 0.0f, GX_SP_FLAT);
GXLoadLightObjImm(&lightObj, GX_LIGHT0);
}
/* 8000AF2C-8000BC38 .text mDoGph_Painter__Fv */
bool mDoGph_Painter() {
#if VERSION > VERSION_DEMO
JFWDisplay::getManager()->setFader(mDoGph_gInf_c::mFader);
#endif
mDoGph_gInf_c::setClearColor(mDoGph_gInf_c::getBackColor());
mDoGph_gInf_c::beginRender();
GXSetAlphaUpdate(GX_FALSE);
#if VERSION > VERSION_DEMO
mDoGph_gInf_c::setBackColor(g_clearColor);
#endif
mDoGph_gInf_c::free();
if (mCaptureEnableGXSetCopyFilter)
GXSetCopyFilter(GX_FALSE, NULL, GX_FALSE, NULL);
j3dSys.drawInit();
#if VERSION > VERSION_DEMO
GXSetDither(GX_TRUE);
#endif
J2DOrthoGraph graf(0.0f, 0.0f, 640.0f, 480.0f, -1.0f, 1.0f);
graf.setOrtho(JGeometry::TBox2<f32>(-9.0f, -21.0f, 650.0f, 503.0f), -1.0f, 1.0f);
graf.setPort();
dComIfGp_setCurrentGrafPort(&graf);
dComIfGd_drawCopy2D();
if (dComIfGp_getWindowNum() != 0) {
dDlst_window_c* window = dComIfGp_getWindow(0);
s32 cameraID = window->getCameraID();
camera_class* camera = (camera_class*)dComIfGp_getCamera(cameraID);
if (camera != NULL) {
dComIfGd_imageDrawShadow(camera->mViewMtx);
view_port_class viewport_crop;
view_port_class* viewport_p = window->getViewPort();
if (viewport_p->mXOrig != 0.0f || viewport_p->mYOrig != 0.0f) {
viewport_crop.mXOrig = 0.5f * (viewport_p->mXOrig * 2.0f + viewport_p->mWidth) - 320.0f;
viewport_crop.mYOrig = 0.5f * (viewport_p->mYOrig * 2.0f + viewport_p->mHeight) - 240.0f;
viewport_crop.mWidth = 640.0f;
viewport_crop.mHeight = 480.0f;
viewport_crop.mNearZ = viewport_p->mNearZ;
viewport_crop.mFarZ = viewport_p->mFarZ;
viewport_crop.mScissor = viewport_p->mScissor;
viewport_p = &viewport_crop;
}
GXSetViewport(viewport_p->mXOrig, viewport_p->mYOrig, viewport_p->mWidth, viewport_p->mHeight, viewport_p->mNearZ, viewport_p->mFarZ);
GXSetScissor(viewport_p->mXOrig, viewport_p->mYOrig, viewport_p->mWidth, viewport_p->mHeight);
JPADrawInfo jpaDrawInfo(camera->mViewMtx, 45.0f, 1.218f);
jpaDrawInfo.setFovy(camera->mFovy);
jpaDrawInfo.setAspect(camera->mAspect);
#if VERSION > VERSION_DEMO
BOOL isTower9 = FALSE;
if (strcmp(dComIfGp_getStartStageName(), "GTower") == 0 && dComIfGp_getStartStageLayer() == 9)
isTower9 = TRUE;
#endif
dComIfGp_setCurrentWindow(window);
dComIfGp_setCurrentView(camera);
dComIfGp_setCurrentViewport(viewport_p);
GXSetProjection(camera->mProjMtx, GX_PERSPECTIVE);
PPCSync();
j3dSys.setViewMtx(camera->mViewMtx);
dKy_setLight();
dComIfGd_drawOpaListSky();
dComIfGd_drawXluListSky();
if (!dMenu_flag() && dPa_control_c::isStatus(0x01))
dComIfGp_particle_drawShipTail(&jpaDrawInfo);
GXSetClipMode(GX_CLIP_ENABLE);
dComIfGd_drawOpaListBG();
dComIfGd_drawShadow(camera->mViewMtx);
dComIfGd_drawAlphaModel(camera->mViewMtx);
drawAlphaBuffer(camera, dComIfGd_getAlphaModelColor());
if (dComIfGd_getLightModelNum() != 0) {
#if VERSION == VERSION_DEMO
clearAlphaBuffer(camera);
#else
clearAlphaBuffer(camera, 0);
#endif
dComIfGd_drawLightModel(camera->mViewMtx);
drawAlphaBuffer(camera, dComIfGd_getLightModelColor());
}
if (!mDoGph_gInf_c::isMonotone()) {
dComIfGd_drawOpaListP0();
dComIfGd_drawOpaListP1();
}
dComIfGd_drawOpaList();
dComIfGd_drawXluListBG();
if (dComIfGd_getSpotModelNum() != 0)
#if VERSION == VERSION_DEMO
clearAlphaBuffer(camera);
#else
clearAlphaBuffer(camera, dComIfGd_getSpotModelColor().a);
#endif
if (!dMenu_flag() && !dPa_control_c::isStatus(0x01))
dComIfGp_particle_drawShipTail(&jpaDrawInfo);
if (!mDoGph_gInf_c::isMonotone())
dComIfGd_drawXluListP1();
dComIfGd_drawXluList();
if (!dMenu_flag()) {
dComIfGp_particle_draw(&jpaDrawInfo);
if (!mDoGph_gInf_c::isMonotone())
dComIfGp_particle_drawP1(&jpaDrawInfo);
JPADrawInfo windDrawInfo(dPa_control_c::getWindViewMatrix(), 45.0f, 1.218f);
windDrawInfo.setFovy(camera->mFovy);
windDrawInfo.setAspect(camera->mAspect);
dComIfGp_particle_drawWind(&windDrawInfo);
dComIfGp_particle_drawToon(&jpaDrawInfo);
if (!mDoGph_gInf_c::isMonotone())
dComIfGp_particle_drawToonP1(&jpaDrawInfo);
GXSetClipMode(GX_CLIP_ENABLE);
}
dComIfGd_drawOpaListFilter();
#if VERSION > VERSION_DEMO
j3dSys.reinitGX();
GXSetNumIndStages(0);
#endif
if (dComIfGd_getSpotModelNum() != 0) {
dComIfGd_drawAlphaModel(camera->mViewMtx);
dComIfGd_drawSpotModel(camera->mViewMtx);
drawSpot(camera);
}
#if VERSION == VERSION_DEMO
j3dSys.reinitGX();
#endif
GXSetClipMode(GX_CLIP_ENABLE);
dComIfGd_drawOpaListMaskOff();
dComIfGd_drawXluListMaskOff();
if (!dMenu_flag()) {
motionBlure(camera);
drawDepth(camera, viewport_p, dComIfGp_getCamZoomForcus(cameraID));
dComIfGp_particle_drawProjection(&jpaDrawInfo);
GXSetClipMode(GX_CLIP_ENABLE);
dComIfGd_drawOpaListInvisible();
dComIfGd_drawXluListInvisible();
#if VERSION > VERSION_DEMO
j3dSys.reinitGX();
GXSetNumIndStages(0);
if (isTower9)
dComIfGp_particle_draw(&jpaDrawInfo);
#endif
if (mDoGph_gInf_c::isMonotone()) {
#if VERSION == VERSION_DEMO
clearAlphaBuffer(camera);
#else
clearAlphaBuffer(camera, 0);
#endif
dComIfGd_drawOpaListP0();
dComIfGd_drawOpaListP1();
dComIfGd_drawXluListP1();
dComIfGp_particle_drawP1(&jpaDrawInfo);
dComIfGp_particle_drawToonP1(&jpaDrawInfo);
}
#if VERSION == VERSION_DEMO
if (mCaptureStep == 1) {
mDoGph_screenCapture();
}
#endif
#if VERSION > VERSION_DEMO
mDoGph_gInf_c::calcFade();
if (mCaptureStep == 1) {
if (!mCaptureCansel)
mDoGph_screenCapture();
else
mCaptureStep = 0;
}
#endif
}
}
}
if (mCaptureStep == 3) {
#if VERSION > VERSION_DEMO
if (mCaptureCansel) {
if (mCaptureCaptureBuffer != NULL) {
JKRFreeToHeap(NULL, mCaptureCaptureBuffer);
mCaptureCaptureBuffer = NULL;
}
if (mCaptureTextureBuffer != NULL) {
JKRFreeToHeap(NULL, mCaptureTextureBuffer);
mCaptureTextureBuffer = NULL;
}
mCaptureStep = 0;
} else
#endif
{
if (mCaptureTextureFormat == GX_TF_CMPR) {
#if VERSION == VERSION_DEMO
mCaptureThreadStackHead = (u8*)JKRAlloc(mCaptureThreadStackSize, 0x20);
#else
mCaptureThreadStackHead = mDoGph_allocFromAny(mCaptureThreadStackSize, 0x20);
#endif
if (mCaptureThreadStackHead == NULL) {
mCaptureProc(NULL);
#if VERSION > VERSION_DEMO
if (mCaptureCaptureBuffer != NULL)
#endif
{
JKRFreeToHeap(NULL, mCaptureCaptureBuffer);
mCaptureCaptureBuffer = NULL;
}
mCaptureStep = 5;
} else {
u8* captureThreadStackBase = mCaptureThreadStackHead + mCaptureThreadStackSize;
OSCreateThread(&mCaptureThread, (void*)mCaptureProc, NULL, captureThreadStackBase, mCaptureThreadStackSize, mCaptureThreadPriority, 0);
OSResumeThread(&mCaptureThread);
mCaptureStep++;
}
} else {
mCaptureCaptureBuffer = NULL;
mCaptureStep = 5;
}
}
}
if (mCaptureStep == 4) {
#if VERSION > VERSION_DEMO
if (mCaptureCansel) {
OSCancelThread(&mCaptureThread);
}
#endif
if (OSIsThreadTerminated(&mCaptureThread)) {
#if VERSION > VERSION_DEMO
if (mCaptureCaptureBuffer != NULL)
#endif
{
JKRFreeToHeap(NULL, mCaptureCaptureBuffer);
mCaptureCaptureBuffer = NULL;
}
#if VERSION > VERSION_DEMO
if (mCaptureThreadStackHead != NULL)
#endif
{
JKRFreeToHeap(NULL, mCaptureThreadStackHead);
mCaptureThreadStackHead = NULL;
}
void *exitVal;
OSJoinThread(&mCaptureThread, &exitVal);
mCaptureStep++;
} else {
OSAlarm alarm;
#if VERSION == VERSION_DEMO
OSCreateAlarm(&alarm);
OSInitThreadQueue(&mCaptureThreadQueue);
OSSetAlarm(&alarm, OSMillisecondsToTicks(3), mCaptureAlarmHandler);
#else
u64 tickNum = OSMillisecondsToTicks(10);
OSCreateAlarm(&alarm);
OSInitThreadQueue(&mCaptureThreadQueue);
OSSetAlarm(&alarm, tickNum, mCaptureAlarmHandler);
#endif
OSSleepThread(&mCaptureThreadQueue);
OSCancelAlarm(&alarm);
}
}
if ((mCaptureStep == 3 || mCaptureStep == 4 || mCaptureStep == 5) && mCaptureDraw != 0
#if VERSION > VERSION_DEMO
&& !mCaptureCansel
#endif
) {
mDoGph_screenCaptureDraw();
}
#if VERSION > VERSION_DEMO
if (mCaptureStep == 5 && mCaptureCansel) {
mCaptureStep = 6;
}
#endif
if (mCaptureStep == 6) {
#if VERSION > VERSION_DEMO
if (mCaptureTextureBuffer != NULL)
#endif
{
JKRFreeToHeap(NULL, mCaptureTextureBuffer);
mCaptureTextureBuffer = NULL;
}
mCaptureStep = 0;
#if VERSION > VERSION_DEMO
mCaptureCansel = false;
#endif
}
dDlst_list_c::calcWipe();
j3dSys.reinitGX();
#if VERSION > VERSION_DEMO
GXSetNumIndStages(0);
#endif
graf.setOrtho(JGeometry::TBox2<f32>(-9.0f, -21.0f, 650.0f, 503.0f), 100000.0f, -100000.0f);
graf.setPort();
Mtx viewMtx;
mDoMtx_trans(viewMtx, 320.0f, 240.0f, 0.0f);
JPADrawInfo jpaDrawInfo2D(viewMtx, 45.0f, 1.218f);
jpaDrawInfo2D.setFovy(0.0f);
jpaDrawInfo2D.setAspect(4.0f/3.0f);
if (!dMenu_flag())
dComIfGp_particle_draw2Dback(&jpaDrawInfo2D);
dComIfGp_particle_draw2DmenuBack(&jpaDrawInfo2D);
if (dComIfGd_getList2D()->getEntryPacket(0) != NULL) {
Mtx viewMtx;
mDoMtx_copy(j3dSys.getViewMtx(), viewMtx);
setLight();
mDoMtx_stack_c::transS(320.0f, 240.0f, 1000.0f);
mDoMtx_stack_c::ZrotM(-0x8000);
j3dSys.setViewMtx(mDoMtx_stack_c::get());
dComIfGd_drawOpaList2D();
j3dSys.reinitGX();
#if VERSION > VERSION_DEMO
GXSetNumIndStages(0);
#endif
j3dSys.setViewMtx(viewMtx);
}
dComIfGd_draw2DOpa();
dComIfGd_draw2DOpaTop();
dComIfGd_draw2DXlu();
if (!dMenu_flag())
dComIfGp_particle_draw2Dfore(&jpaDrawInfo2D);
dComIfGp_particle_draw2DmenuFore(&jpaDrawInfo2D);
mDoGph_gInf_c::endRender();
return true;
}
/* 8000BC94-8000BD08 .text mDoGph_Create__Fv */
bool mDoGph_Create() {
#if VERSION > VERSION_DEMO
JKRSolidHeap * solidHeap = mDoExt_createSolidHeapToCurrent(0, NULL, 0);
#endif
mDoGph_gInf_c::create();
dComIfGd_init();
#if VERSION > VERSION_DEMO
mDoExt_adjustSolidHeap(solidHeap);
mDoExt_restoreCurrentHeap();
JFWAutoAbortGfx = mDoMain::developmentMode ? 0x02 : 0x01;
#endif
return true;
}