]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Displacement maps big update (#30093)
authorEd <96445749+TheShuEd@users.noreply.github.com>
Tue, 23 Jul 2024 09:04:09 +0000 (12:04 +0300)
committerGitHub <noreply@github.com>
Tue, 23 Jul 2024 09:04:09 +0000 (12:04 +0300)
* split logic into own system

* add support for different size displacement maps

* some clothes may not use displacement maps

* displacement maps spport hand sprites

* Update DisplacementMapSystem.cs

* rename things

* fuck stencilmask

* fix bugs

* no masks

* Update jumpsuits.yml

* fix species specific sprites

* Update ClothingSystem.cs

* shoes + ears displacement, some bugfix

* Update DisplacementMapSystem.cs

26 files changed:
Content.Client/Clothing/ClientClothingSystem.cs
Content.Client/DisplacementMap/DisplacementMapSystem.cs [new file with mode: 0644]
Content.Client/Hands/Systems/HandsSystem.cs
Content.Shared/Clothing/Components/ClothingComponent.cs
Content.Shared/Clothing/EntitySystems/ClothingSystem.cs
Content.Shared/DisplacementMap/DisplacementData.cs [new file with mode: 0644]
Content.Shared/Hands/Components/HandsComponent.cs
Content.Shared/Inventory/InventoryComponent.cs
Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml
Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml
Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
Resources/Prototypes/Entities/Mobs/Species/base.yml
Resources/Prototypes/Entities/Mobs/Species/diona.yml
Resources/Prototypes/Entities/Mobs/Species/dwarf.yml
Resources/Prototypes/Entities/Mobs/Species/gingerbread.yml
Resources/Prototypes/Entities/Mobs/Species/human.yml
Resources/Prototypes/Entities/Mobs/Species/moth.yml
Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
Resources/Prototypes/Entities/Mobs/Species/skeleton.yml
Resources/Prototypes/Entities/Mobs/Species/slime.yml
Resources/Prototypes/Entities/Mobs/Species/vox.yml
Resources/Textures/Mobs/Species/Human/displacement.rsi/jumpsuit-female.png [new file with mode: 0644]
Resources/Textures/Mobs/Species/Human/displacement.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Mobs/Species/Vox/displacement.rsi/ears.png [new file with mode: 0644]
Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json
Resources/Textures/Mobs/Species/Vox/displacement.rsi/shoes.png [new file with mode: 0644]

index 1c0d831226db73cf2e141dd23daa47b0964f892f..96bbcc54f2a249970e0b11e8957fa7339f3709b4 100644 (file)
@@ -1,10 +1,12 @@
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using System.Numerics;
+using Content.Client.DisplacementMap;
 using Content.Client.Inventory;
 using Content.Shared.Clothing;
 using Content.Shared.Clothing.Components;
 using Content.Shared.Clothing.EntitySystems;
+using Content.Shared.DisplacementMap;
 using Content.Shared.Humanoid;
 using Content.Shared.Inventory;
 using Content.Shared.Inventory.Events;
@@ -50,6 +52,7 @@ public sealed class ClientClothingSystem : ClothingSystem
     [Dependency] private readonly IResourceCache _cache = default!;
     [Dependency] private readonly ISerializationManager _serialization = default!;
     [Dependency] private readonly InventorySystem _inventorySystem = default!;
+    [Dependency] private readonly DisplacementMapSystem _displacement = default!;
 
     public override void Initialize()
     {
@@ -64,15 +67,14 @@ public sealed class ClientClothingSystem : ClothingSystem
 
     private void OnAppearanceUpdate(EntityUid uid, InventoryComponent component, ref AppearanceChangeEvent args)
     {
-        // May need to update jumpsuit stencils if the sex changed. Also required to properly set the stencil on init
+        // May need to update displacement maps if the sex changed. Also required to properly set the stencil on init
         if (args.Sprite == null)
             return;
 
-        if (_inventorySystem.TryGetSlotEntity(uid, Jumpsuit, out var suit, component)
-            && TryComp(suit, out ClothingComponent? clothing))
+        var enumerator = _inventorySystem.GetSlotEnumerator((uid, component));
+        while (enumerator.NextItem(out var item, out var slot))
         {
-            SetGenderedMask(uid, args.Sprite, clothing);
-            return;
+            RenderEquipment(uid, item, slot.Name, component);
         }
 
         // No clothing equipped -> make sure the layer is hidden, though this should already be handled by on-unequip.
@@ -179,14 +181,6 @@ public sealed class ClientClothingSystem : ClothingSystem
 
     private void OnDidUnequip(EntityUid uid, SpriteComponent component, DidUnequipEvent args)
     {
-        // Hide jumpsuit mask layer.
-        if (args.Slot == Jumpsuit
-            && TryComp(uid, out SpriteComponent? sprite)
-            && sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var maskLayer))
-        {
-                sprite.LayerSetVisible(maskLayer, false);
-        }
-
         if (!TryComp(uid, out InventorySlotsComponent? inventorySlots))
             return;
 
@@ -231,9 +225,6 @@ public sealed class ClientClothingSystem : ClothingSystem
             return;
         }
 
-        if (slot == Jumpsuit)
-            SetGenderedMask(equipee, sprite, clothingComponent);
-
         if (!_inventorySystem.TryGetSlot(equipee, slot, out var slotDef, inventory))
             return;
 
@@ -265,7 +256,25 @@ public sealed class ClientClothingSystem : ClothingSystem
         // temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a
         // bookmark to determine where in the list of layers we should insert the clothing layers.
         bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index);
-        var displacementData = inventory.Displacements.GetValueOrDefault(slot);
+
+        // Select displacement maps
+        var displacementData = inventory.Displacements.GetValueOrDefault(slot); //Default unsexed map
+
+        var equipeeSex = CompOrNull<HumanoidAppearanceComponent>(equipee)?.Sex;
+        if (equipeeSex != null)
+        {
+            switch (equipeeSex)
+            {
+                case Sex.Male:
+                    if (inventory.MaleDisplacements.Count > 0)
+                        displacementData = inventory.MaleDisplacements.GetValueOrDefault(slot);
+                    break;
+                case Sex.Female:
+                    if (inventory.FemaleDisplacements.Count > 0)
+                        displacementData = inventory.FemaleDisplacements.GetValueOrDefault(slot);
+                    break;
+            }
+        }
 
         // add the new layers
         foreach (var (key, layerData) in ev.Layers)
@@ -292,7 +301,7 @@ public sealed class ClientClothingSystem : ClothingSystem
                 index = sprite.LayerMapReserveBlank(key);
 
             if (sprite[index] is not Layer layer)
-                return;
+                continue;
 
             // In case no RSI is given, use the item's base RSI as a default. This cuts down on a lot of unnecessary yaml entries.
             if (layerData.RsiPath == null
@@ -303,78 +312,19 @@ public sealed class ClientClothingSystem : ClothingSystem
                 layer.SetRsi(clothingSprite.BaseRSI);
             }
 
-            // Another "temporary" fix for clothing stencil masks.
-            // Sprite layer redactor when
-            // Sprite "redactor" just a week away.
-            if (slot == Jumpsuit)
-                layerData.Shader ??= "StencilDraw";
-
             sprite.LayerSetData(index, layerData);
             layer.Offset += slotDef.Offset;
 
-            if (displacementData != null)
+            if (displacementData is not null)
             {
-                if (displacementData.ShaderOverride != null)
-                    sprite.LayerSetShader(index, displacementData.ShaderOverride);
-
-                var displacementKey = $"{key}-displacement";
-                if (!revealedLayers.Add(displacementKey))
-                {
-                    Log.Warning($"Duplicate key for clothing visuals DISPLACEMENT: {displacementKey}.");
+                //Checking that the state is not tied to the current race. In this case we don't need to use the displacement maps.
+                if (layerData.State is not null && inventory.SpeciesId is not null && layerData.State.EndsWith(inventory.SpeciesId))
                     continue;
-                }
-
-                var displacementLayer = _serialization.CreateCopy(displacementData.Layer, notNullableOverride: true);
-                displacementLayer.CopyToShaderParameters!.LayerKey = key;
 
-                // Add before main layer for this item.
-                sprite.AddLayer(displacementLayer, index);
-                sprite.LayerMapSet(displacementKey, index);
-
-                revealedLayers.Add(displacementKey);
+                _displacement.TryAddDisplacement(displacementData, sprite, index, key, revealedLayers);
             }
         }
 
         RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true);
     }
