Files
Gruppe-02-clone/Projekte/jme-common/src/main/java/pp/view/ModelViewSynchronizer.java
2024-09-18 17:04:31 +02:00

91 lines
2.6 KiB
Java

////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.view;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.HashMap;
import java.util.Map;
/**
* Abstract base class for keeping the scene graph (=view) in sync with the model.
*/
public abstract class ModelViewSynchronizer<I> {
private static final Logger LOGGER = System.getLogger(ModelViewSynchronizer.class.getName());
private final Node itemNode = new Node("items"); //NON-NLS
private final Map<I, Spatial> itemMap = new HashMap<>();
/**
* Saves the game state and the node.
*
* @param root particular node
*/
protected ModelViewSynchronizer(Node root) {
root.attachChild(itemNode);
}
/**
* Returns the spatial representing the specified item,
* or null if the item has no view counterpart.
*/
public Spatial getSpatial(I item) {
return itemMap.get(item);
}
/**
* removes spatial from map
*
* @param item spatial that should be removed
*/
public void delete(I item) {
final Spatial spatial = itemMap.remove(item);
if (spatial != null) {
spatial.removeFromParent();
LOGGER.log(Level.DEBUG, "removed spatial for {0} in {1}", item, this); //NON-NLS
}
}
/**
* add spatial to map
*
* @param item spatial that schuld be added
*/
public void add(I item) {
if (itemMap.containsKey(item)) {
LOGGER.log(Level.WARNING, "Item {0} already managed by {1}", item, this); //NON-NLS
return;
}
final Spatial spatial = translate(item);
itemMap.put(item, spatial);
LOGGER.log(Level.DEBUG, "added spatial for {0} in {1}", item, this); //NON-NLS
if (spatial != null)
itemNode.attachChild(spatial);
}
/**
* Removed every item
*/
public void clear() {
LOGGER.log(Level.DEBUG, "clear"); //NON-NLS
itemMap.clear();
itemNode.detachAllChildren();
}
/**
* Creates the spatial for the specified item. Implementations may decide to return null. This
* means that the item shall not be represented in the scene graph.
*
* @param item the item whose representing spatial is asked for
* @return the spatial of the item, or null if the item shall not be represented by a spatial.
*/
protected abstract Spatial translate(I item);
}