ozz-animation provides runtime character animation playback functionalities (loading, sampling, blending...)




open source c++ 3d skeletal animation library and toolset

ozz-animation provides runtime character animation playback functionalities (loading, sampling, blending...). It proposes a low-level renderer agnostic and game-engine agnostic implementation, focusing on performance and memory constraints with a data-oriented design.

ozz-animation comes with the toolchain to convert from major Digital Content Creation formats (gltf, Fbx, Collada, Obj, 3ds, dxf) to ozz optimized runtime structures. Offline libraries are also provided to implement the conversion from any other animation and skeleton format.


Documentation and samples are available from ozz-animation website. Join Gitter for further discussions.

Supported platforms

Ozz is tested on Linux, Mac OS and Windows, for x86, x86-64 and ARM architectures. The run-time code (ozz_base, ozz_animation, ozz_geometry) depends only on c++11, the standard CRT and has no OS specific code, portability to any other platform shouldn't be an issue.

Samples, tools and tests depend on external libraries (glfw, tinygltf, Fbx SDK, jsoncpp, gtest, ...), which could limit portability.

Build status

Linux macOS Windows
master Linux macOS Windows
develop Linux macOS Windows

The dashboard for all branches is available here.


All contributions are welcome: code reviews, bug reports, bug fixes, samples, features, platforms, testing, documentation, optimizations...

Please read CONTRIBUTING file for more details about how to submit bugs or contribute to the code.


