Skip to content

Commit

Permalink
buuuncha shit (#365)
Browse files Browse the repository at this point in the history
* rndwii nonsense

* bleg

* rndwii shit, first half of ops mostly matching

* oh god

* update semantic qualifier
  • Loading branch information
ieee802dot11ac authored Oct 5, 2024
1 parent 31f26b2 commit 8dd6ed6
Show file tree
Hide file tree
Showing 34 changed files with 855 additions and 201 deletions.
6 changes: 5 additions & 1 deletion config/SZBE69/objects.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
"mw_version": "Wii/1.3",
"cflags": "band3",
"objects": {
"band3/bandtrack/TrackConfig.cpp": "Equivalent"
"band3/bandtrack/TrackConfig.cpp": "Equivalent",

"band3/tour/TourReward.cpp": "NonMatching"
}
},
"network": {
Expand Down Expand Up @@ -174,6 +176,7 @@
"system/obj/TypeProps.cpp": "NonMatching",

"system/os/AppChild.cpp": "Equivalent",
"system/os/Archive.cpp": "NonMatching",
"system/os/ArkFile.cpp": {"status": "NonMatching", "extra_cflags": ["-ipa function"]},
"system/os/DateTime.cpp": "NonMatching",
"system/os/Debug.cpp": "NonMatching",
Expand Down Expand Up @@ -286,6 +289,7 @@
"system/utl/Symbols2.cpp": "NonMatching",
"system/utl/Symbols3.cpp": "NonMatching",
"system/utl/Symbols4.cpp": "NonMatching",
"system/utl/TempoMap.cpp": {"status": "NonMatching", "extra_cflags": ["-ipa function"]},

"system/world/CameraManager.cpp": "NonMatching",
"system/world/CameraShot.cpp": "NonMatching",
Expand Down
6 changes: 6 additions & 0 deletions config/SZBE69/splits.txt
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,12 @@ rb3/ui/uistats.cpp:
rb3/panels/voiceoverpanel.cpp:
.text start:0x8029E738 end:0x8029F41C

band3/tour/TourReward.cpp:
.text start:0x802C06A8 end:0x802C0DC4
.data start:0x8084FB00 end:0x8084FB38
.sbss start:0x808E4370 end:0x808E4378
.bss start:0x80900740 end:0x80900758

rb3/unknown/802/unk_802D4B74.cpp:
.text start:0x802D4B74 end:0x802DCE58

Expand Down
62 changes: 33 additions & 29 deletions config/SZBE69/symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23121,17 +23121,17 @@ fn_802BE61C = .text:0x802BE61C; // type:function size:0xD4
fn_802BE6F0 = .text:0x802BE6F0; // type:function size:0xBC
fn_802BE7AC = .text:0x802BE7AC; // type:function size:0xE4
fn_802BE890 = .text:0x802BE890; // type:function size:0x88
fn_802BE918 = .text:0x802BE918; // type:function size:0x8
HandleTourRewardApplied__12TourProgressFv = .text:0x802BE918; // type:function size:0x8
fn_802BE920 = .text:0x802BE920; // type:function size:0x6C
fn_802BE98C = .text:0x802BE98C; // type:function size:0x44
fn_802BE9D0 = .text:0x802BE9D0; // type:function size:0x64
fn_802BEA34 = .text:0x802BEA34; // type:function size:0xD4
fn_802BEB08 = .text:0x802BEB08; // type:function size:0x48
fn_802BEB50 = .text:0x802BEB50; // type:function size:0xC4
fn_802BEC14 = .text:0x802BEC14; // type:function size:0x8
fn_802BEC1C = .text:0x802BEC1C; // type:function size:0x8
GetTourProperties__12TourProgressFv = .text:0x802BEC1C; // type:function size:0x8
fn_802BEC24 = .text:0x802BEC24; // type:function size:0x8
fn_802BEC2C = .text:0x802BEC2C; // type:function size:0x8
GetPerformanceProperties__12TourProgressFv = .text:0x802BEC2C; // type:function size:0x8
fn_802BEC34 = .text:0x802BEC34; // type:function size:0xC
fn_802BEC40 = .text:0x802BEC40; // type:function size:0x98
fn_802BECD8 = .text:0x802BECD8; // type:function size:0x4C
Expand Down Expand Up @@ -23198,25 +23198,25 @@ fn_802C0330 = .text:0x802C0330; // type:function size:0x8
__ct__22TourPropertyCollectionFv = .text:0x802C0338; // type:function size:0x50
fn_802C0388 = .text:0x802C0388; // type:function size:0x68
fn_802C03F0 = .text:0x802C03F0; // type:function size:0x8
fn_802C03F8 = .text:0x802C03F8; // type:function size:0xAC
fn_802C04A4 = .text:0x802C04A4; // type:function size:0xC0
SetPropertyValue__22TourPropertyCollectionF6Symbolf = .text:0x802C03F8; // type:function size:0xAC
GetPropertyValue__22TourPropertyCollectionCF6Symbol = .text:0x802C04A4; // type:function size:0xC0
fn_802C0564 = .text:0x802C0564; // type:function size:0x18
fn_802C057C = .text:0x802C057C; // type:function size:0x8
fn_802C0584 = .text:0x802C0584; // type:function size:0x18
fn_802C059C = .text:0x802C059C; // type:function size:0x44
fn_802C05E0 = .text:0x802C05E0; // type:function size:0x68
fn_802C0648 = .text:0x802C0648; // type:function size:0x60
fn_802C06A8 = .text:0x802C06A8; // type:function size:0x18
fn_802C06C0 = .text:0x802C06C0; // type:function size:0x40
fn_802C0700 = .text:0x802C0700; // type:function size:0x8
fn_802C0708 = .text:0x802C0708; // type:function size:0x154
fn_802C085C = .text:0x802C085C; // type:function size:0x1AC
fn_802C0A08 = .text:0x802C0A08; // type:function size:0x80
fn_802C0A88 = .text:0x802C0A88; // type:function size:0x6C
fn_802C0AF4 = .text:0x802C0AF4; // type:function size:0xB4
fn_802C0BA8 = .text:0x802C0BA8; // type:function size:0xB4
fn_802C0C5C = .text:0x802C0C5C; // type:function size:0xB4
fn_802C0D10 = .text:0x802C0D10; // type:function size:0xB4
__ct__10TourRewardFv = .text:0x802C06A8; // type:function size:0x18
__dt__10TourRewardFv = .text:0x802C06C0; // type:function size:0x40
Init__10TourRewardFPC9DataArray = .text:0x802C0700; // type:function size:0x8
ApplyRewardEntry__10TourRewardCFP12TourProgressP9DataArray = .text:0x802C0708; // type:function size:0x154
ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray = .text:0x802C085C; // type:function size:0x1AC
Apply__10TourRewardCFP12TourProgress = .text:0x802C0A08; // type:function size:0x80
ApplyRewardValue__10TourRewardCFP12TourProgressR22TourPropertyCollection6Symbolf = .text:0x802C0A88; // type:function size:0x6C
ApplyAddReward__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray = .text:0x802C0AF4; // type:function size:0xB4
ApplySubtractReward__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray = .text:0x802C0BA8; // type:function size:0xB4
ApplyMultiplyReward__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray = .text:0x802C0C5C; // type:function size:0xB4
ApplyDivideReward__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray = .text:0x802C0D10; // type:function size:0xB4
__ct__11TourSavableFv = .text:0x802C0DC4; // type:function size:0xC8
fn_802C0E8C = .text:0x802C0E8C; // type:function size:0x70
fn_802C0EFC = .text:0x802C0EFC; // type:function size:0x8
Expand Down Expand Up @@ -28234,7 +28234,7 @@ TickToTime__14SimpleTempoMapCFf = .text:0x8037A4FC; // type:function size:0xC sc
TimeToTick__14SimpleTempoMapCFf = .text:0x8037A508; // type:function size:0xC scope:weak
GetTempo__14SimpleTempoMapCFi = .text:0x8037A514; // type:function size:0x14 scope:weak
GetTempoBPM__14SimpleTempoMapCFi = .text:0x8037A528; // type:function size:0x20 scope:weak
GetTempoUSecs__14SimpleTempoMapFi = .text:0x8037A548; // type:function size:0x44 scope:weak
GetTempoInMicroseconds__14SimpleTempoMapCFi = .text:0x8037A548; // type:function size:0x44 scope:weak
__ct__14TextFileStreamFPCcb = .text:0x8037A58C; // type:function size:0x6C
Print__14TextFileStreamFPCc = .text:0x8037A5F8; // type:function size:0x84
__ct__10TextStreamFv = .text:0x8037A67C; // type:function size:0x10
Expand Down Expand Up @@ -67638,10 +67638,10 @@ lbl_8084FAC8 = .data:0x8084FAC8; // type:object size:0x10
lbl_8084FAD8 = .data:0x8084FAD8; // type:object size:0x14
lbl_8084FAEC = .data:0x8084FAEC; // type:object size:0xC
lbl_8084FAF8 = .data:0x8084FAF8; // type:object size:0x8
lbl_8084FB00 = .data:0x8084FB00; // type:object size:0xC
__vt__10TourReward = .data:0x8084FB00; // type:object size:0xC
lbl_8084FB0C = .data:0x8084FB0C; // type:object size:0xC
lbl_8084FB18 = .data:0x8084FB18; // type:object size:0x8
lbl_8084FB20 = .data:0x8084FB20; // type:object size:0x18
__RTTI__10TourReward = .data:0x8084FB18; // type:object size:0x8
@stringBase0 = .data:0x8084FB20; // type:object size:0x18 scope:local data:string_table
__vt__11TourSavable = .data:0x8084FB38; // type:object size:0x80
lbl_8084FBB8 = .data:0x8084FBB8; // type:object size:0x10
lbl_8084FBC8 = .data:0x8084FBC8; // type:object size:0x18
Expand Down Expand Up @@ -75206,12 +75206,12 @@ lbl_808E4360 = .sbss:0x808E4360; // type:object size:0x1 data:byte
lbl_808E4361 = .sbss:0x808E4361; // type:object size:0x1 data:byte
lbl_808E4362 = .sbss:0x808E4362; // type:object size:0x6 data:byte
lbl_808E4368 = .sbss:0x808E4368; // type:object size:0x8 data:byte
lbl_808E4370 = .sbss:0x808E4370; // type:object size:0x1 data:byte
lbl_808E4371 = .sbss:0x808E4371; // type:object size:0x1 data:byte
lbl_808E4372 = .sbss:0x808E4372; // type:object size:0x1 data:byte
lbl_808E4373 = .sbss:0x808E4373; // type:object size:0x1 data:byte
lbl_808E4374 = .sbss:0x808E4374; // type:object size:0x1 data:byte
lbl_808E4375 = .sbss:0x808E4375; // type:object size:0x1 data:byte
@GUARD@ApplyRewardEntry__10TourRewardCFP12TourProgressP9DataArray@sym_band = .sbss:0x808E4370; // type:object size:0x1 data:byte
@GUARD@ApplyRewardEntry__10TourRewardCFP12TourProgressP9DataArray@sym_perf@0 = .sbss:0x808E4371; // type:object size:0x1 data:byte
@GUARD@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_add = .sbss:0x808E4372; // type:object size:0x1 data:byte
@GUARD@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_subtract@0 = .sbss:0x808E4373; // type:object size:0x1 data:byte
@GUARD@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_multiply@1 = .sbss:0x808E4374; // type:object size:0x1 data:byte
@GUARD@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_divide@2 = .sbss:0x808E4375; // type:object size:0x1 data:byte
lbl_808E4378 = .sbss:0x808E4378; // type:object size:0x1 data:byte
lbl_808E4379 = .sbss:0x808E4379; // type:object size:0x1 data:byte
lbl_808E437A = .sbss:0x808E437A; // type:object size:0x1 data:byte
Expand Down Expand Up @@ -78680,8 +78680,12 @@ lbl_80900618 = .bss:0x80900618; // type:object size:0xC0
lbl_809006D8 = .bss:0x809006D8; // type:object size:0x10
lbl_809006E8 = .bss:0x809006E8; // type:object size:0x8
lbl_809006F0 = .bss:0x809006F0; // type:object size:0x50
lbl_80900740 = .bss:0x80900740; // type:object size:0x4
lbl_80900744 = .bss:0x80900744; // type:object size:0xCC
@LOCAL@ApplyRewardEntry__10TourRewardCFP12TourProgressP9DataArray@sym_band = .bss:0x80900740; // type:object size:0x4
@LOCAL@ApplyRewardEntry__10TourRewardCFP12TourProgressP9DataArray@sym_perf@0 = .bss:0x80900744; // type:object size:0x4
@LOCAL@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_add = .bss:0x80900748; // type:object size:0x4
@LOCAL@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_subtract@0 = .bss:0x8090074C; // type:object size:0x4
@LOCAL@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_multiply@1 = .bss:0x80900750; // type:object size:0x4
@LOCAL@ApplyRewardEntry__10TourRewardCFP12TourProgressR22TourPropertyCollectionP9DataArray@sym_divide@2 = .bss:0x80900754; // type:object size:0x4
lbl_80900810 = .bss:0x80900810; // type:object size:0xC
lbl_8090081C = .bss:0x8090081C; // type:object size:0x1C
lbl_80900838 = .bss:0x80900838; // type:object size:0x28
Expand Down Expand Up @@ -85027,7 +85031,7 @@ lbl_80985908 = .bss:0x80985908; // type:object size:0x4
lbl_8098590C = .bss:0x8098590C; // type:object size:0x4 data:4byte
lbl_80985910 = .bss:0x80985910; // type:object size:0x4
lbl_80985914 = .bss:0x80985914; // type:object size:0x4 data:4byte
lbl_80985918 = .bss:0x80985918; // type:object size:0x8
gDefaultTempoMap = .bss:0x80985918; // type:object size:0x8
lbl_80985920 = .bss:0x80985920; // type:object size:0x10
lbl_80985930 = .bss:0x80985930; // type:object size:0x10
lbl_80985940 = .bss:0x80985940; // type:object size:0x8
Expand Down
20 changes: 20 additions & 0 deletions config/SZBE69_B8/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,23 @@ block_relocations:
end: .text:0x80A2F064
- source: .text:0x80A2F208 # strcmp
end: .text:0x80A2F20C

add_relocations:
- source: .text:0x807c8968
type: l
target: TheLoadMgr
- source: .text:0x807c897c
type: l
target: __RTTI__10UILabelDir
- source: .text:0x807c8980
type: l
target: __RTTI__9ObjectDir
- source: .text:0x807c8b08
type: l
target: TheLoadMgr
- source: .text:0x807c8b1c
type: l
target: __RTTI__10UILabelDir
- source: .text:0x807c8b20
type: l
target: __RTTI__9ObjectDir
12 changes: 6 additions & 6 deletions config/SZBE69_B8/objects.json
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@
"band3/tour/TourProperty.cpp": "Matching",
"band3/tour/TourPropertyCollection.cpp": "MISSING",
"band3/tour/TourQuestGameRules.cpp": "Matching",
"band3/tour/TourReward.cpp": "NonMatching",
"band3/tour/TourReward.cpp": "Equivalent",
"band3/tour/TourSavable.cpp": "MISSING",
"band3/tour/TourWeightManager.cpp": "MISSING"
}
Expand Down Expand Up @@ -1219,7 +1219,7 @@
"system/rndobj/Utl.cpp": "NonMatching",
"system/rndobj/Wind.cpp": "NonMatching",

