Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/UFO/UFO_Decoration.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: UFO_Decoration Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectUFO_Decoration *UFO_Decoration;
11
12
void UFO_Decoration_Update(void)
13
{
14
RSDK_THIS(UFO_Decoration);
15
16
if (RSDK.CheckOnScreen(self, NULL)) {
17
self->scale.x += (self->size - self->scale.x) >> 3;
18
self->active = ACTIVE_NORMAL;
19
}
20
else {
21
self->scale.x = 0x000;
22
self->active = ACTIVE_BOUNDS;
23
}
24
25
if (self->type > UFO_DECOR_PILLAR2)
26
RSDK.ProcessAnimation(&self->animator);
27
}
28
29
void UFO_Decoration_LateUpdate(void)
30
{
31
RSDK_THIS(UFO_Decoration);
32
33
int32 x = self->position.x;
34
int32 y = self->height;
35
int32 z = self->position.y;
36
37
Matrix *m = &UFO_Camera->matWorld;
38
39
self->zdepth = m->values[2][1] * (y >> 16) + m->values[2][2] * (z >> 16) + m->values[2][0] * (x >> 16) + m->values[2][3];
40
41
if (self->zdepth >= 0x4000) {
42
int32 depth = (int32)((m->values[0][3] << 8) + (m->values[0][2] * (z >> 8) & 0xFFFFFF00) + (m->values[0][0] * (x >> 8) & 0xFFFFFF00)
43
+ (m->values[0][1] * (y >> 8) & 0xFFFFFF00))
44
/ self->zdepth;
45
self->visible = abs(depth) < 0x100;
46
}
47
}
48
49
void UFO_Decoration_StaticUpdate(void) {}
50
51
void UFO_Decoration_Draw(void)
52
{
53
RSDK_THIS(UFO_Decoration);
54
55
if (self->zdepth >= 0x4000) {
56
RSDK.Prepare3DScene(UFO_Decoration->sceneIndex);
57
58
RSDK.MatrixScaleXYZ(&self->matTransform, self->scale.x, self->size, self->scale.x);
59
RSDK.MatrixTranslateXYZ(&self->matTransform, self->position.x, self->height, self->position.y, 0);
60
61
RSDK.MatrixRotateY(&self->matNormal, self->angle);
62
RSDK.MatrixMultiply(&self->matWorld, &self->matNormal, &self->matTransform);
63
RSDK.MatrixMultiply(&self->matWorld, &self->matWorld, &UFO_Camera->matWorld);
64
65
if (UFO_Camera->isSS7)
66
RSDK.MatrixMultiply(&self->matNormal, &self->matNormal, &UFO_Camera->matTemp);
67
else
68
RSDK.MatrixMultiply(&self->matNormal, &self->matNormal, &UFO_Camera->matView);
69
70
if (self->type <= UFO_DECOR_PILLAR2)
71
RSDK.AddModelTo3DScene(UFO_Decoration->modelIndices[self->type], UFO_Decoration->sceneIndex, UFO_Decoration->drawType, &self->matWorld,
72
&self->matNormal, 0xFFFFFF);
73
else
74
RSDK.AddMeshFrameTo3DScene(UFO_Decoration->modelIndices[self->type], UFO_Decoration->sceneIndex, &self->animator,
75
UFO_Decoration->drawType, &self->matWorld, &self->matNormal, 0xFFFFFF);
76
77
RSDK.Draw3DScene(UFO_Decoration->sceneIndex);
78
}
79
}
80
81
void UFO_Decoration_Create(void *data)
82
{
83
RSDK_THIS(UFO_Decoration);
84
85
if (!SceneInfo->inEditor) {
86
if (!self->size)
87
self->size = 0x400;
88
89
self->visible = true;
90
self->drawGroup = 4;
91
self->active = ACTIVE_BOUNDS;
92
self->updateRange.x = 0x4000000;
93
self->updateRange.y = 0x4000000;
94
95
if (self->type == UFO_DECOR_BIRD)
96
self->height = 0x600000;
97
98
RSDK.SetModelAnimation(UFO_Decoration->modelIndices[self->type], &self->animator, 96, 0, true, 0);
99
}
100
}
101
102
void UFO_Decoration_StageLoad(void)
103
{
104
UFO_Decoration->modelIndices[UFO_DECOR_TREE] = RSDK.LoadMesh("Decoration/Tree.bin", SCOPE_STAGE);
105
UFO_Decoration->modelIndices[UFO_DECOR_FLOWER1] = RSDK.LoadMesh("Decoration/Flower1.bin", SCOPE_STAGE);
106
UFO_Decoration->modelIndices[UFO_DECOR_FLOWER2] = RSDK.LoadMesh("Decoration/Flower2.bin", SCOPE_STAGE);
107
UFO_Decoration->modelIndices[UFO_DECOR_FLOWER3] = RSDK.LoadMesh("Decoration/Flower3.bin", SCOPE_STAGE);
108
UFO_Decoration->modelIndices[UFO_DECOR_PILLAR1] = RSDK.LoadMesh("Decoration/Pillar1.bin", SCOPE_STAGE);
109
UFO_Decoration->modelIndices[UFO_DECOR_PILLAR2] = RSDK.LoadMesh("Decoration/Pillar2.bin", SCOPE_STAGE);
110
UFO_Decoration->modelIndices[UFO_DECOR_BIRD] = RSDK.LoadMesh("Decoration/Bird.bin", SCOPE_STAGE);
111
UFO_Decoration->modelIndices[UFO_DECOR_FISH] = RSDK.LoadMesh("Decoration/Fish.bin", SCOPE_STAGE);
112
113
UFO_Decoration->sceneIndex = RSDK.Create3DScene("View:Special", 4096, SCOPE_STAGE);
114
115
UFO_Decoration->drawType = S3D_SOLIDCOLOR_SHADED_BLENDED_SCREEN;
116
}
117
118
#if GAME_INCLUDE_EDITOR
119
void UFO_Decoration_EditorDraw(void) {}
120
121
void UFO_Decoration_EditorLoad(void)
122
{
123
124
RSDK_ACTIVE_VAR(UFO_Decoration, type);
125
RSDK_ENUM_VAR("Tree", UFO_DECOR_TREE);
126
RSDK_ENUM_VAR("Flower 1", UFO_DECOR_FLOWER1);
127
RSDK_ENUM_VAR("Flower 2", UFO_DECOR_FLOWER2);
128
RSDK_ENUM_VAR("Flower 3", UFO_DECOR_FLOWER3);
129
RSDK_ENUM_VAR("Pillar 1", UFO_DECOR_PILLAR1);
130
RSDK_ENUM_VAR("Pillar 2", UFO_DECOR_PILLAR2);
131
RSDK_ENUM_VAR("Bird", UFO_DECOR_BIRD);
132
RSDK_ENUM_VAR("Fish", UFO_DECOR_FISH);
133
}
134
#endif
135
136
void UFO_Decoration_Serialize(void)
137
{
138
RSDK_EDITABLE_VAR(UFO_Decoration, VAR_ENUM, type);
139
RSDK_EDITABLE_VAR(UFO_Decoration, VAR_ENUM, angle);
140
RSDK_EDITABLE_VAR(UFO_Decoration, VAR_ENUM, size);
141
}
142
143