Added hair, facial hair, magic mirror (#452)

* Added hair, facial hair, magic mirror

* I forgot to commit the textures lmao

* Use shader to fix hair color blending
This commit is contained in:
DamianX
2019-11-23 21:55:46 +01:00
committed by Pieter-Jan Briers
parent b89615342e
commit 3a7a3a89ba
192 changed files with 767 additions and 3 deletions

View File

@@ -0,0 +1,100 @@
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.Preferences.Appearance;
using Robust.Client.GameObjects;
using Robust.Client.Graphics.Shaders;
using Robust.Client.Interfaces.GameObjects.Components;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Maths;
using Robust.Shared.Prototypes;
namespace Content.Client.GameObjects.Components.Mobs
{
[RegisterComponent]
public sealed class HairComponent : SharedHairComponent
{
private const string HairShaderName = "hair";
private const string HairColorParameter = "hairColor";
#pragma warning disable 649
[Dependency] private readonly IPrototypeManager _prototypeManager;
#pragma warning restore 649
private ShaderInstance _facialHairShader;
private ShaderInstance _hairShader;
public override void Initialize()
{
base.Initialize();
var shaderProto = _prototypeManager.Index<ShaderPrototype>(HairShaderName);
_facialHairShader = shaderProto.InstanceUnique();
_hairShader = shaderProto.InstanceUnique();
}
protected override void Startup()
{
base.Startup();
if (Owner.TryGetComponent(out ISpriteComponent sprite))
{
sprite.LayerSetShader(HumanoidVisualLayers.Hair, _hairShader);
sprite.LayerSetShader(HumanoidVisualLayers.FacialHair, _facialHairShader);
}
}
public override string FacialHairStyleName
{
get => base.FacialHairStyleName;
set
{
base.FacialHairStyleName = value;
UpdateHairStyle();
}
}
public override string HairStyleName
{
get => base.HairStyleName;
set
{
base.HairStyleName = value;
UpdateHairStyle();
}
}
public override Color HairColor
{
get => base.HairColor;
set
{
base.HairColor = value;
UpdateHairStyle();
}
}
public override Color FacialHairColor
{
get => base.FacialHairColor;
set
{
base.FacialHairColor = value;
UpdateHairStyle();
}
}
private void UpdateHairStyle()
{
var sprite = Owner.GetComponent<SpriteComponent>();
_hairShader?.SetParameter(HairColorParameter, HairColor);
_facialHairShader?.SetParameter(HairColorParameter, FacialHairColor);
sprite.LayerSetState(HumanoidVisualLayers.Hair,
HairStyles.HairStylesMap[HairStyleName ?? HairStyles.DefaultHairStyle]);
sprite.LayerSetState(HumanoidVisualLayers.FacialHair,
HairStyles.FacialHairStylesMap[FacialHairStyleName ?? HairStyles.DefaultFacialHairStyle]);
}
}
}