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; } } } } }