/*
* 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.glsl;
import java.util.*;
public abstract class Symbol {
public abstract String name(Context ctx);
public static class Gen extends Symbol {
public final String prefix;
public Gen(String prefix) {
this.prefix = prefix;
}
public Gen() {
this("g");
}
public String name(Context ctx) {
String nm = ctx.symtab.get(this);
if(nm == null) {
nm = prefix + ctx.symgen++;
if(ctx.rsymtab.get(nm) != null)
throw(new RuntimeException("Name conflict for gensym"));
ctx.symtab.put(this, nm);
ctx.rsymtab.put(nm, this);
}
return(nm);
}
public String toString() {return("#:" + prefix);}
}
public static class Fix extends Symbol {
public final String name;
public Fix(String name) {
this.name = name;
}
public String name(Context ctx) {
Symbol p = ctx.rsymtab.get(name);
if(p == null) {
ctx.symtab.put(this, name);
ctx.rsymtab.put(name, this);
} else if(p != this) {
throw(new RuntimeException("Name conflict for fix symbol `" + name + "'"));
}
return(name);
}
public String toString() {
return(name);
}
}
public static class Shared extends Symbol {
public final String prefix;
public Shared(String prefix) {
this.prefix = prefix;
}
public Shared() {
this("s_g");
}
public String name(Context ctx) {
if(!(ctx instanceof ShaderContext))
throw(new ClassCastException("Program-shared symbols cannot be used outside a program context"));
ProgramContext prog = ((ShaderContext)ctx).prog;
String nm = ctx.symtab.get(this);
if(nm == null) {
nm = prog.symtab.get(this);
if(nm == null) {
nm = prefix + prog.symgen++;
if(prog.rsymtab.get(nm) != null)
throw(new RuntimeException("Name conflict for shared symbol"));
prog.symtab.put(this, nm);
prog.rsymtab.put(nm, this);
}
if(ctx.rsymtab.get(nm) != null)
throw(new RuntimeException("Name conflict for shared symbol"));
ctx.symtab.put(this, nm);
ctx.rsymtab.put(nm, this);
}
return(nm);
}
public String toString() {return("#s:" + prefix);}
}
}