package tk.amberide.ide.gui.editor.map.res; import tk.amberide.ide.data.io.ImagingTools; import tk.amberide.engine.gl.GLUtil; import tk.amberide.engine.gl.model.ModelScene; import tk.amberide.engine.gl.model.obj.WavefrontObject; import tk.amberide.ide.gui.misc.ErrorHandler; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.WeakHashMap; import static org.lwjgl.opengl.GL11.*; import org.lwjgl.util.glu.GLU; /** * * @author Tudor */ public class ModelThumbnail { private static final WeakHashMap<WavefrontObject, Image> thumbs = new WeakHashMap<WavefrontObject, Image>(); public static Image getModelImage(WavefrontObject obj) { if (!thumbs.containsKey(obj)) { thumbs.put(obj, makeImage(obj)); } return thumbs.get(obj); } public static Image getModelImage(WavefrontObject obj, int w, int h) { Image img = getModelImage(obj); if (img.getHeight(null) > h || img.getWidth(null) > w) { return ImagingTools.scaleImage((BufferedImage) img, w, h); } return img; } public static void clearCache() { thumbs.clear(); } private static Image makeImage(final WavefrontObject model) { if (model == null) { throw new IllegalArgumentException("model may not be null"); } final int width = 512; final int height = 512; BufferedImage img = null; try { img = GLUtil.renderImage( width, height, new Runnable() { @Override public void run() { glClearColor(0, 0, 0, 0); ModelScene scene; try { scene = new ModelScene(model); } catch (IOException ex) { ErrorHandler.alert(ex); return; } // Enable transperancy glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); float fAspect = (float) width / (float) height; GLU.gluPerspective(45.0f, fAspect, 0.5f, 400.0f); for (int i = 0; i != 2; i++) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); GLU.gluLookAt((float) Math.sin(0) * 3 * 5, 0, (float) Math.cos(0) * 3 * 5, 0, 0, 0, 0, 1, 0); glTranslatef(0, -3, 0); scene.draw(); } } }); if (img != null) { return ImagingTools.trimAlpha(img); } } catch (Exception ex) { ex.printStackTrace(); } return img; } }