58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Created by martin on 10.12.21.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "ozzutils.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <ozz/base/maths/simd_math.h>
							 | 
						||
| 
								 | 
							
								#define OZZ_INCLUDE_PRIVATE_HEADER
							 | 
						||
| 
								 | 
							
								#include "../src/animation/runtime/animation_keyframe.h"
							 | 
						||
| 
								 | 
							
								#undef OZZ_INCLUDE_PRIVATE_HEADER
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void calc_bone_translation(
							 | 
						||
| 
								 | 
							
								    float ratio,
							 | 
						||
| 
								 | 
							
								    int i_bone_idx,
							 | 
						||
| 
								 | 
							
								    const ozz::animation::Animation* i_animation,
							 | 
						||
| 
								 | 
							
								    ozz::math::Transform& o_transform) {
							 | 
						||
| 
								 | 
							
								  int key_idx = 1;
							 | 
						||
| 
								 | 
							
								  const ozz::span<const ozz::animation::Float3Key>& translations =
							 | 
						||
| 
								 | 
							
								      i_animation->translations();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  int key_idx_prev = 0;
							 | 
						||
| 
								 | 
							
								  int key_idx_next = 0;
							 | 
						||
| 
								 | 
							
								  while (key_idx < translations.size()) {
							 | 
						||
| 
								 | 
							
								    key_idx_next = key_idx;
							 | 
						||
| 
								 | 
							
								    if (translations[key_idx].track == i_bone_idx) {
							 | 
						||
| 
								 | 
							
								      if (translations[key_idx].ratio < ratio) {
							 | 
						||
| 
								 | 
							
								        key_idx_prev = key_idx;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    key_idx++;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const ozz::animation::Float3Key& key_prev = translations[key_idx_prev];
							 | 
						||
| 
								 | 
							
								  const ozz::animation::Float3Key& key_next = translations[key_idx_next];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  float r = 0.f;
							 | 
						||
| 
								 | 
							
								  if (key_prev.ratio != key_next.ratio) {
							 | 
						||
| 
								 | 
							
								    r = (ratio - key_prev.ratio) / (key_next.ratio - key_prev.ratio);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  o_transform.translation.x =
							 | 
						||
| 
								 | 
							
								      ozz::math::HalfToFloat(key_prev.value[0])
							 | 
						||
| 
								 | 
							
								      + r
							 | 
						||
| 
								 | 
							
								            * (ozz::math::HalfToFloat(key_next.value[0])
							 | 
						||
| 
								 | 
							
								               - ozz::math::HalfToFloat(key_prev.value[0]));
							 | 
						||
| 
								 | 
							
								  o_transform.translation.y =
							 | 
						||
| 
								 | 
							
								      ozz::math::HalfToFloat(key_prev.value[1])
							 | 
						||
| 
								 | 
							
								      + r
							 | 
						||
| 
								 | 
							
								            * (ozz::math::HalfToFloat(key_next.value[1])
							 | 
						||
| 
								 | 
							
								               - ozz::math::HalfToFloat(key_prev.value[1]));
							 | 
						||
| 
								 | 
							
								  o_transform.translation.z =
							 | 
						||
| 
								 | 
							
								      ozz::math::HalfToFloat(key_prev.value[2])
							 | 
						||
| 
								 | 
							
								      + r
							 | 
						||
| 
								 | 
							
								            * (ozz::math::HalfToFloat(key_next.value[2])
							 | 
						||
| 
								 | 
							
								               - ozz::math::HalfToFloat(key_prev.value[2]));
							 | 
						||
| 
								 | 
							
								}
							 |