|
Bon, ça fonctionne dans SL 
(Quelques bagarres avec la mémoire, mais c'est résolu)
Je vous balance donc tout ça :
Un petit résumé du mode opératoire :
Le build
Pour un écran de 30x30 pixels :
1) rezzez un cube, nommez le "pixel" (sans les guillemets)
2) dupliquez le jusqu'à en avoir 30 en tout
3) rezzez un cube, nommez le "cadre"
4) liez tout ca
5) rezze un cube, nommez le comme vous voulez, sauf un nom qui commence par pixel ou cadre, disons "ecran".
6) liez le cube "ecran" au reste, de façon à ce qu'il soit root (sélectionnez le en dernier avant de lier)
On doit avoir un build de 32 prims qui s’appelle "ecran"
Le contenu du build
Placez dans le build, c.a.d dans le prim root :
1) la texture du concours, en la nommant : 2x3p2_256_CarresFondNoirBordsNoirs
2) Les deux scripts "kernel0" et "kernel1" que voici :
kernel0 :
integer gResoX = 0; // doit etre un multiple de 10 integer gResoY; // sera calculé en fonction du nb de prims
integer gInteractLimit = 0; string gLastDrawer=""; float gSizeLargeur = 0.0; // largeur totale en metres // attention, la largeur du cadre est a retirer (cf gBorderSize) // des 4 cotés, si on prend 10m en tout et 10cm de cadre, les pixels // seront dimensionnés dans un espace de 9.8m en largeur // la resolution en hauteur dependra du nombre de prims enfants dans le build
string gTextureName = "2x3p2_256_CarresFondNoirBordsNoirs"; //string gTextureName = "2x3p2_256_CarresFondNoirGrille"; //string gTextureName = "2x3p2_256_CarresFondNoir"; vector gPixelColor = < 0.0, 1.0, 0.0>;
string gChildName = "PIXEL"; // debut du nom des prims enfants pris en compte // (majuscules/minuscules indifferent) // les prims utilisés doivent tous etres nommés PIXEL. // ils seront renommés à l'initialisation du script en fonction de leur // position, par exemple avec cette disposition pour une resoX de 30 pixels // et 6 prims enfants nommés PIXEL avant init : // PIXEL0_0 PIXEL1_0 qui donne 2 colonnes de 5 faces et 3 lignes de 1 face // PIXEL0_1 PIXEL1_1 soit en largeur 2*5*2 = 20 pixels // PIXEL0_2 PIXEL1_2 et en hauteur 3*1*3 = 9 pixels integer gLenPrefix; // sera la longueur de gChildName -1 (pour indexer) float gChildEpaisseur = 0.03; // epaisseur des prims pixel // (pas 0.01 car il y a des interferences de textures sur des faces se croisant) integer gNbColPrims; // nb de prims en largeur, sera calculé integer gNbChildPrims=0; // nb de prims pixel, sera calculé integer gNbFaces=0; // nb de face, = gNbChildPrims*5 sera calculé
// dans la foulee, on peut aussi avoir un cadre string gBorderName = "CADRE"; float gBorderSize = 0.2; // epaisseur du cadre autour des pixels, en metres. float gEpaisseur = 0.2; float gDistanceCadre = 0.01; // distance des pixels au cadre integer gIsMegaBorder = 0; // mettre à 1 pour ne pas resizer un megaprim // Si vous utilisez un megaprim, sa taille doit // etre ordonnée ainsi : <epaisseur, largeur, hauteur> // c.a.d un pixel (x,y) (0,0 en haut à gauche) // se place sur le cadre dans < 0.0, x, y > ( -y en fait) // les prims enfants seront alignés et taillés pour rentrer dans "gResoX" float gFactorSizeY = 0.8615; // taille réelle du 5faces qui est plus petit // que son enveloppe. un 5faces d'1 metre mesure // en fait 0.8615m integer gLastRnd = 0;
// constantes pour les numéro de faces des 5faces integer FACE_1 = 3; integer FACE_2 = 7; integer FACE_3 = 4; integer FACE_HAUT = 0; integer FACE_4 = 6; integer FACE_BAS = 5; integer FACE_5 = 1; integer FACE_DOS = 2;
vector OffSetHautGauche(integer face) { if ( face == 1 ) return <-0.1885, 0.330, 0.0>; else if ( face == 2 ) return <-0.328 , 0.330, 0.0>; else if ( face == 3 ) return <-0.6495, 0.330, 0.0>; else if ( face == 4 ) return <-0.328 , 0.330, 0.0>; else return <-0.464 , 0.330, 0.0>; } vector OffSetBasDroite(integer face) { if ( face == 1 ) return < 0.467, -0.326 , 0.0>; else if ( face == 2 ) return < 0.329, -0.326 , 0.0>; else if ( face == 3 ) return < 0.007, -0.3262, 0.0>; else if ( face == 4 ) return < 0.329, -0.326 , 0.0>; else return < 0.192, -0.326 , 0.0>; } vector TexturesRepeat(integer face) { if ( face == 1 ) return < 0.465, 0.275 , 0.0>; else if ( face == 2 ) return < 0.185, 0.275 , 0.0>; else if ( face == 3 ) return < -3.110, 0.275 , 0.0>; else if ( face == 4 ) return < 0.185, 0.275 , 0.0>; else return < 0.444, 0.275 , 0.0>; } vector ClickMin(integer face) { if ( face == 1 ) return < 0.0, 1.0, 0.0>; else if ( face == 2 ) return < 0.0, 1.0, 0.0>; else if ( face == 3 ) return < 0.1, 1.0, 0.0>; else if ( face == 4 ) return < 0.0, 1.0, 0.0>; else return < 0.6, 1.0, 0.0>; } vector ClickMax(integer face) { if ( face == 1 ) return < 0.4, 0.0, 0.0>; else if ( face == 2 ) return < 1.0, 0.0, 0.0>; else if ( face == 3 ) return < 0.046, 0.0, 0.0>; else if ( face == 4 ) return < 1.0, 0.0, 0.0>; else return < 1.0, 0.0, 0.0>; }
string gMatriceBin = "32 00 16 36 08 20 40 04 56 48 52 57 50 53 58 33 62 44 29 46 28 45 14 24 31 43 23 59 39 27 51 54 07 26 37 30 41 22 60 61 49 38 25 55 42 21 63 47 12 09 06 13 10 05 15 11 03 02 01 19 34 17 35 18 "; //a encoder? // 0 1 2 3 4 5 6 // 0123456789012345678901234567890123456789012345678901234567890123 string gBase64="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ()[]{}%$+-*!";
string gScreen; // stockera les valeurs binaires de chaque face // dans l'ordre vers la droite puis le bas : c.a.d pour // des prims "pixelX_Y" avec X croissant puis Y croissant string gSetScreen; // globale pour dessiner une image en dur // because en parametre de SetImage -> stack heap error
vector gLastXYTouched = < -1.0, -1.0, 0.0>;
string gPixelFaces = ""; // contiendra la liste des faces des prims pixel // sous la forme num_prim*5 + face-1, sur 3 carateres, sera mkangee
string TERM="end"; //////////////////////////////////////////////////////////////////////////////// integer Name2LinkNumber(string name) { integer nbPrims = llGetNumberOfPrims(); integer i;
for (i=0; i<=nbPrims; ++i) if (llGetLinkName(i) == name) return i;
return -1; }// Name2LinkNumber
Say(string msg){llOwnerSay(msg);} // Say
string Encode64(string Src) { // Src = "xx xx xx ... xx " XX de 00 a 63 integer len = llStringLength(Src); integer i; string result = ""; integer num;
for(i=0; i<len; i+=3) //attention +2 ou +3 { num = (integer)llGetSubString(Src, i, i+1); result += llGetSubString(gBase64, num, num); }// for return result; }// Encode64
vector Number2Offset(integer face, integer number) { // retourne l'offset de texture correspondant au nombre binaire // pour la face "face"
// recherche la position dans la matrice string n3 = llGetSubString("000" + (string)number, -2, -1); integer pos = llSubStringIndex(gMatriceBin, n3); if (pos == -1) { Say("ERROR Number2Offset : " + n3 + " pas dans la matrice"); return ZERO_VECTOR; } pos = pos/3; integer col = pos % 8; integer lig = pos / 8;
// calcul de l'offset vector offset1 = OffSetHautGauche(face); vector offset2 = OffSetBasDroite(face);
float dx = (offset2.x - offset1.x)/7.0; float dy = (offset2.y - offset1.y)/7.0;
return offset1 + < dx*col, dy*lig, 0.0>;
}// Number2Offset
integer Face2Index(integer numPrim, integer face) { // renvoie l'index dans gScreen correspondant à la face (1 a 5) du prim string nom = llGetLinkName(numPrim); integer x; integer y; // pour le prim nommé "pixelX_Y" integer pos = llSubStringIndex(nom, "_");
// une ptite verif if ( pos == -1) { Say("ERROR Face2Index : pas d'underscore dans " + nom); return -1; // ===== EXIT ===== }
x = (integer)llGetSubString(nom, gLenPrefix+1, pos-1); y = (integer)llGetSubString(nom, pos+1, -1);
integer result = y*5*gNbColPrims + x*5 + face-1;
return result;
}// Face2Index
SetBlockNumber(integer x, integer y, integer n) { // recherche le nom du prim integer xprim = x/10; integer yprim = y/3; string nom = gChildName + (string)xprim + "_" + (string)yprim; integer nprim = Name2LinkNumber(nom); SetNumberFace(nprim, (x/2)%5 + 1, n); }// SetBlockNumber
SetMegaBlock(integer x, integer y, integer n1, integer n2) { SetBlockNumber(x,y, n1>>12); SetBlockNumber(x+2,y, (n1>>6) & 63); SetBlockNumber(x+4,y, n1 & 63); SetBlockNumber(x,y+3, n2>>12); SetBlockNumber(x+2,y+3, (n2>>6) & 63); SetBlockNumber(x+4,y+3, n2 & 63); }// SetMegaBlock
integer BuildFace2NumFace(integer face) { if (face == FACE_1) return 1; else if (face == FACE_2) return 2; else if (face == FACE_3) return 3; else if (face == FACE_4) return 4; else return 5; }// BuildFace2NumFace
integer NumFace2BuildFace(integer face) { if (face == 1) return FACE_1; else if (face == 2) return FACE_2; else if (face == 3) return FACE_3; else if (face == 4) return FACE_4; else return FACE_5; }// NumFace2BuildFace
SetNumberFace(integer numPrim, integer face, integer number) { integer vraieFace = NumFace2BuildFace(face); // car face de 1 a 5 vector offset = Number2Offset(face, number);
llSetLinkPrimitiveParamsFast( numPrim , [ PRIM_TEXTURE , vraieFace , gTextureName , TexturesRepeat(face) , offset , 0.0 ]); // mise a jour de gScreen integer index = Face2Index(numPrim, face);
string num3 = llGetSubString("000" + (string)number, -2, -1) + " "; if (index == 0) gScreen = num3 + llGetSubString(gScreen, 3, -1); else if (index == gNbChildPrims*5-1) gScreen = llGetSubString(gScreen, 0, -4) + num3; else gScreen = llGetSubString(gScreen, 0, index*3-1) + num3 + llGetSubString(gScreen, index*3+3, -1);
}// SetNumberFace
integer GetNumberFace(integer numPrim, integer face) { // renvoie le nombre binaire correspondant à la face du prim integer i = Face2Index(numPrim, face); return (integer)llGetSubString(gScreen, i*3, i*3+2); }// GetNumberFace
SetTouchXOR(integer numPrim, integer numFace, vector touchXY) { integer face = BuildFace2NumFace(numFace); integer num = GetNumberFace(numPrim, face);
// recupere le poids binaire cliqué, dépend de la face vector clickMin; vector clickMax; // coordonnées du rectangle cliquable
clickMin = ClickMin(face); clickMax = ClickMax(face);
vector xy = touchXY - clickMin; vector dd = clickMax - clickMin; integer lig = (integer)(3.0*xy.y/dd.y); // (integer)(3.0*[0.0, 1.0[) = 0,1,2 integer col = (integer)(2.0*xy.x/dd.x); // (integer)(2.0*[0.0, 1.0[) = 0,1
integer numBit = lig*2 + 1 - col;// car col va dans l'autre sens // (wé, j'aurai du faire mes n° de bit dans l'autre sens...)
integer newNum = num ^ (1<<numBit);
SetNumberFace(numPrim, face, newNum);
}// SetTouchXOR
Plot(integer X, integer Y, integer C) { // affiche un pixel aux coordonnées X,Y // de couleur C : 0 noir, 1 allumé, -1 : inversion de couleur)
if ( (X<0) || (X>=gResoX) || (Y<0) || (Y>=gResoY) ) return;
// determination du prim a modifier integer xPrim = X/10; integer face = (X % 10)/2 + 1; // >> integer yPrim = Y/3; string nom = gChildName + (string)xPrim + "_" + (string)yPrim; integer numPrim = Name2LinkNumber(nom);
// determination du binaire a changer integer currentBin = GetNumberFace(numPrim, face);
// poids du bit correspondant au pixel integer lig = Y%3; integer col = X%2;
integer numBit = lig*2 + 1 - col; // cf SetTouchXOR integer poids = 1<<numBit;
if ( C == 0 ) SetNumberFace(numPrim, face, currentBin & (63 - poids)); else if ( C == 1 ) SetNumberFace(numPrim, face, currentBin | poids); else if ( C == -1) SetNumberFace(numPrim, face, currentBin ^ poids); }// Plot
Line(integer x1, integer y1, integer x2, integer y2, integer C) { // algo bresenham trop lourdingue, je fais a ma sauce... integer dx = x2 - x1; float fdx = llFabs((float)dx); integer dy = y2 - y1; float fdy = llFabs((float)dy); integer i; float depart;float d; integer delta = 0; Plot(x1, y1, C); if ( (dx == 0) && (dy == 0) ) return; // cas batard
if ( fdx > fdy ) { // boucle sur x d = (float)dy/fdx; depart = (float)y1 + d; if ( dx > 0) delta = 1; else delta = -1; for(i=x1; i!=x2; i += delta) { Plot(i+delta, (integer)llRound(depart), C); depart += d; } } else { // boucle sur y d = (float)dx/fdy; depart = (float)x1 + d; if ( dy > 0) delta = 1; else delta = -1; for(i=y1; i!=y2; i += delta) { Plot((integer)llRound(depart), i+delta, C); depart += d; } } }// Line
Circle(integer x0, integer y0, integer r, integer Col, integer fill) { integer y ; integer xmin; integer lastxmin = x0; integer xmax; integer lastxmax = x0; float dx; integer i;
for(y = -r ; y <= 0; ++y) // on part du haut { dx = (float)(r) * llCos(llAsin( (float)y/(float)r )); xmin = x0 - (integer)dx - 1; xmax = x0 + (integer)dx;
if (fill == 1) { for(i=xmin; i<=xmax;++i) { Plot(i, y0 + y -1, Col); Plot(i, y0 - y, Col); } } else { if (xmin<lastxmin) { for(i=xmin;i<lastxmin;++i) { Plot(i, y0 + y -1, Col); Plot(i, y0 - y, Col); } } else { Plot(xmin, y0 + y -1, Col); if (y!=0) Plot(xmin, y0 - y, Col); } if ((lastxmax<xmax) && (xmax>xmin) ) { for(i=lastxmax+1;i<=xmax;++i) { Plot(i, y0 + y-1, Col); Plot(i, y0 - y, Col); } } else if (xmax>xmin) { Plot(xmax, y0 + y-1, Col); if (y!=0) Plot(xmax, y0 - y, Col); } lastxmin = xmin; lastxmax = xmax; }// if fill }// for y }// Circle
Box(integer x1, integer y1, integer x2, integer y2, integer C, integer fill) { integer i; integer j; if (x1>x2) { i=x1; x1=x2; x2=i;} if (y1>y2) { i=y1; y1=y2; y2=i;}
for(i=x1;i<=x2;++i) Plot(i,y1,C);//ligne du haut for(j=y1+1;j<y2;++j) // lignes au milieu { Plot(x1,j,C); //bord gauche if (fill == 1) for(i=x1+1;i<x2;++i) Plot(i,j,C); // pixels au milieu if (x2>x1) Plot(x2,j,C); // bord droite } if (y2>y1) // ligne du bas { for(i=x1;i<x2;++i) Plot(i,y2,C); if (x2>x1) Plot(x2,y2, C); } }// Box
string InitPrims() { // intialise le build et quelques globales // renvoie "" si tout va bien, un message d'erreur sinon integer i; // variable de boucle string nom; // pour le nom d'un child prim string prefix; // debut du nom pour comparer au prefix integer y = 0; integer x = 0; // pour ecrire x et y dans le nom list listParams; // utilise pour le llSetLinkPrimitivesParamFast
integer numberFill = 0; // motif binaire pour init de toutes les faces // 0= vide, 63 = plein string nFill3 = "00 "; // idem en chaine
integer nb = llGetNumberOfPrims(); gChildName = llToUpper(gChildName); // comme ca c'est fait... gBorderName = llToUpper(gBorderName); // pô de jaloux ! gLenPrefix = llStringLength(gChildName) - 1; // -1 pour index à 0
rotation localRot = llEuler2Rot(DEG_TO_RAD * <0.0, 0.0, 90.0>);
// aplatissement du prim maitre pour ne pas gener les touch vector size = llGetScale(); llSetLinkPrimitiveParamsFast( LINK_THIS, [ PRIM_SIZE, < size.x, 0.03, size.z>, PRIM_COLOR , ALL_SIDES, <1.0,1.0,1.0>, 0.0 ]); // on va deja compter combien on a de prims PIXEL --------------------- gNbChildPrims=0; for (i=2; i<=nb; ++i) // le root_prim est le n°1, on le prend pas { nom = llToUpper(llGetLinkName(i)); prefix = llGetSubString(nom, 0, gLenPrefix); if ( prefix == gChildName ) ++gNbChildPrims; }
if (gNbChildPrims == 0) return "ERROR INIT :aucun prim " + gChildName + " trouvé"; // -------------------------------------------------------// == EXIT == gNbFaces = gNbChildPrims*5; // on va deja calculer la taille de chaque prim enfant gNbColPrims = (integer)(gResoX/10.0); // 10 pixels par prim en largeur
float largeurVisible = (gSizeLargeur - gBorderSize*2.0)/(float)gNbColPrims; float largeurReelle = largeurVisible/gFactorSizeY; float hauteur = 1.5*largeurVisible/5.0; // ratio 3/2 size = < gChildEpaisseur, largeurReelle, hauteur >;
float hauteurTotale = (float)(gNbChildPrims) * hauteur / (float)gNbColPrims; gScreen = "";
// boucle sur tous les prims enfants --------------------------------- for (i=2; i<=nb; ++i) // le root_prim est le n°1, on le prend pas { nom = llToUpper(llGetLinkName(i));
// gestion du cadre ------------------------------- if ( nom == gBorderName ) { if (gIsMegaBorder == 0) llSetLinkPrimitiveParamsFast( i , [ PRIM_SIZE , < gEpaisseur , gSizeLargeur , hauteurTotale + 2.0*gBorderSize > , PRIM_ROT_LOCAL, localRot , PRIM_POSITION, ZERO_VECTOR ]); else // on ne resize pas un megaprim llSetLinkPrimitiveParamsFast( i , [ PRIM_ROT_LOCAL, localRot , PRIM_POSITION, ZERO_VECTOR ]); }
// gestion des pixels ---------------------------- prefix = llGetSubString(nom, 0, gLenPrefix); if ( prefix == llToUpper(gChildName) ) { nom = llToUpper(gChildName) + (string)x + "_" + (string)y;
//dimensionne, place et build les prims 5 faces listParams = [ PRIM_TYPE , PRIM_TYPE_PRISM , PRIM_HOLE_SQUARE , < 0.199,0.8,0.0 >// cut = debut et fin de decoupe , 0.3 // hollow = creux / 100 , < 0.0,0.0,0.0 > // twist = debut et fin de vrille , < 1.0,1.0,0.0 > // top_size = 1 - biseautage , < 0.0,0.0,0.0 > // top_shear = inclinaison , PRIM_SIZE, size , PRIM_NAME, nom , PRIM_POSITION // bon la j'avoue, j'en ai méga chié pour // positionner les prims autour du root , < // -x*largeurVisible // +((float)gNbColPrims * largeurVisible )/2.0 // - largeurVisible/2.0 allez une ptite facto : largeurVisible * ( (float)(gNbColPrims-1)/2.0 - x ) , gEpaisseur/2.0 + gDistanceCadre , -y*hauteur + (hauteurTotale-hauteur)/2.0 > , PRIM_ROT_LOCAL, localRot , PRIM_TEXTURE , FACE_1, gTextureName, TexturesRepeat(1) , Number2Offset(1, numberFill), 0.0 , PRIM_TEXTURE , FACE_2, gTextureName, TexturesRepeat(2) , Number2Offset(2, numberFill), 0.0 , PRIM_TEXTURE , FACE_3, gTextureName, TexturesRepeat(3) , Number2Offset(3, numberFill), 0.0 , PRIM_TEXTURE , FACE_4, gTextureName, TexturesRepeat(4) , Number2Offset(4, numberFill), 0.0 , PRIM_TEXTURE , FACE_5, gTextureName, TexturesRepeat(5) , Number2Offset(5, numberFill), 0.0 , PRIM_COLOR , ALL_SIDES, gPixelColor, 1.0 , PRIM_FULLBRIGHT, ALL_SIDES, TRUE , PRIM_COLOR, FACE_HAUT, gPixelColor , 0.0 , PRIM_COLOR, FACE_BAS , gPixelColor , 0.0 , PRIM_COLOR, FACE_DOS , gPixelColor , 0.0 ];
//if (gFlagBuild == 1) llSetLinkPrimitiveParamsFast(i, listParams); gPixelFaces += llGetSubString("000" + (string)(i*5 + 0), -3, -1) + llGetSubString("000" + (string)(i*5 + 1), -3, -1) + llGetSubString("000" + (string)(i*5 + 2), -3, -1) + llGetSubString("000" + (string)(i*5 + 3), -3, -1) + llGetSubString("000" + (string)(i*5 + 4), -3, -1);
gScreen += nFill3 + nFill3 + nFill3 + nFill3 + nFill3; gResoY = y*3+3; // pas apres la boucle car y peut etre incremente
// pas optimal mais bon, c'est que l'init, ca perd pas grand chose ++x; if ( x >= gNbColPrims ) { x=0; ++y; }
}// if ( prefix == llToUpper(gChildName) ) }// for (i=2; i<=nb; ++i)
MelangeFaces();
return "";
} // InitPrims
MelangeFaces() { integer i; integer j; string num3; for(j=0; j<gNbFaces; ++j) { i = (integer)llFrand((float)(gNbFaces-1))+1; // sauf le 1er
num3 = llGetSubString(gPixelFaces, i*3, i*3+2); if (i == gNbFaces-1) gPixelFaces = num3 + llGetSubString(gPixelFaces, 0, -4); else gPixelFaces = num3 + llGetSubString(gPixelFaces, 0, i*3-1) + llGetSubString(gPixelFaces, i*3+3, -1); }// for j }// MelangeFaces
//////////////////////// // quelques effets //////////////////////// SetAllRandom() { integer i; string num; integer prim; integer face;
MelangeFaces(); for (i=0; i<gNbFaces; ++i) { num = llGetSubString(gPixelFaces, i*3, i*3+2); prim = ((integer)num)/5; face = ((integer)num)%5 + 1; SetNumberFace( prim, face, (integer)llFrand(64.0)); } }// SetAllRandom
integer RandomNumberBitCount(integer nBitSet) { integer num; integer n;
if (nBitSet == 0) num = 0; else if (nBitSet == 6) num = 63; else if (nBitSet == 1) { n = 2*(integer)(llFrand(6.0)); num = (integer)llGetSubString("010204081632",n, n+1); } else if (nBitSet == 2) { n = 2*(integer)(llFrand(15.0)); num = (integer)llGetSubString("030509173306101834122036241048",n, n+1); } else if (nBitSet == 3) { n = 2*(integer)(llFrand(20.0)); num = (integer)llGetSubString("0711193513213725414914223826425028445256" , n, n+1); } else if (nBitSet == 4) { n = 2*(integer)(llFrand(15.0)); num = (integer)llGetSubString("152339274351294553573046545860",n, n+1); } else // forcement 5 { n = 2*(integer)(llFrand(6.0)); num = (integer)llGetSubString("626159554731",n, n+1); }
return num; }// RandomNumberBitCount
SetAllRandomBitCount(integer nBit) { integer i; string num; integer prim; integer face;
MelangeFaces(); for (i=0; i<gNbFaces; ++i) { num = llGetSubString(gPixelFaces, i*3, i*3+2); prim = ((integer)num)/5; face = ((integer)num)%5 + 1;
SetNumberFace( prim, face, RandomNumberBitCount(nBit)); } }// SetAllRandomBitCount
AndAllRandomBitCount(integer nBit, float proba) { integer i; string num; integer prim; integer face;
MelangeFaces(); for (i=0; i<gNbFaces; ++i) { num = llGetSubString(gPixelFaces, i*3, i*3+2); prim = ((integer)num)/5; face = ((integer)num)%5 + 1;
if(llFrand(1.0)<proba) SetNumberFace( prim, face , GetNumberFace(prim,face) & RandomNumberBitCount(nBit)); } }// SetAllRandomBitCount
OrAllRandomBitCount(integer nBit, float proba) { integer i; string num; integer prim; integer face; MelangeFaces(); for (i=0; i<gNbFaces; ++i) { num = llGetSubString(gPixelFaces, i*3, i*3+2); prim = ((integer)num)/5; face = ((integer)num)%5 + 1;
if(llFrand(1.0)<proba) SetNumberFace( prim, face , GetNumberFace(prim,face) | RandomNumberBitCount(nBit)); } }// OrAllRandomBitCount
XOrAllRandomBitCount(integer nBit, float proba) { integer i; string num; integer prim; integer face;
MelangeFaces(); for (i=0; i<gNbFaces; ++i) { num = llGetSubString(gPixelFaces, i*3, i*3+2); prim = ((integer)num)/5; face = ((integer)num)%5 + 1;
if(llFrand(1.0)<proba) SetNumberFace( prim, face , GetNumberFace(prim,face) ^ RandomNumberBitCount(nBit)); } }// XOrAllRandomBitCount
SetAllNumber(integer n) { integer i; string num; integer prim; integer face;
MelangeFaces(); for (i=0; i<gNbFaces; ++i) { num = llGetSubString(gPixelFaces, i*3, i*3+2); prim = ((integer)num)/5; face = ((integer)num)%5 + 1; SetNumberFace( prim, face, n); } }// SetAllNumber
SetImage64() { integer i; string num; integer prim; integer face; integer idx; integer n; MelangeFaces(); for (i=0; i<gNbFaces; ++i) { num = llGetSubString(gPixelFaces, i*3, i*3+2); prim = ((integer)num)/5; face = ((integer)num)%5 + 1; idx = Face2Index(prim,face);
n = llSubStringIndex(gBase64, llGetSubString(gSetScreen, idx, idx)); SetNumberFace(prim, face, n); } }// SetImage64
Fondu(integer C) { // C = couleur = 0 ou 1 ou -1 (inversion)
float p0 = 0.1; float p1 = 0.1; integer i;
if ( C == 0) // fondu noir { for(i=0; i<3; ++i) AndAllRandomBitCount(3-i, 0.9); SetAllNumber(0); } else if ( C == 1 ) // fondu blanc { for(i=0; i<3; ++i) OrAllRandomBitCount(3+i, 0.9); SetAllNumber(63); } }// Fondu
integer Eval(string txt) { // nombre normal if (llGetSubString(txt,0,0) != "R") return (integer) txt; if (txt == "RLAST") return gLastRnd; //cas nombre aleatoire, txt = Rn1-n2 integer n1; integer n2; integer pos; pos = llSubStringIndex(txt, "-"); if (pos == -1) { Say("Error Eval : missing '-'"); return 0; } n1 = (integer)llGetSubString(txt, 1, pos-1); n2 = (integer)llGetSubString(txt, pos+1, -1); gLastRnd = (integer)llFrand((float)(n2 - n1 + 1)) + n1; return gLastRnd; } InfoScreen(string txt) { llSay(0, " encoded image to copy: \nIMAGE " + Encode64(txt) + "\n "); } Message(string txt) { llInstantMessage(llGetOwner(), gLastDrawer + " sended : \nIMAGE " + Encode64(txt) + "\n "); } //////////////////////////////////////////////////////////////////////////////// default { state_entry() { }// state_entry ------------------------------------------------------------
link_message(integer sender_num, integer num, string str, key id) { if (num != 42) return; // ==== EXIT ====
string msg = str; string cmd; string p1; string p2; string p3; string p4; string p5; string p6;
//str de la forme "command par1 par2 par3..." str = llToUpper(llStringTrim(str, STRING_TRIM)); // recherche des parametres ( oui y a mieux, mais stack-heap collision // -> listes bannies !!!) integer pos = llSubStringIndex(str, " ");
if ( pos == -1 ) // commandes sans parametres { if (str=="CLS" ) SetAllNumber(0); else if (str=="FILL" ) SetAllNumber(63); else if (str=="RAND" ) SetAllRandom(); else if (str=="INVERT" ) XOrAllRandomBitCount(6, 1.0); else if (str=="CHAT" ) InfoScreen(gScreen); else if (str=="MESSAGE") Message(gScreen); else Say("Commande inconnue 0: " + msg);
jump fin_message; //------------------------------------------------ }
cmd = llGetSubString(str, 0, pos-1); str = llStringTrim(llGetSubString(msg, pos+1, -1), STRING_TRIM); // msg pour l'image pas en majuscules pos = llSubStringIndex(str, " ");
if ( pos == -1) // 1 parametre (dans str) { if (cmd=="FADE" ) Fondu((integer)str); else if (cmd=="IMAGE" ) { gSetScreen = str; SetImage64();} // faire un IMAGE BEGIN/END pour avoir une image sur plusieurs lignes... else if (cmd=="SETALLBOX" ) SetAllNumber((integer)str); // faire des OR, AND, XOR avec une valeur fixe (non random) else if (cmd=="ANDALLBOXRND" ) AndAllRandomBitCount((integer)str, 1.0); else if (cmd=="ORALLBOXRND" ) OrAllRandomBitCount((integer)str, 1.0); else if (cmd=="XORALLBOXRND" ) XOrAllRandomBitCount((integer)str, 1.0); else if (cmd=="INTERACT") { gInteractLimit = (integer)str; state Interact; } else Say("Commande inconnue 1: " + msg);
jump fin_message; //------------------------------------------------ }
p1 = llGetSubString(str, 0, pos-1); str = llStringTrim(llGetSubString(str, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(str, " ");
if ( pos == -1) // 2 parametres ( p2 dans str) { if (cmd=="BUILD") // build resoX taille { integer newgResoX = (integer)p1; float newgSizeLargeur = (float)str; if ((newgResoX != gResoX) || (newgSizeLargeur != gSizeLargeur)) { gResoX = newgResoX; gSizeLargeur = newgSizeLargeur; string result = InitPrims(); if (result != "") Say(result + "\n ERROR BUILD"); } } else Say("Commande inconnue 2: " + msg); jump fin_message; //------------------------------------------------ }
p2 = llGetSubString(str, 0, pos-1); str = llStringTrim(llGetSubString(str, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(str, " ");
if ( pos == -1) // 3 parametres ( p3 dans str) { if (cmd=="PLOT" ) Plot(Eval(p1), Eval(p2), (integer)str); else if (cmd=="SETBLOCK") SetBlockNumber(Eval(p1), Eval(p2), (integer)str); else Say("Commande inconnue 3: " + msg); jump fin_message; //------------------------------------------------ }
p3 = llGetSubString(str, 0, pos-1); str = llStringTrim(llGetSubString(str, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(str, " ");
if ( pos == -1) // 4 parametres ( p4 dans str) { if (cmd=="SETMEGA" ) SetMegaBlock( (integer)p1, (integer)p2 , (integer)p3,(integer)str); else Say("Commande inconnue 4: " + msg); jump fin_message; //------------------------------------------------ }
p4 = llGetSubString(str, 0, pos-1); str = llStringTrim(llGetSubString(str, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(str, " ");
if ( pos == -1) // 5 parametres ( p5 dans str) { if (cmd=="CIRCLE" ) //Circle(x0, y0, r, Col, fill) Circle( Eval(p1), Eval(p2), Eval(p3) , (integer)p4, (integer)str ); else if (cmd=="LINE" ) //Line(x1, y1, x2, y2, Col) Line( Eval(p1), Eval(p2), Eval(p3), Eval(p4), (integer)str ); else Say("Commande inconnue 5: " + msg); jump fin_message; //------------------------------------------------ }
p5 = llGetSubString(str, 0, pos-1); str = llStringTrim(llGetSubString(str, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(str, " ");
if ( pos == -1) // 6 parametres ( p6 dans str) { if (cmd=="BOX" ) //Box(x0, y0, x1, y1, Col, fill) Box( Eval(p1), Eval(p2), Eval(p3), Eval(p4) , (integer)p5, (integer)str ); else
Say("Commande inconnue 6: " + msg); jump fin_message; //------------------------------------------------ } @fin_message; llSetText(TERM, <1.0, 0.0, 0.0>, 0.0);
}// link_message -----------------------------------------------------------
}// default ====================================================================
state Interact { state_entry() { //verouille la fin de commande llSetText((string)gInteractLimit, <1.0, 0.0, 0.0>, 0.0); if (gInteractLimit != 0) llSetTimerEvent(1.0); } timer() { gInteractLimit--; llSetText((string)gInteractLimit, <1.0, 0.0, 0.0>, 0.0); if (gInteractLimit == 0) { llSetText(TERM, <1.0, 0.0, 0.0>, 0.0); state default; } } touch_start(integer num) { vector touchST = llDetectedTouchST(0); integer nPrim = llDetectedLinkNumber(0); integer face = llDetectedTouchFace(0); string name = llToUpper(llGetLinkName(nPrim)); string prefix = llGetSubString(name, 0, gLenPrefix); if ( prefix == gChildName ) { SetTouchXOR(nPrim, face, touchST); gLastDrawer = llKey2Name(llDetectedKey(0)); } else if ( name == gBorderName) { llSetText(TERM + " " + gLastDrawer, <1.0, 0.0, 0.0>, 0.0); state default; } } }
kernel1:
integer gTimeLimit = 30;
string TERM0="end"; string TERM="ok"; string gRetour="";
//----------------------------------------------------------------------------- Cmd(string str) { string txt=""; string retour=""; integer time = llGetUnixTime(); // temoin d'attente llSetText("running", <1.0, 0.0, 0.0>, 0.0); llMessageLinked(LINK_THIS, 42, str, ""); // attend la fin de la commande ou un timeout. integer len = llStringLength(TERM0)-1; // pas de timeout pour interact integer flag_interact = 0; if (llGetSubString(str,0,7) == "INTERACT") flag_interact=1; while( ( txt != TERM0 ) && ( (llGetUnixTime() - time < gTimeLimit) || (flag_interact == 1) ) ) { txt = llList2String(llGetLinkPrimitiveParams(LINK_THIS,[PRIM_TEXT]), 0); retour = llStringTrim(llGetSubString(txt, len+1, -1), STRING_TRIM); txt = llGetSubString(txt, 0, len); } if ( txt != TERM0 ) { gRetour = "TIMEOUT : " + retour; } }// Cmd ----------------------------------------------------------------------- integer Name2LinkNumber(string name) { integer nbPrims = llGetNumberOfPrims(); integer i;
for (i=0; i<=nbPrims; ++i) if (llGetLinkName(i) == name) return i;
return -1; }// Name2LinkNumber -----------------------------------------------------------
Say(string msg){llOwnerSay(msg);} // Say ------------------------------------------------------------------------
Text(integer x, integer y, string text) { integer i; integer n = llStringLength(text); string car; string com;
for(i=0; i<n; ++i) { car = llToUpper(llGetSubString(text, i, i)); com = "setmega " + (string)x + " " + (string)y + " "; if (car == " ") Cmd(com + "0 0"); else if (car == "A") Cmd(com + "236776 40970"); else if (car == "B") Cmd(com + "244936 58114"); else if (car == "C") Cmd(com + "168130 25352"); else if (car == "D") Cmd(com + "94440 54018"); else if (car == "E") Cmd(com + "244930 58120"); else if (car == "F") Cmd(com + "244930 40960"); else if (car == "G") Cmd(com + "169186 25354"); else if (car == "H") Cmd(com + "240682 40970"); else if (car == "I") Cmd(com + "15042 50056"); else if (car == "J") Cmd(com + "15042 49792"); else if (car == "K") Cmd(com + "239874 41032"); else if (car == "L") Cmd(com + "172032 58120"); else if (car == "M") Cmd(com + "190762 40970"); else if (car == "N") Cmd(com + "190506 41034"); else if (car == "N") Cmd(com + "190506 41034"); else if (car == "O") Cmd(com + "168168 25346"); else if (car == "P") Cmd(com + "244970 40960"); else if (car == "Q") Cmd(com + "170216 25418"); else if (car == "R") Cmd(com + "244970 41032"); else if (car == "S") Cmd(com + "244962 49930"); else if (car == "T") Cmd(com + "15042 640"); else if (car == "U") Cmd(com + "172074 25346"); else if (car == "V") Cmd(com + "172074 4672"); else if (car == "W") Cmd(com + "174122 24962"); else if (car == "X") Cmd(com + "26882 36936"); else if (car == "Y") Cmd(com + "26882 640"); else if (car == "Z") Cmd(com + "14786 54024"); else if (car == "1") Cmd(com + "39552 50056"); else if (car == "2") Cmd(com + "81098 58120"); else if (car == "3") Cmd(com + "81130 49930"); else if (car == "4") Cmd(com + "216544 840"); else if (car == "5") Cmd(com + "244930 49930"); else if (car == "6") Cmd(com + "236738 25354"); else if (car == "7") Cmd(com + "13514 640"); else if (car == "8") Cmd(com + "105672 25346"); else if (car == "9") Cmd(com + "105704 17154"); else if (car == "0") Cmd(com + "170216 25346"); else if (car == "!") Cmd(com + "2688 512"); else if (car == "?") Cmd(com + "40136 512"); else if (car == "+") Cmd(com + "200352 640"); else if (car == "-") Cmd(com + "199712 0"); else if (car == "(") Cmd(com + "2624 384"); else if (car == ")") Cmd(com + "1408 576"); else if (car == "=") Cmd(com + "17160 4290"); else if (car == "/") Cmd(com + "2306 36864"); else if (car == "\\") Cmd(com + "26624 72"); else if (car == ":") Cmd(com + "512 128"); else if (car == ".") Cmd(com + "0 512"); else if (car == ",") Cmd(com + "0 2304"); else if (car == "%") Cmd(com + "10498 36872"); else if (car == "$") Cmd(com + "106178 50050");
x+=6; }// for gRetour = ""; // penible à gerer ici... }// Text ---------------------------------------------------------------------- default /////////////////////////////////////////////////////////////////////// { state_entry() { }// state_entry ----------------------------------------------------------- link_message(integer sender_num, integer num, string str, key id) { integer i; integer nb; // pour la boucle du repeat if (num != 0) return; // ==== EXIT ==== string line; string msg; string p1; string p2; string p3; string cmd;integer pos; line = llStringTrim(str, STRING_TRIM); msg = line; pos = llSubStringIndex(line, " "); cmd = llStringTrim(llGetSubString(line, 0, pos), STRING_TRIM); cmd = llToUpper(cmd); if ( pos == -1 ) // commandes sans parametres { Cmd(msg); jump fin_message; //------------------------------------------- } // au moins 1 param line = llStringTrim(llGetSubString(line, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(line, " "); if (pos==-1) pos=0; p1 = llStringTrim(llGetSubString(line, 0, pos-1), STRING_TRIM); if (pos == 0) // 1 param { if (cmd=="PAUSE" ) { llSleep(((float)p1)/100.0); } else Cmd(msg); jump fin_message; //------------------------------------------- } // au moins 2 param line = llStringTrim(llGetSubString(line, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(line, " "); if (pos==-1) pos=0; p2 = llStringTrim(llGetSubString(line, 0, pos-1), STRING_TRIM); //cas particulier du REPEAT n cmd if (cmd=="REPEAT") { nb = (integer)p1; cmd = llStringTrim(line, STRING_TRIM); for(i=1; i<=nb;i++) Cmd(cmd); jump fin_message; } if (pos == 0) // 2 param { Cmd(msg); jump fin_message; //------------------------------------------- } // au moins 3 param line = llStringTrim(llGetSubString(line, pos+1, -1), STRING_TRIM); pos = llSubStringIndex(line, " "); if (pos==-1) pos=0; p3 = llStringTrim(llGetSubString(line, 0, pos-1), STRING_TRIM); if (pos == 0) // 3 param { if (cmd=="TEXT") Text((integer)p1, (integer)p2, p3); else Cmd(msg); jump fin_message; //------------------------------------------- } Cmd(msg); @fin_message; llSetText(TERM + " " + gRetour, <1.0,0.0,0.0>, 0.0); }// link_message
}// state default --------------------------------------------------------
Il ne se passe rien? c'est normal ! 
Vous avez là, la machinerie du truc. Ca ne fait qu'obéir aux instructions qu'on lui donne et on lui a encore rien donné...
(suite au prochain post because la taille)
|