private void RenderAvatars(RenderPass pass)
{
if (!RenderSettings.AvatarRenderingEnabled) return;
lock (Avatars)
{
GL.EnableClientState(ArrayCap.VertexArray);
GL.EnableClientState(ArrayCap.TextureCoordArray);
GL.EnableClientState(ArrayCap.NormalArray);
int avatarNr = 0;
foreach (RenderAvatar av in VisibleAvatars)
{
avatarNr++;
// Whole avatar position
GL.PushMatrix();
// Prim roation and position
av.UpdateSize();
GL.MultMatrix(Math3D.CreateSRTMatrix(Vector3.One, av.RenderRotation, av.AdjustedPosition(av.RenderPosition)));
if (av.glavatar._meshes.Count > 0)
{
int faceNr = 0;
foreach (GLMesh mesh in av.glavatar._meshes.Values)
{
if (av.glavatar.skel.mNeedsMeshRebuild)
{
mesh.applyjointweights();
}
faceNr++;
if (!av.glavatar._showSkirt && mesh.Name == "skirtMesh")
continue;
// If we don't have a hair bake OR the hair bake is invisible don't render it
if (mesh.Name == "hairMesh" && (av.data[(int)AvatarTextureIndex.HairBaked] == null || av.data[(int)AvatarTextureIndex.HairBaked].TextureInfo.IsInvisible))
continue;
GL.Color3(1f, 1f, 1f);
if (pass == RenderPass.Picking)
{
GL.Disable(EnableCap.Texture2D);
for (int i = 0; i < av.data.Length; i++)
{
if (av.data[i] != null)
{
av.data[i].PickingID = avatarNr;
}
}
byte[] primNrBytes = Utils.Int16ToBytes((short)avatarNr);
byte[] faceColor = new byte[] { primNrBytes[0], primNrBytes[1], (byte)faceNr, 254 };
GL.Color4(faceColor);
}
else
{
if (av.data[mesh.teFaceID] == null)
{
GL.Disable(EnableCap.Texture2D);
}
else
{
if (mesh.teFaceID != 0)
{
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, av.data[mesh.teFaceID].TextureInfo.TexturePointer);
}
else
{
GL.Disable(EnableCap.Texture2D);
}
}
}
GL.TexCoordPointer(2, TexCoordPointerType.Float, 0, mesh.RenderData.TexCoords);
GL.VertexPointer(3, VertexPointerType.Float, 0, mesh.RenderData.Vertices);
GL.NormalPointer(NormalPointerType.Float, 0, mesh.MorphRenderData.Normals);
GL.DrawElements(PrimitiveType.Triangles, mesh.RenderData.Indices.Length, DrawElementsType.UnsignedShort, mesh.RenderData.Indices);
GL.BindTexture(TextureTarget.Texture2D, 0);
}
av.glavatar.skel.mNeedsMeshRebuild = false;
}
// Whole avatar position
GL.PopMatrix();
}
GL.Disable(EnableCap.Texture2D);
GL.DisableClientState(ArrayCap.NormalArray);
GL.DisableClientState(ArrayCap.VertexArray);
GL.DisableClientState(ArrayCap.TextureCoordArray);
}
}