Armor Coverage
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:
Black robes. Full body cover. Pretty baggy fit in places (especially legs):
Barkeep clothes. More revealing. Tighter fit on the chest. No built in panties (genitals - low fit but covered by skirt).
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...
Steel Plate (Remodeled)
Includes panties.
Iron bikini:
Lingerie. Includes 'sheer' detection:
Harness. Fishnet detection:
Catsuit. High coverage but fit is also very high everywhere (not much left to imagination).
I've expanded the system to cover feet:
Works for heels:
Strappy Heels:
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':
Head:
Face - Possibly a good discriminator of whether Npcs can recognise you.
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.
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)
Full Iron Bikini Kit:
API:
;======================================================================================== ; 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