Теперь я точно уверен, что у меня проблемы с весами. Значит я отловил в дебаге один полигон, у которого:
Indeces: v2 (34.000, 0.000, 0.000, 0.000) float4
Wiegts: v1 (0.000, 0.000, 0.502, 0.247) float4
Я в коде вот так вытаскиваю их из 4-х байт:
// copy vertex blend weights info void CXMeshManager::CopyVertexBlendWeight(byte *pStream, UINT uStreamSize, byte *pSource, UINT uVertexSize, LPD3DVERTEXELEMENT9 pDecElement) { assert(uStreamSize == sizeof(AF_VECTOR4)); AF_VECTOR4* pWeights = (AF_VECTOR4*)pStream; switch (pDecElement->Type) { // 4 bytes case D3DDECLTYPE_FLOAT1: { short buffer[4]; buffer[0] = pSource[0]; buffer[1] = pSource[1]; buffer[2] = pSource[2]; buffer[3] = pSource[3]; // 4 weights pWeights->x = pSource[0] / 255.0f; pWeights->y = pSource[1] / 255.0f; pWeights->z = pSource[2] / 255.0f; pWeights->w = pSource[3] / 255.0f; } break; } }
Но тут явно как-то не так порядок байт идет, так как в начале идут нули, а потом данные, если не делить для float то что-то вроде такого:
- buffer 0x000000bed2e9cde8 {0, 0, 128, 63} short[4]
[0] 0 short
[1] 0 short
[2] 128 short
[3] 63 short
Я пробовал менять местами от 3 до 0, вычитать из 1, не то все.
Блин, FLOAT1 это просто float? остальное все в нем, как я понял 0, 0, 1.
Сделал, да, экпорт из Х очень оптимизирован, он хранит веса до 4-х костей, если их только 2-а, то он хранит 1 float, а вес следующей 1 - вес предыдущей, как всегда.
Тема в архиве.