/// <summary> /// Изменение сферы отсечения /// </summary> void RebuildCullingSphere() { Frame[] frames = Frames; if (frames != null) { Vec3 max = Vec3.One * float.MinValue, min = Vec3.One * float.MaxValue; foreach (Frame f in frames) { MorphFrame cf = (MorphFrame)f; if (cf != null) { for (int i = 0; i < cf.verts.Length; i += 3) { if (cf.verts[i] > max.X) { max.X = cf.verts[i]; } if (cf.verts[i + 1] > max.Y) { max.Y = cf.verts[i + 1]; } if (-cf.verts[i + 2] > max.Z) { max.Z = -cf.verts[i + 2]; } if (cf.verts[i] < min.X) { min.X = cf.verts[i]; } if (cf.verts[i + 1] < min.Y) { min.Y = cf.verts[i + 1]; } if (-cf.verts[i + 2] < min.Z) { min.Z = -cf.verts[i + 2]; } } cull = new CullBox(); cull.Min = min; cull.Max = max; } } RebuildParentCull(); } }
/// <summary> /// Перестройка сферы отсечения /// </summary> protected virtual void RebuildCullSphere() { List <CullBox> culls = new List <CullBox>(); foreach (EntityComponent c in components) { if (c is IRenderable) { CullBox cb = c.GetCullingBox(); if (cb != null) { culls.Add(cb); } } } cullSphere = CullBox.FromBoxes(culls.ToArray()).ToSphere(); cullSphere.Position = PointToWorld(cullSphere.Position); needCullRebuild = false; }
/// <summary> /// Получение бокса для отсечения /// </summary> /// <returns>Коробка</returns> internal override CullBox GetCullingBox() { if (cull == null) { CullBox cb = null; MeshComponent mc = this; while (cb == null) { if (mc.Proxy != null) { mc = mc.Proxy; } else { break; } cb = mc.GetCullingBox(); } } return(cull); }
/// <summary> /// Статический меш /// </summary> public MeshComponent() { Diffuse = Color.White; Blending = BlendingMode.AlphaChannel; cull = new CullBox(); }