mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-19 15:52:53 +00:00
438 lines
11 KiB
C++
438 lines
11 KiB
C++
#include "GltfAccessor.h"
|
|
|
|
using namespace gltf;
|
|
|
|
NullAccessor::NullAccessor(const size_t count)
|
|
: m_count(count)
|
|
{
|
|
}
|
|
|
|
bool NullAccessor::GetFloatVec2(const size_t index, float (&out)[2]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 0.0f;
|
|
out[1] = 0.0f;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool NullAccessor::GetFloatVec3(const size_t index, float (&out)[3]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 0.0f;
|
|
out[1] = 0.0f;
|
|
out[2] = 0.0f;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool NullAccessor::GetFloatVec4(const size_t index, float (&out)[4]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 0.0f;
|
|
out[1] = 0.0f;
|
|
out[2] = 0.0f;
|
|
out[3] = 0.0f;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool NullAccessor::GetUnsigned(const size_t index, unsigned& out) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out = 0u;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool NullAccessor::GetUnsignedVec4(const size_t index, unsigned (&out)[4]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 0u;
|
|
out[1] = 0u;
|
|
out[2] = 0u;
|
|
out[3] = 0u;
|
|
|
|
return true;
|
|
}
|
|
|
|
std::optional<JsonAccessorComponentType> NullAccessor::GetComponentType() const
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
|
|
std::optional<JsonAccessorType> NullAccessor::GetType() const
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
|
|
size_t NullAccessor::GetCount() const
|
|
{
|
|
return m_count;
|
|
}
|
|
|
|
OnesAccessor::OnesAccessor(const size_t count)
|
|
: m_count(count)
|
|
{
|
|
}
|
|
|
|
bool OnesAccessor::GetFloatVec2(const size_t index, float (&out)[2]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 1.0f;
|
|
out[1] = 1.0f;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool OnesAccessor::GetFloatVec3(const size_t index, float (&out)[3]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 1.0f;
|
|
out[1] = 1.0f;
|
|
out[2] = 1.0f;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool OnesAccessor::GetFloatVec4(const size_t index, float (&out)[4]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 1.0f;
|
|
out[1] = 1.0f;
|
|
out[2] = 1.0f;
|
|
out[3] = 1.0f;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool OnesAccessor::GetUnsigned(const size_t index, unsigned& out) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out = 0xFFFFFFFFu;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool OnesAccessor::GetUnsignedVec4(const size_t index, unsigned (&out)[4]) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
out[0] = 0xFFFFFFFFu;
|
|
out[1] = 0xFFFFFFFFu;
|
|
out[2] = 0xFFFFFFFFu;
|
|
out[3] = 0xFFFFFFFFu;
|
|
|
|
return true;
|
|
}
|
|
|
|
std::optional<JsonAccessorComponentType> OnesAccessor::GetComponentType() const
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
|
|
std::optional<JsonAccessorType> OnesAccessor::GetType() const
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
|
|
size_t OnesAccessor::GetCount() const
|
|
{
|
|
return m_count;
|
|
}
|
|
|
|
FloatAccessor::FloatAccessor(const BufferView* bufferView, const JsonAccessorType type, size_t byteOffset, const size_t count)
|
|
: m_buffer_view(bufferView),
|
|
m_type(type),
|
|
m_byte_offset(byteOffset),
|
|
m_count(count)
|
|
{
|
|
}
|
|
|
|
std::optional<JsonAccessorType> FloatAccessor::GetType() const
|
|
{
|
|
return m_type;
|
|
}
|
|
|
|
std::optional<JsonAccessorComponentType> FloatAccessor::GetComponentType() const
|
|
{
|
|
return JsonAccessorComponentType::FLOAT;
|
|
}
|
|
|
|
size_t FloatAccessor::GetCount() const
|
|
{
|
|
return m_count;
|
|
}
|
|
|
|
bool FloatAccessor::GetFloatVec2(const size_t index, float (&out)[2]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC2 || m_type == JsonAccessorType::VEC3 || m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
return m_buffer_view->ReadElement(&out, index, sizeof(float[2]), m_byte_offset);
|
|
}
|
|
|
|
bool FloatAccessor::GetFloatVec3(const size_t index, float (&out)[3]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC3 || m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
return m_buffer_view->ReadElement(&out, index, sizeof(float[3]), m_byte_offset);
|
|
}
|
|
|
|
bool FloatAccessor::GetFloatVec4(const size_t index, float (&out)[4]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
return m_buffer_view->ReadElement(&out, index, sizeof(float[4]), m_byte_offset);
|
|
}
|
|
|
|
bool FloatAccessor::GetUnsigned(size_t index, unsigned& out) const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool FloatAccessor::GetUnsignedVec4(size_t index, unsigned (&out)[4]) const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
UnsignedByteAccessor::UnsignedByteAccessor(const BufferView* bufferView, const JsonAccessorType type, size_t byteOffset, const size_t count)
|
|
: m_buffer_view(bufferView),
|
|
m_type(type),
|
|
m_byte_offset(byteOffset),
|
|
m_count(count)
|
|
{
|
|
}
|
|
|
|
std::optional<JsonAccessorType> UnsignedByteAccessor::GetType() const
|
|
{
|
|
return m_type;
|
|
}
|
|
|
|
std::optional<JsonAccessorComponentType> UnsignedByteAccessor::GetComponentType() const
|
|
{
|
|
return JsonAccessorComponentType::UNSIGNED_BYTE;
|
|
}
|
|
|
|
size_t UnsignedByteAccessor::GetCount() const
|
|
{
|
|
return m_count;
|
|
}
|
|
|
|
bool UnsignedByteAccessor::GetFloatVec2(const size_t index, float (&out)[2]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC2 || m_type == JsonAccessorType::VEC3 || m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint8_t temp[2];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint8_t[2]), m_byte_offset))
|
|
return false;
|
|
|
|
// Return as normalized value between 0 and 1
|
|
out[0] = static_cast<float>(temp[0]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
out[1] = static_cast<float>(temp[1]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedByteAccessor::GetFloatVec3(const size_t index, float (&out)[3]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC3 || m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint8_t temp[3];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint8_t[3]), m_byte_offset))
|
|
return false;
|
|
|
|
// Return as normalized value between 0 and 1
|
|
out[0] = static_cast<float>(temp[0]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
out[1] = static_cast<float>(temp[1]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
out[2] = static_cast<float>(temp[2]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedByteAccessor::GetFloatVec4(const size_t index, float (&out)[4]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint8_t temp[4];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint8_t[4]), m_byte_offset))
|
|
return false;
|
|
|
|
// Return as normalized value between 0 and 1
|
|
out[0] = static_cast<float>(temp[0]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
out[1] = static_cast<float>(temp[1]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
out[2] = static_cast<float>(temp[2]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
out[3] = static_cast<float>(temp[3]) / static_cast<float>(std::numeric_limits<uint8_t>::max());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedByteAccessor::GetUnsigned(const size_t index, unsigned& out) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint8_t temp;
|
|
if (!m_buffer_view->ReadElement(&temp, index, sizeof(uint8_t), m_byte_offset))
|
|
return false;
|
|
|
|
out = temp;
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedByteAccessor::GetUnsignedVec4(const size_t index, unsigned (&out)[4]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint8_t temp[4];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint8_t[4]), m_byte_offset))
|
|
return false;
|
|
|
|
out[0] = static_cast<unsigned>(temp[0]);
|
|
out[1] = static_cast<unsigned>(temp[1]);
|
|
out[2] = static_cast<unsigned>(temp[2]);
|
|
out[3] = static_cast<unsigned>(temp[3]);
|
|
|
|
return true;
|
|
}
|
|
|
|
UnsignedShortAccessor::UnsignedShortAccessor(const BufferView* bufferView, const JsonAccessorType type, size_t byteOffset, const size_t count)
|
|
: m_buffer_view(bufferView),
|
|
m_type(type),
|
|
m_byte_offset(byteOffset),
|
|
m_count(count)
|
|
{
|
|
}
|
|
|
|
std::optional<JsonAccessorType> UnsignedShortAccessor::GetType() const
|
|
{
|
|
return m_type;
|
|
}
|
|
|
|
std::optional<JsonAccessorComponentType> UnsignedShortAccessor::GetComponentType() const
|
|
{
|
|
return JsonAccessorComponentType::UNSIGNED_SHORT;
|
|
}
|
|
|
|
size_t UnsignedShortAccessor::GetCount() const
|
|
{
|
|
return m_count;
|
|
}
|
|
|
|
bool UnsignedShortAccessor::GetFloatVec2(const size_t index, float (&out)[2]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC2 || m_type == JsonAccessorType::VEC3 || m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint16_t temp[2];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint16_t[2]), m_byte_offset))
|
|
return false;
|
|
|
|
// Return as normalized value between 0 and 1
|
|
out[0] = static_cast<float>(temp[0]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
out[1] = static_cast<float>(temp[1]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedShortAccessor::GetFloatVec3(const size_t index, float (&out)[3]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC3 || m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint16_t temp[3];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint16_t[3]), m_byte_offset))
|
|
return false;
|
|
|
|
// Return as normalized value between 0 and 1
|
|
out[0] = static_cast<float>(temp[0]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
out[1] = static_cast<float>(temp[1]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
out[2] = static_cast<float>(temp[2]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedShortAccessor::GetFloatVec4(const size_t index, float (&out)[4]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint16_t temp[4];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint16_t[4]), m_byte_offset))
|
|
return false;
|
|
|
|
// Return as normalized value between 0 and 1
|
|
out[0] = static_cast<float>(temp[0]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
out[1] = static_cast<float>(temp[1]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
out[2] = static_cast<float>(temp[2]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
out[3] = static_cast<float>(temp[3]) / static_cast<float>(std::numeric_limits<uint16_t>::max());
|
|
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedShortAccessor::GetUnsigned(const size_t index, unsigned& out) const
|
|
{
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint16_t temp;
|
|
if (!m_buffer_view->ReadElement(&temp, index, sizeof(uint16_t), m_byte_offset))
|
|
return false;
|
|
|
|
out = temp;
|
|
return true;
|
|
}
|
|
|
|
bool UnsignedShortAccessor::GetUnsignedVec4(const size_t index, unsigned (&out)[4]) const
|
|
{
|
|
assert(m_type == JsonAccessorType::VEC4);
|
|
if (index >= m_count)
|
|
return false;
|
|
|
|
uint16_t temp[4];
|
|
if (!m_buffer_view->ReadElement(temp, index, sizeof(uint8_t[4]), m_byte_offset))
|
|
return false;
|
|
|
|
out[0] = static_cast<unsigned>(temp[0]);
|
|
out[1] = static_cast<unsigned>(temp[1]);
|
|
out[2] = static_cast<unsigned>(temp[2]);
|
|
out[3] = static_cast<unsigned>(temp[3]);
|
|
|
|
return true;
|
|
}
|