Last active
August 29, 2015 14:08
-
-
Save iximeow/6fa2f055034cac592259 to your computer and use it in GitHub Desktop.
example of ixee UI element renderer code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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