/// List of prims in the scene\r
/// </summary>\r
Dictionary<uint, RenderPrimitive> Prims = new Dictionary<uint, RenderPrimitive>();\r
- List<RenderPrimitive> SortedPrims;\r
+ List<SceneObject> SortedObjects;\r
Dictionary<uint, RenderAvatar> Avatars = new Dictionary<uint, RenderAvatar>();\r
\r
#endregion Public fields\r
return pos;\r
}\r
\r
- object GetParent(uint localID)\r
+ SceneObject GetParent(uint localID)\r
{\r
RenderPrimitive parent;\r
RenderAvatar avi;\r
pos = new Vector3(99999f, 99999f, 99999f);\r
rot = Quaternion.Identity;\r
\r
- object p = GetParent(prim.ParentID);\r
+ SceneObject p = GetParent(prim.ParentID);\r
if (p == null) return;\r
\r
- Primitive parentPrim = null;\r
- if (p is RenderPrimitive)\r
+ Vector3 parentPos;\r
+ Quaternion parentRot;\r
+ if (p.PositionUpdated)\r
{\r
- parentPrim = ((RenderPrimitive)p).Prim;\r
+ parentPos = p.SimPosition;\r
+ parentRot = p.SimRotation;\r
}\r
- else if (p is RenderAvatar)\r
+ else\r
{\r
- parentPrim = ((RenderAvatar)p).avatar;\r
- }\r
+ Primitive parentPrim = null;\r
+ if (p is RenderPrimitive)\r
+ {\r
+ parentPrim = ((RenderPrimitive)p).Prim;\r
+ }\r
+ else if (p is RenderAvatar)\r
+ {\r
+ parentPrim = ((RenderAvatar)p).avatar;\r
+ }\r
\r
- Vector3 parentPos;\r
- Quaternion parentRot;\r
- PrimPosAndRot(parentPrim, out parentPos, out parentRot);\r
+ PrimPosAndRot(parentPrim, out parentPos, out parentRot);\r
+ p.SimPosition = parentPos;\r
+ p.SimRotation = parentRot;\r
+ p.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, p.SimPosition);\r
+ p.PositionUpdated = true;\r
+ }\r
\r
if (p is RenderPrimitive)\r
{\r
GL.PopMatrix();\r
}\r
\r
- void SortPrims()\r
+ void SortObjects()\r
{\r
+ SortedObjects = new List<SceneObject>(Prims.Count);\r
+ lock (Avatars)\r
+ {\r
+ SortedObjects.AddRange(Avatars.Values.ToArray());\r
+ }\r
+\r
lock (Prims)\r
{\r
- SortedPrims = new List<RenderPrimitive>(Prims.Count);\r
- foreach (RenderPrimitive prim in Prims.Values)\r
+ SortedObjects.AddRange(Prims.Values.ToArray());\r
+ }\r
+\r
+ foreach (SceneObject obj in SortedObjects)\r
+ {\r
+ obj.PositionUpdated = false;\r
+ }\r
+\r
+ foreach (SceneObject obj in SortedObjects)\r
+ {\r
+ if (!obj.PositionUpdated)\r
{\r
- PrimPosAndRot(prim.Prim, out prim.SimPosition, out prim.SimRotation);\r
- prim.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, prim.SimPosition);\r
- SortedPrims.Add(prim);\r
+ Primitive prim = null;\r
+ if (obj is RenderPrimitive)\r
+ prim = ((RenderPrimitive)obj).Prim;\r
+ else if (obj is RenderAvatar)\r
+ prim = ((RenderAvatar)obj).avatar;\r
+\r
+ PrimPosAndRot(prim, out obj.SimPosition, out obj.SimRotation);\r
+ obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.SimPosition);\r
+ obj.PositionUpdated = true;\r
}\r
- // RenderPrimitive class has IComparable implementation\r
- // that allows sorting by distance\r
- SortedPrims.Sort();\r
}\r
+\r
+ // RenderPrimitive class has IComparable implementation\r
+ // that allows sorting by distance\r
+ SortedObjects.Sort();\r
}\r
\r
private void RenderObjects(RenderPass pass)\r
\r
// When rendering alpha faces, draw from back towards the camers\r
// otherwise from those closest to camera, to the farthest\r
- int nrPrims = SortedPrims.Count;\r
+ int nrPrims = SortedObjects.Count;\r
if (pass == RenderPass.Picking || pass == RenderPass.Simple)\r
{\r
for (int i = 0; i < nrPrims; i++)\r
{\r
//RenderBoundingBox(SortedPrims[i]);\r
- RenderPrim(SortedPrims[i], pass, i);\r
+ if (SortedObjects[i] is RenderPrimitive)\r
+ {\r
+ RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+ }\r
}\r
}\r
else if (pass == RenderPass.Alpha)\r
{\r
for (int i = nrPrims - 1; i >= 0; i--)\r
{\r
- RenderPrim(SortedPrims[i], pass, i);\r
+ if (SortedObjects[i] is RenderPrimitive)\r
+ {\r
+ RenderPrim((RenderPrimitive)SortedObjects[i], pass, i);\r
+ }\r
}\r
}\r
\r
Camera.Step(lastFrameTime);\r
}\r
\r
- SortPrims();\r
+ SortObjects();\r
\r
if (picking)\r
{\r
Alpha\r
}\r
\r
- public class RenderPrimitive : IComparable, IDisposable\r
+ public enum SceneObjectType\r
+ {\r
+ None,\r
+ Primitive,\r
+ Avatar,\r
+ }\r
+\r
+ public abstract class SceneObject: IComparable\r
{\r
- public Primitive Prim;\r
- public List<Face> Faces;\r
public Vector3 SimPosition;\r
public Quaternion SimRotation;\r
public float DistanceSquared;\r
public BoundingVolume BoundingVolume;\r
-\r
- public virtual void Dispose()\r
- {\r
- }\r
+ public bool PositionUpdated;\r
+ public SceneObjectType Type = SceneObjectType.None;\r
\r
public virtual int CompareTo(object other)\r
{\r
- RenderPrimitive o = (RenderPrimitive)other;\r
+ SceneObject o = (SceneObject)other;\r
if (this.DistanceSquared < o.DistanceSquared)\r
return -1;\r
else if (this.DistanceSquared > o.DistanceSquared)\r
else\r
return 0;\r
}\r
+ }\r
+\r
+ public class RenderPrimitive : SceneObject, IDisposable\r
+ {\r
+ public Primitive Prim;\r
+ public List<Face> Faces;\r
+\r
+ public RenderPrimitive()\r
+ {\r
+ Type = SceneObjectType.Primitive;\r
+ }\r
+\r
+ public virtual void Dispose()\r
+ {\r
+ }\r
\r
public override string ToString()\r
{\r
}\r
}\r
\r
- class RenderAvatar\r
+ class RenderAvatar : SceneObject\r
{\r
+ public RenderAvatar()\r
+ {\r
+ Type = SceneObjectType.Avatar;\r
+ }\r
+\r
public GLAvatar glavatar = new GLAvatar();\r
public Avatar avatar;\r
public FaceData[] data = new FaceData[32];\r