Generate pool skin index for CPU-based skinning operations

This commit is contained in:
Jack Andersen 2017-08-20 19:46:26 -10:00
parent e7f170c403
commit 2674989a4a
3 changed files with 22 additions and 3 deletions

View File

@ -35,6 +35,19 @@ extern logvisor::Module BlenderLog;
extern class BlenderToken SharedBlenderToken; extern class BlenderToken SharedBlenderToken;
class HMDLBuffers; class HMDLBuffers;
struct PoolSkinIndex
{
size_t m_poolSz = 0;
std::unique_ptr<uint32_t[]> m_poolToSkinIndex;
void allocate(size_t poolSz)
{
m_poolSz = poolSz;
if (poolSz)
m_poolToSkinIndex.reset(new uint32_t[poolSz]);
}
};
class BlenderConnection class BlenderConnection
{ {
public: public:
@ -586,7 +599,7 @@ public:
/** Prepares mesh representation for indexed access on modern APIs. /** Prepares mesh representation for indexed access on modern APIs.
* Mesh must remain resident for accessing reference members * Mesh must remain resident for accessing reference members
*/ */
HMDLBuffers getHMDLBuffers(bool absoluteCoords) const; HMDLBuffers getHMDLBuffers(bool absoluteCoords, PoolSkinIndex& poolSkinIndex) const;
}; };
/** Intermediate collision mesh representation prepared by blender from a single mesh object */ /** Intermediate collision mesh representation prepared by blender from a single mesh object */

View File

@ -136,7 +136,6 @@ std::string GLSL::GenerateReflectionExpr(ReflectionType type) const
switch (type) switch (type)
{ {
case ReflectionType::None: case ReflectionType::None:
default:
return "vec3(0.0, 0.0, 0.0)"; return "vec3(0.0, 0.0, 0.0)";
case ReflectionType::Simple: case ReflectionType::Simple:
return "texture(reflectionTex, vtf.reflectTcgs[1]).rgb * vtf.reflectAlpha"; return "texture(reflectionTex, vtf.reflectTcgs[1]).rgb * vtf.reflectAlpha";

View File

@ -23,7 +23,8 @@ atVec3f BlenderConnection::DataStream::MtxVecMul3RM(const Matrix4f& mtx, const V
return res; return res;
} }
HMDLBuffers BlenderConnection::DataStream::Mesh::getHMDLBuffers(bool absoluteCoords) const HMDLBuffers BlenderConnection::DataStream::Mesh::getHMDLBuffers(bool absoluteCoords,
PoolSkinIndex& poolSkinIndex) const
{ {
/* If skinned, compute max weight vec count */ /* If skinned, compute max weight vec count */
size_t weightCount = 0; size_t weightCount = 0;
@ -89,8 +90,10 @@ HMDLBuffers BlenderConnection::DataStream::Mesh::getHMDLBuffers(bool absoluteCoo
metaOut.indexCount = iboData.size(); metaOut.indexCount = iboData.size();
size_t vboSz = metaOut.vertCount * metaOut.vertStride; size_t vboSz = metaOut.vertCount * metaOut.vertStride;
poolSkinIndex.allocate(vertPool.size());
HMDLBuffers ret(std::move(metaOut), vboSz, iboData, std::move(outSurfaces), skinBanks); HMDLBuffers ret(std::move(metaOut), vboSz, iboData, std::move(outSurfaces), skinBanks);
athena::io::MemoryWriter vboW(ret.m_vboData.get(), vboSz); athena::io::MemoryWriter vboW(ret.m_vboData.get(), vboSz);
uint32_t curPoolIdx = 0;
for (const std::pair<const Surface*, const Surface::Vert*>& sv : vertPool) for (const std::pair<const Surface*, const Surface::Vert*>& sv : vertPool)
{ {
const Surface& s = *sv.first; const Surface& s = *sv.first;
@ -155,6 +158,10 @@ HMDLBuffers BlenderConnection::DataStream::Mesh::getHMDLBuffers(bool absoluteCoo
vboW.writeVec4fLittle(vec); vboW.writeVec4fLittle(vec);
} }
} }
/* mapping pool verts to skin indices */
poolSkinIndex.m_poolToSkinIndex[curPoolIdx] = sv.second->iSkin;
++curPoolIdx;
} }
return ret; return ret;