Skip to content

Commit 3781706

Browse files
authored
Merge pull request #165 from CommitteeOfZero/renderer-transformation-refactor
Renderer transformation refactor
2 parents 916e57b + 27e9e62 commit 3781706

79 files changed

Lines changed: 2624 additions & 3080 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

profiles/common/scriptvars.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,11 @@ root.ScriptVars = {
7676
SW_MASK3ALPHA_OFS=2788,
7777
SW_BGEFF1_OFSX=2800,
7878
SW_BGEFF1_OFSY=2801,
79-
SW_BGEFF1_ALPHA_OFS=2806,
8079
SW_BGEFF1_SIZE_OFS=2802,
80+
SW_BGEFF1_ROTX_OFS=2803,
81+
SW_BGEFF1_ROTY_OFS=2804,
8182
SW_BGEFF1_ROTZ_OFS=2805,
83+
SW_BGEFF1_ALPHA_OFS=2806,
8284
SW_BGEFF1_MASK_VERTEX1_OFSX=2809,
8385
SW_BGEFF1_MASK_VERTEX1_OFSY=2810,
8486
SW_MAINTHDP=3304,
@@ -347,6 +349,8 @@ root.ScriptVars = {
347349
SW_BGEFF1_MASK_TYPE=6612,
348350
SW_BGEFF1_FADECT=6613,
349351
SW_BGEFF1_MODE=6614,
352+
SW_BGEFF1_ROTX=6615,
353+
SW_BGEFF1_ROTY=6616,
350354
SW_BGEFF1_ROTZ=6617,
351355
SW_BGEFF1_ALPHA=6618,
352356
SW_BGEFF1_MASKNO=6619,

src/background2d.cpp

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,13 @@ void Background2D::RenderBgEff(int bgId, int layer) {
169169
FadeCount = ScrWork[SW_BGEFF1_FADECT + structOffset];
170170
FadeRange = ScrWork[SW_BGEFF1_MASKFADERANGE + structOffset];
171171

172-
Angle = (ScrWork[SW_BGEFF1_ROTZ + structOffset] +
173-
ScrWork[SW_BGEFF1_ROTZ_OFS + structOfsOffset]) *
174-
(float)(2.0f * M_PI / (float)(1 << 16));
172+
Rotation = ScrWorkAnglesToQuaternion(
173+
ScrWork[SW_BGEFF1_ROTX + structOffset] +
174+
ScrWork[SW_BGEFF1_ROTX_OFS + structOfsOffset],
175+
ScrWork[SW_BGEFF1_ROTY + structOffset] +
176+
ScrWork[SW_BGEFF1_ROTY_OFS + structOfsOffset],
177+
ScrWork[SW_BGEFF1_ROTZ + structOffset] +
178+
ScrWork[SW_BGEFF1_ROTZ_OFS + structOfsOffset]);
175179

176180
Scale = glm::vec2((ScrWork[SW_BGEFF1_SIZE + structOffset] +
177181
ScrWork[SW_BGEFF1_SIZE_OFS + structOfsOffset]) /
@@ -222,6 +226,14 @@ void Background2D::RenderBgEff(int bgId, int layer) {
222226
Origin = {0.0f, 0.0f};
223227
for (const glm::vec2 vertex : vertices) Origin += vertex / (float)vertexCount;
224228

229+
// Transform vertices
230+
const glm::mat4 transformation = TransformationMatrix(
231+
Origin, Scale, {Origin, 0.0f}, Rotation, DisplayCoords);
232+
std::transform(vertices.begin(), vertices.end(), vertices.begin(),
233+
[transformation](const glm::vec2 vertex) {
234+
return transformation * glm::vec4(vertex, 0.0f, 1.0f);
235+
});
236+
225237
// Draw
226238
if (maskType == 0) { // Rectangle
227239
const glm::vec2 maskDimensions = vertices[3] - vertices[0];
@@ -241,43 +253,43 @@ void Background2D::RenderBgEff(int bgId, int layer) {
241253
}
242254

243255
void Background2D::RenderRegular() {
244-
Renderer->DrawSpriteOffset(BgSprite, DisplayCoords, Origin, Tint, Scale,
245-
Angle, false);
256+
const glm::mat4 transformation = TransformationMatrix(
257+
Origin, Scale, {Origin, 0.0f}, Rotation, DisplayCoords);
258+
Renderer->DrawSprite(BgSprite, transformation, Tint, false);
246259

247260
for (int i = 0; i < MaxLinkedBgBuffers; i++) {
248261
if (Links[i].Direction != LD_Off && Links[i].LinkedBuffer != NULL) {
249-
Renderer->DrawSpriteOffset(Links[i].LinkedBuffer->BgSprite,
250-
Links[i].DisplayCoords, Origin, Tint, Scale,
251-
Angle, false);
262+
const glm::mat4 linkTransformation =
263+
transformation *
264+
glm::translate(glm::mat4(1.0f), {Links[i].DisplayCoords, 0.0f});
265+
266+
Renderer->DrawSprite(Links[i].LinkedBuffer->BgSprite, transformation,
267+
Tint, false);
252268
}
253269
}
254270
}
255271

256272
void Background2D::RenderMasked() {
257-
Renderer->DrawMaskedSpriteOffset(BgSprite, Masks2D[MaskNumber].MaskSprite,
258-
DisplayCoords, Origin, FadeCount, FadeRange,
259-
Tint, Scale, Angle, false, false, false);
273+
const glm::mat4 transformation = TransformationMatrix(
274+
Origin, Scale, {Origin, 0.0f}, Rotation, DisplayCoords);
275+
276+
Renderer->DrawMaskedSprite(BgSprite, Masks2D[MaskNumber].MaskSprite,
277+
FadeCount, FadeRange, transformation, Tint, false,
278+
false);
260279
}
261280

262281
void Background2D::RenderMaskedInverted() {
263-
Renderer->DrawMaskedSpriteOffset(BgSprite, Masks2D[MaskNumber].MaskSprite,
264-
DisplayCoords, Origin, FadeCount, FadeRange,
265-
Tint, Scale, Angle, false, true, false);
282+
const glm::mat4 transformation = TransformationMatrix(
283+
Origin, Scale, {Origin, 0.0f}, Rotation, DisplayCoords);
284+
Renderer->DrawMaskedSprite(BgSprite, Masks2D[MaskNumber].MaskSprite,
285+
FadeCount, FadeRange, transformation, Tint, true,
286+
false);
266287
}
267288

268289
void Background2D::RenderFade() {
269290
Tint.a *= FadeCount / 256.0f;
270291

271-
Renderer->DrawSpriteOffset(BgSprite, DisplayCoords, Origin, Tint, Scale,
272-
Angle, false);
273-
274-
for (int i = 0; i < MaxLinkedBgBuffers; i++) {
275-
if (Links[i].Direction != LD_Off && Links[i].LinkedBuffer != NULL) {
276-
Renderer->DrawSpriteOffset(Links[i].LinkedBuffer->BgSprite,
277-
Links[i].DisplayCoords, Origin, Tint, Scale,
278-
Angle, false);
279-
}
280-
}
292+
RenderRegular();
281293
}
282294

283295
} // namespace Impacto

src/background2d.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Background2D : public Loadable<Background2D> {
3939
glm::vec2 DisplayCoords;
4040
glm::vec2 Origin = {0.0f, 0.0f};
4141
glm::vec2 Scale = {1.0f, 1.0f};
42-
float Angle = 0.0f;
42+
glm::quat Rotation = glm::quat();
4343
glm::vec4 Tint = glm::vec4(1.0f);
4444
int MaskNumber;
4545

src/character2d.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ bool Character2D::LoadSync(uint32_t charaId) {
3737
// Skip to state data
3838
stream->Seek(0x68, SEEK_CUR);
3939

40-
MvlVerticesCount = Io::ReadLE<int>(stream);
40+
int vertexCount = Io::ReadLE<int>(stream);
4141
int vertexOffset = Io::ReadLE<int>(stream);
4242

4343
for (int i = 0; i < stateCount; i++) {
@@ -79,8 +79,18 @@ bool Character2D::LoadSync(uint32_t charaId) {
7979
// They seem to use the whole vertex array in all states, so... read it once
8080
// and forget about it?
8181
stream->Seek(vertexOffset, SEEK_SET);
82-
MvlVertices.resize(MvlVerticesCount * 5);
83-
Io::ReadArrayLE<float>(MvlVertices.data(), stream, MvlVerticesCount * 5);
82+
std::vector<float> mvlVertexInfo(vertexCount * 5);
83+
Io::ReadArrayLE<float>(mvlVertexInfo.data(), stream, vertexCount * 5);
84+
85+
MvlVertices.resize(vertexCount);
86+
for (size_t i = 0; i < vertexCount; i++) {
87+
MvlVertices[i] = VertexBufferSprites{
88+
.Position = {mvlVertexInfo[i * 5], mvlVertexInfo[i * 5 + 1]},
89+
.UV = glm::vec2(mvlVertexInfo[i * 5 + 3], mvlVertexInfo[i * 5 + 4]),
90+
.Tint = Tint,
91+
};
92+
}
93+
8494
delete stream;
8595
} else {
8696
// LAY format
@@ -146,7 +156,7 @@ void Character2D::UnloadSync() {
146156
Show = false;
147157
std::fill(Layers.begin(), Layers.end(), -1);
148158
MvlVertices.clear();
149-
MvlIndicesCount = 0;
159+
MvlIndices.clear();
150160
States.clear();
151161
StatesToDraw.clear();
152162
}
@@ -165,7 +175,7 @@ void Character2D::MainThreadOnLoad() {
165175

166176
void Character2D::Update(float dt) {
167177
if (Profile::CharaIsMvl) {
168-
MvlIndicesCount = 0;
178+
MvlIndices.clear();
169179
StatesToDraw.clear();
170180
StatesToDraw.push_back((Face & 0xFFFF0000) >> 16); // face
171181
StatesToDraw.push_back(0x40000000 | ((Face & 0xFFFF0000) >> 8) |
@@ -178,9 +188,8 @@ void Character2D::Update(float dt) {
178188
Character2DState const& state = stateItr->second;
179189
auto& stateIndices =
180190
std::get_if<Character2DState::MVLData>(&state.Data)->Indices;
181-
std::copy(stateIndices.get(), stateIndices.get() + state.Count,
182-
MvlIndices.begin() + MvlIndicesCount);
183-
MvlIndicesCount += state.Count;
191+
MvlIndices.insert(MvlIndices.end(), stateIndices.get(),
192+
stateIndices.get() + state.Count);
184193
}
185194
}
186195
} else {
@@ -202,10 +211,10 @@ void Character2D::Render(int layer) {
202211
if (Status != LS_Loaded || !OnLayer(layer) || !Show) return;
203212

204213
if (Profile::CharaIsMvl) {
205-
Renderer->DrawCharacterMvl(CharaSprite, glm::vec2(OffsetX, OffsetY),
206-
MvlVerticesCount, MvlVertices.data(),
207-
MvlIndicesCount, MvlIndices.data(), false, Tint,
208-
glm::vec2(ScaleX, ScaleY));
214+
const glm::mat4 transformation = TransformationMatrix(
215+
{0.0f, 0.0f}, {ScaleX, ScaleY}, {0.0f, 0.0f}, 0.0f, {OffsetX, OffsetY});
216+
Renderer->DrawVertices(CharaSpriteSheet, MvlVertices, MvlIndices,
217+
transformation);
209218
} else {
210219
for (auto id : StatesToDraw) {
211220
if (auto stateItr = States.find(id); stateItr != States.end()) {

src/character2d.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ struct Character2DState {
4545
}
4646
};
4747

48-
int constexpr MaxMvlIndices = 128 * 1024;
49-
5048
class Character2D : public Loadable<Character2D> {
5149
friend class Loadable<Character2D>;
5250

@@ -86,10 +84,8 @@ class Character2D : public Loadable<Character2D> {
8684
ankerl::unordered_dense::map<int, Character2DState> States;
8785
std::vector<int> StatesToDraw;
8886

89-
int MvlVerticesCount;
90-
std::vector<float> MvlVertices;
91-
std::array<uint16_t, MaxMvlIndices> MvlIndices;
92-
int MvlIndicesCount;
87+
std::vector<VertexBufferSprites> MvlVertices;
88+
std::vector<uint16_t> MvlIndices;
9389
};
9490

9591
int constexpr MaxCharacters2D = 16;

src/game.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ static void RenderMain() {
370370
}
371371
glm::vec4 col = ScrWorkGetColor(SW_MASK1COLOR);
372372
col.a = glm::min(maskAlpha / 255.0f, 1.0f);
373-
Renderer->DrawRect(RectF(maskPosX, maskPosY, maskSizeX, maskSizeY),
373+
Renderer->DrawQuad(RectF(maskPosX, maskPosY, maskSizeX, maskSizeY),
374374
col);
375375
}
376376
}
@@ -522,7 +522,7 @@ void Render() {
522522
break;
523523
}
524524
case DrawComponentType::Mask: {
525-
Renderer->DrawRect(
525+
Renderer->DrawQuad(
526526
RectF(0.0f, 0.0f, Profile::DesignWidth, Profile::DesignHeight),
527527
glm::vec4(0.0f, 0.0f, 0.0f, (ScrWork[SW_RESTARTMASK] / 256.0f)));
528528
break;

src/games/cc/dialoguebox.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void DialogueBox::Render(DialoguePageMode mode, bool hasName, float nameWidth,
4141
}
4242
} else {
4343
glm::vec4 nvlBoxTint(0.0f, 0.0f, 0.0f, opacity * NVLBoxMaxOpacity);
44-
Renderer->DrawRect(RectF(0, 0, Profile::DesignWidth, Profile::DesignHeight),
44+
Renderer->DrawQuad(RectF(0, 0, Profile::DesignWidth, Profile::DesignHeight),
4545
nvlBoxTint);
4646
}
4747
}

src/games/cc/titlemenu.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ void TitleMenu::Render() {
252252
OverlaySprite,
253253
RectF(0.0f, 0.0f, Profile::DesignWidth, Profile::DesignHeight));
254254
DrawSmoke(SmokeOpacityNormal);
255-
Renderer->DrawRect(
255+
Renderer->DrawQuad(
256256
RectF(0.0f, 0.0f, Profile::DesignWidth, Profile::DesignHeight),
257257
glm::vec4(1.0f, 1.0f, 1.0f,
258258
1.0f - ScrWork[SW_TITLEDISPCT] / 60.0f));

0 commit comments

Comments
 (0)