Implement female uniform masking.

This commit is contained in:
Pieter-Jan Briers
2020-01-21 18:11:15 +01:00
parent 5481959018
commit 9beb7e48d4
14 changed files with 104 additions and 4 deletions

View File

@@ -4,6 +4,7 @@ using Content.Shared.GameObjects.Components.Inventory;
using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Items;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables; using Robust.Shared.ViewVariables;
namespace Content.Client.GameObjects.Components.Clothing namespace Content.Client.GameObjects.Components.Clothing
@@ -12,6 +13,7 @@ namespace Content.Client.GameObjects.Components.Clothing
[ComponentReference(typeof(ItemComponent))] [ComponentReference(typeof(ItemComponent))]
public class ClothingComponent : ItemComponent public class ClothingComponent : ItemComponent
{ {
private FemaleClothingMask _femaleMask;
public override string Name => "Clothing"; public override string Name => "Clothing";
public override uint? NetID => ContentNetIDs.CLOTHING; public override uint? NetID => ContentNetIDs.CLOTHING;
public override Type StateType => typeof(ClothingComponentState); public override Type StateType => typeof(ClothingComponentState);
@@ -19,6 +21,20 @@ namespace Content.Client.GameObjects.Components.Clothing
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
public string ClothingEquippedPrefix { get; set; } public string ClothingEquippedPrefix { get; set; }
[ViewVariables(VVAccess.ReadWrite)]
public FemaleClothingMask FemaleMask
{
get => _femaleMask;
set => _femaleMask = value;
}
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataField(ref _femaleMask, "femaleMask", FemaleClothingMask.UniformFull);
}
public (RSI rsi, RSI.StateId stateId)? GetEquippedStateInfo(EquipmentSlotDefines.SlotFlags slot) public (RSI rsi, RSI.StateId stateId)? GetEquippedStateInfo(EquipmentSlotDefines.SlotFlags slot)
{ {
if (RsiPath == null) if (RsiPath == null)
@@ -47,4 +63,11 @@ namespace Content.Client.GameObjects.Components.Clothing
EquippedPrefix = clothingComponentState.EquippedPrefix; EquippedPrefix = clothingComponentState.EquippedPrefix;
} }
} }
public enum FemaleClothingMask
{
NoMask = 0,
UniformFull,
UniformTop
}
} }

View File

@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Content.Client.GameObjects.Components.Clothing; using Content.Client.GameObjects.Components.Clothing;
using Content.Shared.GameObjects; using Content.Shared.GameObjects;
using Content.Shared.Preferences.Appearance;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Client.Interfaces.GameObjects.Components; using Robust.Client.Interfaces.GameObjects.Components;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
@@ -14,8 +15,6 @@ using Robust.Shared.IoC;
using Robust.Shared.ViewVariables; using Robust.Shared.ViewVariables;
using static Content.Shared.GameObjects.Components.Inventory.EquipmentSlotDefines; using static Content.Shared.GameObjects.Components.Inventory.EquipmentSlotDefines;
using static Content.Shared.GameObjects.SharedInventoryComponent.ClientInventoryMessage; using static Content.Shared.GameObjects.SharedInventoryComponent.ClientInventoryMessage;
using Content.Shared.GameObjects.Components.Inventory;
using System;
namespace Content.Client.GameObjects namespace Content.Client.GameObjects
{ {
@@ -130,6 +129,17 @@ namespace Content.Client.GameObjects
_sprite.LayerSetVisible(slot, true); _sprite.LayerSetVisible(slot, true);
_sprite.LayerSetRSI(slot, rsi); _sprite.LayerSetRSI(slot, rsi);
_sprite.LayerSetState(slot, state); _sprite.LayerSetState(slot, state);
if (slot == Slots.INNERCLOTHING)
{
_sprite.LayerSetState(HumanoidVisualLayers.StencilMask, clothing.FemaleMask switch
{
FemaleClothingMask.NoMask => "female_none",
FemaleClothingMask.UniformTop => "female_top",
_ => "female_full",
});
}
return; return;
} }
} }

View File

