/* av3d browser - by Sebastien DENEUX - January 00 */ /* rev - September 2001 - by sebastien DENEUX */ /* TODO effectuer un redimensionnement d'image en 128*128 lors du choix d'une image par l'utilisateur*/ /* av3d : v4.0 by jmp (http://www.i-maginer.fr) */ /* update jan 07 by iri (http://www.i-maginer.fr) - optimisations lors de la création de l'interface (au niveau de l'affichage pour l'user) - le visage initial est désormais affiché normalement sur l'interface lorsque l'user choisit de modifier cette texture - ajout des types d'avatars suivant cette arborescence: - avatars - typem - default - bottom (textures) - face (textures) - m3d (avatars) - ... (avatars) - sport - bottom (textures) - face (textures) - m3d (avatars) - ... - business - bottom (textures) - face (textures) - m3d (avatars) - ... - ... - typef - default - bottom (textures) - face (textures) - m3d (avatars) - ... - sport - bottom (textures) - face (textures) - m3d (avatars) - ... - cool - bottom (textures) - face (textures) - m3d (avatars) - ... - ... => intégration au niveau de l'interface et gestion des choix de l'utilisateur le type m ou f est défini au niveau du profil utilisateur stocké en ressource scol (' DefaultGender ') - correction de l'affectation des paths aux variables ' hair ', ' shoes ', etc - lecture du fichier de conf à chaque ouverture du brower pour récupérer la dernière configuration validée par l'utilisateur - ajout de toute la partie ' WEBCAM ' - ajout du screenshot de la cabine - ajout de toute la partie ' COLOR ' - corrections diverses et mineures sur les callbacks des boutons de l'interface - ajout de toute la partie ' SATURATION ' + attention : la partie COLOR reste mais n'est plus utilisée. Deplus, les éléments graphiques et les callbacks associés sont mises en commentaires. Pour la remettre, décommentez-les. Notez que les deux parties ( ' COLOR' et ' SATURATION ' ) ne doivent pas être actives simultanément. */ /* avatar view zone*/ typeof cameraAvatarView = H3d;; typeof CabineObj = H3d;; typeof avatarViewObj = H3d;; typeof sessionAvatarView = S3d;; typeof shellAvatarView = H3d;; typeof bufferAvatarView = ObjSurface;; typeof winAvatarView_w = I;; typeof winAvatarView_h = I;; var renduONOFF = 1;; // ::::: iri rendu activé (1) ou désactivé (0) typeof chgphoButton = ObjButton;; typeof checkTrans = ObjCheck;; typeof AvatarsList=[S r1];;/*list of the avatars for the browser*/ typeof HairList=[S r1];;/*list of the avatars for the browser*/ typeof FaceList=[S r1];;/*list of the avatars for the browser*/ typeof TopList=[S r1];;/*list of the avatars for the browser*/ typeof BottomList=[S r1];;/*list of the avatars for the browser*/ typeof ShoesList=[S r1];;/*list of the avatars for the browser*/ // :: interface centrale :: typeof previous = ObjButton;; typeof text = ObjText;; typeof next = ObjButton;; typeof winAvatar = ObjWin;; typeof ok = ObjButton;; typeof cancel = ObjButton;; typeof btnWebcamOk = ObjButton;; // ::::: iri typeof btnWebcamOkTimer = ObjButton;; // ::::: iri typeof btnReset = ObjButton;; // ::::: iri reinitialise l'orientation de la cabine et de l'avatar typeof btnSShot = ObjButton;; // ::::: iri prend un screenshot de la cabine // ::interface de gauche :: typeof currentcam = I;; typeof boxComboMaterial = ObjBox;; typeof boxComboTypeAv = ObjBox;; // :::: iri sous-types d'avatar : business, sport, cool, ... typeof textconf = ObjText;; typeof nextconf = ObjButton;; typeof previousconf = ObjButton;; typeof zoomplus = ObjButton;; typeof zoommoins = ObjButton;; typeof winPhoto = ObjWin;; typeof helpconf = ObjText;; typeof btnPhotomaton = ObjButton;; // ::::: iri bouton pour le photomaton typeof txtColor = ObjText;; // ::::: iri texte "colorimétrie" typeof txtColor2 = ObjText;; // ::::: iri texte "colorimétrie" typeof txtColor3 = ObjText;; // ::::: iri texte "colorimétrie" typeof winColor = ObjWin;; // ::::: iri fenêtre de la map de couleur typeof btnSupprColor = ObjButton;; // :::::: suppression d'un filtre de couleur typeof btnSetColor = ObjButton;; // :::: application d'un filtre de couleur typeof sliColor = ObjSlider;; // ::::: iri taux du filtre typeof txtSaturation = ObjText;; // ::::: iri texte "saturation" typeof txtSaturation2 = ObjText;; // ::::: iri texte "saturation" typeof txtSaturation3 = ObjText;; // ::::: iri texte "saturation" typeof btnSupprSaturation = ObjButton;; // :::::: suppression d'un filtre de saturation typeof btnSetSaturation = ObjButton;; // :::: application d'un filtre de saturation typeof sliSaturationTx = ObjSlider;; // ::::: iri taux du filtre de saturation typeof sliSaturationIntensity = ObjSlider;; // ::::: iri intensité du filtre de saturation proto SearchLastInfo= fun [S S I] S;; /* recherche la partie 3D sélectionnée */ // proto color_cbWinColorPaint = fun [ObjWin ObjBitmap] ObjWin;; proto color_cbWinColorPaintPrepare = fun [I] ObjWin;; proto filtre_prepare = fun [I] I;; defcom CnewSStype = newSStype S;; typeof PoXcam=I;; typeof PosYcam=I;; typeof PosZcam=I;; // Default values var iDefCombo = 0;; // Value de la combobox au premier choix var PoXcam = 400;; /* Position X de la caméra */ var PoYcam = 100;; /* Position Y de la caméra */ var PoZcam = -200;; /* Position Z de la caméra */ /* ***************************************************************************** Structure Windows ******************************************************************************/ struct SWindow = [ ClickX : I, /* PositionX click */ ClickY : I /* PositionY click */ ] mkClickWindow;; typeof ClickWindow = SWindow;; /* --------------*/ // photo de l'avatar fun cbPaintE2(wn,b)= _BLTbitmap wn bufPhoto 0 0;; fun cbdestroy(z)= let z -> [sessionAvInterfView _ _ _ CabineObj LightObj bufferAvInterfView] in ( // :: destruction interface centrale :: _DSbutton previous; _DStext text; _DSbutton next; _DSwindow winAvatar; _DSbutton ok; _DSbutton cancel; // :: destruction interface de gauche :: _DScombo boxComboMaterial; _DStext textconf; _DSbutton nextconf; _DSbutton previousconf; _DSbutton zoomplus; _DSbutton zoommoins; _DScheck checkTrans; _DSwindow winPhoto; _DSbutton chgphoButton; _DStext helpconf; _DSbitmap bufPhoto; _DSsurface bufferAvInterfView; M3reset sessionAvInterfView; M3reset sessionAvatarView; M3destroy sessionAvInterfView; M3destroy sessionAvatarView; _DSwindow winInterface ); set winAvatarView_w=nil; set winAvatarView_h=nil; set boxComboMaterial=nil; set currentcam=nil; set winInterface=nil; set iDefCombo=nil; set PoXcam = nil; set PoYcam = nil; set PoZcam = nil; _DMSevent this "Hidden" nil nil ;; /*--------------*/ fun cbOk(x,b)= let b -> [trans z] in let z -> [sessionAvInterfView _ _ _ CabineObj LightObj bufferAvInterfView] in // let _GETcheck trans -> f in ( // :: destruction des objets :: cbdestroy z; mutate z <- [_ _ _ _ _ _ _]; _DMSevent this "Hidden" nil nil; // _DLGMessageBox _channel nil "position ds la liste :" itoa currentAvListPos 0; if currentAvListPos==-1 then set avfile=avDefaultFile else if currentAvListPos==-2 then nil else set avfile=nth_list AvatarsList currentAvListPos; set avpos=currentAvListPos; // :: envoi au serveur le nouvel avatar choisi :: updateAvatar flag; );; /* --------------*/ fun cbCancel(wn,z)= let z -> [sessionAvInterfView _ _ _ CabineObj LightObj bufferAvInterfView] in // :: destruction des objets :: cbdestroy z; mutate z <- [_ _ _ _ _ _ _]; 0;; /* ::::: iri Réinitialise l'orientation de l'avatar et de la cabine s3d -> S3d : session courante h -> H3d : avatar <- I */ fun resetAngCabav(s3d, h)= M3setObjAng s3d h [32796 65535 0]; M3setObjAng s3d CabineObj [0 16383 65535];; /* :: Call Back previous choix cheveux*/ fun cbPreviousHairs(previousBT,b)= let b -> [trans nextBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist HairList)-> size in let if (currentHairListPos==-1)&& size!=0 then nil else if currentHairListPos>=1 then currentHairListPos-1 else -1 -> newPos in let if newPos==-1 then ( _ENbutton nextBT 1; _ENbutton previousBT 0;nil) else nth_list HairList newPos -> HairsFileName in if HairsFileName == nil then // ::::: iri ajout du test 0 else ( set hair=HairsFileName; set currentHairListPos=newPos; _ENbutton nextBT 1; set meshDownloading=1; _SHOWbutton previousBT WINDOW_HIDDEN; downloadMaterial HairsFileName "hair" [trans nextBT previousBT z]; 0 );; /* :: Call Back NEXT choix cheveux*/ fun cbNextHairs(nextBT,b)= let b -> [trans previousBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist HairList) -> size in let if (currentHairListPos==size)&& size!=0 then nil else if currentHairListPos>=1 then currentHairListPos+1 else 1 -> newPos in let if newPos==size then ( _ENbutton nextBT 0; _ENbutton previousBT 1;nil) else nth_list HairList newPos -> HairsFileName in if HairsFileName == nil then // ::::: iri ajout du test 0 else ( set hair=HairsFileName; set currentHairListPos=newPos; _ENbutton previousBT 1; set meshDownloading=1; _SHOWbutton nextBT WINDOW_HIDDEN; downloadMaterial HairsFileName "hair" [trans nextBT previousBT z]; 0 );; // *************************************************************************************************** /* :: Call Back previous choix visages ::*/ fun cbPreviousFaces(previousBT,b)= let b -> [trans nextBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist FaceList) -> size in let if (currentFaceListPos==-1)&& size!=0 then nil else if currentFaceListPos>=1 then currentFaceListPos-1 else -1 -> newPos in let if newPos==-1 then ( _ENbutton nextBT 1; _ENbutton previousBT 0;nil) else nth_list FaceList newPos -> FaceFileName in let _LDbitmap _channel _checkpack FaceFileName -> imagebmp in let if imagebmp==nil then _LDjpeg _channel _checkpack FaceFileName else imagebmp -> image in let _GETbitmapSize image -> [w h] in if FaceFileName == nil then // ::::: iri ajout du test 0 else (set photo= FaceFileName; set currentFaceListPos=newPos; _ENbutton nextBT 1; set meshDownloading=1; _SHOWbutton previousBT WINDOW_HIDDEN; downloadMaterial FaceFileName "photo" [trans nextBT previousBT z]; _SCPbitmap bufPhoto 0 0 63 63 image 0 0 w-1 h-1 nil; _DSbitmap image; 0 ); cbPaintE2 winPhoto bufPhoto;; /* :: Call Back Next choix visages ::*/ fun cbNextFaces(nextBT,b)= let b -> [trans previousBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist FaceList)-> size in let if (currentFaceListPos==size)&& size!=0 then nil else if currentFaceListPos>=1 then currentFaceListPos+1 else 1 -> newPos in let if newPos==size then ( _ENbutton nextBT 0; _ENbutton previousBT 1;nil) else nth_list FaceList newPos -> FaceFileName in let _LDbitmap _channel _checkpack FaceFileName -> imagebmp in let if imagebmp==nil then _LDjpeg _channel _checkpack FaceFileName else imagebmp -> image in let _GETbitmapSize image -> [w h] in if FaceFileName == nil then // ::::: iri ajout du test 0 else (set photo= FaceFileName; set currentFaceListPos=newPos; _ENbutton previousBT 1; set meshDownloading=1; _SHOWbutton nextBT WINDOW_HIDDEN; downloadMaterial FaceFileName "photo" [trans nextBT previousBT z]; _SCPbitmap bufPhoto 0 0 63 63 image 0 0 w-1 h-1 nil; _DSbitmap image; 0 ); cbPaintE2 winPhoto bufPhoto;; // *************************************************************************************************** /* :: Call Back previous choix vetements*/ fun cbPreviousClothesTop(previousBT,b)= let b -> [trans nextBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist TopList) -> size in let if (currentCloTopListPos==-1)&& size!=0 then nil else if currentCloTopListPos>=1 then currentCloTopListPos-1 else -1 -> newPos in let if newPos==-1 then ( _ENbutton nextBT 1; _ENbutton previousBT 0;nil) else nth_list TopList newPos -> ClothesTopFileName in if ClothesTopFileName == nil then // ::::: iri ajout du test 0 else ( set clothestop = ClothesTopFileName; // ::::: iri set currentCloTopListPos=newPos; _ENbutton nextBT 1; set meshDownloading=1; set clothestop=ClothesTopFileName; _SHOWbutton previousBT WINDOW_HIDDEN; downloadMaterial ClothesTopFileName "clothetop" [trans nextBT previousBT z]; 0 );; /* :: Call Back NEXT vetements*/ fun cbNextClothesTop(nextBT,b)= let b -> [trans previousBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist TopList) -> size in let if (currentCloTopListPos==size)&& size!=0 then nil else if currentCloTopListPos>=1 then currentCloTopListPos+1 else 1 -> newPos in let if newPos==size then ( _ENbutton nextBT 0; _ENbutton previousBT 1;nil) else nth_list TopList newPos -> ClothesTopFileName in if ClothesTopFileName == nil then // ::::: iri ajout du test 0 else ( set clothestop = ClothesTopFileName; // ::::: iri set currentCloTopListPos=newPos; _ENbutton previousBT 1; set meshDownloading=1; set clothestop=ClothesTopFileName; _SHOWbutton nextBT WINDOW_HIDDEN; downloadMaterial ClothesTopFileName "clothetop" [trans nextBT previousBT z]; 0 );; // *************************************************************************************************** /* :: Call Back previous choix vetements*/ fun cbPreviousClothes(previousBT,b)= let b -> [trans nextBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist BottomList) -> size in let if (currentCloListPos==-1)&& size!=0 then nil else if currentCloListPos>=1 then currentCloListPos-1 else -1 -> newPos in let if newPos==-1 then ( _ENbutton nextBT 1; _ENbutton previousBT 0;nil) else nth_list BottomList newPos -> ClothesFileName in if ClothesFileName == nil then // ::::: iri ajout du test 0 else ( set clothes = ClothesFileName; // ::::: iri set currentCloListPos=newPos; _ENbutton nextBT 1; set meshDownloading=1; set clothes=ClothesFileName; _SHOWbutton previousBT WINDOW_HIDDEN; downloadMaterial ClothesFileName "clothe" [trans nextBT previousBT z]; 0 );; /* :: Call Back previous choix vetements*/ fun cbNextClothes(nextBT,b)= let b -> [trans previousBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist BottomList) -> size in let if (currentCloListPos==size)&& size!=0 then nil else if currentCloListPos>=1 then currentCloListPos+1 else 1 -> newPos in let if newPos==size then ( _ENbutton nextBT 0; _ENbutton previousBT 1;nil) else nth_list BottomList newPos -> ClothesFileName in if ClothesFileName == nil then // ::::: iri ajout du test 0 else ( set clothes = ClothesFileName; // ::::: iri set currentCloListPos=newPos; _ENbutton previousBT 1; set meshDownloading=1; set clothes=ClothesFileName; _SHOWbutton nextBT WINDOW_HIDDEN; downloadMaterial ClothesFileName "clothe" [trans nextBT previousBT z]; 0 );; // *************************************************************************************************** /* :: Call Back previous choix chaussures*/ fun cbPreviousShoes(previousBT,b)= let b -> [trans nextBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist ShoesList) -> size in let if (currentShoListPos==-1)&& size!=0 then nil else if currentShoListPos>=1 then currentShoListPos-1 else -1 -> newPos in let if newPos==-1 then ( _ENbutton nextBT 1; _ENbutton previousBT 0;nil) else nth_list ShoesList newPos -> ShoesFileName in if ShoesFileName == nil then // ::::: iri ajout du test 0 else ( set shoes = ShoesFileName; // ::::: iri set currentShoListPos=newPos; _ENbutton nextBT 1; set meshDownloading=1; set shoes=ShoesFileName; _SHOWbutton previousBT WINDOW_HIDDEN; downloadMaterial ShoesFileName "shoes" [trans nextBT previousBT z]; 0 );; /* :: Call Back previous choix chaussures*/ fun cbNextShoes(nextBT,b)= let b -> [trans previousBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist ShoesList) -> size in let if (currentShoListPos==size)&& size!=0 then nil else if currentShoListPos>=1 then currentShoListPos+1 else 1 -> newPos in let if newPos==size then ( _ENbutton nextBT 0; _ENbutton previousBT 1;nil) else nth_list ShoesList newPos -> ShoesFileName in if ShoesFileName == nil then // ::::: iri ajout du test 0 else ( set shoes = ShoesFileName; // ::::: iri set currentShoListPos=newPos; _ENbutton previousBT 1; set meshDownloading=1; set shoes=ShoesFileName; _SHOWbutton nextBT WINDOW_HIDDEN; downloadMaterial ShoesFileName "shoes" [trans nextBT previousBT z]; 0 );; /* :: on zoome + dans la cabine d'essayage ::*/ fun cbCamPlus(x,b)= //(_DLGMessageBox _channel nil " cbCamPlus : " " vous avez sélectionné : " 0;0); let b -> [pos z] in let pos -> [a b c] in let z -> [sessionAvInterfView _ av3dViewObj cameraAvatarView CabineObj LightObj bufferAvInterfView] in (M3movObj sessionAvInterfView cameraAvatarView pos; _ENbutton zoomplus 0; _ENbutton zoommoins 1);; /* :: on zoome - dans la cabine d'essayage ::*/ fun cbCamMoins(x,b)= set currentcam=0; let b -> [pos z] in let pos -> [a b c] in let z -> [sessionAvInterfView _ av3dViewObj cameraAvatarView CabineObj LightObj bufferAvInterfView] in (M3movObj sessionAvInterfView cameraAvatarView pos; _ENbutton zoomplus 1; _ENbutton zoommoins 0);; /* :: on a cliqué dans la 3D ::*/ fun cbConfNum(num, z)= // ::on détruit les boutons _DSbutton nextconf; _DSbutton previousconf; _DSbutton zoomplus; _DSbutton zoommoins; // ::on recréé les boutons set textconf = _CRtext _channel winInterface 10 107 145 20 ET_BORDER _loc this "" nil; set nextconf = _CRbutton _channel winInterface 45 132 20 20 0 _loc this "AV_NEXT" nil; set previousconf = _CRbutton _channel winInterface 10 132 20 20 0 _loc this "AV_PREV" nil; set zoomplus = _CRbutton _channel winInterface 100 132 20 20 0 _loc this "AV_PLUS" nil; set zoommoins = _CRbutton _channel winInterface 135 132 20 20 0 _loc this "AV_MOINS" nil; set helpconf = _CRtext _channel winInterface 166 360 324 50 ET_BORDER|ET_ALIGN_CENTER|CT_WORDWRAP _loc this "" nil; // ::on cache les objets _SHOWbutton chgphoButton WINDOW_HIDDEN; _SHOWbutton btnPhotomaton WINDOW_HIDDEN; _SHOWcheck checkTrans WINDOW_HIDDEN; _SHOWwindow winPhoto WINDOW_HIDDEN; /* _SHOWtext txtColor WINDOW_HIDDEN; _SHOWtext txtColor2 WINDOW_HIDDEN; _SHOWtext txtColor3 WINDOW_HIDDEN; _SHOWwindow winColor WINDOW_HIDDEN; _SHOWbutton btnSupprColor WINDOW_HIDDEN; _SHOWbutton btnSetColor WINDOW_HIDDEN; _SHOWslider sliColor SLIDER_HIDDEN;*/ _SHOWtext txtSaturation WINDOW_HIDDEN; _SHOWtext txtSaturation2 WINDOW_HIDDEN; _SHOWtext txtSaturation3 WINDOW_HIDDEN; _SHOWbutton btnSupprSaturation WINDOW_HIDDEN; _SHOWbutton btnSetSaturation WINDOW_HIDDEN; _SHOWslider sliSaturationTx SLIDER_HIDDEN; _SHOWslider sliSaturationIntensity SLIDER_HIDDEN; // ::on réinitialise les boutons zoom _ENbutton zoomplus 0; _ENbutton zoommoins 1; // ::on réinitialise les textes _SETtext textconf nil; _SETtext helpconf nil; // ::::: iri curseur dans la map // color_cbWinColorPaintPrepare num; filtre_prepare num; let z -> [sessionAvInterfView shellAv3dView av3dViewObj cameraAvatarView CabineObj LightObj bufferAvInterfView] in ( if (currentcam==1) | (currentcam==2) | (currentcam==3) then M3movObj sessionAvInterfView cameraAvatarView [PoXcam (-PoYcam) (-PoZcam)] else if (currentcam==4) | (currentcam==5) then M3movObj sessionAvInterfView cameraAvatarView [PoXcam PoYcam (-PoZcam)] else (set PoXcam = 0; set PoYcam = 0; set PoZcam = 0); if num==1 then ( set currentcam=1; _SELcombo boxComboMaterial 1; set PoXcam = 0; set PoYcam = 80; set PoZcam = 400; M3movObj sessionAvInterfView cameraAvatarView [PoXcam PoYcam PoZcam]; /* _SHOWtext txtColor WINDOW_UNHIDDEN; _SHOWtext txtColor2 WINDOW_UNHIDDEN; _SHOWtext txtColor3 WINDOW_UNHIDDEN; _SHOWwindow winColor WINDOW_UNHIDDEN; _SHOWbutton btnSupprColor WINDOW_UNHIDDEN; _SHOWbutton btnSetColor WINDOW_UNHIDDEN; _SHOWslider sliColor SLIDER_UNHIDDEN;*/ _SHOWtext txtSaturation WINDOW_UNHIDDEN; _SHOWtext txtSaturation2 WINDOW_UNHIDDEN; _SHOWtext txtSaturation3 WINDOW_UNHIDDEN; _SHOWbutton btnSupprSaturation WINDOW_UNHIDDEN; _SHOWbutton btnSetSaturation WINDOW_UNHIDDEN; _SHOWslider sliSaturationTx SLIDER_UNHIDDEN; _SHOWslider sliSaturationIntensity SLIDER_UNHIDDEN; _CBbutton zoomplus @cbCamPlus [[PoXcam PoYcam PoZcam] z]; _CBbutton zoommoins @cbCamMoins [[PoXcam (-PoYcam) (-PoZcam)] z]; _CBbutton previousconf @cbPreviousHairs [nil nextconf z]; _CBbutton nextconf @cbNextHairs [nil previousconf z]; _SETtext textconf _loc this "AV_HAIRS" nil; _SETtext helpconf _loc this "HLP_HAIRS" nil) else if num==2 then ( set currentcam=2; _SHOWbutton chgphoButton WINDOW_UNHIDDEN; _SHOWbutton btnPhotomaton WINDOW_UNHIDDEN; _SHOWwindow winPhoto WINDOW_UNHIDDEN; _SELcombo boxComboMaterial 2; set PoXcam = 0; set PoYcam = 80; set PoZcam = 430; M3movObj sessionAvInterfView cameraAvatarView [PoXcam PoYcam PoZcam]; _CBbutton zoomplus @cbCamPlus [[PoXcam PoYcam PoZcam] z]; _CBbutton zoommoins @cbCamMoins [[PoXcam (-PoYcam) (-PoZcam)] z]; _CBbutton previousconf @cbPreviousFaces [nil nextconf z]; _CBbutton nextconf @cbNextFaces [nil previousconf z]; _SETtext textconf _loc this "AV_FACE" nil; _SETtext helpconf _loc this "HLP_FACE" nil ) else if num==3 then ( set currentcam=3; _SELcombo boxComboMaterial 3; set PoXcam = 0; set PoYcam = 50; set PoZcam = 380; M3movObj sessionAvInterfView cameraAvatarView [PoXcam PoYcam PoZcam]; /* _SHOWtext txtColor WINDOW_UNHIDDEN; _SHOWwindow winColor WINDOW_UNHIDDEN; _SHOWbutton btnSupprColor WINDOW_UNHIDDEN; _SHOWbutton btnSetColor WINDOW_UNHIDDEN; _SHOWslider sliColor SLIDER_UNHIDDEN; _SHOWtext txtColor2 WINDOW_UNHIDDEN; _SHOWtext txtColor3 WINDOW_UNHIDDEN;*/ _SHOWtext txtSaturation WINDOW_UNHIDDEN; _SHOWtext txtSaturation2 WINDOW_UNHIDDEN; _SHOWtext txtSaturation3 WINDOW_UNHIDDEN; _SHOWbutton btnSupprSaturation WINDOW_UNHIDDEN; _SHOWbutton btnSetSaturation WINDOW_UNHIDDEN; _SHOWslider sliSaturationTx SLIDER_UNHIDDEN; _SHOWslider sliSaturationIntensity SLIDER_UNHIDDEN; _CBbutton zoomplus @cbCamPlus [[PoXcam PoYcam PoZcam] z]; _CBbutton zoommoins @cbCamMoins [[PoXcam (-PoYcam) (-PoZcam)] z]; _CBbutton previousconf @cbPreviousClothesTop [nil nextconf z]; _CBbutton nextconf @cbNextClothesTop [nil previousconf z]; _SETtext textconf _loc this "AV_CLOTHESTOP" nil; _SETtext helpconf _loc this "HLP_CLOTHESTOP" nil ) else if num==4 then ( set currentcam=4; _SELcombo boxComboMaterial 4; set PoXcam = 0; set PoYcam = 25; set PoZcam = 250; M3movObj sessionAvInterfView cameraAvatarView [PoXcam (-PoYcam) PoZcam]; /* _SHOWtext txtColor WINDOW_UNHIDDEN; _SHOWwindow winColor WINDOW_UNHIDDEN; _SHOWbutton btnSupprColor WINDOW_UNHIDDEN; _SHOWbutton btnSetColor WINDOW_UNHIDDEN; _SHOWslider sliColor SLIDER_UNHIDDEN; _SHOWtext txtColor2 WINDOW_UNHIDDEN; _SHOWtext txtColor3 WINDOW_UNHIDDEN;*/ _SHOWtext txtSaturation WINDOW_UNHIDDEN; _SHOWtext txtSaturation2 WINDOW_UNHIDDEN; _SHOWtext txtSaturation3 WINDOW_UNHIDDEN; _SHOWbutton btnSupprSaturation WINDOW_UNHIDDEN; _SHOWbutton btnSetSaturation WINDOW_UNHIDDEN; _SHOWslider sliSaturationTx SLIDER_UNHIDDEN; _SHOWslider sliSaturationIntensity SLIDER_UNHIDDEN; _CBbutton zoomplus @cbCamPlus [[PoXcam (-PoYcam) PoZcam] z]; _CBbutton zoommoins @cbCamMoins [[PoXcam (PoYcam) (-PoZcam)] z]; _CBbutton previousconf @cbPreviousClothes [nil nextconf z]; _CBbutton nextconf @cbNextClothes [nil previousconf z]; _SETtext textconf _loc this "AV_CLOTHES" nil; _SETtext helpconf _loc this "HLP_CLOTHES" nil ) else if num==5 then ( set currentcam=5; _SELcombo boxComboMaterial 5; set PoXcam = 0; set PoYcam = 80; set PoZcam = 420; M3movObj sessionAvInterfView cameraAvatarView [PoXcam (-PoYcam) PoZcam]; /* _SHOWtext txtColor WINDOW_UNHIDDEN; _SHOWwindow winColor WINDOW_UNHIDDEN; _SHOWbutton btnSupprColor WINDOW_UNHIDDEN; _SHOWbutton btnSetColor WINDOW_UNHIDDEN; _SHOWslider sliColor SLIDER_UNHIDDEN; _SHOWtext txtColor2 WINDOW_UNHIDDEN; _SHOWtext txtColor3 WINDOW_UNHIDDEN;*/ _SHOWtext txtSaturation WINDOW_UNHIDDEN; _SHOWtext txtSaturation2 WINDOW_UNHIDDEN; _SHOWtext txtSaturation3 WINDOW_UNHIDDEN; _SHOWbutton btnSupprSaturation WINDOW_UNHIDDEN; _SHOWbutton btnSetSaturation WINDOW_UNHIDDEN; _SHOWslider sliSaturationTx SLIDER_UNHIDDEN; _SHOWslider sliSaturationIntensity SLIDER_UNHIDDEN; _CBbutton zoomplus @cbCamPlus [[PoXcam (-PoYcam) PoZcam] z]; _CBbutton zoommoins @cbCamMoins [[PoXcam (PoYcam) (-PoZcam)] z]; _CBbutton previousconf @cbPreviousShoes [nil nextconf z]; _CBbutton nextconf @cbNextShoes [nil previousconf z]; _SETtext textconf _loc this "AV_SHOES" nil; _SETtext helpconf _loc this "HLP_SHOES" nil ) else ( set currentcam=0; _SELcombo boxComboMaterial 0; _SETtext textconf _loc this "AV_ERROR" nil; _SETtext helpconf _loc this "HLP_ERROR" nil; _SHOWbutton chgphoButton WINDOW_HIDDEN; _SHOWcheck checkTrans WINDOW_HIDDEN; _SHOWwindow winPhoto WINDOW_HIDDEN; _DSbutton nextconf; _DSbutton previousconf; _DSbutton zoomplus; _DSbutton zoommoins; nil); );; /* :: Construction de la liste de sélection ::*/ fun FillCombo(box, l, value) = if (l == nil) then _SELcombo box value else ( _ADDcombo box (_GETcomboCount box) (hd l); FillCombo box (tl l) value; );; /* :: Fonction de Recherche du matériaux suite clic direct sur la 3D ::*/ fun SelectPartOfAvatarWithClick (z, myHmat3dName) = // (_DLGMessageBox _channel nil " SelectPartOfAvatarWithClick : " strcat " vous avez sélectionné : " myHmat3dName 0;0); // :: Boutons de configuration :: let z -> [sessionAvInterfView _ _ _ CabineObj LightObj bufferAvInterfView] in let ( if !strcmp myHmat3dName "Cheveux" then 1 else if !strcmp myHmat3dName "Visage" then 2 else if !strcmp myHmat3dName "Haut" then 3 else if !strcmp myHmat3dName "Bas" then 4 else if !strcmp myHmat3dName "Chaussures" then 5 else 0 ) -> number in // :: on envoi à cbConfNum le N° combo en fonction du matériau sélectionné :: cbConfNum number z;; /* :: Selection d'un mesh de l'avatar ::*/ fun CbClickAvatar (winavatar,z,xplot,yplot,btn) = /* _showconsole; _fooI xplot; _fooI yplot;*/ _SETfocus winavatar; _DStext textconf; _DSbutton nextconf; _DSbutton previousconf; set nextconf=nil; set previousconf=nil; /* on fait un changement de repère, le X,Y du click et du picking 3D sont pas les même */ set ClickWindow.ClickX = (xplot-(256/2)); set ClickWindow.ClickY = -(yplot-(256/2)); let z -> [sessionAvInterfView shellAv3dView av3dViewObj cameraAvatarView CabineObj LightObj bufferAvInterfView] in let MX3renderInfo sessionAvInterfView cameraAvatarView ClickWindow.ClickX ClickWindow.ClickY -> [av a b c d] in let M3objName sessionAvInterfView av -> myH3dName in let M3materialName sessionAvInterfView a -> myHmat3dName in /* (_DLGMessageBox _channel nil " élément 3D sélectionné : " strcat " vous avez sélectionné : " myHmat3dName 0;0);*/ SelectPartOfAvatarWithClick z myHmat3dName; /* Fonction de selection de partie à changer sur l'avatar3D */ // _fooS myH3dName; // _fooS myHmat3dName); 0 ;; /*--------------*/ fun cbOpenFile (d,b,filename)= let b -> [text winPhoto z] in let z -> [sessionAvInterfView _ av3dViewObj cameraAvatarView _ _ bufferAvInterfView] in ( if filename==nil then nil else let _getpack filename ->s in let _GetFileNameFromP filename-> file in let strcat "face/" file -> newname in if s==nil then (_SETtext helpconf _loc this "AV_WARNING" nil;0) else ( let _LDbitmap _channel filename -> imagebmp in let if imagebmp==nil then _LDjpeg _channel filename else imagebmp -> image in if image==nil then (_SETtext helpconf _loc this "AV_WARNING3" nil;0) else let _GETbitmapSize image -> [w h] in /* ::::: iri let (if w&&h <= 128 then image else _SCPbitmap image 0 0 127 127 image 0 0 w-1 h-1 nil )-> newbmp128 in */ let _SCPbitmap image 0 0 127 127 image 0 0 w-1 h-1 nil -> newbmp128 in let _getmodifypack newname -> fileW in ( _SAVEjpeg newbmp128 fileW 90; let _getpack _checkpack newname ->string in set photo=newname; // ::::: ici on recharge le modele d'avatar ::::: // ::::: iri inutile de recharger tout l'avatar et le m3d pour plaquer la texture downloadM3D avfile "browser" [nil nil nil z]; applyMateriaux sessionAvInterfView av3dViewObj "photo"; // ::::: iri resetAngCabav sessionAvInterfView av3dViewObj; // ::::: iri // applyface sessionAvInterfView photo av3dViewObj; /* apply new photo on avatar*/ set bufPhoto=_SCPbitmap bufPhoto 0 0 63 63 image 0 0 w-1 h-1 nil; _DSbitmap image; 0); ); cbPaintE2 winPhoto nil ) ;; /* --------------*/ fun cbChoosebitmap(x,b)= let b -> [text _ _] in ( _SETtext text _loc this "AV_CHOOSE" nil; _DLGrflopen _DLGOpenFile _channel nil "c:" nil strcatn (_loc this "FILE_TXT" nil):: (" (*.bmp,*.jpg,*.jpeg)\0*.bmp;*.jpg;*.jpeg\0"):: nil @cbOpenFile b; 0 ) ;; /* --------------*/ fun cbCheckTrans(a,z,newFlag)= let z -> [sessionAvInterfView _ av3dViewObj _ CabineObj LightObj _] in applyface sessionAvInterfView photo av3dViewObj;; /*apply new trans state on avatar*/ /* --------------*/ fun cbClockInterfView(t,b)= let b -> [winAvatar key z] in let z -> [sessionAvInterfView _ av3dViewObj cameraAvatarView CabineObj LightObj bufferAvInterfView] in if winInterface==nil then _deltimer t else ( // ::::: iri : optimisations if renduONOFF then if meshDownloading then _CPWbitmap winAvatar 0 0 loadingBitmap 0 0 256 256 else ( MX3render sessionAvInterfView bufferAvInterfView cameraAvatarView 0 0 0x444444; // code temporaire pour pivoter l'avatar de - M3rotateObj sessionAvInterfView av3dViewObj [(100) 0 0 ]; M3rotateObj sessionAvInterfView CabineObj [0 0 (-100)]; M3setAnimKey sessionAvInterfView av3dViewObj key; let if key < anim_stop_end then key+1 else anim_stop_begin -> newKey in mutate b <- [_ newKey _]; _BLTsurface winAvatar 0 0 bufferAvInterfView 0 0 256 256; ) else nil; 0 );; /* :: Call Back combo box material :: */ fun cbboxComboMaterial(cmb, z, num, value)= let z -> [sessionAvInterfView shellAv3dView av3dViewObj cameraAvatarView CabineObj LightObj bufferAvInterfView] in ( cbConfNum num z; // _DLGMessageBox _channel nil " fun cbboxComboMaterial : " strcat " Choix N° : " itoa num 0; // _DLGMessageBox _channel nil " fun cbboxComboMaterial : " strcat " Choix valeur : " value 0; // _DLGMessageBox _channel nil " fun cbboxComboMaterial : " strcat " Choix param : " param 0; 0 );; /* ::::: iri callback combo choix du sous-type d'avatar demande l'avatar par défaut du sous-type cliqué obj -> ObjBox z -> [ObjBox ObjButton ObjButton [S3d H3d H3d H3d H3d H3d ObjSurface]] : paramètre utilisateur cf ' showInterface ' num -> I : position de l'item dans le combo item -> S : nom de l'item choisi <- I : sans intérêt */ fun cbComboTypeAv(obj, z, num, item)= _fooS strlowercase(sex); set avfile = strcatn "avatars/type" :: (strlowercase(sex)) :: "/" :: item :: "/m3d/avdefault.m3d" :: nil; _DMSsend this CnewSStype [strcatn "avatars/type" :: (strlowercase(sex)) :: "/" :: item :: "/" :: nil]; downloadM3D avfile "browser" [nil nil nil z];; /* --------------*/ fun cbNext(nextBT,b)= let b -> [trans previousBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist AvatarsList) -> size in let if ((currentAvListPos == -1) || (currentAvListPos == -2 )) && size != 0 then 0 else if currentAvListPos < size-1 then currentAvListPos + 1 else -1 -> newPos in let if newPos == -1 then avDefaultFile else nth_list AvatarsList newPos -> avFileName in if avFileName == nil then // ::::: iri ajout du test 0 else ( set currentAvListPos=newPos; _ENbutton previousBT 0; _ENbutton nextBT 0; set meshDownloading=1; downloadM3D avFileName "browser" [trans nextBT previousBT z]; 0 );; /* :: Call Back previous choix avatars 3D*/ fun cbPrevious(previousBT,b)= let b -> [trans nextBT z] in let z -> [sessionAvInterfView shellAv3dView av3dViewObj _ CabineObj _ _] in let (sizelist AvatarsList) -> size in let if ((currentAvListPos==-1)||(currentAvListPos==-2)) && size!=0 then size-1 else if currentAvListPos>=1 then currentAvListPos-1 else -1 -> newPos in let if newPos == -1 then avDefaultFile else nth_list AvatarsList newPos -> avFileName in if avFileName == nil then // ::::: iri ajout du test 0 else ( set currentAvListPos=newPos; _ENbutton previousBT 0; _ENbutton nextBT 0; set meshDownloading=1; downloadM3D avFileName "browser" [trans previousBT nextBT z]; 0 );; /* ::::: iri callback du bouton reset */ fun cbBtnReset(obj, u)= let u -> [sessionAvInterfView _ av3dViewObj _ _ _ _] in resetAngCabav sessionAvInterfView av3dViewObj;; /* ::::: iri Enregistre le screenshot à l'endroit spécifié par l'utilisateur obj -> SaveBox bmp -> ObjBitmap : le bitmap de l'instantané w -> W : référence du fichier d'enregistrement <- I : sans intérêt */ fun cbBtnSShot2(obj, bmp, w)= if w == nil then 0 else let _getmodifypack VerifyExt _PtoScol _WtoP w ".jpg" -> w in _SAVEjpeg bmp w 80; _DSbitmap bmp;; /* ::::: iri callback btnSShot Prend un instantané et ouvre la boite de dialogue pour l'enregistrer obj -> ObjButton : sans intérêt u -> [S3d H3d H3d H3d H3d H3d ObjSurface] <- SaveBox : sans intérêt */ fun cbBtnSShot(obj, u)= let u -> [_ _ _ _ _ _ surf] in let _CRbitmap _channel 256 256 -> bmp in ( _Surface2Bitmap bmp 0 0 surf 0 0 256 256 nil; _DLGrflsave _DLGSaveFile _channel winInterface nil nil "JPEG\0*.jpg\0\0" @cbBtnSShot2 bmp; );; /* ::::: iri SATURATION part but : Permettre à l'utilisateur d'appliquer un filtre de saturation aux textures de son avatar mise en oeuvre : Deux slides apparaissent sur l'interface pour que l'utilisateur paramètre : 1- le taux d'application du filtre de saturation; 2- l'intensité du filtre de saturation Deux boutons pour valider ou supprimer le filtre de saturation Les deux slides ont un intervalle d'utilisation compris entre 0 et 100 pour une meilleure compréhension. Les conversions se font ensuite, notamment vers les des valeurs hexadécimales. notes de développement : J'ai quelque peu bidouillé la création / gestion des slides initialement codé par Marc Barilley (Marq.). Au départ, j'ai voulu faire des modifs génériques mais ça m'aurait pris trop de temps. J'ai finalement utilisé une ' mkfunN ' mais mieux vaut éviter de se resservir de ce ' _mslider.pkg ' et prendre celui présent dans ' dms/lib ' même si j'ai supprimé la plupart des modifs que j'avais faite. */ /* Ajoute le filtre de saturation à la texture sélectionnée de l'avatar obj -> ObjButton : sans intérêt ici, c'est le bouton appelant u -> [S3d H3d H3d H3d H3d H3d ObjSurface] <- I */ fun saturation_add(obj, u)= let u -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in let _GETslider sliSaturationTx -> [ltx _] in let _GETslider sliSaturationIntensity -> [lint _] in ( if i == 1 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fhair = set Flast = s; applyMateriaux s3d h "hair" ) else if i == 3 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Ftop = set Flast = s; applyMateriaux s3d h "clothestop" ) else if i == 4 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fbottom = set Flast = s; applyMateriaux s3d h "clothes" ) else if i == 5 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fshoes = set Flast = s; applyMateriaux s3d h "shoes" ) else 0; filtre_prepare i );; /* Supprime le filtre de saturation à la texture sélectionnée de l'avatar obj -> ObjButton : sans intérêt ici, c'est le bouton appelant u -> [S3d H3d H3d H3d H3d H3d ObjSurface] <- I */ fun saturation_suppr(obj, u)= set Flast = nil; let u -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in ( if i == 1 then ( set Fhair = nil; applyMateriaux s3d h "hair" ) else if i == 3 then ( set Ftop = nil; applyMateriaux s3d h "clothestop" ) else if i == 4 then ( set Fbottom = nil; applyMateriaux s3d h "clothes" ) else if i == 5 then ( set Fshoes = nil; applyMateriaux s3d h "shoes" ) else 0; filtre_prepare i );; fun saturation_intensity(obj, lint, rint, z)= let z -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in let _GETslider sliSaturationTx -> [ltx _] in if i == 1 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fhair = set Flast = s; applyMateriaux s3d h "hair" ) else if i == 3 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Ftop = set Flast = s; applyMateriaux s3d h "clothestop" ) else if i == 4 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fbottom = set Flast = s; applyMateriaux s3d h "clothes" ) else if i == 5 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fshoes = set Flast = s; applyMateriaux s3d h "shoes" ) else 0;; fun saturation_taux(obj, ltx, rtx, z)= let z -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in let _GETslider sliSaturationIntensity -> [lint _] in if i == 1 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fhair = set Flast = s; applyMateriaux s3d h "hair" ) else if i == 3 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Ftop = set Flast = s; applyMateriaux s3d h "clothestop" ) else if i == 4 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fbottom = set Flast = s; applyMateriaux s3d h "clothes" ) else if i == 5 then let strcatn "S" :: (itoh ftoi (lint *. 655.36)) :: (itoh ftoi (ltx *. 2.55)) :: nil -> s in ( set Fshoes = set Flast = s; applyMateriaux s3d h "shoes" ) else 0;; /* ::::: iri COLOR part but : Permettre à l'utilisateur d'appliquer un filtre coloré aux textures de son avatar mise en oeuvre : Une map apparaît sur l'interface lorsque la colorisation est autorisée. L'utilisateur sélectionne alors une couleur et l'applique à la texture. Il peut aussi supprimer le filtre pour revenir à l'aspect originel. De plus, il a la possibilité d'ajouter le dernier filtre à la texture courante. Pour cela, on a deux éléments graphiques : 1- une map pour choisir la couleur du filtre : la position (x y) du clic définit ainsi la position du pixel dont la couleur est alors relevée; 2- un slide pour choisir l'intensité du filtre : la réglette est graduée de 0(%) à 100 (%). La position du curseur donne la valeur de cette intensité. Ces deux valeurs permettent donc de construire un filtre qui sera appliqué à la texture de la zone sur laquelle travaille l'utilisateur. De simples conversions permettent d'obtenir le bon format syntaxique. Si l'utilisateur clique sur le slide, la dernière valeur valide connue de la couleur correspondant à la zone est utilisée pour construire le filtre. Si l'utilisateur clique sur la map, la valeur courante du slide est utilisée pour construire le filtre. Deux boutons supplémentaires apportent ces options : 1- Un bouton pour supprimer le filtre et ainsi retrouver la texture sous son aspect d'origine; 2- Un bouton pour ajouter le dernier filtre employé à la configuration courante. notes de développement : J'ai quelque peu bidouillé la création / gestion des slides initialement codé par Marc Barilley (Marq.). Au départ, j'ai voulu faire des modifs génériques mais ça m'aurait pris trop de temps. J'ai finalement utilisé une ' mkfunN ' mais mieux vaut éviter de se resservir de ce ' _mslider.pkg ' et prendre celui présent dans ' dms/lib ' même si j'ai supprimé la plupart des modifs que j'avais faite. Attention !! Le code est laissé pour une éventuelle réutilisation future mais il n'est pas utilisé dans cette version d'Av3d. */ typeof bmpMapColor = ObjBitmap;; // bitmap de la map (choix des couleurs) typeof bmpMapColorShown = ObjBitmap;; // bitmap de la map affichée (choix des couleurs + curseur) /* Affiche la map dans winColor obj -> ObjWin : winColor u -> ObjBitmap : bitmap à afficher <- ObjWin : sans intérêt */ fun color_cbWinColorPaint(obj, bmp)= _BLTbitmap winColor bmp 0 0;; /* Prépare le contenu de la colorimétrie : map avec le curseur + taux flag -> I : zone concernée de l'avatar <- ObjWin */ fun color_cbWinColorPaintPrepare(flag)= // position du curseur ' taux ' let if flag == 1 then Fhair else if flag == 3 then Ftop else if flag == 4 then Fbottom else if flag == 5 then Fshoes else nil -> fi in // valeur du filtre dont on va extraire le taux let substr fi 7 2 -> tx in // taux en hexa sur un intervalle [0 .. 255] let (itof htoi tx) /. 2.55 -> tx in // taux en float sur un intervalle [0 .. 100] ( _SETsliderLeft sliColor if tx != nil then tx else 50.0; _SETsliderRight sliColor if tx != nil then tx else 50.0; ); // position du curseur dans la map let if flag == 1 then cColor.cHair else if flag == 3 then cColor.cTop else if flag == 4 then cColor.cBottom else if flag == 5 then cColor.cShoes else nil -> [x y] in if x != nil && y != nil then let _LDbitmap _channel _checkpack "dms/avatar/av3d/ressources/opencross.bmp" -> cur in ( _CPbitmap24 bmpMapColorShown 0 0 bmpMapColor 0 0 148 75 nil; _CPbitmap24 bmpMapColorShown x-16 y-16 cur 0 0 32 32 0xffffff; _DSbitmap cur; color_cbWinColorPaint nil bmpMapColorShown ) else ( _CPbitmap24 bmpMapColorShown 0 0 bmpMapColor 0 0 148 75 nil; color_cbWinColorPaint nil bmpMapColorShown );; /* Callback clic dans winColor La couleur du pixel situé sous le clic donne la couleur du filtre à appliquer selon la zone concernée de l'avatar. obj -> ObjWin : winColor z -> [S3d H3d H3d H3d H3d H3d ObjSurface] : paramètre utilisateur x -> I : abscisse du clic y -> I : ordonnée du clic btn -> I : bouton cliqué (droit, gauche, ..) <- I */ fun color_click(obj, z, x, y, btn)= let z -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in let itoh _GETpixel24 bmpMapColor x y -> c in let _GETslider sliColor -> [l r] in let itoh ftoi (l *. 2.55) -> tx in let strcatn "C" :: c :: tx :: nil -> s in if i == 1 then // cheveux ( set Fhair = set Flast = s; set cColor.cHair = [x y]; color_cbWinColorPaintPrepare 1; applyMateriaux s3d h "hair" ) else if i == 3 then // top ( set Ftop = set Flast = s; set cColor.cTop = [x y]; color_cbWinColorPaintPrepare 3; applyMateriaux s3d h "clothestop" ) else if i == 4 then // bottom ( set Fbottom = set Flast = s; set cColor.cBottom = [x y]; color_cbWinColorPaintPrepare 4; applyMateriaux s3d h "clothes" ) else if i == 5 then // shoes ( set Fshoes = set Flast = s; set cColor.cShoes = [x y]; color_cbWinColorPaintPrepare 5; applyMateriaux s3d h "shoes" ) else 0;; /* Callback du slide la valeur du curseur donne l'intensité du filtre à appliquer selon la zone concernée de l'avatar. obj -> ObjSlider : sliColor l -> I : valeur gauche du curseur r -> I : valeur droit du curseur (ici identique à l grâce au flag ' SLIDER_INTER_FIXED ' lors de la création du slide) z -> [S3d H3d H3d H3d H3d H3d ObjSurface] : paramètre utilisateur grâce au ' mkfunN ' utilisée <- I : obligatoirement un entier, ici 0 */ fun color_cbTaux(obj, l, r, z)= let z -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in if i == 1 && Fhair != nil then let substr Fhair 1 6 -> c in let strcatn "C" :: c :: (itoh ftoi (l *. 2.55)) :: nil -> s in ( set Fhair = set Flast = s; applyMateriaux s3d h "hair" ) else if i == 3 && Ftop != nil then let substr Ftop 1 6 -> c in let strcatn "C" :: c :: (itoh ftoi (l *. 2.55)) :: nil -> s in ( set Ftop = set Flast = s; applyMateriaux s3d h "clothestop" ) else if i == 4 && Fbottom != nil then let substr Fbottom 1 6 -> c in let strcatn "C" :: c :: (itoh ftoi (l *. 2.55)) :: nil -> s in ( set Fbottom = set Flast = s; applyMateriaux s3d h "clothes" ) else if i == 5 && Fshoes != nil then let substr Fshoes 1 6 -> c in let strcatn "C" :: c :: (itoh ftoi (l *. 2.55)) :: nil -> s in ( set Fshoes = set Flast = s; applyMateriaux s3d h "shoes" ) else 0;; /* Supprime le filtre associé à la texture courante obj -> ObjButton u -> [S3d H3d H3d H3d H3d H3d ObjSurface] : paramètre utilisateur <- I */ fun color_suprr(obj, u)= set Flast = nil; let u -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in if i == 1 then ( set Fhair = nil; applyMateriaux s3d h "hair" ) else if i == 3 then ( set Ftop = nil; applyMateriaux s3d h "clothestop" ) else if i == 4 then ( set Fbottom = nil; applyMateriaux s3d h "clothes" ) else if i == 5 then ( set Fshoes = nil; applyMateriaux s3d h "shoes" ) else 0;; /* Ajoute le dernier filtre appliqué à la texture courante obj -> ObjButton u -> [S3d H3d H3d H3d H3d H3d ObjSurface] : paramètre utilisateur <- I */ fun color_add(obj, u)= let u -> [s3d _ h _ _ _ _] in let _GETcombo boxComboMaterial -> [i _] in if i == 1 then ( set Fhair = Flast; applyMateriaux s3d h "hair" ) else if i == 3 then ( set Ftop = Flast; applyMateriaux s3d h "clothestop" ) else if i == 4 then ( set Fbottom = Flast; applyMateriaux s3d h "clothes" ) else if i == 5 then ( set Fshoes = Flast; applyMateriaux s3d h "shoes" ) else 0;; /* ::::: iri FILTRE part */ fun filtre_prepare(i)= // position du curseur ' taux ' let if i == 1 then Fhair else if i == 3 then Ftop else if i == 4 then Fbottom else if i == 5 then Fshoes else nil -> fi in // valeur du filtre dont on va extraire le taux et l'intensité let substr fi 5 2 -> tx in // taux en hexa sur un intervalle [0 .. 255] let (itof htoi tx) /. 2.55 -> tx in // taux en float sur un intervalle [0 .. 100] // position du curseur ' intensity ' let substr fi 1 4 -> int in let (itof htoi int) /. 655.36 -> int in // intensité en flottant sur un intervalle [0 .. 100] ( _SETsliderLeft sliSaturationTx if tx != nil then tx else 0.0; _SETsliderRight sliSaturationTx if tx != nil then tx else 0.0; _SETsliderLeft sliSaturationIntensity if int != nil then int else 0.0; _SETsliderRight sliSaturationIntensity if int != nil then int else 0.0; ); 0;; /* ::::: iri WEBCAM part but : Permettre à l'utilisateur de capturer son visage grâce à sa webcam suivant un gabarit afin de bien positionner ses yeux, son nez et sa bouche. Une fois la capture prise, l'image obtenue sera être utilisée sur l'avatar. mise en oeuvre : L'image de la webcam sera affichée en lieu et place de la photo en cours. Généralement, les webcams fournissent une image au format 4:3 et non un format 1:1 comme pour les textures utilisées pour les visages. Pour pallier cet inconvénient, je rogne l'image sur la largeur en gardant la zone centrale intègre (je coupe les bords gauche et droit) puisque seul le visage nous interesse et que celui-ci doit être parfaitement centré pour être calé sur l'avatar. Deux solutions peuvent être intéressantes (à mon sens) : 1- Capturer l'image en 87 x 65 (4:3) pixels et n'afficher que la zone centrale du bitmap obtenue. Pour n'afficher que cette zone centrale, l'abscisse d'origine sur la fenêtre réceptrice est ainsi de -11 (11 * 2 = 22 + 65 = 87). C'est la formule la plus rapide et la moins consommatrice de ressources. Cependant, lorsque l'utilisateur valide l'image, il l'a dans une taille de 65 x 65 px, insuffisante pour l'avatar. La convertir en 128 x 128 px la dégrade considérablement (la qualité du rendu doit être supérieur pour un visage). 2- Capturer l'image en 320 x 240 (le format standard de la plupart des webcams) puis de la rogner pour ne garder que la zone centrale en 128 x 128. Une étape intermédiaire permet d'afficher (en stretchant l'image en 65 x 65 px) une image de prévisualisation. Cette solution demande un surcroît de ressources mais fournit, au final, une image directement appliquable à l'avatar de meilleure qualité. Il ne faut pas oublier que la 3d continue d'être active et que la solution 2 ralentit les rendus (ralentissement imperceptible sur les systèmes costauds mais visible sur des machines moyennes (par ex une nVidia MX2 400 - 32 Mo)). L'initialisation du format se faisant à l'initialisation de la webcam, il est difficile de faire un mix des deux méthodes dans un contexte de ' photomaton ' automatisé. Je prends donc la solution 2 (M2) mais laisse le code de la solution (M1) en commentaire. Pour permuter, il suffira de décommenter M1 et commenter M2 ... Une fois l'image validée par l'utilisateur, celle-ci est immédiatement appliquée à l'avatar laissant ainsi le choix à l'utilisateur de prendre une nouvelle capture. note de développement : Une particularité de la fonction Scol ' _CRcapWindow [Chn ObjWin driver x y w h visible framerate] Video ' : framerate DOIT être exprimée en millionième de seconde pour que la callback définit par ' _SETcapVideoStart ' soit exécutée. De plus, la visibilité devraît être à ' 0 '. S'il est à 1, le rendu se fera mal et l'image sera fortement dégradée (framerate trop rapide). Si l'usage de la callback n'est pas requis, l'expression DEVRAIT être en millième de seconde et la visiblité à ' 1 '. Cette particularité a été donc répertoriée et le code source sera revu dès que possible. Quelques modifications dans ' webcam_open ' rendent les valeurs numériques de (M1) obsolète. Je ne les ai pas mises à jour, (M2) ayant été validée. Toutefois, si nécessaire, il suffit juste de mettre les bonnes pour que ça tourne ... ;-) Ces modifications ont simplement passé l'affichage de la webcam à la place de ' winAvatar ' plutôt que dans ' winPhoto ' pour avoir une image plus confortable. Du coup, le rendu 3d de la cabine est mis en stand by et ' winAvatar ' cachée. */ /* Déclaration des variables et définition de fonctions spécifiques à cette section ' WEBCAM ' */ typeof video = Video;; typeof lastcapture = S;; // contenu de l'image redressée de la dernière capture typeof lastWebcam = ObjBitmap;; // dernier bitmap affichée incluant le gabarit (ne pas l'utiliser pour la texture du visage) typeof webcamfont = ObjFont;; typeof webcam_rebours = I;; // compte à rebours lors de l'utilisation du 'retardateur' pour prendre une capture typeof webcam_session = S3d;; typeof webcam_buffer = ObjSurface;; typeof webcam_shell = H3d;; typeof webcam_cam = H3d;; typeof webcam_obj3d = H3d;; typeof webcam_tex = HTx3d;; typeof webcam_mat = HMat3d;; proto webcam_open = fun [ObjButton [ObjText ObjWin [S3d H3d H3d H3d H3d H3d ObjSurface]]] I;; fun webcam_crCam()= strbuild ( ( "camera" :: "camera" :: "{" :: nil ) :: ( "0" :: "0" :: "0" :: "0" :: "0" :: "0" :: nil ) :: ( "350" :: "350" :: "200" :: "100" :: nil ) :: ( "20" :: "80000" :: "130000" :: nil ) :: ( "}" :: nil ) :: nil ) ;; fun webcam_updateTex(bmp)= M3chgMaterialTexture webcam_session webcam_mat webcam_tex; M3blitTexture16 webcam_session webcam_tex bmp;; fun webcam_rendu3d()= webcam_updateTex lastWebcam; M3setSpriteTexCoord webcam_session webcam_obj3d [255 0] :: [0 0] :: [0 255] :: [255 255] :: nil nil; MX3render webcam_session webcam_buffer webcam_cam 0 0 0; // _BLTsurface winAvatar 100 5 webcam_buffer 0 0 256 256; _Surface2Bitmap lastWebcam 0 0 webcam_buffer 0 0 256 256 nil; 0;; fun webcam_session3d()= set webcam_session = MX3createSession _channel; set webcam_buffer = _CRsurface _channel 256 256; set webcam_shell = M3createShell webcam_session; M3loadString webcam_session webcam_crCam webcam_shell; set webcam_cam = M3getObj webcam_session "camera"; M3setObjVec webcam_session webcam_cam [0 0 0]; M3setObjAng webcam_session webcam_cam [0 0 0]; let ((atof "29.7") /. (atof "57.29")) -> d in let ftoi ((itof (256 / 2)) /. (tan d)) -> dx in M3setCamera webcam_session webcam_cam [[dx dx] [(256 / 2) (256 / 2)] [0 32768 65536]]; set webcam_tex = M3createTexture webcam_session "logo.bmp"; set webcam_mat = M3createMaterial webcam_session "sprite"; M3setType webcam_session webcam_mat MAT_TEXTURED; webcam_updateTex lastWebcam; set webcam_obj3d = M3createSprite webcam_session 256 256 webcam_mat 0; M3link webcam_session webcam_obj3d webcam_cam; M3setObjVec webcam_session webcam_obj3d [0 0 230]; M3recursFillMatObj webcam_session webcam_shell;; /* Annulation par l'utilisateur de la capture obj -> ObjButton : sans intérêt u -> [ObjText ObjWin [S3d H3d H3d H3d H3d H3d ObjSurface]] : transfert de paramètres <- I : sans intérêt */ fun webcam_CANCEL(obj, u)= // arrêt et destruction de la capture _SETcapVideoStop video; _DScapWindow video; _DSbitmap lastWebcam; _DSfont webcamfont; M3reset webcam_session; M3destroy webcam_session; // reset des deux boutons de contrôle _CBbutton _SETbuttonName btnPhotomaton _loc this "AV_CHANGE" nil @webcam_open u; _SETbuttonName btnWebcamOkTimer _loc this "WEBCAM_TIMER" nil; // _CBbutton _SETbuttonName chgphoButton _loc this "AV_FILEPHOTO" nil @cbChoosebitmap u; // Désactivation des callbacks spécifiques _CBwinKeydown winInterface nil 0; _CBwinClick winInterface nil 0; // réactivation des éléments de l'interface _SHOWwindow winAvatar WINDOW_UNHIDDEN; _SHOWbutton btnWebcamOkTimer WINDOW_HIDDEN; _SHOWbutton btnWebcamOk WINDOW_HIDDEN; _SHOWbutton btnReset WINDOW_UNHIDDEN; _SHOWbutton btnSShot WINDOW_UNHIDDEN; _ENcombo boxComboTypeAv 1; _ENcombo boxComboMaterial 1; _ENbutton previousconf 1; _ENbutton nextconf 1; _ENbutton previous 1; _ENbutton next 1; _ENbutton ok 1; _ENbutton cancel 1; _ENbutton chgphoButton 1; // le rendu 3d de la cabine est réactivé set renduONOFF = 1; 0;; /* Validation de la capture par l'utilisateur L'image est enregistrée dans le cache local, l'applique au visage de l'avatar. L'enregistrement, en JPEG, est en qualité maximale. Le serveur sera informé du choix de l'utilisateur de façon classique i.e. lorsque celui-ci validera l'interface. En attendant, tout se passe en local laissant le client refaire sa capture comme bon lui semble. obj -> ObjButton : sans intérêt u -> [ObjText ObjWin [S3d H3d H3d H3d H3d H3d ObjSurface]] : transfert de paramètres <- I : sans intérêt */ fun webcam_OK(obj, u)= // let _CRbitmap _channel 87 65 -> bmp in // :::::: iri M1 let _CRbitmap _channel 320 240 -> bmp in // :::::: iri M2 let _CRbitmap _channel 128 128 -> bmpfin in ( _DMSevent this "soundClic" nil nil; _SETbitmap bmp lastcapture; // _SCPbitmap bmpfin 0 0 128 128 bmp 11 0 65 65 nil; // :::::: iri M1 _SCPbitmap bmpfin 0 0 128 128 bmp 40 0 280 240 nil; // :::::: iri M2 _SAVEjpeg bmpfin _getmodifypack photowebcam 100; let _LDjpeg _channel _checkpack photowebcam -> tmp in ( set bufPhoto = _SCPbitmap bufPhoto 0 0 63 63 tmp 0 0 127 127 nil; _DSbitmap tmp ); cbPaintE2 winPhoto nil; _DSbitmap bmp; _DSbitmap bmpfin ); if (_checkpack photowebcam) != nil then let u -> [_ _ [sessionAvInterfView _ av3dViewObj _ _ _ _]] in ( set photo = photowebcam; resetAngCabav sessionAvInterfView av3dViewObj; // réinitialise l'orientation de la cabine et de l'avatar applyMateriaux sessionAvInterfView av3dViewObj "photo" ) else 0; _DLGMessageBox _channel winInterface _loc this "TITLE_WEBCAM" nil _loc this "MSG_WEBCAM_OK" nil 0; webcam_CANCEL nil u;; /* callback du timer ' compte à rebours ' pour la prise de vue de la webcam L'image est prise à zéro (logique ! */ fun webcam_timer(obj, u)= let u -> [p n] in if !n then ( _deltimer obj; set webcam_rebours = nil; webcam_OK nil p ) else let n - 1 -> n2 in ( _SETbuttonName btnWebcamOkTimer strcat _loc this "WEBCAM_TIMER" nil strcat " " itoa n2; set webcam_rebours = n2; mutate u <- [p n2]; 0 );; /* callback du bouton 'retardateur' */ fun webcam_OKtimer(obj, u)= _SETbuttonName btnWebcamOkTimer strcat _loc this "WEBCAM_TIMER" nil " 3"; set webcamfont = _CRfont _channel 50 0 0 "Arial"; set webcam_rebours = 3; let 3 -> n in _rfltimer _starttimer _channel 1000 @webcam_timer [u n];; /* callback du relâchement d'une touche du clavier Celle-ci se fait sur l'interface globale du browser (' winInterface ') plutôt que spécifiquement sur ' winAvatar ' pour éviter d'éventuels problèmes de focus. obj -> ObjWin : la fenêtre considérée (ici winInterface) u -> [ObjText ObjWin [S3d H3d H3d H3d H3d H3d ObjSurface]] scan -> I : scancode ascii -> I : code ascii de la touche <- I */ fun webcam_cbKeydown(obj, u, scan, ascii)= if ascii == 32 then // barre espace webcam_OK nil u else 0;; /* callback clic dans ' winInterface ' Lorsque le client clique dans cette fenêtre (celle où s'affiche les images reçues de la webcam), la dernière image est sauvegardée obj -> ObjWin : ' winInterface ' u -> [ObjText ObjWin [S3d H3d H3d H3d H3d H3d ObjSurface]] : paramètres en transfert x -> I : abscisse du clic y -> I : ordonnée du clic btn -> I : bouton de la souris <- I */ fun webcam_cbClick(obj, u, x, y, btn)= webcam_OK nil u;; /* Callback appellée à chaque image disponible Cf discussion ci-dessus ' WEBCAM - mise en oeuvre ' Le contenu de l'image est recue sous forme de chaine, puis elle est redressée et convertit en bitmap. Sur ce bitmap sont affichée les lignes de références permettant à l'utilisateur de caler son visage. Enfin, elle est affichée à la place de ' winAvatar '. obj -> Video : objet video u -> [I] s -> S : contenu de l'image reçue <- I */ fun webcam_capture(obj, u, s)= set lastcapture = _InvertCapBitmap s 320; // :::::: iri M2 // set lastcapture = _InvertCapBitmap s 87; // :::::: iri M1 // set lastWebcam = _SETbitmap lastWebcam lastcapture; // let _SETbitmap _channel _CRbitmap _channel 87 65 lastcapture -> bmp in // :::::: iri M1 let _SETbitmap _CRbitmap _channel 320 240 lastcapture -> bmp in // :::::: iri M2 ( set lastWebcam = _SCPbitmap lastWebcam 0 0 256 256 bmp 40 0 280 240 nil; // :::::: iri M2 // set lastWebcam = bmp; // :::::: iri M1 // _SETbitmap lastWebcam webcam_mirrorVbitmap lastWebcam nil 256 256 0 _CRbitmap _channel 256 1; // ::::: iri METHODE PAR INVERSION DE CHAINES, LIGNE PAR LIGNE // set lastWebcam = webcamVmirror2 lastWebcam nil 256 256 0 0; // ::::: iri METHODE PAR REMPLACEMENT DE PIXEL webcam_rendu3d; _DSbitmap bmp ); // lignes des yeux ( + + ) set lastWebcam = _DRAWline lastWebcam 83 118 95 118 DRAW_SOLID 1 0x007700; set lastWebcam = _DRAWline lastWebcam 89 111 89 125 DRAW_SOLID 1 0x007700; set lastWebcam = _DRAWline lastWebcam 157 118 172 118 DRAW_SOLID 1 0x007700; set lastWebcam = _DRAWline lastWebcam 163 111 163 125 DRAW_SOLID 1 0x007700; // ligne de la bouche ( _ ) set lastWebcam = _DRAWline lastWebcam 113 195 143 195 DRAW_SOLID 1 0x007700; // ligne du nez ( _|_ ) set lastWebcam = _DRAWline lastWebcam 128 120 128 170 DRAW_SOLID 1 0x007700; set lastWebcam = _DRAWline lastWebcam 123 170 133 170 DRAW_SOLID 1 0x007700; // message sur l'utilisation du photomaton let u -> [t] in if t > 0 then ( mutate u <- [t - 500]; _DRAWrectangleText lastWebcam webcamfont 5 5 246 246 make_rgb 255 0 0 TD_TOP|TD_LEFT _loc this "WEBCAM_MSG0" nil; ) else nil; // compte à rebours (s'il y a lieu) if webcam_rebours != nil then _DRAWtext lastWebcam webcamfont 128 128 TD_BASELINE|TD_CENTER make_rgb 0 255 0 itoa webcam_rebours else nil; // affichage du bitmap final _BLTbitmap winInterface lastWebcam 166 32; // :::::: iri M2 // _BLTbitmap winInterface lastWebcam (166-11) 32; // :::::: iri M1 0;; /* initialise le ' photomaton '. obj -> ObjButton u -> [ObjBox ObjButton ObjButton [S3d H3d H3d H3d H3d H3d ObjSurface]] <- I */ fun webcam_open(obj, u)= // la capture est initialisée let 1000000 -> rate in let ( atoi _getress "videocapture" ) -> temp in // périphérique de capture à prendre en compte let if temp == nil || temp == -1 then 0 else temp -> driver in ( set webcamfont = _CRfont _channel 20 0 0 "Arial"; set video = _CRcapWindow _channel winAvatar driver 51 162 320 240 0 rate; // :::::: iri M1 // set video = _CRcapWindow _channel winAvatar driver 51 162 87 65 0 1000000; // :::::: iri M2 set lastWebcam = _CRbitmap _channel 256 256; // :::::: iri M1 // set lastWebcam = _CRbitmap _channel 87 65; // :::::: iri M2 webcam_session3d; _SETcapVideoStart video @webcam_capture [rate / 100] ); // le rendu 3d de la cabine est en stand by set renduONOFF = 0; // Activation des callbacks spécifiques _CBwinKeydown winInterface @webcam_cbKeydown u; _CBwinClick winInterface @webcam_cbClick u; _SETfocus winInterface; // Le nom du bouton est changé ainsi que sa callback _CBbutton btnWebcamOk @webcam_OK u; _CBbutton btnWebcamOkTimer @webcam_OKtimer u; _CBbutton _SETbuttonName btnPhotomaton _loc this "WEBCAM_CANCEL" nil @webcam_CANCEL u; _SHOWbutton btnWebcamOkTimer WINDOW_UNHIDDEN; _SHOWbutton btnWebcamOk WINDOW_UNHIDDEN; // Les autres éléments de l'interface sont désactivés _SHOWwindow winAvatar WINDOW_HIDDEN; _SHOWbutton btnReset WINDOW_HIDDEN; _SHOWbutton btnSShot WINDOW_HIDDEN; _ENcombo boxComboTypeAv 0; _ENcombo boxComboMaterial 0; _ENbutton previousconf 0; _ENbutton nextconf 0; _ENbutton previous 0; _ENbutton next 0; _ENbutton ok 0; _ENbutton cancel 0; _ENbutton chgphoButton 0; 0;; /* *** SHOW / HIDE INTERFACE *** */ /* --------------*/ fun hideInterface()= let [nil nil nil nil nil nil nil] -> z in cbdestroy z;; /* --------------*/ fun showInterface()= // _DLGMessageBox _channel nil "fun showInterface avfile : " avfile 0; // _DLGMessageBox _channel nil "fun showInterface avDefaultFile :" avDefaultFile 0; if winInterface != nil then nil else let _DMSgetZone this "Av3dInterface" nil nil nil ->[wn x y w h] in ( // ::::: iri on lit le fichier de conf av3d_getPref strextr _getpack _checkpack pref; if wn!=nil then set winInterface=_CRwindow _channel wn x y w h WN_CHILDINSIDE|WN_NOCAPTION|WN_NOBORDER "av3d" else set winInterface=_CRwindow _channel DMSwin 200 100 500 420 WN_MENU+WN_MINBOX "av3d"; // :: gestion de l'interface de configuration :: /* ::::: iri ajout du flag ' WINDOW_HIDDEN ' à winPhoto : l'user ne le voit pas (auparavant, il la voyait le temps du traitement de l'ensemble de la fonction reorganisation du code en fonction de la disposition des éléments graphiques */ // ::::: iri invite de l'interface set text = _CRtext _channel winInterface 166 10 256 20 ET_BORDER|ET_ALIGN_CENTER _loc this "AV_CHOOSE" nil; // ::::: iri choix du type d'avatar selon son sexe (cool, sport, ...) _CRtext _channel winInterface 10 32 145 20 ET_BORDER|ET_ALIGN_CENTER _loc this "AV_TYPE" nil; set boxComboTypeAv = _CRcombo _channel winInterface 10 57 145 120 CB_NOEDIT|CB_DOWN " "; // ::::: iri choix de la portion de l'avatar (cheveux, visage, ...) set boxComboMaterial = _CRcombo _channel winInterface 10 82 145 120 CB_NOEDIT|CB_DOWN " "; // ::::: iri nom de la zone de l'avatar qui peut être modifiée set textconf = _SHOWtext _CRtext _channel winInterface 10 107 145 20 ET_BORDER _loc this "" nil WINDOW_HIDDEN; // ::::: iri bouton proposition de modification suivante / précédente set previousconf = _SHOWbutton _CRbutton _channel winInterface 10 132 20 20 0 _loc this "AV_PREV" nil WINDOW_HIDDEN; set nextconf = _SHOWbutton _CRbutton _channel winInterface 45 132 20 20 0 _loc this "AV_NEXT" nil WINDOW_HIDDEN; // ::::: iri bouton de zoom / dezoom set zoomplus = _SHOWbutton _CRbutton _channel winInterface 100 132 20 20 0 _loc this "AV_PLUS" nil WINDOW_HIDDEN; set zoommoins = _SHOWbutton _CRbutton _channel winInterface 135 132 20 20 0 _loc this "AV_MOINS" nil WINDOW_HIDDEN; // ::::: iri photo du visage set winPhoto = _SHOWwindow _CRwindow _channel winInterface 51 162 65 65 WN_CHILDINSIDE|WN_NOCAPTION|WN_DOWN "" WINDOW_HIDDEN; // ::::: iri transparence sur le visage (non utilisée mais gardée pour plus tard éventuellement) // set checkTrans = _CRcheck _channel winInterface 25 93 100 20 0 _loc this "AV_TRANS" nil; // ::::: iri bouton pour changer de photo set chgphoButton = _SHOWbutton _CRbutton _channel winInterface 10 237 145 20 0 _loc this "AV_FILEPHOTO" nil WINDOW_HIDDEN; // ::::: iri accès au photomaton set btnPhotomaton = _SHOWbutton _CRbutton _channel winInterface 10 262 145 20 0 _loc this "AV_CHANGE" nil WINDOW_HIDDEN; // ::::: iri "colorimétrie" // set txtColor = _SHOWtext _CRtext _channel winInterface 10 192 145 20 ET_BORDER|ET_ALIGN_CENTER _loc this "AV_TXTCOLOR" nil WINDOW_HIDDEN; // set txtColor2 = _SHOWtext _CRtext _channel winInterface 10 217 145 20 ET_BORDER|ET_ALIGN_LEFT _loc this "AV_TXTCOLOR2" nil WINDOW_HIDDEN; // set txtColor3 = _SHOWtext _CRtext _channel winInterface 10 287 145 20 ET_BORDER|ET_ALIGN_LEFT _loc this "AV_TXTCOLOR3" nil WINDOW_HIDDEN; // ::::: iri définition du taux de filtre -> créé plus bas car il manque des données à ce stade de la fonction // ::::: iri fenêtre qui contiendra la map de couleur // set winColor = _SHOWwindow _CRwindow _channel winInterface 10 312 145 78 WN_CHILDINSIDE|WN_NOCAPTION|WN_DOWN "" WINDOW_HIDDEN; // ::::: iri "saturation" (filtre de) set txtSaturation = _SHOWtext _CRtext _channel winInterface 10 192 145 20 ET_BORDER|ET_ALIGN_CENTER _loc this "AV_TXTSATURATION" nil WINDOW_HIDDEN; set txtSaturation2 = _SHOWtext _CRtext _channel winInterface 10 217 145 20 ET_BORDER|ET_ALIGN_LEFT _loc this "AV_TXTSATURATION2" nil WINDOW_HIDDEN; set txtSaturation3 = _SHOWtext _CRtext _channel winInterface 10 287 145 20 ET_BORDER|ET_ALIGN_LEFT _loc this "AV_TXTSATURATION3" nil WINDOW_HIDDEN; // ::::: iri suppression / application d'un filtre de couleur // set btnSupprColor = _SHOWbutton _CRbutton _channel winInterface 10 395 70 20 0 _loc this "AV_MOINS" nil WINDOW_HIDDEN; // set btnSetColor = _SHOWbutton _CRbutton _channel winInterface 85 395 70 20 0 _loc this "AV_PLUS" nil WINDOW_HIDDEN; // ::::: iri suppression / application d'un filtre de saturation set btnSupprSaturation = _SHOWbutton _CRbutton _channel winInterface 10 395 70 20 0 _loc this "AV_MOINS" nil WINDOW_HIDDEN; set btnSetSaturation = _SHOWbutton _CRbutton _channel winInterface 85 395 70 20 0 _loc this "AV_PLUS" nil WINDOW_HIDDEN; // ::::: iri définition du taux de filtre et de son intensité -> créés plus bas car il manque des données à ce stade de la fonction // ::::: iri fenêtre où seront affichés les avatars set winAvatar = _CRwindow _channel winInterface 166 32 256 256 WN_CHILDINSIDE|WN_NOCAPTION|WN_DOWN ""; // ::::: iri boutons avatars suivant / précédent set previous = _CRbutton _channel winInterface 442 100 20 20 0 _loc this "AV_PREV" nil; set next = _CRbutton _channel winInterface 442 130 20 20 0 _loc this "AV_NEXT" nil; // ::::: iri zone d'aide set helpconf = _SHOWtext _CRtext _channel winInterface 166 360 324 55 ET_BORDER|ET_ALIGN_CENTER|CT_WORDWRAP _loc this "" nil WINDOW_HIDDEN; // ::::: iri boutons captures webcam set btnWebcamOk = _SHOWbutton _CRbutton _channel winInterface 166 303 123 20 0 _loc this "WEBCAM_CAPTURE" nil WINDOW_HIDDEN; set btnWebcamOkTimer = _SHOWbutton _CRbutton _channel winInterface 299 303 123 20 0 _loc this "WEBCAM_TIMER" nil WINDOW_HIDDEN; // ::::: iri boutons reset orientation set btnReset = _CRbutton _channel winInterface 166 303 123 20 0 _loc this "AV_RESET" nil; // ::::: iri bouton screenshot cabine set btnSShot = _CRbutton _channel winInterface 299 303 123 20 0 _loc this "AV_SSHOT" nil; // ::::: iri boutons de validation set ok = _CRbutton _channel winInterface 200 335 60 20 0 _loc this "AV_OK" nil; set cancel = _CRbutton _channel winInterface 300 335 60 20 0 _loc this "AV_CANCEL" nil; // ::::: iri définition du combo ' boxComboMaterial ' FillCombo boxComboMaterial (_loc this "COMBO_1" nil)::(_loc this "COMBO_2" nil)::(_loc this "COMBO_3" nil)::(_loc this "COMBO_4" nil)::(_loc this "COMBO_5" nil)::(_loc this "COMBO_6" nil)::nil iDefCombo; // ::::: iri définition du combo ' boxComboTypeAv ' FillCombo boxComboTypeAv if !strcmp sex "F" then ssTypeListF else ssTypeListM nil; let getSStype avfile -> s in _SSELcombo boxComboTypeAv if s == nil then "default" else s; // ::::: iri color map // set bmpMapColor = _LDbitmap _channel _checkpack "dms/avatar/av3d/ressources/_colormap.bmp"; // set bmpMapColorShown = _LDbitmap _channel _checkpack "dms/avatar/av3d/ressources/_mcolormap.bmp"; // ::::: iri init photo du visage set photo = if photo != nil then photo else "dms/avatar/av3d/ressources/loading.jpg"; set ClickWindow = mkClickWindow [ nil nil]; // _SETcheck checkTrans flag; // ::::: iri initialisation 3d let _CRsurface _channel 256 256 -> bufferAvInterfView in // :::: jmp obsolète let MX3create _channel 48 48 48 48 48*48 -> sessionAvInterfView in let MX3createSession _channel -> sessionAvInterfView in let M3createShell sessionAvInterfView -> shellAv3dView in ( set sessionAvatarView = sessionAvInterfView; set avfile= if avfile != nil then avfile else avDefaultFile; set currentAvListPos=avpos; // ::::: pos actuelle du client dans la liste ::::: set currentCloTopListPos=clotoppos; set currentCloListPos=clopos; set currentHairListPos=hairpos; set currentFaceListPos=facepos; set currentShoListPos=shopos; M3textureSetGeneralDefaultType sessionAvInterfView TEX_MIPMAP; // M3load sessionAvInterfView "Avatars/Cabine/m3d/cabine01.m3d" shellAv3dView; M3load sessionAvInterfView "Dms/Avatar/av3d/camviewer.m3d" shellAv3dView; M3load sessionAvInterfView "Avatars/Cabine/m3d/cabine01.m3d" shellAv3dView; // M3load sessionAvInterfView avDefaultFile shellAv3dView; //::::: ne pas charger avatar par defaut si avatar deja choisis // M3recursFillMatObj sessionAvInterfView shellAv3dView; let M3getObj sessionAvInterfView "avatar" -> av3dViewObj in let M3getObj sessionAvInterfView "Cabine" -> CabineObj in let M3getObj sessionAvInterfView "camera" -> cameraAvatarView in let M3getObj sessionAvInterfView "Light" -> LightObj in let ( if !strcmp "F" sex then defaultAvatarsListF else defaultAvatarsListM ) -> listavatars in let sizelist listavatars -> sizelistavatars in let ( if !strcmp "F" sex then defaultClothesTopListF else defaultClothesTopListM ) -> listtop in let sizelist listtop -> sizelistclothestop in let ( if !strcmp "F" sex then defaultClothesListF else defaultClothesListM ) -> listbottom in let sizelist listbottom -> sizelistclothes in let ( if !strcmp "F" sex then defaultHairsListF else defaultHairsListM ) -> listhairs in let sizelist listhairs -> sizelisthairs in let ( if !strcmp "F" sex then defaultFacesListF else defaultFacesListM ) -> listface in let sizelist listface -> sizelistfaces in let ( if !strcmp "F" sex then defaultShoesListF else defaultShoesListM ) -> listshoes in let sizelist listshoes -> sizelistshoes in let [sessionAvInterfView shellAv3dView av3dViewObj cameraAvatarView CabineObj LightObj bufferAvInterfView] -> z in ( // ::::: iri définition du taux d'application du filtre // set sliColor = _SHOWslider _CRslider _channel winInterface _GETdefaultFont 10 242 145 40 10 0.0 100.0 75.0 75.0 mkfun4 @color_taux z SLIDER_DRAW_SCALE|SLIDER_INTER_FIXED SLIDER_HIDDEN; set sliSaturationTx = _SHOWslider _CRslider _channel winInterface _GETdefaultFont 10 242 145 40 10 0.0 100.0 75.0 75.0 mkfun4 @saturation_taux z SLIDER_DRAW_SCALE|SLIDER_INTER_FIXED SLIDER_HIDDEN; set sliSaturationIntensity = _SHOWslider _CRslider _channel winInterface _GETdefaultFont 10 312 145 40 10 0.0 100.0 75.0 75.0 mkfun4 @saturation_intensity z SLIDER_DRAW_SCALE|SLIDER_INTER_FIXED SLIDER_HIDDEN; /* _SETsliderBackColor sliColor 0xffffff; _SETsliderPrecisionStep sliColor 1.0; _SETsliderColor sliColor 0x00ff00; _SETsliderCursorColor sliColor 0xff0000; _SETsliderPrecisionMark sliColor 0;*/ _SETsliderBackColor sliSaturationTx 0xffffff; _SETsliderPrecisionStep sliSaturationTx 1.0; _SETsliderColor sliSaturationTx 0x00ff00; _SETsliderCursorColor sliSaturationTx 0xff0000; _SETsliderPrecisionMark sliSaturationTx 0; _SETsliderBackColor sliSaturationIntensity 0xffffff; _SETsliderPrecisionStep sliSaturationIntensity 1.0; _SETsliderColor sliSaturationIntensity 0x00ff00; _SETsliderCursorColor sliSaturationIntensity 0xff0000; _SETsliderPrecisionMark sliSaturationIntensity 0; set HairList=listhairs; set FaceList=listface; set TopList=listtop; set BottomList=listbottom; set ShoesList=listshoes; if sizelistavatars>1 then ( set AvatarsList = listavatars; _CBbutton previous @cbPrevious [checkTrans next z]; _CBbutton next @cbNext [checkTrans previous z] ) else nil; // ::::: iri callbacks _CBcheck checkTrans @cbCheckTrans z; _CBbutton chgphoButton @cbChoosebitmap [text winPhoto z]; _CBbutton btnPhotomaton @webcam_open [text winPhoto z]; _CBbutton cancel @cbCancel z; _CBbutton ok @cbOk [checkTrans z]; _CBbutton btnReset @cbBtnReset z; _CBbutton btnSShot @cbBtnSShot z; /* _CBbutton btnSupprColor @color_suprr z; _CBbutton btnSetColor @color_add z;*/ _CBbutton btnSupprSaturation @saturation_suppr z; _CBbutton btnSetSaturation @saturation_add z; _CBcombo boxComboMaterial @cbboxComboMaterial z; _CBcombo boxComboTypeAv @cbComboTypeAv z; _ENbutton next 0; /* hide next-previous button*/ _ENbutton previous 0; _CBwinDestroy winInterface @cbCancel z; _CBwinDestroy winAvatar @cbCancel z; _CBwinPaint winPhoto @cbPaintE2 nil; _CBwinClick winAvatar @CbClickAvatar z; _CBwinPaint winColor @color_cbWinColorPaint bmpMapColorShown; _CBwinClick winColor @color_click z; // color_cbWinColorPaint nil bmpMapColorShown; // _SETsliderUP sliColor z; /* set bufPhoto = _CRbitmap _channel 64 64; _FILLbitmap bufPhoto 0; */ // ::::: iri cbOpenFile nil [text winPhoto z] _checkpack photo; /* show photo on interface, apply photo on avatar*/ // ::::: iri cbPaintE2 winPhoto nil; // _DLGMessageBox _channel nil "show interface : " avfile 0; set meshDownloading = 1; // :::: iri downloadM3D avfile "browser" [checkTrans next previous z]; downloadM3D avfile "browserinit" [checkTrans next previous z]; // ::::: iri affichage du visage intial (bmp, jpeg ou png) : let _LDbitmap _channel _checkpack photo -> tmp in let if tmp == nil then _LDjpeg _channel _checkpack photo else tmp -> tmp in let if tmp == nil then (let _GETalphaBitmaps _LDalphaBitmap _channel _checkpack photo -> [tmp _] in tmp) else tmp -> tmp in let if tmp == nil then _FILLbitmap _CRbitmap _channel 64 64 0 else tmp -> tmp in let _GETbitmapSize tmp -> [w h] in ( set bufPhoto = _SCPbitmap _CRbitmap _channel 64 64 0 0 63 63 tmp 0 0 w-1 h-1 nil; _DSbitmap tmp ); _rfltimer _starttimer _channel 80 @cbClockInterfView [winAvatar anim_stop_begin+1 z]; cbClockInterfView nil [winAvatar anim_stop_begin z]; 0 ); ); );; // ::::: iri fun __setNewSStype(av, bottom, top, hair, face, shoes)= set AvatarsList = lineextr unzip av; set BottomList = lineextr unzip bottom; set TopList = lineextr unzip top; set HairList = lineextr unzip hair; set FaceList = lineextr unzip face; set ShoesList = lineextr unzip shoes;;