private void updateAVtes(RenderAvatar ra) { if (ra.avatar.Textures == null) return; int[] tes = { 8, 9, 10, 11, 19, 20 }; foreach (int fi in tes) { Primitive.TextureEntryFace TEF = ra.avatar.Textures.FaceTextures[fi]; if (TEF == null) continue; if (ra.data[fi] == null || ra.data[fi].TextureInfo.TextureID != TEF.TextureID || ra.data[fi].TextureInfo.TexturePointer < 1 ) { FaceData data = new FaceData(); ra.data[fi] = data; data.TextureInfo.TextureID = TEF.TextureID; DownloadTexture(new TextureLoadItem() { Data = data, Prim = ra.avatar, TeFace = ra.avatar.Textures.FaceTextures[fi] }, true); } } }
private void AddAvatarToScene(Avatar av) { lock (Avatars) { if (Avatars.ContainsKey(av.LocalID)) { // flag we got an update?? updateAVtes(Avatars[av.LocalID]); Avatars[av.LocalID].glavatar.morph(av); } else { GLAvatar ga = new GLAvatar(); //ga.morph(av); RenderAvatar ra = new Rendering.RenderAvatar(); ra.avatar = av; ra.glavatar = ga; updateAVtes(ra); Avatars.Add(av.LocalID, ra); ra.glavatar.morph(av); if (av.LocalID == Client.Self.LocalID) { myself = ra; } } } }
private void updateAVtes(RenderAvatar ra) { if (ra.avatar.Textures == null) return; foreach (int fi in RenderAvatar.BakedTextures.Keys) { Primitive.TextureEntryFace TEF = ra.avatar.Textures.FaceTextures[fi]; if (TEF == null) continue; if (ra.data[fi] == null || ra.data[fi].TextureInfo.TextureID != TEF.TextureID || ra.data[fi].TextureInfo.TexturePointer < 1) { FaceData data = new FaceData(); ra.data[fi] = data; data.TextureInfo.TextureID = TEF.TextureID; ImageType type = ImageType.Baked; if (ra.avatar.COFVersion > 0) // This avatar was server baked { type = ImageType.ServerBaked; } DownloadTexture(new TextureLoadItem() { Data = data, Prim = ra.avatar, TeFace = ra.avatar.Textures.FaceTextures[fi], ImageType = type, BakeName = RenderAvatar.BakedTextures[fi], AvatarID = ra.avatar.ID }, true); } } }
private void UpdateAvatarAnimations(RenderAvatar av) { if (av.avatar.Animations == null) return; av.glavatar.skel.flushanimations(); foreach (Animation anim in av.avatar.Animations) { //Console.WriteLine(string.Format("AvatarAnimationChanged {0} {1}", anim.AnimationID, anim.AnimationSequence)); // Don't play internal turn 180 animations if (anim.AnimationID == new UUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53")) continue; if (anim.AnimationID == new UUID("6883a61a-b27b-5914-a61e-dda118a9ee2c")) continue; av.glavatar.skel.processAnimation(anim.AnimationID); int nofails = 0; if (AssetFetchFailCount.TryGetValue(anim.AnimationID, out nofails)) { if (nofails >= 5) continue; // asset fetch has failed 5 times, give up. } UUID tid = UUID.Random(); skeleton.mAnimationTransactions.Add(tid, av); BinBVHAnimationReader bvh; if (skeleton.mAnimationCache.TryGetValue(anim.AnimationID, out bvh)) { skeleton.addanimation(null, tid, bvh, anim.AnimationID); continue; } Logger.Log("Requesting new animation asset " + anim.AnimationID.ToString(), Helpers.LogLevel.Info); Client.Assets.RequestAsset(anim.AnimationID, AssetType.Animation, false, SourceType.Asset, tid, animRecievedCallback); } av.glavatar.skel.flushanimationsfinal(); skeleton.recalcpriorities(av); }
public static void recalcpriorities(RenderAvatar av) { lock (av.glavatar.skel.mAnimationsWrapper) { //av.glavatar.skel.mAnimationsWrapper.Add(new animationwrapper(b)); //pre calculate all joint priorities here av.glavatar.skel.mPriority.Clear(); foreach (KeyValuePair<UUID, animationwrapper> kvp in av.glavatar.skel.mAnimationsWrapper) { int jpos = 0; animationwrapper ar = kvp.Value; if (ar.anim == null) continue; foreach (binBVHJoint joint in ar.anim.joints) { if (ar.anim == null) continue; //warning struct copy non reference binBVHJointState state = (binBVHJointState)ar.anim.joints[jpos].Tag; if (ar.playstate == animationwrapper.animstate.STATE_STOP || ar.playstate == animationwrapper.animstate.STATE_EASEOUT) continue; //FIX ME need to consider ease out here on priorities somehow int prio = 0; //Quick hack to stack animations in the correct order //TODO we need to do this per joint as they all have their own priorities as well ;-( if (av.glavatar.skel.mPriority.TryGetValue(joint.Name, out prio)) { if (prio > (ar.anim.Priority)) continue; } av.glavatar.skel.mPriority[joint.Name] = ar.anim.Priority; jpos++; //av.glavatar.skel.mAnimationsWrapper[kvp.Key].playstate = animationwrapper.animstate.STATE_EASEIN; } } } }
//Receive all the avatars' models void Objects_AvatarUpdate(object sender, AvatarUpdateEventArgs e) { //leave other regions out temporarily if (e.Simulator.Handle != Client.Network.CurrentSim.Handle) return; Radegast.Rendering.GLAvatar ga = new Radegast.Rendering.GLAvatar(); OpenMetaverse.Avatar av = e.Avatar; Radegast.Rendering.RenderAvatar ra = new Radegast.Rendering.RenderAvatar(); ra.avatar = av; ra.glavatar = ga; newAvatars.Add(av.LocalID, ra); ra.glavatar.morph(av); }