Jump to content

MCGUFIN

  • entries
    16
  • comments
    3
  • views
    3151

Armor Coverage


Monoman1

608 views

Sneak peek at the 'Armor Coverage' system in MGF. The system can automatically determine: 
Cover - How much of an area is actually covered in armor. 
Fit - How tightly, on average, that armor sits to the skin. (Recent addition. Still tweaking it). 'n/a' for fit means there wasn't enough coverage in the area to provide an accurate fit value. 

No messing about with keywords etc involved. Information is parsed from the mesh itself. 

 

May or may not make it into the final product depending on reliability but I've been encouraged by recent results. 

Examples: 

 

Body: 

Spoiler


Black robes. Full body cover. Pretty baggy fit in places (especially legs):
image.png

 

Barkeep clothes. More revealing. Tighter fit on the chest. No built in panties (genitals - low fit but covered by skirt). 
image.png

 

Tavern. Built in panties (genitals covered by skirt, high fit because panties). 

Good example of asymmetric detection. Note the split down the left side of the skirt and the effect on thigh left. 
The 'built in' necklace here is hitting the chest/cleavage areas where it wasn't on the barkeep. 
Normally I'd 'zap' out stuff like that anyway...
image.png

 

Steel Plate (Remodeled)

Includes panties. 
image.png

 

Iron bikini: 
image.png

 

Lingerie. Includes 'sheer' detection: 
image.png

 

Harness. Fishnet detection: 
image.png

 

Catsuit. High coverage but fit is also very high everywhere (not much left to imagination). 
image.png

 

I've expanded the system to cover feet: 

Spoiler

image.png

 

Works for heels: 
image.png

 

Strappy Heels: 
image.png

 

Slave heels:
Note 'FootSole' in this one - Possibly a good discriminator for a state where you have boots equipped but they still count as 'barefoot': 
image.png

 

Head:

Spoiler

Face - Possibly a good discriminator of whether Npcs can recognise you. 

 

image.png

 

image.png

 

image.png

 

image.png

 

Armor By Region: 

Allows you to ask which armor actually covers any region. Either from the outside to inside or vice versa. Nothing to do with slotmasks etc. 

Spoiler

Barkeeper dress. Iron bikini bottom underneath: 
(Barkeeper outfit is covering pretty much every region here but check the actual coverage - Most are low: head, face, neck, chest, shoulders, calves)
image.png

 

Full Iron Bikini Kit: 
image.png

 


API:

Spoiler
;========================================================================================
; Armor Coverage System (Experimental)(WIP) =============================================
;========================================================================================

; --- Setup (once per body, actor naked) ---------------------------------------

; Step 1 of 2. Reference body EQUIPPED. Captures the vertex -> region lookup.
Function LoadRegionMap(Actor akActor) Global Native

; Step 2 of 2. Reference UNEQUIPPED, fully naked. Snapshots the real body's
; cells per region as the baseline. Requires LoadRegionMap first.
Function BuildBaselineOnly(Actor akActor) Global Native

; --- Runtime (every equip change) ---------------------------------------------

; Captures the equipped armour. Call before TriggerCoverageUpdate.
Function BuildArmorSnapshot(Actor akActor) Global Native

; Starts an async coverage compute. 
; Fires ONE "_MGF_CoverageUpdate" mod event. 
; (sender = actor, strArg = "ok"/"no_snapshot"/"no_3d"/"no_baseline"/"failed", numArg = 1.0 fresh result / 0.0 invalidated). 
Function TriggerCoverageUpdate(Actor akActor) Global Native

; Returns all MGF regions as a string array. Actor-independent.
String[] Function GetCoverageRegionNames() Global Native

; Cached coverage 0.0 - 1.0 for a region index, or -1.0 if none/invalidated.
Float Function GetRegionCoverage(Actor akActor, Int RegionIdx) Global Native

; Returns the coverage of all regions as an array of floats (0.0 - 1.0).
; -1.0 = unknown / no result. Likely the actor was not set up properly. 
; Sheer: 	True - Visual coverage - Sheer/fishnet shapes will have their coverage reduced. 
;			False - Pure physical coverage. No sheer/fishnet adjustment (Considers all shapes opaque). 
Float[] Function GetAllRegionCoverage(Actor akActor, Bool Sheer = true) Global Native

