Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/engine/graph_node_manager.c
7857 views
1
#include <PR/ultratypes.h>
2
3
#include "types.h"
4
5
#include "graph_node.h"
6
7
#if IS_64_BIT
8
static s16 next_s16_in_geo_script(s16 **src) {
9
s16 ret;
10
if (((uintptr_t)(*src) & 7) == 4) {
11
*src += 2; // skip 32 bits
12
}
13
ret = *(*src)++;
14
if (((uintptr_t)(*src) & 7) == 4) {
15
*src += 2; // skip 32 bits
16
}
17
return ret;
18
}
19
#else
20
#define next_s16_in_geo_script(src) (*(*src)++)
21
#endif
22
23
/**
24
* Takes a pointer to three shorts (supplied by a geo layout script) and
25
* copies it to the destination float vector.
26
*/
27
s16 *read_vec3s_to_vec3f(Vec3f dst, s16 *src) {
28
dst[0] = next_s16_in_geo_script(&src);
29
dst[1] = next_s16_in_geo_script(&src);
30
dst[2] = next_s16_in_geo_script(&src);
31
return src;
32
}
33
34
/**
35
* Takes a pointer to three shorts (supplied by a geo layout script) and
36
* copies it to the destination vector. It's essentially a memcpy but consistent
37
* with the other two 'geo-script vector to internal vector' functions.
38
*/
39
s16 *read_vec3s(Vec3s dst, s16 *src) {
40
dst[0] = next_s16_in_geo_script(&src);
41
dst[1] = next_s16_in_geo_script(&src);
42
dst[2] = next_s16_in_geo_script(&src);
43
return src;
44
}
45
46
/**
47
* Takes a pointer to three angles in degrees (supplied by a geo layout script)
48
* and converts it to a vector of three in-game angle units in [-32768, 32767]
49
* range.
50
*/
51
s16 *read_vec3s_angle(Vec3s dst, s16 *src) {
52
dst[0] = (next_s16_in_geo_script(&src) << 15) / 180;
53
dst[1] = (next_s16_in_geo_script(&src) << 15) / 180;
54
dst[2] = (next_s16_in_geo_script(&src) << 15) / 180;
55
return src;
56
}
57
58
/**
59
* Add the given graph node as a child to the current top of the gfx stack:
60
* 'gCurGraphNodeList'. This is called from geo_layout commands to add nodes
61
* to the scene graph.
62
*/
63
void register_scene_graph_node(struct GraphNode *graphNode) {
64
if (graphNode != NULL) {
65
gCurGraphNodeList[gCurGraphNodeIndex] = graphNode;
66
67
if (gCurGraphNodeIndex == 0) {
68
if (gCurRootGraphNode == NULL) {
69
gCurRootGraphNode = graphNode;
70
}
71
} else {
72
if (gCurGraphNodeList[gCurGraphNodeIndex - 1]->type == GRAPH_NODE_TYPE_OBJECT_PARENT) {
73
((struct GraphNodeObjectParent *) gCurGraphNodeList[gCurGraphNodeIndex - 1])
74
->sharedChild = graphNode;
75
} else {
76
geo_add_child(gCurGraphNodeList[gCurGraphNodeIndex - 1], graphNode);
77
}
78
}
79
}
80
}
81
82