Skip to content

Instantly share code, notes, and snippets.

@natyusha
Last active October 26, 2019 17:24
Show Gist options
  • Save natyusha/7f41cb82f86e50c8457dd8c625b1e27a to your computer and use it in GitHub Desktop.
Save natyusha/7f41cb82f86e50c8457dd8c625b1e27a to your computer and use it in GitHub Desktop.
BBWVR2 Helper
rollout BBWVR2_Rollout "BBWVR2 Helper" width:170 ( -- main rollout
/*
BBWVR2 Helper maxscript written by natyusha for use with the BBWVR2-Rig.
Designed to facilitate fast exports of preset body sizes with automated vertex normal smoothing.
With this tool custom body sizes can be created and exported at an extremely rapid pace.
*/
group "Prep Modifiers and Smooth" ( -- buttons for calling functions that smooth normals and enable the correct modifiers for a given bodytype
button 'btnBody' "Body\nStandard" across:2 width:70 height:30 align:#left tooltip:"average normals and prep modifiers for the nude upper body"
button 'btnBodyF' "Body\nFeatureless" width:70 height:30 align:#right tooltip:"average normals and prep modifiers for the featureless upper body"
button 'btnLegs' "Legs\nNew Gens" across:2 width:70 height:30 align:#left tooltip:"average normals and prep modifiers for the nude legs, genitals and anus"
button 'btnLegsF' "Legs\nFeatureless" width:70 height:30 align:#right tooltip:"average normals and prep modifiers for the featureless legs"
button 'btnLegsFB' "Legs\nFemboy" across:2 width:70 height:30 align:#left tooltip:"average normals and prep modifiers for the featureless legs and anus"
button 'btnLegsFuta' "Legs\nFutalicious" width:70 height:30 align:#right tooltip:"average normals and prep modifiers for the donger"
button 'btnLegsGen2' "Legs\nGen2" across:2 width:70 height:30 align:#left tooltip:"average normals and prep modifiers for gen 2 style legs"
button 'btnExport' "EXPORT" width:70 height:30 align:#right tooltip:"quick export button" -- quick export button
)
group "Primary Layer Selection" ( -- buttons for quickly switching between the parts of the body for export
radiobuttons 'rdoLayerSelect' "" labels:#("Body", "Legs", "Feet", "Hands", "All", "None") across:3 default:0 columns:2 align:#left
checkbox 'chkBones' "" triState:2 align:#right width:15 offset:[39,17] tooltip:"toggle skeleton display"
groupbox 'grpBones' "Bone" width:36 height:40 align:#right
)
group "Secondary Layer Selection" ( -- check boxes for hiding unwanted parts from the currently selected primary layer
checkbox 'chkNude' "Nude" across:2 width:70 triState:2 enabled: false align:#left
checkbox 'chkPiercings' "Piercings" width:70 triState:2 enabled: false align:#right
checkbox 'chkFeatureless' "Featureless" across:2 width:70 triState:2 enabled: false align:#left
checkbox 'chkLingerie' "Lingerie" width:70 triState:2 enabled: false align:#right
checkbox 'chkFuta' "Futalicious" across:2 width:70 triState:2 enabled: false align:#left
checkbox 'chkAnus' "Anus" width:70 triState:2 enabled: false align:#right
)
group "BBWVR2 Size Presets" ( -- morpher and modifier presets for the main BBWVR2 Sizes
dropdownlist 'ddlMorphBody' "Body Size:" items:#("Large", "Medium", "Small", "XtraLarge") across:2 align:#left
dropdownlist 'ddlMorphLegs' "Leg Size:" items:#("Bubble", "Medium", "Small", "XtraBubble") align:#right
dropdownlist 'ddlMorphNewGens' "New Gens:" items:#("Base", "Spread", "Insertion", "Gape", "Innie") across:2 align:#left
dropdownlist 'ddlMorphAnus' "Anus State:" items:#("Base", "Gape") align:#right
dropdownlist 'ddlMorphFuta' "Futalicious:" items:#("Erect Small", "Erect Small Engorged", "Erect Medium", "Erect Medium Engorged", "Erect Large", "Erect Large Engorged", "Erect XtraLarge","Erect XtraLarge Engorged", "Erect Hyper", "Flaccid Small", "Flaccid Medium", "Flaccid Large", "Flaccid XtraLarge", "Flaccid Hyper") across:2 align:#left
dropdownlist 'ddlAreola' "Areola Size:" items:#("Base", "Large") align:#right
button 'btnDefaults' "Restore Default Sizes" width:144 align:#center tooltip:"enable natyusha's personal size preset"
)
hyperlink 'discord' "-Join natyusha's Discord-" address:"https://discord.gg/TDmUWpN" align:#center -- discord link for people who need help
--######### mesh and modifier name variables #########--
local Body = $'Body0-Torso_0'
local BodyF = $'Body0-Torso[Featureless]_0'
local BodyL = $'Body-Lingerie_1'
local BodyP = $'Body-Piercings_1'
local Butt = $'Legs0-Butt_0'
local ButtF = $'Legs0-Butt[Featureless]_0'
local ButtL = $'Legs-Lingerie_1'
local ButtP = $'Legs-Piercings_1'
local NewGens = $'Legs3-NewGens_0.3'
local Anus = $'Legs4-Anus_0.4'
local Futa = $'Legs5-Futalicious_0.5'
local Knees = $'Legs2-Knees_0.2'
local Shins = $'Legs1-Shins_0.1'
local Normal = #Edit_Normals_Main
local NormalF = #Edit_Normals_Featureless
local NormalL = #Edit_Normals_Lingerie
local NormalNG = #Edit_Normals_NewGens
local NormalGen2 = #Edit_Normals_Gen2
local NormalFuta = #Edit_Normals_Futalicious
local NormalFB = #Edit_Normals_Femboy
local MeshFB = #Edit_Mesh_Femboy
local MeshHP = #Edit_Mesh_HidePrivates
local UnwrapBodyL = #(#Unwrap_UVW_BBWVR2_L, #Unwrap_UVW_BBWVR2_M, #Unwrap_UVW_BBWVR2_S, #Unwrap_UVW_BBWVR2_XL)
local UnwrapFB = #Unwrap_UVW_Femboy
local UnwrapA = #Unwrap_UVW_LargeAreola
local Layers = #("Body*", "Legs*", "Feet*", "Hands*", "*", "Null", "Bones", "Targets", "*Nude*", "*Featureless", "*Lingerie", "*Piercings", "Legs Nude Anus", "Legs Futalicious")
local o = 8 -- futa morpher offset
local h -- checkbox state scope fix
--######### functions below this point #########--
fn emptySelection = ( -- function for deselecting everything and staying in modify mode
max modify mode
max select none
clearSelection()
)
fn NormalSelectAll x n = ( -- function for selecting all the normals in the edit normals modifier on the defined mesh
x.ishidden=false
max modify mode
modPanel.setCurrentObject x.modifiers[n]
subobjectLevel = 1
max select all
)
fn NormalAvgUni x n = ( -- function for breaking, averaging and unifying selected normals on the defined mesh
x.modifiers[n].EditNormalsMod.Break ()
redrawViews()
x.modifiers[n].EditNormalsMod.Average useThresh:on threshold:0.001
max select all
x.modifiers[n].EditNormalsMod.Unify toAverage:on
max select none
)
fn setChkProps x t y = ( -- function for setting and activating a checkbox of a given name to a given state when a btn is pressed
x.triState = t
x.enabled = y
x.changed x.triState
)
fn setChkTri t = ( -- function for setting checkboxes depending on the primary layer
chkBones.triState = t
chkNude.triState = t
chkAnus.triState = t
chkFeatureless.triState = t
chkLingerie.triState = t
chkFuta.triState = t
chkPiercings.triState = t
)
fn setChkEnable t = ( -- function for enabling checkboxes depending on the primary layer
chkNude.enabled = t
chkAnus.enabled = t
chkFeatureless.enabled = t
chkLingerie.enabled = t
chkFuta.enabled = t
chkPiercings.enabled = t
)
fn layerToggle x = ( -- function for hiding layers that don't match the entered string
for n=0 to layerManager.count-1 do (
layer = layerManager.getLayer n
if matchPattern layer.name pattern:x do layer.isHidden = h
)
)
fn setMorphs x t = ( -- function for resetting all morphs then setting the defined one to 100
max create mode
select x
for i = 1 to 25 where x.morpher_variants[i].value != undefined do x.morpher_variants[i].value = 0
if x.morpher_variants[t].value != undefined do x.morpher_variants[t].value = 100
)
fn ddlMorphBodySel m = ( -- body size presets
setMorphs Body m
setMorphs BodyF m
setMorphs BodyL m
setMorphs BodyP m
max modify mode
select BodyL -- select the correct uvw modifier for lingerie
for i = 1 to UnwrapBodyL.count do (
if i == m then (x = true) else (x = false)
BodyL.modifiers[UnwrapBodyL[i]].enabled = x
)
modpanel.setcurrentobject (modpanel.getcurrentobject())
emptySelection()
)
fn ddlMorphLegsSel m = ( -- leg size presets
setMorphs Butt m
setMorphs ButtF m
setMorphs ButtL m
setMorphs Knees m
setMorphs Shins m
emptySelection()
)
fn ddlMorphNewGensSel m = ( -- new gens shape presets
setMorphs NewGens m
setMorphs ButtP 1
if m == 4 then NewGens.morpher_variants[m].value = 80 -- hardcoded new gens gape slider
if m == 5 then ButtP.morpher_variants[1].value = 69 -- hardcoded innie piercing slider
emptySelection()
)
fn ddlMorphAnusSel m = ( -- anus gape shape presets
setMorphs Anus m
if m == 2 then Anus.morpher_variants[m].value = 80 -- hardcoded anus gape slider
emptySelection()
)
fn ddlMorphFutaSel m = ( -- futalicious size and shape presets
setMorphs Futa (m+o)
emptySelection()
)
fn ddlAreolaSel m = ( -- areola size presets
max modify mode
select Body
if m == 1 then ( -- set the correct modifier
Body.modifiers[UnwrapA].enabled = false
)
else (
Body.modifiers[UnwrapA].enabled = true
)
modpanel.setcurrentobject (modpanel.getcurrentobject())
emptySelection()
)
--######### assign functions to the ui below this point #########--
on btnBody pressed do ( -- average body normals
setChkProps chkNude 1 true
setChkProps chkPiercings 1 true
setChkProps chkBones 1 true
-- select all the normals in the edit normals modifier on the correct mesh
NormalSelectAll Body Normal
-- deselect waist, arm and neck seam normals [hardcoded]
Body.modifiers[Normal].EditNormalsMod.Select #{421..427, 577..581, 583, 585 ,408..416, 467..468, 475, 482, 487, 493, 499, 505, 510, 417..420, 539, 544..545, 550, 857..862} select:off
-- break, average and unify selected normals
NormalAvgUni Body Normal
emptySelection()
)
on btnBodyF pressed do ( -- average featureless body normals
-- set checkboxes
setChkProps chkFeatureless 1 true
setChkProps chkLingerie 1 true
setChkProps chkBones 1 true
-- select all the normals in the edit normals modifier on the correct mesh
NormalSelectAll BodyF NormalF
-- deselect waist, arm and neck seam normals [hardcoded]
BodyF.modifiers[NormalF].EditNormalsMod.Select #{313..319, 473..477, 479, 481, 362..363, 370, 377, 382, 388, 394, 400, 405, 299..307, 308..312, 320..321, 434..435, 440..441, 446, 645..646} select:off
-- break, average and unify the rest of the normals
NormalAvgUni BodyF NormalF
-- select all the lingerie normals, break, average and unify them
NormalSelectAll BodyL NormalL
NormalAvgUni BodyL NormalL
emptySelection()
)
on btnLegs pressed do ( -- convert legs to new gens and average
-- enable the correct leg modifiers and set checkboxes
setChkProps chkNude 1 true
setChkProps chkPiercings 1 true
setChkProps chkBones 1 true
Butt.ishidden=false
NewGens.ishidden=false
Anus.ishidden=false
max modify mode
select Anus
Anus.modifiers[NormalFB].enabled = false
select Butt
Butt.modifiers[MeshHP].enabled = true
Butt.modifiers[NormalNG].enabled = true
modpanel.setcurrentobject (modpanel.getcurrentobject())
-- select all the normals in the edit normals modifier on the correct meshes
selectMore NewGens
selectMore Anus
subobjectLevel = 1
max select all
-- deselect waist and thigh seam normals [hardcoded]
Butt.modifiers[NormalNG].EditNormalsMod.Select #{1, 4..5, 7, 9, 11, 13, 15, 17, 297, 300..301, 303, 305, 307, 309, 311, 313, 132, 139..140, 142, 144, 147, 428, 435..436, 438, 440, 443, 138, 434} select:off node:Butt
Butt.modifiers[NormalNG].EditNormalsMod.Break node:Butt
redrawViews()
NewGens.modifiers[NormalNG].EditNormalsMod.Break node:NewGens
redrawViews()
Anus.modifiers[NormalNG].EditNormalsMod.Break node:Anus
redrawViews()
-- average butt, new gens and anus normals across multiple meshes with 10 passes incase of seam issues
for i = 1 to 10 do (
for i in selection do (
i.modifiers[NormalNG].EditNormalsMod.Average useThresh:on threshold:0.001 node:Butt
i.modifiers[NormalNG].EditNormalsMod.Average useThresh:on threshold:0.001 node:NewGens
i.modifiers[NormalNG].EditNormalsMod.Average useThresh:on threshold:0.001 node:Anus
i.modifiers[NormalNG].EditNormalsMod.AverageGlobal useThresh:on threshold:0.001
)
)
-- fix butt crack [hardcoded]
max select none
Butt.modifiers[NormalNG].EditNormalsMod.Select #{27, 323, 622, 704, 709, 1793, 1877, 1881, 25, 321, 610, 612, 1782, 1784, 24, 320, 616, 1787, 29, 325, 615, 806, 809, 1788, 1979, 1981, 119, 415, 1328, 2499, 219, 515, 1169, 1326..1} node:Butt
Butt.modifiers[NormalNG].EditNormalsMod.Break node:Butt
redrawViews()
Butt.modifiers[NormalNG].EditNormalsMod.Average useThresh:on threshold:0 node:Butt
-- unify butt, new gens and anus normals
max select all
for i in selection do (
i.modifiers[NormalNG].EditNormalsMod.Unify node:Butt toAverage:on
i.modifiers[NormalNG].EditNormalsMod.Unify node:NewGens toAverage:on
i.modifiers[NormalNG].EditNormalsMod.Unify node:Anus toAverage:on
)
emptySelection()
)
on btnLegsF pressed do ( -- convert legs to featureless and average
-- enable correct modifiers and set checkboxes
setChkProps chkFeatureless 1 true
setChkProps chkLingerie 1 true
setChkProps chkBones 1 true
ButtF.ishidden=false
max modify mode
select ButtF
ButtF.modifiers[NormalF].enabled = true
ButtF.modifiers[NormalFB].enabled = false
ButtF.modifiers[UnwrapFB].enabled = false
ButtF.modifiers[MeshFB].enabled = false
modpanel.setcurrentobject (modpanel.getcurrentobject())
-- select all the normals in the edit normals modifier on the correct mesh
NormalSelectAll ButtF NormalF
-- deselect waist and thigh seam normals [hardcoded]
ButtF.modifiers[NormalF].EditNormalsMod.Select #{1, 4..5, 7, 9, 11, 13, 15, 17, 257, 259, 261, 263..264, 266, 268, 270, 272, 127, 133..135, 137, 139, 142, 381, 388..390, 392, 394, 397} select:off
-- break and average butt normals
NormalAvgUni ButtF NormalF
-- fix butt crack [hardcoded]
ButtF.modifiers[NormalF].EditNormalsMod.Select #{521..522, 1093, 1231..1232, 2108, 2246, 2248, 519..520, 1233, 2247, 517..518, 545, 736, 739, 1561, 1752, 1754, 515..516, 546, 1560, 513..514, 540, 542, 1555, 1557, 511..512, 552, 634, 639, 1566, 1650, 1654}
ButtF.modifiers[NormalF].EditNormalsMod.Break node:ButtF
redrawViews()
ButtF.modifiers[NormalF].EditNormalsMod.Average useThresh:on threshold:0 node:ButtF
-- unify butt normals
max select all
ButtF.modifiers[NormalF].EditNormalsMod.Unify toAverage:on
-- select all the lingerie normals, break, average and unify them
NormalSelectAll ButtL NormalL
NormalAvgUni ButtL NormalL
emptySelection()
)
on btnLegsFB pressed do ( -- convert featureless legs to femboy and average
-- enable correct modifiers and set checkboxes
setChkProps chkFeatureless 1 true
setChkProps chkAnus 1 true
setChkProps chkBones 1 true
ButtF.ishidden=false
Anus.ishidden=false
max modify mode
select ButtF
ButtF.modifiers[MeshFB].enabled = true
ButtF.modifiers[UnwrapFB].enabled = true
ButtF.modifiers[NormalFB].enabled = true
modpanel.setcurrentobject (modpanel.getcurrentobject())
-- select all the normals in the edit normals modifier on the correct meshes
selectMore Anus
subobjectLevel = 1
max select all
-- deselect waist and thigh seam normals and break the rest [hardcoded]
ButtF.modifiers[NormalFB].EditNormalsMod.Select #{1, 4..5, 7, 9, 11, 13, 15, 17, 257, 259, 261, 263..264, 266, 268, 270, 272, 127, 133..135, 137, 139, 142, 381, 388..390, 392, 394, 397} select:off node:ButtF
ButtF.modifiers[NormalFB].EditNormalsMod.Break node:ButtF
redrawViews()
ButtF.modifiers[NormalFB].EditNormalsMod.Break node:Anus
redrawViews()
-- average butt and anus normals across multiple meshes with 10 passes passes incase of seam issues
for i = 1 to 10 do (
for i in selection do (
i.modifiers[NormalFB].EditNormalsMod.Average useThresh:on threshold:0.001 node:ButtF
i.modifiers[NormalFB].EditNormalsMod.Average useThresh:on threshold:0.001 node:Anus
i.modifiers[NormalFB].EditNormalsMod.AverageGlobal useThresh:on threshold:0.001
)
)
-- fix butt crack [hardcoded]
max select none
ButtF.modifiers[NormalFB].EditNormalsMod.Select #{521..522, 1093, 1231..1232, 2108, 2246, 2248, 519..520, 1233, 2247, 517..518, 545, 736, 739, 1561, 1752, 1754, 515..516, 546, 1560, 513..514, 540, 542, 1555, 1557, 511..512, 552, 634, 639, 1566, 1650, 1654}
ButtF.modifiers[NormalFB].EditNormalsMod.Break node:ButtF
redrawViews()
ButtF.modifiers[NormalFB].EditNormalsMod.Average useThresh:on threshold:0 node:ButtF
-- unify butt, newGens and anus normals
max select all
for i in selection do (
i.modifiers[NormalFB].EditNormalsMod.Unify node:ButtF toAverage:on
i.modifiers[NormalFB].EditNormalsMod.Unify node:Anus toAverage:on
)
max select none
clearSelection()
)
on btnLegsFuta pressed do ( -- average futalicious normals
setChkProps chkFuta 1 true
NormalSelectAll Futa NormalFuta -- select all the normals in the edit normals modifier on the correct mesh
NormalAvgUni Futa NormalFuta -- break, average and unify selected normals
emptySelection()
)
on btnLegsGen2 pressed do ( -- convert legs to gen2 and average
-- enable the correct leg modifiers and set checkboxes
setChkProps chkNude 1 true
setChkProps chkPiercings 1 true
setChkProps chkBones 1 true
max modify mode
NewGens.ishidden=true
Anus.ishidden=true
Butt.ishidden=false
select Butt
Butt.modifiers[MeshHP].enabled = false
Butt.modifiers[NormalNG].enabled = false
modpanel.setcurrentobject (modpanel.getcurrentobject())
NormalSelectAll Butt NormalGen2 -- select all the normals in the edit normals modifier on the correct mesh
-- -- deselect waist, thigh and gen2 seam normals and break the rest [hardcoded]
Butt.modifiers[NormalGen2].EditNormalsMod.Select #{1, 4..5, 7, 9, 11, 13, 15, 17, 297, 300..301, 303, 305, 307, 309, 311, 313, 162, 165..166, 172..174, 176, 184..195, 197..199, 203..204, 208, 245, 277, 279, 281..295, 458, 461..462, 468..470, 472, 480..491, 493..495, 499..500, 504, 541, 573, 575, 577..591, 132, 138..140, 142, 144, 147, 428, 434..436, 438, 440, 443} select:off
Butt.modifiers[NormalGen2].EditNormalsMod.Break ()
redrawViews()
Butt.modifiers[NormalGen2].EditNormalsMod.Average useThresh:on threshold:0.001
-- fix butt crack [hardcoded]
max select none
Butt.modifiers[NormalGen2].EditNormalsMod.Select #{219, 515, 1113, 1267..1268, 2106, 2260, 2262, 119, 415, 1269, 2261, 29, 325, 615, 806, 809, 1609, 1800, 1802, 24, 320, 616, 1608, 25, 321, 610, 612, 1603, 1605, 27, 323, 622, 704, 709, 1614, 1698, 1702}
Butt.modifiers[NormalGen2].EditNormalsMod.Break ()
redrawViews()
Butt.modifiers[NormalGen2].EditNormalsMod.Average useThresh:on threshold:0
-- unify gen2 butt normals
max select all
Butt.modifiers[NormalGen2].EditNormalsMod.Unify toAverage:on
setMorphs ButtP 2 -- set the gen2 piercing morph as a special case
emptySelection()
)
on btnExport pressed do max file export -- quick export button
on rdoLayerSelect changed state do ( -- radio button for primary layer selections
for n=0 to layerManager.count-1 do (
layer = layerManager.getLayer n
layer.isHidden = not (matchPattern layer.name pattern:Layers[state])
)
if state == 1 then (
setChkTri 1
setChkEnable true
setChkProps chkFeatureless 0 true
setChkProps chkLingerie 0 true
setChkProps chkAnus 2 false
setChkProps chkFuta 2 false
)
if state == 2 then (
setChkTri 1
setChkEnable true
setChkProps chkFeatureless 0 true
setChkProps chkLingerie 0 true
setChkProps chkFuta 0 true
)
if state == 3 or state == 4 then (
setChkTri 2
setChkEnable false
setChkProps chkBones 1 true
)
if state == 5 then (
setChkTri 1
setChkEnable true
)
if state == 6 then (
setChkTri 2
setChkEnable false
setChkProps chkBones 0 true
)
-- reset bone and target display when picking a primary layer
chkBones.changed chkBones.triState
layer = layerManager.getLayerFromName Layers[8]
layer.ishidden = false
)
on chkBones changed state do ( -- bones toggle checkbox
if state then (h = false) else (h = true)
layerToggle Layers[7]
)
on chkNude changed state do ( -- checkbox to toggle the nude layer and fix anus tri state since it is part of it
if state then (
h = false
chkAnus.triState = 1
)
else (
h = true
chkAnus.triState = 0
)
layerToggle Layers[9]
)
on chkFeatureless changed state do ( -- checkbox to toggle the featureless / femboy layer
if state then (h = false) else (h = true)
layerToggle Layers[10]
)
on chkLingerie changed state do ( -- checkbox to toggle the lingerie layer
if state then (h = false) else (h = true)
layerToggle Layers[11]
)
on chkPiercings changed state do ( -- checkbox to toggle the piercings layer
if state then (h = false) else (h = true)
layerToggle Layers[12]
)
on chkAnus changed state do ( -- checkbox to toggle the anus layer
if state then (h = false) else (h = true)
layerToggle Layers[13]
)
on chkFuta changed state do ( -- checkbox to toggle the futa layer
if state then (h = false) else (h = true)
layerToggle Layers[14]
)
-- asign functions to dropdowns to bypass event handler restrictions
on ddlMorphBody selected m do ddlMorphBodySel m
on ddlMorphLegs selected m do ddlMorphLegsSel m
on ddlMorphNewGens selected m do ddlMorphNewGensSel m
on ddlMorphAnus selected m do ddlMorphAnusSel m
on ddlMorphFuta selected m do ddlMorphFutaSel m
on ddlAreola selected m do ddlAreolaSel m
-- set the body and dropdowns to natyusha's personal preset [easy to customize]
on btnDefaults pressed do (
ddlMorphBodySel (ddlMorphBody.selection = 1)
ddlMorphLegsSel (ddlMorphLegs.selection = 1)
ddlMorphNewGensSel (ddlMorphNewGens.selection = 1)
ddlMorphAnusSel (ddlMorphAnus.selection = 1)
ddlMorphFutaSel (ddlMorphFuta.selection = 12)
ddlAreolaSel (ddlAreola.selection = 1)
)
)
createdialog BBWVR2_Rollout
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment