Updated meshoptimizer.
This commit is contained in:
parent
eeb5fe7c02
commit
4e97181cd9
4
3rdparty/meshoptimizer/src/meshoptimizer.h
vendored
4
3rdparty/meshoptimizer/src/meshoptimizer.h
vendored
@ -219,9 +219,13 @@ MESHOPTIMIZER_API int meshopt_decodeVertexBuffer(void* destination, size_t verte
|
|||||||
*
|
*
|
||||||
* meshopt_decodeFilterQuat decodes 3-component quaternion encoding with K-bit (4 <= K <= 16) component encoding and a 2-bit component index indicating which component to reconstruct.
|
* meshopt_decodeFilterQuat decodes 3-component quaternion encoding with K-bit (4 <= K <= 16) component encoding and a 2-bit component index indicating which component to reconstruct.
|
||||||
* Each component is stored as an 16-bit integer; stride must be equal to 8.
|
* Each component is stored as an 16-bit integer; stride must be equal to 8.
|
||||||
|
*
|
||||||
|
* meshopt_decodeFilterExp decodes exponential encoding of floating-point data with 8-bit exponent and 24-bit integer mantissa as 2^E*M.
|
||||||
|
* Each 32-bit component is decoded in isolation; stride must be divisible by 4.
|
||||||
*/
|
*/
|
||||||
MESHOPTIMIZER_EXPERIMENTAL void meshopt_decodeFilterOct(void* buffer, size_t vertex_count, size_t vertex_size);
|
MESHOPTIMIZER_EXPERIMENTAL void meshopt_decodeFilterOct(void* buffer, size_t vertex_count, size_t vertex_size);
|
||||||
MESHOPTIMIZER_EXPERIMENTAL void meshopt_decodeFilterQuat(void* buffer, size_t vertex_count, size_t vertex_size);
|
MESHOPTIMIZER_EXPERIMENTAL void meshopt_decodeFilterQuat(void* buffer, size_t vertex_count, size_t vertex_size);
|
||||||
|
MESHOPTIMIZER_EXPERIMENTAL void meshopt_decodeFilterExp(void* buffer, size_t vertex_count, size_t vertex_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Experimental: Mesh simplifier
|
* Experimental: Mesh simplifier
|
||||||
|
57
3rdparty/meshoptimizer/src/vertexfilter.cpp
vendored
57
3rdparty/meshoptimizer/src/vertexfilter.cpp
vendored
@ -96,6 +96,29 @@ static void decodeFilterQuat(short* data, size_t count)
|
|||||||
data[i * 4 + order[qc][3]] = short(wf);
|
data[i * 4 + order[qc][3]] = short(wf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void decodeFilterExp(unsigned int* data, size_t count)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
unsigned int v = data[i];
|
||||||
|
|
||||||
|
// decode mantissa and exponent
|
||||||
|
int m = int(v << 8) >> 8;
|
||||||
|
int e = int(v) >> 24;
|
||||||
|
|
||||||
|
union {
|
||||||
|
float f;
|
||||||
|
unsigned int ui;
|
||||||
|
} u;
|
||||||
|
|
||||||
|
// optimized version of ldexp(float(m), e)
|
||||||
|
u.ui = unsigned(e + 127) << 23;
|
||||||
|
u.f = u.f * float(m);
|
||||||
|
|
||||||
|
data[i] = u.ui;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SIMD_WASM
|
#ifdef SIMD_WASM
|
||||||
@ -277,6 +300,26 @@ static void decodeFilterQuatSimd(short* data, size_t count)
|
|||||||
out[3] = __builtin_rotateleft64(wasm_i64x2_extract_lane(res_1, 1), wasm_i32x4_extract_lane(cm, 3));
|
out[3] = __builtin_rotateleft64(wasm_i64x2_extract_lane(res_1, 1), wasm_i32x4_extract_lane(cm, 3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void decodeFilterExpSimd(unsigned int* data, size_t count)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < count; i += 4)
|
||||||
|
{
|
||||||
|
v128_t v = wasm_v128_load(&data[i]);
|
||||||
|
|
||||||
|
// decode exponent into 2^x directly
|
||||||
|
v128_t ef = wasm_i32x4_shr(v, 24);
|
||||||
|
v128_t es = wasm_i32x4_shl(wasm_i32x4_add(ef, wasm_i32x4_splat(127)), 23);
|
||||||
|
|
||||||
|
// decode 24-bit mantissa into floating-point value
|
||||||
|
v128_t mf = wasm_i32x4_shr(wasm_i32x4_shl(v, 8), 8);
|
||||||
|
v128_t m = wasm_f32x4_convert_i32x4(mf);
|
||||||
|
|
||||||
|
v128_t r = wasm_f32x4_mul(es, m);
|
||||||
|
|
||||||
|
wasm_v128_store(&data[i], r);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace meshopt
|
} // namespace meshopt
|
||||||
@ -316,4 +359,18 @@ void meshopt_decodeFilterQuat(void* buffer, size_t vertex_count, size_t vertex_s
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void meshopt_decodeFilterExp(void* buffer, size_t vertex_count, size_t vertex_size)
|
||||||
|
{
|
||||||
|
using namespace meshopt;
|
||||||
|
|
||||||
|
assert(vertex_count % 4 == 0);
|
||||||
|
assert(vertex_size % 4 == 0);
|
||||||
|
|
||||||
|
#if defined(SIMD_WASM)
|
||||||
|
decodeFilterExpSimd(static_cast<unsigned int*>(buffer), vertex_count * (vertex_size / 4));
|
||||||
|
#else
|
||||||
|
decodeFilterExp(static_cast<unsigned int*>(buffer), vertex_count * (vertex_size / 4));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#undef SIMD_WASM
|
#undef SIMD_WASM
|
||||||
|
Loading…
Reference in New Issue
Block a user