Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions include/Animation/Events.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
#include "Animation/PointDefinition.h"
#include "Animation/Track.h"


#include "Animation/Easings.h"

namespace GlobalNamespace {
class BeatmapCallbacksController;
}
Expand Down
129 changes: 0 additions & 129 deletions shared/Animation/Animation.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,134 +72,5 @@ MirrorQuaternionNullable(std::optional<NEVector::Quaternion> const& quaternion)

return NEVector::Quaternion(modifiedVector.x, modifiedVector.y * -1, modifiedVector.z * -1, modifiedVector.w);
}
#pragma region property_utils

// Conversion functions
[[nodiscard]] constexpr static NEVector::Vector3 ToVector3(Tracks::ffi::WrapBaseValue const& val) {
if (val.ty != Tracks::ffi::WrapBaseValueType::Vec3) return {};
return { val.value.vec3.x, val.value.vec3.y, val.value.vec3.z };
}

[[nodiscard]] constexpr static NEVector::Vector4 ToVector4(Tracks::ffi::WrapBaseValue const& val) {
if (val.ty != Tracks::ffi::WrapBaseValueType::Vec4) return {};
return { val.value.vec4.x, val.value.vec4.y, val.value.vec4.z, val.value.vec4.w };
}

[[nodiscard]] constexpr static NEVector::Quaternion ToQuaternion(Tracks::ffi::WrapBaseValue const& val) {
if (val.ty != Tracks::ffi::WrapBaseValueType::Quat) return {};
return { val.value.quat.x, val.value.quat.y, val.value.quat.z, val.value.quat.w };
}

[[nodiscard]] constexpr static float ToFloat(Tracks::ffi::WrapBaseValue const& val) {
if (val.ty != Tracks::ffi::WrapBaseValueType::Float) return {};
return val.value.float_v;
}

// Base versions that return WrapBaseValue
[[nodiscard]]
constexpr static std::vector<Tracks::ffi::WrapBaseValue> getProperties(std::span<TrackW const> tracks,
PropertyNames name, TimeUnit time) {
std::vector<Tracks::ffi::WrapBaseValue> properties;
properties.reserve(tracks.size());
for (auto const& track : tracks) {
auto property = track.GetPropertyNamed(name);
auto value = property.GetValue();
if (TimeUnit(value.last_updated) <= time) continue;
if (!value.value.has_value) continue;
properties.push_back(value.value.value);
}

return properties;
}

[[nodiscard]]
static std::vector<Tracks::ffi::WrapBaseValue> getPathProperties(std::span<TrackW const> tracks, PropertyNames name,
uint64_t time) {
std::vector<Tracks::ffi::WrapBaseValue> properties;

properties.reserve(tracks.size());
for (auto const& track : tracks) {
auto property = track.GetPathPropertyNamed(name);
auto value = property.Interpolate(time);
if (!value.has_value()) continue;
properties.push_back(*value);
}

return properties;
}

// Macro to generate type-specific property getters
#define GENERATE_PROPERTY_GETTERS(ReturnType, Suffix, Conversion) \
[[nodiscard]] \
static std::vector<ReturnType> getProperties##Suffix(std::span<TrackW const> tracks, PropertyNames name, \
TimeUnit time) { \
std::vector<ReturnType> properties; \
properties.reserve(tracks.size()); \
for (auto const& track : tracks) { \
auto property = track.GetPropertyNamed(name); \
auto value = property.GetValue(); \
if (!value.value.has_value) continue; \
if (TimeUnit(value.last_updated) <= time) continue; \
properties.push_back(Conversion(value.value.value)); \
} \
return properties; \
} \
\
[[nodiscard]] \
static std::vector<ReturnType> getPathProperties##Suffix(std::span<TrackW const> tracks, PropertyNames name, \
float time) { \
std::vector<ReturnType> properties; \
properties.reserve(tracks.size()); \
for (auto const& track : tracks) { \
auto property = track.GetPathPropertyNamed(name); \
auto value = property.Interpolate(time); \
if (!value.has_value()) continue; \
properties.push_back(Conversion(*value)); \
} \
return properties; \
}

// Generate specialized versions for different types
GENERATE_PROPERTY_GETTERS(NEVector::Vector3, Vec3, ToVector3)
GENERATE_PROPERTY_GETTERS(NEVector::Vector4, Vec4, ToVector4)
GENERATE_PROPERTY_GETTERS(NEVector::Quaternion, Quat, ToQuaternion)
GENERATE_PROPERTY_GETTERS(float, Float, ToFloat)

// Macro to generate addition functions for spans
#define GENERATE_ADD_FUNCTIONS(Type, TypeName) \
[[nodiscard]] \
constexpr static std::optional<Type> add##TypeName##s(std::span<Type const> values) { \
if (values.empty()) return std::nullopt; \
Type result = values[0]; \
for (size_t i = 1; i < values.size(); ++i) { \
result = result + values[i]; \
} \
return result; \
}

// Macro to generate multiplication functions for spans
#define GENERATE_MUL_FUNCTIONS(Type, TypeName) \
[[nodiscard]] \
constexpr static std::optional<Type> multiply##TypeName##s(std::span<Type const> values) { \
if (values.empty()) return std::nullopt; \
Type result = values[0]; \
for (size_t i = 1; i < values.size(); ++i) { \
result = result * values[i]; \
} \
return result; \
}

// Generate addition functions for different types
GENERATE_ADD_FUNCTIONS(NEVector::Vector3, Vector3)
GENERATE_ADD_FUNCTIONS(NEVector::Vector4, Vector4)
GENERATE_ADD_FUNCTIONS(float, Float)

// Generate multiplication functions for different types
GENERATE_MUL_FUNCTIONS(NEVector::Vector3, Vector3)
GENERATE_MUL_FUNCTIONS(NEVector::Vector4, Vector4)
GENERATE_MUL_FUNCTIONS(NEVector::Quaternion, Quaternion)
GENERATE_MUL_FUNCTIONS(float, Float)

#pragma endregion // property_utils

} // namespace Animation
2 changes: 2 additions & 0 deletions shared/Animation/GameObjectTrackController.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include "UnityEngine/Transform.hpp"

#include "Track.h"
#include "./interop/track_wrapper.h"
#include "./interop.h"

#include <utility>
#include <vector>
Expand Down
136 changes: 5 additions & 131 deletions shared/Animation/PointDefinition.h
Original file line number Diff line number Diff line change
@@ -1,138 +1,12 @@
#pragma once
#include <cstddef>
#include <memory>
#include <utility>
#include <variant>

#include "../Vector.h"
#include "beatsaber-hook/shared/config/rapidjson-utils.hpp"
#include "Easings.h"
#include "../Hash.h"
#include "UnityEngine/Color.hpp"
#include "beatsaber-hook/shared/rapidjson/include/rapidjson/document.h"
#include "../bindings.h"
#include "../binding_wrappers.hpp"
// Import point definition wrappers from interop module
#include "../interop/definition_wrappers.h"

extern Tracks::ffi::FFIJsonValue const* convert_rapidjson(rapidjson::Value const& value);

class PointDefinitionW {
public:
explicit PointDefinitionW(rapidjson::Value const& value, Tracks::ffi::WrapBaseValueType type,
std::shared_ptr<TracksAD::BaseProviderContextW> base_provider_context) {
auto* json = convert_rapidjson(value);
this->base_provider_context = base_provider_context;

internalPointDefinition = std::shared_ptr<Tracks::ffi::BasePointDefinition>(
Tracks::ffi::tracks_make_base_point_definition(json, type, *base_provider_context),
[](Tracks::ffi::BasePointDefinition* ptr) {
if (!ptr) return;
Tracks::ffi::base_point_definition_free(ptr);
});
}

// takes ownership
PointDefinitionW(Tracks::ffi::BasePointDefinition* pointDefinition,
std::shared_ptr<TracksAD::BaseProviderContextW> context)
: base_provider_context(context) {
internalPointDefinition = std::shared_ptr<Tracks::ffi::BasePointDefinition>(
pointDefinition,
[](Tracks::ffi::BasePointDefinition* ptr) {
if (!ptr) return;
Tracks::ffi::base_point_definition_free(ptr);
});
}

~PointDefinitionW() = default;

PointDefinitionW(PointDefinitionW const& other) = default;
explicit PointDefinitionW(std::nullptr_t) : internalPointDefinition(nullptr) {};

[[nodiscard]]
Tracks::ffi::WrapBaseValueType GetType() const {
return Tracks::ffi::tracks_base_point_definition_get_type(internalPointDefinition.get());
}

[[nodiscard]]

Tracks::ffi::WrapBaseValue Interpolate(float time) const {
bool last;
return Interpolate(time, last);
}

Tracks::ffi::WrapBaseValue Interpolate(float time, bool& last) const {
auto result = Tracks::ffi::tracks_interpolate_base_point_definition(internalPointDefinition.get(), time, &last,
*base_provider_context);

return result;
}
NEVector::Vector3 InterpolateVec3(float time, bool& last) const {
auto result = Interpolate(time, last);
return { result.value.vec3.x, result.value.vec3.y, result.value.vec3.z };
}

NEVector::Quaternion InterpolateQuaternion(float time, bool& last) const {
auto result = Interpolate(time, last);
return { result.value.quat.x, result.value.quat.y, result.value.quat.z, result.value.quat.w };
}

float InterpolateLinear(float time, bool& last) const {
auto result = Interpolate(time, last);
return result.value.float_v;
}

NEVector::Vector4 InterpolateVector4(float time, bool& last) const {
auto result = Interpolate(time, last);
return { result.value.vec4.x, result.value.vec4.y, result.value.vec4.z, result.value.vec4.w };
}

NEVector::Vector3 InterpolateVec3(float time) const {
bool last;
return InterpolateVec3(time, last);
}

NEVector::Quaternion InterpolateQuaternion(float time) const {
bool last;
return InterpolateQuaternion(time, last);
}

float InterpolateLinear(float time) const {
bool last;
return InterpolateLinear(time, last);
}

NEVector::Vector4 InterpolateVector4(float time) const {
bool last;
return InterpolateVector4(time, last);
}

uintptr_t count() const {
return Tracks::ffi::tracks_base_point_definition_count(internalPointDefinition.get());
}

bool hasBaseProvider() const {
return Tracks::ffi::tracks_base_point_definition_has_base_provider(internalPointDefinition.get());
}

operator Tracks::ffi::BasePointDefinition const*() const {
return internalPointDefinition.get();
}

operator Tracks::ffi::BasePointDefinition*() {
return internalPointDefinition.get();
}


// operator Tracks::ffi::BasePointDefinition*() {
// return internalPointDefinition;
// }

private:
constexpr PointDefinitionW() = default;

std::shared_ptr<Tracks::ffi::BasePointDefinition> internalPointDefinition;
std::shared_ptr<TracksAD::BaseProviderContextW> base_provider_context;
};
// PointDefinitionW and PointDefinitionManager are now defined in interop/definition_wrappers.h
// This header simply re-exports them for backward compatibility.

/// Manager for point definitions - stores and retrieves named point definitions
class PointDefinitionManager {
public:
std::unordered_map<std::string, rapidjson::Value const*, TracksAD::string_hash, TracksAD::string_equal> pointData;
Expand Down
Loading
Loading