Merge pull request #4453 from Promit/master
Added support for more bone weights in GLTF2pull/4693/head
commit
a0f375162d
|
@ -970,8 +970,10 @@ static void BuildVertexWeightMapping(Mesh::Primitive &primitive, std::vector<std
|
||||||
struct Weights {
|
struct Weights {
|
||||||
float values[4];
|
float values[4];
|
||||||
};
|
};
|
||||||
Weights *weights = nullptr;
|
Weights **weights = new Weights*[attr.weight.size()];
|
||||||
attr.weight[0]->ExtractData(weights);
|
for (size_t w = 0; w < attr.weight.size(); ++w) {
|
||||||
|
attr.weight[w]->ExtractData(weights[w]);
|
||||||
|
}
|
||||||
|
|
||||||
struct Indices8 {
|
struct Indices8 {
|
||||||
uint8_t values[4];
|
uint8_t values[4];
|
||||||
|
@ -979,12 +981,18 @@ static void BuildVertexWeightMapping(Mesh::Primitive &primitive, std::vector<std
|
||||||
struct Indices16 {
|
struct Indices16 {
|
||||||
uint16_t values[4];
|
uint16_t values[4];
|
||||||
};
|
};
|
||||||
Indices8 *indices8 = nullptr;
|
Indices8 **indices8 = nullptr;
|
||||||
Indices16 *indices16 = nullptr;
|
Indices16 **indices16 = nullptr;
|
||||||
if (attr.joint[0]->GetElementSize() == 4) {
|
if (attr.joint[0]->GetElementSize() == 4) {
|
||||||
attr.joint[0]->ExtractData(indices8);
|
indices8 = new Indices8*[attr.joint.size()];
|
||||||
|
for (size_t j = 0; j < attr.joint.size(); ++j) {
|
||||||
|
attr.joint[j]->ExtractData(indices8[j]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
attr.joint[0]->ExtractData(indices16);
|
indices16 = new Indices16 *[attr.joint.size()];
|
||||||
|
for (size_t j = 0; j < attr.joint.size(); ++j) {
|
||||||
|
attr.joint[j]->ExtractData(indices16[j]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
if (nullptr == indices8 && nullptr == indices16) {
|
if (nullptr == indices8 && nullptr == indices16) {
|
||||||
|
@ -993,17 +1001,26 @@ static void BuildVertexWeightMapping(Mesh::Primitive &primitive, std::vector<std
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (size_t w = 0; w < attr.weight.size(); ++w) {
|
||||||
for (size_t i = 0; i < num_vertices; ++i) {
|
for (size_t i = 0; i < num_vertices; ++i) {
|
||||||
for (int j = 0; j < 4; ++j) {
|
for (int j = 0; j < 4; ++j) {
|
||||||
const unsigned int bone = (indices8 != nullptr) ? indices8[i].values[j] : indices16[i].values[j];
|
const unsigned int bone = (indices8 != nullptr) ? indices8[w][i].values[j] : indices16[w][i].values[j];
|
||||||
const float weight = weights[i].values[j];
|
const float weight = weights[w][i].values[j];
|
||||||
if (weight > 0 && bone < map.size()) {
|
if (weight > 0 && bone < map.size()) {
|
||||||
map[bone].reserve(8);
|
map[bone].reserve(8);
|
||||||
map[bone].emplace_back(static_cast<unsigned int>(i), weight);
|
map[bone].emplace_back(static_cast<unsigned int>(i), weight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t w = 0; w < attr.weight.size(); ++w) {
|
||||||
|
delete[] weights[w];
|
||||||
|
if(indices8)
|
||||||
|
delete[] indices8[w];
|
||||||
|
if (indices16)
|
||||||
|
delete[] indices16[w];
|
||||||
|
}
|
||||||
delete[] weights;
|
delete[] weights;
|
||||||
delete[] indices8;
|
delete[] indices8;
|
||||||
delete[] indices16;
|
delete[] indices16;
|
||||||
|
|
Loading…
Reference in New Issue