#include "worldmap.h" 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() { // 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; // load up all the nodes, and fix up all the name offsets while we're at it nodes = new WMSceneNode[data->nodeCount]; // link the mHeapAllocator so it can be used for models 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); } allocator.unlink(); return true; } int dWMMap_c::onDelete() { delete[] nodes; return true; } int dWMMap_c::onExecute() { return true; } int dWMMap_c::onDraw() { for (int i = 0; i < data->nodeCount; i++) { nodes[i].draw(); } 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 if (data->lmType == 0) SetupTextures_Map(&model, 1); else if (data->lmType == 1) SetupTextures_MapObj(&model, 1); model.setDrawMatrix(data->matrix); } void WMSceneNode::draw() { model.scheduleForDrawing(); }