diff options
Diffstat (limited to 'src/JSystem/J2DGraph/J2DGrafContext.cpp')
| -rw-r--r-- | src/JSystem/J2DGraph/J2DGrafContext.cpp | 205 |
1 files changed, 158 insertions, 47 deletions
diff --git a/src/JSystem/J2DGraph/J2DGrafContext.cpp b/src/JSystem/J2DGraph/J2DGrafContext.cpp index 30c9f17d..4ddfb3b7 100644 --- a/src/JSystem/J2DGraph/J2DGrafContext.cpp +++ b/src/JSystem/J2DGraph/J2DGrafContext.cpp @@ -4,84 +4,195 @@ // #include "JSystem/J2DGraph/J2DGrafContext.h" +#include "dolphin/gx/GX.h" #include "dolphin/types.h" /* 802CD050-802CD0FC .text __ct__14J2DGrafContextFffff */ -J2DGrafContext::J2DGrafContext(float, float, float, float) { - /* Nonmatching */ +J2DGrafContext::J2DGrafContext(f32 x, f32 y, f32 width, f32 height) + : mBounds(x, y, x + width, y + height), mScissorBounds(x, y, x + width, y + height) { + JUtility::TColor color(-1); + setColor(color); + setLineWidth(6); } /* 802CD0FC-802CD16C .text setPort__14J2DGrafContextFv */ void J2DGrafContext::setPort() { - /* Nonmatching */ + setScissor(); + setup2D(); + + JGeometry::TBox2<f32> bounds(mBounds); + + GXSetViewport(bounds.i.x, bounds.i.y, bounds.getWidth(), bounds.getHeight(), 0.0f, 1.875f); +} + +static inline void GXSetTexCoordGen(GXTexCoordID dst, GXTexGenType type, GXTexGenSrc src, u32 mtx) { + GXSetTexCoordGen2(dst, type, src, mtx, GX_FALSE, GX_PTIDENTITY); } /* 802CD16C-802CD340 .text setup2D__14J2DGrafContextFv */ void J2DGrafContext::setup2D() { - /* Nonmatching */ + GXSetNumIndStages(0); + for (int i = 0; i < GX_TEVSTAGE8; i++) { + GXSetTevDirect((GXTevStageID)i); + } + GXSetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); + GXSetZMode(GX_FALSE, GX_LEQUAL, GX_FALSE); + GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + GXSetNumChans(1); + GXSetNumTevStages(1); + GXSetNumTexGens(0); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetCullMode(GX_CULL_NONE); + GXLoadPosMtxImm(mPosMtx, 0); + Mtx mtx; + MTXIdentity(mtx); + GXLoadTexMtxImm(mtx, GX_IDENTITY, GX_MTX3x4); + GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_NONE, + GX_AF_NONE); + GXSetChanCtrl(GX_COLOR1A1, GX_FALSE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT_NULL, GX_DF_NONE, + GX_AF_NONE); + GXSetCurrentMtx(0); + GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_RGBA4, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_CLR_RGBA, GX_RGBX8, 0xf); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_CLR_RGBA, GX_RGBX8, 0xf); + GXSetLineWidth(mLineWidth, GX_TO_ZERO); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT); + GXSetVtxDesc(GX_VA_TEX0, GX_NONE); } /* 802CD340-802CD590 .text setScissor__14J2DGrafContextFv */ void J2DGrafContext::setScissor() { - /* Nonmatching */ + JGeometry::TBox2<f32> bounds(0, 0, 1024, 1024); + JGeometry::TBox2<f32> curBounds(mScissorBounds); + mScissorBounds.intersect(bounds); + curBounds.absolute(); + if (curBounds.intersect(bounds)) { + GXSetScissor(curBounds.i.x, curBounds.i.y, curBounds.getWidth(), curBounds.getHeight()); + } else { + GXSetScissor(0, 0, 0, 0); + } } /* 802CD590-802CD5B4 .text scissor__14J2DGrafContextFRCQ29JGeometry8TBox2<f> */ -void J2DGrafContext::scissor(const JGeometry::TBox2<float>&) { - /* Nonmatching */ +void J2DGrafContext::scissor(const JGeometry::TBox2<f32>& bounds) { + mScissorBounds = bounds; } /* 802CD5B4-802CD5F8 .text place__14J2DGrafContextFRCQ29JGeometry8TBox2<f> */ -void J2DGrafContext::place(const JGeometry::TBox2<float>&) { - /* Nonmatching */ -} - -/* 802CD5F8-802CD714 .text setColor__14J2DGrafContextFQ28JUtility6TColorQ28JUtility6TColorQ28JUtility6TColorQ28JUtility6TColor */ -void J2DGrafContext::setColor(JUtility::TColor, JUtility::TColor, JUtility::TColor, JUtility::TColor) { - /* Nonmatching */ +void J2DGrafContext::place(const JGeometry::TBox2<f32>& bounds) { + mBounds = bounds; + mScissorBounds = bounds; +} + +/* 802CD5F8-802CD714 .text + * setColor__14J2DGrafContextFQ28JUtility6TColorQ28JUtility6TColorQ28JUtility6TColorQ28JUtility6TColor + */ +void J2DGrafContext::setColor(JUtility::TColor colorTL, JUtility::TColor colorTR, + JUtility::TColor colorBR, JUtility::TColor colorBL) { + mColorTL = colorTL; + mColorTR = colorTR; + mColorBR = colorBR; + mColorBL = colorBL; + field_0xb0.mType = GX_BM_BLEND; + field_0xb0.mSrcFactor = GX_BL_SRC_ALPHA; + field_0xb0.mDstFactor = GX_BL_INV_SRC_ALPHA; + mLinePart.mType = GX_BM_BLEND; + mLinePart.mSrcFactor = GX_BL_SRC_ALPHA; + mLinePart.mDstFactor = GX_BL_INV_SRC_ALPHA; + mBoxPart.mType = GX_BM_BLEND; + mBoxPart.mSrcFactor = GX_BL_SRC_ALPHA; + mBoxPart.mDstFactor = GX_BL_INV_SRC_ALPHA; + if ((mColorTL & 0xFF) != 0xFF) { + return; + } + field_0xb0.mType = GX_BM_NONE; + field_0xb0.mSrcFactor = GX_BL_ONE; + field_0xb0.mDstFactor = GX_BL_ZERO; + if ((mColorBR & 0xFF) != 0xFF) { + return; + } + mLinePart.mType = GX_BM_NONE; + mLinePart.mSrcFactor = GX_BL_ONE; + mLinePart.mDstFactor = GX_BL_ZERO; + if ((mColorTR & 0xFF) != 0xFF) { + return; + } + if ((mColorBL & 0xFF) != 0xFF) { + return; + } + mBoxPart.mType = GX_BM_NONE; + mBoxPart.mSrcFactor = GX_BL_ONE; + mBoxPart.mDstFactor = GX_BL_ZERO; } /* 802CD714-802CD740 .text setLineWidth__14J2DGrafContextFUc */ -void J2DGrafContext::setLineWidth(unsigned char) { - /* Nonmatching */ +void J2DGrafContext::setLineWidth(u8 lineWidth) { + mLineWidth = lineWidth; + GXSetLineWidth(mLineWidth, GX_TO_ZERO); } /* 802CD740-802CD858 .text fillBox__14J2DGrafContextFRCQ29JGeometry8TBox2<f> */ -void J2DGrafContext::fillBox(const JGeometry::TBox2<float>&) { - /* Nonmatching */ +void J2DGrafContext::fillBox(const JGeometry::TBox2<f32>& box) { + GXSetBlendMode((GXBlendMode)mBoxPart.mType, (GXBlendFactor)mBoxPart.mSrcFactor, + (GXBlendFactor)mBoxPart.mDstFactor, GX_LO_SET); + GXLoadPosMtxImm(mPosMtx, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition3f32(box.i.x, box.i.y, 0); + GXColor1u32(mColorTL); + GXPosition3f32(box.f.x, box.i.y, 0); + GXColor1u32(mColorTR); + GXPosition3f32(box.f.x, box.f.y, 0); + GXColor1u32(mColorBL); + GXPosition3f32(box.i.x, box.f.y, 0); + GXColor1u32(mColorBR); + i_GXEnd(); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_RGBA4, 0); } /* 802CD858-802CD990 .text drawFrame__14J2DGrafContextFRCQ29JGeometry8TBox2<f> */ -void J2DGrafContext::drawFrame(const JGeometry::TBox2<float>&) { - /* Nonmatching */ -} - -/* 802CD990-802CDA6C .text line__14J2DGrafContextFQ29JGeometry8TVec2<f>Q29JGeometry8TVec2<f> */ -void J2DGrafContext::line(JGeometry::TVec2<float>, JGeometry::TVec2<float>) { - /* Nonmatching */ +void J2DGrafContext::drawFrame(const JGeometry::TBox2<f32>& box) { + GXSetBlendMode((GXBlendMode)mBoxPart.mType, (GXBlendFactor)mBoxPart.mSrcFactor, + (GXBlendFactor)mBoxPart.mDstFactor, GX_LO_SET); + GXLoadPosMtxImm(mPosMtx, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXBegin(GX_LINESTRIP, GX_VTXFMT0, 5); + GXPosition3f32(box.i.x, box.i.y, 0); + GXColor1u32(mColorTL); + GXPosition3f32(box.f.x, box.i.y, 0); + GXColor1u32(mColorTR); + GXPosition3f32(box.f.x, box.f.y, 0); + GXColor1u32(mColorBL); + GXPosition3f32(box.i.x, box.f.y, 0); + GXColor1u32(mColorBR); + GXPosition3f32(box.i.x, box.i.y, 0); + GXColor1u32(mColorTL); + i_GXEnd(); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_RGBA4, 0); +} + +/* 802CD990-802CDA6C .text line__14J2DGrafContextFQ29JGeometry8TVec2<f>Q29JGeometry8TVec2<f> + */ +void J2DGrafContext::line(JGeometry::TVec2<f32> start, JGeometry::TVec2<f32> end) { + GXSetBlendMode((GXBlendMode)mLinePart.mType, (GXBlendFactor)mLinePart.mSrcFactor, + (GXBlendFactor)mLinePart.mDstFactor, GX_LO_SET); + GXLoadPosMtxImm(mPosMtx, 0); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_F32, 0); + GXBegin(GX_LINES, GX_VTXFMT0, 2); + GXPosition3f32(start.x, start.y, 0); + GXColor1u32(mColorTL); + GXPosition3f32(end.x, end.y, 0); + GXColor1u32(mColorBR); + i_GXEnd(); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_CLR_RGBA, GX_RGBA4, 0); } /* 802CDA6C-802CDADC .text lineTo__14J2DGrafContextFQ29JGeometry8TVec2<f> */ -void J2DGrafContext::lineTo(JGeometry::TVec2<float>) { - /* Nonmatching */ -} - -/* 802CDADC-802CDB24 .text __dt__14J2DGrafContextFv */ -J2DGrafContext::~J2DGrafContext() { - /* Nonmatching */ -} - -/* 802CDB24-802CDB6C .text place__14J2DGrafContextFffff */ -void J2DGrafContext::place(float, float, float, float) { - /* Nonmatching */ -} - -/* 802CDB6C-802CDB74 .text getGrafType__14J2DGrafContextCFv */ -void J2DGrafContext::getGrafType() const { - /* Nonmatching */ -} - -/* 802CDB74-802CDB78 .text setLookat__14J2DGrafContextFv */ -void J2DGrafContext::setLookat() { - /* Nonmatching */ +void J2DGrafContext::lineTo(JGeometry::TVec2<f32> pos) { + this->line(mPrevPos, pos); + mPrevPos = pos; } |
