Skip to content

Commit 6bad78f

Browse files
committed
[frontend] Boilerplate to make CLR0 nodes interactable
1 parent 9c7eb1e commit 6bad78f

File tree

10 files changed

+105
-19
lines changed

10 files changed

+105
-19
lines changed

source/frontend/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ add_library(lib_frontend
9393
"properties/gc/Material/AdvTexConv.cpp"
9494
"properties/gc/Material/Merge.cpp"
9595
"editors/BtkEditor.cpp"
96-
"legacy_editor/views/BmdBrresOutliner.cpp" "renderer/MouseHider.cpp" "editors/MkwDebug.cpp" "PresetHelper.cpp")
96+
"legacy_editor/views/BmdBrresOutliner.cpp" "renderer/MouseHider.cpp" "editors/MkwDebug.cpp" "PresetHelper.cpp" "properties/g3d/G3dUniformAnimView.cpp")
9797

9898

9999
add_executable(frontend

source/frontend/legacy_editor/views/BmdBrresOutliner.hpp

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -276,22 +276,17 @@ static inline std::vector<Node> CollectNodes(g3d::Collection* g3d,
276276
};
277277
result.push_back(n);
278278
}
279-
auto add_new_clr0 = [pG = g3d]() {
280-
auto& x = pG->clrs.emplace_back();
281-
x.name = "Untitled CLR0";
282-
};
283-
result.push_back(HeaderBarImpl("clr0", 1, g3d->clrs.size(), nullptr,
284-
add_new_clr0, nullptr));
285-
for (int i = 0; i < g3d->clrs.size(); ++i) {
286-
auto& tex = g3d->clrs[i];
279+
result.push_back(HeaderBar("clr0", 1, g3d->getAnim_Clrs().low, outliner));
280+
for (int i = 0; i < g3d->getAnim_Clrs().size(); ++i) {
281+
auto& clr = g3d->getAnim_Clrs()[i];
287282
Node n{
288283
.indent = 2,
289284
.rti = richtypes["clr0"],
290-
.icons_right = {},
291-
.draw_context_menu_fn = nullptr,
292-
.draw_modal_fn = nullptr,
293-
.public_name = tex.name,
294-
.obj = nullptr,
285+
.icons_right = GetNodeIcons(clr),
286+
.draw_context_menu_fn = CtxDraw(&clr),
287+
.draw_modal_fn = ModalDraw(&clr),
288+
.public_name = clr.name,
289+
.obj = &clr,
295290
.is_container = false,
296291
.is_rich = true,
297292
.display_id_relative_to_parent = static_cast<int>(i),

source/frontend/properties/BrresBmdPropEdit.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ struct BrresBmdPropEdit {
1212
riistudio::G3dTexViews mG3dTexView;
1313
riistudio::G3dVcViews mG3dVcView;
1414
riistudio::G3dSrtViews mG3dSrtView;
15+
riistudio::G3dUniformAnimViews mG3dUniformAnimView;
1516

1617
riistudio::J3dMdlViews mJ3dMdlView;
1718
riistudio::J3dMaterialViews mJ3dMatView;
@@ -68,6 +69,10 @@ struct BrresBmdPropEdit {
6869
if (j3tex != nullptr) {
6970
return Views_TabTitles(mG3dTexView);
7071
}
72+
auto* g3dclr = dynamic_cast<riistudio::g3d::CLR0*>(node);
73+
if (g3dclr != nullptr) {
74+
return Views_TabTitles(mG3dUniformAnimView);
75+
}
7176
return {};
7277
}
7378
void TabTitleFancy(kpi::IObject* node, int index) {
@@ -131,6 +136,11 @@ struct BrresBmdPropEdit {
131136
Views_TabTitleFancy(mG3dTexView, index);
132137
return;
133138
}
139+
auto* g3dclr = dynamic_cast<riistudio::g3d::CLR0*>(node);
140+
if (g3dclr != nullptr) {
141+
Views_TabTitleFancy(mG3dUniformAnimView, index);
142+
return;
143+
}
134144
ImGui::Text("???");
135145
}
136146
bool Tab(int index, std::function<void()> postUpdate,
@@ -246,6 +256,14 @@ struct BrresBmdPropEdit {
246256
handleUpdates();
247257
return ok;
248258
}
259+
auto* g3dclr = dynamic_cast<riistudio::g3d::CLR0*>(node);
260+
if (g3dclr != nullptr) {
261+
auto dl = kpi::MakeDelegate<riistudio::g3d::CLR0>(
262+
postUpdate, commit, g3dclr, selected, drawIcon);
263+
auto ok = Views_Tab(mG3dUniformAnimView, dl, index);
264+
handleUpdates();
265+
return ok;
266+
}
249267
return false;
250268
}
251269
};

source/frontend/properties/g3d/G3dMaterialViews.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <frontend/properties/g3d/G3dSrtView.hpp>
66
#include <frontend/properties/g3d/G3dUi.hpp>
7+
#include <frontend/properties/g3d/G3dUniformAnimView.hpp>
78
#include <frontend/properties/g3d/G3dVertexColorView.hpp>
89
#include <frontend/properties/gc/Bone/BoneDisplaySurface.hpp>
910
#include <frontend/properties/gc/Bone/BoneTransformSurface.hpp>
@@ -108,6 +109,10 @@ struct J3dMdlViews {
108109
riistudio::j3d::ui::ModelJ3DSurface ms;
109110
};
110111

112+
struct G3dUniformAnimViews {
113+
riistudio::g3d::G3dUniformAnimDataSurface data;
114+
};
115+
111116
// TODO:
112117
// [X] BoneJ3DSurface
113118
// [X] ShapeJ3DSurface
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "G3dUniformAnimView.hpp"
2+
#include <imcxx/Widgets.hpp>
3+
4+
namespace riistudio::g3d {
5+
6+
void drawProperty(kpi::PropertyDelegate<riistudio::g3d::CLR0>& dl,
7+
G3dUniformAnimDataSurface) {
8+
auto& anim = dl.getActive();
9+
10+
// Display the animation name
11+
if (ImGui::BeginTable("UniformAnimData", 2)) {
12+
ImGui::TableNextRow();
13+
ImGui::TableNextColumn();
14+
ImGui::Text("Name");
15+
ImGui::TableNextColumn();
16+
ImGui::Text("%s", anim.name.c_str());
17+
ImGui::EndTable();
18+
}
19+
}
20+
21+
} // namespace riistudio::g3d
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#pragma once
2+
3+
#include <LibBadUIFramework/Node2.hpp>
4+
#include <LibBadUIFramework/PropertyView.hpp>
5+
#include <imcxx/Widgets.hpp>
6+
#include <plugins/g3d/collection.hpp>
7+
#include <vendor/fa5/IconsFontAwesome5.h>
8+
#include <librii/g3d/io/AnimClrIO.hpp>
9+
10+
namespace riistudio::g3d {
11+
12+
struct G3dUniformAnimDataSurface {
13+
static inline const char* name() { return "Data"_j; }
14+
static inline const char* icon = (const char*)ICON_FA_COG;
15+
};
16+
17+
void drawProperty(kpi::PropertyDelegate<riistudio::g3d::CLR0>& dl,
18+
G3dUniformAnimDataSurface);
19+
20+
} // namespace riistudio::g3d

source/plugins/g3d/Node.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ class Model : public libcube::Model, public kpi::TDocData<riistudio::g3d::G3DMod
129129

130130
struct SceneData {
131131
std::vector<librii::g3d::ChrAnim> chrs;
132-
std::vector<librii::g3d::ClrAnim> clrs;
133132
std::vector<librii::g3d::PatAnim> pats;
134133
std::vector<librii::g3d::BinaryVis> viss;
135134
std::string path;
@@ -147,32 +146,38 @@ class Collection
147146
kpi::MutCollectionRange<Model> getModels() { return { &mModels }; }
148147
kpi::MutCollectionRange<Texture> getTextures() { return { &mTextures }; }
149148
kpi::MutCollectionRange<SRT0> getAnim_Srts() { return { &mAnim_Srts }; }
149+
kpi::MutCollectionRange<CLR0> getAnim_Clrs() { return { &mAnim_Clrs }; }
150150
kpi::ConstCollectionRange<Model> getModels() const { return { &mModels }; }
151151
kpi::ConstCollectionRange<Texture> getTextures() const { return { &mTextures }; }
152152
kpi::ConstCollectionRange<SRT0> getAnim_Srts() const { return { &mAnim_Srts }; }
153+
kpi::ConstCollectionRange<CLR0> getAnim_Clrs() const { return { &mAnim_Clrs }; }
153154

154155
librii::g3d::Archive toLibRii() const;
155156

156157
protected:
157158
kpi::ICollection* v_getModels() const { return const_cast<kpi::ICollection*>(static_cast<const kpi::ICollection*>(&mModels)); }
158159
kpi::ICollection* v_getTextures() const { return const_cast<kpi::ICollection*>(static_cast<const kpi::ICollection*>(&mTextures)); }
159160
kpi::ICollection* v_getAnim_Srts() const { return const_cast<kpi::ICollection*>(static_cast<const kpi::ICollection*>(&mAnim_Srts)); }
161+
kpi::ICollection* v_getAnim_Clrs() const { return const_cast<kpi::ICollection*>(static_cast<const kpi::ICollection*>(&mAnim_Clrs)); }
160162
void onRelocate() {
161163
mModels.onParentMoved(this);
162164
mTextures.onParentMoved(this);
163165
mAnim_Srts.onParentMoved(this);
166+
mAnim_Clrs.onParentMoved(this);
164167
}
165168
Collection(Collection&& rhs) {
166169
new (&mModels) decltype(mModels) (std::move(rhs.mModels));
167170
new (&mTextures) decltype(mTextures) (std::move(rhs.mTextures));
168171
new (&mAnim_Srts) decltype(mAnim_Srts) (std::move(rhs.mAnim_Srts));
172+
new (&mAnim_Clrs) decltype(mAnim_Clrs) (std::move(rhs.mAnim_Clrs));
169173

170174
onRelocate();
171175
}
172176
Collection(const Collection& rhs) {
173177
new (&mModels) decltype(mModels) (rhs.mModels);
174178
new (&mTextures) decltype(mTextures) (rhs.mTextures);
175179
new (&mAnim_Srts) decltype(mAnim_Srts) (rhs.mAnim_Srts);
180+
new (&mAnim_Clrs) decltype(mAnim_Clrs) (rhs.mAnim_Clrs);
176181

177182
onRelocate();
178183
}
@@ -191,19 +196,22 @@ class Collection
191196
kpi::CollectionImpl<Model> mModels{this};
192197
kpi::CollectionImpl<Texture> mTextures{this};
193198
kpi::CollectionImpl<SRT0> mAnim_Srts{this};
199+
kpi::CollectionImpl<CLR0> mAnim_Clrs{this};
194200

195201
public:
196202
struct _Memento : public kpi::IMemento {
197203
SceneData sd;
198204
kpi::ConstPersistentVec<Model> mModels;
199205
kpi::ConstPersistentVec<Texture> mTextures;
200206
kpi::ConstPersistentVec<SRT0> mAnim_Srts;
207+
kpi::ConstPersistentVec<CLR0> mAnim_Clrs;
201208
template<typename M> _Memento(const M& _new, const kpi::IMemento* last=nullptr) {
202209
const auto* old = last ? dynamic_cast<const _Memento*>(last) : nullptr;
203210
sd = static_cast<const SceneData&>(_new);
204211
kpi::nextFolder(this->mModels, _new.getModels(), old ? &old->mModels : nullptr);
205212
kpi::nextFolder(this->mTextures, _new.getTextures(), old ? &old->mTextures : nullptr);
206213
kpi::nextFolder(this->mAnim_Srts, _new.getAnim_Srts(), old ? &old->mAnim_Srts : nullptr);
214+
kpi::nextFolder(this->mAnim_Clrs, _new.getAnim_Clrs(), old ? &old->mAnim_Clrs : nullptr);
207215
}
208216
};
209217
std::unique_ptr<kpi::IMemento> next(const kpi::IMemento* last) const {
@@ -216,6 +224,7 @@ class Collection
216224
kpi::fromFolder(getModels(), in->mModels);
217225
kpi::fromFolder(getTextures(), in->mTextures);
218226
kpi::fromFolder(getAnim_Srts(), in->mAnim_Srts);
227+
kpi::fromFolder(getAnim_Clrs(), in->mAnim_Clrs);
219228
}
220229
template<typename T> void* operator=(const T& rhs) { from(rhs); return this; }
221230
};

source/plugins/g3d/g3d_material.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,12 @@ Result<void> ApplyCratePresetToMaterial(riistudio::g3d::Material& mat,
106106
static_cast<librii::g3d::SrtAnimationArchive&>(t) = new_srt;
107107
}
108108
for (auto& new_clr : anim.clr) {
109-
if (auto* x = findByName2(scene->clrs, new_clr.name)) {
109+
if (auto* x = scene->getAnim_Clrs().findByName(new_clr.name);
110+
x != nullptr) {
110111
new_clr.name += "_" + std::to_string(std::rand());
111112
}
112-
scene->clrs.emplace_back(new_clr);
113+
auto& t = scene->getAnim_Clrs().add();
114+
static_cast<librii::g3d::ClrAnim&>(t) = new_clr;
113115
}
114116
for (auto& new_pat : anim.pat) {
115117
if (auto* x = findByName2(scene->pats, new_pat.name)) {

source/plugins/g3d/io/BRRES.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,10 @@ Result<void> ReadBRRES(Collection& collection, librii::g3d::Archive& archive,
9494
static_cast<librii::g3d::SrtAnimationArchive&>(
9595
collection.getAnim_Srts().add()) = srt;
9696
}
97+
for (auto& clr : archive.clrs) {
98+
static_cast<librii::g3d::ClrAnim&>(collection.getAnim_Clrs().add()) = clr;
99+
}
97100
collection.chrs = archive.chrs;
98-
collection.clrs = archive.clrs;
99101
collection.pats = archive.pats;
100102
collection.viss = archive.viss;
101103
return {};
@@ -147,7 +149,7 @@ librii::g3d::Archive Collection::toLibRii() const {
147149
librii::g3d::Archive arc{
148150
.textures = getTextures() | rsl::ToList<librii::g3d::TextureData>(),
149151
.chrs = chrs,
150-
.clrs = clrs,
152+
.clrs = getAnim_Clrs() | rsl::ToList<librii::g3d::ClrAnim>(),
151153
.pats = pats,
152154
.srts = getAnim_Srts() | rsl::ToList<librii::g3d::SrtAnimationArchive>(),
153155
.viss = viss,

source/plugins/g3d/model.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <librii/g3d/data/AnimData.hpp>
1111
#include <librii/g3d/data/ModelData.hpp>
1212
#include <librii/g3d/data/VertexData.hpp>
13+
#include <librii/g3d/io/AnimClrIO.hpp>
1314
#include <librii/gx.h>
1415
#include <plugins/gc/Export/Scene.hpp>
1516
#include <tuple>
@@ -90,6 +91,19 @@ struct SRT0 : public librii::g3d::SrtAnim, public virtual kpi::IObject {
9091
void setName(const std::string& _name) { name = _name; }
9192
};
9293

94+
struct CLR0 : public librii::g3d::ClrAnim, public virtual kpi::IObject {
95+
bool operator==(const CLR0& rhs) const {
96+
return static_cast<const librii::g3d::ClrAnim&>(*this) == rhs;
97+
}
98+
CLR0& operator=(const CLR0& rhs) {
99+
static_cast<librii::g3d::ClrAnim&>(*this) = rhs;
100+
return *this;
101+
}
102+
103+
std::string getName() const { return name; }
104+
void setName(const std::string& _name) { name = _name; }
105+
};
106+
93107
} // namespace riistudio::g3d
94108

95109
#include "Node.h"

0 commit comments

Comments
 (0)