Skip to content

Instantly share code, notes, and snippets.

@iximeow
Last active August 29, 2015 14:08
Show Gist options
  • Save iximeow/6fa2f055034cac592259 to your computer and use it in GitHub Desktop.
Save iximeow/6fa2f055034cac592259 to your computer and use it in GitHub Desktop.
example of ixee UI element renderer code
public interface UIGenericElementRenderer<T extends glEEngine> {
public void unsafeDraw(UIElement elem, T engine);
}
public abstract class UIElementRenderer<T extends glEEngine, U extends UIElement> implements UIGenericElementRenderer<T> {
Class<U> myClass;
public UIElementRenderer(Class<U> rendereeClass) {
myClass = rendereeClass;
}
public Class<U> drawFor() { return myClass; }
public abstract void draw(U elem, ElementDrawer<T> drawer);
public void unsafeDraw(UIElement elem, ElementDrawer<T> drawer) {
draw((U)elem, engine);
}
}
public interface ElementDrawer<T> {
public void draw(UIElement e);
public T backend();
}
public class OGLElementDrawer implements ElementDrawer<glEEngine> {
glEEngine backend;
static Map<Class, UIElementRenderer> renderers = new HashMap<Class, UIElementRenderer>();
static {
register(new UITextRenderer());
}
private static void register(UIElementRenderer renderer) {
renderers.put(renderer.drawFor(), renderer);
}
public OGLElementDrawer(glEEngine e) {
backend = e;
}
public glEEngine backend() {
return backend;
}
/*
* unchecked warning is generated by call to unsafeDraw
* unsafeDraw is actually unsafe (typecasts arg to type expected for renderer)
* but because UIElementRenderer is parameterized on the type it draws for,
* and returns that class via drawFor(),
* the register method here guarantees that if an entry exists for an elem's class
* then the renderer associated will draw its class
*
* this guarantees the typecast in unsafeDraw is actually safe,
* so it is okay to suppress this warning.
*/
@SuppressWarnings("unchecked")
public void draw(UIElement e) {
UIElementRenderer renderer = renderers.get(e.getClass());
if (renderer == null) {
throw new RuntimeException("No renderer available for " + e); //TODO: NoRendererException
}
renderer.unsafeDraw(e, this);
}
}
public class UITextRenderer extends UIElementRenderer<glEEngine, UIText> {
public UITextRenderer() {
super(UIText.class);
}
public void draw(UIText elem, ElementDrawer<glEEngine> drawer) {
// rendering logic
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment