/* * Aphelion * Copyright (c) 2013 Joris van der Wel * * This file is part of Aphelion * * Aphelion is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, version 3 of the License. * * Aphelion is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Aphelion. If not, see <http://www.gnu.org/licenses/>. * * In addition, the following supplemental terms apply, based on section 7 of * the GNU Affero General Public License (version 3): * a) Preservation of all legal notices and author attributions * b) Prohibition of misrepresentation of the origin of this material, and * modified versions are required to be marked in reasonable ways as * different from the original version (for example by appending a copyright notice). * * Linking this library statically or dynamically with other modules is making a * combined work based on this library. Thus, the terms and conditions of the * GNU Affero General Public License cover the whole combination. * * As a special exception, the copyright holders of this library give you * permission to link this library with independent modules to produce an * executable, regardless of the license terms of these independent modules, * and to copy and distribute the resulting executable under terms of your * choice, provided that you also meet, for each linked independent module, * the terms and conditions of the license of that module. An independent * module is a module which is not derived from or based on this library. */ package aphelion.client.graphics.screen; import aphelion.client.RENDER_LAYER; import aphelion.client.graphics.world.MapEntities; import aphelion.client.graphics.world.StarField; import aphelion.shared.map.MapClassic; import aphelion.shared.map.tile.TileType; import aphelion.shared.resource.ResourceDB; import aphelion.shared.swissarmyknife.Point; import javax.annotation.Nonnull; import org.lwjgl.opengl.GL11; /** * * @author Joris */ public class NiftyCameraImpl implements CameraNiftyController.CameraForNifty { private final ResourceDB resourceDB; private final MapEntities mapEntities; private final MapClassic mapClassic; private final StarField stars; private final Point defaultCameraPosition = new Point(8192, 8192); public NiftyCameraImpl(@Nonnull ResourceDB resourceDB, @Nonnull MapEntities mapEntities, @Nonnull MapClassic mapClassic, @Nonnull StarField stars) { this.resourceDB = resourceDB; this.mapEntities = mapEntities; this.mapClassic = mapClassic; this.stars = stars; } @Override public ResourceDB getResourceDB() { return resourceDB; } public void setDefaultCameraPosition(@Nonnull Point point) { defaultCameraPosition.set(point); } public void setDefaultCameraPosition(float x, float y) { defaultCameraPosition.set(x, y); } @Override public void renderCamera(@Nonnull Camera camera, boolean renderStars) { GL11.glColor3f(1, 1, 1); camera.setPosition(defaultCameraPosition); camera.clipPosition(0, 0, 1024*16, 1024*16); if (renderStars) { stars.render(camera); } camera.renderEntities(mapEntities.animations(RENDER_LAYER.BACKGROUND, camera)); camera.renderTiles(mapClassic, TileType.TILE_LAYER.PLAIN); // rendered in a seperate iteration so that we do not have to switch between textures as often // (tile set is one big texture) camera.renderTiles(mapClassic, TileType. TILE_LAYER.ANIMATED); camera.renderEntities(mapEntities.animations(RENDER_LAYER.AFTER_TILES, camera)); camera.renderEntities(mapEntities.projectiles(false)); camera.renderEntities(mapEntities.animations(RENDER_LAYER.AFTER_PROJECTILES, camera)); camera.renderEntities(mapEntities.shipsNoLocal()); camera.renderEntities(mapEntities.animations(RENDER_LAYER.AFTER_SHIPS, camera)); camera.renderEntity(mapEntities.getLocalShip()); camera.renderTiles(mapClassic, TileType.TILE_LAYER.PLAIN_OVER_SHIP); camera.renderEntities(mapEntities.animations(RENDER_LAYER.AFTER_LOCAL_SHIP, camera)); } }