ozz-animation is hosted on github and distributed under the MIT License (MIT).

  • DLL Exports

    DLL Exports

    We have ozz wrapped up so that it's mostly hidden away from the game directly. However, I would still like to expose small amount of ozz's surface area to the game.

    It would be nice to setup dll import/export macros throughout the headers in order to optionally allow ozz to be dynamically linked.

    I'm thinking we add the following to platform.h

    #if defined(OZZ_DLL_EXPORT)
        #define OZZ_DLL __declspec( dllexport )
    #elif defined(OZZ_DLL_IMPORT)
        #define OZZ_DLL __declspec( dllimport )
        #define OZZ_DLL

    And then work through all of the necessary types and functions, decorating them with OZZ_DLL.

    This will allow everyone to continue linking ozz statically without any changes to their configuration. While allowing anyone with a setup like ours to link ozz statically into our engine but expose it to anything using our engine.



    / Kyle

    help wanted build 
    opened by kylawl 18
  • Skeleton number of bones

    Skeleton number of bones

    Hi, I'm using Ozz to load and play an animation from https://www.mixamo.com survivor_a_lusth.zip

    I generated the skeleton and animation using the offline tools. I can display debug shapes for the joints, so everything is working as intended.

    I'm using hardware skinning but I run into an issue with the bone count.

    Ozz skeleton has 65 bones. The loaded mesh (through fbx or assimp) has 52.

    I need to multiply ozz matrices by the inverse bind pose matrix to perform the skinning, but I can't match the bones between ozz skeleton and the loaded mesh skeleton.

    How do I match those up?

    Thanks, JNQ

    good first issue 
    opened by seeme00 18
  • Minor build system tweak that allows importing the whole project as a submodule

    Minor build system tweak that allows importing the whole project as a submodule


    I've made some minor fixes that allows importing the whole ozz project as a cmake subdirectory.

    Changes are pretty trivial - they just retarget all relevant source directories from the global source directory to the directory where ozz currently lives.

    Thanks, Kirill.

    EDIT: I've added another commit, that fixes cmake issue when it switches from static to dynamic linking for some reason.

    opened by bazhenovc 18
  • glTF 2.0 importer

    glTF 2.0 importer

    This is a follow-up to https://github.com/guillaumeblanc/ozz-animation/pull/67. Previous discussion can be found there.

    This PR implements a mostly spec compliant importer from glTF 2.0 to Ozz. It subclasses OzzImporter and can be used in the same way as the FBX one. It depends on tinygltf for parsing.

    Changes since last time:

    • Rebased on top of develop branch.
    • Added ozz_build_gltf CMake option. It requires ozz_build_cpp11 to be ON.
    • Cubic spline channels are sampled with respect to the sampling rate passed in the configuration.
    • Step interpolated channels are supported.
    • Proper handling of scenes with more than one skeleton root.
    • Handle scenes with duplicate or empty joint names.
    • Added several sample glTF models in media/gltf to test out different parts of the importer (e.g. cubic spline interpolation).
    • Less liberal usage of auto for basic types.
    • C++ header files placed in include/.
    • Various small fixes and improvements.
    opened by AlexanderDzhoganov 13
  • Make ozz work with vs2017 and fbx2019

    Make ozz work with vs2017 and fbx2019

    1. Apparently vs2017 didn't increase the major version of cl.exe.
    2. at least on windows after generating and trying to build I am getting dozens of linker errors. the sdk contains bundled versions for xml and zlib. I have modified the cmake file to include them as well for msvc.
    3. the LIBS_DEBUG stuff was unused and I removed it
    opened by m0ppers 13
  • Way to Dynamically Determine How Many Blend Layers?

    Way to Dynamically Determine How Many Blend Layers?

    Hello! Looking at all of your samples, the blendJob.layers property is always set with ozz::animation::BlendingJob::Layer layers[HARD_CODED_NUMBER]. I wanted to know if there was any way to make this dynamic as I want to have a single object which can blend any number of animations. Since blendJob.layers is of type ozz::Range I tried setting is with an object of that type. Everything compiles but the blend job's validate function sees it as incorrect. Ozz is incredible and has helped me so much with my project, just wanted to know if there was a way to accomplish this that I wasn't thinking of. Thank you! :)

    opened by syonker 13
  • Fix incorrect transforms in gltf2ozz

    Fix incorrect transforms in gltf2ozz

    Since gltf2ozz considers the entire scene graph as a skeleton if no skins are defined in the glTF file, we can encounter (non-animated) nodes using matrix instead of translation, rotation and scale for their transformations while parsing all nodes. These were considered "without a transform", leading to incorrect results.

    An example of this behavior can be seen, if you have a glTF viewer using ozz-animation, on the following model: https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/VC.

    In that model, the "container" node, "node_0", has a matrix transform which gets ignored by gltf2ozz, making all child nodes not respect the parent's transform. This leads to all animated nodes being incorrectly rotated and scaled.

    Importing the VC model in Blender and exporting it without making any changes fortunately replaces all matrices with translations, rotations and scales, which allows for an easy comparison.

    opened by StoneWolf 11
  • Importing a skinned mesh from blender .fbx exported file

    Importing a skinned mesh from blender .fbx exported file

    I'm trying to import a skinned mesh from a .fbx file exported from blender, using fbx2mesh.cc framework sample, with a custom raw skeletal, but it results in something as follow:


    The original mesh in blender looks like:


    I do not have much experience, but a think this happens by bones vs joints oriented format issue. And I don't know how to solve this.

    Thanks in advance.

    opened by victorcifuentes 11
  • Provide Sample Showcasing Ability To Load Complete Model Information

    Provide Sample Showcasing Ability To Load Complete Model Information

    http://guillaumeblanc.github.io/ozz-animation/documentation/geometry_runtime/ The following is stated: "Note that ozz does not propose any production ready tool to load meshes or any mesh format. See fbx2skin from ozz sample framework for an example of how to import a skinned mesh from fbx." None of the current samples or documentation explain how to retrieve vertex, index, uv, etc.. data from models. It is to my understanding after reading the provided documentation and studying the provided samples that you are required to load this information into an application using other means?

    https://github.com/guillaumeblanc/ozz-animation/blob/master/samples/framework/tools/fbx2mesh.cc Appears to showcase how to retrieve this information but the file is over 1000 lines and after going through it a few times leaves me wishing for a proper sample explaining the process.

    Could it be possible to provide a sample explaining how to retrieve this data from our loaded models?

    opened by kklouzal 10
  • Hardware skinning

    Hardware skinning

    Is hardware skinning a possibility? something like dual quaternion skinning? I guess there would have to be a bone limit though. Would be cool to see this library working on mobile devices with skinning done in the vertex shader.

    help wanted feature good first issue 
    opened by Codewyvern 10
  • Failed build on FreeBSD

    Failed build on FreeBSD

    Hello i build from branch master but errors are in extern in gtest. Problem is in missing headers for compilation on freebsd. I looked at your version gtest is obsolete (1.5.0 now is 1.7.0).

    Version OS : FreeBSD pcbsd-8384 11.0-CURRENTFEB2016 FreeBSD 11.0-CURRENTFEB2016 #5 cbe5270(freebsd-base-graphics)
    Version clang : FreeBSD clang version 3.7.1 (tags/RELEASE_371/final 255217) 20151225
     ~/Documents/ozz-animation/build% make -j8
    Default build type is: Release
    The following compilation flags will be used:
    -- Could NOT find Fbx (missing:  FBX_LIBRARIES FBX_INCLUDE_DIRS) 
    Fbx SDK not found, FBX tools libraries and samples will be skipped.
    -- Try OpenMP C flag = [ ]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [-fopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [/openmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [-Qopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [-openmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [-xopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [+Oopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [-qsmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP C flag = [-mp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [ ]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [-fopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [/openmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [-Qopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [-openmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [-xopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [+Oopenmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [-qsmp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Try OpenMP CXX flag = [-mp]
    -- Performing Test OpenMP_FLAG_DETECTED
    -- Performing Test OpenMP_FLAG_DETECTED - Failed
    -- Could NOT find OpenMP (missing:  OpenMP_C_FLAGS OpenMP_CXX_FLAGS) 
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /usr/home/razor/Documents/ozz-animation/build
    Scanning dependencies of target tinyxml
    Scanning dependencies of target ozz_geometry
    [  1%] Building CXX object src/options/CMakeFiles/ozz_options.dir/options.cc.o
    Scanning dependencies of target gtest
    Scanning dependencies of target ozz_animation_offline_tools
    [  1%] Building CXX object src/animation/offline/collada/tinyxml/CMakeFiles/tinyxml.dir/tinystr.cpp.o
    [  2%] Building CXX object src/geometry/runtime/CMakeFiles/ozz_geometry.dir/skinning_job.cc.o
    [  2%] Building CXX object src/animation/offline/tools/CMakeFiles/ozz_animation_offline_tools.dir/convert2anim.cc.o
    [  3%] Building CXX object test/gtest/CMakeFiles/gtest.dir/fused-src/gtest/gtest_main.cc.o
    Scanning dependencies of target ozz_base
    Scanning dependencies of target ozz_animation
    Scanning dependencies of target ozz_animation_offline
    [  4%] Building CXX object src/base/CMakeFiles/ozz_base.dir/memory/allocator.cc.o
    [  4%] Building CXX object src/animation/runtime/CMakeFiles/ozz_animation.dir/animation.cc.o
    [  5%] Building CXX object src/animation/offline/CMakeFiles/ozz_animation_offline.dir/raw_animation.cc.o
    [  6%] Building CXX object src/animation/offline/collada/tinyxml/CMakeFiles/tinyxml.dir/tinyxml.cpp.o
    [  6%] Building CXX object src/base/CMakeFiles/ozz_base.dir/log.cc.o
    [  7%] Building CXX object src/animation/runtime/CMakeFiles/ozz_animation.dir/blending_job.cc.o
    [  7%] Building CXX object src/animation/offline/CMakeFiles/ozz_animation_offline.dir/raw_animation_archive.cc.o
    [  7%] Linking CXX static library libozz_geometry_r.a
    In file included from /usr/home/razor/Documents/ozz-animation/extern/gtest/fused-src/gtest/gtest_main.cc:30:
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2377:36: error: use of undeclared identifier 'isatty'
    inline int IsATTY(int fd) { return isatty(fd); }
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2383:44: error: use of undeclared identifier 'rmdir'
    inline int RmDir(const char* dir) { return rmdir(dir); }
    [  7%] Built target ozz_geometry
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2405:44: error: use of undeclared identifier 'chdir'
    inline int ChDir(const char* dir) { return chdir(dir); }
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2419:27: error: use of undeclared identifier 'read'; did you mean 'Read'?
      return static_cast<int>(read(fd, buf, count));
    [  8%] Building CXX object src/base/CMakeFiles/ozz_base.dir/containers/string_archive.cc.o
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2418:12: note: 'Read' declared here
    inline int Read(int fd, void* buf, unsigned int count) {
    [  8%] Building CXX object src/animation/runtime/CMakeFiles/ozz_animation.dir/local_to_model_job.cc.o
    [  8%] Building CXX object src/animation/offline/collada/tinyxml/CMakeFiles/tinyxml.dir/tinyxmlerror.cpp.o
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2422:27: error: use of undeclared identifier 'write'; did you mean 'Write'?
      return static_cast<int>(write(fd, buf, count));
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2421:12: note: 'Write' declared here
    inline int Write(int fd, const void* buf, unsigned int count) {
    /usr/home/razor/Documents/ozz-animation/test/../extern/gtest/fused-src/gtest/gtest.h:2424:35: error: use of undeclared identifier 'close'
    inline int Close(int fd) { return close(fd); }
    [  9%] Building CXX object src/animation/offline/collada/tinyxml/CMakeFiles/tinyxml.dir/tinyxmlparser.cpp.o
    [ 10%] Building CXX object src/animation/runtime/CMakeFiles/ozz_animation.dir/sampling_job.cc.o
    [ 11%] Building CXX object src/animation/offline/tools/CMakeFiles/ozz_animation_offline_tools.dir/convert2skel.cc.o
    [ 12%] Building CXX object src/animation/offline/CMakeFiles/ozz_animation_offline.dir/animation_builder.cc.o
    [ 12%] Building CXX object src/base/CMakeFiles/ozz_base.dir/io/archive.cc.o
    [ 13%] Building CXX object src/base/CMakeFiles/ozz_base.dir/io/stream.cc.o
    6 errors generated.
    --- test/gtest/CMakeFiles/gtest.dir/fused-src/gtest/gtest_main.cc.o ---
    *** [test/gtest/CMakeFiles/gtest.dir/fused-src/gtest/gtest_main.cc.o] Error code 1
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    1 error
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    --- test/gtest/CMakeFiles/gtest.dir/all ---
    *** [test/gtest/CMakeFiles/gtest.dir/all] Error code 2
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    A failure has been detected in another branch of the parallel make
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    --- src/base/CMakeFiles/ozz_base.dir/all ---
    *** [src/base/CMakeFiles/ozz_base.dir/all] Error code 2
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    A failure has been detected in another branch of the parallel make
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    --- src/animation/offline/collada/tinyxml/CMakeFiles/tinyxml.dir/all ---
    *** [src/animation/offline/collada/tinyxml/CMakeFiles/tinyxml.dir/all] Error code 2
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    A failure has been detected in another branch of the parallel make
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    --- src/options/CMakeFiles/ozz_options.dir/all ---
    *** [src/options/CMakeFiles/ozz_options.dir/all] Error code 2
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    A failure has been detected in another branch of the parallel make
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    --- src/animation/runtime/CMakeFiles/ozz_animation.dir/all ---
    *** [src/animation/runtime/CMakeFiles/ozz_animation.dir/all] Error code 2
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    A failure has been detected in another branch of the parallel make
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    --- src/animation/offline/tools/CMakeFiles/ozz_animation_offline_tools.dir/all ---
    *** [src/animation/offline/tools/CMakeFiles/ozz_animation_offline_tools.dir/all] Error code 2
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    A failure has been detected in another branch of the parallel make
    make[2]: stopped in /usr/home/razor/Documents/ozz-animation/build
    --- src/animation/offline/CMakeFiles/ozz_animation_offline.dir/all ---
    *** [src/animation/offline/CMakeFiles/ozz_animation_offline.dir/all] Error code 2
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    7 errors
    make[1]: stopped in /usr/home/razor/Documents/ozz-animation/build
    *** [all] Error code 2
    make: stopped in /usr/home/razor/Documents/ozz-animation/build
    1 error
    make: stopped in /usr/home/razor/Documents/ozz-animation/build

    Maxfx CMakeError.txt CMakeOutput.txt

    opened by Martinfx 10
  • Animation Playback

    Animation Playback

    I'm not sure what I am missing, attempting to use the 'Animation Playback' example ends up leaving my model in it's T-Pose and just kind of having a seizure.

    	void updateUniformBuffer(const uint32_t &currentImage) {
    		endFrame = std::chrono::high_resolution_clock::now();
    		deltaFrame = std::chrono::duration<double, std::milli>(endFrame - startFrame).count();
    		startFrame = endFrame;
    		ubo.model = Model;
    		ubo.Animated = true;
    		controller_.Update(animation_, deltaFrame);
    		//	Samples optimized animation at t = animation_time_
    		ozz::animation::SamplingJob sampling_job;
    		sampling_job.animation = &animation_;
    		sampling_job.context = &context_;
    		sampling_job.ratio = controller_.time_ratio();
    		sampling_job.output = make_span(locals_);
    		if (!sampling_job.Run()) {
    			printf("Sampling Job Failed\n");
    		//	Converts from local space to model space matrices
    		ozz::animation::LocalToModelJob ltm_job;
    		ltm_job.skeleton = &skeleton_;
    		ltm_job.input = make_span(locals_);
    		ltm_job.output = make_span(models_);
    		if (!ltm_job.Run()) {
    			printf("LocalToModel Job Failed\n");
    		auto joints = skeleton_.num_joints();
    		//printf("UBO Joints %i\n", joints);
    		for (int i = 0; i < joints; i++) {
    			//	glm_row* == Final Bone Matrix Sent To GPU
    			//	ozz_row* == Bone Matrix After Animation
    			glm::vec4* glm_row1 = &ubo.bones[i][0];
    			ozz::math::SimdFloat4 ozz_row1 = models_[i].cols[0];
    			glm_row1->x = ozz_row1.m128_f32[0];
    			glm_row1->y = ozz_row1.m128_f32[1];
    			glm_row1->z = ozz_row1.m128_f32[2];
    			glm_row1->w = ozz_row1.m128_f32[3];
    			glm::vec4* glm_row2 = &ubo.bones[i][1];
    			ozz::math::SimdFloat4 ozz_row2 = models_[i].cols[1];
    			glm_row2->x = ozz_row2.m128_f32[0];
    			glm_row2->y = ozz_row2.m128_f32[1];
    			glm_row2->z = ozz_row2.m128_f32[2];
    			glm_row2->w = ozz_row2.m128_f32[3];
    			glm::vec4* glm_row3 = &ubo.bones[i][2];
    			ozz::math::SimdFloat4 ozz_row3 = models_[i].cols[2];
    			glm_row3->x = ozz_row3.m128_f32[0];
    			glm_row3->y = ozz_row3.m128_f32[1];
    			glm_row3->z = ozz_row3.m128_f32[2];
    			glm_row3->w = ozz_row3.m128_f32[3];
    			glm::vec4* glm_row4 = &ubo.bones[i][3];
    			ozz::math::SimdFloat4 ozz_row4 = models_[i].cols[3];
    			glm_row4->x = ozz_row4.m128_f32[0];
    			glm_row4->y = ozz_row4.m128_f32[1];
    			glm_row4->z = ozz_row4.m128_f32[2];
    			glm_row4->w = ozz_row4.m128_f32[3];
    			ubo.bones[i] = glm::transpose(ubo.bones[i]);
    		//	Send updated bone matrices to GPU
    		_Mesh->updateUniformBuffer(currentImage, ubo);

    I am obviously not doing something right when translating the OZZ LocalToModelJob over into GLM Matricies. Can you point me in the correct direction? My shader is very simple to animate.

    #version 450
    layout(location = 0) in vec3 inPosition;
    layout(location = 1) in vec3 inColor;
    layout(location = 2) in vec2 inTexCoord;
    layout(location = 3) in vec3 inNormal;
    layout(location = 4) in vec4 inBones;
    layout(location = 5) in vec4 inWeights;
    layout(location = 6) in vec3 inTangent;
    layout(location = 0) out vec3 outNormal;
    layout(location = 1) out vec2 outUV;
    layout(location = 2) out vec3 outColor;
    layout(location = 3) out vec4 outWorldPos;
    layout(location = 4) out vec3 outTangent;
    layout(std140, push_constant) uniform CameraPushConstant {
        mat4 view_proj;
        vec4 pos;
    } PushConstants;
    layout(std140, binding = 0) uniform UniformBufferObject {
        mat4 model;
        mat4 bones[128];
        bool animated;
    } ubo;
    void main() {
        //outWorldPos = ubo.model * vec4(inPosition, 1.0);
        if (ubo.animated)
            mat4 skinMat =
                inWeights.x * ubo.bones[int(inBones.x)] +
                inWeights.y * ubo.bones[int(inBones.y)] +
                inWeights.y * ubo.bones[int(inBones.z)] +
                inWeights.y * ubo.bones[int(inBones.w)];
            gl_Position = PushConstants.view_proj * ubo.model * skinMat * vec4(inPosition, 1.0);
        } else {
            gl_Position = PushConstants.view_proj * ubo.model * vec4(inPosition, 1.0);
        outUV = inTexCoord;
    	mat3 mNormal = transpose(inverse(mat3(ubo.model)));
    	outNormal = mNormal * normalize(inNormal);
        outTangent = mNormal * normalize(inTangent);
        outColor = inColor;
    opened by kklouzal 2
  • Fixes deprecated implicit copy warning

    Fixes deprecated implicit copy warning

    Hi and thanks for this wonderful library! I'm proposing a fix for some compilation warnings.

    Compiling with warning flag -Wdeprecated-copy (part of -Wextra) produced this type of warning on clang and gcc:

    /home/cmey/Code/cpp/ozz-animation/include/ozz/base/span.h:65:8: warning: definition of implicit copy constructor for 'span<const ozz::animation::Float3Key>' is deprecated because it has a user-provided copy assignment operator [-Wdeprecated-copy-with-user-provided-copy]
      void operator=(const span& _other) {
    /home/cmey/Code/cpp/ozz-animation/include/ozz/animation/runtime/animation.h:92:48: note: in implicit copy constructor for 'ozz::span<const ozz::animation::Float3Key>' first required here
      span<const Float3Key> translations() const { return translations_; }

    Easy steps to repro on develop:

    cmake -D CMAKE_CXX_FLAGS="-Wdeprecated-copy" ../
    cmake --build .

    I saw 2 occurrences of the warning so there are 2 changes:

    • The first in span.h, where I've added the explicit default copy constructor (a copy operator was already implemented). It turns out the copy constructor is used, because explicitly disabling it with = delete produces errors.
    • The second in intrusive_list_tests.cc, where I've simply updated the disabling of the copy assignment operator to the more modern way. This way there no longer is a user-provided copy assignment operator, which appeases the warning.

    This clears the warnings reported above.

    I've followed the Contributing guidelines:

    • [x] Ran clang-format on the touched files
    • [x] ctest passes locally
    • [x] Appended name to AUTHORS.md

    Hope this helps!

    opened by cmey 0
  • Additive rotation fix

    Additive rotation fix

    Quaternion multiplication rotates lhs by the rhs, but the current implementation of additive rotations on the blending job had the operands swapped.

    Side note: When creating an additive animation the operands are in the right order https://github.com/guillaumeblanc/ozz-animation/blob/master/src/animation/offline/additive_animation_builder.cc#L66

    opened by blaztinn 1
  • What CLI options did you exactly use to create the media/bin/*.ozz animations from FBX files?

    What CLI options did you exactly use to create the media/bin/*.ozz animations from FBX files?

    I'm trying to modify the default pab_walk animation to make the character "walk in place" instead of moving forward. However, the fbx2ozz tool seems to output a bunch of separate files instead of one big .ozz like in this repo.

    Command line used: .\fbx2ozz.exe --file="<PATH>\AnimSrc\walk_fixed2.fbx" # The file is pretty identical to media/fbx/pab/walk.fbx in the repo

    Resulting files: image

    fbx2ozz tool output: https://gist.github.com/osdeverr/76ada6d19c99b9ba3098250450cf580c

    Do I need to use some specific command-line options to make it output one .ozz, or can I just concatenate all the resulting files manually and get the same result? Thanks in advance!

    opened by osdeverr 3
  • error

    error "writing 1 byte into a region of size 0" on gcc release build

    In endianness.h, macro OZZ_BYTE_SWAP causes the issue.

    Fix that works for me, also gets around using temp variable: #define OZZ_BYTE_SWAP(a, b) {a = a ^ b; b = a ^ b; a = a ^ b;}

    opened by Form2 4
  • 0.14.0(Jan 13, 2022)

    Release version 0.14.0

    • Samples

      • [sample_fbx2mesh] Supports vertices part of a skinned mesh but with a weight of 0.
      • [sample_fbx2mesh] Assigns non-influenced vertices to root joint.
    • Library

      • [offline] #124 Fixes incorrect root joint detection bug in glTF importer.
      • [offline] #129 #130 Copy animation name to output in ozz::animation::offline::AdditiveAnimationBuilder.
      • [animation] #103 Allows move constructor and assignment for ozz::animation::Skeleton, ozz::animation::Animation and ozz::animation::Track.
      • [animation] Renames SamplingCache to SamplingJob::Context.
      • [animation] #110 Renames skeleton bind pose to rest pose, to avoid confusion with skinning bind pose.
      • [base] Fixes Float4x4::FromEuler which was swapping pitch and roll.
    • Build pipeline

      • Moves CI to github actions.
      • #59 Adds support for shared libraries on Windows (dll), Linux and MacOS platforms.
      • #111 Removes _GLIBCXX_DEBUG from default build settings as it can create incompatibilities when using prebuilt packages.
      • #122 #137 Adds support for gcc 11 compiler.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.14.0-osx-clang.tar.bz2(12.04 MB)
    ozz-0.14.0-windows32-vs2019.zip(13.38 MB)
    ozz-0.14.0-windows64-vs2019.zip(14.82 MB)
  • 0.13.0(May 21, 2020)

    Release version 0.13.0

    • Tools

      • [gltf2ozz] Command line tool utility to import animations and skeletons from gltf files. gltf2ozz can be configured via command line options and json configuration files, in the exact same way as fbx2ozz.
      • #91 Fixup animation name when used as an output filename (via json configuration wildcard option), so they comply with most os filename restrictions.
    • Samples

      • [skinning] Adds a new sample to explain skinning matrices setup.
    • Build pipeline

      • Enables c++11 feature by default for all targets.
    • Library

      • [animation] Removes skeleton_utils.h IterateMemFun helper that can be replaced by std::bind.
      • [base] Removes ozz::memory::Allocator::Reallocate() function as it's rarely used and complex to overload.
      • [base] Replaces OZZ_NEW and OZZ_DELETE macros with template functions ozz::New and ozz::Delete.
      • [base] Removes ScopedPtr in favor of an alias to standard unique_ptr that remaps to ozz deallocator. Implements make_unique using ozz allocator.
      • [base] Uses template aliasing (using keyword) to redirect ozz to std containers. This allows to get rid of ::Std when using ozz containers.
      • [base] Renames all aliased ozz containers to their original std name: vector, map etc...
      • [base] Renames ozz::Range to ozz::span, ozz::make_range to ozz::make_span to comply with std containers. Range count() and size() methods are renamed to size() and size_bytes() respectively, so this needs special attention to avoid mistakes.
      • [base] Replaces OZZ_ALIGN_OF and OZZ_ALIGN by standard alignof and alignas keywords.
      • [base] Replaces OZZ_STATIC_ASSERT by standard static_assert keyword.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.13.0-osx-clang.tar.bz2(12.05 MB)
    ozz-0.13.0-windows32-vs2017.zip(5.73 MB)
    ozz-0.13.0-windows64-vs2017.zip(12.28 MB)
    ozz-0.13.0-windows64-vs2019.zip(12.25 MB)
  • 0.12.1(Mar 16, 2020)

    Release version 0.12.1

    • Library
      • [base] Fixes memory overwrite when reallocating a buffer of smaller size using ozz default memory allocator.
    Source code(tar.gz)
    Source code(zip)
  • 0.12.0(Dec 17, 2019)

    Release version 0.12.0

    • Library

      • [offline] Simplified AnimationOptimizer settings to a single tolerance and distance. Tolerance is the maximum error that an optimization is allowed to generate on a whole joint hierarchy, while the other parameter is the distance (from the joint) at which error is measured. This second parameter allows to emulate effect on skinning or a long object (sword) attached to a joint (hand).
      • [offline] Adds options to AnimationOptimizer to override optimization settings for a joint. This implicitly have an effect on the whole chain, up to that joint. This allows for example to have aggressive optimization for a whole skeleton, except for the chain that leads to the hand if user wants it to be precise.
      • [offline] Switches AnimationOptimizer and TrackOptimizer to Ramer–Douglas–Peucker decimation algorithm which delivers better precision than original one. It also ensures that first and last points are preserved, avoiding visual issues for looping animations.
      • [offline] Changes order of parameters for IterateJointsDF so it's less error prone.
      • [memory] Implements ScopedPtr smart pointer. ScopedPtr implementation guarantees the pointed object will be deleted, either on destruction of the ScopedPtr, or via an explicit reset / reassignation.
      • [math] Quaternion compare function now takes cosine of half angle as argument, to avoid computing arc cosine for every comparison as the tolerance is usually constant.
      • [base] Replaces ozz::memory::Allocator New and Delete function with OZZ_NEW and OZZ_DELETE macros, in order to provide an interface that supports any type and number of arguments (without requiring c++11).
      • [base] #83 Allows user code to disable definition of global namespace sse _m128 +-/* operators, as they might conflict with other sse math libraries.
    • Samples

      • [optimize] Exposes joint setting overriding option (from AnimationOptimizer) to sample gui. Displays median and maximum error values.
    • Tools

      • Moves keyframe reduction stage for additive animations before computing delta with reference pose. This ensures whole skeleton hierarchy is known before decimating keyframes.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.12.0-osx-clang.tar.bz2(9.36 MB)
    ozz-0.12.0-windows32-vs2017.zip(3.88 MB)
    ozz-0.12.0-windows64-vs2017.zip(10.41 MB)
    ozz-0.12.0-windows64-vs2019.zip(10.38 MB)
  • 0.11.0(Jul 13, 2019)

    Release version 0.11.0

    • Library

      • [animation] Adds two-bone and aim inverse kinematic solvers. They can be used at runtime to procedurally affect joint local-space transforms.
      • [animation] Allows resizing SamplingCache, meaning the can be allocated without knowing the number of joints the cache needs to support.
      • [animation] Allow ozz::animation::LocalToModelJob to partially update a hierarchy, aka all children of a joint. This is useful when changes to a local-space pose has been limited to part of the joint hierarchy, like when applying IK or modifying model-space matrices independently from local-space transform.
      • [animation] Changes ozz::animation::Skeleton joints from breadth-first to depth-first. This change breaks compatibility of previous ozz::animation::offline::RawAnimation, ozz::animation::Animation and ozz::animation::Skeleton archives.
      • [animation] Renames track_triggering_job_stl.h to track_triggering_job_trait.h.
      • [offline] #62 Adds an a way to specify additive animation reference pose to ozz::animation::offline::AdditiveAnimationBuilder.
      • [memory] Removes (too error prone) ozz::memory::Allocator typed allocation functions.
      • [math] Changes all conversion from AxisAngle to use separate arguments for axis and angle. This is more in line with function use cases.
      • [math] Adds quaternions initialization from two vectors.
      • [simd math] Updates simd math functions to prevent unnecessary operations. Some functions now return undefined values for some components, like Dot3 that will return the dot value in x and undefined values for x, y, z. See simd_math.h for each function documentation.
      • [simd math] Implements AVX and FMA optimizations (when enabled at compile time).
      • [simd math] Implements simd quaternions, making it easier and more efficient to use quaternion with other simd math code.
      • [simd math] Exposes swizzling operations.
    • Samples

      • [two bone ik] Adds two-bone ik sample, showing how ozz::animation::IKTwoBoneJob can be used on a robot arm.
      • [look at] Adds a look-at sample, using ozz::animation::IKAimJob on a chain of bones to distribute aiming contribution to more than a single joint.
      • [foot_ik] Adds foot-ik sample, which corrects character legs and ankles procedurally at runtime, as well as character/pelvis height, so that the feet can touch and adapt to the ground.
    • Build pipeline

      • Adds support for fbx sdk 2019. This version is now mandatory for vs2017 builds.
      • Add support to macos 10.14 Mojave and Xcode 10.0.
    • Tools

      • Adds point and vector property types (used to import tracks). These two types are actually float3 types, with scene axis and unit conversion applied.
      • Adds an option to importer tools to select additive animation reference pose.
    • Build pipeline

      • #40 Adds ozz_build_postfix option.
      • #41 Adds ozz_build_tools option.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.11.0-osx-clang.tar.bz2(10.07 MB)
    ozz-0.11.0-windows32-vs2017.zip(9.75 MB)
    ozz-0.11.0-windows64-vs2017.zip(11.19 MB)
  • 0.10.0(Jun 29, 2018)

    Release version 0.10.0

    • Library
      • [animation] Adds user-channel feature #4. ozz now offers tracks of float, float2, float3, float4 and quaternion for both raw/offline and runtime. A track can be used to store animated user-data, aka data that aren't joint transformations. Runtime jobs allow to query a track value for any time t (ozz::animation::TrackSamplingJob), or to find all rising and falling edges that happened during a period of time (ozz::animation::TrackTriggeringJob). Utilities allow to optimize a raw track (ozz::animation::offline::TrackOptimizer) and build a runtime track (ozz::animation::offline::TrackOptimizer). fbx2ozz comes with the ability to import tracks from fbx node properties.
      • [animation] Changed ozz::animation::SamplingJob::time (in interval [0,duration]) to a ratio (in unit interval [0,1]). This is a breaking change, aiming to unify sampling of animations and tracks. To conform with this change, sampling time should simply be divided by animation duration. ozz::sample:AnimationController has been updated accordingly. Offline animations and tools aren't impacted.
      • [base] Changes non-intrusive serialization mechanism to use a specialize template struct "Extern" instead of function overloading.
    • Tools
      • Merged *2skel and *2anim in a single tool (*2ozz, fbx2ozz for fbx importer) where all options are specified as a json config file. List of options with default values are available in src/animation/offline/tools/reference.json file. Consequently, ozz_animation_offline_skel_tools and ozz_animation_offline_anim_tools are also merged into a single ozz_animation_tools library.
      • Adds options to import user-channel tracks (from node properties for fbx) using json "animations[].tracks[].properties[]" definition.
      • Adds an option while importing skeletons to choose scene node types that must be considered as skeleton joints, ie not restricting to scene joints only. This is useful for the baked sample for example, which animates mesh nodes.
    • Build pipeline
      • ozz optionnaly supports c++11 compiler.
      • Adds ozz_build_data option (OFF by default), to avoid building data on every code change. Building data takes time indeed, and isn't required on every change. It should be turned ON when output format changes to update all data again.
      • Removes fused source files from the depot. Fused files are generated during build to ${PROJECT_BINARY_DIR}/src_fused/ folder. To generate fused source files without building the whole project, then build BUILD_FUSE_ALL target with "cmake --build . --target BUILD_FUSE_ALL" command.
      • Adds support for Visual Studio 15 2017, drops Visual Studio 11 2012.
    • Samples
      • [user_channel] Adds new user-channel sample, demonstrating usage of user-channel tracks API and import pipeline usage.
      • [sample_fbx2mesh] Remaps joint indices to the smaller range of skeleton joints that are actually used by the skinning. It's now required to index skeleton matrices using ozz::sample::framework:Mesh::joint_remaps when build skinning matrices.
      • [multithread] Switched from OpenMP to c++11 std::async API to implement a parallel-for loop over all computation tasks.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.10.0-osx-clang.tar.bz2(12.43 MB)
    ozz-0.10.0-windows32-vs2017.zip(10.68 MB)
    ozz-0.10.0-windows64-vs2017.zip(12.31 MB)
  • 0.9.1(May 29, 2017)

    Release version 0.9.1

    • Build pipeline
      • Allows to use ozz-animation from another project using cmake add_subdirectory() command, conforming with online documentation.
      • Adds Travis-CI (http://travis-ci.org/guillaumeblanc/ozz-animation) and AppVeyor (http://ci.appveyor.com/project/guillaumeblanc/ozz-animation) continuous integration support.
      • Exposes MSVC /MD and /MT option (ozz_build_msvc_rt_dll). Default is /MD, same as MSVC/cmake.
      • Adds support for Xcode 8.3.2 (fbx specific compilation option).
    Source code(tar.gz)
    Source code(zip)
  • 0.9.0(Dec 9, 2016)

    Release version 0.9.0

    • Library
      • [offline] #5 MultiTakes support. Allows importing of all animations from a DCC file with a single command. fbx2anim now support the use of the wildcard character '*' in the --animation option (output file name), which is replaced with the imported animation names when the output file is written to disk.
      • [offline] Uses scene frame rate as the default sampling rate option in fbx2anim. Allows to match DCC keys and avoid interpolation issues while importing from fbx sdk.
      • [offline] Removes dae2* tools, offline libraries and dependencies. Collada is still supported through fbx2* tools suite, as they are based on the Autodesk Fbx sdk.
      • [offline][animation] Adds a name to the offline::RawAnimation and Animation data structure. ozz::animation::Animation serialization format has changed, animations generated with a previous version need to be re-built.
      • [animation] Optimizes animation and skeleton allocation strategy, merging all member buffers to a single allocation.
      • [animation] Fixes memory read overrun in ozz::animation::Skeleton while fixing up skeleton joint names.
      • [base] Adds support for Range serialization (as an array) via ozz::io::MakeArray utility.
      • [base] Fixes SSE matrix decomposition implementation which wasn't able to decompose matrices with very small scales.
    • Build pipeline
      • A Fused version of the sources for all libraries can be found in src_fused folder. It is automatically generated by cmake when any library source file changes.
      • Rework build pipeline and media directory to allow to have working samples even if Fbx sdk isn't available to build fbx tools. Media directory now contains pre-built binary data for samples usage.
      • #20 FindFbx.cmake module now supports a version as argument which can be tested in conformance with cmake find_package specifications.
      • Adds a clang-format target that re-formats all sdk sources. This target is not added to the ALL_BUILD target. It must be ran manually.
      • #13 Removes forced MSVC compiler options (SSE, RTC, GS) that are already properly handled by default.
    • Samples
      • [baked] Adds new baked physic sample. Demonstrates how to modify Fbx skeleton importer to build skeletons from custom nodes, and use an animation to drive rigid bodies.
      • [sample_fbx2mesh] Fixes welding of redundant vertices. Re-imported meshes now have significantly less vertices.
      • [sample_fbx2mesh] Adds UVs, tangents and vertex color to ozz::sample::framework::Mesh structure. Meshes generated with a previous version need to be re-built.
      • [framework] Fixes sample first frame time, setting aside time spent initializing.
      • [framework] Supports emscripten webgl canvas resizing.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.9.0-linux64-clang.tar.bz2(18.66 MB)
    ozz-0.9.0-linux64-gcc.tar.bz2(18.87 MB)
    ozz-0.9.0-osx-clang.tar.bz2(16.22 MB)
    ozz-0.9.0-windows32-vs2012.zip(15.91 MB)
    ozz-0.9.0-windows32-vs2013.zip(15.82 MB)
    ozz-0.9.0-windows32-vs2015.zip(15.32 MB)
    ozz-0.9.0-windows64-vs2012.zip(17.87 MB)
    ozz-0.9.0-windows64-vs2013.zip(17.86 MB)
    ozz-0.9.0-windows64-vs2015.zip(17.67 MB)
  • 0.8.0(Mar 10, 2016)

    • Library
      • [animation] Adds additive blending support to ozz::animation::BlendingJob. Animations used for additive blending should be delta animations (relative to the first frame). Use ozz::animation::offline::AdditiveAnimationBuilder to prepare such animations.
      • [animation] Improves quaternion compression scheme by quantizing the 3 smallest components of the quaternion, instead of the firsts 3. This improves numerical accuracy when the restored component (4th) is small. It also allows to pre-multiply each of the 3 smallest components by sqrt(2), maximizing quantization range by over 41%.
      • [offline] Improves animation optimizer process (ozz::animation::offline::AnimationOptimizer) with a new hierarchical translation tolerance. The optimizer now computes the error (a distance) generated from the optimization of a joint on its whole child hierarchy (like the whole arm length and hand when optimizing the shoulder). This provides a better optimization in both quality and quantity.
      • [offline] Adds ozz::animation::offline::AdditiveAnimationBuilder utility to build delta animations that can be used for additive blending. This utility processes a raw animation to calculate the delta transformation from the first key to all subsequent ones, for all tracks.
      • [offline] Adds --additive option to dae2anim and fbx2anim, allowing to output a delta animation suitable for additive blending.
      • [offline] Adds fbx 20161.* sdk support.
    • Build pipeline
      • Adds c++11 build option for gcc/clang compilers. Use cmake ozz_build_cpp11 option.
      • Automatically detects SIMD implementation based on compiler settings. SSE2 implementation is automatically enabled on x64/amd64 targets, or if /arch:SSE2 is selected on MSVC/x86 builds. One could use ozz_build_simd_ref cmake option (OZZ_BUILD_SIMD_REF preprocessor directive) to bypass detection and force reference (aka scalar) implementation. OZZ_HAS_SSE2 is now deprecated.
      • Fixes #3 gcc5 warnings with simd math reference implementation.
      • Fixes #6 by updating to gtest 1.70 to support new platforms (FreeBSD...).
      • Adds Microsoft Visual Studio 14 2015 support.
      • Adds emscripten 1.35 support.
      • Integrate Coverity static analysis (https://scan.coverity.com/projects/guillaumeblanc-ozz-animation).
    • Samples
      • [additive] Adds an additive blending sample which demonstrates the new additive layers available through the ozz::animation::BlendingJob.
      • [optimize] Adds hierarchical translation tolerance parameter to the optimize sample.
      • [skin] Removes sample skin, as from now on skinning is part of the sample framework and used by other samples. See additive sample.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.8.0-linux64-gcc.tar.bz2(17.15 MB)
    ozz-0.8.0-osx-clang.tar.bz2(14.46 MB)
    ozz-0.8.0-windows32-vs2012.zip(14.05 MB)
    ozz-0.8.0-windows32-vs2013.zip(13.97 MB)
    ozz-0.8.0-windows32-vs2015.zip(13.48 MB)
    ozz-0.8.0-windows64-vs2012.zip(16.19 MB)
    ozz-0.8.0-windows64-vs2013.zip(16.17 MB)
    ozz-0.8.0-windows64-vs2015.zip(15.82 MB)
  • 0.7.3(Feb 29, 2016)

  • 0.7.2(Feb 29, 2016)

    • Library
      • [animation] Improves rotations accuracy during animation sampling and blending. Quaternion normalization now uses one more Newton-Raphson step when computing inverse square root.
      • [offline] Fixes fbx animation duration when take duration is different to timeline length.
      • [offline] Bakes fbx axis/unit systems to all transformations, vertices, animations (and so on...), instead of using fbx sdk ConvertScene strategy which only transform scene root. This allows to mix skeleton, animation and meshes imported from any axis/unit system.
      • [offline] Uses bind-pose transformation, instead of identity, for skeleton joints that are not animated in a fbx file.
      • [offline] Adds support to ozz fbx tools (fbx2skel and fbx2anim) for other formats: Autodesk AutoCAD DXF (.dxf), Collada DAE (.dae), 3D Studio 3DS (.3ds) and Alias OBJ (.obj). This toolchain based on fbx sdk will replace dae toolchain (dae2skel and dae2anim) which is now deprecated.
    • HowTos
      • Adds file loading how-to, which demonstrates how to open a file and deserialize an object with ozz archive library.
      • Adds custom skeleton importer how-to, which demonstrates RawSkeleton setup and conversion to runtime skeleton.
      • Adds custom animation importer how-to, which demonstrates RawAnimation setup and conversion to runtime animation.
    • Samples
      • [skin] Skin sample now uses the inverse bind-pose matrices imported from the mesh file, instead of the one computed from the skeleton. This is a more robust solution, which furthermore allow to share the skeleton with meshes using different bind-poses.
      • [skin] Fixes joints weight normalization when importing fbx skin meshes.
      • [framework] Optimizes dynamic vertex buffer object re-allocation strategy.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.7.2-linux64-clang.tar.bz2(16.62 MB)
    ozz-0.7.2-linux64-gcc.tar.bz2(17.06 MB)
    ozz-0.7.2-osx-clang.tar.bz2(14.11 MB)
    ozz-0.7.2-windows32-vs2012.zip(13.68 MB)
    ozz-0.7.2-windows32-vs2013.zip(13.62 MB)
    ozz-0.7.2-windows64-vs2012.zip(15.78 MB)
    ozz-0.7.2-windows64-vs2013.zip(15.78 MB)
  • 0.7.0(Feb 28, 2016)

    • Library
      • [geometry] Adds support for matrix palette skinning transformation in a new ozz_geometry library.
      • [offline] Returns EXIT_FAILURE from dae2skel and fbx2skel when no skeleton found in the source file.
      • [offline] Fixes fbx axis and unit system conversions.
      • [offline] Removes raw_skeleton_archive.h and raw_animation_archive.h files, moving serialization definitions back to raw_skeleton.h and raw_animation.h to simplify understanding.
      • [offline] Removes skeleton_archive.h and animation_archive.h files, moving serialization definitions back to skeleton.h and animation.h.
      • [base] Changes Range<>::Size() definition, returning range's size in bytes instead of element count.
    • Samples
      • Adds a skinning sample which demonstrates new ozz_geometry SkinningJob feature and usage.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.7.0-linux64-gcc.tar.bz2(8.21 MB)
    ozz-0.7.0-osx-clang.tar.bz2(6.88 MB)
    ozz-0.7.0-windows32-vs2012.zip(7.54 MB)
    ozz-0.7.0-windows32-vs2013.zip(3.12 MB)
    ozz-0.7.0-windows64-vs2012.zip(8.51 MB)
    ozz-0.7.0-windows64-vs2013.zip(3.28 MB)
  • 0.6.0(Feb 28, 2016)

    • Library
      • [animation] Compresses animation key frames memory footprint. Rotation key frames are compressed from 24B to 12B (50%). 3 of the 4 components of the quaternion are quantized to 2B each, while the 4th is restored during sampling. Translation and scale components are compressed to half float, reducing their size from 20B to 12B (40%).
      • [animation] Changes runtime::Animation class serialization format to support compression. Serialization retro-compatibility for this class has not been implemented, meaning that all runtime::Animation must be rebuilt and serialized using usual dae2anim, fbx2anim or using offline::AnimationBuilder utility.
      • [base] Adds float-to-half and half-to-float conversion functions to simd math library.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.6.0-linux64-gcc.tar.bz2(7.94 MB)
    ozz-0.6.0-osx-clang.tar.bz2(6.68 MB)
    ozz-0.6.0-windows32-vs2012.zip(7.27 MB)
    ozz-0.6.0-windows32-vs2013.zip(2.85 MB)
    ozz-0.6.0-windows64-vs2012.zip(8.25 MB)
    ozz-0.6.0-windows64-vs2013.zip(3.01 MB)
  • 0.5.0(Feb 28, 2016)

    • Library
      • [offline] Adds --raw option to *2skel and *2anim command line tools. Allows to export raw skeleton/animation object format instead of runtime objects.
      • [offline] Moves RawAnimation and RawSkeleton from the builder files to raw_animation.h and raw_skeleton.h files.
      • [offline] Renames skeleton_serialize.h and animation_serialize.h to skeleton_archive.h and animation_archive.h for consistency.
      • [offline] Adds RawAnimation and RawSkeleton serialization support with ozz archives.
      • [options] Changes parser command line arguments type from "const char**" to "const char* const_" in order to support implicit casting from arguments of type "char_*".
      • [base] Change ozz::String std redirection from typedef to struct to be coherent with all other std containers redirection.
      • [base] Moves maths archiving file from ozz/base/io to ozz/base/maths for consistency.
      • [base] Adds containers serialization support with ozz archives.
      • [base] Removes ozz fixed size integers in favor of standard types available with <stdint.h> file.
    • Samples
      • Adds Emscripten support to all supported samples.
      • Changes OpenGL rendering to comply with Gles2/WebGL.
    • Build pipeline
      • Adds Emscripten and cross-compilation support to the builder helper python script.
      • Support for CMake 3.x.
      • Adds support for Microsoft Visual Studio 2013.
      • Drops support fot Microsoft Visual Studio 2008 and olders, as a consequence of using <stdint.h>.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.5.0-linux64-gcc.tar.bz2(8.15 MB)
    ozz-0.5.0-osx-clang.tar.bz2(6.86 MB)
    ozz-0.5.0-windows32-vs2012.zip(7.46 MB)
    ozz-0.5.0-windows32-vs2013.zip(3.03 MB)
    ozz-0.5.0-windows64-vs2012.zip(8.44 MB)
    ozz-0.5.0-windows64-vs2013.zip(3.20 MB)
  • 0.4.0(Feb 28, 2016)

    • Library
      • [offline] Adds Fbx import pipeline, through fbx2skel and fbx2anim command line tools.
      • [offline] Adds Fbx import and conversion library, through ozz_animation_offline_fbx. Building fbx related libraries requires fbx sdk to be installed.
      • [offline] Adds ozz_animation_offline_tools library to share the common work for Collada and Fbx import tools. This could be use to implement custom conversion command line tools.
    • Samples
      • Adds Fbx resources to media path.
      • Makes use of Fbx resources with existing samples.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.4.0-linux32-gcc.tar.bz2(8.13 MB)
    ozz-0.4.0-linux64-gcc.tar.bz2(8.46 MB)
    ozz-0.4.0-osx-clang.tar.bz2(7.33 MB)
    ozz-0.4.0-windows32-vs2012.zip(8.06 MB)
    ozz-0.4.0-windows64-vs2012.zip(9.02 MB)
  • 0.3.1(Feb 28, 2016)

    • Samples
      • Adds keyboard camera controls.
    • Build pipeline
      • Adds Mac OSX support, full offline and runtime pipeline, samples, dashboard...
      • Moves dashboard to http://ozz.qualipilote.fr/dashboard/cdash/
      • Improves dashboard configuration, using json configuration files available there: http://ozz.qualipilote.fr/dashboard/config/.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.3.1-linux32-gcc.tar.bz2(2.11 MB)
    ozz-0.3.1-linux64-gcc.tar.bz2(2.39 MB)
    ozz-0.3.1-osx-clang.tar.bz2(1.96 MB)
    ozz-0.3.1-windows32-vs2012.zip(3.61 MB)
    ozz-0.3.1-windows64-vs2012.zip(3.71 MB)
  • 0.3.0(Feb 28, 2016)

    • Library
      • [animation] Adds partial animation blending and masking, through per-joint-weight blending coefficients.
      • [animation] Switches all explicit [begin,end[ ranges (sequence of objects) to ozz::Range structure.
      • [animation] Moves runtime files (.h and .cc) to a separate runtime folder (ozz/animation/runtime).
      • [animation] Removes ozz/animation/utils.h and .cc
      • [options] Detects duplicated command line arguments and reports failure.
      • [base] Adds helper functions to ozz::memory::Allocator to support allocation/reallocation/deallocation of ranges of objects through ozz::Range structure.
    • Samples
      • Adds partial animation blending sample.
      • Adds multi-threading sample, using OpenMp to distribute workload.
      • Adds a sample that demonstrates how to attach an object to animated skeleton joints.
      • Improves skeleton rendering sample utility feature: includes joint rendering.
      • Adds screen-shot and video capture options from samples ui.
      • Adds a command line option (--render/--norender) to enable/disable rendering of sample, used for dashboard unit-tests.
      • Adds time management options, to dissociate (fix) update delta time from the real application time.
      • Improves camera manipulations: disables auto-framing when zooming/panning, adds mouse wheel support for zooming.
      • Fixes sample camera framing to match rendering field of view.
    • Build pipeline
      • Adds CMake python helper tools (build-helper.py). Removes helper .bat files (setup, build, pack...).
      • Adds CDash support to generate nightly build reports. Default CDash server is http://my.cdash.org/index.php?project=Ozz.
      • Adds code coverage testing support using gcov.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.3.0-linux32-gcc.tar.bz2(2.10 MB)
    ozz-0.3.0-linux64-gcc.tar.bz2(2.39 MB)
    ozz-0.3.0-windows32-vs2012.zip(3.59 MB)
    ozz-0.3.0-windows64-vs2012.zip(3.70 MB)
  • 0.2.0(Feb 28, 2016)

    • Library
      • [animation] Adds animation blending support.
      • [animation] Sets maximum skeleton joints to 1023 (aka Skeleton::kMaxJointsNumBits) to improve packing and allow stack allocations.
      • [animation] Adds Skeleton::kRootIndex enum for parent index of a root joint.
      • [base] Adds signed/unsigned bit shift functions to simd library.
      • [base] Fixes SSE build flags for Visual Studio 64b builds.
    • Samples
      • Adds blending sample.
      • Adds playback controller utility class to the sample framework.
    Source code(tar.gz)
    Source code(zip)
    ozz-0.2.0-linux32-gcc.tar.bz2(1.16 MB)
    ozz-0.2.0-linux64-gcc.tar.bz2(1.13 MB)
    ozz-0.2.0-windows32-vs2012.zip(2.01 MB)
    ozz-0.2.0-windows64-vs2012.zip(2.18 MB)
  • 0.1.0(Feb 28, 2016)

    • Library
      • [animation] Support for run-time animation sampling.
      • [offline] Support for building run-time animation and skeleton from a raw (aka offline/user friendly) format.
      • [offline] Full Collada import pipeline (lib and tools).
      • [offline] Support for animation key-frame optimizations.
      • [base] Memory management redirection.
      • [base] Containers definition.
      • [base] Serialization and IO utilities implementation.
      • [base] scalar and vector maths, SIMD (SSE) and SoA implementation.
      • [options] Command line parsing utility.
    • Samples
      • Playback sample, loads and samples an animation.
      • Millipede sample, offline pipeline usage.
      • Optimize sample, offline optimization pipeline.
    • Build pipeline
      • CMake based build pipeline.
      • CTest/GTest based unit test framework.
    Source code(tar.gz)
    Source code(zip)
Use the spline-interpolation method to a origin sine-wave data(40 MHz) captured by 250M sampling rate

Spline-Interpolation-Project Goals When we obtain some data that is discrete data, eg: from the the Analog-to-digital converter card, we need to resto

Yi-Jan Huang (Eason) 1 Jan 20, 2022
VGG Runtime for loading design and running emulated apps.

VGG Runtime A design engine capable of loading design drafts as well as running design as an emulated app. Features Game-engine-like ECS architecture

Very Good Graphics 19 Jan 7, 2022
USB to interfaces implementing MicroPython "machine" module functionalities on a computer.

u2if project u2if(USB to interfaces) is an attempt to implement some of the MicroPython "machine" module functionalities on a computer. The goal is to

null 90 Jun 23, 2022
Dump the ROM from an Original Xbox DVD Movie Playback IR Dongle

Dongle Dumper. Dump the firmware off a Original Xbox DVD Movie Playback Dongle straight from the console. The dongle contains a ROM with an XBE which

null 9 Jun 15, 2022
Well-organized, commented and documented sample project that shows the basic functionalities of the 42's mlx library.

miniLibX sample | slucas-s I developed this sample project to play around with the basic functionalities of the miniLibX, the simple graphics library

S. Lucas Serrano 36 Jun 22, 2022
A multiplatform C++ library for common and basic system functionalities.

axl.cm A multiplatform C++ library for common and basic system functionalities. Platforms Linux Windows C++ standard minimum: C++98 target: C++11 maxi

Axel 2 Apr 4, 2022
A model checker for the Dynamic Logic of Propositional Assignments (DL-PA) with solving and parameterized random formula generation functionalities.

A model checker for the Dynamic Logic of Propositional Assignments (DL-PA) with solving and parameterized random formula generation functionalities.

Jeffrey Yang 7 Dec 31, 2021
Arduino Sketch and a Web Bluetooth API for loading models and running inference on the Nano Sense 33 BLE device.

TF4Micro Motion Kit This repo contains the Arduino Sketch and a Web Bluetooth API for loading models and running inference on the device. Install and

Google Creative Lab 46 Jun 24, 2022
A simple utility for loading custom firmware onto the PS5 camera, using libusb.

A simple utility for loading custom firmware onto the PS5 camera, using libusb.

Raleigh Littles 13 May 16, 2022
A repository for experimenting with elf loading and in-place patching of android native libraries on non-android operating systems.

droidports: A repository for experimenting with elf loading and in-place patching of android native libraries on non-android operating systems. Discla

João Henrique 21 Jun 13, 2022
LibEFT: an EFT loading DLL for Emergency mods!

LibEFT: an EFT loading DLL for Emergency mods! "Ladies and gentlemen, I present... The disguised S3TC texture. There's no way it's anything else. I di

null 2 Dec 18, 2021
Loading dbk64.sys and grabbing a handle to it

ceload A tool that allows you to manually load up CheatEngine's signed driver and get a handle to it for various kernel hacking operations. The code i

Layle | Luca 115 Jun 27, 2022
A crate for loading data from the aseprite sprite editor

aseprite A crate for loading data from the aseprite sprite editor. Should go along well with the tiled crate, I hope! It does not load any actual imag

null 28 Feb 17, 2022
Allows to join RDF of previous expansions on a higher character level

mod-rdf-expansion Allows to join RDF of previous expansions on a higher character level. Up to character level 58, you can join the "Random Classic Du

AzerothCore 3 Apr 3, 2022
Get Next Line is a project at 42. It is a function that reads a file and allows you to read a line ending with a newline character from a file descriptor

Get Next Line is a project at 42. It is a function that reads a file and allows you to read a line ending with a newline character from a file descriptor. When you call the function again on the same file, it grabs the next line

Mhamed Ajjig 3 May 17, 2022
A C++ concepts and range based character encoding and code point enumeration library

Travis CI (Linux:gcc) Text_view A C++ Concepts based character encoding and code point enumeration library. This project is the reference implementati

Tom Honermann 123 Jun 20, 2022
Simple library to interface with Hitachi-compatible character LCDs for the Sipeed Tang Nano 4K Gowin FPGA board.

Simple library to interface with Hitachi-compatible character LCDs for the Sipeed Tang Nano 4K Gowin FPGA board.

null 3 Jun 22, 2022
Edit a PF-DTA content in hex on a side-by-side display of EBCDIC character representation.

AS400 Hex Editor Edit a PF-DTA content in hex on a side-by-side display of EBCDIC character representation. Introduction This tool was written to edit

Project Vulcan 6 May 3, 2022
It creates a random word by mixing two English common words into a single one, each one with the first character in capital letter. It also allow you to scroll down infinitely without repeating the same word twice.

startup_namer A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if

Samuel Cobas 2 Feb 3, 2022