-
-
-    /// <summary>
-    ///     Sets a sprite's gendered mask based on gender (obviously).
-    /// </summary>
-    /// <param name="sprite">Sprite to modify</param>
-    /// <param name="humanoid">Humanoid, to get gender from</param>
-    /// <param name="clothing">Clothing component, to get mask sprite type</param>
-    private void SetGenderedMask(EntityUid uid, SpriteComponent sprite, ClothingComponent clothing)
-    {
-        if (!sprite.LayerMapTryGet(HumanoidVisualLayers.StencilMask, out var layer))
-            return;
-
-        ClothingMask mask;
-        string prefix;
-
-        switch (CompOrNull<HumanoidAppearanceComponent>(uid)?.Sex)
-        {
-            case Sex.Male:
-                mask = clothing.MaleMask;
-                prefix = "male_";
-                break;
-            case Sex.Female:
-                mask = clothing.FemaleMask;
-                prefix = "female_";
-                break;
-            default:
-                mask = clothing.UnisexMask;
-                prefix = "unisex_";
-                break;
-        }
-
-        sprite.LayerSetState(layer, mask switch
-        {
-            ClothingMask.NoMask => $"{prefix}none",
-            ClothingMask.UniformTop => $"{prefix}top",
-            _ => $"{prefix}full",
-        });
-        sprite.LayerSetVisible(layer, true);
-    }
 }
