Example #1
0
 public static unsafe void CalculateBlockDepthBias(this MyRenderComponent renderComponent, MyCubeBlock block)
 {
     if (block.Hierarchy != null)
     {
         MyCompoundCubeBlock entity = block.Hierarchy.Parent.Entity as MyCompoundCubeBlock;
         if (entity != null)
         {
             bool *flagPtr = (bool *)stackalloc byte[0x40];
             foreach (MySlimBlock block3 in entity.GetBlocks())
             {
                 if (block3.FatBlock == null)
                 {
                     continue;
                 }
                 if (!ReferenceEquals(block3.FatBlock, block))
                 {
                     MyRenderComponentBase render = block3.FatBlock.Render;
                     if (render != null)
                     {
                         *((sbyte *)(flagPtr + render.DepthBias)) = 1;
                     }
                 }
             }
             int     num          = 0;
             MyModel modelStorage = renderComponent.ModelStorage as MyModel;
             if (modelStorage != null)
             {
                 Vector3 center = modelStorage.BoundingSphere.Center;
                 MatrixI matrix = new MatrixI(block.SlimBlock.Orientation);
                 Vector3 result = new Vector3();
                 Vector3.Transform(ref center, ref matrix, out result);
                 if (result.LengthSquared() > 0.5f)
                 {
                     num = (Math.Abs(result.X) <= Math.Abs(result.Y)) ? ((Math.Abs(result.Z) <= Math.Abs(result.Y)) ? ((result.Y > 0f) ? 6 : 8) : ((result.Z > 0f) ? 10 : 12)) : ((Math.Abs(result.X) <= Math.Abs(result.Z)) ? ((result.Z > 0f) ? 10 : 12) : ((result.X > 0f) ? 2 : 4));
                 }
             }
             for (int i = num; i < 0x40; i++)
             {
                 if (*(((byte *)(flagPtr + i))) == 0)
                 {
                     renderComponent.DepthBias = (byte)i;
                     return;
                 }
             }
         }
     }
 }
        public unsafe static void CalculateBlockDepthBias(this MyRenderComponent renderComponent, MyCubeBlock block)
        {
            if (block.Hierarchy != null)
            {
                var parentCompound = block.Hierarchy.Parent.Entity as MyCompoundCubeBlock;
                if (parentCompound != null)
                {
                    const int offsetCount = 64;
                    bool *    offsets     = stackalloc bool[offsetCount];

                    foreach (var block2 in parentCompound.GetBlocks())
                    {
                        if (block2.FatBlock != null && block2.FatBlock != block)
                        {
                            var cubeBlockRender = block2.FatBlock.Render as MyRenderComponentBase;
                            if (cubeBlockRender != null)
                            {
                                offsets[cubeBlockRender.DepthBias] = true;
                            }
                        }
                    }

                    int preferedOffset = 0;
                    var modelStorage   = renderComponent.ModelStorage as VRage.Game.Models.MyModel;
                    if (modelStorage != null)
                    {
                        Vector3 blockCenterLocal = modelStorage.BoundingSphere.Center;
                        MatrixI blockOrientation = new MatrixI(block.SlimBlock.Orientation);
                        Vector3 blockCenter      = new Vector3();
                        Vector3.Transform(ref blockCenterLocal, ref blockOrientation, out blockCenter);
                        if (blockCenter.LengthSquared() > 0.5f)
                        {
                            if (Math.Abs(blockCenter.X) > Math.Abs(blockCenter.Y))
                            {
                                if (Math.Abs(blockCenter.X) > Math.Abs(blockCenter.Z))
                                {
                                    preferedOffset = blockCenter.X > 0 ? 2 : 4;
                                }
                                else
                                {
                                    preferedOffset = blockCenter.Z > 0 ? 10 : 12;
                                }
                            }
                            else
                            {
                                if (Math.Abs(blockCenter.Z) > Math.Abs(blockCenter.Y))
                                {
                                    preferedOffset = blockCenter.Z > 0 ? 10 : 12;
                                }
                                else
                                {
                                    preferedOffset = blockCenter.Y > 0 ? 6 : 8;
                                }
                            }
                        }
                    }

                    for (int offsetIndex = preferedOffset; offsetIndex < offsetCount; ++offsetIndex)
                    {
                        if (!offsets[offsetIndex])
                        {
                            renderComponent.DepthBias = (byte)offsetIndex;
                            break;
                        }
                    }
                }
            }
        }