internal HkBvCompressedMeshShape CreateShape(MyIsoMesh mesh) { // mk:NOTE This method must be thread safe. Called from worker threads. if (mesh == null || mesh.TrianglesCount == 0 || mesh.VerticesCount == 0) { return((HkBvCompressedMeshShape)HkShape.Empty); } List <int> indexList = new List <int>(mesh.TrianglesCount * 3); List <Vector3> vertexList = new List <Vector3>(mesh.VerticesCount); for (int i = 0; i < mesh.TrianglesCount; i++) { indexList.Add(mesh.Triangles[i].VertexIndex0); indexList.Add(mesh.Triangles[i].VertexIndex2); indexList.Add(mesh.Triangles[i].VertexIndex1); } // mk:TODO Unify denormalizing of positions with what is in MyIsoMesh. var positionOffset = mesh.PositionOffset - m_voxelMap.StorageMin * MyVoxelConstants.VOXEL_SIZE_IN_METRES; var positions = mesh.Positions.GetInternalArray(); for (int i = 0; i < mesh.VerticesCount; i++) { vertexList.Add(positions[i] * mesh.PositionScale + positionOffset); } using (var cellGeometry = new HkGeometry(vertexList, indexList)) { var result = new HkBvCompressedMeshShape(cellGeometry, null, null, HkWeldingType.None, MyPerGameSettings.PhysicsConvexRadius); Debug.Assert(result.Base.ReferenceCount == 1); return(result); } }
public static void DrawGeometry(HkGeometry geometry, MatrixD worldMatrix, Color color, bool depthRead = false, bool shaded = false) { var msg = MyRenderProxy.PrepareDebugDrawTriangles(); try { for (int i = 0; i < geometry.TriangleCount; i++) { int a, b, c, m; geometry.GetTriangle(i, out a, out b, out c, out m); msg.AddIndex(a); msg.AddIndex(b); msg.AddIndex(c); } for (int i = 0; i < geometry.VertexCount; i++) { msg.AddVertex(geometry.GetVertex(i)); } } finally { MyRenderProxy.DebugDrawTriangles(msg, worldMatrix, color, depthRead, shaded); } }
public static void DrawGeometry(HkGeometry geometry, MatrixD worldMatrix, Color color, bool depthRead = false, bool shaded = false) { MyRenderMessageDebugDrawTriangles msgInterface = MyRenderProxy.PrepareDebugDrawTriangles(); try { int triangleIndex = 0; while (true) { int num2; int num3; int num4; int num5; if (triangleIndex >= geometry.TriangleCount) { for (int i = 0; i < geometry.VertexCount; i++) { msgInterface.AddVertex(geometry.GetVertex(i)); } break; } geometry.GetTriangle(triangleIndex, out num2, out num3, out num4, out num5); msgInterface.AddIndex(num2); msgInterface.AddIndex(num3); msgInterface.AddIndex(num4); triangleIndex++; } } finally { msgInterface.Color = color; MyRenderProxy.DebugDrawTriangles(msgInterface, new MatrixD?(worldMatrix), depthRead, shaded, false, false); } }
public void DrawGeometry(HkGeometry geometry, MatrixD worldMatrix, Color color, bool depthRead = false, bool shaded = false) { MyRenderMessageDebugDrawTriangles triangles = MyRenderProxy.PrepareDebugDrawTriangles(); for (int i = 0; i < geometry.TriangleCount; i++) { int num2; int num3; int num4; int num5; geometry.GetTriangle(i, out num2, out num3, out num4, out num5); triangles.AddIndex(num2); triangles.AddIndex(num3); triangles.AddIndex(num4); } for (int j = 0; j < geometry.VertexCount; j++) { triangles.AddVertex(geometry.GetVertex(j)); } }
private void CreateMeshShape() { Profiler.Begin("MyVoxelGeometry.CellData.CreateMeshShape"); try { if (!m_meshShape.Base.IsZero) { return; } List <int> indexList = new List <int>(VoxelTrianglesCount * 3); List <Vector3> vertexList = new List <Vector3>(VoxelVerticesCount); for (int i = 0; i < VoxelTrianglesCount; i++) { indexList.Add(VoxelTriangles[i].VertexIndex0); indexList.Add(VoxelTriangles[i].VertexIndex2); indexList.Add(VoxelTriangles[i].VertexIndex1); } Vector3 tmp; for (int i = 0; i < VoxelVerticesCount; i++) { GetUnpackedPosition(ref m_voxelVertices[i], out tmp); vertexList.Add(tmp); } using (var cellGeometry = new HkGeometry(vertexList, indexList)) { var newShape = new HkBvCompressedMeshShape(cellGeometry, null, null, HkWeldingType.None); Debug.Assert(newShape.Base.ReferenceCount == 1); m_meshShape = newShape; } } finally { Profiler.End(); } }
internal HkBvCompressedMeshShape CreateShape(MyIsoMesh mesh) { // mk:NOTE This method must be thread safe. Called from worker threads. if (mesh == null || mesh.TrianglesCount == 0 || mesh.VerticesCount == 0) return (HkBvCompressedMeshShape)HkShape.Empty; List<int> indexList = new List<int>(mesh.TrianglesCount * 3); List<Vector3> vertexList = new List<Vector3>(mesh.VerticesCount); for (int i = 0; i < mesh.TrianglesCount; i++) { indexList.Add(mesh.Triangles[i].VertexIndex0); indexList.Add(mesh.Triangles[i].VertexIndex2); indexList.Add(mesh.Triangles[i].VertexIndex1); } // mk:TODO Unify denormalizing of positions with what is in MyIsoMesh. var positionOffset = mesh.PositionOffset - m_voxelMap.StorageMin * MyVoxelConstants.VOXEL_SIZE_IN_METRES; var positions = mesh.Positions.GetInternalArray(); for (int i = 0; i < mesh.VerticesCount; i++) { vertexList.Add(positions[i] * mesh.PositionScale + positionOffset); } using (var cellGeometry = new HkGeometry(vertexList, indexList)) { var result = new HkBvCompressedMeshShape(cellGeometry, null, null, HkWeldingType.None, MyPerGameSettings.PhysicsConvexRadius); Debug.Assert(result.Base.ReferenceCount == 1); return result; } }
public static void DrawGeometry(HkGeometry geometry, MatrixD worldMatrix, Color color, bool depthRead = false, bool shaded = false) { var msg = MyRenderProxy.PrepareDebugDrawTriangles(); try { for (int i = 0; i < geometry.TriangleCount; i++) { int a, b, c, m; geometry.GetTriangle(i, out a, out b, out c, out m); msg.AddIndex(a); msg.AddIndex(b); msg.AddIndex(c); } for (int i = 0; i < geometry.VertexCount; i++) { msg.AddVertex(geometry.GetVertex(i)); } } finally { MyRenderProxy.DebugDrawTriangles(msg, worldMatrix, color, depthRead, shaded); } }
private void AddPhysicalShape(HkShape shape, Matrix rdWorldMatrix) { switch (shape.ShapeType) { case Havok.HkShapeType.Box: Havok.HkBoxShape box = (HkBoxShape)shape; Vector3D vMin = new Vector3D(-box.HalfExtents.X, -box.HalfExtents.Y, -box.HalfExtents.Z); Vector3D vMax = new Vector3D(box.HalfExtents.X, box.HalfExtents.Y, box.HalfExtents.Z); BoundingBoxD boundingBox = new BoundingBoxD(vMin, vMax); BoundingBoxToTranslatedTriangles(boundingBox, rdWorldMatrix); break; case Havok.HkShapeType.List: var listShape = (HkListShape)shape; var iterator = listShape.GetIterator(); while (iterator.IsValid) { AddPhysicalShape(iterator.CurrentValue, rdWorldMatrix); iterator.Next(); } break; case HkShapeType.Mopp: var compoundShape = (HkMoppBvTreeShape)shape; AddPhysicalShape(compoundShape.ShapeCollection, rdWorldMatrix); break; case HkShapeType.ConvexTransform: var transformShape = (HkConvexTransformShape)shape; AddPhysicalShape(transformShape.ChildShape, transformShape.Transform * rdWorldMatrix); break; case HkShapeType.ConvexTranslate: var translateShape = (HkConvexTranslateShape)shape; var mat = Matrix.CreateTranslation(translateShape.Translation); AddPhysicalShape((HkShape)translateShape.ChildShape, mat * rdWorldMatrix); break; case HkShapeType.Sphere: var sphereShape = (HkSphereShape)shape; m_icosphereMesh.AddTrianglesToWorldVertices(rdWorldMatrix.Translation, sphereShape.Radius); break; case HkShapeType.Capsule: return; ProfilerShort.Begin("Capsule"); var capsuleShape = (HkCapsuleShape)shape; Line line = new Line(capsuleShape.VertexA, capsuleShape.VertexB); m_capsuleMesh.AddTrianglesToWorldVertices(rdWorldMatrix, capsuleShape.Radius, line); ProfilerShort.End(); break; case HkShapeType.ConvexVertices: var convexShape = (HkConvexVerticesShape)shape; HkGeometry geometry = new HkGeometry(); Vector3 center; convexShape.GetGeometry(geometry, out center); for (int i = 0; i < geometry.TriangleCount; i++) { int i0, i1, i2, materialIndex; geometry.GetTriangle(i, out i0, out i1, out i2, out materialIndex); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i0); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i1); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i2); } for (int i = 0; i < geometry.VertexCount; i++) { Vector3 vec = geometry.GetVertex(i); Vector3.Transform(ref vec, ref rdWorldMatrix, out vec); m_worldVertices.Vertices.Add(vec); } m_worldVertices.VerticesMaxValue += geometry.VertexCount; break; default: // For breakpoint. Don't judge me :( break; } }
public override bool HandleInput() { bool handled = false; if (m_gridDebugInfo) { LineD line = new LineD(MySector.MainCamera.Position, MySector.MainCamera.Position + MySector.MainCamera.ForwardVector * 1000); MyCubeGrid grid; Vector3I cubePos; double distance; if (MyCubeGrid.GetLineIntersection(ref line, out grid, out cubePos, out distance)) { var gridMatrix = grid.WorldMatrix; var boxMatrix = Matrix.CreateTranslation(cubePos * grid.GridSize) * gridMatrix; var block = grid.GetCubeBlock(cubePos); MyRenderProxy.DebugDrawText2D(new Vector2(), cubePos.ToString(), Color.White, 0.7f); MyRenderProxy.DebugDrawOBB(Matrix.CreateScale(new Vector3(grid.GridSize) + new Vector3(0.15f)) * boxMatrix, Color.Red.ToVector3(), 0.2f, true, true); //int[, ,] bones = grid.Skeleton.AddCubeBones(cubePos); //Vector3 closestBone = Vector3.Zero; //Vector3I closestPoint = Vector3I.Zero; //float closestPointDist = float.MaxValue; //int closestBoneIndex = 0; //for (int x = -1; x <= 1; x += 1) //{ // for (int y = -1; y <= 1; y += 1) // { // for (int z = -1; z <= 1; z += 1) // { // int boneIndex = bones[x + 1, y + 1, z + 1]; // Vector3 bone = grid.Skeleton[boneIndex]; // var pos = boxMatrix.Translation + new Vector3(grid.GridSize / 2) * new Vector3(x, y, z); // //MyRenderProxy.DebugDrawSphere(pos, 0.2f, Color.Blue.ToVector3(), 1.0f, false); // MyRenderProxy.DebugDrawText3D(pos, String.Format("{0:G2}, {1:G2}, {2:G2}", bone.X, bone.Y, bone.Z), Color.White, 0.5f, false); // var dist = MyUtils.GetPointLineDistance(ref line, ref pos); // if (dist < closestPointDist) // { // closestPointDist = dist; // closestPoint = new Vector3I(x, y, z); // closestBoneIndex = boneIndex; // closestBone = bone; // } // } // } //} //MyRenderProxy.DebugDrawText3D(boxMatrix.Translation + new Vector3(grid.GridSize / 2) * closestPoint * 1.0f, String.Format("{0:G2}, {1:G2}, {2:G2}", closestBone.X, closestBone.Y, closestBone.Z), Color.Red, 0.5f, false); //var bonePos = grid.Skeleton[bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]]; //MyRenderProxy.DebugDrawSphere(boxMatrix.Translation + new Vector3(grid.GridSize / 2) * closestPoint * 1.0f + bonePos, 0.5f, Color.Red.ToVector3(), 0.4f, true, true); //if (input.IsNewKeyPressed(Keys.P) && block != null) //{ // if (input.IsAnyShiftKeyPressed()) // { // grid.ResetBlockSkeleton(block); // } // else // { // grid.Skeleton[bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]] = Vector3.Zero; // grid.AddDirtyBone(cubePos, closestPoint + Vector3I.One); // //grid.SetBlockDirty(block); // } // handled = true; //} //// Move bones to center by 0.1f //if (input.IsNewKeyPressed(Keys.OemOpenBrackets)) //{ // int index = bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]; // grid.Skeleton[index] -= Vector3.Sign(grid.Skeleton[index]) * 0.1f; // grid.AddDirtyBone(cubePos, closestPoint + Vector3I.One); // //grid.SetBlockDirty(block); // handled = true; //} //// Reduce max offset by 0.1f //if (input.IsNewKeyPressed(Keys.OemCloseBrackets)) //{ // int index = bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]; // var old = Vector3.Abs(grid.Skeleton[index]); // var max = new Vector3(Math.Max(Math.Max(old.X, old.Y), old.Z)); // if (max.X > 0.1f) // { // grid.Skeleton[index] = Vector3.Clamp(grid.Skeleton[index], -max + 0.1f, max - 0.1f); // } // else // { // grid.Skeleton[index] = Vector3.Zero; // } // grid.AddDirtyBone(cubePos, closestPoint + Vector3I.One); // //grid.SetBlockDirty(block); // handled = true; //} } } if (MyInput.Static.IsAnyAltKeyPressed()) { return(handled); } bool shift = MyInput.Static.IsAnyShiftKeyPressed(); bool ctrl = MyInput.Static.IsAnyCtrlKeyPressed(); //if (input.IsNewKeyPressed(Keys.I)) //{ // foreach (var grid in MyEntities.GetEntities().OfType<MyCubeGrid>()) // { // foreach (var block in grid.GetBlocks().ToArray()) // { // grid.DetectMerge(block.Min, block.Max); // } // } // handled = true; //} // Disabled since it is common to have normal control bound to O key. // If you ever need this again, bind it to something more complicated, like key combination. //if (input.IsNewKeyPressed(Keys.O)) //{ // m_gridDebugInfo = !m_gridDebugInfo; // handled = true; //} //for (int i = 0; i <= 9; i++) //{ // if (MyInput.Static.IsNewKeyPressed((Keys)(((int)Keys.D0) + i))) // { // string name = "Slot" + i.ToString(); // if (ctrl) // { // MySession.Static.Name = name; // MySession.Static.WorldID = MySession.Static.GetNewWorldId(); // MySession.Static.Save(name); // } // else if (shift) // { // var path = MyLocalCache.GetSessionSavesPath(name, false, false); // if (System.IO.Directory.Exists(path)) // { // MySession.Static.Unload(); // MySession.Static.Load(path); // } // } // handled = true; // } //} //if (MyInput.Static.IsNewKeyPressed(Keys.End)) //{ // MyMeteorShower.MeteorWave(null); //} // Disabled for god sake! //if (MyInput.Static.IsNewKeyPressed(Keys.PageUp) && MyInput.Static.IsAnyCtrlKeyPressed()) //{ // MyReloadTestComponent.Enabled = true; //} //if (MyInput.Static.IsNewKeyPressed(Keys.PageDown) && MyInput.Static.IsAnyCtrlKeyPressed()) //{ // MyReloadTestComponent.Enabled = false; //} if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad6)) { var view = MySession.Static.CameraController.GetViewMatrix(); var inv = Matrix.Invert(view); //MyPhysicalInventoryItem item = new MyPhysicalInventoryItem(100, var oreBuilder = MyObjectBuilderSerializer.CreateNewObject <MyObjectBuilder_Ore>("Stone"); var item = new MyPhysicalInventoryItem(1, oreBuilder); var obj = MyFloatingObjects.Spawn(item, inv.Translation + inv.Forward * 1.0f, inv.Forward, inv.Up); obj.Physics.LinearVelocity = inv.Forward * 50; } if (false && MyInput.Static.IsNewKeyPressed(MyKeys.NumPad9)) { List <HkShape> trShapes = new List <HkShape>(); List <HkConvexShape> shapes = new List <HkConvexShape>(); List <Matrix> matrices = new List <Matrix>(); var grid = new HkGridShape(2.5f, HkReferencePolicy.None); const short size = 50; for (short x = 0; x < size; x++) { for (short y = 0; y < size; y++) { for (short z = 0; z < size; z++) { var box = new HkBoxShape(Vector3.One); grid.AddShapes(new System.Collections.Generic.List <HkShape>() { box }, new Vector3S(x, y, z), new Vector3S(x, y, z)); trShapes.Add(new HkConvexTranslateShape(box, new Vector3(x, y, z), HkReferencePolicy.None)); shapes.Add(box); matrices.Add(Matrix.CreateTranslation(new Vector3(x, y, z))); } } } var emptyGeom = new HkGeometry(new List <Vector3>(), new List <int>()); var list = new HkListShape(trShapes.ToArray(), trShapes.Count, HkReferencePolicy.None); var compressedBv = new HkBvCompressedMeshShape(emptyGeom, shapes, matrices, HkWeldingType.None); var mopp = new HkMoppBvTreeShape(list, HkReferencePolicy.None); HkShapeBuffer buf = new HkShapeBuffer(); //HkShapeContainerIterator i = compressedBv.GetIterator(buf); //int count = 0; // will be 125000 //while (i.IsValid) //{ // count++; // i.Next(); //} buf.Dispose(); var info = new HkRigidBodyCinfo(); info.Mass = 10; info.CalculateBoxInertiaTensor(Vector3.One, 10); info.MotionType = HkMotionType.Dynamic; info.QualityType = HkCollidableQualityType.Moving; info.Shape = compressedBv; var body = new HkRigidBody(info); //MyPhysics.HavokWorld.AddRigidBody(body); } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad7)) { foreach (var g in MyEntities.GetEntities().OfType <MyCubeGrid>()) { foreach (var s in g.CubeBlocks.Select(s => s.FatBlock).Where(s => s != null).OfType <MyMotorStator>()) { if (s.Rotor != null) { var q = Quaternion.CreateFromAxisAngle(s.Rotor.WorldMatrix.Up, MathHelper.ToRadians(45)); s.Rotor.CubeGrid.WorldMatrix = MatrixD.CreateFromQuaternion(q) * s.Rotor.CubeGrid.WorldMatrix; } } } } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad8)) { var view = MySession.Static.CameraController.GetViewMatrix(); var inv = Matrix.Invert(view); var oreBuilder = MyObjectBuilderSerializer.CreateNewObject <MyObjectBuilder_Ore>("Stone"); var obj = new MyObjectBuilder_FloatingObject() { Item = new MyObjectBuilder_InventoryItem() { PhysicalContent = oreBuilder, Amount = 1000 } }; obj.PositionAndOrientation = new MyPositionAndOrientation(inv.Translation + 2.0f * inv.Forward, inv.Forward, inv.Up); obj.PersistentFlags = MyPersistentEntityFlags2.InScene; var e = MyEntities.CreateFromObjectBuilderAndAdd(obj); e.Physics.LinearVelocity = Vector3.Normalize(inv.Forward) * 50.0f; } if (MyInput.Static.IsNewKeyPressed(MyKeys.Divide)) { } if (MyInput.Static.IsNewKeyPressed(MyKeys.Multiply)) { MyDebugDrawSettings.ENABLE_DEBUG_DRAW = !MyDebugDrawSettings.ENABLE_DEBUG_DRAW; MyDebugDrawSettings.DEBUG_DRAW_STRUCTURAL_INTEGRITY = true; var grids = MyEntities.GetEntities().OfType <MyCubeGrid>(); foreach (var g in grids) { if (!g.IsStatic)// || g.GetBlocks().Count < 800) //to compute only castle { continue; } g.CreateStructuralIntegrity(); } } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad1)) { var e = MyEntities.GetEntities().OfType <MyCubeGrid>().FirstOrDefault(); if (e != null) { e.Physics.RigidBody.MaxLinearVelocity = 1000; if (e.Physics.RigidBody2 != null) { e.Physics.RigidBody2.MaxLinearVelocity = 1000; } e.Physics.LinearVelocity = new Vector3(1000, 0, 0); } } if (MyInput.Static.IsNewKeyPressed(MyKeys.Decimal)) { MyPrefabManager.Static.SpawnPrefab("respawnship", MySector.MainCamera.Position, MySector.MainCamera.ForwardVector, MySector.MainCamera.UpVector); } if (MyInput.Static.IsNewKeyPressed(MyKeys.Multiply) && MyInput.Static.IsAnyShiftKeyPressed()) { GC.Collect(2); } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad5)) { Thread.Sleep(250); } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad9)) { var obj = MySession.Static.ControlledEntity != null ? MySession.Static.ControlledEntity.Entity : null; if (obj != null) { const float dist = 5.0f; obj.PositionComp.SetPosition(obj.PositionComp.GetPosition() + obj.WorldMatrix.Forward * dist); } } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad4)) { MyEntity invObject = MySession.Static.ControlledEntity as MyEntity; if (invObject != null && invObject.HasInventory) { MyFixedPoint amount = 20000; var oreBuilder = MyObjectBuilderSerializer.CreateNewObject <MyObjectBuilder_Ore>("Stone"); MyInventory inventory = invObject.GetInventory(0) as MyInventory; System.Diagnostics.Debug.Assert(inventory != null, "Null or unexpected type returned!"); inventory.AddItems(amount, oreBuilder); } handled = true; } //if (MyInput.Static.IsNewKeyPressed(Keys.NumPad8)) //{ // var pos = MySector.MainCamera.Position + MySector.MainCamera.ForwardVector * 2; // var grid = (MyObjectBuilder_CubeGrid)MyObjectBuilderSerializer.CreateNewObject(MyObjectBuilderTypeEnum.CubeGrid); // grid.PositionAndOrientation = new MyPositionAndOrientation(pos, Vector3.Forward, Vector3.Up); // grid.CubeBlocks = new List<MyObjectBuilder_CubeBlock>(); // grid.GridSizeEnum = MyCubeSize.Large; // var block = new MyObjectBuilder_CubeBlock(); // block.BlockOrientation = MyBlockOrientation.Identity; // block.Min = Vector3I.Zero; // //var blockDefinition = Sandbox.Game.Managers.MyDefinitionManager.Static.GetCubeBlockDefinition(new CommonLib.ObjectBuilders.Definitions.MyDefinitionId(typeof(MyObjectBuilder_CubeBlock), "LargeBlockArmorBlock")); // block.SubtypeName = "LargeBlockArmorBlock"; // grid.CubeBlocks.Add(block); // grid.LinearVelocity = MySector.MainCamera.ForwardVector * 20; // grid.PersistentFlags = MyPersistentEntityFlags2.Enabled | MyPersistentEntityFlags2.InScene; // var x = MyEntities.CreateFromObjectBuilderAndAdd(grid); //} //if (MyInput.Static.IsNewKeyPressed(Keys.NumPad9)) //{ // var pos = MySector.MainCamera.Position + MySector.MainCamera.ForwardVector * 2; // var grid = (MyObjectBuilder_CubeGrid)MyObjectBuilderSerializer.CreateNewObject(MyObjectBuilderTypeEnum.CubeGrid); // grid.PositionAndOrientation = new MyPositionAndOrientation(pos, Vector3.Forward, Vector3.Up); // grid.CubeBlocks = new List<MyObjectBuilder_CubeBlock>(); // grid.GridSizeEnum = MyCubeSize.Large; // var block = new MyObjectBuilder_CubeBlock(); // block.BlockOrientation = MyBlockOrientation.Identity; // block.Min = Vector3I.Zero; // //var blockDefinition = Sandbox.Game.Managers.MyDefinitionManager.Static.GetCubeBlockDefinition(new CommonLib.ObjectBuilders.Definitions.MyDefinitionId(typeof(MyObjectBuilder_CubeBlock), "LargeBlockArmorBlock")); // block.SubtypeName = "LargeBlockGyro"; // grid.CubeBlocks.Add(block); // grid.LinearVelocity = MySector.MainCamera.ForwardVector * 20; // grid.PersistentFlags = MyPersistentEntityFlags2.Enabled | MyPersistentEntityFlags2.InScene; // var x = MyEntities.CreateFromObjectBuilderAndAdd(grid); //} if (MyInput.Static.IsAnyCtrlKeyPressed() && MyInput.Static.IsNewKeyPressed(MyKeys.Delete)) { int count = MyEntities.GetEntities().OfType <MyFloatingObject>().Count(); foreach (var obj in MyEntities.GetEntities().OfType <MyFloatingObject>()) { if (obj == MySession.Static.ControlledEntity) { MySession.Static.SetCameraController(MyCameraControllerEnum.Spectator); } obj.Close(); } handled = true; } if (MyInput.Static.IsAnyCtrlKeyPressed() && MyInput.Static.IsNewKeyPressed(MyKeys.Decimal)) { foreach (var obj in MyEntities.GetEntities()) { if (obj != MySession.Static.ControlledEntity && (MySession.Static.ControlledEntity == null || obj != MySession.Static.ControlledEntity.Entity.Parent) && obj != MyCubeBuilder.Static.FindClosestGrid()) { obj.Close(); } } handled = true; } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad9) || MyInput.Static.IsNewKeyPressed(MyKeys.NumPad5)) { //MyCubeGrid.UserCollisions = input.IsNewKeyPressed(Keys.NumPad9); var body = MySession.Static.ControlledEntity.Entity.GetTopMostParent().Physics; if (body.RigidBody != null) { //body.AddForce(Engine.Physics.MyPhysicsForceType.ADD_BODY_FORCE_AND_BODY_TORQUE, new Vector3(0, 0, 10 * body.Mass), null, null); body.RigidBody.ApplyLinearImpulse(body.Entity.WorldMatrix.Forward * body.Mass * 2); } handled = true; } //if (input.IsNewKeyPressed(Keys.J) && input.IsAnyCtrlKeyPressed()) //{ // MyGlobalInputComponent.CopyCurrentGridToClipboard(); // MyEntity addedEntity = MyGlobalInputComponent.PasteEntityFromClipboard(); // if (addedEntity != null) // { // Vector3 pos = addedEntity.GetPosition(); // pos.Z += addedEntity.WorldVolume.Radius * 1.5f; // addedEntity.SetPosition(pos); // } // handled = true; //} if (MyInput.Static.IsAnyCtrlKeyPressed() && MyInput.Static.IsNewKeyPressed(MyKeys.OemComma)) { foreach (var e in MyEntities.GetEntities().OfType <MyFloatingObject>().ToArray()) { e.Close(); } } return(handled); }
public override bool HandleInput() { bool handled = false; if (m_gridDebugInfo) { LineD line = new LineD(MySector.MainCamera.Position, MySector.MainCamera.Position + MySector.MainCamera.ForwardVector * 1000); MyCubeGrid grid; Vector3I cubePos; double distance; if (MyCubeGrid.GetLineIntersection(ref line, out grid, out cubePos, out distance)) { var gridMatrix = grid.WorldMatrix; var boxMatrix = Matrix.CreateTranslation(cubePos * grid.GridSize) * gridMatrix; var block = grid.GetCubeBlock(cubePos); MyRenderProxy.DebugDrawText2D(new Vector2(), cubePos.ToString(), Color.White, 0.7f); MyRenderProxy.DebugDrawOBB(Matrix.CreateScale(new Vector3(grid.GridSize) + new Vector3(0.15f)) * boxMatrix, Color.Red.ToVector3(), 0.2f, true, true); //int[, ,] bones = grid.Skeleton.AddCubeBones(cubePos); //Vector3 closestBone = Vector3.Zero; //Vector3I closestPoint = Vector3I.Zero; //float closestPointDist = float.MaxValue; //int closestBoneIndex = 0; //for (int x = -1; x <= 1; x += 1) //{ // for (int y = -1; y <= 1; y += 1) // { // for (int z = -1; z <= 1; z += 1) // { // int boneIndex = bones[x + 1, y + 1, z + 1]; // Vector3 bone = grid.Skeleton[boneIndex]; // var pos = boxMatrix.Translation + new Vector3(grid.GridSize / 2) * new Vector3(x, y, z); // //MyRenderProxy.DebugDrawSphere(pos, 0.2f, Color.Blue.ToVector3(), 1.0f, false); // MyRenderProxy.DebugDrawText3D(pos, String.Format("{0:G2}, {1:G2}, {2:G2}", bone.X, bone.Y, bone.Z), Color.White, 0.5f, false); // var dist = MyUtils.GetPointLineDistance(ref line, ref pos); // if (dist < closestPointDist) // { // closestPointDist = dist; // closestPoint = new Vector3I(x, y, z); // closestBoneIndex = boneIndex; // closestBone = bone; // } // } // } //} //MyRenderProxy.DebugDrawText3D(boxMatrix.Translation + new Vector3(grid.GridSize / 2) * closestPoint * 1.0f, String.Format("{0:G2}, {1:G2}, {2:G2}", closestBone.X, closestBone.Y, closestBone.Z), Color.Red, 0.5f, false); //var bonePos = grid.Skeleton[bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]]; //MyRenderProxy.DebugDrawSphere(boxMatrix.Translation + new Vector3(grid.GridSize / 2) * closestPoint * 1.0f + bonePos, 0.5f, Color.Red.ToVector3(), 0.4f, true, true); //if (input.IsNewKeyPressed(Keys.P) && block != null) //{ // if (input.IsAnyShiftKeyPressed()) // { // grid.ResetBlockSkeleton(block); // } // else // { // grid.Skeleton[bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]] = Vector3.Zero; // grid.AddDirtyBone(cubePos, closestPoint + Vector3I.One); // //grid.SetBlockDirty(block); // } // handled = true; //} //// Move bones to center by 0.1f //if (input.IsNewKeyPressed(Keys.OemOpenBrackets)) //{ // int index = bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]; // grid.Skeleton[index] -= Vector3.Sign(grid.Skeleton[index]) * 0.1f; // grid.AddDirtyBone(cubePos, closestPoint + Vector3I.One); // //grid.SetBlockDirty(block); // handled = true; //} //// Reduce max offset by 0.1f //if (input.IsNewKeyPressed(Keys.OemCloseBrackets)) //{ // int index = bones[closestPoint.X + 1, closestPoint.Y + 1, closestPoint.Z + 1]; // var old = Vector3.Abs(grid.Skeleton[index]); // var max = new Vector3(Math.Max(Math.Max(old.X, old.Y), old.Z)); // if (max.X > 0.1f) // { // grid.Skeleton[index] = Vector3.Clamp(grid.Skeleton[index], -max + 0.1f, max - 0.1f); // } // else // { // grid.Skeleton[index] = Vector3.Zero; // } // grid.AddDirtyBone(cubePos, closestPoint + Vector3I.One); // //grid.SetBlockDirty(block); // handled = true; //} } } if (MyInput.Static.IsAnyAltKeyPressed()) return handled; bool shift = MyInput.Static.IsAnyShiftKeyPressed(); bool ctrl = MyInput.Static.IsAnyCtrlKeyPressed(); //if (input.IsNewKeyPressed(Keys.I)) //{ // foreach (var grid in MyEntities.GetEntities().OfType<MyCubeGrid>()) // { // foreach (var block in grid.GetBlocks().ToArray()) // { // grid.DetectMerge(block.Min, block.Max); // } // } // handled = true; //} // Disabled since it is common to have normal control bound to O key. // If you ever need this again, bind it to something more complicated, like key combination. //if (input.IsNewKeyPressed(Keys.O)) //{ // m_gridDebugInfo = !m_gridDebugInfo; // handled = true; //} //for (int i = 0; i <= 9; i++) //{ // if (MyInput.Static.IsNewKeyPressed((Keys)(((int)Keys.D0) + i))) // { // string name = "Slot" + i.ToString(); // if (ctrl) // { // MySession.Static.Name = name; // MySession.Static.WorldID = MySession.GetNewWorldId(); // MySession.Static.Save(name); // } // else if (shift) // { // var path = MyLocalCache.GetSessionSavesPath(name, false, false); // if (System.IO.Directory.Exists(path)) // { // MySession.Static.Unload(); // MySession.Load(path); // } // } // handled = true; // } //} //if (MyInput.Static.IsNewKeyPressed(Keys.End)) //{ // MyMeteorShower.MeteorWave(null); //} // Disabled for god sake! //if (MyInput.Static.IsNewKeyPressed(Keys.PageUp) && MyInput.Static.IsAnyCtrlKeyPressed()) //{ // MyReloadTestComponent.Enabled = true; //} //if (MyInput.Static.IsNewKeyPressed(Keys.PageDown) && MyInput.Static.IsAnyCtrlKeyPressed()) //{ // MyReloadTestComponent.Enabled = false; //} if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad6)) { var view = MySession.Static.CameraController.GetViewMatrix(); var inv = Matrix.Invert(view); //MyPhysicalInventoryItem item = new MyPhysicalInventoryItem(100, var oreBuilder = MyObjectBuilderSerializer.CreateNewObject<MyObjectBuilder_Ore>("Stone"); var item = new MyPhysicalInventoryItem(1, oreBuilder); var obj = MyFloatingObjects.Spawn(item, inv.Translation + inv.Forward * 1.0f, inv.Forward, inv.Up); obj.Physics.LinearVelocity = inv.Forward * 50; } if (false && MyInput.Static.IsNewKeyPressed(MyKeys.NumPad9)) { List<HkShape> trShapes = new List<HkShape>(); List<HkConvexShape> shapes = new List<HkConvexShape>(); List<Matrix> matrices = new List<Matrix>(); var grid = new HkGridShape(2.5f, HkReferencePolicy.None); const short size = 50; for (short x = 0; x < size; x++) { for (short y = 0; y < size; y++) { for (short z = 0; z < size; z++) { var box = new HkBoxShape(Vector3.One); grid.AddShapes(new System.Collections.Generic.List<HkShape>() { box }, new Vector3S(x, y, z), new Vector3S(x, y, z)); trShapes.Add(new HkConvexTranslateShape(box, new Vector3(x, y, z), HkReferencePolicy.None)); shapes.Add(box); matrices.Add(Matrix.CreateTranslation(new Vector3(x, y, z))); } } } var emptyGeom = new HkGeometry(new List<Vector3>(), new List<int>()); var list = new HkListShape(trShapes.ToArray(), trShapes.Count, HkReferencePolicy.None); var compressedBv = new HkBvCompressedMeshShape(emptyGeom, shapes, matrices, HkWeldingType.None); var mopp = new HkMoppBvTreeShape(list, HkReferencePolicy.None); HkShapeBuffer buf = new HkShapeBuffer(); //HkShapeContainerIterator i = compressedBv.GetIterator(buf); //int count = 0; // will be 125000 //while (i.IsValid) //{ // count++; // i.Next(); //} buf.Dispose(); var info = new HkRigidBodyCinfo(); info.Mass = 10; info.CalculateBoxInertiaTensor(Vector3.One, 10); info.MotionType = HkMotionType.Dynamic; info.QualityType = HkCollidableQualityType.Moving; info.Shape = compressedBv; var body = new HkRigidBody(info); //MyPhysics.HavokWorld.AddRigidBody(body); } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad7)) { foreach (var g in MyEntities.GetEntities().OfType<MyCubeGrid>()) { foreach (var s in g.CubeBlocks.Select(s => s.FatBlock).Where(s => s != null).OfType<MyMotorStator>()) { if (s.Rotor != null) { var q = Quaternion.CreateFromAxisAngle(s.Rotor.WorldMatrix.Up, MathHelper.ToRadians(45)); s.Rotor.CubeGrid.WorldMatrix = MatrixD.CreateFromQuaternion(q) * s.Rotor.CubeGrid.WorldMatrix; } } } } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad8)) { var view = MySession.Static.CameraController.GetViewMatrix(); var inv = Matrix.Invert(view); var oreBuilder = MyObjectBuilderSerializer.CreateNewObject<MyObjectBuilder_Ore>("Stone"); var obj = new MyObjectBuilder_FloatingObject() { Item = new MyObjectBuilder_InventoryItem() { Content = oreBuilder, Amount = 1000 } }; obj.PositionAndOrientation = new MyPositionAndOrientation(inv.Translation + 2.0f * inv.Forward, inv.Forward, inv.Up); obj.PersistentFlags = MyPersistentEntityFlags2.InScene; var e = MyEntities.CreateFromObjectBuilderAndAdd(obj); e.Physics.LinearVelocity = Vector3.Normalize(inv.Forward) * 50.0f; } if (MyInput.Static.IsNewKeyPressed(MyKeys.Divide)) { } if (MyInput.Static.IsNewKeyPressed(MyKeys.Multiply)) { MyDebugDrawSettings.ENABLE_DEBUG_DRAW = !MyDebugDrawSettings.ENABLE_DEBUG_DRAW; MyStructuralIntegrity.Enabled = true; MyDebugDrawSettings.DEBUG_DRAW_STRUCTURAL_INTEGRITY = true; var grids = MyEntities.GetEntities().OfType<MyCubeGrid>(); foreach (var g in grids) { if (!g.IsStatic)// || g.GetBlocks().Count < 800) //to compute only castle continue; g.CreateStructuralIntegrity(); } } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad1)) { var e = MyEntities.GetEntities().OfType<MyCubeGrid>().FirstOrDefault(); if (e != null) { e.Physics.RigidBody.MaxLinearVelocity = 1000; if (e.Physics.RigidBody2 != null) e.Physics.RigidBody2.MaxLinearVelocity = 1000; e.Physics.LinearVelocity = new Vector3(1000, 0, 0); } } if (MyInput.Static.IsNewKeyPressed(MyKeys.Decimal)) { MyPrefabManager.Static.SpawnPrefab("respawnship", MySector.MainCamera.Position, MySector.MainCamera.ForwardVector, MySector.MainCamera.UpVector); } if (MyInput.Static.IsNewKeyPressed(MyKeys.Multiply) && MyInput.Static.IsAnyShiftKeyPressed()) { GC.Collect(2); } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad5)) { Thread.Sleep(250); } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad9)) { var obj = MySession.ControlledEntity != null ? MySession.ControlledEntity.Entity : null; if (obj != null) { const float dist = 5.0f; obj.PositionComp.SetPosition(obj.PositionComp.GetPosition() + obj.WorldMatrix.Forward * dist); } } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad4)) { IMyInventoryOwner invObject = MySession.ControlledEntity as IMyInventoryOwner; if (invObject != null) { MyFixedPoint amount = 20000; var oreBuilder = MyObjectBuilderSerializer.CreateNewObject<MyObjectBuilder_Ore>("Stone"); MyInventory inventory = invObject.GetInventory(0); inventory.AddItems(amount, oreBuilder); } handled = true; } //if (MyInput.Static.IsNewKeyPressed(Keys.NumPad8)) //{ // var pos = MySector.MainCamera.Position + MySector.MainCamera.ForwardVector * 2; // var grid = (MyObjectBuilder_CubeGrid)MyObjectBuilderSerializer.CreateNewObject(MyObjectBuilderTypeEnum.CubeGrid); // grid.PositionAndOrientation = new MyPositionAndOrientation(pos, Vector3.Forward, Vector3.Up); // grid.CubeBlocks = new List<MyObjectBuilder_CubeBlock>(); // grid.GridSizeEnum = MyCubeSize.Large; // var block = new MyObjectBuilder_CubeBlock(); // block.BlockOrientation = MyBlockOrientation.Identity; // block.Min = Vector3I.Zero; // //var blockDefinition = Sandbox.Game.Managers.MyDefinitionManager.Static.GetCubeBlockDefinition(new CommonLib.ObjectBuilders.Definitions.MyDefinitionId(typeof(MyObjectBuilder_CubeBlock), "LargeBlockArmorBlock")); // block.SubtypeName = "LargeBlockArmorBlock"; // grid.CubeBlocks.Add(block); // grid.LinearVelocity = MySector.MainCamera.ForwardVector * 20; // grid.PersistentFlags = MyPersistentEntityFlags2.Enabled | MyPersistentEntityFlags2.InScene; // var x = MyEntities.CreateFromObjectBuilderAndAdd(grid); //} //if (MyInput.Static.IsNewKeyPressed(Keys.NumPad9)) //{ // var pos = MySector.MainCamera.Position + MySector.MainCamera.ForwardVector * 2; // var grid = (MyObjectBuilder_CubeGrid)MyObjectBuilderSerializer.CreateNewObject(MyObjectBuilderTypeEnum.CubeGrid); // grid.PositionAndOrientation = new MyPositionAndOrientation(pos, Vector3.Forward, Vector3.Up); // grid.CubeBlocks = new List<MyObjectBuilder_CubeBlock>(); // grid.GridSizeEnum = MyCubeSize.Large; // var block = new MyObjectBuilder_CubeBlock(); // block.BlockOrientation = MyBlockOrientation.Identity; // block.Min = Vector3I.Zero; // //var blockDefinition = Sandbox.Game.Managers.MyDefinitionManager.Static.GetCubeBlockDefinition(new CommonLib.ObjectBuilders.Definitions.MyDefinitionId(typeof(MyObjectBuilder_CubeBlock), "LargeBlockArmorBlock")); // block.SubtypeName = "LargeBlockGyro"; // grid.CubeBlocks.Add(block); // grid.LinearVelocity = MySector.MainCamera.ForwardVector * 20; // grid.PersistentFlags = MyPersistentEntityFlags2.Enabled | MyPersistentEntityFlags2.InScene; // var x = MyEntities.CreateFromObjectBuilderAndAdd(grid); //} if (MyInput.Static.IsAnyCtrlKeyPressed() && MyInput.Static.IsNewKeyPressed(MyKeys.Delete)) { int count = MyEntities.GetEntities().OfType<MyFloatingObject>().Count(); foreach (var obj in MyEntities.GetEntities().OfType<MyFloatingObject>()) { if (obj == MySession.ControlledEntity) { MySession.SetCameraController(MyCameraControllerEnum.Spectator); } obj.Close(); } handled = true; } if (MyInput.Static.IsAnyCtrlKeyPressed() && MyInput.Static.IsNewKeyPressed(MyKeys.Decimal)) { foreach (var obj in MyEntities.GetEntities()) { if (obj != MySession.ControlledEntity && (MySession.ControlledEntity == null || obj != MySession.ControlledEntity.Entity.Parent) && obj != MyCubeBuilder.Static.FindClosestGrid()) obj.Close(); } handled = true; } if (MyInput.Static.IsNewKeyPressed(MyKeys.NumPad9) || MyInput.Static.IsNewKeyPressed(MyKeys.NumPad5)) { //MyCubeGrid.UserCollisions = input.IsNewKeyPressed(Keys.NumPad9); var body = MySession.ControlledEntity.Entity.GetTopMostParent().Physics; if (body.RigidBody != null) { //body.AddForce(Engine.Physics.MyPhysicsForceType.ADD_BODY_FORCE_AND_BODY_TORQUE, new Vector3(0, 0, 10 * body.Mass), null, null); body.RigidBody.ApplyLinearImpulse(body.Entity.WorldMatrix.Forward * body.Mass * 2); } handled = true; } //if (input.IsNewKeyPressed(Keys.J) && input.IsAnyCtrlKeyPressed()) //{ // MyGlobalInputComponent.CopyCurrentGridToClipboard(); // MyEntity addedEntity = MyGlobalInputComponent.PasteEntityFromClipboard(); // if (addedEntity != null) // { // Vector3 pos = addedEntity.GetPosition(); // pos.Z += addedEntity.WorldVolume.Radius * 1.5f; // addedEntity.SetPosition(pos); // } // handled = true; //} if (MyInput.Static.IsAnyCtrlKeyPressed() && MyInput.Static.IsNewKeyPressed(MyKeys.OemComma)) { foreach (var e in MyEntities.GetEntities().OfType<MyFloatingObject>().ToArray()) e.Close(); } return handled; }
private unsafe void DebugDrawShape(string blockName, HkShape shape, MatrixD worldMatrix) { float num = 1.05f; float num2 = 0.02f; if (MyPerGameSettings.Game == GameEnum.SE_GAME) { num2 = 0.1f; } switch (shape.ShapeType) { case HkShapeType.Box: MyRenderProxy.DebugDrawOBB(MatrixD.CreateScale((((HkBoxShape)shape).HalfExtents * 2f) + new Vector3(num2)) * worldMatrix, Color.Red, 0f, true, false, true, false); return; case HkShapeType.Capsule: case HkShapeType.TriSampledHeightFieldCollection: case HkShapeType.TriSampledHeightFieldBvTree: break; case HkShapeType.ConvexVertices: { GeometryCenterPair pair; HkConvexVerticesShape shape7 = (HkConvexVerticesShape)shape; if (!this.m_cachedGeometry.TryGetValue(blockName, out pair)) { Vector3 vector; HkGeometry geometry = new HkGeometry(); shape7.GetGeometry(geometry, out vector); GeometryCenterPair pair1 = new GeometryCenterPair(); pair1.Geometry = geometry; pair1.Center = vector; pair = pair1; if (!string.IsNullOrEmpty(blockName)) { this.m_cachedGeometry.Add(blockName, pair); } } Vector3D vectord = Vector3D.Transform(pair.Center, worldMatrix.GetOrientation()); MatrixD xd = worldMatrix; xd = MatrixD.CreateScale((double)num) * xd; MatrixD *xdPtr1 = (MatrixD *)ref xd; xdPtr1.Translation -= vectord * (num - 1f); this.DrawGeometry(pair.Geometry, xd, Color.Olive, false, false); break; } case HkShapeType.List: { HkShapeContainerIterator iterator = ((HkListShape)shape).GetIterator(); int num3 = 0; while (iterator.IsValid) { num3++; this.DebugDrawShape(blockName + num3, iterator.CurrentValue, worldMatrix); iterator.Next(); } return; } case HkShapeType.Mopp: { HkMoppBvTreeShape shape4 = (HkMoppBvTreeShape)shape; this.DebugDrawShape(blockName, (HkShape)shape4.ShapeCollection, worldMatrix); return; } case HkShapeType.ConvexTranslate: { HkConvexTranslateShape shape6 = (HkConvexTranslateShape)shape; this.DebugDrawShape(blockName, (HkShape)shape6.ChildShape, Matrix.CreateTranslation(shape6.Translation) * worldMatrix); return; } case HkShapeType.ConvexTransform: { HkConvexTransformShape shape5 = (HkConvexTransformShape)shape; this.DebugDrawShape(blockName, (HkShape)shape5.ChildShape, shape5.Transform * worldMatrix); return; } default: return; } }
private void AddPhysicalShape(HkShape shape, Matrix rdWorldMatrix) { switch (shape.ShapeType) { case Havok.HkShapeType.Box: Havok.HkBoxShape box = (HkBoxShape)shape; Vector3D vMin = new Vector3D(-box.HalfExtents.X, -box.HalfExtents.Y, -box.HalfExtents.Z); Vector3D vMax = new Vector3D(box.HalfExtents.X, box.HalfExtents.Y, box.HalfExtents.Z); BoundingBoxD boundingBox = new BoundingBoxD(vMin, vMax); BoundingBoxToTranslatedTriangles(boundingBox, rdWorldMatrix); break; case Havok.HkShapeType.List: var listShape = (HkListShape)shape; var iterator = listShape.GetIterator(); while (iterator.IsValid) { AddPhysicalShape(iterator.CurrentValue, rdWorldMatrix); iterator.Next(); } break; case HkShapeType.Mopp: var compoundShape = (HkMoppBvTreeShape)shape; AddPhysicalShape(compoundShape.ShapeCollection, rdWorldMatrix); break; case HkShapeType.ConvexTransform: var transformShape = (HkConvexTransformShape)shape; AddPhysicalShape(transformShape.ChildShape, transformShape.Transform * rdWorldMatrix); break; case HkShapeType.ConvexTranslate: var translateShape = (HkConvexTranslateShape)shape; var mat = Matrix.CreateTranslation(translateShape.Translation); AddPhysicalShape((HkShape)translateShape.ChildShape, mat * rdWorldMatrix); break; case HkShapeType.Sphere: var sphereShape = (HkSphereShape)shape; m_icosphereMesh.AddTrianglesToWorldVertices(rdWorldMatrix.Translation, sphereShape.Radius); break; case HkShapeType.Capsule: return; ProfilerShort.Begin("Capsule"); var capsuleShape = (HkCapsuleShape)shape; Line line = new Line(capsuleShape.VertexA, capsuleShape.VertexB); m_capsuleMesh.AddTrianglesToWorldVertices(rdWorldMatrix, capsuleShape.Radius, line); ProfilerShort.End(); break; case HkShapeType.ConvexVertices: var convexShape = (HkConvexVerticesShape)shape; HkGeometry geometry = new HkGeometry(); Vector3 center; convexShape.GetGeometry(geometry, out center); for (int i = 0; i < geometry.TriangleCount; i++) { int i0, i1, i2, materialIndex; geometry.GetTriangle(i, out i0, out i1, out i2, out materialIndex); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i0); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i1); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + i2); } for (int i = 0; i < geometry.VertexCount; i++) { Vector3 vec = geometry.GetVertex(i); Vector3.Transform(ref vec, ref rdWorldMatrix, out vec); m_worldVertices.Vertices.Add(vec); } m_worldVertices.VerticesMaxValue += geometry.VertexCount; break; default: // For breakpoint. Don't judge me :( break; } }
private void CreateMeshShape() { Profiler.Begin("MyVoxelGeometry.CellData.CreateMeshShape"); try { if (!m_meshShape.Base.IsZero) return; List<int> indexList = new List<int>(VoxelTrianglesCount * 3); List<Vector3> vertexList = new List<Vector3>(VoxelVerticesCount); for (int i = 0; i < VoxelTrianglesCount; i++) { indexList.Add(VoxelTriangles[i].VertexIndex0); indexList.Add(VoxelTriangles[i].VertexIndex2); indexList.Add(VoxelTriangles[i].VertexIndex1); } Vector3 tmp; for (int i = 0; i < VoxelVerticesCount; i++) { GetUnpackedPosition(ref m_voxelVertices[i], out tmp); vertexList.Add(tmp); } using (var cellGeometry = new HkGeometry(vertexList, indexList)) { var newShape = new HkBvCompressedMeshShape(cellGeometry, null, null, HkWeldingType.None); Debug.Assert(newShape.Base.ReferenceCount == 1); m_meshShape = newShape; } } finally { Profiler.End(); } }
private unsafe void AddPhysicalShape(HkShape shape, Matrix rdWorldMatrix) { switch (shape.ShapeType) { case HkShapeType.Sphere: { HkSphereShape shape7 = (HkSphereShape)shape; m_icosphereMesh.AddTrianglesToWorldVertices(rdWorldMatrix.Translation, shape7.Radius); return; } case HkShapeType.Cylinder: case HkShapeType.Triangle: case HkShapeType.TriSampledHeightFieldCollection: case HkShapeType.TriSampledHeightFieldBvTree: break; case HkShapeType.Box: { HkBoxShape shape2 = (HkBoxShape)shape; Vector3D min = new Vector3D((double)-shape2.HalfExtents.X, (double)-shape2.HalfExtents.Y, (double)-shape2.HalfExtents.Z); Vector3D max = new Vector3D((double)shape2.HalfExtents.X, (double)shape2.HalfExtents.Y, (double)shape2.HalfExtents.Z); BoundingBoxD bbox = new BoundingBoxD(min, max); this.BoundingBoxToTranslatedTriangles(bbox, rdWorldMatrix); return; } case HkShapeType.Capsule: return; case HkShapeType.ConvexVertices: { Vector3 vector; HkConvexVerticesShape shape9 = (HkConvexVerticesShape)shape; HkGeometry geometry = new HkGeometry(); shape9.GetGeometry(geometry, out vector); int triangleIndex = 0; while (true) { int num2; int num3; int num4; int num5; if (triangleIndex >= geometry.TriangleCount) { int vertexIndex = 0; while (true) { if (vertexIndex >= geometry.VertexCount) { WorldVerticesInfo worldVertices = m_worldVertices; worldVertices.VerticesMaxValue += geometry.VertexCount; break; } Vector3 vertex = geometry.GetVertex(vertexIndex); Vector3 *vectorPtr1 = (Vector3 *)ref vertex; Vector3.Transform(ref (Vector3) ref vectorPtr1, ref rdWorldMatrix, out vertex); m_worldVertices.Vertices.Add(vertex); vertexIndex++; } break; } geometry.GetTriangle(triangleIndex, out num2, out num3, out num4, out num5); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + num2); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + num3); m_worldVertices.Triangles.Add(m_worldVertices.VerticesMaxValue + num4); triangleIndex++; } break; } case HkShapeType.List: { HkShapeContainerIterator iterator = ((HkListShape)shape).GetIterator(); while (iterator.IsValid) { this.AddPhysicalShape(iterator.CurrentValue, rdWorldMatrix); iterator.Next(); } return; } case HkShapeType.Mopp: { HkMoppBvTreeShape shape4 = (HkMoppBvTreeShape)shape; this.AddPhysicalShape((HkShape)shape4.ShapeCollection, rdWorldMatrix); return; } case HkShapeType.ConvexTranslate: { HkConvexTranslateShape shape6 = (HkConvexTranslateShape)shape; Matrix matrix = Matrix.CreateTranslation(shape6.Translation); this.AddPhysicalShape((HkShape)shape6.ChildShape, matrix * rdWorldMatrix); return; } case HkShapeType.ConvexTransform: { HkConvexTransformShape shape5 = (HkConvexTransformShape)shape; this.AddPhysicalShape((HkShape)shape5.ChildShape, shape5.Transform * rdWorldMatrix); return; } default: return; } }
private void DebugDrawShape(string blockName, HkShape shape, MatrixD worldMatrix) { float expandRatio = 1.05f; float expandSize = 0.02f; if (MyPerGameSettings.Game == GameEnum.SE_GAME) expandSize = 0.1f; switch (shape.ShapeType) { case Havok.HkShapeType.Box: Havok.HkBoxShape box = (HkBoxShape) shape; MyRenderProxy.DebugDrawOBB(MatrixD.CreateScale(box.HalfExtents * 2 + new Vector3(expandSize)) * worldMatrix, Color.Red, 0, true, false); break; case Havok.HkShapeType.List: var listShape = (HkListShape)shape; var iterator = listShape.GetIterator(); int shapeIndex = 0; while (iterator.IsValid) { DebugDrawShape(blockName + shapeIndex++, iterator.CurrentValue, worldMatrix); iterator.Next(); } break; case HkShapeType.Mopp: var compoundShape = (HkMoppBvTreeShape)shape; DebugDrawShape(blockName, compoundShape.ShapeCollection, worldMatrix); break; case HkShapeType.ConvexTransform: var transformShape = (HkConvexTransformShape)shape; DebugDrawShape(blockName, transformShape.ChildShape, transformShape.Transform * worldMatrix); break; case HkShapeType.ConvexTranslate: var translateShape = (HkConvexTranslateShape)shape; DebugDrawShape(blockName, (HkShape)translateShape.ChildShape, Matrix.CreateTranslation(translateShape.Translation) * worldMatrix); break; case HkShapeType.ConvexVertices: var convexShape = (HkConvexVerticesShape)shape; GeometryCenterPair geometryCenterPair; ProfilerShort.Begin("MyExternalPathfinfing.m_cachedGeometry.TryGetValue"); if (!m_cachedGeometry.TryGetValue(blockName, out geometryCenterPair)) { HkGeometry debugGeometry = new HkGeometry(); Vector3 center; convexShape.GetGeometry(debugGeometry, out center); geometryCenterPair = new GeometryCenterPair() { Geometry = debugGeometry, Center = center }; if (!string.IsNullOrEmpty(blockName)) m_cachedGeometry.Add(blockName, geometryCenterPair); } ProfilerShort.End(); Vector3D transformedCenter = Vector3D.Transform(geometryCenterPair.Center, worldMatrix.GetOrientation()); var matrix = worldMatrix; matrix = MatrixD.CreateScale(expandRatio) * matrix; matrix.Translation -= transformedCenter * (expandRatio - 1); DrawGeometry(geometryCenterPair.Geometry, matrix, Color.Olive); break; default: // For breakpoint. Don't judge me :( break; } }
/* public Vector3D? GetNextPathPoint(Vector3D initialPosition, Vector3D targetPosition) { List<Vector3D> path = GetPathPoints(initialPosition, targetPosition); for(int i = 0; i < path.Count-1 ; i++) { var worldPoint = path[i];// LocalPositionToWorldPosition(path[i]); var nextWorldPoint = path[i + 1]; //LocalPositionToWorldPosition(path[i+1]); MyRenderProxy.DebugDrawLine3D(worldPoint, nextWorldPoint, Color.Red, Color.Red, true); MyRenderProxy.DebugDrawSphere(nextWorldPoint, 0.3f, Color.Yellow, 1f, true); } // First point is initialPosition if (path.Count >= 2) return path[1]; //LocalPositionToWorldPosition(path[1]); else return null; } */ #region DebugDraw public void DrawGeometry(HkGeometry geometry, MatrixD worldMatrix, Color color, bool depthRead = false, bool shaded = false) { var msg = MyRenderProxy.PrepareDebugDrawTriangles(); try { ProfilerShort.Begin("MyExternalPathfinfing.GetGeometryTriangles"); for (int i = 0; i < geometry.TriangleCount; i++) { int a, b, c, m; geometry.GetTriangle(i, out a, out b, out c, out m); msg.AddIndex(a); msg.AddIndex(b); msg.AddIndex(c); } for (int i = 0; i < geometry.VertexCount; i++) msg.AddVertex(geometry.GetVertex(i)); ProfilerShort.End(); } finally { MyRenderProxy.DebugDrawTriangles(msg, worldMatrix, color, depthRead, shaded); } }