diff --git a/Content.Client/DisplacementMap/DisplacementMapSystem.cs b/Content.Client/DisplacementMap/DisplacementMapSystem.cs
new file mode 100644 (file)
index 0000000..6db164a
--- /dev/null
@@ -0,0 +1,65 @@
+using Content.Shared.DisplacementMap;
+using Robust.Client.GameObjects;
+using Robust.Client.Graphics;
+using Robust.Shared.Serialization.Manager;
+
+namespace Content.Client.DisplacementMap;
+
+public sealed class DisplacementMapSystem : EntitySystem
+{
+    [Dependency] private readonly ISerializationManager _serialization = default!;
+
+    public bool TryAddDisplacement(DisplacementData data, SpriteComponent sprite, int index, string key, HashSet<string> revealedLayers)
+    {
+        if (data.ShaderOverride != null)
+            sprite.LayerSetShader(index, data.ShaderOverride);
+
+        var displacementKey = $"{key}-displacement";
+        if (!revealedLayers.Add(displacementKey))
+        {
+            Log.Warning($"Duplicate key for DISPLACEMENT: {displacementKey}.");
+            return false;
+        }
+
+        //allows you not to write it every time in the YML
+        foreach (var pair in data.SizeMaps)
+        {
+            pair.Value.CopyToShaderParameters??= new()
+            {
+                LayerKey = "dummy",
+                ParameterTexture = "displacementMap",
+                ParameterUV = "displacementUV",
+            };
+        }
+
+        if (!data.SizeMaps.ContainsKey(32))
+        {
+            Log.Error($"DISPLACEMENT: {displacementKey} don't have 32x32 default displacement map");
+            return false;
+        }
+
+        // We choose a displacement map from the possible ones, matching the size with the original layer size.
+        // If there is no such a map, we use a standard 32 by 32 one
+        var displacementDataLayer = data.SizeMaps[EyeManager.PixelsPerMeter];
+        var actualRSI = sprite.LayerGetActualRSI(index);
+        if (actualRSI is not null)
+        {
+            if (actualRSI.Size.X != actualRSI.Size.Y)
+                Log.Warning($"DISPLACEMENT: {displacementKey} has a resolution that is not 1:1, things can look crooked");
+
+            var layerSize = actualRSI.Size.X;
+            if (data.SizeMaps.ContainsKey(layerSize))
+                displacementDataLayer = data.SizeMaps[layerSize];
+        }
+
+        var displacementLayer = _serialization.CreateCopy(displacementDataLayer, notNullableOverride: true);
+        displacementLayer.CopyToShaderParameters!.LayerKey = key;
+
+        sprite.AddLayer(displacementLayer, index);
+        sprite.LayerMapSet(displacementKey, index);
+
+        revealedLayers.Add(displacementKey);
+
+        return true;
+    }
+}
index 7319b97b42b79c9bb09014e8ad51b822ff7c95fa..ffa6dfd29d65372c723cfbbc7030cc036f157bf4 100644 (file)
@@ -1,5 +1,6 @@
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
+using Content.Client.DisplacementMap;
 using Content.Client.Examine;
 using Content.Client.Strip;
 using Content.Client.Verbs.UI;
@@ -28,6 +29,7 @@ namespace Content.Client.Hands.Systems
         [Dependency] private readonly SharedContainerSystem _containerSystem = default!;
         [Dependency] private readonly StrippableSystem _stripSys = default!;
         [Dependency] private readonly ExamineSystem _examine = default!;
+        [Dependency] private readonly DisplacementMapSystem _displacement = default!;
 
         public event Action<string, HandLocation>? OnPlayerAddHand;
         public event Action<string>? OnPlayerRemoveHand;
@@ -345,6 +347,10 @@ namespace Content.Client.Hands.Systems
                 }
 
                 sprite.LayerSetData(index, layerData);
+
+                //Add displacement maps
+                if (handComp.HandDisplacement is not null)
+                    _displacement.TryAddDisplacement(handComp.HandDisplacement, sprite, index, key, revealedLayers);
             }
 
             RaiseLocalEvent(held, new HeldVisualsUpdatedEvent(uid, revealedLayers), true);
index 846a78b8680c34a5dc76c5fe0cd4d72d9811ecf7..581125d4fe31ee443e4f204d647d61a0f9e31c57 100644 (file)
@@ -59,18 +59,6 @@ public sealed partial class ClothingComponent : Component
     [DataField("sprite")]
     public string? RsiPath;
 
-    [ViewVariables(VVAccess.ReadWrite)]
-    [DataField("maleMask")]
-    public ClothingMask MaleMask = ClothingMask.UniformFull;
-
-    [ViewVariables(VVAccess.ReadWrite)]
-    [DataField("femaleMask")]
-    public ClothingMask FemaleMask = ClothingMask.UniformFull;
-
-    [ViewVariables(VVAccess.ReadWrite)]
-    [DataField("unisexMask")]
-    public ClothingMask UnisexMask = ClothingMask.UniformFull;
-
     /// <summary>
     /// Name of the inventory slot the clothing is in.
     /// </summary>
index 381edc68baaf3eb51276e0e4f82a7afc56171c0a..14137b383655806440ce244a4984a51ef371c696 100644 (file)
@@ -233,7 +233,6 @@ public abstract class ClothingSystem : EntitySystem
         clothing.ClothingVisuals = otherClothing.ClothingVisuals;
         clothing.EquippedPrefix = otherClothing.EquippedPrefix;
         clothing.RsiPath = otherClothing.RsiPath;
-        clothing.FemaleMask = otherClothing.FemaleMask;
 
         _itemSys.VisualsChanged(uid);
         Dirty(uid, clothing);
diff --git a/Content.Shared/DisplacementMap/DisplacementData.cs b/Content.Shared/DisplacementMap/DisplacementData.cs
new file mode 100644 (file)
index 0000000..7bd5b58
--- /dev/null
@@ -0,0 +1,14 @@
+namespace Content.Shared.DisplacementMap;
+
+[DataDefinition]
+public sealed partial class DisplacementData
+{
+    /// <summary>
+    /// allows you to attach different maps for layers of different sizes.
+    /// </summary>
+    [DataField(required: true)]
+    public Dictionary<int, PrototypeLayerData> SizeMaps = new();
+
+    [DataField]
+    public string? ShaderOverride = "DisplacedStencilDraw";
+}
index 01579cccdb79ec14c53d5829a5a70be0a15139f0..f218455c0bb7dc584b2158a3e53a45f321c1cde3 100644 (file)
@@ -1,3 +1,4 @@
+using Content.Shared.DisplacementMap;
 using Content.Shared.Hands.EntitySystems;
 using Robust.Shared.Containers;
 using Robust.Shared.GameStates;
