summaryrefslogtreecommitdiff
path: root/src/wm_map.cpp
blob: 83ed6378cf4e32687ffc5e26b0e7aa07e4df97aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#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();
}