/// <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();
     }
 }
Esempio n. 2
0
        /// <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);
 }
Esempio n. 4
0
 /// <summary>
 /// Статический меш
 /// </summary>
 public MeshComponent()
 {
     Diffuse  = Color.White;
     Blending = BlendingMode.AlphaChannel;
     cull     = new CullBox();
 }