@@ -76,6 +77,9 @@ public sealed partial class HandsComponent : Component
     /// </summary>
     [DataField, ViewVariables(VVAccess.ReadWrite)]
     public TimeSpan ThrowCooldown = TimeSpan.FromSeconds(0.5f);
+
+    [DataField]
+    public DisplacementData? HandDisplacement;
 }
 
 [Serializable, NetSerializable]
index 02b3a5b2583a8d87723338bbe6d99ed7c0db3f83..629cf1169c4584c95debdcb954839665312f6ee3 100644 (file)
@@ -1,4 +1,5 @@
-using Robust.Shared.Containers;
+using Content.Shared.DisplacementMap;
+using Robust.Shared.Containers;
 using Robust.Shared.GameStates;
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
 
@@ -13,18 +14,21 @@ public sealed partial class InventoryComponent : Component
 
     [DataField("speciesId")] public string? SpeciesId { get; set; }
 
-    [DataField] public Dictionary<string, SlotDisplacementData> Displacements = [];
-
     public SlotDefinition[] Slots = Array.Empty<SlotDefinition>();
     public ContainerSlot[] Containers = Array.Empty<ContainerSlot>();
 
-    [DataDefinition]
-    public sealed partial class SlotDisplacementData
-    {
-        [DataField(required: true)]
-        public PrototypeLayerData Layer = default!;
+    [DataField]
+    public Dictionary<string, DisplacementData> Displacements = new();
+
+    /// <summary>
+    /// Alternate displacement maps, which if available, will be selected for the player of the appropriate gender.
+    /// </summary>
+    [DataField]
+    public Dictionary<string, DisplacementData> FemaleDisplacements = new();
 
-        [DataField]
-        public string? ShaderOverride = "DisplacedStencilDraw";
-    }
+    /// <summary>
+    /// Alternate displacement maps, which if available, will be selected for the player of the appropriate gender.
+    /// </summary>
+    [DataField]
+    public Dictionary<string, DisplacementData> MaleDisplacements = new();
 }
index a5e57a608d92836d600bde6c914a6f268ea76a62..9795c42b8fa3633a3ee9f2ce7fe440a5efe78466 100644 (file)
     sprite: Clothing/Uniforms/Jumpsuit/clown.rsi
   - type: Clothing
     sprite: Clothing/Uniforms/Jumpsuit/clown.rsi
-    femaleMask: UniformTop
   - type: Tag
     tags:
     - ClownSuit
     sprite: Clothing/Uniforms/Jumpsuit/clown_banana.rsi
   - type: Clothing
     sprite: Clothing/Uniforms/Jumpsuit/clown_banana.rsi
-    femaleMask: UniformTop
   - type: Construction
     graph: BananaClownJumpsuit
     node: jumpsuit
index e113f0ffc76ce7c3ea5f3f02ae62666f3e0d0ffc..7d4dfc59905a2e142cb05289381d379a2cf5cca5 100644 (file)
@@ -19,8 +19,6 @@
     - state: mask_null
       map: [ "overlay" ]
   - type: Clothing
-    femaleMask: UniformTop
-    maleMask: UniformTop
     sprite: Clothing/Uniforms/procedural.rsi
     clothingVisuals:
       jumpsuit:
index 8b3c66d5dd18f47dd79cde0342688998a66323af..fa0f5356a66c67d578e6c81affc00b5c7b95d15c 100644 (file)
@@ -28,8 +28,6 @@
     spawned:
       - id: FoodMeatSpider
         amount: 5
-  - type: Inventory
-    templateId: arachnid
   - type: Reactive
     reactions:
     - reagents: [Water]
       - map: [ "enum.HumanoidVisualLayers.LArm" ]
       - map: [ "enum.HumanoidVisualLayers.RLeg" ]
       - map: [ "enum.HumanoidVisualLayers.LLeg" ]
