errorCheck = selection.count == 1 and (try($.morpher)catch(undefined)) != undefined if errorCheck == true do max modify mode ( local vertIndex = for i = 1 to $.baseobject.getNumVertices() collect i local fart = #() local objColArr local baseObj = "$" +$.name as string local baseObjCol local chanVal local usedChans = for i=1 to 100 where WM3_MC_HasData $.morpher i == true collect i local bigOlArray = #() fart = for i=1 to 100 where WM3_MC_HasData $.morpher i == true collect ( if WM3_MC_HasTarget $.morpher i == true do ( WM3_MC_GetTarget $.Morpher i ) ) -- This finds the morph target meshes that have vert color info. fn colorGetter = -- gets vert colors. $.getvertexcolor is only available in max 2010 and up. ( zoop = for i = 1 to vertIndex.count collect ( $.EditablePoly.SetSelection #Vertex #{i} poop = ($.getvertexcolor #vertexcolor) as point3 ) ) fn colorCollect = -- makes arrays of vert colors for base object and morph objects. ( baseObjCol = (modPanel.setCurrentObject $.baseObject subobjectLevel = 1 colorGetter()) as array objColArr = for i in fart collect ( modPanel.setCurrentObject i.baseObject subobjectLevel = 1 colorGetter() ) select (execute baseObj) for i in selection do ( modPanel.setCurrentObject $.baseObject subobjectLevel = 0 modPanel.setCurrentObject $.modifiers[#Morpher] ) ) fn colAverage = ( bigNewArray = #() bigNewArray.count = vertIndex.count for h in usedChans do for i = 1 to vertIndex.count collect -- adds up the values in bigOlArray ( if bigNewArray[i] == undefined then bigNewArray[i] = bigOlArray[h][i] else bigNewArray[i] += bigOlArray[h][i] ) for j = 1 to vertIndex.count do ( colAverageX = (bigNewArray[j].x) -- adds up the numeric change in vert color R values colAverageY = (bigNewArray[j].y) -- adds up the numeric change in vert color G values colAverageZ = (bigNewArray[j].z) -- adds up the numeric change in vert color B values totalX = \ -- makes sure that R value doesn't go past 0 or 255 if (baseObjCol[j].x)-(colAverageX) < 0 then 0 \ else if (baseObjCol[j].x)-(colAverageX) > 255 then 255 \ else (baseObjCol[j].x)-(colAverageX) totalY = \ -- makes sure that G value doesn't go past 0 or 255 if (baseObjCol[j].y)-(colAverageY) < 0 then 0 \ else if (baseObjCol[j].y)-(colAverageY) > 255 then 255 \ else (baseObjCol[j].y)-(colAverageY) totalZ = \ -- makes sure that B value doesn't go past 0 or 255 if (baseObjCol[j].z)-(colAverageZ) < 0 then 0 \ else if (baseObjCol[j].z)-(colAverageZ) > 255 then 255 \ else (baseObjCol[j].z)-(colAverageZ) polyop.setVertColor $.baseObject 0 #{j} [totalX, totalY, totalZ] ) ) fn vertColMorph i = -- calculates difference between base object vert color and morph target vert colors ( chanVal = WM3_MC_GetValue $.morpher i for j = 1 to vertIndex.count do ( ox = 255 - baseObjCol[j].x -- original color R value mx = 255 - objColArr[i][j].x -- morph color R value nmx = (mx - ox) / 100 oy = 255 - baseObjCol[j].y -- original color G value my = 255 - objColArr[i][j].y -- morph color G value nmy = (my - oy) / 100 oz = 255 - baseObjCol[j].z -- original color B value mz = 255 - objColArr[i][j].z -- morph color B value nmz = (mz - oz) / 100 bigOlArray[i][j] = [(nmx * chanVal),(nmy * chanVal),(nmz * chanVal)] -- uses morph channel value to ramp up from 0 to full color change ) ) bigOlArray.count = usedChans.count for i = 1 to bigOlArray.count do -- makes multi-dimensional array to match number of morph tagets ( bigOlArray[i] = #() bigOlArray[i].count = vertIndex.count ) colorCollect() for i in usedChans do vertColMorph i when parameters $.modifiers[#morpher] changes \ handleAt:#redrawViews \ id:#vertColor_morph1 do ( for i in usedChans do vertColMorph i colAverage() ) )