/* plugin par iri - http://www.irizone.net date : may 2005 name : iriparticles - part CLIENT nom : dynparticles - partie CLIENTE date : février 2007 auteur : iri pour I-Maginer (http://www.i-maginer.fr) version : 1.0 Ce plugin a pour objectif de créer un système de particules lié à un objet 3d. Un grand nombre de paramètres sont accessibles mais il en manque encore tels que : - la variation de la couleur en fonction de l'âge - la modification du spin et de la polarité - la modification périodique de paramètres - ... Ce plugin peut être édité soit via le ' DynEditor ' soit directement via l'action ' edit ' : - dans le premier cas, la validation se fera à la fin, en cliquant sur le bouton adéquat, - dans le second cas, la validation est immédiate et dynamique. Cependant, il faut un choix volontaire de l'administrateur pour que les modifications soient routées à tous les clients et enregistrés sur le .dms du serveur L'objet sur lequel ce système de particules est lié peut être changé en cliquant sur un nouvel objet 3d et en éditant ces paramètres (par l'une des deux solutions ci-dessus) : l'ancien système sera alors détruit. (annulé pour l'instant) Cet objet peut aussi être l'avatar du client ou un avatar particulier. Le code de ce plugin ne contient quasiment plus de références à ' iriparticles '. */ typeof class = S;; typeof initON = I;; // lancement des particules automatiquement typeof initColor = I;; // couleur initiale typeof initSize = [[F F] r1];; // tailles en fonction de l'âge typeof colorCycle = I;; // activer un cycle de couleur (1) ou pas (0) typeof sizeCycle = I;; // activer un cycle de taille (1) ou pas (0) typeof maxSize = I;; // taille maximale typeof typeFX = I;; // effet : constant, électrique, magnétique, chaotique ou hélicoïdale typeof typeVolEmitter = I;; // volume dans lequel évoluent les particules typeof typeMaskEmitter = I;; // masque de l'emitter typeof typeMaskParticle = I;; // masque de la particule typeof vectorVolA = [F F F];; // vecteur A du volume typeof vectorVolB = [F F F];; // vecteur B du volume typeof vectorFxA = [F F F];; // vecteur A de l'effet typeof vectorFxB = [F F F];; // vecteur B de l'effet typeof vectorFxC = [F F F];; // vecteur C de l'effet typeof life = F;; // durée de vie var masse = 0.0;; // masse var spin = 0.0;; // spin (~ orientation) var polarity = 0.0;; // polarité typeof framerate = F;; // framerate (nb de particules par unité de temps) typeof ftrans = I;; // transparence de la texture typeof pathTex = S;; // path de la texture utilisée par les particules typeof pathM3d = S;; // path du m3d utilisé typeof nameM3d = S;; // nom du mesh à utiliser typeof fAv = I;; // l'objet est l'avatar typeof fAvPos = [I I I];; // position de la source du système de particules par rapport à l'avatar typeof h3dTopoPart = H3d;; typeof hpart3dMain = [HPart3d r1];; typeof hfx3dMain = [HEffect3d r1];; typeof hEmitter = H3d;; typeof Objs = H3d;; // objet supportant les particules var winOpened = 0;; var winm3dOpened = 0;; var editok = 0;; // si l'édition est activé, prend la valeur 1 var dlTex = 0;; // 1 si la texture doit être chargée var dlM3d = 0;; // 1 si le m3d doit être chargé var dummy = "material mat_dynpart_dummy {\ncolor 0\n}\nmesh dynpart_dummy {\n0 0 0 0 0 0 100\n0 0 0\n}";; proto dynamicedit = fun [ObjWin H3d HMat3d S Ob] I;; // édition en ligne via l'action ' .edit ' proto dynEdit = fun [ObjWin H3d HMat3d S] fun [] S;; // édition en ligne via le plugin ' DynamicEditor ' /* Initialise la liste des tailles selon l'âge l -> [S r1] : tailles classées selon l'âge sizes -> [[F F] r1] : liste à initialiser (devrait être à nil au départ) life -> F : âge (devrait être à 0.0 au départ) <- [[F F] r1] : liste initialisée */ fun setInitSize(l, sizes, life)= if l == nil then sizes else ( set sizes = [atof hd l life]::sizes; setInitSize tl l sizes life+.10.0 );; /* Retourne la liste des tailles sans les âges, en type S l -> [[F F] r1] : liste taille / age out -> [S r1] : liste des tailles en S <- [S r1] : out */ fun getSizeInList(l, out)= if l == nil then out else let hd l -> [taille _] in ( set out = (ftoa1d taille) :: out; getSizeInList tl l out );; /* retourne le premier objet de l'ancre */ fun setObjs(l, o)= if l == nil then 0 else let match hd l with (objAnchor [h _ _ _] -> set Objs = h) |(_ -> nil) -> _ in 0;; // Effectue une mise à jour de la liste des couleurs en cas de cycle de couleurs fun setColorsPart(colors, l)= if colors == nil then l else let hd colors -> [c life] in let get_rgba c -> [r g b a] in let if r > 245 then 0 else r+10 -> r in let if g > 250 then 0 else g+5 -> g in let if b > 253 then 0 else b+2 -> b in let if a > 122 then 0 else a+5 -> a in ( set l = [make_rgba r g b a life]::l; setColorsPart tl colors l );; // Effectue une mise à jour de la liste des tailles en cas de cycle de tailles (en fait c'est un leurre en attendant de bien gérer en fonction du graph de l'édition dynamique !!) fun setSizesPart(sizes, l)= if sizes == nil then l else let hd sizes -> [s life] in let if (ftoi s) > maxSize then 2.0 else s+.10.0 -> s in ( set l = [s life]::l; setSizesPart tl sizes l );; fun convSizesS2F(l, out, i)= if i >. 100.0 then out else ( set out = [(atof (hd l)) i] :: out; convSizesS2F tl l out i+.10.0 );; fun convVectorS2F(l)= let lineextr hd l -> [a [b [c _]]] in [atof a atof b atof c];; // transposition des données en provenance du serveur - fun [S] I fun initDatas(param)= if param == nil then 0 else let strextr param -> l in ( let hd switchstr l "initcolor" -> tmp in set initColor = if tmp == nil then 0xffffff else htoi tmp; // let get_rgba initColor -> [r g b a] in _DLGMessageBox _channel nil "RGBA" strcatn (itoa r) :: "__" :: (itoa g) :: "__" :: (itoa b) :: "__" :: (itoa a) :: "__" :: (itoh initColor) :: nil 0; let hd switchstr l "colorcycle" -> tmp in // let (_showconsole;_fooS tmp) -> _ in set colorCycle = if (!strcmp tmp "on") || (!strcmp tmp "1") then 1 else 0; set maxSize = atoi hd switchstr l "sizemax"; let hd switchstr l "sizecycle" -> tmp in set sizeCycle = if (!strcmp tmp "on") || (!strcmp tmp "1") then 1 else 0; let hd switchstr l "png" -> tmp in ( set dlTex = if !strcmp pathTex tmp then 0 else 1; set pathTex = tmp; ); let hd switchstr l "m3d" -> tmp in ( set dlM3d = if !strcmp pathM3d tmp then 0 else 1; set pathM3d = tmp; ); set nameM3d = hd switchstr l "fm3dname"; set fAv = atoi hd switchstr l "m3d_fAv"; let lineextr hd switchstr l "m3d_fAvPos" -> tmp in set fAvPos = [atoi hd tmp atoi hd tl tmp atoi hd tl tl tmp]; set initSize = convSizesS2F lineextr hd switchstr l "sizetime" nil 0.0; set framerate = atof hd switchstr l "framerate"; let hd switchstr l "ftrans" -> tmp in set ftrans = if tmp == nil then 128 else atoi tmp; set masse = atof hd switchstr l "mass"; let atoi hd switchstr l "randcolor" -> rc in let atoi hd switchstr l "target" -> t in set typeMaskParticle = rc|t; let hd switchstr l "life" -> tmp in if (!strcmp tmp "PCL_INFINIT") || (!strcmp tmp "0") then ( set life = nil; set typeMaskEmitter = PCL_INFINIT ) else ( set life = atof tmp; set typeMaskEmitter = nil ); // set typeMaskEmitter = atoi hd switchstr l "maskEmitter"; let hd switchstr l "volume" -> tmp in set typeVolEmitter = if !strcmp tmp "VOLUME_CONE" then VOLUME_CONE else if !strcmp tmp "VOLUME_PLAN" then VOLUME_PLAN else if !strcmp tmp "VOLUME_LINE" then VOLUME_LINE else VOLUME_SPHERE; set vectorVolA = convVectorS2F switchstr l "volA"; set vectorVolB = convVectorS2F switchstr l "volB"; let hd switchstr l "effect" -> tmp in set typeFX = if !strcmp tmp "EFFECT_ELECTRIC" then EFFECT_ELECTRIC else if !strcmp tmp "EFFECT_MAGNETIC" then EFFECT_MAGNETIC else if !strcmp tmp "EFFECT_CHAOTIC0" then EFFECT_CHAOTIC0 else if !strcmp tmp "EFFECT_CHAOTIC1" then EFFECT_CHAOTIC1 else if !strcmp tmp "EFFECT_HELICOID" then EFFECT_HELICOID else if !strcmp tmp "EFFECT_CONSTANT" then EFFECT_CONSTANT else if !strcmp tmp "EFFECT_PLANCOLL" then EFFECT_PLANCOLL else 0; set vectorFxA = convVectorS2F switchstr l "effectA"; set vectorFxB = convVectorS2F switchstr l "effectB"; set vectorFxC = convVectorS2F switchstr l "effectC"; 0 );; /* Destruction des particules fx -> HEffect3d part-> HPart3d <- I */ fun destroyParticles(fx, part)= if fx == nil then ( set hfx3dMain = nil; // reset set hpart3dMain = nil; // reset M3delObj session h3dTopoPart; set h3dTopoPart = nil; 0 ) else // destroy each fx and particles ( M3delEffect3d session hd fx; M3delPart3d session hd part; destroyParticles tl fx tl part );; fun stopParticles()= destroyParticles hfx3dMain hpart3dMain;; /* Création du système de particules Destruction de l'ancien système au préalable (s'il en existe un) o -> Ob <- I */ fun startParticles(o)= if Objs == nil then 0 else ( // _showconsole; stopParticles; // M3load session "dms/3d/plugins/dynparticles/particles.m3d" nil; M3load session pathM3d nil; // set h3dTopoPart = M3meshGetTopology session (M3getObj session "Topo_Particle"); let M3getObj session nameM3d -> h in let hd M3listOfMaterials session h -> mat in let if pathTex != nil then let M3createTexture session pathTex -> t in let M3setType session mat MAT_TRANSP|MAT_COLOR1|MAT_COLOR2|MAT_TEXTURED|MAT_LIGHT -> _ in let M3chgMaterialTexture session mat t -> _ in let _GETalphaBitmaps _LDalphaBitmap _channel _checkpack pathTex -> [bmp _] in let M3setMaterialTransparency session mat (255-ftrans) -> _ in M3blitTexture16 session t bmp else M3setType session mat MAT_COLOR1|MAT_TRANSP|MAT_LIGHT -> _ in set h3dTopoPart = M3meshGetTopology session h; // let hd initSize -> [taille _] in set hpart3dMain = (M3createParticle session h3dTopoPart typeMaskParticle life framerate masse itof maxSize spin polarity)::hpart3dMain; M3setParticleSizes session hd hpart3dMain initSize; M3setParticleSpins session hd hpart3dMain [0.2 0.0]::[0.5 30.0]::[0.2 100.0]::nil; M3setParticleColors session hd hpart3dMain [initColor 0.0] :: [initColor 10.0] :: [initColor 20.0] :: [initColor 30.0] :: [initColor 40.0] :: [initColor 50.0] :: [initColor 60.0] :: [initColor 70.0] :: [initColor 80.0] :: [initColor 90.0] :: [initColor 100.0] :: nil; set hfx3dMain = (M3createEffect session typeFX vectorFxA vectorFxB vectorFxC)::hfx3dMain; let M3createEmitter session typeMaskEmitter life [typeVolEmitter vectorVolA vectorVolB] -> h3dEmitter in ( M3linkParticleList session h3dEmitter (hd hpart3dMain)::nil; M3linkEffectList session h3dEmitter (hd hfx3dMain)::nil; M3setEmitterState session h3dEmitter PCL_ENABLE; set hEmitter = h3dEmitter; if fAv then let M3loadString session dummy nil -> _ in let M3getObj session "dynpart_dummy" -> h in let M3getObjVec session M3getFather session ObGetMain owner -> [x y z] in let M3link session h M3getFather session ObGetMain owner -> _ in ( M3link session h3dEmitter h; M3setObjVec session h fAvPos /* let M3getObjVec session h3dTopoPart -> [x y z] in M3setObjVec session h3dTopoPart [x y+100 z] */ ) else M3link session h3dEmitter Objs; UsendMessage ObUi o "started" nil; ) );; // Le fichier est téléchargé fun DWLend(s, o)= startParticles o;; // Télécharge la texture fun DWLtex(o)= if pathTex != nil then _RSCdownload this pathTex pathTex mkfun2 @DWLend o 3 else nil; 0;; // Télécharge le m3d fun DWLm3d(o)= if pathM3d != nil then _RSCdownload this pathM3d pathM3d mkfun2 @DWLend o 3 else nil; 0;; /* Série de callbacks des actions clientes via dms o -> Ob from -> DMI action -> S param -> S reply -> S <- I */ // Démarre le système (inusité) fun cbStart(o, from, action, param, reply)= setObjs ObAnchor o o; _DMSevent this (strcatn (ObName o)::".started"::nil) nil nil;; // Arrêt des particules (stop) fun cbClose(o, from, action, param, reply)= destroyParticles hfx3dMain hpart3dMain; _DMSevent this (strcatn (ObName o)::".stopped"::nil) nil nil;; // Edition en ligne (edit) fun cbEdit(o, from, action, param, reply)= dynamicedit nil Objs nil param o; 0;; // Register du client (register) fun cbRegister(o, from, action, param, reply)= UsendMessage ObUi o "register" itoa initON;; // Unregister du client (unregister) fun cbUnregister(o, from, action, param, reply)= UsendMessage ObUi o "unregister" nil;; /* Callbacks Ob */ // Lorsque le client clique sur un objet, celui-ci est enregistré en vue d'une éventuelle utilisation par le plugin // fun [Ob [H3d HMat3d I]] I fun cbClick(o, p)= if editok then let p -> [h m btn] in if btn == 3 then set Objs = h else nil else nil; 0;; // Exécutée après chaque rendu (pour d'éventuelles animations sur les couleurs ou les tailles par exemple) A faire ! // fun [Ob [ObjSurface [I I]]] I fun cbRender(o, p)= if colorCycle == 1 then let M3getParticleColors session hd hpart3dMain -> colors in let setColorsPart colors nil -> l in M3setParticleColors session hd hpart3dMain l else 0;; /* Communication serveur => cient ui -> UserI action -> S : nom de l'action venant du srv param -> S : paramètre de l'action o -> Ob <- I */ fun cbcomm(ui, action, param, o)= if !strcmp action "start" then ( initDatas param; if dlTex then DWLtex o else if dlM3d then DWLm3d o else startParticles o; 0 ) else if !strcmp action "stop" then stopParticles else if !strcmp action "registered" then _DMSevent this ( strcatn (ObName o) :: ".registered" :: nil ) nil nil else if !strcmp action "unregistered" then _DMSevent this ( strcatn (ObName o) :: ".unregistered" :: nil ) nil nil else 0;; /* Création de l'instance correspondante o -> Ob <- I */ fun newOb(o)= set initON = if !strcmpi hd UgetParam ObUi o "init" "on" then 1 else 0; setObjs ObAnchor o o; UcbComm this ObUi o mkfun4 @cbcomm o; if initON then UsendMessage ObUi o "register" nil else 0; // ObCbControlClick o @cbClick; ObRegisterAction o (strcatn (ObName o)::".start"::nil) @cbStart; // Obsolète ObRegisterAction o (strcatn (ObName o)::".stop"::nil) @cbClose; ObRegisterAction o (strcatn (ObName o)::".edit"::nil) @cbEdit; ObRegisterAction o (strcatn (ObName o)::".register"::nil) @cbRegister; ObRegisterAction o (strcatn (ObName o)::".unregister"::nil) @cbUnregister; ObCbPostRender o @cbRender; 0;; /* initialisation du plugin auprès du c3d3 file -> S : fichier *.plug <- I */ fun IniPlug(file)= set class = getInfo strextr _getpack _checkpack file "name"; let if !strcmp _getress "DefaultLanguage" "French" then "french" else "english" -> lang in _load strcatn "dms/3d/plugins/dynparticles/lang/" :: lang :: ".lang" :: nil; PLUGsetinfo thisplug PLUGIN_OBJECT|PLUGIN_RESERVED|PLUGIN_ONLINE_EDITING; PLUGdefineEditor thisplug @dynEdit; PlugRegister class @newOb nil; 0;; /* ********************************* EDITION EN LIGNE ********************************* */ typeof bmpcolor = ObjBitmap;; typeof winColor = ObjWin;; typeof font = ObjFont;; typeof sliColorAlpha = ObjSlider;; typeof txtAlphaValue = ObjText;; typeof cColorCycle = ObjCheck;; typeof txtSizeMax = ObjText;; typeof cSizeConst = ObjCheck;; typeof winSize = ObjWin;; typeof txtExpertInfinit = ObjText;; typeof cmExpertVolume = ObjBox;; typeof txtExpertVolumeSphereRadiusMsg = ObjText;; typeof txtExpertVolumeSphereRadius = ObjText;; typeof txtExpertVolumeConeMsg = ObjText;; typeof txtExpertVolumeConeLong = ObjText;; typeof txtExpertVolumeConeLarg = ObjText;; typeof txtExpertVolumeConeHaut = ObjText;; typeof txtExpertVolumePlanMsg = ObjText;; typeof txtExpertVolumePlanLong = ObjText;; typeof txtExpertVolumePlanLarg = ObjText;; typeof txtExpertVolumeLineMsg = ObjText;; typeof txtExpertVolumeLineLong = ObjText;; typeof cmExpertEffect = ObjBox;; typeof txtExpertEffectConstantMsg = ObjText;; typeof txtExpertEffectConstantX = ObjText;; typeof txtExpertEffectConstantY = ObjText;; typeof txtExpertEffectConstantZ = ObjText;; typeof txtExpertEffectElectricMsg = ObjText;; typeof txtExpertEffectElectricAX = ObjText;; typeof txtExpertEffectElectricAY = ObjText;; typeof txtExpertEffectElectricAZ = ObjText;; typeof txtExpertEffectElectricBX = ObjText;; typeof txtExpertEffectMagneticMsg = ObjText;; typeof txtExpertEffectMagneticAX = ObjText;; typeof txtExpertEffectMagneticAY = ObjText;; typeof txtExpertEffectMagneticAZ = ObjText;; typeof txtExpertEffectMagneticBX = ObjText;; typeof txtExpertEffectChaotic0Msg = ObjText;; typeof txtExpertEffectChaotic0AX = ObjText;; typeof txtExpertEffectChaotic0AY = ObjText;; typeof txtExpertEffectChaotic0AZ = ObjText;; typeof txtExpertEffectChaotic0BX = ObjText;; typeof txtExpertEffectChaotic0BY = ObjText;; typeof txtExpertEffectChaotic0BZ = ObjText;; typeof txtExpertEffectChaotic1Msg = ObjText;; typeof txtExpertEffectChaotic1AX = ObjText;; typeof txtExpertEffectChaotic1AY = ObjText;; typeof txtExpertEffectChaotic1AZ = ObjText;; typeof txtExpertEffectChaotic1BX = ObjText;; typeof txtExpertEffectChaotic1BY = ObjText;; typeof txtExpertEffectChaotic1BZ = ObjText;; typeof txtExpertEffectHelicoidMsg = ObjText;; typeof txtExpertEffectHelicoidAX = ObjText;; typeof txtExpertEffectHelicoidAY = ObjText;; typeof txtExpertEffectHelicoidAZ = ObjText;; typeof txtExpertEffectHelicoidBX = ObjText;; typeof txtExpertEffectHelicoidBY = ObjText;; typeof txtExpertEffectHelicoidBZ = ObjText;; typeof txtExpertEffectPlancollMsg = ObjText;; typeof txtExpertEffectPlancollAX = ObjText;; typeof txtExpertEffectPlancollAY = ObjText;; typeof txtExpertEffectPlancollAZ = ObjText;; typeof txtExpertEffectPlancollBX = ObjText;; typeof txtExpertEffectPlancollBY = ObjText;; typeof txtExpertEffectPlancollBZ = ObjText;; typeof cExpertBillboard = ObjCheck;; typeof cExpertRainbow = ObjCheck;; typeof txtExpertMasse = ObjText;; typeof cTxtRate = ObjText;; typeof cExpertAllClients = ObjCheck;; typeof cExpertUploadSrv = ObjCheck;; typeof winHelp = ObjWin;; typeof m3dPathTexture = ObjText;; typeof m3dnotexture = ObjCheck;; typeof m3d_InfosSize = ObjText;; typeof m3d_InfoFile = ObjText;; typeof m3d_sliTransparence = ObjSlider;; typeof m3dPathM3d = ObjText;; typeof m3dNameM3d = ObjBox;; typeof m3d_cAv = ObjCheck;; typeof m3d_posAvX = ObjText;; typeof m3d_posAvY = ObjText;; typeof m3d_posAvZ = ObjText;; typeof listSizes = [[F F] r1];; typeof listSizesOld = [[F F] r1];; typeof colorInit = S;; typeof colorInitClick = I;; proto plugloc = fun [S] S;; proto plughelp = fun [S] S;; /* MISC. */ /* Retourne la valeur de durée de vie en fonction de l'abscisse du clic l -> [[I I] r1] : listSizes w -> I : largeur de la fenêtre du graph x -> I : pos x du clic m -> I : marge autour de la position réelle pour acceptation <- I : valeur de la durée de vie */ fun getLifeByX(l, w, x, m)= if l == nil then nil else let hd l -> [_ vie] in let 25+((ftoi vie)*((w-30)/100)) -> v in if x >= (v-m) && x < (v+m) then ftoi vie else getLifeByX tl l w x m;; // modifie une taille à un âge donné des particules fun replaceTailleInListSizes(l, vie, taille)= if l == nil then nil else let hd l -> [t v] in if v == vie then [taille vie] :: (tl l) else (hd l) :: replaceTailleInListSizes tl l vie taille;; /* Vérifie la validité des entrées saisies par l'utilisateur. En effet, le flag ' ET_NUMBER ' lié à un ObjText exclue les ' - ' et ' . ' d'où cette fonction de vérification si c'est deux caractères sont admissibles. Vérifie que tous les caractères sont autorisés (chaine ' ok ') et que si le caractère ' - ' est présent, il l'est en position 0 et que la chaine fait alors au moins 2 caractères. Dès qu'un caractère non admissible est trouvé, le traitement s'arrête et retourne 0. l -> [I r1] : liste des codes ascii des caractères formant la chaîne à examiner (' strtolist ') pos -> I : position du caractère dans la chaine (0 au départ ... !) size -> I : taille de la chaine <- I : 1 si la chaine est ok, 0 sinon */ fun verifyNumber(l, pos, size)= let "-.0123456789" -> ok in if l == nil then 1 else let strfind ctoa hd l ok 0 -> r in if (r == nil) || ((r == 0) && (pos != 0)) || ((r == 0) && (size < 2)) then 0 else verifyNumber tl l pos+1 size;; /* SIZE */ fun getSizes(l, out)= if l == nil then linebuild out else let hd l -> [taille _] in ( set out = (ftoa taille) :: out; getSizes tl l out );; fun size_initList(m)= let itof m -> m in set listSizes = [m 0.0] :: [m 10.0] :: [m 20.0] :: [m 30.0] :: [m 40.0] :: [m 50.0] :: [m 60.0] :: [m 70.0] :: [m 80.0] :: [m 90.0] :: [m 100.0] :: nil;; // L'admin change la taille maximale des particules fun size_sizeMax(obj, o)= let _GETtext obj -> s in UsendMessage ObUi o "size_newSizeMax" s;; /* Création du graph des tailles en fonction de la durée de vie des particules */ fun size_winCrGraph(w, h, m, l)= if l == nil then 0 else let hd l -> [taille vie] in let hd tl l -> [taille2 vie2] in let ftoi vie -> vie in let ftoi taille -> taille in let ftoi vie2 -> vie2 in let ftoi taille2 -> taille2 in let 25+(m-taille)*(h-20-25)/m -> y in let 25+(m-taille2)*(h-20-25)/m -> y2 in let 25+(vie*((w-30)/100)) -> x in let 25+(vie2*((w-30)/100)) -> x2 in ( _PAINTcircle winSize x y 4 DRAW_INVISIBLE 0 0 DRAW_SOLID 0x00ff00; if vie2 != nil then _PAINTline winSize x y x2 y2 DRAW_SOLID 1 0x00ff00 else nil; size_winCrGraph w h m tl l );; /* Création des axes et des labels du graph fun [] I */ fun size_winCrAxes()= let _GETwindowSizePosition winSize -> [w h _ _] in let atoi _GETtext txtSizeMax -> m in ( _CLRwindow winSize; _PAINTline winSize 25 20 25 h-15 DRAW_SOLID 1 0; _PAINTline winSize 20 h-20 w-50 h-20 DRAW_SOLID 1 0; _TXTout winSize font 200 5 TD_LEFT|TD_TOP 0 plugloc "SIZE_CONF"; _TXTout winSize font 1 25 TD_LEFT|TD_BASELINE 0 "100%"; _TXTout winSize font 10 h-5 TD_LEFT|TD_BASELINE 0 "0"; _TXTout winSize font w-70 h-5 TD_LEFT|TD_BASELINE 0 "100%"; _TXTout winSize font 10 3 TD_LEFT|TD_TOP 0 plugloc "SIZELINE"; _TXTout winSize font (w/2) h-5 TD_CENTER|TD_BASELINE 0 plugloc "TIMELINE"; _TXTout winSize font w-2 h-60 TD_RIGHT|TD_BASELINE 0xff0000 "UNDO"; _TXTout winSize font w-2 h-40 TD_RIGHT|TD_BASELINE 0xff0000 "REDO"; _TXTout winSize font w-2 h-20 TD_RIGHT|TD_BASELINE 0xff0000 "RESET"; if (_GETcheck cSizeConst) then nil else _TXTout winSize font w/2 h/2 TD_CENTER|TD_BASELINE 0xff0000 plugloc "SIZEWIN_DISABLED"; size_winCrGraph w h m listSizes; );; // callback : si l'admin désire une taille unique quelque soit l'âge des particules, le graph n'a plus de raison d'être et est donc désactivé. fun size_sizeConst(obj, u, state)= size_winCrAxes; _ENwindow winSize state;; // callback : paint de la fenêtre du graph des tailles : on demande de le dessiner fun size_winPaint(obj, u)= size_winCrAxes;; /* clic dans le graph. 5 zones sont définies : - le graph lui-même (le rectangle matérialisé par les deux axes) - le bouton undo (annuler) - le bouton redo (rétablir) - le bouton de réinitialisation (reset) - le reste de la fenêtre */ fun size_winClick(obj, o, x, y, btn)= let _GETwindowSizePosition winSize -> [w h _ _] in let atoi _GETtext txtSizeMax -> m in let getLifeByX listSizes w x (w-70)/10 -> vie in if x > (w-35) && y > (h-68) && y < (h-52) then // undo let listSizes -> old in ( set listSizes = listSizesOld; set listSizesOld = old; size_winCrAxes ) else if x > (w-35) && y > (h-48) && y < (h-32) then // redo let listSizesOld -> new in ( set listSizesOld = listSizes; set listSizes = new; size_winCrAxes ) else if x > (w-35) && y > (h-28) && y < (h-12) then // reset let listSizes -> old in ( set listSizes = size_initList m; set listSizesOld = old; size_winCrAxes ) else if y > 25 && y < (h-20) && vie != nil then // graph let m-ftoi(((itof(y-25))/.100.0)*.(itof m)) -> taille in let if taille > m then m else taille -> taille in ( set listSizesOld = listSizes; set listSizes = replaceTailleInListSizes listSizes itof vie itof taille; size_winCrAxes; UsendMessage ObUi o "size_newSize" linebuild getSizeInList listSizes nil; ) else 0;; /* COLOR */ // l'état d'activation du cycle de couleur a été modifié fun color_cycleColor(obj, o, state)= UsendMessage ObUi o "color_cycleColor" itoa state;; // le curseur du slide de réglage de la composante alpha a été modifié fun color_alphaClick(obj, l, r, o)= _SETtext txtAlphaValue strcat ftoa1d l " %"; UsendMessage ObUi o "color_chgAlpha" ftoa (l *. 1.27);; // un clic a eulieu dans la map de couleurs fun color_winClick(obj, u, x, y, btn)= set colorInitClick = _GETpixel24 bmpcolor x y; let u -> [win o] in ( UsendMessage ObUi o "color_chgColor" itoh colorInitClick; _PAINTwindow win );; fun color_winPaint(obj, u)= _BLTbitmap winColor bmpcolor 0 0;; fun color_winEnd(obj, u)= _DSbitmap bmpcolor;; /* EXPERT */ // la durée de vie est changée : la nouvelle donnée est envoyée au serveur fun expert_infinit(obj, o)= let _GETtext obj -> vie in UsendMessage ObUi o "expert_infinit" vie;; // le rayon de la sphère dans laquelle évoluent les particules a changé : la nouvelle donnée est envoyée au serveur fun expert_volumeSphereRadius(obj, o)= let _GETtext obj -> r in UsendMessage ObUi o "expert_volSphreRadius" r;; // une dimension du cône dans lequel évoluent les particules a changé : la nouvelle donnée est envoyée au serveur fun expert_volumeCone(obj, u)= let u -> [o n] in let _GETtext obj -> c in if (verifyNumber strtolist c 0 strlen c) && (n == 3) then UsendMessage ObUi o "expert_volCone" linebuild (itoa n) :: c :: nil else 0;; // une dimension du plan dans lequel évoluent les particules a changé : la nouvelle donnée est envoyée au serveur fun expert_volumePlan(obj, u)= let u -> [o n] in let _GETtext obj -> c in if (verifyNumber strtolist c 0 strlen c) then UsendMessage ObUi o "expert_volPlan" linebuild (itoa n) :: c :: nil else 0;; // le segment de la ligne dans lequel évoluent les particules a changé : la nouvelle donnée est envoyée au serveur fun expert_volumeLine(obj, o)= let _GETtext obj -> c in if (verifyNumber strtolist c 0 strlen c) then UsendMessage ObUi o "expert_volLine" c else 0;; // le volume a été changé. Seuls les champs de données correspondant au volume sélectionné sont montrés. // Le nouveau volume est envoyé au serveur // fun [ObjBox Ob I S] I fun expert_volumeChoice(obj, o, i, s)= _SHOWtext txtExpertVolumeSphereRadius WINDOW_HIDDEN; _SHOWtext txtExpertVolumeSphereRadiusMsg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeConeMsg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeConeLong WINDOW_HIDDEN; _SHOWtext txtExpertVolumeConeLarg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeConeHaut WINDOW_HIDDEN; _SHOWtext txtExpertVolumePlanMsg WINDOW_HIDDEN; _SHOWtext txtExpertVolumePlanLong WINDOW_HIDDEN; _SHOWtext txtExpertVolumePlanLarg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeLineMsg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeLineLong WINDOW_HIDDEN; if !strcmp s plugloc "EXPERT_VOLUME_SPHERE" then ( _SHOWtext txtExpertVolumeSphereRadius WINDOW_UNHIDDEN; _SHOWtext txtExpertVolumeSphereRadiusMsg WINDOW_UNHIDDEN; expert_volumeSphereRadius txtExpertVolumeSphereRadius o ) else if !strcmp s plugloc "EXPERT_VOLUME_CONE" then ( _SHOWtext txtExpertVolumeConeMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertVolumeConeLong WINDOW_UNHIDDEN; _SHOWtext txtExpertVolumeConeLarg WINDOW_UNHIDDEN; _SHOWtext txtExpertVolumeConeHaut WINDOW_UNHIDDEN; expert_volumeCone txtExpertVolumeConeLong [o 1]; expert_volumeCone txtExpertVolumeConeLarg [o 2]; expert_volumeCone txtExpertVolumeConeHaut [o 3] ) else if !strcmp s plugloc "EXPERT_VOLUME_PLAN" then ( _SHOWtext txtExpertVolumePlanMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertVolumePlanLong WINDOW_UNHIDDEN; _SHOWtext txtExpertVolumePlanLarg WINDOW_UNHIDDEN; expert_volumePlan txtExpertVolumePlanLong [o 1]; expert_volumePlan txtExpertVolumePlanLarg [o 2] ) else if !strcmp s plugloc "EXPERT_VOLUME_LINE" then ( _SHOWtext txtExpertVolumeLineMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertVolumeLineLong WINDOW_UNHIDDEN; expert_volumeLine txtExpertVolumeLineLong o ) else 0;; // Aucun effet n'a été souhaité : c'est envoyé au serveur fun expert_effectNone(obj, o)= UsendMessage ObUi o "expert_effectNone" nil;; // les vecteurs de l'effet ' CONSTANT ' ont été modifiés : la nouvelle donnée est envoyée au serveur fun expert_effectConstant(obj, o)= let _GETtext txtExpertEffectConstantX -> x in let _GETtext txtExpertEffectConstantY -> y in let _GETtext txtExpertEffectConstantZ -> z in if (verifyNumber strtolist x 0 strlen x) && (verifyNumber strtolist y 0 strlen y) && (verifyNumber strtolist z 0 strlen z) then UsendMessage ObUi o "expert_effectConstant" linebuild x :: y :: z :: nil else 0;; // les vecteurs de l'effet ' ELECTRIC ' ont été modifiés : la nouvelle donnée est envoyée au serveur fun expert_effectElectric(obj, o)= let _GETtext txtExpertEffectElectricAX -> ax in let _GETtext txtExpertEffectElectricAY -> ay in let _GETtext txtExpertEffectElectricAZ -> az in let _GETtext txtExpertEffectElectricBX -> bx in if (verifyNumber strtolist ax 0 strlen ax) && (verifyNumber strtolist ay 0 strlen ay) && (verifyNumber strtolist az 0 strlen az) && (verifyNumber strtolist bx 0 strlen bx) then UsendMessage ObUi o "expert_effectElectric" linebuild ax :: ay :: az :: bx :: nil else 0;; // les vecteurs de l'effet ' MAGNETIC ' ont été modifiés : la nouvelle donnée est envoyée au serveur fun expert_effectMagnetic(obj, o)= let _GETtext txtExpertEffectMagneticAX -> ax in let _GETtext txtExpertEffectMagneticAY -> ay in let _GETtext txtExpertEffectMagneticAZ -> az in let _GETtext txtExpertEffectMagneticBX -> bx in if (verifyNumber strtolist ax 0 strlen ax) && (verifyNumber strtolist ay 0 strlen ay) && (verifyNumber strtolist az 0 strlen az) && (verifyNumber strtolist bx 0 strlen bx) then UsendMessage ObUi o "expert_effectMagnetic" linebuild ax :: ay :: az :: bx :: nil else 0;; // les vecteurs de l'effet ' CHAOTIC0 ' ont été modifiés : la nouvelle donnée est envoyée au serveur fun expert_effectChaotic0(obj, o)= let _GETtext txtExpertEffectChaotic0AX -> ax in let _GETtext txtExpertEffectChaotic0AY -> ay in let _GETtext txtExpertEffectChaotic0AZ -> az in let _GETtext txtExpertEffectChaotic0BX -> bx in let _GETtext txtExpertEffectChaotic0BX -> by in let _GETtext txtExpertEffectChaotic0BX -> bz in if (verifyNumber strtolist ax 0 strlen ax) && (verifyNumber strtolist ay 0 strlen ay) && (verifyNumber strtolist az 0 strlen az) && (verifyNumber strtolist bx 0 strlen bx) && (verifyNumber strtolist by 0 strlen by) && (verifyNumber strtolist bz 0 strlen bz) then UsendMessage ObUi o "expert_effectChotic0" linebuild ax :: ay :: az :: bx :: by ::bz :: nil else 0;; // les vecteurs de l'effet ' CHAOTIC1 ' ont été modifiés : la nouvelle donnée est envoyée au serveur fun expert_effectChaotic1(obj, o)= let _GETtext txtExpertEffectChaotic1AX -> ax in let _GETtext txtExpertEffectChaotic1AY -> ay in let _GETtext txtExpertEffectChaotic1AZ -> az in let _GETtext txtExpertEffectChaotic1BX -> bx in let _GETtext txtExpertEffectChaotic1BX -> by in let _GETtext txtExpertEffectChaotic1BX -> bz in if (verifyNumber strtolist ax 0 strlen ax) && (verifyNumber strtolist ay 0 strlen ay) && (verifyNumber strtolist az 0 strlen az) && (verifyNumber strtolist bx 0 strlen bx) && (verifyNumber strtolist by 0 strlen by) && (verifyNumber strtolist bz 0 strlen bz) then UsendMessage ObUi o "expert_effectChotic1" linebuild ax :: ay :: az :: bx :: by ::bz :: nil else 0;; // les vecteurs de l'effet ' HELICOIDAL ' ont été modifiés : la nouvelle donnée est envoyée au serveur fun expert_effectHelicoid(obj, o)= let _GETtext txtExpertEffectHelicoidAX -> ax in let _GETtext txtExpertEffectHelicoidAY -> ay in let _GETtext txtExpertEffectHelicoidAZ -> az in let _GETtext txtExpertEffectHelicoidBX -> bx in let _GETtext txtExpertEffectHelicoidBX -> by in let _GETtext txtExpertEffectHelicoidBX -> bz in if (verifyNumber strtolist ax 0 strlen ax) && (verifyNumber strtolist ay 0 strlen ay) && (verifyNumber strtolist az 0 strlen az) && (verifyNumber strtolist bx 0 strlen bx) && (verifyNumber strtolist by 0 strlen by) && (verifyNumber strtolist bz 0 strlen bz) then UsendMessage ObUi o "expert_effectHelicoid" linebuild ax :: ay :: az :: bx :: by ::bz :: nil else 0;; // les vecteurs de l'effet ' PLANCOLL ' ont été modifiés : la nouvelle donnée est envoyée au serveur fun expert_effectPlancoll(obj, o)= let _GETtext txtExpertEffectPlancollAX -> ax in let _GETtext txtExpertEffectPlancollAY -> ay in let _GETtext txtExpertEffectPlancollAZ -> az in let _GETtext txtExpertEffectPlancollBX -> bx in let _GETtext txtExpertEffectPlancollBX -> by in let _GETtext txtExpertEffectPlancollBX -> bz in if (verifyNumber strtolist ax 0 strlen ax) && (verifyNumber strtolist ay 0 strlen ay) && (verifyNumber strtolist az 0 strlen az) && (verifyNumber strtolist bx 0 strlen bx) && (verifyNumber strtolist by 0 strlen by) && (verifyNumber strtolist bz 0 strlen bz) then UsendMessage ObUi o "expert_effectPlancoll" linebuild ax :: ay :: az :: bx :: by ::bz :: nil else 0;; // l'effet a été changé. Seuls les champs de données correspondant à l'effet sélectionné sont montrés. // Le nouvel effet est envoyé au serveur // fun [ObjBox Ob I S] I fun expert_effectChoice(obj, o, i, s)= _SHOWtext txtExpertEffectConstantMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectConstantX WINDOW_HIDDEN; _SHOWtext txtExpertEffectConstantY WINDOW_HIDDEN; _SHOWtext txtExpertEffectConstantZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricBX WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticBX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0Msg WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0AX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0AY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0AZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0BX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0BY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0BZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1Msg WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1AX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1AY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1AZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1BX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1BY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1BZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidBX WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidBY WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidBZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollBX WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollBY WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollBZ WINDOW_HIDDEN; if !strcmp s plugloc "EXPERT_EFFECT_CONSTANT" then ( _SHOWtext txtExpertEffectConstantMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectConstantX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectConstantY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectConstantZ WINDOW_UNHIDDEN; expert_effectConstant nil o ) else if !strcmp s plugloc "EXPERT_EFFECT_ELECTRIC" then ( _SHOWtext txtExpertEffectElectricMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectElectricAX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectElectricAY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectElectricAZ WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectElectricBX WINDOW_UNHIDDEN; expert_effectElectric nil o ) else if !strcmp s plugloc "EXPERT_EFFECT_MAGNETIC" then ( _SHOWtext txtExpertEffectMagneticMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectMagneticAX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectMagneticAY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectMagneticAZ WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectMagneticBX WINDOW_UNHIDDEN; expert_effectMagnetic nil o ) else if !strcmp s plugloc "EXPERT_EFFECT_CHAOTIC0" then ( _SHOWtext txtExpertEffectChaotic0Msg WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic0AX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic0AY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic0AZ WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic0BX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic0BY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic0BZ WINDOW_UNHIDDEN; expert_effectChaotic0 nil o ) else if !strcmp s plugloc "EXPERT_EFFECT_CHAOTIC1" then ( _SHOWtext txtExpertEffectChaotic1Msg WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic1AX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic1AY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic1AZ WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic1BX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic1BY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectChaotic1BZ WINDOW_UNHIDDEN; expert_effectChaotic1 nil o ) else if !strcmp s plugloc "EXPERT_EFFECT_HELICOID" then ( _SHOWtext txtExpertEffectHelicoidMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectHelicoidAX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectHelicoidAY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectHelicoidAZ WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectHelicoidBX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectHelicoidBY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectHelicoidBZ WINDOW_UNHIDDEN; expert_effectHelicoid nil o ) else if !strcmp s plugloc "EXPERT_EFFECT_PLANCOLL" then ( _SHOWtext txtExpertEffectPlancollMsg WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectPlancollAX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectPlancollAY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectPlancollAZ WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectPlancollBX WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectPlancollBY WINDOW_UNHIDDEN; _SHOWtext txtExpertEffectPlancollBZ WINDOW_UNHIDDEN; expert_effectPlancoll nil o ) else expert_effectNone nil o;; fun expert_billboard(obj, o, state)= UsendMessage ObUi o "expert_billboard" itoa state;; fun expert_rainbow(obj, o, state)= UsendMessage ObUi o "expert_rainbow" itoa state;; // la masse a été modifiée. Ce nouvel élément est envoyé au serveur fun expert_masse(obj, o)= let _GETtext obj -> m in UsendMessage ObUi o "expert_masse" m;; // le framerate a été modifé et envoyé au serveur fun expert_framerate(obj, o)= let _GETtext obj -> r in UsendMessage ObUi o "expert_rate" r;; // les changements doivent être appliqués (état = 1) ou non (état = 0) à tous les clients enregistrés auprès du plugin. // cet état est envoyé au serveur fun expert_allClients(obj, o, state)= UsendMessage ObUi o "expert_allClients" itoa state;; // les changements doivent être sauvegardés sur le serveur (fichier *.dms) si l'état vaut 1 sinon ils seront perdus auprochain redémarrage du serveur // cet état est envoyé au serveur fun expert_uploadSrv(obj, o, state)= UsendMessage ObUi o "expert_upload" itoa state;; /* M3D Configure les fichiers de texture et de définition 3d : - le fichier de texture (*.png) - la transparence associée à la texture (au niveau du matériau, ne modifie en rien le fichier *.png) - le fichier *.m3d utilisé - le mesh à considérer inclus dans ce fichier - si l'objet sur lequel est lié le système de particule est l'avatar client */ // ajoute les meshes inclus dans un fichier *.m3d dans le combo de choix de mesh fun addNameM3dInCombo(l, combo)= if l == nil then 0 else if !strcmp hd hd l "mesh" then ( _ADDcombo combo 0 hd tl hd l; addNameM3dInCombo tl l combo ) else addNameM3dInCombo tl l combo;; // fonction paint pour afficher la texture avec une preview de la transparence fun m3d_TexturePaint(win, bmp)= let _GETbitmapSize bmp -> [w h] in _STBLTbitmap win 0 0 128 128 bmp 0 0 w h;; /* Affiche la texture nouvellement choisie dans la vignette en fonction également de : - la transparence; - la couleur de fond de la scène 3d (du C3D3). Donne des infos de base sur la texture (sa taille et son poids). Envoie enfin un message au serveur lui indiquant les modifications. Pour prévisualiser la transparence, la texture prend la transparence demandée pour le materiau avec la couleur de fond de scène du C3D3 courant. fun [ObjText [ObjWin Ob]] I */ fun m3d_TextureNew(obj, u)= let u -> [wintex o] in let _LDalphaBitmap _channel _checkpack _GETtext m3dPathTexture -> png in let _GETalphaBitmapSize png -> [w h] in let _GETalphaBitmaps png -> [tmp _] in let itoh ftrans -> c in let htoi strcatn c :: c :: c :: nil -> col in let _FILLbitmap8 _CRbitmap8 _channel w h col -> tmp8 in // bitmap8 pour l'alpha de l'AlphaBitmap qui suit let _CRalphaBitmap _channel tmp tmp8 nil nil -> png in let _FILLbitmap _CRbitmap _channel 128 128 cel.Cel3dback -> bmp in let _SCPalphaBitmap bmp 0 0 128 128 png 0 0 w h -> bmp in if bmp == nil then 0 else ( _CBwinPaint wintex @m3d_TexturePaint bmp; m3d_TexturePaint wintex bmp; _SETtext m3d_InfosSize strcatn (plugloc "M3D_TEXINFOSIZE") :: "\n" :: (itoa w) :: " x " :: (itoa h) :: " pixels" :: nil; _SETtext m3d_InfoFile strcatn (plugloc "M3D_TEXINFOFILE") :: "\n" :: (itoa ((_fileSize _checkpack pathTex)/1024)) :: " ko" :: nil; UsendMessage ObUi o "m3d_texnew" linebuild pathTex :: (itoa ftrans) :: nil; );; // callback lors d'un drag & drop de texture. S'il s'agit d'un *.png, le choix est validé fun m3d_PathTextureDragDrop(obj, u, x, y, p)= let _PtoScol hd p -> file in if file == nil || (strcmp substr file (strlen file)-4 4 ".png") then nil else ( _SETtext m3dPathTexture file; set pathTex = file ); m3d_TextureNew nil u;; // callback : l'admin ne désire pas de texture associée : fun [ObjCheck [ObjWin Ob] I] I fun m3d_TextureNo(obj, u, state)= set pathTex = nil; _SETtext m3dPathTexture nil; _SETtext m3d_InfosSize strcatn (plugloc "M3D_TEXINFOSIZE") :: "\n" :: "0 x 0 pixels" :: nil; _SETtext m3d_InfoFile strcatn (plugloc "M3D_TEXINFOFILE") :: "\n" :: "0" :: " ko" :: nil; _RSTcombo m3dNameM3d; let u -> [wintex o] in ( m3d_TexturePaint wintex nil; _ENwindow wintex !state; _ENtext m3dPathTexture !state; UsendMessage ObUi o "m3d_texnew" nil );; // callback lorsque le curseur du slide de transparence a été bougé fun m3d_TransparenceNew(obj, l, r, u)= let u -> [wintex o] in ( set ftrans = ftoi l; m3d_TextureNew nil u; ); 0;; // callback lors d'un drag & drop de m3d. S'il s'agit d'un *.m3d, le choix est validé. Met à jour le combo des meshes fun m3d_PathM3dDragDrop(obj, o, x, y, p)= let _PtoScol hd p -> file in if file == nil || (strcmp substr file (strlen file)-4 4 ".m3d") then nil else ( _SETtext m3dPathM3d file; set pathM3d = file ); _RSTcombo m3dNameM3d; addNameM3dInCombo strextr _getpack _checkpack pathM3d m3dNameM3d; _SELcombo m3dNameM3d 0; UsendMessage ObUi o "m3d_m3dnew" pathM3d;; // callback du combo des meshes. Envoie le choix au serveur fun m3d_NameM3d(obj, o, i, s)= if s == nil then 0 else UsendMessage ObUi o "m3d_m3dname" s;; // callback m3d_cAv fun m3d_fAv(obj, o, state)= _ENtext m3d_posAvX state; _ENtext m3d_posAvY state; _ENtext m3d_posAvZ state; UsendMessage ObUi o "m3d_fAv" itoa state;; // nouvelle position du système de particules par rapport à l'avatar fun m3d_avPos(obj, u)= let u -> [o n] in let _GETtext obj -> value in if (verifyNumber strtolist value 0 strlen value) then UsendMessage ObUi o "m3d_fAvPos" linebuild (itoa n) :: value :: nil else 0;; // fenêtre supplémentaire pour paramétrer les fichiers associés aux particules fun plugin_m3d(obj, u)= let u -> [win o] in if winm3dOpened then 0 else let _GETwindowExSizePosition win -> [wf _ xf yf] in let [300 462] -> [w h] in let _CRwindow _channel win xf+wf yf w h WN_MENU|WN_NOSCOL " Configuration M3D" -> child in let _CRwindow _channel child w-133 55 128 128 WN_CHILDINSIDE|WN_DOWN|WN_DRAGDROP nil -> wintex in ( _CRtext _channel child 5 5 w-10 20 ET_BORDER plugloc "M3D_TITLE" ; // Texture _CRtext _channel child 5 30 w-10 20 0 plugloc "M3D_TEXTURE"; set m3dPathTexture = _CRtext _channel child 5 55 w-140 20 ET_DOWN|ET_DRAGDROP|ET_AHSCROLL pathTex; _CBtextDropFile m3dPathTexture @m3d_PathTextureDragDrop [wintex o]; _CBwinDropFile wintex @m3d_PathTextureDragDrop [wintex o]; _CBtext m3dPathTexture @m3d_TextureNew [wintex o]; set m3dnotexture = _CRcheck _channel child 5 170 w-140 20 CH_LEFT plugloc "M3D_TEXTURENO"; _CBcheck m3dnotexture @m3d_TextureNo [wintex o]; // Infos texture set m3d_InfosSize = _CRtext _channel child 5 80 w-140 40 0 nil; set m3d_InfoFile = _CRtext _channel child 5 125 w-140 40 0 nil; m3d_TextureNew nil [wintex o]; // Transparence _CRtext _channel child 5 190 w-10 20 0 plugloc "M3D_TRANSPARENCE"; set m3d_sliTransparence = _CRslider _channel child _GETdefaultFont 5 215 w-10 22 10 0.0 255.0 itof ftrans itof ftrans mkfun4 @m3d_TransparenceNew [wintex o] SLIDER_INTER_FIXED|SLIDER_BUTTON; _SETsliderBackColor m3d_sliTransparence 0xffffff; _SETsliderPrecisionStep m3d_sliTransparence 1.0; _SETsliderColor m3d_sliTransparence 0x00ff00; _SETsliderCursorColor m3d_sliTransparence 0xff0000; _SETsliderPrecisionMark m3d_sliTransparence 0; // m3d _CRtext _channel child 5 252 w-10 20 0 plugloc "M3D_M3D"; set m3dPathM3d = _CRtext _channel child 5 277 w-10 70 ET_DOWN|ET_DRAGDROP|ET_AHSCROLL pathM3d; _CBtextDropFile m3dPathM3d @m3d_PathM3dDragDrop o; // m3d name _CRtext _channel child 5 352 w-10 20 0 plugloc "M3D_M3DNAME"; set m3dNameM3d = _CRcombo _channel child 5 377 w-10 60 CB_DOWN|CB_NOEDIT nameM3d; addNameM3dInCombo strextr _getpack _checkpack pathM3d m3dNameM3d; _SSELcombo m3dNameM3d nameM3d; _CBcombo m3dNameM3d @m3d_NameM3d o; // Avatars set m3d_cAv = _CRcheck _channel child 5 412 w-10 20 CH_LEFT plugloc "M3D_AV"; _SETcheck m3d_cAv fAv; _CBcheck m3d_cAv @m3d_fAv o; _CRtext _channel child 5 437 w-145 20 0 plugloc "M3D_AVPOS"; let fAvPos -> [x y z] in ( set m3d_posAvX = _CBtext _ENtext _CReditLine _channel child w-135 437 40 20 ET_DOWN itoa x fAv @m3d_avPos [o 1]; set m3d_posAvY = _CBtext _ENtext _CReditLine _channel child w-90 437 40 20 ET_DOWN itoa y fAv @m3d_avPos [o 2]; set m3d_posAvZ = _CBtext _ENtext _CReditLine _channel child w-45 437 40 20 ET_DOWN itoa z fAv @m3d_avPos [o 3] ); 0 );; /* OTHERS */ // Suppression des particules fun plugin_suppr(obj, o)= UsendMessage ObUi o "plugin_stop" nil;; // fermeture de l'aide fun help_end(obj, u)= set winHelp = nil;; // Création de l'aide : fun [ObjButton [ObjWin H3d]] ObjText fun plugin_help(obj, u)= let u -> [win h] in if winHelp == nil then ( set winHelp = _CRwindow _channel win 0 0 400 400 WN_MENU|WN_MINBOX|WN_NOSCOL " HELP !"; _CBwinDestroy winHelp @help_end 0; _CRtext _channel winHelp 5 5 390 390 ET_VSCROLL plughelp M3objName session h ) else nil;; /* MAIN */ fun win_paint(obj, u)= _PAINTrectangle obj 155 30 20 20 DRAW_SOLID 1 0 DRAW_SOLID colorInitClick;; fun win_end(obj, u)= set editok = 0; set winOpened = 0;; // création de la fenêtre d'édition en ligne // fun [ObjWin H3d HMat3d S Ob] I fun dynamicedit(win, obj, mat, param, o)= if obj == nil || winOpened then nil else let _GETwindowSizePosition win -> [_ _ x y] in let [500 785] -> [w h] in let if win == nil then _CRwindow _channel DMSwin 0 0 w h WN_MENU strcat plugloc "TITLE" M3objName session obj else win -> win in ( // misc. _SIZEwindow win w h x y; _CLRwindow win; _CBwinPaint win @win_paint 0; _CBwinDestroy win @win_end 0; set bmpcolor = _LDbitmap _channel _checkpack "dms/3d/plugins/dynparticles/_colormap.bmp"; set font = _CRfont _channel 14 0 0 "Arial"; let get_rgba initColor -> [r g b _] in set colorInitClick = make_rgb r g b; // _CRtext _channel win 5 5 w-10 20 ET_BORDER strcat plugloc "TITLE" M3objName session obj; // Couleurs _CRtext _channel win 5 5 w-10 20 ET_BORDER plugloc "TITLE_COLOR"; _CRtext _channel win 5 30 145 20 0 plugloc "TITLE_COLOR_INIT"; set winColor = _CRwindow _channel win 5 55 170 78 WN_CHILDINSIDE|WN_NOCAPTION nil; _CBwinPaint winColor @color_winPaint 0; _CBwinDestroy winColor @color_winEnd 0; _CBwinClick winColor @color_winClick [win o]; _CRtext _channel win (w/2)+5 30 (w/2)-40 20 0 plugloc "TITLE_COLOR_ALPHA"; let get_rgba initColor -> [_ _ _ a] in let (itof a) /. 1.27 -> a in ( set txtAlphaValue = _CRtext _channel win w-30 30 25 20 ET_ALIGN_RIGHT ftoa1d a; set sliColorAlpha = _CRslider _channel win _GETdefaultFont (w/2)+5 55 (w/2)-10 20 10 0.0 100.0 a a mkfun4 @color_alphaClick o SLIDER_INTER_FIXED|SLIDER_BUTTON; ); _SETsliderBackColor sliColorAlpha 0xffffff; _SETsliderPrecisionStep sliColorAlpha 1.0; _SETsliderColor sliColorAlpha 0x00ff00; _SETsliderCursorColor sliColorAlpha 0xff0000; _SETsliderPrecisionMark sliColorAlpha 0; set cColorCycle = _CRcheck _channel win (w/2)+5 90 (w/2)-10 20 CH_LEFT plugloc "TITLE_COLOR_CYCLE"; _SETcheck cColorCycle colorCycle; _CBcheck cColorCycle @color_cycleColor o; _CRtext _channel win (w/2)+5 110 (w/2)-10 25 0 plugloc "TITLE_COLOR_CYCLEMSG"; // Tailles _CRtext _channel win 5 140 w-10 20 ET_BORDER plugloc "TITLE_SIZE"; _CRtext _channel win 5 165 (w/2)-55 20 0 plugloc "TITLE_SIZE_MAX"; set txtSizeMax = _CReditLine _channel win (w/2)-45 165 40 20 ET_DOWN itoa maxSize; _CBtext txtSizeMax @size_sizeMax o; set cSizeConst = _CRcheck _channel win (w/2)+5 165 (w/2)-10 20 CH_LEFT plugloc "TITLE_SIZE_CONST"; _SETcheck cSizeConst sizeCycle; _CBcheck cSizeConst @size_sizeConst 0; set listSizes = set listSizesOld = initSize; set winSize = _CRwindow _channel win 5 190 w-10 145 WN_CHILDINSIDE|WN_NOCAPTION|WN_DOWN nil; _ENwindow winSize _GETcheck cSizeConst; _CBwinPaint winSize @size_winPaint 0; _CBwinClick winSize @size_winClick o; size_winCrAxes; // Paramètres avancés _CRtext _channel win 5 340 w-10 20 ET_BORDER plugloc "TITLE_EXPERT"; // PCL_INFINIT _CRtext _channel win 5 365 w-60 20 0 plugloc "EXPERT_INFINIT"; set txtExpertInfinit = _CReditLine _channel win w-50 365 45 20 ET_DOWN|ET_ALIGN_RIGHT|ET_NUMBER ftoa1d life; _CBtext txtExpertInfinit @expert_infinit o; // VOLUME _CRtext _channel win 5 390 w-120 20 0 plugloc "EXPERT_VOLUME"; set cmExpertVolume = _CRcombo _channel win w-110 390 105 90 CB_NOEDIT|ET_ALIGN_RIGHT nil; _ADDcombo cmExpertVolume 0 plugloc "EXPERT_VOLUME_CONE"; _ADDcombo cmExpertVolume 1 plugloc "EXPERT_VOLUME_SPHERE"; _ADDcombo cmExpertVolume 2 plugloc "EXPERT_VOLUME_PLAN"; _ADDcombo cmExpertVolume 3 plugloc "EXPERT_VOLUME_LINE"; _SELcombo cmExpertVolume typeVolEmitter - 1; _CBcombo cmExpertVolume @expert_volumeChoice o; // VOLUME SPHERE set txtExpertVolumeSphereRadiusMsg = _CRtext _channel win 5 415 w-120 20 0 plugloc "EXPERT_VOLUME_SPHERE_RADIUS"; let vectorVolA -> [a b c] in set txtExpertVolumeSphereRadius = _CReditLine _channel win w-110 415 105 20 ET_DOWN|ET_ALIGN_RIGHT|ET_NUMBER ftoa1d a; _CBtext txtExpertVolumeSphereRadius @expert_volumeSphereRadius o; // VOLUME CÔNE set txtExpertVolumeConeMsg = _CRtext _channel win 5 415 w-120 40 0 plugloc "EXPERT_VOLUME_CONE_DIMENSIONS"; let vectorVolA -> [a b c] in ( set txtExpertVolumeConeLong = _CReditLine _channel win w-110 415 105 20 ET_DOWN|ET_ALIGN_RIGHT|ET_NUMBER ftoa1d a; set txtExpertVolumeConeLarg = _CReditLine _channel win w-110 440 105 20 ET_DOWN|ET_ALIGN_RIGHT|ET_NUMBER ftoa1d b; set txtExpertVolumeConeHaut = _CReditLine _channel win w-110 465 105 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; ); _CBtext txtExpertVolumeConeLong @expert_volumeCone [o 1]; _CBtext txtExpertVolumeConeLarg @expert_volumeCone [o 2]; _CBtext txtExpertVolumeConeHaut @expert_volumeCone [o 3]; _SHOWtext txtExpertVolumeConeMsg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeConeLong WINDOW_HIDDEN; _SHOWtext txtExpertVolumeConeLarg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeConeHaut WINDOW_HIDDEN; // VOLUME PLAN set txtExpertVolumePlanMsg = _CRtext _channel win 5 415 w-120 40 0 plugloc "EXPERT_VOLUME_PLAN_DIMENSIONS"; let vectorVolA -> [a b c] in ( set txtExpertVolumePlanLong = _CReditLine _channel win w-110 415 105 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertVolumePlanLarg = _CReditLine _channel win w-110 440 105 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; ); _CBtext txtExpertVolumePlanLong @expert_volumePlan [o 1]; _CBtext txtExpertVolumePlanLarg @expert_volumePlan [o 2]; _SHOWtext txtExpertVolumePlanMsg WINDOW_HIDDEN; _SHOWtext txtExpertVolumePlanLong WINDOW_HIDDEN; _SHOWtext txtExpertVolumePlanLarg WINDOW_HIDDEN; // VOLUME LIGNE set txtExpertVolumeLineMsg = _CRtext _channel win 5 415 w-120 20 0 plugloc "EXPERT_VOLUME_LINE_DIMENSIONS"; let vectorVolA -> [a b c] in set txtExpertVolumeLineLong = _CReditLine _channel win w-110 415 105 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; _CBtext txtExpertVolumeLineLong @expert_volumeLine o; _SHOWtext txtExpertVolumeLineMsg WINDOW_HIDDEN; _SHOWtext txtExpertVolumeLineLong WINDOW_HIDDEN; // EFFETS _CRtext _channel win 5 490 w-120 20 0 plugloc "EXPERT_EFFECT"; set cmExpertEffect = _CRcombo _channel win w-110 490 105 130 CB_NOEDIT|ET_ALIGN_RIGHT nil; _ADDcombo cmExpertEffect 0 plugloc "EXPERT_EFFECT_NONE"; _ADDcombo cmExpertEffect 1 plugloc "EXPERT_EFFECT_CONSTANT"; _ADDcombo cmExpertEffect 2 plugloc "EXPERT_EFFECT_ELECTRIC"; _ADDcombo cmExpertEffect 3 plugloc "EXPERT_EFFECT_MAGNETIC"; _ADDcombo cmExpertEffect 4 plugloc "EXPERT_EFFECT_HELICOID"; _ADDcombo cmExpertEffect 5 plugloc "EXPERT_EFFECT_CHAOTIC0"; _ADDcombo cmExpertEffect 6 plugloc "EXPERT_EFFECT_PLANCOLL"; _ADDcombo cmExpertEffect 7 plugloc "EXPERT_EFFECT_CHAOTIC1"; _SELcombo cmExpertEffect typeFX; _CBcombo cmExpertEffect @expert_effectChoice o; // EFFET CONSTANT set txtExpertEffectConstantMsg = _CRtext _channel win 5 515 w-10 20 0 plugloc "EXPERT_EFECT_CONSTANT_MSG"; let vectorFxA -> [a b c] in ( set txtExpertEffectConstantX = _CReditLine _channel win w-295 540 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertEffectConstantY = _CReditLine _channel win w-195 540 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; set txtExpertEffectConstantZ = _CReditLine _channel win w-95 540 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; ); _CBtext txtExpertEffectConstantX @expert_effectConstant o; _CBtext txtExpertEffectConstantY @expert_effectConstant o; _CBtext txtExpertEffectConstantZ @expert_effectConstant o; // EFFET ELECTRIQUE set txtExpertEffectElectricMsg = _CRtext _channel win 5 515 w-10 40 0 plugloc "EXPERT_EFECT_ELECTRIC_MSG"; let vectorFxA -> [a b c] in let vectorFxB -> [d e f] in ( set txtExpertEffectElectricAX = _CReditLine _channel win w-295 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertEffectElectricAY = _CReditLine _channel win w-195 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; set txtExpertEffectElectricAZ = _CReditLine _channel win w-95 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; set txtExpertEffectElectricBX = _CReditLine _channel win w-95 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d d; ); _CBtext txtExpertEffectElectricAX @expert_effectElectric o; _CBtext txtExpertEffectElectricAY @expert_effectElectric o; _CBtext txtExpertEffectElectricAZ @expert_effectElectric o; _CBtext txtExpertEffectElectricBX @expert_effectElectric o; _SHOWtext txtExpertEffectElectricMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectElectricBX WINDOW_HIDDEN; // EFFET MAGNETIQUE set txtExpertEffectMagneticMsg = _CRtext _channel win 5 515 w-10 40 0 plugloc "EXPERT_EFECT_MAGNETIC_MSG"; let vectorFxA -> [a b c] in let vectorFxB -> [d e f] in ( set txtExpertEffectMagneticAX = _CReditLine _channel win w-295 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertEffectMagneticAY = _CReditLine _channel win w-195 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; set txtExpertEffectMagneticAZ = _CReditLine _channel win w-95 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; set txtExpertEffectMagneticBX = _CReditLine _channel win w-95 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d d; ); _CBtext txtExpertEffectMagneticAX @expert_effectMagnetic o; _CBtext txtExpertEffectMagneticAY @expert_effectMagnetic o; _CBtext txtExpertEffectMagneticAZ @expert_effectMagnetic o; _CBtext txtExpertEffectMagneticBX @expert_effectMagnetic o; _SHOWtext txtExpertEffectMagneticMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectMagneticBX WINDOW_HIDDEN; // EFFET CHAOTIQUE 0 set txtExpertEffectChaotic0Msg = _CRtext _channel win 5 515 w-10 40 0 plugloc "EXPERT_EFECT_CHAOTIC0_MSG"; let vectorFxA -> [a b c] in let vectorFxB -> [d e f] in ( set txtExpertEffectChaotic0AX = _CReditLine _channel win w-295 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertEffectChaotic0AY = _CReditLine _channel win w-195 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; set txtExpertEffectChaotic0AZ = _CReditLine _channel win w-95 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; set txtExpertEffectChaotic0BX = _CReditLine _channel win w-295 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d d; set txtExpertEffectChaotic0BY = _CReditLine _channel win w-195 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d e; set txtExpertEffectChaotic0BZ = _CReditLine _channel win w-95 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d f; ); _CBtext txtExpertEffectChaotic0AX @expert_effectChaotic0 o; _CBtext txtExpertEffectChaotic0AY @expert_effectChaotic0 o; _CBtext txtExpertEffectChaotic0AZ @expert_effectChaotic0 o; _CBtext txtExpertEffectChaotic0BX @expert_effectChaotic0 o; _CBtext txtExpertEffectChaotic0BY @expert_effectChaotic0 o; _CBtext txtExpertEffectChaotic0BZ @expert_effectChaotic0 o; _SHOWtext txtExpertEffectChaotic0Msg WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0AX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0AY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0AZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0BX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0BY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic0BZ WINDOW_HIDDEN; // EFFET CHAOTIQUE 1 set txtExpertEffectChaotic1Msg = _CRtext _channel win 5 515 w-10 40 0 plugloc "EXPERT_EFECT_CHAOTIC1_MSG"; let vectorFxA -> [a b c] in let vectorFxB -> [d e f] in ( set txtExpertEffectChaotic1AX = _CReditLine _channel win w-295 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertEffectChaotic1AY = _CReditLine _channel win w-195 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; set txtExpertEffectChaotic1AZ = _CReditLine _channel win w-95 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; set txtExpertEffectChaotic1BX = _CReditLine _channel win w-295 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d d; set txtExpertEffectChaotic1BY = _CReditLine _channel win w-195 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d e; set txtExpertEffectChaotic1BZ = _CReditLine _channel win w-95 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d f; ); _CBtext txtExpertEffectChaotic1AX @expert_effectChaotic1 o; _CBtext txtExpertEffectChaotic1AY @expert_effectChaotic1 o; _CBtext txtExpertEffectChaotic1AZ @expert_effectChaotic1 o; _CBtext txtExpertEffectChaotic1BX @expert_effectChaotic1 o; _CBtext txtExpertEffectChaotic1BY @expert_effectChaotic1 o; _CBtext txtExpertEffectChaotic1BZ @expert_effectChaotic1 o; _SHOWtext txtExpertEffectChaotic1Msg WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1AX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1AY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1AZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1BX WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1BY WINDOW_HIDDEN; _SHOWtext txtExpertEffectChaotic1BZ WINDOW_HIDDEN; // EFFET HELICOÏDAL set txtExpertEffectHelicoidMsg = _CRtext _channel win 5 515 w-10 40 0 plugloc "EXPERT_EFECT_HELICOID_MSG"; let vectorFxA -> [a b c] in let vectorFxB -> [d e f] in ( set txtExpertEffectHelicoidAX = _CReditLine _channel win w-295 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertEffectHelicoidAY = _CReditLine _channel win w-195 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; set txtExpertEffectHelicoidAZ = _CReditLine _channel win w-95 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; set txtExpertEffectHelicoidBX = _CReditLine _channel win w-295 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d d; set txtExpertEffectHelicoidBY = _CReditLine _channel win w-195 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d e; set txtExpertEffectHelicoidBZ = _CReditLine _channel win w-95 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d f; ); _CBtext txtExpertEffectHelicoidAX @expert_effectHelicoid o; _CBtext txtExpertEffectHelicoidAY @expert_effectHelicoid o; _CBtext txtExpertEffectHelicoidAZ @expert_effectHelicoid o; _CBtext txtExpertEffectHelicoidBX @expert_effectHelicoid o; _CBtext txtExpertEffectHelicoidBY @expert_effectHelicoid o; _CBtext txtExpertEffectHelicoidBZ @expert_effectHelicoid o; _SHOWtext txtExpertEffectHelicoidMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidBX WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidBY WINDOW_HIDDEN; _SHOWtext txtExpertEffectHelicoidBZ WINDOW_HIDDEN; // EFFET PLANCOLL set txtExpertEffectPlancollMsg = _CRtext _channel win 5 515 w-10 40 0 plugloc "EXPERT_EFECT_PLANCOLL_MSG"; let vectorFxA -> [a b c] in let vectorFxB -> [d e f] in ( set txtExpertEffectPlancollAX = _CReditLine _channel win w-295 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d a; set txtExpertEffectPlancollAY = _CReditLine _channel win w-195 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d b; set txtExpertEffectPlancollAZ = _CReditLine _channel win w-95 560 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d c; set txtExpertEffectPlancollBX = _CReditLine _channel win w-295 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d d; set txtExpertEffectPlancollBY = _CReditLine _channel win w-195 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d e; set txtExpertEffectPlancollBZ = _CReditLine _channel win w-95 585 90 20 ET_DOWN|ET_ALIGN_RIGHT ftoa1d f; ); _CBtext txtExpertEffectPlancollAX @expert_effectPlancoll o; _CBtext txtExpertEffectPlancollAY @expert_effectPlancoll o; _CBtext txtExpertEffectPlancollAZ @expert_effectPlancoll o; _CBtext txtExpertEffectPlancollBX @expert_effectPlancoll o; _CBtext txtExpertEffectPlancollBY @expert_effectPlancoll o; _CBtext txtExpertEffectPlancollBZ @expert_effectPlancoll o; _SHOWtext txtExpertEffectPlancollMsg WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollAX WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollAY WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollAZ WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollBX WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollBY WINDOW_HIDDEN; _SHOWtext txtExpertEffectPlancollBZ WINDOW_HIDDEN; // PCL_BILLBOARD & PCL_RAINBOW set cExpertBillboard = _CRcheck _channel win 5 610 w-10 20 CH_LEFT plugloc "EXPERT_BILLBOARD"; _CBcheck cExpertBillboard @expert_billboard o; set cExpertRainbow = _CRcheck _channel win 5 635 w-10 20 CH_LEFT plugloc "EXPERT_RAINBOW"; _CBcheck cExpertRainbow @expert_rainbow o; // MASSE _CRtext _channel win 5 660 w-60 20 0 plugloc "EXPERT_MASSE"; set txtExpertMasse = _CReditLine _channel win w-50 660 45 20 ET_DOWN|ET_ALIGN_RIGHT|ET_NUMBER ftoa1d masse; _CBtext txtExpertMasse @expert_masse o; // Nombre de particules émises toutes les 100 frames ? _CRtext _channel win 5 685 w-60 20 0 plugloc "EXPERT_FRAMERATE"; set cTxtRate = _CReditLine _channel win w-50 685 45 20 ET_DOWN|ET_ALIGN_RIGHT|ET_NUMBER ftoa1d framerate; _CBtext cTxtRate @expert_framerate o; // Affecter à tous les clients enregistrés ? set cExpertAllClients = _CRcheck _channel win 5 710 w-10 20 CH_LEFT plugloc "EXPERT_ALLCLIENTS"; _CBcheck cExpertAllClients @expert_allClients o; // Sauvegarde sur le serveur ? set cExpertUploadSrv = _CRcheck _channel win 5 735 w-10 20 CH_LEFT plugloc "EXPERT_UPLOADSRV"; _CBcheck cExpertUploadSrv @expert_uploadSrv o; // BTN SUPPRIMER & HELP _CBbutton _CRbutton _channel win 5 760 (w/3)-10 20 0 plugloc "HELP" @plugin_help [win Objs]; _CBbutton _CRbutton _channel win (w/3)+5 760 (w/3)-10 20 0 plugloc "BTN_M3DTEX" @plugin_m3d [win o]; _CBbutton _CRbutton _channel win (2*(w/3))+5 760 (w/3)-10 20 0 plugloc "SUPPR" @plugin_suppr o; set winOpened = 1; set editok = 1; win_paint win nil; 0 );; // Enregistrement de la configuration via le plugin Dynamic Editor fun closeedit() = let itoh colorInitClick -> hexcol in let htoi substr hexcol 0 2 -> r in let htoi substr hexcol 2 4 -> g in let htoi substr hexcol 4 6 -> b in let ftoi _GETsliderLeft sliColorAlpha -> alphaInit in let make_rgba r g b alphaInit -> col in let _GETcombo cmExpertEffect -> [ifx fx] in let _GETcombo cmExpertVolume -> [ivol vol] in let itoa _GETcheck cExpertBillboard -> billboard in let itoa _GETcheck cExpertRainbow -> rainbow in let if ivol == 0 then (_GETtext txtExpertVolumeConeLong) :: (_GETtext txtExpertVolumeConeLarg) :: (_GETtext txtExpertVolumeConeHaut) :: nil else if ivol == 1 then (_GETtext txtExpertVolumeSphereRadius) :: "0" :: "0" :: nil else if ivol == 2 then (_GETtext txtExpertVolumePlanLong) :: (_GETtext txtExpertVolumePlanLarg) :: "0" :: nil else if ivol == 3 then (_GETtext txtExpertVolumeLineLong) :: "0" :: "0" :: nil else nil -> vectorA in let if ifx == 0 then "0" :: "0" :: "0" :: nil else if ifx == 1 then (_GETtext txtExpertEffectConstantX) :: (_GETtext txtExpertEffectConstantY) :: (_GETtext txtExpertEffectConstantZ) :: nil else if ifx == 2 then (_GETtext txtExpertEffectElectricAX) :: (_GETtext txtExpertEffectElectricAY) :: (_GETtext txtExpertEffectElectricAZ) :: nil else if ifx == 3 then (_GETtext txtExpertEffectMagneticAX) :: (_GETtext txtExpertEffectMagneticAY) :: (_GETtext txtExpertEffectMagneticAZ) :: nil else if ifx == 4 then (_GETtext txtExpertEffectHelicoidAX) :: (_GETtext txtExpertEffectHelicoidAY) :: (_GETtext txtExpertEffectHelicoidAZ) :: nil else if ifx == 5 then (_GETtext txtExpertEffectChaotic0AX) :: (_GETtext txtExpertEffectChaotic0AY) :: (_GETtext txtExpertEffectChaotic0AZ) :: nil else if ifx == 6 then (_GETtext txtExpertEffectPlancollAX) :: (_GETtext txtExpertEffectPlancollAY) :: (_GETtext txtExpertEffectPlancollAZ) :: nil else if ifx == 7 then (_GETtext txtExpertEffectChaotic1AX) :: (_GETtext txtExpertEffectChaotic1AY) :: (_GETtext txtExpertEffectChaotic1AZ) :: nil else "0" :: "0" :: "0" :: nil -> vectorFxA in let if ifx == 0 then "0" :: "0" :: "0" :: nil else if ifx == 1 then "0" :: "0" :: "0" :: nil else if ifx == 2 then (_GETtext txtExpertEffectElectricBX) :: "0" :: "0" :: nil else if ifx == 3 then (_GETtext txtExpertEffectMagneticBX) :: "0" :: "0" :: nil else if ifx == 4 then (_GETtext txtExpertEffectHelicoidBX) :: (_GETtext txtExpertEffectHelicoidBY) :: (_GETtext txtExpertEffectHelicoidBZ) :: nil else if ifx == 5 then (_GETtext txtExpertEffectChaotic0BX) :: (_GETtext txtExpertEffectChaotic0BY) :: (_GETtext txtExpertEffectChaotic0BZ) :: nil else if ifx == 6 then (_GETtext txtExpertEffectPlancollBX) :: (_GETtext txtExpertEffectPlancollBY) :: (_GETtext txtExpertEffectPlancollBZ) :: nil else if ifx == 7 then (_GETtext txtExpertEffectChaotic1BX) :: (_GETtext txtExpertEffectChaotic1BY) :: (_GETtext txtExpertEffectChaotic1BZ) :: nil else "0" :: "0" :: "0" :: nil -> vectorFxB in let "0" :: "0" :: "0" :: nil -> vectorFxC in let (_GETtext m3d_posAvX) :: (_GETtext m3d_posAvY) :: (_GETtext m3d_posAvZ) :: nil -> posAv in strbuild ( "init" :: ( if initON then "on" else "off" )::nil):: ( "initColor" :: (itoh col)::nil):: ( "initSizes" :: ( getSizes listSizes nil ) :: nil ):: ( "maxSize" :: (_GETtext txtSizeMax)::nil):: ( "colorCycle" :: ( let _GETcheck cColorCycle -> x in if x then "on" else "off" )::nil):: ( "sizeCycle" :: ( let _GETcheck cSizeConst -> x in if x then "on" else "off" )::nil):: ( "typeFX" :: fx :: nil):: ( "typeVolEmitter" :: vol :: nil):: ( "life" :: ( _GETtext txtExpertInfinit ) :: nil):: ( "typeParticle" :: billboard :: rainbow ::nil):: ( "vectorA" :: vectorA ):: ( "vectorB" :: "0":: "0" :: "0" :: nil ):: ( "vectorFxA" :: vectorFxA ) :: ( "vectorFxB" :: vectorFxB ) :: ( "vectorFxC" :: vectorFxC ) :: ( "mass" :: ( _GETtext txtExpertMasse ) :: nil ) :: ( "framerate" :: ( _GETtext cTxtRate ) :: nil ) :: ( "target" :: ( itoa _GETcheck cExpertBillboard ) :: nil ) :: ( "rainbow" :: ( itoa _GETcheck cExpertRainbow ) :: nil ) :: ( "png" :: ( _GETtext m3dPathTexture ) :: nil ) :: ( "ftrans" :: ( ftoa _GETsliderLeft sliColorAlpha ) :: nil ) :: ( "m3d" :: ( _GETtext m3dPathM3d ) :: nil ) :: ( "fm3dname" :: ( let _GETcombo m3dNameM3d -> [_ s] in s ) :: nil ) :: ( "m3d_fAv" :: ( itoa _GETcheck m3d_cAv ) :: nil ) :: ( "m3d_fAvPos" :: posAv ) :: nil;; // Edition via le plugin Dynamic Editor fun dynEdit(win, obj, mat, param)= dynamicedit win obj mat param nil; @closeedit;;