Torch
Loading...
Searching...
No Matches
GeoCommand.h
1#pragma once
2
3#include "endianness.h"
4#include "n64/CommandMacros.h"
5#include <string>
6#include <spdlog/spdlog.h>
7#include <spdlog/fmt/ostr.h>
8#include <lib/binarytools/BinaryWriter.h>
9#include <types/Vec3D.h>
10
11enum class GeoOpcode {
12 BranchAndLink,
13 End,
14 Branch,
15 Return,
16 OpenNode,
17 CloseNode,
18 AssignAsView,
19 UpdateNodeFlags,
20 NodeRoot,
21 NodeOrthoProjection,
22 NodePerspective,
23 NodeStart,
24 NodeMasterList,
25 NodeLevelOfDetail,
26 NodeSwitchCase,
27 NodeCamera,
28 NodeTranslationRotation,
29 NodeTranslation,
30 NodeRotation,
31 NodeAnimatedPart,
32 NodeBillboard,
33 NodeDisplayList,
34 NodeShadow,
35 NodeObjectParent,
36 NodeAsm,
37 NodeBackground,
38 NOP,
39 CopyView,
40 NodeHeldObj,
41 NodeScale,
42 NOP2,
43 NOP3,
44 NodeCullingRadius,
45};
46
47inline std::ostream& operator<<(std::ostream& out, const GeoOpcode& opcode) {
48 std::string output;
49 switch (opcode) {
50 case GeoOpcode::BranchAndLink:
51 output = "GEO_BRANCH_AND_LINK";
52 break;
53 case GeoOpcode::End:
54 output = "GEO_END";
55 break;
56 case GeoOpcode::Branch:
57 output = "GEO_BRANCH";
58 break;
59 case GeoOpcode::Return:
60 output = "GEO_RETURN";
61 break;
62 case GeoOpcode::OpenNode:
63 output = "GEO_OPEN_NODE";
64 break;
65 case GeoOpcode::CloseNode:
66 output = "GEO_CLOSE_NODE";
67 break;
68 case GeoOpcode::AssignAsView:
69 output = "GEO_ASSIGN_AS_VIEW";
70 break;
71 case GeoOpcode::UpdateNodeFlags:
72 output = "GEO_UPDATE_NODE_FLAGS";
73 break;
74 case GeoOpcode::NodeRoot:
75 output = "GEO_NODE_SCREEN_AREA";
76 break;
77 case GeoOpcode::NodeOrthoProjection:
78 output = "GEO_NODE_ORTHO";
79 break;
80 case GeoOpcode::NodePerspective:
81 output = "GEO_CAMERA_FRUSTUM";
82 break;
83 case GeoOpcode::NodeStart:
84 output = "GEO_NODE_START";
85 break;
86 case GeoOpcode::NodeMasterList:
87 output = "GEO_ZBUFFER";
88 break;
89 case GeoOpcode::NodeLevelOfDetail:
90 output = "GEO_RENDER_RANGE";
91 break;
92 case GeoOpcode::NodeSwitchCase:
93 output = "GEO_SWITCH_CASE";
94 break;
95 case GeoOpcode::NodeCamera:
96 output = "GEO_CAMERA";
97 break;
98 case GeoOpcode::NodeTranslationRotation:
99 output = "GEO_TRANSLATE_ROTATE";
100 break;
101 case GeoOpcode::NodeTranslation:
102 output = "GEO_TRANSLATE";
103 break;
104 case GeoOpcode::NodeRotation:
105 output = "GEO_ROTATE";
106 break;
107 case GeoOpcode::NodeAnimatedPart:
108 output = "GEO_ANIMATED_PART";
109 break;
110 case GeoOpcode::NodeBillboard:
111 output = "GEO_BILLBOARD";
112 break;
113 case GeoOpcode::NodeDisplayList:
114 output = "GEO_DISPLAY_LIST";
115 break;
116 case GeoOpcode::NodeShadow:
117 output = "GEO_SHADOW";
118 break;
119 case GeoOpcode::NodeObjectParent:
120 output = "GEO_RENDER_OBJ";
121 break;
122 case GeoOpcode::NodeAsm:
123 output = "GEO_ASM";
124 break;
125 case GeoOpcode::NodeBackground:
126 output = "GEO_BACKGROUND";
127 break;
128 case GeoOpcode::NOP:
129 output = "GEO_NOP_1A";
130 break;
131 case GeoOpcode::CopyView:
132 output = "GEO_COPY_VIEW";
133 break;
134 case GeoOpcode::NodeHeldObj:
135 output = "GEO_HELD_OBJECT";
136 break;
137 case GeoOpcode::NodeScale:
138 output = "GEO_SCALE";
139 break;
140 case GeoOpcode::NOP2:
141 output = "GEO_NOP_1E";
142 break;
143 case GeoOpcode::NOP3:
144 output = "GEO_NOP_1F";
145 break;
146 case GeoOpcode::NodeCullingRadius:
147 output = "GEO_CULLING_RADIUS";
148 break;
149 default:
150 throw std::runtime_error("Unknown Opcode");
151 }
152
153 return out << output;
154}
155
156#define cur_geo_cmd_u8(offset) \
157 (cmd[CMD_PROCESS_OFFSET(offset)])
158
159#define cur_geo_cmd_s16(offset) \
160 (int16_t)BSWAP16((*(int16_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
161
162#define cur_geo_cmd_s32(offset) \
163 (s32)BSWAP32((*(s32 *) &cmd[CMD_PROCESS_OFFSET(offset)]))
164
165#define cur_geo_cmd_u32(offset) \
166 (uint32_t) BSWAP32((*(uint32_t *) &cmd[CMD_PROCESS_OFFSET(offset)]))
167
169public:
170 virtual void Print(std::ostream& out) = 0;
171 virtual void Write(LUS::BinaryWriter& write) = 0;
172};
Definition GeoCommand.h:168