private void UpdatePhysicsShape()
        {
            var subpart = m_subpart1;

            if (!m_posChanged || subpart == null || m_subpartPhysics == null || m_subpartPhysics.RigidBody == null)
            {
                return;
            }
            m_posChanged = false;
            //We are updating once 10 frames so we need to account for velocity when retracting
            var     speedCorrection = Math.Abs(Velocity < 0 ? Velocity / 6 : 0);
            Vector3 vertexA         = new Vector3(0, -m_currentPos * 0.5f + speedCorrection - 0.1f, 0);
            Vector3 vertexB         = new Vector3(0, m_currentPos * 0.5f - speedCorrection, 0);

            if (vertexB.Y - vertexA.Y > 0.1f) //larger than convex radius
            {
                var existingShape = m_subpartPhysics.RigidBody.GetShape();
                if (existingShape.ShapeType == HkShapeType.Cylinder)
                {
                    float dist      = Math.Abs(vertexA.Y - vertexB.Y);
                    var   cyl       = (HkCylinderShape)existingShape;
                    float distExist = Math.Abs(cyl.VertexA.Y - cyl.VertexB.Y);
                    if (Math.Abs(dist - distExist) < 0.001f)
                    {
                        return;
                    }
                    cyl.VertexA = vertexA;
                    cyl.VertexB = vertexB;
                    m_subpartPhysics.RigidBody.UpdateShape();
                }
                else
                {
                    Debug.Fail("Piston subpart shape isnt cylinder. Shouldnt happen");
                }
                if (!m_subpartPhysics.Enabled)
                {
                    m_subpartPhysics.Enabled = true;
                }
                //jn:TODO hack fix
                CheckSubpartConstraint();
                UpdateSubpartFixedData();
                if (CubeGrid.Physics.IsInWorldWelded() && m_subpartPhysics.IsInWorldWelded())
                {
                    if (m_subpartsConstraint != null && !m_subpartsConstraint.InWorld && !m_subPartContraintInScene)
                    {
                        m_subPartContraintInScene = true;
                        CubeGrid.Physics.AddConstraint(m_subpartsConstraint);
                    }
                }
                if (m_subpartsConstraint != null && !m_subpartsConstraint.Enabled)
                {
                    m_subPartContraintInScene    = true;
                    m_subpartsConstraint.Enabled = true;
                }
            }
            else
            {
                if (m_subpartsConstraint.Enabled && m_subpartsConstraint.InWorld)
                {
                    m_subPartContraintInScene    = false;
                    m_subpartsConstraint.Enabled = false;
                    CubeGrid.Physics.RemoveConstraint(m_subpartsConstraint);
                }
                m_subpartPhysics.Enabled = false;
            }
        }