diff --git a/include/beatsaber-impl/beatlevelimpl.h b/include/beatsaber-impl/beatlevelimpl.h index c88dbf7..2824615 100644 --- a/include/beatsaber-impl/beatlevelimpl.h +++ b/include/beatsaber-impl/beatlevelimpl.h @@ -47,6 +47,8 @@ public: virtual std::shared_ptr getBeatSet() const override; virtual std::shared_ptr getBeatMap() const override; + + virtual std::shared_ptr getRenderHelper() const override; }; } \ No newline at end of file diff --git a/include/beatsaber-impl/beatlevelrenderhelperimpl.h b/include/beatsaber-impl/beatlevelrenderhelperimpl.h new file mode 100644 index 0000000..6475259 --- /dev/null +++ b/include/beatsaber-impl/beatlevelrenderhelperimpl.h @@ -0,0 +1,20 @@ +#pragma once + +#include "beatlevelrenderhelper.h" + +namespace Beatsaber { + +class BeatLevelRenderHelperImpl : public BeatLevelRenderHelper { +public: + BeatLevelRenderHelperImpl(std::shared_ptr level); + virtual ~BeatLevelRenderHelperImpl(); + + //mat is a pointer to the matrix information in row first ordering + virtual void setMat(float* mat, double time, uint32_t note) override; + +private: + std::shared_ptr level; + double bps; //beats per second +}; + +} \ No newline at end of file diff --git a/include/beatsaber/beatlevel.h b/include/beatsaber/beatlevel.h index 83e917e..1d35e8b 100644 --- a/include/beatsaber/beatlevel.h +++ b/include/beatsaber/beatlevel.h @@ -12,6 +12,7 @@ namespace Beatsaber { //fwd class BeatSet; class BeatMap; +class BeatLevelRenderHelper; class BeatLevel { public: @@ -34,6 +35,8 @@ public: virtual std::shared_ptr getBeatSet() const = 0; // parent virtual std::shared_ptr getBeatMap() const = 0; // grandparent + virtual std::shared_ptr getRenderHelper() const = 0; + }; } \ No newline at end of file diff --git a/include/beatsaber/beatlevelrenderhelper.h b/include/beatsaber/beatlevelrenderhelper.h new file mode 100644 index 0000000..05400e5 --- /dev/null +++ b/include/beatsaber/beatlevelrenderhelper.h @@ -0,0 +1,17 @@ +#pragma once + +#include "beatlevel.h" + +namespace Beatsaber { + +// helps rendering a level +class BeatLevelRenderHelper { +public: + BeatLevelRenderHelper() {} + virtual ~BeatLevelRenderHelper() {} + + //mat is a pointer to the matrix information in row first ordering + virtual void setMat(float* mat, double time, uint32_t note) = 0; +}; + +} \ No newline at end of file diff --git a/src/beatlevel.cpp b/src/beatlevel.cpp index 4f77a1b..1875c52 100644 --- a/src/beatlevel.cpp +++ b/src/beatlevel.cpp @@ -7,6 +7,7 @@ #include "beatset.h" #include "beatnoteimpl.h" #include "beatmap.h" // for debug print +#include "beatlevelrenderhelperimpl.h" namespace Beatsaber { @@ -121,4 +122,9 @@ std::shared_ptr BeatLevelImpl::getBeatMap() const { return parent.lock()->getBeatMap(); } +std::shared_ptr BeatLevelImpl::getRenderHelper() const { + auto ptr = std::make_shared(shared_from_this()); + return ptr; +} + } \ No newline at end of file diff --git a/src/beatlevelrenderhelper.cpp b/src/beatlevelrenderhelper.cpp new file mode 100644 index 0000000..7e5fbcc --- /dev/null +++ b/src/beatlevelrenderhelper.cpp @@ -0,0 +1,71 @@ +#include "beatlevelrenderhelperimpl.h" + +#include "beatmap.h" + +#include + +static const float ROTLOOKUP[] { + 0, // 0 (from top) + M_PI, // 1 (from bottom) + -M_PI_2, // 2 Left + M_PI_2, // 3 Right + -M_PI_4, // 4 Up Left + M_PI_4, // 5 Up Right + -M_PI_4 * 3, // 6 Down Left + M_PI_4 * 3, // 7 Down Right + 0 // 8 Any (Dot Note) +}; + +namespace Beatsaber { + +static const uint32_t LINECOUNT = 4; +static const uint32_t LAYERCOUNT = 3; + +BeatLevelRenderHelperImpl::BeatLevelRenderHelperImpl(std::shared_ptr level) : level(level) { + bps = level->getBeatMap()->getBPM() / 60.0; +} + +BeatLevelRenderHelperImpl::~BeatLevelRenderHelperImpl() {} + +//mat is a pointer to the matrix information in row first ordering +void BeatLevelRenderHelperImpl::setMat(float* mat, double time, uint32_t note) { + if(!mat) return; + + double beat = bps * time; + + const Note& n = level->getNotes().at(note); + + + //get matrix parameters + float offsetx = (n.line - (LINECOUNT / 2.0)); + float offsety = n.layer; + float offsetz = n.time - beat; + + float rotationz = ROTLOOKUP[n.cutdir]; + + float cosrotz = cos(rotationz); + float sinrotz = sin(rotationz); + + //build matrix + mat[ 0] = cosrotz; + mat[ 1] = -sinrotz; + mat[ 2] = 0; + mat[ 3] = cosrotz*offsetx - sinrotz*offsety; + + mat[ 4] = sinrotz; + mat[ 5] = cosrotz; + mat[ 6] = 0; + mat[ 7] = sinrotz*offsetx - cosrotz*offsety; + + mat[ 8] = 0; + mat[ 9] = 0; + mat[10] = 1; + mat[11] = 0; + + mat[12] = offsetx; + mat[13] = offsety; + mat[14] = offsetz; + mat[15] = 1; +} + +} \ No newline at end of file