diff --git a/include/JSystem/J2DGraph/J2DPane.h b/include/JSystem/J2DGraph/J2DPane.h index 654a80942..21a21d2ca 100644 --- a/include/JSystem/J2DGraph/J2DPane.h +++ b/include/JSystem/J2DGraph/J2DPane.h @@ -63,8 +63,8 @@ public: /* 0x04 */ u32 mMagic; /* 0x08 */ int mTag; /* 0x0C */ JGeometry::TBox2 mBounds; - /* 0x1C */ JGeometry::TBox2 mScreenPos; - /* 0x2C */ JGeometry::TBox2 mBox; + /* 0x1C */ JGeometry::TBox2 mScreenBounds; + /* 0x2C */ JGeometry::TBox2 mDrawBounds; /* 0x3C */ Mtx mMtx; /* 0x6C */ Mtx mDrawMtx; /* 0x9C */ cXy mBasePosition; @@ -75,7 +75,7 @@ public: /* 0xAB */ u8 mCullMode; /* 0xAC */ u8 mAlpha; /* 0xAD */ u8 mDrawAlpha; - /* 0xAE */ u8 field_0xae; + /* 0xAE */ u8 mInheritAlpha; /* 0xAF */ u8 field_0xaf; /* 0xB0 */ JSUTree mPaneTree; }; diff --git a/include/JSystem/J3DGraphBase/J3DGD.h b/include/JSystem/J3DGraphBase/J3DGD.h index 6047a4102..254aa8962 100644 --- a/include/JSystem/J3DGraphBase/J3DGD.h +++ b/include/JSystem/J3DGraphBase/J3DGD.h @@ -21,10 +21,10 @@ inline void J3DGDWrite_u32(u32 param) { } inline void J3DGDWriteXFCmd(u16 param_1, u32 param_2) { - J3DGDWrite_u8(0x10); - J3DGDWrite_u16(0); - J3DGDWrite_u16(param_1); - J3DGDWrite_u32(param_2); + J3DGDWrite_u8(0x10); + J3DGDWrite_u16(0); + J3DGDWrite_u16(param_1); + J3DGDWrite_u32(param_2); } void J3DGDSetGenMode(u8 texGenNum, u8 colorChanNum, u8 tevStageNum, u8 IndTexStageNum, _GXCullMode cullMode); diff --git a/src/JSystem/J2DGraph/J2DGrafContext.cpp b/src/JSystem/J2DGraph/J2DGrafContext.cpp index 35d67976f..129b1f50c 100644 --- a/src/JSystem/J2DGraph/J2DGrafContext.cpp +++ b/src/JSystem/J2DGraph/J2DGrafContext.cpp @@ -21,7 +21,6 @@ void J2DGrafContext::setPort() { setup2D(); JGeometry::TBox2 bounds(mBounds); - GXSetViewport(bounds.i.x, bounds.i.y, bounds.getWidth(), bounds.getHeight(), 0.0f, 1.875f); } @@ -66,11 +65,12 @@ void J2DGrafContext::setup2D() { /* 802CD340-802CD590 .text setScissor__14J2DGrafContextFv */ void J2DGrafContext::setScissor() { - JGeometry::TBox2 bounds(0, 0, 1024, 1000); + JGeometry::TBox2 maxBounds(0, 0, 1024, 1000); JGeometry::TBox2 curBounds(mScissorBounds); - mScissorBounds.intersect(bounds); + mScissorBounds.intersect(maxBounds); curBounds.absolute(); - if (curBounds.intersect(bounds)) { + curBounds.addPos(0.0f, -1.0f); + if (curBounds.intersect(maxBounds)) { GXSetScissor(curBounds.i.x, curBounds.i.y, curBounds.getWidth(), curBounds.getHeight()); } else { GXSetScissor(0, 0, 0, 0); diff --git a/src/JSystem/J2DGraph/J2DPane.cpp b/src/JSystem/J2DGraph/J2DPane.cpp index 66b9a60d9..4eccae0fd 100644 --- a/src/JSystem/J2DGraph/J2DPane.cpp +++ b/src/JSystem/J2DGraph/J2DPane.cpp @@ -4,8 +4,11 @@ // #include "JSystem/J2DGraph/J2DPane.h" +#include "JSystem/J2DGraph/J2DGrafContext.h" +#include "JSystem/J2DGraph/J2DOrthoGraph.h" #include "JSystem/JSupport/JSURandomInputStream.h" #include "dolphin/gx/GXEnum.h" +#include "dolphin/gx/GX.h" #include "dolphin/types.h" /* 802CF8F4-802CF984 .text __ct__7J2DPaneFv */ @@ -48,7 +51,7 @@ void J2DPane::initiate() { mRotation = 0.0f; mCullMode = 0; mAlpha = 0xFF; - field_0xae = 1; + mInheritAlpha = TRUE; mDrawAlpha = 0xFF; field_0xaf = 0; calcMtx(); @@ -68,8 +71,8 @@ J2DPane::J2DPane(J2DPane* pParentPane, JSURandomInputStream* pStream) : mPaneTre /* 802CFC00-802CFEF8 .text makePaneStream__7J2DPaneFP7J2DPaneP20JSURandomInputStream */ void J2DPane::makePaneStream(J2DPane* pParentPane, JSURandomInputStream* pStream) { - u8 unk; - pStream->read(&unk, 1); + u8 size; + pStream->read(&size, 1); pStream->read(&mVisible, 1); pStream->skip(2); mTag = pStream->read32b(); @@ -80,31 +83,31 @@ void J2DPane::makePaneStream(J2DPane* pParentPane, JSURandomInputStream* pStream f32 y1 = y0 + pStream->readS16(); mBounds.set(x0, y0, x1, y1); - unk -= 6; + size -= 6; mRotation = 0; - if (unk != 0) { + if (size != 0) { mRotation = pStream->readU16(); - unk--; + size--; } - if (unk != 0) { + if (size != 0) { setBasePosition((J2DBasePosition)pStream->readU8()); - unk--; + size--; } else { setBasePosition(J2DBasePosition_0); } mAlpha = 0xFF; - if (unk != 0) { + if (size != 0) { mAlpha = pStream->readU8(); - unk--; + size--; } - field_0xae = 1; - if (unk != 0) { - field_0xae = pStream->readU8() != 0; - unk--; + mInheritAlpha = TRUE; + if (size != 0) { + mInheritAlpha = pStream->readU8() != 0; + size--; } pStream->align(4); @@ -143,13 +146,67 @@ bool J2DPane::insertChild(J2DPane* pPrev, J2DPane* pChild) { } /* 802D0078-802D054C .text draw__7J2DPaneFffPC14J2DGrafContextb */ -void J2DPane::draw(float, float, const J2DGrafContext*, bool) { - /* Nonmatching */ +void J2DPane::draw(float x, float y, const J2DGrafContext* pCtx, bool clip) { + J2DGrafContext ctx = *pCtx; + + if (pCtx->getGrafType() != 1) + clip = false; + + JSUTree * pParent = mPaneTree.getParent(); + J2DPane * pParentPane = NULL; + if (pParent != NULL) + pParentPane = pParent->getObject(); + + if (mVisible && mBounds.isValid()) { + mScreenBounds = mBounds; + mDrawBounds = mBounds; + + if (pParentPane != NULL) { + mScreenBounds.addPos(pParentPane->mScreenBounds.i.x, pParentPane->mScreenBounds.i.y); + MTXConcat(pParentPane->mDrawMtx, mMtx, mDrawMtx); + + if (clip) { + mDrawBounds.addPos(pParentPane->mScreenBounds.i.x, pParentPane->mScreenBounds.i.y); + mDrawBounds.intersect(pParentPane->mDrawBounds); + mDrawAlpha = mAlpha; + + if (mInheritAlpha) + mDrawAlpha = (mAlpha * pParentPane->mDrawAlpha) / 0xFF; + } + } else { + mScreenBounds.addPos(x, y); + makeMatrix(mBounds.i.x + x, mBounds.i.y + y); + MTXCopy(mMtx, mDrawMtx); + mDrawBounds.set(mScreenBounds); + mDrawAlpha = mAlpha; + } + + JGeometry::TBox2 clipBounds( 0.0f, 0.0f, 0.0f, 0.0f ); + if (clip) + ((J2DOrthoGraph*)pCtx)->scissorBounds(&clipBounds, &mDrawBounds); + + if (mDrawBounds.isValid() || !clip) { + ctx.place(mScreenBounds); + if (clip) { + ctx.scissor(clipBounds); + ctx.setScissor(); + } + GXSetCullMode((GXCullMode)mCullMode); + drawSelf(x, y, &ctx.mPosMtx); + + for (JSUTreeIterator iter = mPaneTree.getFirstChild(); iter.getObject(); ++iter) + iter->draw(0.0f, 0.0f, pCtx, clip); + } + } } /* 802D054C-802D05C8 .text move__7J2DPaneFff */ -void J2DPane::move(float, float) { - /* Nonmatching */ +void J2DPane::move(float x, float y) { + JGeometry::TBox2 bounds; + f32 width = mBounds.getWidth(), height = mBounds.getHeight(); + bounds.set(x, y, x + width, y + height); + mBounds = bounds; + calcMtx(); } /* 802D05C8-802D0604 .text add__7J2DPaneFff */ @@ -160,9 +217,9 @@ void J2DPane::add(f32 px, f32 py) { /* 802D0604-802D0680 .text clip__7J2DPaneFRCQ29JGeometry8TBox2 */ void J2DPane::clip(const JGeometry::TBox2& bounds) { JGeometry::TBox2 boxA(bounds); - JGeometry::TBox2 boxB(mScreenPos); + JGeometry::TBox2 boxB(mScreenBounds); boxA.addPos(boxB.i); - mBox.intersect(boxA); + mDrawBounds.intersect(boxA); } /* 802D0680-802D0714 .text search__7J2DPaneFUl */ @@ -203,8 +260,7 @@ void J2DPane::setBasePosition(J2DBasePosition pos) { if (pos % 3 == 0) { mBasePosition.x = 0.0f; } else if (pos % 3 == 1) { - f32 width = mBounds.getWidth(); - mBasePosition.x = 0.5f * width; + mBasePosition.x = mBounds.getWidth() / 2.0f; } else { mBasePosition.x = mBounds.getWidth(); } @@ -212,8 +268,7 @@ void J2DPane::setBasePosition(J2DBasePosition pos) { if (pos / 3 == 0) { mBasePosition.y = 0.0f; } else if (pos / 3 == 1) { - f32 height = mBounds.getHeight(); - mBasePosition.y = height * 0.5f; + mBasePosition.y = mBounds.getHeight() / 2.0f; } else { mBasePosition.y = mBounds.getHeight(); }