Skip to content

Commit ee7183f

Browse files
committed
Update v3.0.7.2
2 parents aa1e0f8 + 7488ac0 commit ee7183f

File tree

3 files changed

+62
-12
lines changed

3 files changed

+62
-12
lines changed

xivModdingFramework/Models/FileTypes/Mdl.cs

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3519,6 +3519,7 @@ public static byte[] MakeUncompressedMdlFile(TTModel ttModel, XivMdl ogMdl, Acti
35193519
if (i < 2)
35203520
{
35213521
// First bounding box is bounds from the origin.
3522+
35223523
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(i == 0 && minVect.X > 0 ? 0.0f : minVect.X));
35233524
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(i == 0 && minVect.Y > 0 ? 0.0f : minVect.Y));
35243525
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(i == 0 && minVect.Z > 0 ? 0.0f : minVect.Z));
@@ -3536,21 +3537,47 @@ public static byte[] MakeUncompressedMdlFile(TTModel ttModel, XivMdl ogMdl, Acti
35363537
}
35373538
}
35383539

3539-
// Afterwards there are is a bounding box for every bone.
3540-
// Again, we'll be lazy and just use the full model bounding box for each.
3541-
// Unsure what these are actually used for since there seems no difference
3542-
// in model function whether these have real data or no data.
3540+
var ogBbDict = new Dictionary<string, List<Vector4>>();
3541+
3542+
var boneId = 0;
3543+
foreach(var bbList in ogMdl.BoneBoundingBoxes)
3544+
{
3545+
if (boneId >= ogMdl.PathData.BoneList.Count) continue;
3546+
var bone = ogMdl.PathData.BoneList[boneId];
3547+
3548+
var list = bbList;
3549+
// Ignore old bad data.
3550+
if (new Vector3(bbList[0][0], bbList[0][1], bbList[0][2]) == minVect
3551+
&& new Vector3(bbList[1][0], bbList[1][1], bbList[1][2]) == maxVect)
3552+
{
3553+
list = new List<Vector4>()
3554+
{
3555+
new Vector4(0,0,0,0),
3556+
new Vector4(0,0,0,0),
3557+
};
3558+
}
3559+
3560+
ogBbDict.Add(bone, list);
3561+
boneId++;
3562+
}
3563+
3564+
3565+
// Bone bounding boxes. We use a 1/10th model size cube for every bone.
3566+
// This gives us something functional, without having to do a bunch of wild and crazy
3567+
// parsing/math or demanding the user import models with a functional skeleton.
3568+
const float _Divisor = 20.0f;
35433569
var boneBoundingBoxDataBlock = new List<byte>();
35443570
for (var i = 0; i < ttModel.Bones.Count; i++)
35453571
{
3546-
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(minVect.X));
3547-
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(minVect.Y));
3548-
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(minVect.Z));
3572+
var bone = ttModel.Bones[i];
3573+
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(-1 * modelRadius / _Divisor));
3574+
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(-1 * modelRadius / _Divisor));
3575+
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(-1 * modelRadius / _Divisor));
35493576
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(1.0f));
35503577

3551-
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(maxVect.X));
3552-
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(maxVect.Y));
3553-
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(maxVect.Z));
3578+
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(modelRadius / _Divisor));
3579+
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(modelRadius / _Divisor));
3580+
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(modelRadius / _Divisor));
35543581
boundingBoxDataBlock.AddRange(BitConverter.GetBytes(1.0f));
35553582
}
35563583

xivModdingFramework/Models/ModelTextures/ModelTexture.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,8 +824,9 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi
824824
var bonusColor = GetSkinBonusColor(mtrl, colors);
825825
var highlightColor = GetSkinBonusColor2(mtrl, colors);
826826
var metalnessConst = 1 - GetFloatConst(mtrl, 0x59BDA0B1, 1.0f);
827+
var isHroth = mtrl.ShaderKeys.FirstOrDefault(x => x.KeyId == 0x380CAED0 && x.Value == 0x57FF3B64) != null;
827828

828-
return (Color4 diffuse, Color4 normal, Color4 mask, Color4 index) => {
829+
return (Color4 diffuse, Color4 normal, Color4 mask, Color4 index) => {
829830
var roughness = 0.0f;
830831
var metalness = metalnessConst;
831832
var occlusion = 1.0f;
@@ -888,6 +889,11 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi
888889
var alpha = diffuse.Alpha * alphaMultiplier;
889890
alpha = allowTranslucency ? alpha : (alpha < 1 ? 0 : 1);
890891

892+
if (isHroth)
893+
{
894+
alpha = 1.0f;
895+
}
896+
891897
var emissive = emissiveColorMul;
892898
var sss = mask.Blue;
893899

@@ -1253,6 +1259,12 @@ private static Color4 GetConstColor(XivMtrl mtrl, uint constant, Color4 defaultC
12531259
private static (Color4? Color, bool Blend) GetSkinBonusColor(XivMtrl mtrl, CustomModelColors colors)
12541260
{
12551261
Color4? bonusColor = null;
1262+
var compatMode = mtrl.ShaderKeys.FirstOrDefault(x => x.KeyId == 0xB616DC5A && x.Value == 0x600EF9DF) != null;
1263+
if (compatMode)
1264+
{
1265+
return (null, false);
1266+
}
1267+
12561268

12571269
var bonusColorKey = mtrl.ShaderKeys.FirstOrDefault(x => x.KeyId == 0x380CAED0);
12581270

@@ -1288,6 +1300,11 @@ private static (Color4? Color, bool Blend) GetSkinBonusColor(XivMtrl mtrl, Custo
12881300
private static (Color4? Color, bool Blend) GetSkinBonusColor2(XivMtrl mtrl, CustomModelColors colors)
12891301
{
12901302
Color4? bonusColor = null;
1303+
var compatMode = mtrl.ShaderKeys.FirstOrDefault(x => x.KeyId == 0xB616DC5A && x.Value == 0x600EF9DF) != null;
1304+
if (compatMode)
1305+
{
1306+
return (null, false);
1307+
}
12911308

12921309
var bonusColorKey = mtrl.ShaderKeys.FirstOrDefault(x => x.KeyId == 0x380CAED0);
12931310

xivModdingFramework/Mods/RootCloner.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,13 @@ private static string UpdateFileName(XivDependencyRoot Source, XivDependencyRoot
723723
dstSlot = srcSlot + dstSlot;
724724
}
725725

726-
file = file.Replace(srcSlot, dstSlot);
726+
if (!string.IsNullOrWhiteSpace(srcSlot))
727+
{
728+
file = file.Replace(srcSlot, dstSlot);
729+
} else if(!string.IsNullOrWhiteSpace(dstSlot))
730+
{
731+
file = file.Replace(match.Groups[0].Value, match.Groups[0].Value + "_" + dstSlot);
732+
}
727733
}
728734

729735

0 commit comments

Comments
 (0)