Skip to content

Commit

Permalink
Merge pull request nfrechette#2 from nfrechette/feature/fixed-quantiz…
Browse files Browse the repository at this point in the history
…ation

Feature/fixed quantization
  • Loading branch information
nfrechette authored Jun 12, 2017
2 parents aa6d664 + 28abad4 commit 6583aea
Show file tree
Hide file tree
Showing 10 changed files with 237 additions and 169 deletions.
2 changes: 1 addition & 1 deletion includes/acl/algorithm/ialgorithm.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ namespace acl
public:
virtual ~IAlgorithm() {}

virtual CompressedClip* compress_clip(Allocator& allocator, const AnimationClip& clip, const RigidSkeleton& skeleton, RotationFormat8 rotation_format) = 0;
virtual CompressedClip* compress_clip(Allocator& allocator, const AnimationClip& clip, const RigidSkeleton& skeleton, RotationFormat8 rotation_format, VectorFormat8 translation_format) = 0;

virtual void decompress_pose(const CompressedClip& clip, float sample_time, Transform_32* out_transforms, uint16_t num_transforms) = 0;
virtual void decompress_bone(const CompressedClip& clip, float sample_time, uint16_t sample_bone_index, Quat_32* out_rotation, Vector4_32* out_translation) = 0;
Expand Down
4 changes: 2 additions & 2 deletions includes/acl/algorithm/uniformly_sampled/algorithm.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ namespace acl
class UniformlySampledAlgorithm final : public IAlgorithm
{
public:
virtual CompressedClip* compress_clip(Allocator& allocator, const AnimationClip& clip, const RigidSkeleton& skeleton, RotationFormat8 rotation_format) override
virtual CompressedClip* compress_clip(Allocator& allocator, const AnimationClip& clip, const RigidSkeleton& skeleton, RotationFormat8 rotation_format, VectorFormat8 translation_format) override
{
return uniformly_sampled::compress_clip(allocator, clip, skeleton, rotation_format);
return uniformly_sampled::compress_clip(allocator, clip, skeleton, rotation_format, translation_format);
}

virtual void decompress_pose(const CompressedClip& clip, float sample_time, Transform_32* out_transforms, uint16_t num_transforms) override
Expand Down
100 changes: 66 additions & 34 deletions includes/acl/algorithm/uniformly_sampled/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,49 +33,81 @@ namespace acl
{
namespace uniformly_sampled
{
struct FullPrecisionConstants
namespace impl
{
static constexpr uint32_t NUM_TRACKS_PER_BONE = 2;
static constexpr uint32_t BITSET_WIDTH = 32;
};
struct FullPrecisionConstants
{
static constexpr uint32_t NUM_TRACKS_PER_BONE = 2;
static constexpr uint32_t BITSET_WIDTH = 32;
};

struct FullPrecisionHeader
{
uint16_t num_bones;
RotationFormat8 rotation_format;
uint32_t num_samples;
uint32_t sample_rate; // TODO: Store duration as float instead
uint32_t num_animated_rotation_tracks; // TODO: Calculate from bitsets?
uint32_t num_animated_translation_tracks; // TODO: Calculate from bitsets?
struct FullPrecisionHeader
{
uint16_t num_bones;
RotationFormat8 rotation_format;
VectorFormat8 translation_format;
uint32_t num_samples;
uint32_t sample_rate; // TODO: Store duration as float instead
uint32_t num_animated_rotation_tracks; // TODO: Calculate from bitsets?
uint32_t num_animated_translation_tracks; // TODO: Calculate from bitsets?

PtrOffset16<uint32_t> default_tracks_bitset_offset;
PtrOffset16<uint32_t> constant_tracks_bitset_offset;
PtrOffset16<uint8_t> constant_track_data_offset;
PtrOffset16<uint8_t> track_data_offset;
PtrOffset16<uint32_t> default_tracks_bitset_offset;
PtrOffset16<uint32_t> constant_tracks_bitset_offset;
PtrOffset16<uint8_t> constant_track_data_offset;
PtrOffset16<uint8_t> track_data_offset;

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

uint32_t* get_default_tracks_bitset() { return default_tracks_bitset_offset.add_to(this); }
const uint32_t* get_default_tracks_bitset() const { return default_tracks_bitset_offset.add_to(this); }
uint32_t* get_default_tracks_bitset() { return default_tracks_bitset_offset.add_to(this); }
const uint32_t* get_default_tracks_bitset() const { return default_tracks_bitset_offset.add_to(this); }

uint32_t* get_constant_tracks_bitset() { return constant_tracks_bitset_offset.add_to(this); }
const uint32_t* get_constant_tracks_bitset() const { return constant_tracks_bitset_offset.add_to(this); }
uint32_t* get_constant_tracks_bitset() { return constant_tracks_bitset_offset.add_to(this); }
const uint32_t* get_constant_tracks_bitset() const { return constant_tracks_bitset_offset.add_to(this); }

uint8_t* get_constant_track_data() { return constant_track_data_offset.add_to(this); }
const uint8_t* get_constant_track_data() const { return constant_track_data_offset.add_to(this); }
uint8_t* get_constant_track_data() { return constant_track_data_offset.add_to(this); }
const uint8_t* get_constant_track_data() const { return constant_track_data_offset.add_to(this); }

uint8_t* get_track_data() { return track_data_offset.add_to(this); }
const uint8_t* get_track_data() const { return track_data_offset.add_to(this); }
};
uint8_t* get_track_data() { return track_data_offset.add_to(this); }
const uint8_t* get_track_data() const { return track_data_offset.add_to(this); }
};

constexpr FullPrecisionHeader& get_full_precision_header(CompressedClip& clip)
{
return *add_offset_to_ptr<FullPrecisionHeader>(&clip, sizeof(CompressedClip));
}
constexpr FullPrecisionHeader& get_full_precision_header(CompressedClip& clip)
{
return *add_offset_to_ptr<FullPrecisionHeader>(&clip, sizeof(CompressedClip));
}

constexpr const FullPrecisionHeader& get_full_precision_header(const CompressedClip& clip)
{
return *add_offset_to_ptr<const FullPrecisionHeader>(&clip, sizeof(CompressedClip));
}
constexpr const FullPrecisionHeader& get_full_precision_header(const CompressedClip& clip)
{
return *add_offset_to_ptr<const FullPrecisionHeader>(&clip, sizeof(CompressedClip));
}

// TODO: constexpr
inline uint32_t get_rotation_size(RotationFormat8 rotation_format)
{
switch (rotation_format)
{
case RotationFormat8::Quat_128: return sizeof(float) * 4;
case RotationFormat8::Quat_96: return sizeof(float) * 3;
case RotationFormat8::Quat_48: return sizeof(uint16_t) * 3;
case RotationFormat8::Quat_32: return sizeof(uint32_t);
default:
ACL_ENSURE(false, "Invalid or unsupported rotation format: %s", get_rotation_format_name(rotation_format));
return 0;
}
}

// TODO: constexpr
inline uint32_t get_translation_size(VectorFormat8 translation_format)
{
switch (translation_format)
{
case VectorFormat8::Vector3_96: return sizeof(float) * 3;
case VectorFormat8::Vector3_48: return sizeof(uint16_t) * 3;
default:
ACL_ENSURE(false, "Invalid or unsupported translation format: %s", get_vector_format_name(translation_format));
return 0;
}
}
}
}
}
Loading

0 comments on commit 6583aea

Please sign in to comment.