#include "worldmap.h" #include #include #include #include #include #include #include #include #include #include void dPathTest_c::drawOpa() { GXClearVtxDesc(); GXSetVtxDesc(GX_VA_POS, GX_DIRECT); GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); m3d::DisableIndirectTexturing(); GXSetNumChans(0); GXSetNumTexGens(1); GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_NRM, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY); GXSetNumTevStages(0); GXSetTevSwapModeTable(GX_TEV_SWAP0, GX_CH_RED, GX_CH_GREEN, GX_CH_BLUE, GX_CH_ALPHA); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_TEXC, GX_CC_ZERO); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C1, GX_CC_C0, GX_CC_C0, 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_A0, GX_CA_TEXA, GX_CA_ZERO); GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_A0, GX_CA_A1, GX_CA_ZERO); GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); //GXSetTevOp(GX_TEVSTAGE0, GX_PASSCLR); GXSetZCompLoc(0); GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_SET); GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); GXSetAlphaCompare(GX_GREATER, 0, GX_AOP_OR, GX_GREATER, 0); GXSetFog(GX_FOG_NONE, 0.0f, 0.0f, 0.0f, 0.0f, (GXColor){0,0,0,0}); GXSetFogRangeAdj(0, 0, 0); GXSetCullMode(GX_CULL_NONE); GXSetDither(GX_TRUE); GXSetTevColor(GX_TEVREG0, (GXColor){128,128,128,128}); GXSetTevColor(GX_TEVREG1, (GXColor){128,128,128,128}); nw4r::g3d::Camera cam(GetCameraByID(GetCurrentCameraID())); Mtx camMtx; cam.GetCameraMtx(&camMtx); //MTXInverse(camMtx, camMtx); Mtx viewMatrix; getViewMatrix(&viewMatrix); //camMtx[0][3] = 0.0f; //camMtx[1][3] = 0.0f; //camMtx[2][3] = 0.0f; //MTXConcat(viewMatrix, camMtx, viewMatrix); GXLoadPosMtxImm(camMtx, GX_PNMTX0); GXSetCurrentMtx(GX_PNMTX0); GXBegin(GX_QUADS, GX_VTXFMT0, 4); GXPosition3f32(-400, 0, -400); GXTexCoord2f32(0, 0); GXPosition3f32(400, 0, -400); GXTexCoord2f32(1, 0); GXPosition3f32(400, 0, 400); GXTexCoord2f32(1, 1); GXPosition3f32(-400, 0, 400); GXTexCoord2f32(0, 1); GXEnd(); } void dPathTest_c::drawXlu() { } dWMMap_c *dWMMap_c::instance = 0; dWMMap_c *dWMMap_c::build() { OSReport("Creating WM_Map\n"); void *buffer = AllocFromGameHeap1(sizeof(dWMMap_c)); dWMMap_c *c = new(buffer) dWMMap_c; OSReport("Created WM_Map @ %p\n", c); instance = c; return c; } int dWMMap_c::onCreate() { SpammyReport("dWMMap_c::onCreate() called\n"); // Get the resource void *scnRes = dScNewerWorldMap_c::instance->resMng['SCN0']; if (scnRes == 0) { OSReport("Oops, couldn't get SCN0, try again later\n"); return false; } data = (WMSceneDataHeader*)scnRes; SpammyReport("Loaded resource: %d nodes\n", data->nodeCount); // load up all the nodes, and fix up all the name offsets while we're at it SpammyReport("Allocating node array\n"); nodes = new WMSceneNode[data->nodeCount]; // link the mHeapAllocator so it can be used for models SpammyReport("Linking allocator\n"); allocator.link(-1, GameHeaps[0], 0, 0x20); for (int i = 0; i < data->nodeCount; i++) { WMSceneNode *node = &nodes[i]; WMSceneDataNode *nodeData = &data->nodes[i]; nodeData->modelName = (const char*)((u32)data + (u32)nodeData->modelName); node->loadFrom(nodeData, &allocator); } SpammyReport("Making path test\n"); pathTest.setup(&allocator); SpammyReport("Unlinking allocator\n"); allocator.unlink(); SpammyReport("dWMMap_c::onCreate() completed\n"); return true; } int dWMMap_c::onDelete() { delete[] nodes; pathTest.free(); return true; } int dWMMap_c::onExecute() { return true; } int dWMMap_c::onDraw() { SpammyReport("dWMMap_c::onDraw() called\n"); for (int i = 0; i < data->nodeCount; i++) { SpammyReport("Drawing node %d\n", i); nodes[i].draw(); } pathTest.scheduleForDrawing(); SpammyReport("dWMMap_c::onDraw() completed\n"); return true; } /* SCENE NODES */ void WMSceneNode::loadFrom(WMSceneDataNode *data, mHeapAllocator_c *allocator) { MapReport("Loading node: %c%c%c%c [%c%c%c%c:%s]\n", data->nodeKey>>24,data->nodeKey>>16,data->nodeKey>>8,data->nodeKey, data->brresKey>>24,data->brresKey>>16,data->brresKey>>8,data->brresKey, data->modelName); baseData = data; void *brres = dScNewerWorldMap_c::instance->resMng[data->brresKey]; nw4r::g3d::ResFile resfile(brres); void *mdl = resfile.GetResMdl(data->modelName); MapReport("Obtained ResMdl: %p\n", mdl); MapReport(model.setup(&mdl, allocator, 0, 1, 0) ? "Success\n" : "Fail\n"); // todo: more types SpammyReport("Setting up lightmaps\n"); if (data->lmType == 0) SetupTextures_Map(&model, 1); else if (data->lmType == 1) SetupTextures_MapObj(&model, 1); SpammyReport("Lightmaps done\n"); model.setDrawMatrix(data->matrix); SpammyReport("Node is ready\n"); } void WMSceneNode::draw() { //model.scheduleForDrawing(); }