Skip to content

Commit ab2b71a

Browse files
authored
fix: importing props/mounts in projects (#148)
* fix: importing props in projects causing wonky character model to appear * fix: bugs related to project mount importing
1 parent 1626585 commit ab2b71a

File tree

5 files changed

+54
-31
lines changed

5 files changed

+54
-31
lines changed

Brio/Capabilities/Actor/ActorAppearanceCapability.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,11 @@ public unsafe void ExportAppearance(string file)
212212
var currentAppearance = CurrentAppearance;
213213
BrioHuman.ShaderParams* shaders = Character.GetShaderParams();
214214

215-
ActorAppearanceExtended actor = new()
215+
ActorAppearanceExtended actor = new() { Appearance = currentAppearance };
216+
if(shaders != null)
216217
{
217-
Appearance = currentAppearance,
218-
ShaderParams = *shaders
219-
};
218+
actor.ShaderParams = *shaders;
219+
}
220220

221221
AnamnesisCharaFile appearance = actor;
222222
ResourceProvider.Instance.SaveFileDocument(file, appearance);

Brio/Files/ActorFile.cs

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Brio.Entities.Actor;
55
using Brio.Game.Actor.Appearance;
66
using Brio.Game.Actor.Extensions;
7+
using Brio.Game.Actor.Interop;
78
using Brio.Game.Types;
89
using MessagePack;
910
using System;
@@ -39,10 +40,19 @@ public static unsafe implicit operator ActorFile(ActorEntity actorEntity)
3940
var posingCapability = actorEntity.GetCapability<PosingCapability>();
4041
var modelCapability = actorEntity.GetCapability<ModelPosingCapability>();
4142

43+
ActorAppearanceExtended anaCharaFile = new() { Appearance = appearanceCapability.CurrentAppearance };
44+
BrioHuman.ShaderParams* shaderParams = appearanceCapability.Character.GetShaderParams();
45+
46+
// append shader params to appearance if they exist
47+
if(shaderParams is not null)
48+
{
49+
anaCharaFile.ShaderParams = *shaderParams;
50+
}
51+
4252
var actorFile = new ActorFile
4353
{
4454
Name = actorEntity.RawName,
45-
AnamnesisCharaFile = new ActorAppearanceExtended { Appearance = appearanceCapability.CurrentAppearance, ShaderParams = *appearanceCapability.Character.GetShaderParams() },
55+
AnamnesisCharaFile = anaCharaFile,
4656
PoseFile = posingCapability.GeneratePoseFile(),
4757
IsProp = actorEntity.IsProp,
4858
PropData = new PropData

Brio/Files/AnamnesisCharaFile.cs

+14-11
Original file line numberDiff line numberDiff line change
@@ -247,19 +247,22 @@ public static implicit operator AnamnesisCharaFile(ActorAppearanceExtended appea
247247
// Extended Appearance
248248
Transparency = appearance.ExtendedAppearance.Transparency,
249249
HeightMultiplier = appearance.ExtendedAppearance.HeightMultiplier,
250-
251-
SkinColor = shaders.SkinColor,
252-
SkinGloss = shaders.SkinGloss,
253-
LeftEyeColor = shaders.LeftEyeColor,
254-
RightEyeColor = shaders.RightEyeColor,
255-
HairColor = shaders.HairColor,
256-
HairGloss = shaders.HairGloss,
257-
HairHighlight = shaders.HairHighlight,
258-
MouthColor = shaders.MouthColor,
259-
MuscleTone = shaders.MuscleTone,
260-
LimbalRingColor = shaders.FeatureColor,
261250
};
262251

252+
if(shaders.HasValue)
253+
{
254+
charaFile.SkinColor = shaders.Value.SkinColor;
255+
charaFile.SkinGloss = shaders.Value.SkinGloss;
256+
charaFile.LeftEyeColor = shaders.Value.LeftEyeColor;
257+
charaFile.RightEyeColor = shaders.Value.RightEyeColor;
258+
charaFile.HairColor = shaders.Value.HairColor;
259+
charaFile.HairGloss = shaders.Value.HairGloss;
260+
charaFile.HairHighlight = shaders.Value.HairHighlight;
261+
charaFile.MouthColor = shaders.Value.MouthColor;
262+
charaFile.MuscleTone = shaders.Value.MuscleTone;
263+
charaFile.LimbalRingColor = shaders.Value.FeatureColor;
264+
}
265+
263266
return charaFile;
264267
}
265268