-      - shader: StencilClear
-        sprite: Mobs/Species/Human/parts.rsi #PJB on stencil clear being on the left leg: "...this is 'fine'" -https://github.com/space-wizards/space-station-14/pull/12217#issuecomment-1291677115
-        # its fine, but its still very stupid that it has to be done like this instead of allowing sprites to just directly insert a stencil clear.
-        # sprite refactor when
-        state: l_leg
-      - shader: StencilMask
-        map: ["enum.HumanoidVisualLayers.StencilMask"]
-        sprite: Mobs/Customization/masking_helpers.rsi
-        state: unisex_full
-        visible: false
       - map: ["jumpsuit"]
       - map: ["enum.HumanoidVisualLayers.LFoot"]
       - map: ["enum.HumanoidVisualLayers.RFoot"]
         sprite: "Effects/creampie.rsi"
         state: "creampie_arachnid"
         visible: false
+  - type: Inventory
+    templateId: arachnid
+
 
 - type: entity
   parent: BaseSpeciesDummy
   - type: HumanoidAppearance
     species: Arachnid
 
-#88w88
+
+#>88w88<
index 8702bbe0218c3a78e292671b46472192e1216a04..356f185fd13ed29ce911c59425edc39e88a8c3ba 100644 (file)
     - map: [ "enum.HumanoidVisualLayers.LArm" ]
     - map: [ "enum.HumanoidVisualLayers.RLeg" ]
     - map: [ "enum.HumanoidVisualLayers.LLeg" ]
-    - shader: StencilClear
-      sprite: Mobs/Species/Human/parts.rsi #PJB on stencil clear being on the left leg: "...this is 'fine'" -https://github.com/space-wizards/space-station-14/pull/12217#issuecomment-1291677115
-      # its fine, but its still very stupid that it has to be done like this instead of allowing sprites to just directly insert a stencil clear.
-      # sprite refactor when
-      state: l_leg
-    - shader: StencilMask
-      map: ["enum.HumanoidVisualLayers.StencilMask"]
-      sprite: Mobs/Customization/masking_helpers.rsi
-      state: unisex_full
-      visible: false
     - map: ["jumpsuit"]
     - map: ["enum.HumanoidVisualLayers.LFoot"]
     - map: ["enum.HumanoidVisualLayers.RFoot"]
     - map: [ "enum.HumanoidVisualLayers.LArm" ]
     - map: [ "enum.HumanoidVisualLayers.RLeg" ]
     - map: [ "enum.HumanoidVisualLayers.LLeg" ]
-    - shader: StencilClear
-      sprite: Mobs/Species/Human/parts.rsi
-      state: l_leg
-    - shader: StencilMask
-      map: ["enum.HumanoidVisualLayers.StencilMask"]
-      sprite: Mobs/Customization/masking_helpers.rsi
-      state: unisex_full
-      visible: false
     - map: ["jumpsuit"]
     - map: ["enum.HumanoidVisualLayers.LFoot"]
     - map: ["enum.HumanoidVisualLayers.RFoot"]
   - type: UserInterface
     interfaces:
       enum.HumanoidMarkingModifierKey.Key: # sure, this can go here too
-        type: HumanoidMarkingModifierBoundUserInterface
+        type: HumanoidMarkingModifierBoundUserInterface
\ No newline at end of file
index 7edb3a19dbad6f31b739b2501dcb3ca88c89321b..d6597ce65d3858203461524b8667955d2ff1f16e 100644 (file)
@@ -82,8 +82,6 @@
           - MobMask
         layer:
           - MobLayer
-  - type: Inventory
-    templateId: diona
   - type: Speech
     speechVerb: Plant
   - type: Vocal
     actionPrototype: DionaGibAction
     allowedStates:
     - Dead
+  - type: Inventory
+    templateId: diona
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
 
 - type: entity
   parent: BaseSpeciesDummy
   id: MobDionaDummy
   noSpawn: true
   components:
-  - type: Inventory
-    templateId: diona
   - type: HumanoidAppearance
     species: Diona
