WIP Template function to generalise data copy for varying data types
This commit is contained in:
parent
1e17e17594
commit
52fc8132d9
|
@ -20,7 +20,7 @@ enum class BUFFER_TARGET : int
|
||||||
ELEMENT_ARRAY_BUFFER = 34963
|
ELEMENT_ARRAY_BUFFER = 34963
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class ACCESSOR_DATA_TYPE : int
|
enum class ACCESSOR_COMPONENT_TYPE : int
|
||||||
{
|
{
|
||||||
BYTE = 5120,
|
BYTE = 5120,
|
||||||
U_BYTE = 5121,
|
U_BYTE = 5121,
|
||||||
|
@ -30,25 +30,25 @@ enum class ACCESSOR_DATA_TYPE : int
|
||||||
FLOAT = 5126
|
FLOAT = 5126
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr size_t SizeOfType(ACCESSOR_DATA_TYPE type)
|
constexpr size_t SizeOfType(ACCESSOR_COMPONENT_TYPE type)
|
||||||
{
|
{
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case ACCESSOR_DATA_TYPE::BYTE:
|
case ACCESSOR_COMPONENT_TYPE::BYTE:
|
||||||
case ACCESSOR_DATA_TYPE::U_BYTE:
|
case ACCESSOR_COMPONENT_TYPE::U_BYTE:
|
||||||
return sizeof(char);
|
return sizeof(char);
|
||||||
case ACCESSOR_DATA_TYPE::SHORT:
|
case ACCESSOR_COMPONENT_TYPE::SHORT:
|
||||||
case ACCESSOR_DATA_TYPE::U_SHORT:
|
case ACCESSOR_COMPONENT_TYPE::U_SHORT:
|
||||||
return sizeof(short);
|
return sizeof(short);
|
||||||
case ACCESSOR_DATA_TYPE::U_INT:
|
case ACCESSOR_COMPONENT_TYPE::U_INT:
|
||||||
case ACCESSOR_DATA_TYPE::FLOAT:
|
case ACCESSOR_COMPONENT_TYPE::FLOAT:
|
||||||
return sizeof(float);
|
return sizeof(float);
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class ACCESSOR_COMPONENT_TYPE : int
|
enum class ACCESSOR_DATA_TYPE : int
|
||||||
{
|
{
|
||||||
SCALAR = 64 + 1,
|
SCALAR = 64 + 1,
|
||||||
VEC2 = 2,
|
VEC2 = 2,
|
||||||
|
@ -61,6 +61,29 @@ enum class ACCESSOR_COMPONENT_TYPE : int
|
||||||
MATRIX = 64 + 16
|
MATRIX = 64 + 16
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr size_t CountOfType(ACCESSOR_DATA_TYPE type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case ACCESSOR_DATA_TYPE::SCALAR:
|
||||||
|
return 1;
|
||||||
|
case ACCESSOR_DATA_TYPE::VEC2:
|
||||||
|
return 2;
|
||||||
|
case ACCESSOR_DATA_TYPE::VEC3:
|
||||||
|
return 3;
|
||||||
|
case ACCESSOR_DATA_TYPE::VEC4:
|
||||||
|
return 4;
|
||||||
|
case ACCESSOR_DATA_TYPE::MAT2:
|
||||||
|
return 2 * 2;
|
||||||
|
case ACCESSOR_DATA_TYPE::MAT3:
|
||||||
|
return 3 * 3;
|
||||||
|
case ACCESSOR_DATA_TYPE::MAT4:
|
||||||
|
return 4 * 4;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum class PRIMITIVE_MODE : int
|
enum class PRIMITIVE_MODE : int
|
||||||
{
|
{
|
||||||
POINT = 0,
|
POINT = 0,
|
||||||
|
|
|
@ -118,11 +118,12 @@ namespace SH_COMP
|
||||||
{
|
{
|
||||||
auto const& accessor = (*accessors)[accessorID];
|
auto const& accessor = (*accessors)[accessorID];
|
||||||
auto const& view = (*bufferViews)[accessor.bufferView];
|
auto const& view = (*bufferViews)[accessor.bufferView];
|
||||||
auto const typeIdentifier{ static_cast<ACCESSOR_DATA_TYPE>(accessor.componentType) };
|
auto const typeIdentifier{ static_cast<ACCESSOR_COMPONENT_TYPE>(accessor.componentType) };
|
||||||
auto const sizeIdentifier{ SizeOfType(typeIdentifier) };
|
auto const sizeIdentifier{ SizeOfType(typeIdentifier) };
|
||||||
if (sizeof(T) == sizeIdentifier)
|
auto const componentCount{ CountOfType(accessor.type) };
|
||||||
{
|
|
||||||
dst.resize(accessor.count);
|
dst.resize(accessor.count);
|
||||||
|
if (sizeof(T) == sizeIdentifier * componentCount)
|
||||||
|
{
|
||||||
std::memcpy(
|
std::memcpy(
|
||||||
dst.data(),
|
dst.data(),
|
||||||
buffer + view.byteOffset,
|
buffer + view.byteOffset,
|
||||||
|
@ -138,9 +139,19 @@ namespace SH_COMP
|
||||||
view.byteLength
|
view.byteLength
|
||||||
);
|
);
|
||||||
|
|
||||||
for (auto i{0}; i < accessor.count; i += sizeIdentifier)
|
auto srcPtr{ tempData.data() };
|
||||||
|
auto dstPtr{ dst.data() };
|
||||||
|
size_t index{ 0 };
|
||||||
|
for (auto i{0}; i < accessor.count; ++i, ++index)
|
||||||
{
|
{
|
||||||
|
std::memcpy(
|
||||||
|
dstPtr,
|
||||||
|
srcPtr,
|
||||||
|
sizeIdentifier
|
||||||
|
);
|
||||||
|
|
||||||
|
srcPtr += sizeIdentifier;
|
||||||
|
dstPtr += sizeof(T);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue