Jump to content

MCGUFIN

  • entries
    16
  • comments
    9
  • views
    3416

Armor Coverage


Monoman1

789 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

 

Transparent Catsuit. Compare visual coverage here with the red catsuit. 
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

9 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. ;)

MeWako

Posted (edited)

This is exactly what I was wondering about before I found this page.
But my idea is to make a .dll mod that adjusts the armor rating or damage taken by calculating how much skin is exposed. Comparing the exposed mesh to a baseline mesh model. But your idea is far more advanced. 

IF it may, when you release your MGF mod, so I can make my mod for it, using your mod as a hard requirement.

Thanks again for your hard work!

Edited by MeWako
audhol

Posted

Very interesting MM1 so are you monitoring the vertices and their position in the mesh to generate your values?

 

Like you take their location relative to the base body for fit and their structure for coverage?

 

What about mods that have verticies with a totaly transparent diffuse, can you spot that? 

 

Are you then using the alpha properties of the mesh for getting tranceparency values?

 

If thats correct then your calculations are body type dependant right?

 

Can your values be read by other mods like for example AND to generate keywords without the need for patches?

 

Knowing you there is  probably some masterplan for an all encompasing mod behind this groundwork!

 

Good to see you still around and tinkering, whatever it is you got cooking I'm looking forward to seeing it.

 

Monoman1

Posted (edited)

18 hours ago, audhol said:

so are you monitoring the vertices and their position in the mesh to generate your values?

 

Like you take their location relative to the base body for fit and their structure for coverage?

Yes essentially. 

 

18 hours ago, audhol said:

What about mods that have verticies with a totaly transparent diffuse, can you spot that? 

 

Are you then using the alpha properties of the mesh for getting tranceparency values?

Doesn't matter if it was completely invisible. You can ask the system how much is covered (pure physical coverage for the likes of survival/exposure/armor type mods) or you can ask how much is visually covered. Compare the transparent catsuit below with the red catsuit above. The values shown are visual coverage. Asking for pure physical coverage on the transparent catsuit would return the same values as the red catsuit (basically 100% everywhere), but the visual coverage of the transparent catsuit versus the red catsuit is totally different. Fit wise they are the same - second skin. Transparency is considered 'per shape' in the complete mesh. Other shapes may have different alpha properties and thus different visual coverage values. 

image.png

 

18 hours ago, audhol said:

If thats correct then your calculations are body type dependant right?

Yes. The mod will ship with a 3BA reference. Other body types will have to be painted. 
 

18 hours ago, audhol said:

Can your values be read by other mods like for example AND to generate keywords without the need for patches?

Yes, values can be read. You can check a specific region if you want or pull the entire list as a float array. 

Sounds doable. But then why even rely on keywords at all. All you're doing is translating from one description language to another. Where there may be inconsistency in the translating...

Edited by Monoman1
audhol

Posted

5 hours ago, Monoman1 said:

Sounds doable. But then why even rely on keywords at all. All you're doing is translating from one description language to another.

So I'm guessing you've already got a framework in the pipeline to use these values for outcomes?

 

What is the polling rate for the coverage? Does your system include position of SMP enabled meshes? Can it track the position of a skirt for example that may move and expose more or less of the base body underneath?

 

I don't mean to sound like the Spanish inquisition, I'm just interested.

Monoman1

Posted

3 hours ago, audhol said:

So I'm guessing you've already got a framework in the pipeline to use these values for outcomes?

Ah nope. Mcgufin IS the framework .
I can think of a few ideas though. 

 

3 hours ago, audhol said:

What is the polling rate for the coverage? Does your system include position of SMP enabled meshes? Can it track the position of a skirt for example that may move and expose more or less of the base body underneath?

No polling. Entirely event based. Piggy-backs on the 'Lazy Equip Update' event (over on the events page). 

SMP - no. I tried with physics. It was a mess. Values varied wildly just idling on the spot. At the time though I was looking for predictable results - Same outfit = Same values all the time. Maybe some day. Can't think of much use for a physics tracking coverage system though. Except maybe flashing the knickers on a particularly unsettled day. 

audhol

Posted

9 hours ago, Monoman1 said:

Ah nope. Mcgufin IS the framework .

OMG sorry I was being dumb. I saw a post in this thread on the main LL page and didn't even realise it was a sub thread of a larger blog!

 

Time for some serious reading.

 

 

×
×
  • Create New...