Brio/Game/Actor/Appearance/ActorAppearance.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -337,5 +337,5 @@ private static (WeaponModelId, WeaponModelId, ActorEquipment) FromNpcEquip(NpcEq
337337
public struct ActorAppearanceExtended
338338
{
339339
public ActorAppearance Appearance;
340-
public BrioHuman.ShaderParams ShaderParams;
340+
public BrioHuman.ShaderParams? ShaderParams;
341341
}

Brio/Game/Scene/SceneService.cs

+24-14
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,20 @@ private async Task ApplyDataToActor(EntityId actorId, ActorFile actorFile)
170170

171171
await _framework.RunOnTick(async () =>
172172
{
173-
174-
if(actorFile.AnamnesisCharaFile.IsExtendedAppearanceValid)
173+
// only import shaders if the appearance is valid and it's not a prop (characters only)
174+
if(actorFile.AnamnesisCharaFile.IsExtendedAppearanceValid && !actorFile.IsProp)
175+
{
175176
BrioUtilities.ImportShadersFromFile(ref appearanceCapability._modelShaderOverride, actorFile.AnamnesisCharaFile);
176-
await appearanceCapability.SetAppearance(actorFile.AnamnesisCharaFile, AppearanceImportOptions.All);
177+
await appearanceCapability.SetAppearance(actorFile.AnamnesisCharaFile, AppearanceImportOptions.All);
178+
}
179+
else if(actorFile.IsProp) // if it's a prop, only import the appearance
180+
{
181+
await appearanceCapability.SetAppearance(actorFile.AnamnesisCharaFile, AppearanceImportOptions.Customize);
182+
}
183+
else // chars with invalid extended appearances
184+
{
185+
await appearanceCapability.SetAppearance(actorFile.AnamnesisCharaFile, AppearanceImportOptions.Default);
186+
}
177187

178188
await _framework.RunOnTick(async () =>
179189
{
@@ -182,7 +192,7 @@ await _framework.RunOnTick(async () =>
182192
mountPose = true;
183193

184194
if(mountPose == false)
185-
posingCapability.ImportPose(actorFile.PoseFile, asScene: true);
195+
posingCapability.ImportPose(actorFile.PoseFile, asScene: true, asProp: actorFile.IsProp);
186196

187197
if(attachedActor.HasCapability<CompanionCapability>() == true && actorFile.HasChild && actorFile.Child is not null)
188198
{
@@ -191,20 +201,20 @@ await _framework.RunOnTick(async () =>
191201
companionCapability.SetCompanion(actorFile.Child.Companion);
192202

193203
await _framework.RunOnTick(() =>
204+
{
205+
if(actorFile.Child.PoseFile is not null)
194206
{
195-
if(actorFile.Child.PoseFile is not null)
196-
{
197-
var companionEntity = companionCapability.GetCompanionAsEntity();
207+
var companionEntity = companionCapability.GetCompanionAsEntity();
198208

199-
if(companionEntity is not null && companionEntity.TryGetCapability<PosingCapability>(out var posingCapability))
200-
{
201-
posingCapability.ImportPose(actorFile.Child.PoseFile, asScene: true, freezeOnLoad: true);
202-
}
209+
if(companionEntity is not null && companionEntity.TryGetCapability<PosingCapability>(out var posingCapability))
210+
{
211+
posingCapability.ImportPose(actorFile.Child.PoseFile, asScene: true, freezeOnLoad: true, asProp: actorFile.IsProp);
203212
}
213+
}
204214

205-
if(mountPose == true)
206-
posingCapability.ImportPose(actorFile.PoseFile, asScene: true);
207-
});
215+
if(mountPose == true)
216+
posingCapability.ImportPose(actorFile.PoseFile, asScene: true, asProp: actorFile.IsProp);
217+
});
208218
}
209219
}, delayTicks: 10); // I don't like having to set delayTicks to this but I don't think I have another way without more rework
210220
});

0 commit comments

Comments
 (0)