From 7f9996b20c0ffbd8b4de550f4372d9e1c1537453 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 11 Jul 2011 12:31:04 +0000 Subject: [PATCH] * Add avatars to general sorted list of stuff to render * Calcilate sim rotation and position only once git-svn-id: https://radegast.googlecode.com/svn/trunk@973 f7a694da-4d33-11de-9ad6-1127a62b9fcd --- Radegast/GUI/Rendering/Rendering.cs | 90 +++++++++++++++++++++--------- Radegast/GUI/Rendering/RenderingHelpers.cs | 41 +++++++++++--- 2 files changed, 97 insertions(+), 34 deletions(-) diff --git a/Radegast/GUI/Rendering/Rendering.cs b/Radegast/GUI/Rendering/Rendering.cs index 4113c2f..4d899f4 100644 --- a/Radegast/GUI/Rendering/Rendering.cs +++ b/Radegast/GUI/Rendering/Rendering.cs @@ -82,7 +82,7 @@ namespace Radegast.Rendering /// List of prims in the scene /// Dictionary Prims = new Dictionary(); - List SortedPrims; + List SortedObjects; Dictionary Avatars = new Dictionary(); #endregion Public fields @@ -927,7 +927,7 @@ namespace Radegast.Rendering return pos; } - object GetParent(uint localID) + SceneObject GetParent(uint localID) { RenderPrimitive parent; RenderAvatar avi; @@ -955,22 +955,34 @@ namespace Radegast.Rendering pos = new Vector3(99999f, 99999f, 99999f); rot = Quaternion.Identity; - object p = GetParent(prim.ParentID); + SceneObject p = GetParent(prim.ParentID); if (p == null) return; - Primitive parentPrim = null; - if (p is RenderPrimitive) + Vector3 parentPos; + Quaternion parentRot; + if (p.PositionUpdated) { - parentPrim = ((RenderPrimitive)p).Prim; + parentPos = p.SimPosition; + parentRot = p.SimRotation; } - else if (p is RenderAvatar) + else { - parentPrim = ((RenderAvatar)p).avatar; - } + Primitive parentPrim = null; + if (p is RenderPrimitive) + { + parentPrim = ((RenderPrimitive)p).Prim; + } + else if (p is RenderAvatar) + { + parentPrim = ((RenderAvatar)p).avatar; + } - Vector3 parentPos; - Quaternion parentRot; - PrimPosAndRot(parentPrim, out parentPos, out parentRot); + PrimPosAndRot(parentPrim, out parentPos, out parentRot); + p.SimPosition = parentPos; + p.SimRotation = parentRot; + p.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, p.SimPosition); + p.PositionUpdated = true; + } if (p is RenderPrimitive) { @@ -2024,21 +2036,43 @@ namespace Radegast.Rendering GL.PopMatrix(); } - void SortPrims() + void SortObjects() { + SortedObjects = new List(Prims.Count); + lock (Avatars) + { + SortedObjects.AddRange(Avatars.Values.ToArray()); + } + lock (Prims) { - SortedPrims = new List(Prims.Count); - foreach (RenderPrimitive prim in Prims.Values) + SortedObjects.AddRange(Prims.Values.ToArray()); + } + + foreach (SceneObject obj in SortedObjects) + { + obj.PositionUpdated = false; + } + + foreach (SceneObject obj in SortedObjects) + { + if (!obj.PositionUpdated) { - PrimPosAndRot(prim.Prim, out prim.SimPosition, out prim.SimRotation); - prim.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, prim.SimPosition); - SortedPrims.Add(prim); + Primitive prim = null; + if (obj is RenderPrimitive) + prim = ((RenderPrimitive)obj).Prim; + else if (obj is RenderAvatar) + prim = ((RenderAvatar)obj).avatar; + + PrimPosAndRot(prim, out obj.SimPosition, out obj.SimRotation); + obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.SimPosition); + obj.PositionUpdated = true; } - // RenderPrimitive class has IComparable implementation - // that allows sorting by distance - SortedPrims.Sort(); } + + // RenderPrimitive class has IComparable implementation + // that allows sorting by distance + SortedObjects.Sort(); } private void RenderObjects(RenderPass pass) @@ -2049,20 +2083,26 @@ namespace Radegast.Rendering // When rendering alpha faces, draw from back towards the camers // otherwise from those closest to camera, to the farthest - int nrPrims = SortedPrims.Count; + int nrPrims = SortedObjects.Count; if (pass == RenderPass.Picking || pass == RenderPass.Simple) { for (int i = 0; i < nrPrims; i++) { //RenderBoundingBox(SortedPrims[i]); - RenderPrim(SortedPrims[i], pass, i); + if (SortedObjects[i] is RenderPrimitive) + { + RenderPrim((RenderPrimitive)SortedObjects[i], pass, i); + } } } else if (pass == RenderPass.Alpha) { for (int i = nrPrims - 1; i >= 0; i--) { - RenderPrim(SortedPrims[i], pass, i); + if (SortedObjects[i] is RenderPrimitive) + { + RenderPrim((RenderPrimitive)SortedObjects[i], pass, i); + } } } @@ -2139,7 +2179,7 @@ namespace Radegast.Rendering Camera.Step(lastFrameTime); } - SortPrims(); + SortObjects(); if (picking) { diff --git a/Radegast/GUI/Rendering/RenderingHelpers.cs b/Radegast/GUI/Rendering/RenderingHelpers.cs index c88c938..7f0222d 100644 --- a/Radegast/GUI/Rendering/RenderingHelpers.cs +++ b/Radegast/GUI/Rendering/RenderingHelpers.cs @@ -283,22 +283,25 @@ namespace Radegast.Rendering Alpha } - public class RenderPrimitive : IComparable, IDisposable + public enum SceneObjectType + { + None, + Primitive, + Avatar, + } + + public abstract class SceneObject: IComparable { - public Primitive Prim; - public List Faces; public Vector3 SimPosition; public Quaternion SimRotation; public float DistanceSquared; public BoundingVolume BoundingVolume; - - public virtual void Dispose() - { - } + public bool PositionUpdated; + public SceneObjectType Type = SceneObjectType.None; public virtual int CompareTo(object other) { - RenderPrimitive o = (RenderPrimitive)other; + SceneObject o = (SceneObject)other; if (this.DistanceSquared < o.DistanceSquared) return -1; else if (this.DistanceSquared > o.DistanceSquared) @@ -306,6 +309,21 @@ namespace Radegast.Rendering else return 0; } + } + + public class RenderPrimitive : SceneObject, IDisposable + { + public Primitive Prim; + public List Faces; + + public RenderPrimitive() + { + Type = SceneObjectType.Primitive; + } + + public virtual void Dispose() + { + } public override string ToString() { @@ -1522,8 +1540,13 @@ namespace Radegast.Rendering } } - class RenderAvatar + class RenderAvatar : SceneObject { + public RenderAvatar() + { + Type = SceneObjectType.Avatar; + } + public GLAvatar glavatar = new GLAvatar(); public Avatar avatar; public FaceData[] data = new FaceData[32]; -- 2.11.0