@Override
    @SuppressWarnings("unchecked")
    public void cloneFields(Cloner cloner, Object original) {
        // Clone all of the fields that need fix-ups and/or potential
        // sharing.
        this.parent = cloner.clone(parent);
        this.worldBound = cloner.clone(worldBound);
        this.worldLights = cloner.clone(worldLights);
        this.localLights = cloner.clone(localLights);
        this.worldTransform = cloner.clone(worldTransform);
        this.localTransform = cloner.clone(localTransform);
        this.worldOverrides = cloner.clone(worldOverrides);
        this.localOverrides = cloner.clone(localOverrides);
        this.controls = cloner.clone(controls);

        // Cloner doesn't handle maps on its own just yet.
        // Note: this is more advanced cloning than the old clone() method
        // did because it just shallow cloned the map.  In this case, we want
        // to avoid all of the nasty cloneForSpatial() fixup style code that
        // used to inject stuff into the clone's user data.  By using cloner
        // to clone the user data we get this automatically.
        if (userData != null) {
            userData = (HashMap<String, Savable>) userData.clone();
            for (Map.Entry<String, Savable> e : userData.entrySet()) {
                Savable value = e.getValue();
                if (value instanceof Cloneable) {
                    // Note: all JmeCloneable objects are also Cloneable so this
                    // catches both cases.
                    e.setValue(cloner.clone(value));
                }
            }
        }
    }
Called internally by com.jme3.util.clone.Cloner.  Do not call directly.
jme3-core/src/main/java/com/jme3/scene/Spatial.java