move texture and model processing out of download thread and fix some normalization for weights
This commit is contained in:
@@ -2115,6 +2115,16 @@ internal static class MdlDecimator
|
||||
}
|
||||
}
|
||||
|
||||
if (boneWeights != null
|
||||
&& blendWeightEncoding == BlendWeightEncoding.Default
|
||||
&& format.BlendWeightsElement is { } blendWeightsElement
|
||||
&& (MdlFile.VertexType)blendWeightsElement.Type == MdlFile.VertexType.UShort4
|
||||
&& ShouldTreatWeightsAsByteNormalized(boneWeights))
|
||||
{
|
||||
RescaleUShortAsByteWeights(boneWeights);
|
||||
blendWeightEncoding = BlendWeightEncoding.UShortAsByte;
|
||||
}
|
||||
|
||||
decoded = new DecodedMeshData(positions, normals, tangents, tangents2, colors, boneWeights, uvChannels, positionWs, normalWs, blendWeightEncoding);
|
||||
return true;
|
||||
}
|
||||
@@ -3424,6 +3434,44 @@ internal static class MdlDecimator
|
||||
return ToUShortNormalized(normalized);
|
||||
}
|
||||
|
||||
private static bool ShouldTreatWeightsAsByteNormalized(BoneWeight[] weights)
|
||||
{
|
||||
const float maxByteUnorm = byte.MaxValue / (float)ushort.MaxValue;
|
||||
var maxWeight = 0f;
|
||||
for (var i = 0; i < weights.Length; i++)
|
||||
{
|
||||
var weight = weights[i];
|
||||
maxWeight = Math.Max(maxWeight, weight.weight0);
|
||||
maxWeight = Math.Max(maxWeight, weight.weight1);
|
||||
maxWeight = Math.Max(maxWeight, weight.weight2);
|
||||
maxWeight = Math.Max(maxWeight, weight.weight3);
|
||||
if (maxWeight > maxByteUnorm)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return maxWeight > 0f;
|
||||
}
|
||||
|
||||
private static void RescaleUShortAsByteWeights(BoneWeight[] weights)
|
||||
{
|
||||
var scale = ushort.MaxValue / (float)byte.MaxValue;
|
||||
for (var i = 0; i < weights.Length; i++)
|
||||
{
|
||||
var weight = weights[i];
|
||||
weights[i] = new BoneWeight(
|
||||
weight.index0,
|
||||
weight.index1,
|
||||
weight.index2,
|
||||
weight.index3,
|
||||
weight.weight0 * scale,
|
||||
weight.weight1 * scale,
|
||||
weight.weight2 * scale,
|
||||
weight.weight3 * scale);
|
||||
}
|
||||
}
|
||||
|
||||
private static void NormalizeWeights(float[] weights)
|
||||
{
|
||||
var sum = weights.Sum();
|
||||
|
||||
Reference in New Issue
Block a user