@@ -47,6 +47,8 @@ namespace Content.Client.GameObjects.Components.Mobs
sprite.LayerSetState(HumanoidVisualLayers.Chest, Sex == Sex.Male ? "human_chest_m" : "human_chest_f"); sprite.LayerSetState(HumanoidVisualLayers.Chest, Sex == Sex.Male ? "human_chest_m" : "human_chest_f");
sprite.LayerSetState(HumanoidVisualLayers.Head, Sex == Sex.Male ? "human_head_m" : "human_head_f"); sprite.LayerSetState(HumanoidVisualLayers.Head, Sex == Sex.Male ? "human_head_m" : "human_head_f");
sprite.LayerSetVisible(HumanoidVisualLayers.StencilMask, Sex == Sex.Female);
var hairStyle = Appearance.HairStyleName; var hairStyle = Appearance.HairStyleName;
if (string.IsNullOrWhiteSpace(hairStyle) || !HairStyles.HairStylesMap.ContainsKey(hairStyle)) if (string.IsNullOrWhiteSpace(hairStyle) || !HairStyles.HairStylesMap.ContainsKey(hairStyle))
hairStyle = HairStyles.DefaultHairStyle; hairStyle = HairStyles.DefaultHairStyle;

View File

@@ -12,5 +12,6 @@ namespace Content.Shared.Preferences.Appearance
LHand, LHand,
RLeg, RLeg,
LLeg, LLeg,
StencilMask
} }
} }

View File

@@ -91,6 +91,7 @@
- type: Clothing - type: Clothing
sprite: Clothing/uniform_clown.rsi sprite: Clothing/uniform_clown.rsi
femaleMask: UniformTop
- type: entity - type: entity
parent: UniformBase parent: UniformBase
@@ -141,4 +142,4 @@
state: captain state: captain
- type: Clothing - type: Clothing
sprite: Clothing/captain_uniform.rsi sprite: Clothing/captain_uniform.rsi

View File

@@ -17,7 +17,14 @@
description: A bright red toolbox, stocked with emergency tools description: A bright red toolbox, stocked with emergency tools
components: components:
- type: Sprite - type: Sprite
texture: Objects/Tools/toolbox_r.png layers:
- shader: stencilClear
- texture: Objects/Tools/wrench.png
shader: stencilMask
- texture: Objects/Tools/toolbox_r.png
shader: stencilDraw
- type: Icon - type: Icon
texture: Objects/Tools/toolbox_r.png texture: Objects/Tools/toolbox_r.png

View File

@@ -58,7 +58,18 @@
sprite: Mob/human.rsi sprite: Mob/human.rsi
state: human_l_leg state: human_l_leg
- shader: stencilClear
sprite: Mob/human.rsi
state: human_l_leg
- shader: stencilMask
map: ["enum.HumanoidVisualLayers.StencilMask"]
sprite: Mob/masking_helpers.rsi
state: female_full
visible: false
- map: ["enum.Slots.INNERCLOTHING"] - map: ["enum.Slots.INNERCLOTHING"]
shader: stencilDraw
- map: ["enum.Slots.IDCARD"] - map: ["enum.Slots.IDCARD"]
- map: ["enum.Slots.GLOVES"] - map: ["enum.Slots.GLOVES"]
- map: ["enum.Slots.SHOES"] - map: ["enum.Slots.SHOES"]
@@ -174,7 +185,16 @@
sprite: Mob/human.rsi sprite: Mob/human.rsi
state: human_l_leg state: human_l_leg
- shader: stencilClear
- shader: stencilMask
map: ["enum.HumanoidVisualLayers.StencilMask"]
sprite: Mob/masking_helpers.rsi
state: female_full
visible: false
- map: ["enum.Slots.INNERCLOTHING"] - map: ["enum.Slots.INNERCLOTHING"]
shader: stencilDraw
- map: ["enum.Slots.IDCARD"] - map: ["enum.Slots.IDCARD"]
- map: ["enum.Slots.GLOVES"] - map: ["enum.Slots.GLOVES"]
- map: ["enum.Slots.SHOES"] - map: ["enum.Slots.SHOES"]

View File

@@ -0,0 +1,25 @@
- type: shader
id: stencilClear
kind: source
path: "/Shaders/stencilclear.swsl"
stencil:
ref: 0
op: Replace
func: Always
- type: shader
id: stencilMask
kind: source
path: "/Shaders/stencilmask.swsl"
stencil:
ref: 1
op: Replace
func: Always
- type: shader
id: stencilDraw
kind: canvas
stencil:
ref: 1
op: Keep
func: NotEqual

View File

@@ -0,0 +1,3 @@
void fragment() {
COLOR = vec4(0);
}

View File

@@ -0,0 +1,7 @@
void fragment() {
if (texture(TEXTURE, UV).a == 0) {
discard; // Discard if no alpha so that there's a hole in the stencil buffer.
}
COLOR = vec4(0);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

View File

@@ -0,0 +1 @@
{"version": 1, "size": {"x": 32, "y": 32}, "states": [{"name": "female_full", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "female_top", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}