/* * 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.graphics.Graph; import aphelion.shared.resource.ResourceDB; import de.lessvoid.nifty.Nifty; import de.lessvoid.nifty.builder.ControlDefinitionBuilder; import de.lessvoid.nifty.builder.PanelBuilder; import de.lessvoid.nifty.controls.Controller; import de.lessvoid.nifty.elements.Element; import de.lessvoid.nifty.elements.render.ElementRenderer; import de.lessvoid.nifty.elements.render.PanelRenderer; import de.lessvoid.nifty.input.NiftyInputEvent; import de.lessvoid.nifty.render.NiftyRenderEngine; import de.lessvoid.nifty.screen.Screen; import de.lessvoid.xml.xpp3.Attributes; import java.util.Properties; import java.util.WeakHashMap; import org.newdawn.slick.Color; import org.newdawn.slick.opengl.TextureImpl; /** * * @author Joris */ public class CameraNiftyController implements Controller { private Element element; private Nifty nifty; private Camera camera; private CameraForNifty handler; private boolean stars; private boolean clip; private boolean zoomFill; @Override public void bind(Nifty nifty, Screen screen, Element element, Properties parameter, Attributes controlDefinitionAttributes) { assert this.element == null; this.element = element; this.nifty = nifty; ElementRenderer[] renders = element.getElementRenderer(); for (int i = 0; i < renders.length; ++i) { if (renders[i] instanceof PanelRenderer) { renders[i] = new CameraRenderer(); } } } @Override public void init(Properties parameter, Attributes controlDefinitionAttributes) { synchronized(handlers) { handler = handlers.get(nifty); assert handler != null; } camera = new Camera(handler.getResourceDB()); camera.nifty = nifty; String zoom = controlDefinitionAttributes.get("zoom"); zoomFill = "fill".equals(zoom); if (!zoomFill && zoom != null) { try { float fZoom = Float.parseFloat(zoom); camera.setZoom(fZoom <= 0 ? 1 : fZoom); } catch(NumberFormatException ex){} } clip = controlDefinitionAttributes.getAsBoolean("clip", true); stars = controlDefinitionAttributes.getAsBoolean("stars", false); String fontPlayer = controlDefinitionAttributes.get("font-player"); if (fontPlayer != null) { camera.playerFont = nifty.createFont(fontPlayer); } } @Override public void onStartScreen() { } @Override public void onFocus(boolean getFocus) { } @Override public boolean inputEvent(NiftyInputEvent inputEvent) { return false; } private class CameraRenderer implements ElementRenderer { @Override public void render(Element element, NiftyRenderEngine r) { assert element == CameraNiftyController.this.element; camera.setDimension(element.getWidth(), element.getHeight()); camera.setScreenPosition(element.getX(), element.getY()); if (zoomFill) { camera.setZoom(camera.dimension.y / 1024f / 16f); } TextureImpl.unbind(); Graph.g.setColor(Color.white); if (clip) { camera.setGraphicsClip(); } handler.renderCamera(camera, stars); if (clip) { Graph.g.clearClip(); } TextureImpl.unbind(); Graph.g.setColor(Color.white); r.setColor(de.lessvoid.nifty.tools.Color.WHITE); } } private static final WeakHashMap<Nifty, CameraForNifty> handlers = new WeakHashMap<>(1); public static void registerControl(Nifty nifty, CameraForNifty handler) { new ControlDefinitionBuilder("aphelion-camera") {{ controller(CameraNiftyController.class.getName()); panel(new PanelBuilder() {{ width(controlParameter("width")); height(controlParameter("height")); x(controlParameter("width")); y(controlParameter("width")); margin(controlParameter("margin")); backgroundColor("#ff0000aa"); // test try{ align( Align.valueOf(controlParameter( "align"))); }catch(IllegalArgumentException ex) {} try{ valign(VAlign.valueOf(controlParameter("valign"))); }catch(IllegalArgumentException ex) {} }}); }}.registerControlDefintion(nifty); synchronized(handlers) { handlers.put(nifty, handler); } } public static interface CameraForNifty { ResourceDB getResourceDB(); void renderCamera(Camera camera, boolean renderStars); } }