Skip to content

Commit

Permalink
Merge pull request #207 from zeux/filter-unaligned
Browse files Browse the repository at this point in the history
vertexfilter: Fix decoding of data that's not aligned by 4
  • Loading branch information
zeux authored Dec 21, 2020
2 parents f6c8104 + 4e3d821 commit 513ff4a
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 25 deletions.
64 changes: 48 additions & 16 deletions demo/tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -500,86 +500,118 @@ static void encodeVertexEmpty()

static void decodeFilterOct8()
{
unsigned char data[4 * 4] = {
const unsigned char data[4 * 4] = {
0, 1, 127, 0,
0, 187, 127, 1,
255, 1, 127, 0,
14, 130, 127, 1, // clang-format :-/
};

meshopt_decodeFilterOct(data, 4, 4);

const unsigned char expected[4 * 4] = {
0, 1, 127, 0,
0, 159, 82, 1,
255, 1, 127, 0,
1, 130, 241, 1, // clang-format :-/
};

assert(memcmp(data, expected, sizeof(data)) == 0);
// Aligned by 4
unsigned char full[4 * 4];
memcpy(full, data, sizeof(full));
meshopt_decodeFilterOct(full, 4, 4);
assert(memcmp(full, expected, sizeof(full)) == 0);

// Tail processing for unaligned data
unsigned char tail[3 * 4];
memcpy(tail, data, sizeof(tail));
meshopt_decodeFilterOct(tail, 3, 4);
assert(memcmp(tail, expected, sizeof(tail)) == 0);
}

static void decodeFilterOct12()
{
unsigned short data[4 * 4] = {
const unsigned short data[4 * 4] = {
0, 1, 2047, 0,
0, 1870, 2047, 1,
2017, 1, 2047, 0,
14, 1300, 2047, 1, // clang-format :-/
};

meshopt_decodeFilterOct(data, 4, 8);

const unsigned short expected[4 * 4] = {
0, 16, 32767, 0,
0, 32621, 3088, 1,
32764, 16, 471, 0,
307, 28541, 16093, 1, // clang-format :-/
};

assert(memcmp(data, expected, sizeof(data)) == 0);
// Aligned by 4
unsigned short full[4 * 4];
memcpy(full, data, sizeof(full));
meshopt_decodeFilterOct(full, 4, 8);
assert(memcmp(full, expected, sizeof(full)) == 0);

// Tail processing for unaligned data
unsigned short tail[3 * 4];
memcpy(tail, data, sizeof(tail));
meshopt_decodeFilterOct(tail, 3, 8);
assert(memcmp(tail, expected, sizeof(tail)) == 0);
}

static void decodeFilterQuat12()
{
unsigned short data[4 * 4] = {
const unsigned short data[4 * 4] = {
0, 1, 0, 0x7fc,
0, 1870, 0, 0x7fd,
2017, 1, 0, 0x7fe,
14, 1300, 0, 0x7ff, // clang-format :-/
};

meshopt_decodeFilterQuat(data, 4, 8);

const unsigned short expected[4 * 4] = {
32767, 0, 11, 0,
0, 25013, 0, 21166,
11, 0, 23504, 22830,
158, 14715, 0, 29277, // clang-format :-/
};

assert(memcmp(data, expected, sizeof(data)) == 0);
// Aligned by 4
unsigned short full[4 * 4];
memcpy(full, data, sizeof(full));
meshopt_decodeFilterQuat(full, 4, 8);
assert(memcmp(full, expected, sizeof(full)) == 0);

// Tail processing for unaligned data
unsigned short tail[3 * 4];
memcpy(tail, data, sizeof(tail));
meshopt_decodeFilterQuat(tail, 3, 8);
assert(memcmp(tail, expected, sizeof(tail)) == 0);
}

static void decodeFilterExp()
{
unsigned int data[4] = {
const unsigned int data[4] = {
0,
0xff000003,
0x02fffff7,
0xfe7fffff, // clang-format :-/
};

meshopt_decodeFilterExp(data, 4, 4);

const unsigned int expected[4] = {
0,
0x3fc00000,
0xc2100000,
0x49fffffe, // clang-format :-/
};

assert(memcmp(data, expected, sizeof(data)) == 0);
// Aligned by 4
unsigned int full[4];
memcpy(full, data, sizeof(full));
meshopt_decodeFilterExp(full, 4, 4);
assert(memcmp(full, expected, sizeof(full)) == 0);

// Tail processing for unaligned data
unsigned int tail[3];
memcpy(tail, data, sizeof(tail));
meshopt_decodeFilterExp(tail, 3, 4);
assert(memcmp(tail, expected, sizeof(tail)) == 0);
}

static void clusterBoundsDegenerate()
Expand Down
Loading

0 comments on commit 513ff4a

Please sign in to comment.