public Mesh deepClone() {
        try {
            Mesh clone = (Mesh) super.clone();
            clone.meshBound = meshBound != null ? meshBound.clone() : null;

            // TODO: Collision tree cloning
            //clone.collisionTree = collisionTree != null ? collisionTree : null;
            clone.collisionTree = DEFAULT_COLLISION_TREE; // it will get re-generated in any case

            clone.buffers = new IntMap<>();
            clone.buffersList = new SafeArrayList<>(VertexBuffer.class);
            for (VertexBuffer vb : buffersList.getArray()) {
                VertexBuffer bufClone = vb.clone();
                clone.buffers.put(vb.getBufferType().ordinal(), bufClone);
                clone.buffersList.add(bufClone);
            }

            clone.vertexArrayID = DEFAULT_VERTEX_ARRAY_ID;
            clone.vertCount = vertCount;
            clone.elementCount = elementCount;
            clone.instanceCount = instanceCount;

            // although this could change
            // if the bone weight/index buffers are modified
            clone.maxNumWeights = maxNumWeights;

            clone.elementLengths = elementLengths != null ? elementLengths.clone() : null;
            clone.modeStart = modeStart != null ? modeStart.clone() : null;
            return clone;
        } catch (CloneNotSupportedException ex) {
            throw new AssertionError();
        }
    }
Creates a deep clone of this mesh.
The {@link VertexBuffer vertex buffers} and the data inside them
is cloned.

@return a deep clone of this mesh.
jme3-core/src/main/java/com/jme3/scene/Mesh.java