; Fit per region. Parallel to GetCoverageRegionNames. 0.0 – 1.0 (1 = skin-tight. 0 = loose).  
; -1.0 = n/a (below tightness gate) / unknown / no result.
Float[] Function GetAllRegionFit(Actor akActor) Global Native

; Returns selected regions coverage/fit. Parallel with Regions. -1.0 if the region is unknown. 
Float[] Function GetRegionsCoverage(Actor akActor, String[] Regions, Bool Sheer = true) Global Native
Float[] Function GetRegionsFit(Actor akActor, String[] Regions) Global Native

; The armour providing most of each region's coverage, in the order given.
; Outermost = the layer you'd see. False = the layer against the skin.
; None where the region's coverage is below MinCover, or unknown, naked or not cached.
Armor[] Function GetRegionsArmor(Actor akActor, String[] Regions, Bool Outermost = true, Float MinCover = 0.04) Global Native

; That armour's share of the region's coverage, 0.0-1.0 (0.0 where GetRegionsArmor gives None).
Float[] Function GetRegionsArmorShare(Actor akActor, String[] Regions, Bool Outermost = true, Float MinCover = 0.04) Global Native

; --- Debug ---------------------------------------------------------------------

; Synchronous capture + compute, logs the full table. This will freeze the game while in process - Debugging only. 
Function TestCoverage(Actor akActor) Global Native

; Diagnostic log level: 0 off | 1 summary | 2 result | 3 audit | 4 cell | 5 trace.
Function SetCoverageLogLevel(Int level) Global Native

; Returns the active diagnostic log level.
Int Function GetCoverageLogLevel() Global Native

 

 

Edited by Monoman1

3 Comments


Recommended Comments

Talesien

Posted (edited)

Really interesting. I already found the room management system intriguing, though without applications for me so far, this one I can see applications for sure. I'm getting the feeling though no one but you knows what MGF really stands for (yes Monoman's Common General Utility Framework, but what is it really? What's the goal? And when will we get to drive you crazy with bug reports and questions?). 

Edited by Talesien
Monoman1

Posted (edited)

On 9/18/2026 at 2:29 PM, Talesien said:

Really interesting. I already found the room management system intriguing, though without applications for me so far, this one I can see applications for sure. I'm getting the feeling though no one but you knows what MGF really stands for (yes Monoman's Common General Utility Framework, but what is it really? What's the goal? And when will we get to drive you crazy with bug reports and questions?). 

Well the purpose really is to be a useful framework. Theres no overall goal so theres no focus per se. But it basically boils down to:

1. Give modders functionality they didnt have before: Eg: Events, alias operation, array utilities. 

2. Interoperability layers - Forks (pregnancy/sex/needs/followers). + individual direct interfaces. 

3. Context.

 

I've always maintained context is very important. Take prostitution mods for example. Most have you just bang clients anywhere. In the streets, in the middle of the bannered mare etc. . With MGF you can determine a private room with a bed.

 

Or extend that even further. Say you're whoring yourself out. Perhaps one of the factors for successful solicitation is wearing a nice outfit (Armor coverage). Something revealing. Now say you're whoring yourself to Ulfberth. You can find out that his wife is Adrianne (relationships), have him lead you to his actual bed (one of the composed functions in _MGF_Main). Close the door to the bedroom (room detection). Maybe Adrianne's already asleep in the bed (room detection). If so then do it downstairs in the kitchen. Maybe Adrianne hears something, wakes up and goes to have a look. Maybe she enters the room (room tracking) to find you and Ulfberth doing the unspeakable. Maybe you just gained a rival (soft relationships). 

 

This would be pretty difficult if not impossible to do without mgf. 

 

As for when. Dont know. Bethesdas latest update didnt help...

Edited by Monoman1
Talesien

Posted

I see, thanks, and well when did a Bethesda update ever help with a modding project (okok, aside from doubling the record number for light plugins in .1130)?

Or maybe we find out Ulfberth is the victim of domestic violence. ;)

×
×
  • Create New...