diff options
| author | robojumper <robojumper@gmail.com> | 2024-09-12 22:36:34 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-12 16:36:34 -0400 |
| commit | 1180e1f4860d62bccd64bfa2a29eaeebd2c4b019 (patch) | |
| tree | ce6e231ef46aacbdad52ad7f6cbcd9d02dba555e /src/m/m3d/m_bmdl.cpp | |
| parent | e2c4bb7be7fa731a335bce4bc22283d899133e39 (diff) | |
m3d (#13)
* Initial M3d Pass
* `m_bmdl` and `m_bline` left
---------
Co-authored-by: elijah-thomas774 <elijahthomas774@gmail.com>
Co-authored-by: Elijah Thomas <42302100+elijah-thomas774@users.noreply.github.com>
Diffstat (limited to 'src/m/m3d/m_bmdl.cpp')
| -rw-r--r-- | src/m/m3d/m_bmdl.cpp | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/src/m/m3d/m_bmdl.cpp b/src/m/m3d/m_bmdl.cpp new file mode 100644 index 00000000..c565fb5b --- /dev/null +++ b/src/m/m3d/m_bmdl.cpp @@ -0,0 +1,228 @@ +#include <m/m3d/m3d.h> +#include <m/m3d/m_bmdl.h> +#include <nw4r/g3d/g3d_scnmdl.h> + +namespace m3d { + +bmdl_c::~bmdl_c() { + remove(); +} + +int bmdl_c::getType() const { + return SCN_LEAF_MODEL; +} + +int bmdl_c::getMatID(const char *name) const { + return m3d::getMatID(getResMdl(), name); +} + +int bmdl_c::getNodeID(const char *name) const { + return m3d::getNodeID(getResMdl(), name); +} + +bool bmdl_c::getNodeWorldMtx(u32 p1, nw4r::math::MTX34 *out) const { + return nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdlSimple>(mpScnLeaf)->GetScnMtxPos(out, + nw4r::g3d::ScnObj::MTX_TYPE_WORLD, p1); +} + +bool bmdl_c::getNodeWorldMtxMultVecZero(u32 p1, nw4r::math::VEC3 &out) const { + nw4r::math::MTX34 mtx; + if (!getNodeWorldMtx(p1, &mtx)) { + return false; + } else { + out.x = mtx[0][3]; + out.y = mtx[1][3]; + out.z = mtx[2][3]; + return true; + } +} + +bool bmdl_c::getNodeWorldMtxMultVec(u32 p1, nw4r::math::VEC3 &in, nw4r::math::VEC3 &out) const { + nw4r::math::MTX34 mtx; + if (!getNodeWorldMtx(p1, &mtx)) { + return false; + } else { + PSMTXMultVec(mtx, in, out); + return true; + } +} + +void bmdl_c::setAnm(banm_c &anm) { + nw4r::g3d::ScnMdlSimple *mdl; + if (anm.getType() == nw4r::g3d::ScnMdlSimple::ANMOBJTYPE_SHP) { + mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + mdl->SetAnmObj(anm.getAnimObj(), nw4r::g3d::ScnMdlSimple::ANMOBJTYPE_NOT_SPECIFIED); + } else { + mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdlSimple>(mpScnLeaf); + if (anm.getType() == nw4r::g3d::ScnMdlSimple::ANMOBJTYPE_CHR) { + mpCurrentAnm = &anm; + } + mdl->SetAnmObj(anm.getAnimObj(), nw4r::g3d::ScnMdlSimple::ANMOBJTYPE_NOT_SPECIFIED); + } +} + +void bmdl_c::play() { + if (mpCurrentAnm != nullptr) { + mpCurrentAnm->play(); + } +} + +nw4r::g3d::ResMdl bmdl_c::getResMdl() const { + return nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdlSimple>(mpScnLeaf)->GetResMdl(); +} + +nw4r::g3d::ResMat bmdl_c::getResMat(u32 index) const { + nw4r::g3d::ResMdl mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdlSimple>(mpScnLeaf)->GetResMdl(); + return mdl.GetResMat(index); +} + +void bmdl_c::removeAnm(nw4r::g3d::ScnMdlSimple::AnmObjType type) { + nw4r::g3d::ScnMdlSimple *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdlSimple>(mpScnLeaf); + if (type == nw4r::g3d::ScnMdlSimple::ANMOBJTYPE_CHR) { + mpCurrentAnm = nullptr; + } + mdl->RemoveAnmObj(type); +} + +nw4r::g3d::AnmObj *bmdl_c::getAnmObj(nw4r::g3d::ScnMdlSimple::AnmObjType type) const { + nw4r::g3d::ScnMdlSimple *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdlSimple>(mpScnLeaf); + return mdl->GetAnmObj(type); +} + +void bmdl_c::setTevColor(u32 idx, GXTevRegID tevId, GXColor color, bool bMarkDirty) { + nw4r::g3d::ScnMdl *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + + if (mdl) { + nw4r::g3d::ScnMdl::CopiedMatAccess matAccess(mdl, idx); + nw4r::g3d::ResMatTevColor resMatTevClr = matAccess.GetResMatTevColor(bMarkDirty); + resMatTevClr.GXSetTevColor(tevId, color); + resMatTevClr.DCStore(false); + } else { + nw4r::g3d::ResMatTevColor resMatTevClr = getResMat(idx).GetResMatTevColor(); + resMatTevClr.GXSetTevColor(tevId, color); + resMatTevClr.DCStore(false); + } +} + +void bmdl_c::setTevColorAll(GXTevRegID tevId, GXColor color, bool bMarkDirty) { + nw4r::g3d::ResMdl resMdl = getResMdl(); + nw4r::g3d::ScnMdl *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + if (mdl) { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ScnMdl::CopiedMatAccess matAccess(mdl, i); + nw4r::g3d::ResMatTevColor resMatTevClr = matAccess.GetResMatTevColor(bMarkDirty); + resMatTevClr.GXSetTevColor(tevId, color); + resMatTevClr.DCStore(false); + } + } else { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ResMatTevColor resMatTevClr = resMdl.GetResMat(i).GetResMatTevColor(); + resMatTevClr.GXSetTevColor(tevId, color); + resMatTevClr.DCStore(false); + } + } +} + +void bmdl_c::setTevKColor(u32 idx, GXTevKColorID tevKId, GXColor color, bool bMarkDirty) { + nw4r::g3d::ScnMdl *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + + if (mdl) { + nw4r::g3d::ScnMdl::CopiedMatAccess matAccess(mdl, idx); + nw4r::g3d::ResMatTevColor resMatTevClr = matAccess.GetResMatTevColor(bMarkDirty); + resMatTevClr.GXSetTevKColor(tevKId, color); + resMatTevClr.DCStore(false); + } else { + nw4r::g3d::ResMatTevColor resMatTevClr = getResMat(idx).GetResMatTevColor(); + resMatTevClr.GXSetTevKColor(tevKId, color); + resMatTevClr.DCStore(false); + } +} + +void bmdl_c::setTevKColorAll(GXTevKColorID tevKId, GXColor color, bool bMarkDirty) { + nw4r::g3d::ResMdl resMdl = getResMdl(); + nw4r::g3d::ScnMdl *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + if (mdl) { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ScnMdl::CopiedMatAccess matAccess(mdl, i); + nw4r::g3d::ResMatTevColor resMatTevClr = matAccess.GetResMatTevColor(bMarkDirty); + resMatTevClr.GXSetTevKColor(tevKId, color); + resMatTevClr.DCStore(false); + } + } else { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ResMatTevColor resMatTevClr = resMdl.GetResMat(i).GetResMatTevColor(); + resMatTevClr.GXSetTevKColor(tevKId, color); + resMatTevClr.DCStore(false); + } + } +} + +void bmdl_c::setBlendModeAll(GXBlendMode blendMode, GXBlendFactor srcFactor, GXBlendFactor dstFactor, GXLogicOp op, + bool bMarkDirty) { + nw4r::g3d::ResMdl resMdl = getResMdl(); + nw4r::g3d::ScnMdl *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + if (mdl) { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ScnMdl::CopiedMatAccess matAccess(mdl, i); + nw4r::g3d::ResMatPix resMatPix = matAccess.GetResMatPix(bMarkDirty); + resMatPix.GXSetBlendMode(blendMode, srcFactor, dstFactor, op); + resMatPix.DCStore(false); + } + } else { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ResMatPix resMatPix = resMdl.GetResMat(i).GetResMatPix(); + resMatPix.GXSetBlendMode(blendMode, srcFactor, dstFactor, op); + resMatPix.DCStore(false); + } + } +} + +void bmdl_c::setCullMode(u32 matId, GXCullMode cullMode, bool bMarkDirty) { + nw4r::g3d::ScnMdl *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + if (mdl) { + nw4r::g3d::ScnMdl::CopiedMatAccess matAccess(mdl, matId); + nw4r::g3d::ResGenMode resGenMode = matAccess.GetResGenMode(bMarkDirty); + resGenMode.GXSetCullMode(cullMode); + } else { + nw4r::g3d::ResGenMode resGenMode = getResMat(matId).GetResGenMode(); + resGenMode.GXSetCullMode(cullMode); + } +} + +void bmdl_c::setCullModeAll(GXCullMode cullMode, bool bMarkDirty) { + // TODO Extra stack allocation? + nw4r::g3d::ResMdl resMdl = getResMdl(); + nw4r::g3d::ScnMdl *mdl = nw4r::g3d::G3dObj::DynamicCast<nw4r::g3d::ScnMdl>(mpScnLeaf); + if (mdl) { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ScnMdl::CopiedMatAccess matAccess(mdl, i); + nw4r::g3d::ResGenMode resGenMode = matAccess.GetResGenMode(bMarkDirty); + resGenMode.GXSetCullMode(cullMode); + } + } else { + for (u32 i = 0; i < resMdl.GetResMatNumEntries(); i++) { + nw4r::g3d::ResMat resMat = getResMat(i); + nw4r::g3d::ResGenMode resGenMode = resMat.GetResGenMode(); + resGenMode.GXSetCullMode(cullMode); + } + } +} + +void bmdl_c::setMatVisible(u32 matId, bool bVisble) { + // TODO +} + +int bmdl_c::setMatTexture(char *name, GXTexObj *texObj, bool copy, void *unk, int, int) { + // TODO +} + +bool bmdl_c::getBounds(mVec3_c *min, mVec3_c *max) { + // TODO +} + +void bmdl_c::remove() { + mpCurrentAnm = nullptr; + scnLeaf_c::remove(); +} + +} // namespace m3d |
