package org.terasology.rendering.cameras; import org.terasology.config.RenderingConfig; import org.terasology.math.geom.Vector3f; import org.terasology.rendering.RenderHelper; import org.terasology.world.WorldProvider; public abstract class SubmersibleCamera extends Camera { /* Used for Underwater Checks */ private WorldProvider worldProvider; private RenderingConfig renderingConfig; public SubmersibleCamera(WorldProvider worldProvider, RenderingConfig renderingConfig) { this.worldProvider = worldProvider; this.renderingConfig = renderingConfig; } /** * Returns True if the head of the player is underwater. False otherwise. * * Takes in account waves if present. * * @return True if the head of the player is underwater. False otherwise. */ public boolean isUnderWater() { // TODO: Making this as a subscribable value especially for node "ChunksRefractiveReflectiveNode", // TODO: glDisable and glEnable state changes on that node will be dynamically added/removed based on this value. Vector3f cameraPosition = new Vector3f(this.getPosition()); // Compensate for waves if (renderingConfig.isAnimateWater()) { cameraPosition.y -= RenderHelper.evaluateOceanHeightAtPosition(cameraPosition, worldProvider.getTime().getDays()); } if (worldProvider.isBlockRelevant(cameraPosition)) { return worldProvider.getBlock(cameraPosition).isLiquid(); } return false; } }