+  - type: Inventory
+    templateId: diona
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
index 5a54b56c48e0f3bfca795d04c869b9ded4d633db..932eda879efa46839d1189d2e13895b1e36aa751 100644 (file)
     hideLayersOnEquip:
     - Hair
     - Snout
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
 
 - type: entity
   parent: BaseSpeciesDummy
   components:
   - type: Sprite
     scale: 1, 0.8
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
index c514a6f1a050bf6f2c0e93c238a271a2687fffbd..d0b065bc21267786b178f074373a6da3f1b34e79 100644 (file)
           - MobMask
         layer:
           - MobLayer
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
+
 
 - type: entity
   parent: BaseSpeciesDummy
   components:
   - type: HumanoidAppearance
     species: Gingerbread
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
index 6716d3902b82259f66aef1912191a8eeb5c4bf6c..392185ef77c37953b7c030efc050636b085d7cdb 100644 (file)
     hideLayersOnEquip:
     - Hair
     - Snout
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
+
 
 - type: entity
   parent: BaseSpeciesDummy
   id: MobHumanDummy
   noSpawn: true
+  components:
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
+
index f6fde849efebee8c291710979c5e50218a865655..f3eaeb32c795393b60f41338c4c3bced99f2e9fe 100644 (file)
       - map: [ "enum.HumanoidVisualLayers.LArm" ]
       - map: [ "enum.HumanoidVisualLayers.RLeg" ]
       - map: [ "enum.HumanoidVisualLayers.LLeg" ]
-      - shader: StencilClear
-        sprite: Mobs/Species/Human/parts.rsi #PJB on stencil clear being on the left leg: "...this is 'fine'" -https://github.com/space-wizards/space-station-14/pull/12217#issuecomment-1291677115
-        # its fine, but its still very stupid that it has to be done like this instead of allowing sprites to just directly insert a stencil clear.
-        # sprite refactor when
-        state: l_leg
-      - shader: StencilMask
-        map: [ "enum.HumanoidVisualLayers.StencilMask" ]
-        sprite: Mobs/Customization/masking_helpers.rsi
-        state: unisex_full
-        visible: false
       - map: [ "jumpsuit" ]
       - map: [ "enum.HumanoidVisualLayers.LHand" ]
       - map: [ "enum.HumanoidVisualLayers.RHand" ]
         sprite: "Effects/creampie.rsi"
         state: "creampie_moth"
         visible: false
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
+
 
 - type: entity
   parent: BaseSpeciesDummy
   components:
   - type: HumanoidAppearance
     species: Moth
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
+
index 0d93e6fe51a81f9adada5fa2e27c967e00a4a423..6f0705635a09951212e89e6c1a7ff15f77d3232f 100644 (file)
@@ -26,8 +26,6 @@
     spawned:
     - id: FoodMeatLizard
       amount: 5
-  - type: Inventory
-    speciesId: reptilian
   - type: LizardAccent
   - type: Speech
     speechSounds: Lizard
       types:
         Heat : 1.5 #per second, scales with temperature & other constants
   - type: Wagging
+  - type: Inventory
+    speciesId: reptilian
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
+
 
 - type: entity
   parent: BaseSpeciesDummy
     - HeadSide
   - type: Inventory
     speciesId: reptilian
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
 
 #Weh
index 41d81a0e9dd1f965f3acdf706fe4cfe778ff5301..659bf7467e27defa1bf486962f8fcb8ced624de6 100644 (file)
   - type: FireVisuals
     alternateState: Standing
   - type: FlashImmunity
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
 
 - type: entity
   parent: BaseSpeciesDummy
   id: MobSkeletonPersonDummy
   noSpawn: true
   components:
-    - type: HumanoidAppearance
-      species: Skeleton
+  - type: HumanoidAppearance
+    species: Skeleton
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
index 6d5c8697f46de06bffbb59f1dfb41d9d2c6ca53b..0420452ce95763397f58e4b37ba977acb3f9910d 100644 (file)
       types:
         Asphyxiation: -1.0
     maxSaturation: 15
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
 
 - type: entity
   parent: MobHumanDummy
   id: MobSlimePersonDummy
   noSpawn: true
   components:
