private List<HkdConnection> m_connectionsToAddCache = new List<HkdConnection>(); //connections are created before they can be added so we cache them public HkdBreakableShape? CreateBreakableShape() { ProfilerShort.Begin("CreateBreakableShape"); ProfilerShort.Begin("CollectShapes"); m_blocksShapes.Clear(); foreach (var b in m_grid.GetBlocks()) { Matrix m; var bs = CreateBlockShape(b, out m); if (bs.HasValue) { var shapeInstance = new HkdShapeInstanceInfo(bs.Value, m); m_shapeInfosList.Add(shapeInstance); m_blocksShapes[b.Position] = shapeInstance; } } ProfilerShort.End(); if (m_blocksShapes.Count == 0) { Debug.Fail("No breakable shapes in grid!"); ProfilerShort.End(); return null; } ProfilerShort.Begin("Create"); if (BreakableShape.IsValid()) BreakableShape.RemoveReference(); BreakableShape = new HkdCompoundBreakableShape(null, m_shapeInfosList); BreakableShape.SetChildrenParent(BreakableShape); try { BreakableShape.SetStrenghtRecursively(Sandbox.MyDestructionConstants.STRENGTH, 0.7f); } catch (Exception e) { MyLog.Default.WriteLine(e); MyLog.Default.WriteLine("BS Valid: " + BreakableShape.IsValid()); MyLog.Default.WriteLine("BS Child count: " + BreakableShape.GetChildrenCount()); MyLog.Default.WriteLine("Grid shapes: " + m_shapeInfosList.Count); foreach (var child in m_shapeInfosList) { if (!child.Shape.IsValid()) MyLog.Default.WriteLine("Invalid child!"); else MyLog.Default.WriteLine("Child strength: " + child.Shape.GetStrenght()); } throw new InvalidOperationException(); } ProfilerShort.End(); ProfilerShort.Begin("Connect"); CreateConnectionsManually(BreakableShape); ProfilerShort.End(); FindConnectionsToWorld(m_grid.GetBlocks()); m_shapeInfosList.Clear(); ProfilerShort.End(); return BreakableShape; }
private List<HkdConnection> m_connectionsToAddCache = new List<HkdConnection>(); //connections are created before they can be added so we cache them public HkdBreakableShape? CreateBreakableShape() { ProfilerShort.Begin("CreateBreakableShape"); ProfilerShort.Begin("CollectShapes"); m_blocksShapes.Clear(); foreach (var b in m_grid.GetBlocks()) { Matrix m; var bs = CreateBlockShape(b, out m); if (bs.HasValue) { var shapeInstance = new HkdShapeInstanceInfo(bs.Value, m); m_shapeInfosList.Add(shapeInstance); m_blocksShapes[b.Position] = shapeInstance; } } ProfilerShort.End(); if (m_blocksShapes.Count == 0) { Debug.Fail("No breakable shapes in grid!"); ProfilerShort.End(); return null; } ProfilerShort.Begin("Create"); if (BreakableShape.IsValid()) BreakableShape.RemoveReference(); BreakableShape = new HkdCompoundBreakableShape(null, m_shapeInfosList); BreakableShape.SetChildrenParent(BreakableShape); try { BreakableShape.SetStrenghtRecursively(Sandbox.MyDestructionConstants.STRENGTH, 0.7f); } catch (Exception e) { MyLog.Default.WriteLine(e); MyLog.Default.WriteLine("BS Valid: " + BreakableShape.IsValid()); MyLog.Default.WriteLine("BS Child count: " + BreakableShape.GetChildrenCount()); MyLog.Default.WriteLine("Grid shapes: " + m_shapeInfosList.Count); foreach (var child in m_shapeInfosList) { if (!child.Shape.IsValid()) MyLog.Default.WriteLine("Invalid child!"); else MyLog.Default.WriteLine("Child strength: " + child.Shape.GetStrenght()); } MyLog.Default.WriteLine("Grid Blocks count: " + m_grid.GetBlocks().Count); MyLog.Default.WriteLine("Grid MarkedForClose: " + m_grid.MarkedForClose); HashSet<MyDefinitionId> blockDefinitions = new HashSet<MyDefinitionId>(); foreach (var block in m_grid.GetBlocks()) { if (block.FatBlock != null && block.FatBlock.MarkedForClose) MyLog.Default.WriteLine("Block marked for close: " + block.BlockDefinition.Id); if (blockDefinitions.Count >= 50) break; if (block.FatBlock is MyCompoundCubeBlock) { foreach (var blockInCompound in (block.FatBlock as MyCompoundCubeBlock).GetBlocks()) { blockDefinitions.Add(blockInCompound.BlockDefinition.Id); if (blockInCompound.FatBlock != null && blockInCompound.FatBlock.MarkedForClose) MyLog.Default.WriteLine("Block in compound marked for close: " + blockInCompound.BlockDefinition.Id); } } else blockDefinitions.Add(block.BlockDefinition.Id); } foreach (var def in blockDefinitions) MyLog.Default.WriteLine("Block definition: " + def); throw new InvalidOperationException(); } ProfilerShort.End(); ProfilerShort.Begin("Connect"); CreateConnectionsManually(BreakableShape); ProfilerShort.End(); m_shapeInfosList.Clear(); ProfilerShort.End(); return BreakableShape; }