[Résolu] Créer un hud pour retexturiser des prims

Répondre
Partager Rechercher
Bonjour tout le monde:

Je fais appel à vous car j'aimerais me créer un hud tout simple. Je me suis fait des ongles (prims) pour mon avatar et j'aimerais pouvoir changer la texture de ceux-ci via un hud. Je voudrais pouvoir appliquer chaque textures sur les ongles, en cliquant sur le hud.

En somme j'aimerais ce genre de hud: https://marketplace.secondlife.com/p...-Nails/1555563

(désolée par avance pour la pub gratuite).

Est ce qu'il suffit de créer une prim par texture, d'y insérer un "retexture script" et de coller le tout sur le hud? Ou est-ce que c'est plus difficile que ça?
Est ce que quelqu'un aurait le script que je recherche?

Merci d'avance

Dernière modification par Stalixia ; 27/07/2013 à 15h14.
Bonjour Stalixia

Pour réaliser ce que tu veux il faut bien considérer le problème. Tu as affaire à deux attachements :

  • le HUD
  • les ongles
Les deux doivent communiquer. La façon la plus simple est d'utiliser un canal de Chat.

Sur ton HUD tu peux avoir soit :

  • un prim par texture
  • une image représentant toutes les textures
Dans les deux cas un seul script suffit pour déterminer où on clique et envoyer l'information aux ongles. Si tu veux protéger la clé de tes textures tu peux les mettre dans les ongles, le HUD se contentant d'envoyer l'index de la texture.


Dans tes ongles (je suppose que tu vas les grouper par objets de 5 ongles) il te faut le script qui reçoit l'information et qui applique la texture sur les ongles.


Je ne pense pas que tu trouveras les scripts tout faits qui correspondent à ton cas. Ils ne sont pas très difficiles à réaliser, on peut t'aider à les faire ici.
Bonjour bestmomo, et merci d'avoir répondu!

J'aurais en effet bien besoin de ton/votre aide.
Le hud je sais le faire, c'est plutôt simple, c'est juste des prims; ce que je ne sais pas faire c'est le script qui changera la texture des ongles..
Sur le hud j'aimerais créer une prim par texture (ça me semble plus pratique pour commencer) et en effet il me faudrait un script qui s'appliquerait sur tous les prims pour pouvoir changer la texture de tous les ongles en même temps.

J'ai oublié d'ajouter que si ce future hud fonctionne, j'aimerais le commercialiser -avec les ongles- dans mon store ^-^

Est ce que tu peux m'aider à créer ce script? ce serait vraiment super!

Merci d'avance, et toute aide supplémentaire est la bienvenue!
Voici une version simple de ce que tu demandes.

Émetteur dans le HUD

Je pars du principe que ton HUD a un root et autant de primitives enfants que de textures à afficher. Pour être reconnues tes primitives enfants doivent avoir un nom. Dans mon script j'ai choisi le nom générique "T" suivi d'un index. Ainsi la première s'appelle T0, la seconde T1, la troisième T3 et ainsi de suite. Il faut mettre aussi les clés des textures dans le script, là aussi j'en ai mis que 5 évidemment. Donc pour avoir plus de textures il faut ajouter les clés dans le script et les primitives sur le HUD. Voilà le script émetteur :

Code PHP:

//------------------------------------------------
//
//            Emetteur HUD ongles V 1.0
//
//------------------------------------------------
//    A placer dans la racine du HUD

// -----------------------------------------------
//        Paramètres
// -----------------------------------------------
string        NOM                "Emetteur HUD Ongles";
string         VERSION         "1.0";

// Canal de communication (choisir un différent par produit)
integer     CHANNEL         = -56212545;

// Nom des primitives (ce qui donnera T0, T1, T2... )
string      PRIM_NOM        "T";

// Face de la primitive pour la texture
integer     FACE            2;

// -----------------------------------------------
//        Textures
// -----------------------------------------------

// Mettre les clés de toutes les textures dans l'ordre
list        TEXTURES    = [
    
"23bfc465-8db2-2447-eb14-86c719e73bde",
    
"71e2689c-7c54-231c-c49a-97e563d166eb",
    
"13827c31-c917-7f9b-ea3e-f01227dee957",
    
"a71bd989-73c5-627b-d6ee-6e421ff3a61b",
    
"39aab78d-ba31-050a-0116-add4f24c7751"
        
];

// -----------------------------------------------
//        Variables
// -----------------------------------------------

list l_ongles = [];