"system/rndwii/Cam.cpp": "MISSING",
"system/rndwii/Cam.cpp": "NonMatching",
"system/rndwii/Env.cpp": "MISSING",
"system/rndwii/Lit.cpp": "MISSING",
"system/rndwii/Mat.cpp": "MISSING",
Expand All @@ -1230,8 +1230,8 @@
"system/rndwii/PostProc.cpp": "MISSING",
"system/rndwii/Rnd.cpp": "NonMatching",
"system/rndwii/SplitPostProc.cpp": "MISSING",
"system/rndwii/Tex.cpp": "MISSING",
"system/rndwii/TexRenderer.cpp": "MISSING",
"system/rndwii/Tex.cpp": "NonMatching",
"system/rndwii/TexRenderer.cpp": "Matching",

"system/synth/ADSR.cpp": "Matching",
"system/synth/BinkClip.cpp": "Matching",
Expand Down Expand Up @@ -1422,7 +1422,7 @@

"system/world/CameraManager.cpp": "NonMatching",
"system/world/CameraShot.cpp": "NonMatching",
"system/world/ColorPalette.cpp": "NonMatching",
"system/world/ColorPalette.cpp": "Equivalent",
"system/world/Crowd.cpp": "NonMatching",
"system/world/Dir.cpp": "NonMatching",
"system/world/EventAnim.cpp": "NonMatching",
Expand Down Expand Up @@ -1451,7 +1451,7 @@
"mw_version": "Wii/1.3",
"cflags": "system/speex",
"objects": {
"system/speex/libspeex/bits.c": "NonMatching",
"system/speex/libspeex/bits.c": {"status": "LinkIssues", "comment": "Has issues with Quazal"},
"system/speex/libspeex/cb_search.c": "Matching",
"system/speex/libspeex/exc_10_16_table.c": "Matching",
"system/speex/libspeex/exc_10_32_table.c": "Matching",
Expand Down
3 changes: 3 additions & 0 deletions src/band3/tour/TourProgress.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define TOUR_TOURPROGRESS_H

#include "obj/Object.h"
#include "tour/TourPropertyCollection.h"
#include "tour/TourSavable.h"
#include "meta/FixedSizeSaveable.h"
#include "tour/QuestJournal.h"
Expand All @@ -15,6 +16,8 @@ class TourProgress : public TourSavable, public FixedSizeSaveable {

void HandleTourRewardApplied();
void SetOnTour(bool);
TourPropertyCollection& GetPerformanceProperties();
TourPropertyCollection& GetTourProperties();

QuestJournal mQuests;
};
Expand Down
57 changes: 53 additions & 4 deletions src/band3/tour/TourReward.cpp
Original file line number Diff line number Diff line change
@@ -1,21 +1,58 @@
#include "TourReward.h"
#include "decomp.h"
#include "obj/Data.h"
#include "os/Debug.h"
#include "tour/Tour.h"
#include "utl/Symbol.h"

TourReward::TourReward() : mRewards(NULL) {}

TourReward::~TourReward() {}

void TourReward::Init(const DataArray* i_pConfig) { mRewards = const_cast<DataArray*>(i_pConfig); }

void TourReward::ApplyRewardEntry(TourProgress*, DataArray*) const {

void TourReward::ApplyRewardEntry(TourProgress* tp, DataArray* da) const {
static class Symbol sym_band = "band";
static class Symbol sym_perf = "perf";
Symbol s = da->Sym(0);
if (s == sym_band) {
DataArray* pEntryArray = da->Array(1);
MILO_ASSERT(pEntryArray, 42);
ApplyRewardEntry(tp, tp->GetTourProperties(), pEntryArray);
} else if (s == sym_perf) {
DataArray* pEntryArray = da->Array(1);
MILO_ASSERT(pEntryArray, 49);
ApplyRewardEntry(tp, tp->GetPerformanceProperties(), pEntryArray);
} else {
ApplyRewardEntry(tp, tp->GetTourProperties(), da);
}
}
#ifdef MILO_DEBUG
#pragma push
#pragma pool_data off
#endif

void TourReward::ApplyRewardEntry(TourProgress*, TourPropertyCollection&, DataArray*) const {

void TourReward::ApplyRewardEntry(TourProgress* tp, TourPropertyCollection& tpc, DataArray* da) const {
static class Symbol sym_add = "+";
static class Symbol sym_subtract = "-";
static class Symbol sym_multiply = "*";
static class Symbol sym_divide = "/";
Symbol s = da->Sym(0);
if (s == sym_add) {
ApplyAddReward(tp, tpc, da);
} else if (s == sym_subtract) {
ApplySubtractReward(tp, tpc, da);
} else if (s == sym_multiply) {
ApplyMultiplyReward(tp, tpc, da);
} else if (s == sym_divide) {
ApplyDivideReward(tp, tpc, da);
} else {
MILO_WARN("Unknown reward entry (%s).", s.Str());
}
}
#ifdef MILO_DEBUG
#pragma pop
#endif

void TourReward::Apply(TourProgress* tp) const {
if (mRewards) {
Expand All @@ -33,35 +70,47 @@ void TourReward::ApplyRewardValue(TourProgress*, TourPropertyCollection& pc, Sym
void TourReward::ApplyAddReward(TourProgress* tp, TourPropertyCollection& pc, DataArray* i_pArray) const {
MILO_ASSERT(i_pArray->Size() == 3, 129);
Symbol s = i_pArray->Sym(1);
#ifdef MILO_DEBUG
ValidatePropertyModification(s);
#endif
float f = i_pArray->Float(2) + pc.GetPropertyValue(s);
ApplyRewardValue(tp, pc, s, f);
}

void TourReward::ApplySubtractReward(TourProgress* tp, TourPropertyCollection& pc, DataArray* i_pArray) const {
MILO_ASSERT(i_pArray->Size() == 3, 149);
Symbol s = i_pArray->Sym(1);
#ifdef MILO_DEBUG
ValidatePropertyModification(s);
#endif
float f = pc.GetPropertyValue(s) - i_pArray->Float(2);
ApplyRewardValue(tp, pc, s, f);
}

void TourReward::ApplyMultiplyReward(TourProgress* tp, TourPropertyCollection& pc, DataArray* i_pArray) const {
MILO_ASSERT(i_pArray->Size() == 3, 168);
Symbol s = i_pArray->Sym(1);
#ifdef MILO_DEBUG
ValidatePropertyModification(s);
#endif
float f = i_pArray->Float(2) * pc.GetPropertyValue(s);
ApplyRewardValue(tp, pc, s, f);
}

void TourReward::ApplyDivideReward(TourProgress* tp, TourPropertyCollection& pc, DataArray* i_pArray) const {
MILO_ASSERT(i_pArray->Size() == 3, 187);
Symbol s = i_pArray->Sym(1);
#ifdef MILO_DEBUG
ValidatePropertyModification(s);
#endif
float f = pc.GetPropertyValue(s) / i_pArray->Float(2);
ApplyRewardValue(tp, pc, s, f);
}

#ifdef MILO_DEBUG
DECOMP_FORCEACTIVE(TourReward, "pProperty", "false\0", "o_rEntries.empty()")
#endif

void TourReward::ValidatePropertyModification(Symbol s) const {
TourProperty* t = TheTour->GetTourProperty(s);
if (t && t->IsAutomatic()) MILO_WARN("Trying to modify an automatic property with a reward! Property = %s\n", s.Str());
Expand Down
1 change: 1 addition & 0 deletions src/sdk/RVL_SDK/revolution/gx/GXFrameBuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ extern GXRenderModeObj GXEurgb60Hz480ProgSoft;

void GXSetTexCopySrc(u16 x, u16 y, u16 w, u16 h);
void GXSetTexCopyDst(u16 w, u16 h, GXTexFmt fmt, GXBool mipmap);
void GXGetTexBufferSize(u16 w, u16 h, GXTexFmt fmt, u32, u32);

void GXSetCopyClamp(GXCopyClamp clamp);

Expand Down
Loading

0 comments on commit 8dd6ed6

Please sign in to comment.