#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" 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; } void startupOzz() { } void shutdownOzz() { } bool SamplingJob_Run_c(void* context) { ozz::animation::SamplingJob* self = static_cast(context); return self->Run(); } bool SamplingJob_Validate_c(void* context) { ozz::animation::SamplingJob* self = static_cast(context); return self->Validate(); } OpaqueSpan SkeletonGetJointsList_c(void* context) { ozz::animation::Skeleton* self = static_cast(context); auto s = self->joint_names(); OpaqueSpan* ptr = reinterpret_cast(&s); return *ptr; } int SkeletonNumJoints_c(void* context) { ozz::animation::Skeleton* self = static_cast(context); return self->num_joints(); } int SkeletonNumSoaJoints_c(void* context) { ozz::animation::Skeleton* self = static_cast(context); return self->num_soa_joints(); } void* CreateSkeleton_c() { ozz::animation::Skeleton* rv = new ozz::animation::Skeleton(); return rv; } 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; } 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; } 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; } void DestroySkeleton_c(void* skeleton) { ozz::animation::Skeleton* sk = static_cast(skeleton); delete sk; } float AnimationGetDuration_c(void* animation) { ozz::animation::Animation* a = static_cast(animation); return a->duration(); } void* CreateAnimation_c() { ozz::animation::Animation* a = new ozz::animation::Animation(); return a; } void DestroyAnimation_c(void* anim) { ozz::animation::Animation* self = static_cast(anim); delete self; } 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; } 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; void* CreateSamplingJobContext_c() { ozz::animation::SamplingJob::Context* rv = new ozz::animation::SamplingJob::Context(); return rv; } void* CreateSamplingJobContextCount_c(int count) { ozz::animation::SamplingJob::Context* rv = new ozz::animation::SamplingJob::Context(count); return rv; } void DestroySamplingJobContext_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); delete self; } void SamplingJobContext_Resize_c(void* context, int maxSize) { ozz::animation::SamplingJob::Context* self = static_cast(context); self->Resize(maxSize); } void SamplingJobContext_Invalidate_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); self->Invalidate(); } int SamplingJobContext_MaxSoaTracks_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); return self->max_soa_tracks(); } int SamplingJobContext_MaxTracks_c(void* context) { ozz::animation::SamplingJob::Context* self = static_cast(context); return self->max_tracks(); } bool LocalToModelJob_Run_c(void* context) { ozz::animation::LocalToModelJob* self = static_cast(context); return self->Run(); } // Blending job bool BlendingJob_Validate_c(void* context) { ozz::animation::BlendingJob* self = static_cast(context); return self->Validate(); } bool BlendingJob_Run_c(void* context) { ozz::animation::BlendingJob* self = static_cast(context); return self->Run(); } }