I have an implemention of Fred's XTEA encryption idea using the r2_xtea.lsl script. The control and receiver scripts will auto-detect r2_xtea and use it if it is present.
I have combined the various smaller HUDs created for Ruth into a single multi-pane HUD. You too can build it from scratch following the steps below. The primary assembly script is configured with the UUIDs of the full perm textures that I have already loaded into Second Life and OSGrid. Users on other grids will need to upload those textures and modify the hud-maker script accordingly.
So here is the steps I took to build the current (ss-q) combined HUD:
Now to prepare the body!
Roth2 v2
Roth2 v2 is a complete mesh body in one bit of mesh and 8 faces. The original import includes eyes that are linked to the body. We need a root prim added…
Ruth2 v3
The current HUD script is not compatible with Ruth2 v3 as the alpha cuts are radically different. Version ss-r of the HUD controller script has the Ruth2 v3 body mapping in it but also requires the old Alpha HUD with the unrigged doll mesh.
Buttons are known internally as groups, why? Because it isn't always going to be a button controlling things and they operate on one or more faces at once.
(prim, face)
list regions = [ "head", "upper", "lower", "eyes", "skirt", "hair", "leftarm", "leftleg", "aux1", "aux2", "aux3", "fingernails", "toenails" ];
list prim_map = [ "head", "chest", "armright", "armleft", ... ];
integer element_stride = 4; list element_map = [ "head", -1, "head", 0, "chest", -1, "chest", 1, "breastright", -1, "breasts", 1, "breastleft", -1, "breasts", 1, "armright", 0, "armsupper", 1, "armright", 1, "armsupper", 1, "armleft", 0, "armsupper", 1, "armleft", 1, "armsupper", 1, "armleft", -1, "arms", 1, "armleft", -1, "arms", 1, "hands", -1, "hands", 1, "fingernails", -1, "hands", 1, "pelvisfront", 5, "crotch", 2, "pelvisfront", 5, "crotch", 2, "pelvisback", -1, "pelvis", 2, "pelvisback", -1, "pelvis", 2, "legright1", -1, "legsupper", 2, "legright2", -1, "legsupper", 2, "legright6", -1, "legslower", 2, "legright7", -1, "legslower", 2, "legright1", -1, "legs", 2, "legright2", -1, "legs", 2, "legright6", -1, "legs", 2, "legright7", -1, "legs", 2, "feet", -1", "feet", 2, "toenails", -1, "feet", 2, ... ];
Note: this mapping is based on the Ruth2 v3 mesh, Roth2 v2 and Ruth2 v4 are expected to have a much simpler set of faces and links and will rely on system alphas and Bakes on Mesh support for detailed alpha cuts. As of this writing the current map for Roth2 v2 looks like:
list element_map = [ "body", 3, "head", 0, "body", 4, "neck", 1, "body", 6, "arms", 1, "body", 1, "hands", 1, "fingernails", -1, "hands", 11, "body", 7, "torso", 2, "body", 5, "legs", 2, "body", 0, "feet", 2, "body", 2, "hair", 5, "toenails", -1, "feet", 12, "lefteye", -1, "eyes", 3, "righteye", -1, "eyes", 3 ];
This storage method for alpha state allows us to keep an arbitrary number of saved states in a list where each set is a single JSON string. These strings are human-readable, and could even be put into notecards or easily passed between scripts as required.
integer i; list groups = llList2ListStrided(llDeleteSubList(element_map, 0, 1), 0, -1, element_stride); integer len = llGetListLength(groups); for (; i <= len; ++i) { if (llList2String(groups, i) == group_name) { // process matching group entry string prim_name = llList2String(element_map, i * element_stride); integer face = llList2Integer(element_map, (i * element_stride) + 1); // do something with each (prim, face) here } }