/*to do : - revoir anim marche/arret local/autres + list anim - patcher le setPos pour interpolation des pos - changement de photo ou de mesh : ne pas tout recréer ? -> a voir - fonctions d'ignore à implémenter - gérer des squelettes d'anim - pb touche F5 = reload sous IE ! - message loading browser à localiser */ /*av3d Avatar - DMS - mar 98 - by Boris HAJDUK based on Module Photo*/ /*modified - feb 99 - by Christophe LOREK*/ /*modified - mar 99 - by Michel Dureau & Sebastien Deneux -> camera dynamique*/ /*modified - mar 99 - by Michel Dureau -> collision camera dynamique*/ /*modified - Jul 99 - by Pierre Lena -> Epuration du code*/ /* rev. January 2000 - by Sébastien DENEUX */ typeof class = S;; var type="av3d";; typeof avfile=S;;/*local avatar mesh file*/ var configPath="locked/conf/av3d/viewLevel_";;/*path used to save current view mode*/ /*distance camera pour vue troisieme personne (niveaux de zoom)*/ /*cela represente la distance de la camera par rapport au point (0 0)*/ /*au pied de l'avatar et selon un certain angle*/ var viewLevelF6=0;; /*par default pas de vues troisieme personne*/ var viewLevelF7=0;; var viewLevelF8=0;; var viewLevel=0;;/*current view level*/ /*animations*/ /*provisoire : les squelettes d'animations doivent être exernalisés dans des fichiers à part*/ var anim_walk_begin=0;; var anim_walk_end=39;; var anim_stop_begin=40;; var anim_stop_end=100;; var delta_b=0;; /*utilisée pour deplacement caméra suivant x*/ var bottom_limit_first_person_view=-15;;/*limites de ce deplacement suivant les vues*/ var top_limit_first_person_view=90;; var bottom_limit_third_person_view=200;; var top_limit_third_person_view=300;; typeof ArrivalZoneSize=I;; /*random sur les positions d'arrivée des avatars (taille de la zone)*/ typeof coll_enabled=I;; /*1 si collisions activées*/ /*var coll_x=15;;*/ /* 1/2 largeur Obb collision avatar*/ /*var coll_y=80;;*/ /* 1/2 hauteur Obb collision avatar*/ /*var coll_z=20;;*/ /* 1/2 profondeur Obb collision avatar*/ var hauteurAvatarSol=0;; var hauteurOrientation=170;; var canFly=0;;/*if the avatar can move on y axe*/ /* les 3 variables suivantes définissent les caractéristiques de la camera (réglables)*/ /* la camera va se trouver a une distance av3dCamDist sur une droite imaginaire */ /* d'angle av3dCamAngle par rapport a l'axe y et passant par 0 */ typeof av3dCamAngle=F;; typeof av3dCamDist=I;; var av3dCamSpeed=5;; /*vitesse de la camera dynamique par defaut*/ typeof ModeVue = S;; /*premierePersonne OU troisiemePersonneDynamique*/ typeof linkCamAvatar=I;; /*flag qui permet de determiner si la camera a ete linkee au pere de l'avatar*/ typeof shcamColl=H3d;; typeof h=H3d;; typeof oldav3CamDist=I;;/*utilisé pour transition vue 3ème à 1ère personne*/ /*shcam linkée à l'avatar en mode camera statique*/ /*shell qui represente la position de la caméra (cette position est réglable)*/ typeof shcam=H3d;; typeof sh0 = H3d;; typeof sh = H3d;; /*dummyCam : shell qui represente la position idéale de la caméra (cette position est réglable)*/ typeof dummyCam=H3d;; /*dummyTarget : shell qui représente la position de la cible de la camera (reglable)*/ typeof dummyTarget=H3d;; /*=position avatar avec z variable*/ /*systeme de collision pour la camera car elle ne se trouve pas forcement dans la meme boite de deplacement que l'avatar*/ typeof collCam=InBox;; typeof anim_list=[[S I I] r1];; /*[obname currentAnimState defaultMesh?]*/ /*----------------*/ fun animbyName(x,name)= let x -> [currentName _ _] in !strcmp currentName name;; /*--------------------*/ fun destroyLocalAvatar(o)= set anim_list=remove_from_list anim_list (search_in_list anim_list @animbyName (ObName o)); M3delObj session M3getFather session ObGetMain o; 0;; /*--------------------*/ fun destroyAvatar(o)= set anim_list=remove_from_list anim_list (search_in_list anim_list @animbyName (ObName o)); M3delObj session ObGetMain o; 0;; /*--------------------*/ /* anime l'avatar du joueur, animation par defaut pour avatar par defaut*/ /*fun animAvatarDefault(o,q)= let q->[x avatar oldtick] in let _tickcount -> currenttick in let currenttick - oldtick -> deltaTick in if deltaTick>=50 then let (100+x)&4095 -> x in let M3getFirstSon session ObGetMain o -> h in let if x&2048 then 3072-x else x-1024 -> z in ( let M3getObjAng session avatar -> [a _ c] in M3setObjAng session avatar [a z c]; let M3getObjVec session avatar -> [a b c] in M3setObjVec session avatar [a (z>>6)-hauteurOrientation+hauteurAvatarSol c]; mutate q<-[x avatar currenttick]; 0 ) else nil;;*/ /*--------------------*/ /*anime l'avatar du joueur en boucle*/ fun animAvatarM3dStopLoop(o,q)= let q->[avatar oldtick animCurrentPos animBeginPos animEndPos] in let _tickcount -> currenttick in let currenttick - oldtick -> deltaTick in if deltaTick>=30 then ( if animCurrentPos>animEndPos then set animCurrentPos=animBeginPos else nil; M3setAnimKey session avatar animCurrentPos; mutate q<-[avatar currenttick animCurrentPos+1 animBeginPos animEndPos]; 0 ) else nil;; /*--------------------*/ /*check if the anim exists in the mesh*/ /*run the anim on the mesh*/ fun runAnimStop(o,avatar)= let search_in_list anim_list @animbyName (ObName o) -> a in let a -> [_ _ isDefault] in ( mutate a <- [_ 0 _]; let M3getAnimLength session avatar -> animLength in if (animLength==0) then nil /*&& isDefault then (ObCbAnim o mkfun2 @animAvatarDefault [0 avatar _tickcount];0)*/ else if (anim_stop_begin>=anim_stop_end)||(anim_stop_end>animLength) then 0 /*no anim*/ else (ObCbAnim o mkfun2 @animAvatarM3dStopLoop [avatar _tickcount anim_stop_begin anim_stop_begin anim_stop_end];0) );; /*--------------------*/ /* anime l'avatar du joueur*/ fun animAvatarM3dWalkOnce(o,q)= let q->[avatar oldtick animCurrentPos animBeginPos animEndPos] in let _tickcount -> currenttick in let currenttick - oldtick -> deltaTick in if deltaTick>=30 then ( if animCurrentPos>animEndPos then (runAnimStop o avatar;0) else nil; /*stop the anim*/ M3setAnimKey session avatar animCurrentPos; mutate q<-[avatar currenttick animCurrentPos+1 animBeginPos animEndPos]; 0 ) else nil;; /*--------------------*/ /*check if the anim exists in the mesh*/ /*run the anim on the mesh*/ fun runAnimWalk(o,avatar)= let search_in_list anim_list @animbyName (ObName o) -> a in let a -> [_ _ isDefault] in ( mutate a <- [_ 1 _]; let M3getAnimLength session avatar -> animLength in if (animLength==0) then nil /*&& isDefault then (ObCbAnim o mkfun2 @animAvatarDefault [0 avatar _tickcount];0)*/ else if (anim_walk_begin>=anim_walk_end)||(anim_walk_end>animLength) then 0 /*no anim*/ else (ObCbAnim o mkfun2 @animAvatarM3dWalkOnce [avatar _tickcount anim_walk_begin anim_walk_begin anim_walk_end];0) );; /*--------------------*/ /* recalcule et deplace la position de la camera grace à ses caracteristiques*/ /* est appellee apres modification des caracteristiques de la camera*/ /* generalement lorsqu'on change de mode de vue */ fun updateCamPos()= let [0 0] -> [yc zc] in ( set yc = (ftoi ((itof av3dCamDist) *. sin av3dCamAngle)); set zc = (- (ftoi ((itof av3dCamDist) *. cos av3dCamAngle)))+20; if linkCamAvatar then ( M3setObjVec session shcam [0 yc zc]; M3setObjVec session shcamColl [0 yc zc]; M3setObjAng session shcam (M3angularTarget (M3getObjVec session shcam) (M3getObjVec session dummyTarget)); 0 ) else ( M3setObjVec session dummyCam [0 yc zc]; M3setObjAng session dummyCam (M3angularTarget (M3getObjVec session dummyCam) (M3getObjVec session dummyTarget)); 0 ); );; /*--------------------*/ /* cette fonction assure le dynamisme de la camera en suivant la dummyCam */ /* a une certaine vitesse, la position et l'angle de la camera est constamment*/ /* mis a jour. Cette fonction est une callback en post render */ fun moveCamera(objb,i2,param)= let param ->[o sh] in let M3getObjVec session shcam -> [xc yc zc] in let M3calcPosRef session dummyCam shell -> [[xdw ydw zdw] _] in { /* calcul des nouveaux coordonnees de la camera (interpolation )*/ let (xc + (xdw - xc) / av3dCamSpeed) -> a in let (yc + (ydw - yc) / av3dCamSpeed) -> b in let (zc + (zdw - zc) / av3dCamSpeed) -> c in /* on reccupere la distance entre la vraie camera et la camera ideale */ /* afin de tester le moment ou celles ci vont etre suffisament proche */ /* l'une de l'autre pour passer en mode premiere personne statique */ let M3calcPosRef session dummyCam shcam -> [[x y z] _] in { /* on reccupere la boite dans laquelle se trouve la camera pour pouvoir effectuer le test de collision dans cette boite et non celle ou se trouve l'avatar */ M3setObjVec session shcamColl [xc yc zc]; let inboxTesting collCam session shcamColl [0 0 0] ->[newbox _] in set collCam.curboxIB = newbox; /*test de collision avec la camera selon le vecteur de deplacement souhaite*/ let inboxTesting collCam session shcamColl [(a-xc) (b-yc) (c-zc)] ->[newb [npx npy npz]] in ( /*on reccupere les coordonnees proposes comme solution a la collision et on les affecte a la camera et a sa sphere de collision si pas de collision alors les coordonnes restent a b et c */ M3setObjVec session shcam [npx npy npz]; M3setObjVec session shcamColl [npx npy npz]; ); /* calcul des angles a appliquer a la camera pour qu'elle vise la dummyTarget */ let M3calcPosRef session dummyTarget shell -> [t _] in M3setObjAng session shcam (M3angularTarget (M3getObjVec session shcam) t); /*transition vue troisieme personne vers vue premiere personne : on garde la dynamique JQ on se trouve juste derriere la tete de l'avatar*/ if !strcmp ModeVue "PremierePersonne" then if (( (oldav3CamDist>500) && (z<50) && (z>(-50)) ) || ( (oldav3CamDist<=500) && (z<60) && (z>(-60)) )) then { M3link session shcam sh; set linkCamAvatar = 1; ObCbPostRender o nil; updateCamPos; } else nil else nil; }; 0 };; /*--------------------*/ /* definit les parametres de cette vue */ fun vuePremierePersonne(o,sh)= /*_fooS "passage 1ème personne";*/ set delta_b=0; /*init angle suivant x*/ set ModeVue = "PremierePersonne"; set oldav3CamDist= av3dCamDist; set av3dCamDist = 140; set av3dCamAngle = atof "1.5"; /*le unlink est fait dans movecamera (passage en statique)*/ /*la premiere initialisation du unlink est faire ds le constructeur*/ updateCamPos;; /*--------------------*/ /* definit les parametres de cette vue et definit la callback pour le dynamisme*/ fun vueTroisiemePersonneDynamique(o,sh,distanceCamera)= /*_fooS "passage 3ème personne dynamique";*/ set delta_b=0; /*init angle suivant x*/ let strcatn configPath::DMSname::".conf"::nil -> configFileName in _storepack strbuild ("viewLevel"::(itoa distanceCamera)::nil)::nil configFileName; set viewLevel=distanceCamera; set collCam.curboxIB = coll.curboxIB; set ModeVue = "TroisiemePersonne"; ObCbPostRender o mkfun3 @moveCamera [o sh]; let M3calcPosRef session shcam shell -> [coord_t CamMatrix] in let M3angularFromMatrix CamMatrix -> angle_t in ( M3setObjVec session shcamColl coord_t; M3setObjVec session shcam coord_t; M3setObjAng session shcam angle_t ); M3link session shcam shell; set linkCamAvatar = 0; set oldav3CamDist= av3dCamDist; set av3dCamDist = distanceCamera; set av3dCamAngle = atof "0.5"; updateCamPos;; /*--------------------*/ /* Positionne l'avatar a l'arrivée et lors des repositionnement*/ fun Setpos(o,v,a)= /*_showconsole; _fooS "*** set pos";*/ let M3getFather session o.o3Ob -> f in let v->[xn yn zn] in let a->[an bn cn] in let M3getObjVec session o.o3Ob ->[_ yo _] in let (if ArrivalZoneSize>0 then ((mod rand 2*ArrivalZoneSize)-ArrivalZoneSize) else 0) -> xrand in let (if ArrivalZoneSize>0 then ((mod rand 2*ArrivalZoneSize)-ArrivalZoneSize) else 0) -> zrand in ( /*_fooS strcat "*** yn =" itoa yn; _fooS strcat "*** yo =" itoa yo; */ if v==nil then nil else M3setObjVec session f [xn+xrand yn-yo-170 zn+zrand]; /*random arrival in a zone*/ /*MODIF avt yn = 0*/ M3setObjAng session f [an 0 0]; /*M3setObjAng session o.o3Ob [0 bn cn];*/ M3setObjAng session o.o3Ob [0 0 cn]; /*ne pas prendre en compte l'orientation suivant x des pos du c3D*/ /*to do : reprendre l'angle x pour la dummy cam !!! */ if coll==nil || o!=owner then nil else inboxPlacing coll session f; 0; if viewLevel!=0 then vueTroisiemePersonneDynamique o sh viewLevel else nil; 0; );; /*--------------------*/ /*when an avatar moves (excepted local avatar)*/ fun SetposOthersAvatars(o,v,a,param)= if cel.Cel3dinterpolate then C3D_UpdateDest o v else ( M3setObjVec session o.o3Ob v; nil ); M3setObjAng session o.o3Ob a; let search_in_list anim_list @animbyName (ObName o) -> [_ a _] in if a==1 then nil else let param -> [avatar] in runAnimWalk o avatar; 0;; /*--------------------*/ /* permet le controle des differents parametres de la camera au clavier */ fun gestionTouches(o,t,sh)= let t -> [_ code] in if code==65474 then /* vue premiere personne*/ (vuePremierePersonne o sh; let strcatn configPath::DMSname::".conf"::nil -> configFileName in _storepack strbuild ("viewLevel"::"0"::nil)::nil configFileName; set viewLevel=0) else if ((code==65475)&&(viewLevelF6!=0)) then /* vue troisieme personne ET camera dynamique*/ vueTroisiemePersonneDynamique o sh viewLevelF6 else if ((code==65476)&&(viewLevelF7!=0)) then /**/ vueTroisiemePersonneDynamique o sh viewLevelF7 else if ((code==65477)&&(viewLevelF8!=0)) then /**/ vueTroisiemePersonneDynamique o sh viewLevelF8 else nil;; /*--------------------*/ /*applique la photo sur le materiau*/ fun applyPhotoToMaterial(mat,image,f)= let M3copyMaterialTexture session mat -> t in if f then let _GETpixel16 image 0 0 -> colRGB in let ((colRGB&16252928)>>16)+(colRGB&63488)+((colRGB&248)<<16) -> colBGR in (M3setType session mat MAT_TRANSP|M3getType session mat; M3setTransparencyColor session t colBGR) else nil; M3blitTexture16 session (M3copyMaterialTexture session mat) image;; /*--------------------*/ /*parcours l'arboresence de l'objet 3D*/ fun setMaterial(h,mat,image,f)= if h==nil then nil else ( let M3copyObjMaterial session h mat -> mat2 in if mat2!=nil then applyPhotoToMaterial mat2 image f else nil; setMaterial (M3getFirstSon session h) mat image f; setMaterial (M3getBrother session h) mat image f; 0 );; /*--------------------*/ /*mappage visage avatar*/ fun applyface(s,o,f)= let _LDbitmap _channel _checkpack s -> imagebmp in let if imagebmp==nil then _LDjpeg _channel _checkpack s else imagebmp -> image in ( /*_DLGMessageBox _channel nil "applyface" ObName o 0;*/ /*DEBUG SEB*/ let M3getMat session "photo" -> mat in setMaterial (ObGetMain o) mat image f; _DSbitmap image; 0 );; /*--------------------*/ /*déplacement caméra*/ /*reprise code du c3D3*/ fun movcam2av3d(s,h,f,v,ang)= let ang->[an bn cn] in let v->[x y z] in let M3getObjVec s f -> oldpos in let coll.curboxIB ->oldbox in (if coll==nil then let M3getGlobalVec s f v->w in let M3testColl s f shell w 2 -> [_ cl wc nc] in if wc==nil then (M3movObjExt s f w; 0) else if nc==nil then let M3getFather s cl->oldfath in (M3unLink s cl; movcam2av3d s h f v ang; M3link s cl oldfath; 0) else let w->[wx wy wz] in let nc->[nx ny nz] in let [wx+nx wy+ny wz+nz]-> ww in (if nil==M3testColl s f shell ww 2 then M3movObjExt s f ww else M3movObjExt s f wc; 0) else (let inboxTesting coll s f v->[newb [npx npy npz]] in let oldpos->[opx opy opz] in let [npx-opx npy-opy npz-opz]->w in let M3testColl s f shell w 2 -> [_ cl wc nc] in if wc==nil then (M3movObjExt s f w; set coll.curboxIB=newb; 0) else if nc==nil then let M3getFather s cl->oldfath in (M3unLink s cl; movcam2av3d s h f v ang; M3link s cl oldfath; 0) else let w->[wx wy wz] in let nc->[nx ny nz] in let [wx+nx wy+ny wz+nz]-> ww in if nil==M3testColl s f shell ww 2 then (M3movObjExt s f ww; let M3getObjVec s f -> [ox2 oy2 oz2] in let inboxTesting coll s f [0 0 0] ->[newb2 [npx npy npz]] in if ox2==npx && oy2==npy && oz2==npz then (set coll.curboxIB=newb2; 0) else (M3setObjVec s f oldpos; M3movObjExt s f wc; set coll.curboxIB=newb; 0)) else (M3movObjExt s f wc; set coll.curboxIB=newb; 0); 0); if ang==nil then nil else (M3rotateObjExt s h [0 bn cn]; M3rotateObjExt s f [an 0 0]); if nil==M3testInter s f shell then nil else (M3setObjVec s f oldpos; set coll.curboxIB=oldbox); 0);; /*--------------------*/ /*CB control déplacement*/ /*reprise code du c3D3*/ fun controlAv3d(o,z,param)= let param->[avatar] in let z->[v ang] in let ang -> [a b c] in let v -> [x y z] in ( /*the local avatar is moving*/ if linkCamAvatar then nil /*pas d'anim de marche quand vue premiere personne*/ else if y+z then let search_in_list anim_list @animbyName (ObName o) -> [_ a _] in if a==1 then nil else runAnimWalk o avatar else nil; let o.o3Ob -> h in let session -> s in let M3getFather s h -> f in ( /*gestion deplacement caméra suivant angle x*/ if linkCamAvatar then /*first person view*/ if b>0 then let if b<500 then 500 else b -> b2 in if delta_b-500 then -500 else b -> b2 in if delta_b>bottom_limit_first_person_view then set delta_b=delta_b+b2/500 else nil else nil else /*third person view*/ /* if b>0 then if av3dCamAngle>. (atof "-1.35") then (set av3dCamAngle=av3dCamAngle-.atof "0.05";0) else nil else if b<0 then if av3dCamAngle<. (atof "1.45") then (set av3dCamAngle=av3dCamAngle+. atof "0.05";0) else nil else nil;*/ /*_showconsole; _fooS strcat "av3dCamAngle = " ftoa av3dCamAngle;*/ if b>0 then if delta_b<(top_limit_third_person_view+viewLevel) then set delta_b=delta_b+b/100 else nil else if b<0 then if delta_b>(bottom_limit_third_person_view-viewLevel) then set delta_b=delta_b+b/100 else nil else nil; let M3getObjVec session avatar -> [xa ya za] in ( /*_showconsole; _fooS strcat "**ya = " itoa ya; _fooS strcat "delta_b = " itoa delta_b;*/ if linkCamAvatar then M3setObjVec session dummyTarget [xa /*ya+*/138+delta_b za+40] else M3setObjVec session dummyTarget [xa /*ya+*/135+delta_b za+40]; ); updateCamPos; if canFly then movcam2av3d s h f [x y z] [a 0 c] else movcam2av3d s h f [x 0 z] [a 0 c]; if gravity then movcam2av3d s h f [0 (-gravity) 0] nil else nil; 0; ); );; /*--------------------*/ /*change the avatar mesh*/ fun applyMesh(o,meshFileName)= /*_DLGMessageBox _channel nil "applyMesh" meshFileName 0;*/ let search_in_list anim_list @animbyName (ObName o) -> a in mutate a <- [_ _ if !strcmp meshFileName avfile then 1 else 0]; let ObGetMain o -> OB in let M3getObjVec session OB -> pos in let M3getObjAng session OB -> ang in ( M3unLink session (M3getFirstSon session OB); M3delObj session (M3getFirstSon session OB); M3load session meshFileName nil; let (M3getObj session "avatar") -> avatar in ( M3recursFillMatObj session avatar; let M3getObjVec session avatar -> [x y z] in ( /*_showconsole; _fooS "###applyMesh"; _fooS strcat "###x=" itoa x; _fooS strcat "###y=" itoa y; _fooS strcat "###z=" itoa z;*/ M3setObjVec session avatar [x y+hauteurAvatarSol-hauteurOrientation z]; /**MODIF SD pour s'orienter correctement vers l'avatar (a partir des autres classes)**/ ); if o==owner then let M3createSphere session 50 -> chnew in ( M3setObjVec session chnew [0 100 0]; M3link session chnew OB; ) else if coll_enabled then /* On recrée les boites de collision des avatars */ /*let M3createObb session [coll_x coll_y coll_z] -> chnew in*/ let M3createSphere session 1 -> chnew in ( M3setObjVec session chnew [0 100 0]; M3link session chnew OB; ) else nil; M3link session avatar OB; if o==owner then (ObCbControl o mkfun3 @controlAv3d [avatar];0)/*CB gestion deplacement*/ else (ObCbSetpos o mkfun4 @SetposOthersAvatars [avatar];0); /*avatar has changed*/ runAnimStop o avatar;/*run the anim on the mesh*/ ); M3setObjVec session (ObGetMain o) pos; M3setObjAng session (ObGetMain o) ang; M3freeMemory session; 0; );; /*--------------------*/ /* creation des shells et mise ne place des differents liens pour l'etat */ /* initial de l'avatar, que cela soit le sien ou ceux des autres joueurs */ fun newOb2(o)= if o==owner then /*local avatar*/ ( let strcatn configPath::DMSname::".conf"::nil -> configFileName in /*get the possible view <= previous view*/ let strextr _getpack _checkpack configFileName -> l in let getInfo l "viewLevel" -> res in ( /*_showconsole; _fooS strcat "** olf view = " res; _fooS strcat "** distance F6 = " itoa viewLevelF6; _fooS strcat "** distance F7 = " itoa viewLevelF7; _fooS strcat "** distance F8 = " itoa viewLevelF8;*/ if res==nil then set viewLevel=0 else if (viewLevelF8!=0) && (atoi res)>=viewLevelF8 then set viewLevel = viewLevelF8 else if (viewLevelF7!=0) && (atoi res)>=viewLevelF7 then set viewLevel = viewLevelF7 else if (viewLevelF6!=0) && (atoi res)>=viewLevelF6 then set viewLevel = viewLevelF6 else set viewLevel=0; /*_fooS strcat "set view etablit : " itoa viewLevel;*/ ); set sh = M3createShell session; set sh0 = M3createShell session; set shcam = M3createShell session; M3load session avfile nil; /*Chargement de l'avatar par defaut*/ let M3getObj session "avatar" -> avatar in ( set avatar=M3getObj session "avatar"; M3recursFillMatObj session avatar; M3link session avatar sh0; let M3getObjVec session avatar -> [x y z] in M3setObjVec session avatar [x y+hauteurAvatarSol-hauteurOrientation z]; /**MODIF SD pour s'orienter correctement vers l'avatar (a partir des autres classes)**/ /*collisions avatar*/ /*set h= M3createObb session [coll_x coll_y coll_z];*/ set h=M3createSphere session 50; M3setObjVec session h [0 100 0]; M3link session h sh; set shcamColl = M3createSphere session 20; /*sphere de collision pour la camera*/ M3link session sh0 sh; /*link yeux*/ M3link session shcam sh; /****************************************/ set dummyCam = M3createShell session; M3link session dummyCam sh; /****************************************/ set dummyTarget = M3createShell session; let M3getObjVec session avatar -> [xa ya za] in ( if linkCamAvatar then M3setObjVec session dummyTarget [xa /*ya+*/138+delta_b za+40] else M3setObjVec session dummyTarget [xa /*ya+*/135+delta_b za+40]; ); M3link session dummyTarget sh; M3link session sh shellav; /* On relie le shell a celui du C3D */ ObSetMain o shcam; ObCbDestroy o @destroyLocalAvatar; runAnimStop o avatar;/*run the anim on the mesh*/ ObSetCam o; M3setObjVec session sh0 [0 hauteurOrientation 0]; /**MODIF SD pour s'orienter correctement vers l'avatar (a partir des autres classes)**/ ObSetMain o sh0; /*par defaut, vue premiere personne (+ link)*/ M3link session shcam sh; set linkCamAvatar = 1; ObCbPostRender o nil; vuePremierePersonne o sh; ObCbControlKeyDown o mkfun3 @gestionTouches sh; /*CB gestion touches clavier*/ ObCbControl o mkfun3 @controlAv3d [avatar]; /*CB gestion deplacement*/ /* systeme de collision pour la camera initialise avec celui de l'avatar */ set collCam=mkInBox [coll.nameIB coll.sIB coll.curboxIB coll.rayonIB coll.gravityIB]; ObCbSetpos o @Setpos; /*first time only*/ Usend this ObUi o "getMeshPhoto" nil; /*ask the server for the avatar mesh and photo*/ 0 ) ) else /*autres avatars*/ let M3createShell session -> sh in ( M3load session avfile nil; let M3getObj session "avatar" -> avatar in ( let M3getObjVec session avatar -> [x y z] in M3setObjVec session avatar [x y+hauteurAvatarSol-hauteurOrientation z]; /*avatar à hauteurAvatarSol cm du sol*/ /**MODIF SD pour s'orienter correctement vers l'avatar (a partir des autres classes)**/ M3recursFillMatObj session avatar; if (coll_enabled) then let M3createSphere session 1 -> chnew in /*let M3createObb session [coll_x coll_y coll_z] -> chnew in*/ ( M3setObjVec session chnew [0 100 0]; M3link session chnew sh; ) else nil; M3link session avatar sh; ObSetMain o sh; ObCbDestroy o @destroyAvatar; runAnimStop o avatar; ObCbSetpos o mkfun4 @SetposOthersAvatars [avatar]; Usend this ObUi o "getMeshPhoto" nil; /*ask the server for the avatar mesh and photo*/ 0 ) );; /*--------------------*/ fun cbcomm(ui,action,param,o)= if !strcmp action "changeView" then /*SD*/ let strextr param -> l in let hd switchstr l "viewLevel" -> level in if level==nil || (!strcmp level "0") || param==nil then (vuePremierePersonne o sh; let strcatn configPath::DMSname::".conf"::nil -> configFileName in _storepack strbuild ("viewLevel"::"0"::nil)::nil configFileName; set viewLevel=0) else vueTroisiemePersonneDynamique o sh atoi level else if !strcmp action "setMeshPhoto" then let strextr param -> l in let getInfo l "sign" -> sign in let getInfo l "f" -> f in let getInfo l "meshFileName" -> meshFileName in (/*_DLGMessageBox _channel nil "setMeshPhoto" param 0;*/ /*DEBUG SEB*/ if meshFileName==nil then nil else applyMesh o meshFileName; if sign==nil then nil else applyface sign o atoi f ) else if !strcmp action "setAvDefFile" then (set avfile=param;newOb2 o) else nil;; /*--------------------*/ fun newOb(o)= set anim_list=[(ObName o) 0 1]::anim_list; UcbComm this ObUi o mkfun4 @cbcomm o; if o==owner then Usend this ObUi o "init" nil else nil; /*SD*/ if avfile==nil then /*get default avfile*/ Usend this ObUi o "avDefFile" nil else newOb2 o; 0;; /*--------------------*/ fun IniPlug(file)= srand _tickcount;/*initialize random*/ /*paramètres distance caméra pour vue troisième personne (si le paramètre n'existe pas, la vue est inhibée)*/ let hd Obgetglobalress "viewLevelF6" -> res in set viewLevelF6 = (if res==nil then 0 else atoi res); let hd Obgetglobalress "viewLevelF7" -> res in set viewLevelF7 = (if res==nil then 0 else atoi res); let hd Obgetglobalress "viewLevelF8" -> res in set viewLevelF8 = (if res==nil then 0 else atoi res); let hd Obgetglobalress "arrivalZoneSize" -> res in set ArrivalZoneSize = (if res==nil then 0 else atoi res); let hd Obgetglobalress "collEnabled" -> res in set coll_enabled = (if (atoi res)==1 then 1 else 0); let hd Obgetglobalress "canFly" -> res in set canFly = (if (atoi res)==1 then 1 else 0); set class=getInfo strextr _getpack _checkpack file "name"; PlugRegister class @newOb nil; 0;;