Show soft selection on unselected mesh?


no. it’s not a half. but very easy to see - just check red.h and blue.h


i’ve never tried that but what if:

red * soft_weight + blue * (1 - soft_weight)


you could load a 1 pixel color gradient bitmap and use the 0-1 as a color “lookup”


Thanks Denis, that does the trick!

fn vertColorFromSoftSel obj = (
	polyop.setVDataChannelSupport obj 1 true

	for v = 1 to obj.numVerts do (
		local w = polyOp.getVDataValue obj 1 v
		local c = (red * w) + (blue * (1 - w))

		polyop.setVertColor obj 0 v	c


Wait. Wait no, it doesn’t, sorry.

That colors the verts directly from red to blue, basically running the opposite direction on the color wheel.


polyop.setVertColor is very slow method (i’ve already explained why it is). if you need it faster use polyop.setmapvert instead


But doesn’t polyOp.setMapVert set UVW coordinates?

Also, still need a way to get the correct color…


as i said we have to use HSV space. here it is (found in my archive):

	fn makeWeightColor weight asRGB:off =
		c = red
		c.h = (1.0 - weight)*170
		if asRGB do c = c as point4

170 is a number around blue.h


so i meant:

		c = red
		c.h = red.h * weight + blue.h * (1.0 - weight)


Currently using this with your makeWeightColor function, and it is working perfectly as far as I can tell. Thanks again!

fn vertColorFromSoftSel obj = (
	obj.showVertexColors = on
	obj.vertexColorsShaded = on

	for v = 1 to obj.numVerts do (
		local w = polyOp.getVDataValue obj 1 v
		polyop.setMapVert obj 0 v	((weightToColor w) as point4)



All right, one last thing I guess… right now it still only works when the node is selected with subselection on. Otherwise polyOp.getVDataValue <node> 1 <vertex> always returns 1.0.

If I first select the node and lock the soft selection, then deselect the node, it will return the correct values. But is there any way to do this without having to select the node at all?

(weightToColor w) as point4

is not necessary. the function as you can see has an option argument.

about a sub-selection level… i think it’s a limitation. probably using sdk is possible to force soft-selection level update. with pure mxs is probably not. but just in case i would check the state of baseobject instead of polyobject. maybe it updates.

other way is to calculate ‘soft selection’ weights yourself. the formula is known. as i remember it was posted (by Klvnk?) on this forum


Not sure what you mean by calculate the soft selection weights?


far distance is lower weight. selection you know, neighbors you can find… distance as well.
the formula is something about distance, falloff, pinch, and bubble… it was shown here


Oh yeah, that. Unfortunately that won’t work if painted soft selection is on, which for my purposes it will be. Given that, not sure if this is the most efficient way to get the desired result, but it works.

fn vertColorFromSoftSel obj = (
	-- Store selection and subobject level
	sel = selection as array
	setCommandPanelTaskMode #modify
	SOL = subObjectLevel

	-- Temporarily set object and subselection
	select obj
	if subObjectLevel == 0 do subObjectLevel = 1

	-- Set mapping and display
	polyOp.setMapSupport obj 0 true
	obj.showVertexColors = true
	obj.vertexColorsShaded = true
	obj.useSoftSel = true

	-- Set vertex colors
	for v = 1 to obj.numVerts do (
		local w = polyOp.getVDataValue obj.baseObject 1 v
		polyop.setMapVert obj 0 v	(makeWeightColor w asRGB:on)

	-- Restore selection and subobject level
	deselect selection
	select sel
	subObjectLevel = SOL



you can disable max redraw (including viewports and command panel). and no one will see your selecting-deselecting. i’ve cheated this way a lot :slight_smile:
also you can disable reference messages to make everything hidden for callbacks.


[left]Oh yeah, I’ve done that more than a few times myself. Dunno why I didn’t think of it for this :stuck_out_tongue:

EDIT: Hm, actually… disabling the messages seems to break the function because it prevents the subobject level from working.


you have to manually notify dependents about the change (check mxs help - notifyDependents - for details)


So here’s what I’ve got so far. What else can I do to make it faster?

fn colorFromFloat v = (
 	local c = red
 	c.h = (1.0 - v) * 170
 	c as point4
 fn softSelWeightArray obj = with redraw off (
 	-- Store selection and subobject level
 	local sel = selection as array
 	setCommandPanelTaskMode #modify
 	local SOL = subObjectLevel
 	store = (selection.count > 1 or not obj.isSelected)
 	if store do (deselect selection; select obj)
 	if SOL == 0 do subObjectLevel = 1
 	local wArray = (
 		for v = 1 to obj.numVerts collect
 		meshOp.getVDataValue obj.baseObject 1 v
 	if store do (deselect selection; select sel)
 	subObjectLevel = SOL
 fn vertColorFromWeights obj wArray: = (
 	if wArray == unsupplied do wArray = softSelWeightArray obj
 	meshOp.setMapSupport obj 0 true
 	meshOp.setSoftSel obj true
 	obj.showVertexColors = true
 	obj.vertexColorsShaded = true
 	obj.vertexColorType = 0
 	cArray = for v = 1 to obj.numVerts collect (colorFromFloat wArray[v])
 	for v = 1 to obj.numVerts do meshop.setMapVert obj 0 v cArray[v]


Hi! Is it possible to link where it was shown? I’m desperately trying to recreate soft selection because it only works in with subobject level and I need to achieve this result without modify menu. I’ve created a script with distance/amin/amax but it’s still not the same curve, as soft selection offers. Thanks in advance!