diff options
Diffstat (limited to '')
-rw-r--r-- | src/poweruphax.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/poweruphax.cpp b/src/poweruphax.cpp index 787e88f..91481af 100644 --- a/src/poweruphax.cpp +++ b/src/poweruphax.cpp @@ -1,5 +1,6 @@ #include <common.h> #include <game.h> +#include <g3dhax.h> void ThwompHammer(dEn_c *thwomp, ActivePhysics *apThis, ActivePhysics *apOther) { @@ -19,3 +20,67 @@ void BooHammer(dEn_c *boo, ActivePhysics *apThis, ActivePhysics *apOther) { void UrchinHammer(dEn_c *urchin, ActivePhysics *apThis, ActivePhysics *apOther) { return; } + + +#include "poweruphax.h" + +void SetCullModeForMaterial(m3d::mdl_c *model, int materialID, GXCullMode mode); + + +dHammerSuitRenderer_c *dHammerSuitRenderer_c::build() { + return new dHammerSuitRenderer_c; +} + +dHammerSuitRenderer_c::dHammerSuitRenderer_c() { } +dHammerSuitRenderer_c::~dHammerSuitRenderer_c() { } + +void dHammerSuitRenderer_c::setup(dPlayerModelHandler_c *handler) { + victim = (dPlayerModel_c*)handler->mdlClass; + + allocator.link(-1, GameHeaps[0], 0, 0x20); + + nw4r::g3d::ResFile rf(getResource("hammerM", "g3d/suit.brres")); + + helmet.setup(rf.GetResMdl("helmet"), &allocator, 0, 1, 0); + SetupTextures_MapObj(&helmet, 0); + + shell.setup(rf.GetResMdl("shell"), &allocator, 0, 1, 0); + SetupTextures_MapObj(&shell, 0); + + allocator.unlink(); + + + victimModel = &victim->models[0].body; + nw4r::g3d::ResMdl *playerResMdl = + (nw4r::g3d::ResMdl*)(((u32)victimModel->scnObj) + 0xE8); + + //headNodeID = playerResMdl->GetResNode("player_head").GetID(); + headNodeID = playerResMdl->GetResNode("face_1").GetID(); + rootNodeID = playerResMdl->GetResNode("skl_root").GetID(); +} + +void dHammerSuitRenderer_c::draw() { + if (victim->powerup_id != 7) + return; + + // Materials: 2=hair 3=hat; Modes: BACK=visible ALL=invisible + SetCullModeForMaterial(&victim->getCurrentModel()->head, 3, GX_CULL_ALL); + + Mtx headMtx; + victimModel->getMatrixForNode(headNodeID, headMtx); + + helmet.setDrawMatrix(headMtx); + helmet.setScale(1.0f, 1.0f, 1.0f); + helmet.calcWorld(false); + + Mtx rootMtx; + victimModel->getMatrixForNode(rootNodeID, rootMtx); + + shell.setDrawMatrix(rootMtx); + shell.setScale(1.0f, 1.0f, 1.0f); + shell.calcWorld(false); + + helmet.scheduleForDrawing(); + shell.scheduleForDrawing(); +} + |