/// <summary> /// /// </summary> /// <param name="shape">Piece takes ownership of shape so clone it first</param> /// <param name="worldMatrix"></param> /// <param name="definition"> without definition the piece wont save</param> /// <returns></returns> public static MyFracturedPiece CreateFracturePiece(HkdBreakableShape shape, HkdWorld world, ref MatrixD worldMatrix, bool isStatic, MyDefinitionId?definition, bool sync) { System.Diagnostics.Debug.Assert(Sync.IsServer, "Only on server"); var fracturedPiece = CreateFracturePiece(ref shape, world, ref worldMatrix, isStatic); if (definition.HasValue) { fracturedPiece.OriginalBlocks.Clear(); fracturedPiece.OriginalBlocks.Add(definition.Value); MyPhysicalModelDefinition def; if (MyDefinitionManager.Static.TryGetDefinition <MyPhysicalModelDefinition>(definition.Value, out def)) { fracturedPiece.Physics.MaterialType = def.PhysicalMaterial.Id.SubtypeId; } } else { fracturedPiece.Save = false; } // Check valid shapes from block definitions. if (fracturedPiece.Save && MyFakes.ENABLE_FRACTURE_PIECE_SHAPE_CHECK) { fracturedPiece.DebugCheckValidShapes(); } ProfilerShort.Begin("MyEntities.Add"); MyEntities.RaiseEntityCreated(fracturedPiece); MyEntities.Add(fracturedPiece); ProfilerShort.End(); return(fracturedPiece); }
/// <summary> /// /// </summary> /// <param name="shape">Piece takes ownership of shape so clone it first</param> /// <param name="worldMatrix"></param> /// <param name="definition"> without definition the piece wont save</param> /// <returns></returns> public static MyFracturedPiece CreateFracturePiece(HkdBreakableShape shape, HkdWorld world, ref MatrixD worldMatrix, bool isStatic, MyDefinitionId?definition, bool sync) { System.Diagnostics.Debug.Assert(Sync.IsServer, "Only on server"); var fracturedPiece = CreateFracturePiece(ref shape, world, ref worldMatrix, isStatic); if (definition.HasValue) { fracturedPiece.OriginalBlocks.Clear(); fracturedPiece.OriginalBlocks.Add(definition.Value); MyPhysicalModelDefinition def; if (MyDefinitionManager.Static.TryGetDefinition <MyPhysicalModelDefinition>(definition.Value, out def)) { fracturedPiece.Physics.MaterialType = def.PhysicalMaterial.Id.SubtypeId; } } else { fracturedPiece.Save = false; } if (sync) { MySyncDestructions.CreateFracturePiece((Sandbox.Common.ObjectBuilders.MyObjectBuilder_FracturedPiece)fracturedPiece.GetObjectBuilder()); } return(fracturedPiece); }
private static MyFracturedPiece CreateFracturePiece(ref HkdBreakableShape shape, HkdWorld world, ref MatrixD worldMatrix, bool isStatic) { Debug.Assert(shape.IsValid()); ProfilerShort.Begin("CreateFracturePiece"); var fracturedPiece = MyFracturedPiecesManager.Static.GetPieceFromPool(0);//new MyFracturedPiece(); fracturedPiece.PositionComp.WorldMatrix = worldMatrix; fracturedPiece.Physics.Flags = isStatic ? RigidBodyFlag.RBF_STATIC : RigidBodyFlag.RBF_DEBRIS; var physicsBody = fracturedPiece.Physics as MyPhysicsBody;//new MyPhysicsBody(fracturedPiece,isFixed ?RigidBodyFlag.RBF_STATIC : RigidBodyFlag.RBF_DEBRIS); HkMassProperties mp = new HkMassProperties(); shape.BuildMassProperties(ref mp); physicsBody.InitialSolverDeactivation = HkSolverDeactivation.High; physicsBody.CreateFromCollisionObject(shape.GetShape(), Vector3.Zero, worldMatrix, mp); physicsBody.LinearDamping = MyPerGameSettings.DefaultLinearDamping; physicsBody.AngularDamping = MyPerGameSettings.DefaultAngularDamping; System.Diagnostics.Debug.Assert(physicsBody.BreakableBody == null, "physicsBody.DestructionBody == null"); physicsBody.BreakableBody = new HkdBreakableBody(shape, physicsBody.RigidBody, world, worldMatrix); physicsBody.BreakableBody.AfterReplaceBody += physicsBody.FracturedBody_AfterReplaceBody; ProfilerShort.End(); ProfilerShort.Begin("Sync"); if (fracturedPiece.SyncFlag) { fracturedPiece.CreateSync(); } ProfilerShort.End(); fracturedPiece.NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; //physicsBody.RigidBody.ContactPointCallbackDelay = 0; //physicsBody.RigidBody.ContactPointCallbackEnabled = true; fracturedPiece.Physics = physicsBody; //FixPosition(fracturedPiece); fracturedPiece.SetDataFromHavok(shape); ProfilerShort.Begin("AddToWorld"); fracturedPiece.NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; shape.RemoveReference(); ProfilerShort.End(); return fracturedPiece; }
/// <summary> /// /// </summary> /// <param name="shape">Piece takes ownership of shape so clone it first</param> /// <param name="worldMatrix"></param> /// <param name="definition"> without definition the piece wont save</param> /// <returns></returns> public static MyFracturedPiece CreateFracturePiece(HkdBreakableShape shape, HkdWorld world, ref MatrixD worldMatrix, bool isStatic, MyDefinitionId? definition, bool sync) { System.Diagnostics.Debug.Assert(Sync.IsServer, "Only on server"); var fracturedPiece = CreateFracturePiece(ref shape, world, ref worldMatrix, isStatic); if (definition.HasValue) { fracturedPiece.OriginalBlocks.Clear(); fracturedPiece.OriginalBlocks.Add(definition.Value); MyPhysicalModelDefinition def; if (MyDefinitionManager.Static.TryGetDefinition<MyPhysicalModelDefinition>(definition.Value, out def)) fracturedPiece.Physics.MaterialType = def.PhysicalMaterial.Id.SubtypeId; } else fracturedPiece.Save = false; // Check valid shapes from block definitions. if (fracturedPiece.Save && MyFakes.ENABLE_FRACTURE_PIECE_SHAPE_CHECK) fracturedPiece.DebugCheckValidShapes(); ProfilerShort.Begin("MyEntities.Add"); MyEntities.RaiseEntityCreated(fracturedPiece); MyEntities.Add(fracturedPiece); ProfilerShort.End(); return fracturedPiece; }
/// <summary> /// /// </summary> /// <param name="shape">Piece takes ownership of shape so clone it first</param> /// <param name="worldMatrix"></param> /// <param name="definition"> without definition the piece wont save</param> /// <returns></returns> public static MyFracturedPiece CreateFracturePiece(HkdBreakableShape shape, HkdWorld world, ref MatrixD worldMatrix, bool isStatic, MyDefinitionId? definition, bool sync) { System.Diagnostics.Debug.Assert(Sync.IsServer, "Only on server"); var fracturedPiece = CreateFracturePiece(ref shape, world, ref worldMatrix, isStatic); if (definition.HasValue) { fracturedPiece.OriginalBlocks.Clear(); fracturedPiece.OriginalBlocks.Add(definition.Value); MyPhysicalModelDefinition def; if (MyDefinitionManager.Static.TryGetDefinition<MyPhysicalModelDefinition>(definition.Value, out def)) fracturedPiece.Physics.MaterialType = def.PhysicalMaterial.Id.SubtypeId; } else fracturedPiece.Save = false; if (sync) MySyncDestructions.CreateFracturePiece((Sandbox.Common.ObjectBuilders.MyObjectBuilder_FracturedPiece)fracturedPiece.GetObjectBuilder()); return fracturedPiece; }
private static MyFracturedPiece CreateFracturePiece(ref HkdBreakableShape shape, HkdWorld world, ref MatrixD worldMatrix, bool isStatic) { Debug.Assert(shape.IsValid()); ProfilerShort.Begin("CreateFracturePiece"); var fracturedPiece = MyFracturedPiecesManager.Static.GetPieceFromPool(0);//new MyFracturedPiece(); fracturedPiece.PositionComp.WorldMatrix = worldMatrix; fracturedPiece.Physics.Flags = isStatic ? RigidBodyFlag.RBF_STATIC : RigidBodyFlag.RBF_DEBRIS; var physicsBody = fracturedPiece.Physics as MyPhysicsBody;//new MyPhysicsBody(fracturedPiece,isFixed ?RigidBodyFlag.RBF_STATIC : RigidBodyFlag.RBF_DEBRIS); HkMassProperties mp = new HkMassProperties(); shape.BuildMassProperties(ref mp); physicsBody.InitialSolverDeactivation = HkSolverDeactivation.High; physicsBody.CreateFromCollisionObject(shape.GetShape(), Vector3.Zero, worldMatrix, mp); physicsBody.LinearDamping = MyPerGameSettings.DefaultLinearDamping; physicsBody.AngularDamping = MyPerGameSettings.DefaultAngularDamping; System.Diagnostics.Debug.Assert(physicsBody.BreakableBody == null, "physicsBody.DestructionBody == null"); physicsBody.BreakableBody = new HkdBreakableBody(shape, physicsBody.RigidBody, world, worldMatrix); physicsBody.BreakableBody.AfterReplaceBody += physicsBody.FracturedBody_AfterReplaceBody; ProfilerShort.End(); ProfilerShort.Begin("Sync"); if (fracturedPiece.SyncFlag) { fracturedPiece.CreateSync(); } ProfilerShort.End(); fracturedPiece.NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; //physicsBody.RigidBody.ContactPointCallbackDelay = 0; //physicsBody.RigidBody.ContactPointCallbackEnabled = true; fracturedPiece.Physics = physicsBody; //FixPosition(fracturedPiece); fracturedPiece.SetDataFromHavok(shape); ProfilerShort.Begin("AddToWorld"); fracturedPiece.NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; shape.RemoveReference(); ProfilerShort.End(); return(fracturedPiece); }