/******************************************************************************* * Copyright (c) 2007 VTT Technical Research Centre of Finland and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.proconf.g3d.common; import java.util.logging.LogManager; import org.eclipse.core.runtime.Path; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.opengl.GLCanvas; import org.eclipse.swt.widgets.Composite; import org.simantics.proconf.g3d.base.JmeRenderingComponent; import org.simantics.proconf.g3d.base.ResourceTextureCache; import org.simantics.utils.ui.ErrorLogger; import com.jme.renderer.Renderer; import com.jme.renderer.lwjgl.LWJGLRenderer; import com.jme.scene.Node; import com.jme.system.DisplaySystem; import com.jme.system.swt.SWTDisplaySystem; import com.jme.util.TextureManager; public class JmeComposite extends Composite { protected Node rootNode = new Node("root"); private SWTDisplaySystem displaySystem; protected GLCanvas renderingCanvas; private JmeRenderingComponent component; public JmeComposite(Composite parent, JmeRenderingComponent component) { super(parent,SWT.NONE); if (component == null) throw new NullPointerException("Rendering component must not be null."); disableLog(); //LoggingSystem.getLogger().setLevel(Level.OFF); this.component = component; this.setLayout(new FillLayout()); displaySystem = (SWTDisplaySystem)DisplaySystem.getDisplaySystem("SWT"); renderingCanvas = displaySystem.createCanvas(640, 480, this); renderingCanvas.addControlListener(new ControlAdapter() { public void controlResized(ControlEvent e) { resize(); } }); // this.addPaintListener(new PaintListener() { // @Override // public void paintControl(PaintEvent e) { // displaySystem.setCurrent(); // JmeComposite.this.component.render(); // } // }); } private void disableLog() { //URL url = FileLocator.find(org.simantics.proconf.g3d.Activator.getDefault().getBundle(),new Path("logging.properties"),null); try { LogManager.getLogManager().readConfiguration(org.simantics.proconf.g3d.Activator.getDefault().openStream(new Path("logging.properties"))); } catch (Exception e) { ErrorLogger.defaultLogError(e); } } public void resize() { displaySystem.setCurrent(); LWJGLRenderer renderer = (LWJGLRenderer) displaySystem.getRenderer(); if (renderer!= null) { Rectangle r = new Rectangle(renderingCanvas.getClientArea().x,renderingCanvas.getClientArea().y, renderingCanvas.getClientArea().width, renderingCanvas.getClientArea().height ); if (r.width > 0 && r.height > 0) renderer.reinit(r.width, r.height); component.resize(r.width, r.height); } } public GLCanvas getCanvas() { return renderingCanvas; } public Renderer getRenderer() { return displaySystem.getRenderer(); } public void initGL() { component.init(displaySystem); } public void dispose() { LWJGLRenderer renderer = (LWJGLRenderer) displaySystem.getRenderer(); renderer.clearVBOCache(); renderer.clearQueue(); renderer.clearStatistics(); renderingCanvas.dispose(); if (displaySystem.destroy()) { TextureManager.doTextureCleanup(); TextureManager.clearCache(); ResourceTextureCache.getInstance().clear(); } super.dispose(); } public DisplaySystem getDisplaySystem() { return displaySystem; } }