-    - type: HumanoidAppearance
-      species: SlimePerson
+  - type: HumanoidAppearance
+    species: SlimePerson
+  - type: Inventory
+    femaleDisplacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Human/displacement.rsi
+            state: jumpsuit-female
index 02e2791e3541a1914edcbc580ea4866e9c94aafa..5f4d4719397cfcacdb0219c9a1d624510f6b9573 100644 (file)
   - type:  HumanoidAppearance
     species: Vox
     #- type: VoxAccent # Not yet coded
-  - type: Inventory
-    speciesId: vox
-    displacements:
-      jumpsuit:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: jumpsuit
-          copyToShaderParameters:
-            # Value required, provide a dummy. Gets overridden when applied.
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
-      eyes:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: eyes
-          copyToShaderParameters:
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
-      gloves:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: hand
-          copyToShaderParameters:
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
-      back:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: back
-          copyToShaderParameters:
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
   - type: Speech
     speechVerb: Vox
     speechSounds: Vox
       sprite: "Effects/creampie.rsi"
       state: "creampie_vox" # Not default
       visible: false
+  - type: Inventory
+    speciesId: vox
+    displacements:
+      jumpsuit:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: jumpsuit
+      eyes:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: eyes
+      gloves:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: hand
+      back:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: back
+      ears:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: ears
+      shoes:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: shoes
 
 - type: entity
   parent: BaseSpeciesDummy
     speciesId: vox
     displacements:
       jumpsuit:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: jumpsuit
-          copyToShaderParameters:
-            # Value required, provide a dummy. Gets overridden when applied.
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: jumpsuit
       eyes:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: eyes
-          copyToShaderParameters:
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: eyes
       gloves:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: hand
-          copyToShaderParameters:
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: hand
       back:
-        layer:
-          sprite: Mobs/Species/Vox/displacement.rsi
-          state: back
-          copyToShaderParameters:
-            layerKey: dummy
-            parameterTexture: displacementMap
-            parameterUV: displacementUV
-
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: back
+      ears:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: ears
+      shoes:
+        sizeMaps:
+          32:
+            sprite: Mobs/Species/Vox/displacement.rsi
+            state: shoes
diff --git a/Resources/Textures/Mobs/Species/Human/displacement.rsi/jumpsuit-female.png b/Resources/Textures/Mobs/Species/Human/displacement.rsi/jumpsuit-female.png
new file mode 100644 (file)
index 0000000..be9c106
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Human/displacement.rsi/jumpsuit-female.png differ
diff --git a/Resources/Textures/Mobs/Species/Human/displacement.rsi/meta.json b/Resources/Textures/Mobs/Species/Human/displacement.rsi/meta.json
new file mode 100644 (file)
index 0000000..7ac587c
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "version": 1,
+    "license": "CC-BY-SA-3.0",
+    "copyright": "Made by TheShuEd",
+    "size": {
+        "x": 32,
+        "y": 32
+    },
+    "load": {
+        "srgb": false
+    },
+    "states": [
+        {
+            "name": "jumpsuit-female",
+            "directions": 4
+        }
+    ]
+}
diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/ears.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/ears.png
new file mode 100644 (file)
index 0000000..0b16382
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/ears.png differ
index 81bdd40e0cb0cd0e05ef97623aa7897bdad4e256..2152470bd1f4c1e40ffa6b7193d1a739c898f6b8 100644 (file)
@@ -1,7 +1,7 @@
 {
     "version": 1,
     "license": "CC-BY-SA-3.0",
-    "copyright": "jumpsuit state made by PJB3005. back, hand, and eyes states made by Flareguy",
+    "copyright": "jumpsuit state made by PJB3005. back, hand, and eyes states made by Flareguy, ears and shoes made by TheShuEd",
     "size": {
         "x": 32,
         "y": 32
             "name": "hand",
             "directions": 4
         },
+        {
+            "name": "ears",
+            "directions": 4
+        },
         {
             "name": "eyes",
             "directions": 4
+        },
+        {
+            "name": "shoes",
+            "directions": 4
         }
     ]
 }
diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/shoes.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/shoes.png
new file mode 100644 (file)
index 0000000..107a750
Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/shoes.png differ