/* * This file is part of the Haven & Hearth game client. * Copyright (C) 2009 Fredrik Tolf <fredrik@dolda2000.com>, and * Björn Johannessen <johannessen.bjorn@gmail.com> * * Redistribution and/or modification of this file is subject to the * terms of the GNU Lesser General Public License, version 3, as * published by the Free Software Foundation. * * This program 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. * * Other parts of this source tree adhere to other copying * rights. Please see the file `COPYING' in the root directory of the * source tree for details. * * A copy the GNU Lesser General Public License is distributed along * with the source tree of which this file is a part in the file * `doc/LPGL-3'. If it is missing for any reason, please see the Free * Software Foundation's website at <http://www.fsf.org/>, or write * to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307 USA */ package haven; import haven.glsl.*; import static haven.glsl.Cons.*; public class RenderedNormals extends FBConfig.RenderTarget { private static final IntMap<ShaderMacro[]> shcache = new IntMap<ShaderMacro[]>(); private static ShaderMacro[] code(final int id) { ShaderMacro[] ret = shcache.get(id); if(ret == null) { ret = new ShaderMacro[] { new ShaderMacro() { public void modify(final ProgramContext prog) { MiscLib.frageyen(prog.fctx); prog.fctx.new FragData(id) { public Expression root() { return(vec4(mul(add(MiscLib.frageyen(prog.fctx).depref(), l(1.0)), l(0.5)), l(1.0))); } }; } } }; shcache.put(id, ret); } return(ret); } public static final GLState.Slot<GLState> slot = new GLState.Slot<GLState>(GLState.Slot.Type.SYS, GLState.class, GLFrameBuffer.slot, States.presdepth.slot); public GLState state(final FBConfig cfg, final int id) { return(new GLState() { private final ShaderMacro[] shaders = code(id); public ShaderMacro[] shaders() {return(shaders);} public boolean reqshaders() {return(true);} public void apply(GOut g) { GLFrameBuffer fb = g.st.get(GLFrameBuffer.slot); if(fb != cfg.fb) throw(new RuntimeException("Applying normal rendering in illegal framebuffer context")); if(g.st.get(States.presdepth.slot) != null) fb.mask(g, id, false); } public void unapply(GOut g) { g.st.cur(GLFrameBuffer.slot).mask(g, id, true); } public void prep(Buffer buf) { buf.put(slot, this); } }); } public static final PView.RenderContext.DataID<RenderedNormals> id = new PView.RenderContext.DataID<RenderedNormals>() { public RenderedNormals make(PView.RenderContext ctx) { return(new RenderedNormals()); } }; }