// -----------------------------------------------
//        Détection des primitives
// -----------------------------------------------
get_prims(){
    
// Initialisation liste des ongles
    
integer n llGetListLength(TEXTURES);
    while(
n--) l_ongles += 0;
    
// Récupération des index des primitives
    
integer i;
    
llGetNumberOfPrims();
    
string nom;
    for(
2<= n; ++i) {
        
// Nom de la primitive
        
nom llList2String(llGetObjectDetails(llGetLinkKey(i), [OBJECT_NAME]), 0);
        
// Sauvegarde si primitive d'ongle
        
if(llGetSubString(nom00) == PRIM_NOM) {
            
integer id = (integer)llGetSubString(nom1, -1);
            
l_ongles llListReplaceList(l_ongles, [i], idid);
        }
    }
}

// -----------------------------------------------
//        Etat unique
// -----------------------------------------------
default
{
    
state_entry() {
        
llOwnerSay(NOM " " VERSION " initialisation...");
        
get_prims();
        
// Mise en place des textures (remplissage lent mais une seule fois à l'initialisation)
        
integer n llGetListLength(l_ongles);
        
integer i;
        for(; 
n; ++illSetLinkTexture(llList2Integer(l_onglesi), llList2Key(TEXTURESi), FACE);
        
llOwnerSay(NOM " " VERSION " prêt");
    }

    
touch_start(integer total_number)
    {
        
// Test ongle et envoi index
        
integer id llListFindList(l_ongles, [llDetectedLinkNumber(0)]);
        if(~
idllWhisper(CHANNEL, (string)llGetOwner() + ":" + (string)id);
    }

Le fonctionnement est simple : au départ le script scanne l'objet à la recherche des primitives qui se nomment "T...", il mémorise leur numéro de liaison dans une liste. Ensuite il applique les textures sur les primitives. J'ai prévu une variable FACE pour la face qui doit afficher la texture.

Récepteur dans les ongles

Les ongles sont évidemment groupés, en général par main, donc par paquets de 5 ongles. En général on prévoit aussi un root pour le positionnement. Le script doit aussi reconnaître les primitives des ongles, il faut donc aussi les nommer. Dans le script j'ai prévu le nom "T". Voici le script :

Code PHP:

//------------------------------------------------
//
//            Récepteur HUD ongles V 1.0
//
//------------------------------------------------
//    A placer dans la racine des ongles

// -----------------------------------------------
//        Paramètres
// -----------------------------------------------
string        NOM                "Récepteur HUD Ongles";
string         VERSION         "1.0";

// Canal de communication (choisir un différent par produit)
integer     CHANNEL         = -56212545;

// Nom des primitives des ongles
string      PRIM_NOM        "T";

// Face de la primitive pour la texture
integer     FACE            2;

// -----------------------------------------------
//        Textures
// -----------------------------------------------

// Mettre les clés de toutes les textures dans l'ordre
list        TEXTURES    = [
    
"23bfc465-8db2-2447-eb14-86c719e73bde",
    
"71e2689c-7c54-231c-c49a-97e563d166eb",
    
"13827c31-c917-7f9b-ea3e-f01227dee957",
    
"a71bd989-73c5-627b-d6ee-6e421ff3a61b",
    
"39aab78d-ba31-050a-0116-add4f24c7751"
        
];

// -----------------------------------------------
//        Variables
// -----------------------------------------------

list l_ongles = [];

// -----------------------------------------------
//        Détection des primitives
// -----------------------------------------------
get_prims(){
    
integer i;
    
integer n llGetNumberOfPrims();
    
string nom;
    for(
2<= n; ++i) {
        
// Nom de la primitive
        
nom llList2String(llGetObjectDetails(llGetLinkKey(i), [OBJECT_NAME]), 0);
        
// Sauvegarde si primtive d'ongle
        
if(nom == PRIM_NOMl_ongles += i;
    }
}

// -----------------------------------------------
//        Fonctions
// -----------------------------------------------
set_texture(integer i) {

    
key k llList2Key(TEXTURESi);
    
integer n llGetListLength(l_ongles);
    while(
n--) {
        
integer id llList2Integer(l_onglesn);
        list 
llGetLinkPrimitiveParams(id, [PRIM_TEXTUREFACE]);
        
llSetLinkPrimitiveParamsFast(id, [PRIM_TEXTUREFACEk] + llList2List(l13));
    }
}


// -----------------------------------------------
//        Etat unique
// -----------------------------------------------
default
{
    
state_entry() {
        
llListen(CHANNEL""NULL_KEY"");
        
get_prims();
        
llOwnerSay(NOM " " VERSION " prêt");
    }

    
listen(integer channelstring namekey idstring message) {
        list 
llParseString2List(message, [":"], []);
        
// Test de l'owner et mise à jour de la texture
        
if(llGetOwner() == (key)llList2String(l0)) set_texture((integer)llList2String(l1));
    }

Là aussi je n'ai prévu que 5 textures, il faut donc adapter selon le nombre que tu as et qui doit évidemment correspondre à celui de l'émetteur .

Le canal de communication entre le HUD et les ongles doit être spécifique au produit pour éviter les mélanges ultérieurs entre produits, et évidemment le même pour les deux scripts .

Le système filtre les messages avec la clé de l'owner pour éviter que deux avatars étant à proximité avec le même produit ne subissent d'interférences (remarque ça peut être amusant ).

Voilà j'espère que tout ça est clair, j'ai fait un test rapide IW et ça fonctionne.
J'avais fait un truc comme ça en 2008;
C'est sûr que ça gagnerait à être refait de manière plus moderne, avec les nouvelles instructions que nous avons maintenant.

Dans chaque prim enfant du HUD ce script:
Code:
default
{
    touch_start(integer total_number)
    {
        string texture = llGetTexture(ALL_SIDES);
        //on change la texture du root
        llSetLinkTexture(1, texture, ALL_SIDES);
    }
}
Ainsi quand on clique sur une prim le root affiche la texture choisie.
Dans le root:
Code:
integer HUD_CHANNEL = 1613134;

default
{
    changed(integer change)
    {
         if (change & CHANGED_TEXTURE) {
        string texture = llGetTexture(0);
        //on envoit la texture choisie sur le HUD_CHANNEL
        llSay(HUD_CHANNEL,(string)texture);
        }
    }
}
Pour les ongles, voilà le principe: faudrait pas mettre ça dans chaque ongle (ça fonctionnerait mais ce serait effroyablement laggy) mais le reécrire pour changer la texture de chaque prim dans un groupe de 5 ongles liés, si c'est le cas ce que j'espère.
Code:
integer HUD_CHANNEL = 1613134;

default
{
    state_entry()
    {
        //on écoute le HUD
        llListen(HUD_CHANNEL, "","","");
    }

    listen(integer chan, string name, key id, string message)
    {
        //on vérifie que le HUD appartient bien au même avatar
        if(llGetOwnerKey(id) == llGetOwner()){
            llSetTexture(message, ALL_SIDES);
        }
    }
}
Edit: grillée par The Best: prend son script il est nettement mieux.

Dernière modification par Elenia B. ; 27/07/2013 à 13h59.
Hihi, merci Elenia pour ton aide, j'ai pas eu encore le temps de tester ton script, cependant j'ai pu essayer le tiens bestmomo, et tout se passe bien seulement lorsque je clique sur une des prims enfant pour changer la texture des ongles, rien ne se passe..

J'explique en détail ce que j'ai fait:

J'ai créé mon hud, un simple cube, puis j'y ai ajouté 5 primitives enfants que j'ai nommé T0 T1 T2 T3 T4 comme indiqué dans ton script, j'ai lié tous les prims ensemble et ai mis l'émetteur HUD dans le root du HUD.

Côté ongles, j'ai mis le script recepteur dans la prim racine de ceux-ci, et ai renommé chaque ongle "T".

Lorsque je porte le hud et les ongles sur moi, un message apparaît en local et me dit "HUD prêt", jusque là tout va bien donc ^^. Le problème c'est que quand je clique sur une texture sur le hud, rien ne se passe au niveau des ongles, j'ai essayé de renommer les textures en mettant les UUID de textures de mon inventaire mais toujours rien :s

Est-ce que j'ai râté une étape?

~~~~~~~~~~~~~~
EDIT: je viens de réessayer sur un viewer à jour et le script fonctionne parfaitement! merci beaucoup pour ton aide bestmomo ^^ maintenant je vais m'amuser avec les différentes textures que j'ai

Dernière modification par Stalixia ; 27/07/2013 à 14h53.
Désolé du double post, en fait j'ai un petit problème.. le script fonctionne très bien, mais lorsque que je l'applique sur la deuxième paire d'ongles (pour la deuxième main), une fenêtre d'erreur s'affiche et me dit:

llSetPrimitiveParams error running rule #1 (PRIM_TEXTURE): arg #3 (texture repeat) is missing.
llSetPrimitiveParams error running rule #1 (PRIM_TEXTURE): arg #3 (texture repeat) is missing.
llSetPrimitiveParams error running rule #1 (PRIM_TEXTURE): arg #3 (texture repeat) is missing.
llSetPrimitiveParams error running rule #1 (PRIM_TEXTURE): arg #3 (texture repeat) is missing.
llSetPrimitiveParams error running rule #1 (PRIM_TEXTURE): arg #3 (texture repeat) is missing.

En gros ça veut dire que le hud ne reconnait pas les textures? je suis complètement perdue :s
Si ça marche pour une main et que tu as un build identique pour l'autre main ça devrait marcher .

D'après le message d'erreur il manque le troisième argument qui est la répétition de texture. Hors la valeur est récupérée par cette ligne :

Code PHP:

list llGetLinkPrimitiveParams(id, [PRIM_TEXTUREFACE]); 

Le but de cette ligne est de récupérer les paramètres de la texture : répétition, offset et rotation parce que ces informations sont nécessaires pour la ligne suivante :

Code PHP:

llSetLinkPrimitiveParamsFast(id, [PRIM_TEXTUREFACEk] + llList2List(l13)); 

où elle sont réinjectées à la fin. Il semblerait que le script n'arrive pas à lire ces informations dans ton build. Vérifie bien que tu as nommé correctement les primitives.
Bonjour momo,

En fait je me suis aperçu que le script fonctionne sur un de mes avatars mais ne fonctionne pas sur mon avatar principal je n'ai aucune idée du pourquoi du comment mais ça fonctionne très bien sur mon deuxième avatar

Maintenant je vais voir si j'arrive à modifier ce même script pour le faire fonctionner sur une paire de chaussures :P
Citation :
Publié par Stalixia
Bonjour momo,

En fait je me suis aperçu que le script fonctionne sur un de mes avatars mais ne fonctionne pas sur mon avatar principal je n'ai aucune idée du pourquoi du comment mais ça fonctionne très bien sur mon deuxième avatar

Maintenant je vais voir si j'arrive à modifier ce même script pour le faire fonctionner sur une paire de chaussures :P

Laisse moi deviner .. Ton avatar sur lequel cela marche est celui qui a uploadé les textures , et ton autre avatar n a pas de droits suffisants sur les textures , du coup cela apparaît en "gris" ?
Bonsoir redpurple

Non les textures sont full permission, je l'ai ai achetées sur le marketplace.. le problème c'est le code d'erreur qui s'affiche sur un de mes avatars et pas sur l'autre.. c'est soit le message d'erreur qui s'affiche, soit les textures ne se changent pas du tout. C'est pour cette raison que je n'aime pas le script xD
J ai relu les scripts .
Il se semble qu il faut rajouter un traitement quand cela change d owner , par exemple
Code PHP:

changed(integer c)
{
    if ( 
CHANGED_OWNER)
    
llResetScript();

Tu n avais pas dit à bestmomo que ton hud et tes ongles pouvaientt etre donnés, ce qui explique pourquoi il ne l avait pas inclus

Avant de rajouter , vérifie si en resettant manuellement les scripts sur l avatar sur lequel cela ne marche pas , cela se met à fonctionner

Si le nombre de prims change ( ou leurs noms ) , il faudrait aussi réinitialiser le script pour bien faire . Mais normalement ce ne st pas une opération "courante"

Dernière modification par redpurple ; 30/07/2013 à 21h07.
Citation :
Publié par redpurple
Laisse moi deviner .. Ton avatar sur lequel cela marche est celui qui a uploadé les textures , et ton autre avatar n a pas de droits suffisants sur les textures , du coup cela apparaît en "gris" ?
Ca ne devrait pas poser de problème.
Le problème de droits se pose uniquement lorsque le script cherche à obtenir l'UUID d'une texture appliquée, et que l'objet sur lequel la texture est appliquée, n'est pas full perms pour le propriétaire.

Dans le cas où les UUID sont connues et codées en dur dans le script, comme c'est le cas, ça ne pose pas de problème pour les appliquer, quel que soient les permissions, que ce soient celles de la texture, ou de l'objet.
C'est intriguant cette histoire. Je viens de tester en donnant le HUD et le récepteur à un autre avatar et c'est sans souci. Je ne comprends pas pourquoi le script n'arrive pas à lire le scale de la texture en place dans un cas particulier avec cette ligne :

Code PHP:

list llGetLinkPrimitiveParams(id, [PRIM_TEXTUREFACE]); 

Et c'est pas facile de résoudre un problème qu'on peut pas constater, on se perd en conjectures... Quelqu'un a une idée ?
Comme ton numéro de face est constant à 2 , peut être utilisait elle des prims à une seule face , genre sphere sans path cut , ou sculptie ?

***edit** quoique non .. cela ne doit pas être cela , sinon cela n aurait pas marché pour les 2 avatars
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés