summaryrefslogtreecommitdiff
path: root/3dlib/treeki3d.h
blob: 93a9c3e59ecebd43fd131fdaefb383e7322d6bbe (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* Treeki's 3D Library for Wii */

#ifndef TREEKI3D_H
#define TREEKI3D_H

/*******************************************************************************
* IMPORTS/ENGINE HOOKS
*******************************************************************************/

#define GEKKO

#include <common.h>
#include "rvl/mtx.h"
#include "rvl/GXEnum.h"
#include "rvl/GXStruct.h"
#include "rvl/GXTransform.h"
#include "rvl/GXGeometry.h"
#include "rvl/GXDispList.h"
#include "rvl/GXLighting.h"
#include "rvl/GXTev.h"
#include "rvl/GXTexture.h"
#include "rvl/GXCull.h"
#include "rvl/GXPixel.h"
#include "rvl/GXBump.h"
#include "rvl/OSCache.h"
#include "rvl/tpl.h"
#include "rvl/vifuncs.h"
#include "rvl/arc.h"

GXRenderModeObj *Hook_GetGXRenderModeObj();



namespace T3D {

/*******************************************************************************
* RESOURCE STRUCTS
*******************************************************************************/

struct tmdl_headerv2 {
	u32 magic;				// always TMDL
	u32 version;			// currently 2
	u32 shape_count;
};

struct tmdl_header {
	u32 magic;				// always TMDL
	u32 version;			// currently 3
	u32 shape_count;
	u32 material_count;
};

// todo: remove this
extern int tmdl_header_sizes[];
// [[Followed by an array of u32s for each shape offset, then material structs]]

struct tmdl_shape {
	u32 dl_offset;			// must be aligned to 0x20
	u32 dl_size;			// must be aligned to 0x20
	u32 mat_offset;
	u32 pos_arr_offset;		// must be aligned to 0x20
	u32 pos_arr_size;		// must be aligned to 0x20
	u32 nrm_arr_offset;		// must be aligned to 0x20
	u32 nrm_arr_size;		// must be aligned to 0x20
	u32 uv_arr_offset;		// must be aligned to 0x20
	u32 uv_arr_size;		// must be aligned to 0x20
};

struct tmdl_materialv2 {
	u32 texture_id;
	GXColor mat_colour;
};

struct tmdl_material {
	char texture_name[28];
	GXColor mat_colour;
	GXTexObj texobj;		// handled when binding. size: 8 bytes
};

/*******************************************************************************
* INTERNAL STRUCTS
*******************************************************************************/

class Model; // don't you just love circular references

struct RenderInfo {
	Model *model;
	Mtx matrix;
};

struct CameraInfo {
	GXProjectionType projection;
	Mtx44 projection_matrix;
	Mtx view_matrix;
};

/*******************************************************************************
* PUBLIC CLASSES
*******************************************************************************/

class Model {
private:
	tmdl_header *model_res;
	TPLPalette *texture_res; // here for v2 support
	
	void setupMaterialGXv2(tmdl_materialv2 *material);
	void setupMaterialGX(tmdl_material *material);
	void drawShape(RenderInfo *info, int shape_id);
	
public:
	bool bind(void *data, const char *mdlname);
	void addToDrawList(Mtx matrix);
	void draw(RenderInfo *info);
	
};

/*******************************************************************************
* CONVENIENT STUFF
*******************************************************************************/

extern const GXColor Black, White;

/*******************************************************************************
* GLOBAL T3D VARIABLES/FUNCTIONS
*******************************************************************************/

#define OBJ_COUNT 60

extern u32 HasBeenInited;
extern RenderInfo *RenderQueue;
extern int RenderQueuePos;

extern CameraInfo Camera;

bool Init(bool test);
void DrawQueue();

namespace util {
	//void RotateToFace(const Vec &O, const Vec &P, const Vec &U, Mtx out);
};

};

#endif