void LOADERDECL TexCoord_ReadDirect()
{
	for (int i = 0; i != N; ++i)
		DataWrite(TCScale(DataRead<T>()));

	LOG_TEX<N>();

	++tcIndex;
}
void LOADERDECL TexCoord_ReadDirect()
{
	auto const scale = tcScale[tcIndex];
	DataWriter dst;
	DataReader src;

	for (int i = 0; i != N; ++i)
		dst.Write(TCScale(src.Read<T>(), scale));

	LOG_TEX<N>();

	++tcIndex;
}
void LOADERDECL TexCoord_ReadIndex()
{
	static_assert(!std::numeric_limits<I>::is_signed, "Only unsigned I is sane!");
	
	auto const index = DataRead<I>();
	auto const data = reinterpret_cast<const T*>(cached_arraybases[ARRAY_TEXCOORD0 + tcIndex]
		+ (index * arraystrides[ARRAY_TEXCOORD0 + tcIndex]));

	for (int i = 0; i != N; ++i)
		DataWrite(TCScale(Common::FromBigEndian(data[i])));

	LOG_TEX<N>();
	++tcIndex;
}
void TexCoord_ReadDirect(VertexLoader* loader)
{
	auto const scale = loader->m_tcScale[loader->m_tcIndex];
	DataReader dst(g_vertex_manager_write_ptr, nullptr);
	DataReader src(g_video_buffer_read_ptr, nullptr);

	for (int i = 0; i != N; ++i)
		dst.Write(TCScale(src.Read<T>(), scale));

	g_vertex_manager_write_ptr = dst.GetPointer();
	g_video_buffer_read_ptr = src.GetPointer();
	LOG_TEX<N>();

	++loader->m_tcIndex;
}
void TexCoord_ReadIndex(VertexLoader* loader)
{
	static_assert(std::is_unsigned<I>::value, "Only unsigned I is sane!");

	auto const index = DataRead<I>();
	auto const data = reinterpret_cast<const T*>(VertexLoaderManager::cached_arraybases[ARRAY_TEXCOORD0 + loader->m_tcIndex]
	                + (index * g_main_cp_state.array_strides[ARRAY_TEXCOORD0 + loader->m_tcIndex]));
	auto const scale = loader->m_tcScale[loader->m_tcIndex];
	DataReader dst(g_vertex_manager_write_ptr, nullptr);

	for (int i = 0; i != N; ++i)
		dst.Write(TCScale(Common::FromBigEndian(data[i]), scale));

	g_vertex_manager_write_ptr = dst.GetPointer();
	LOG_TEX<N>();
	++loader->m_tcIndex;
}