#include #include "stdio.h" #include "ozz/animation/runtime/animation.h" #include "ozz/animation/runtime/local_to_model_job.h" #include "ozz/animation/runtime/blending_job.h" #include "ozz/animation/runtime/sampling_job.h" #include "ozz/animation/runtime/skeleton.h" #include "ozz/base/log.h" #include "ozz/base/maths/simd_math.h" #include "ozz/base/maths/soa_transform.h" #include "ozz/base/maths/vec_float.h" #include "ozz/options/options.h" #include "ozz/base/io/archive.h" #include "ozz/base/io/archive_traits.h" #include "ozz/base/io/stream.h" #ifdef _WIN32 #define OZZ_CPP_API __declspec(dllexport) #else #define OZZ_CPP_API #endif extern "C" { struct OpaqueSpan { void* start; void* end; }; void testFunc() { fprintf(stderr, "lmao2nova \n"); auto filename = "ozz-animation/media/bin/robot_skeleton.ozz"; ozz::io::File file(filename, "rb"); if (!file.opened()) { ozz::log::Err() << "Cannot open file " << filename << "." << std::endl; return; } ozz::io::IArchive archive(&file); ozz::animation::Skeleton skeleton; archive >> skeleton; } OZZ_CPP_API void startupOzz() { } OZZ_CPP_API void shutdownOzz() { } OZZ_CPP_API bool SamplingJob_Run_c(void* context) { ozz::animation::SamplingJob* self = static_cast(context); return self->Run(); } OZZ_CPP_API bool SamplingJob_Validate_c(void* context) { ozz::animation::SamplingJob* self = static_cast(context); return self->Validate(); } OZZ_CPP_API OpaqueSpan SkeletonGetJointsList_c(void* context) { ozz::animation::Skeleton* self = static_cast(context); auto s = self->joint_names(); OpaqueSpan* ptr = reinterpret_cast(&s); return *ptr; } OZZ_CPP_API int SkeletonNumJoints_c(void* context) { ozz::animation::Skeleton* self = static_cast(context); return self->num_joints(); } OZZ_CPP_API int SkeletonNumSoaJoints_c(void* context) { ozz::animation::Skeleton* self = static_cast(context); return self->num_soa_joints(); } OZZ_CPP_API void* CreateSkeleton_c() { ozz::animation::Skeleton* rv = new ozz::animation::Skeleton(); return rv; } OZZ_CPP_API void LoadSkeletonFromBytes_c(void* skeleton, void* start, size_t size) { ozz::animation::Skeleton* sk = static_cast(skeleton); ozz::io::MemoryStream ms; ms.Write(start, size); ms.Seek(0, ozz::io::Stream::Origin::kSet); std::cout << "loading skeleton from bytes" << std::endl; ozz::io::IArchive archive(&ms); if (!archive.TestTag()) { std::cout << "Archive doesn't contain the expected object type." << std::endl; return; } archive >> *sk; } OZZ_CPP_API void LoadSkeletonFromFile_c(void* skeleton, const char* filename) { ozz::animation::Skeleton* sk = static_cast(skeleton); ozz::io::File file(filename, "rb"); if (!file.opened()) { std::cout << "Cannot open file " << filename << "." << std::endl; return; } std::cout << "loading skeleton from " << filename << std::endl; ozz::io::IArchive archive(&file); if (!archive.TestTag()) { std::cout << "Archive doesn't contain the expected object type." << std::endl; return; } archive >> *sk; } OZZ_CPP_API OpaqueSpan SkeletonJointRestPoses_c (void* skeleton) { ozz::animation::Skeleton* sk = static_cast(skeleton); auto x = sk->joint_rest_poses(); OpaqueSpan* p = reinterpret_cast(&x); return *p; } OZZ_CPP_API void DestroySkeleton_c(void* skeleton) { ozz::animation::Skeleton* sk = static_cast(skeleton); delete sk; } OZZ_CPP_API float AnimationGetDuration_c(void* animation) { ozz::animation::Animation* a = static_cast(animation); return a->duration(); } OZZ_CPP_API void* CreateAnimation_c() { ozz::animation::Animation* a = new ozz::animation::Animation(); return a; } OZZ_CPP_API void DestroyAnimation_c(void* anim) { ozz::animation::Animation* self = static_cast(anim); delete self; } OZZ_CPP_API void LoadAnimationFromBytes_c(void* anim, void* start, size_t size) { ozz::animation::Animation* self = static_cast(anim); ozz::io::MemoryStream ms; ms.Write(start, size); ms.Seek(0, ozz::io::Stream::Origin::kSet); ozz::io::IArchive archive(&ms); if (!archive.TestTag()) { std::cout << "Failed to load animation instance from bytes " << "." << std::endl; return; } // Once the tag is validated, reading cannot fail. archive >> *self; } OZZ_CPP_API void LoadAnimationFromFile_c(void* anim, const char* filename) { ozz::animation::Animation* self = static_cast(anim); ozz::io::File file(filename, "rb"); if (!file.opened()) { ozz::log::Err() << "Failed to open animation file " << filename << "." << std::endl; return; } std::cout << "loading animation from " << filename << std::endl; ozz::io::IArchive archive(&file); if (!archive.TestTag()) { std::cout << "Failed to load animation instance from file " << filename << "." << std::endl; return; } // Once the tag is validated, reading cannot fail. archive >> *self; } // === SmplingJobContext === //pub extern fn CreateSamplingJobContextCount_c(c_int) callconv(.C) ?*anyopaque; OZZ_CPP_API void* CreateSamplingJobContext_c() { ozz::animation::SamplingJob::Context* rv = new ozz::animation::SamplingJob::Context(); return rv; } OZZ_CPP_API void* CreateSamplingJobContextCount_c(int count) { ozz::animation::SamplingJob::Context* rv = new ozz::animation::SamplingJob::Context(count); return rv; } OZZ_CPP_API void DestroySamplingJobContext_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); delete self; } OZZ_CPP_API void SamplingJobContext_Resize_c(void* context, int maxSize) { ozz::animation::SamplingJob::Context* self = static_cast(context); self->Resize(maxSize); } OZZ_CPP_API void SamplingJobContext_Invalidate_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); self->Invalidate(); } OZZ_CPP_API int SamplingJobContext_MaxSoaTracks_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); return self->max_soa_tracks(); } OZZ_CPP_API int SamplingJobContext_MaxTracks_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); return self->max_tracks(); } OZZ_CPP_API bool LocalToModelJob_Run_c(void* context) { ozz::animation::LocalToModelJob* self = static_cast(context); return self->Run(); } // Blending job OZZ_CPP_API bool BlendingJob_Validate_c(void* context) { ozz::animation::BlendingJob* self = static_cast(context); return self->Validate(); } OZZ_CPP_API bool BlendingJob_Run_c(void* context) { ozz::animation::BlendingJob* self = static_cast(context); return self->Run(); } }