• Hi Guest!

    We are extremely excited to announce the release of our first Beta for VaM2, the next generation of Virt-A-Mate which is currently in development.
    To participate in the Beta, a subscription to the Entertainer or Creator Tier is required. Once subscribed, download instructions can be found here.

    Click here for information and guides regarding the VaM2 beta. Join our Discord server for more announcements and community discussion about VaM2.

[ Coding ] Appearance and skin lock, how to ?

hazmhox

Moderator
Featured Contributor
Joined
Jun 1, 2020
Messages
1,958
Solutions
72
Reactions
7,939
Hey guys and fellow coders,

I'm trying to achieve something and I cannot find a way to do it.
The new feature of locking in VAM is frikkin' great. And I want to use it to allow swapping appearance in a scene. These two checkboxes :

lock-panel.png


The fact is : these parameters do not save inside the json file. I wish it did but well... maybe @meshedvr can do something about that at some point ? :]

So I tried to checkout the code, but I can't find a way to access the UI or the atom settings that would allow me to create a plugin that can check or uncheck automatically these checkboxes when the scene loads ( or with specific triggers ).

If some of you coders had an idea... it would be frikkin' great :]
 
Hazmhox,

Great work on the 2069 story ?, must have taken some time to put together.

I finally found that the presetManager is linked to the atom. Here is some code to set the presets.
C#:
        public override void Init()
        {
            try
            {
                PresetLock(containingAtom, "Appearance", true);
                PresetLock(containingAtom, "Skin", true);
            }
            catch (Exception e)
            {
                SuperController.LogError("Exception caught: " + e);
            }
        }

        /// <summary>
        /// Function to set the lock state of the presets.
        /// </summary>
        /// <param name="atom">A valid person atom</param>
        /// <param name="presetName"> Names returned from preset manager controls
        /// rescale2
        /// geometry
        /// AppearancePresets
        /// PosePresets
        /// FemaleGlutePhysicsPresets
        /// FemaleBreastPhysicsPresets
        /// PluginPresets
        /// SkinPresets
        /// MorphPresets
        /// HairPresets
        /// ClothingPresets
        /// <param name="locked">Whether locked or not. true/false</param>
        public void PresetLock(Atom atom, string presetName, bool locked = false)
        {
            //Make sure we have some valid data
            if (atom == null || atom.presetManagerControls == null || presetName == "") return;

            //Go through each PresetManagerControl
            foreach (MeshVR.PresetManagerControl ctrl in atom.presetManagerControls)
            {
                //If we find the name then set it
                if (ctrl.name.Contains(presetName))
                {
                    ctrl.lockParams = locked;
                }
            }
        }
 
@VRStudy ! This is frikkin' great mate ! Thank you so much for that.

I would be curious to understand how you managed to find out with the solution. I'm not a big visual studio guy and some of my knowledge when it comes to finding out how some functions works from a C# source is kinda limited. Even tho I could have coded that if I knew.

Do you mind if make a plugin based on your source code and share it with the idea I have in mind ? ( full credits to you of course ! )

Also ! Thank you very much about 2069. ( If someday you have the time to drop a review, I would be very glad ! )

Thanks again for the code snippet, I'm trying that asap !

EDIT : Quickly made a test, it works perfectly !
 
Last edited:
@hazmhox Usual process used by most is to reverse engineer VaM by using tools like ILSpy to look at VaM_Data\Managed\Assembly-CSharp.dll. You can look at the decompiled source code, seeing exactly what is happening. Since its C# it can be decompiled to almost the same as Meshed wrote it, except that comments and local variable names are missing. (in comparison a C++ compiler would do far more optimizations and result would be far more unreadable)
 
Thank you for the trick @MacGruber , i'm gonna check out what is ILSpy and see if I can put it to good use :)
 
Glad it works, feel free to use the code :). I used ILSpy to look through code, sometimes you have to find workarounds since a lot of the class method/properties are protected or private.
 
Great ! The plugin is already ready haha. I was waiting for your signal ;]
 
Back
Top Bottom