void SortCullInterpolate()
{
SortedObjects = new List<SceneObject>();
VisibleAvatars = new List<RenderAvatar>();
if (RenderSettings.OcclusionCullingEnabled)
{
OccludedObjects = new List<SceneObject>();
}
lock (Prims)
{
foreach (RenderPrimitive obj in Prims.Values)
{
obj.PositionCalculated = false;
}
// Calculate positions and rotations of root prims
// Perform interpolation om objects that survive culling
foreach (RenderPrimitive obj in Prims.Values)
{
if (obj.BasePrim.ParentID != 0) continue;
if (!obj.Initialized) obj.Initialize();
obj.Step(lastFrameTime);
PrimPosAndRot(obj, out obj.RenderPosition, out obj.RenderRotation);
obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.RenderPosition);
obj.PositionCalculated = true;
if (!Frustum.ObjectInFrustum(obj.RenderPosition, obj.BoundingVolume)) continue;
if (LODFactor(obj.DistanceSquared, obj.BoundingVolume.ScaledR) < minLODFactor) continue;
if (!obj.Meshed)
{
if (!obj.Meshing && meshingsRequestedThisFrame < RenderSettings.MeshesPerFrame)
{
meshingsRequestedThisFrame++;
MeshPrim(obj);
}
}
if (obj.Faces == null) continue;
obj.Attached = false;
if (obj.Occluded())
{
OccludedObjects.Add(obj);
}
else
{
SortedObjects.Add(obj);
}
}
// Calculate avatar positions and perform interpolation tasks
lock (Avatars)
{
foreach (RenderAvatar obj in Avatars.Values)
{
if (!obj.Initialized) obj.Initialize();
if (RenderSettings.AvatarRenderingEnabled) obj.Step(lastFrameTime);
PrimPosAndRot(obj, out obj.RenderPosition, out obj.RenderRotation);
obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.RenderPosition);
obj.PositionCalculated = true;
if (!Frustum.ObjectInFrustum(obj.RenderPosition, obj.BoundingVolume)) continue;
VisibleAvatars.Add(obj);
// SortedObjects.Add(obj);
}
}
// Calculate position and rotations of child objects
foreach (RenderPrimitive obj in Prims.Values)
{
if (obj.BasePrim.ParentID == 0) continue;
if (!obj.Initialized) obj.Initialize();
obj.Step(lastFrameTime);
if (!obj.PositionCalculated)
{
PrimPosAndRot(obj, out obj.RenderPosition, out obj.RenderRotation);
obj.DistanceSquared = Vector3.DistanceSquared(Camera.RenderPosition, obj.RenderPosition);
obj.PositionCalculated = true;
}
if (!Frustum.ObjectInFrustum(obj.RenderPosition, obj.BoundingVolume)) continue;
if (LODFactor(obj.DistanceSquared, obj.BoundingVolume.ScaledR) < minLODFactor) continue;
if (!obj.Meshed)
{
if (!obj.Meshing && meshingsRequestedThisFrame < RenderSettings.MeshesPerFrame)
{
meshingsRequestedThisFrame++;
MeshPrim(obj);
}
}
if (obj.Faces == null) continue;
if (!obj.AttachedStateKnown)
{
obj.Attached = IsAttached(obj.BasePrim.ParentID);
obj.AttachedStateKnown = true;
}
if (obj.Occluded())
{
OccludedObjects.Add(obj);
}
else
{
SortedObjects.Add(obj);
}
}
}
// RenderPrimitive class has IComparable implementation
// that allows sorting by distance
SortedObjects.Sort();
}