package org.geogebra.web.geogebra3D.web.input3D; import org.geogebra.common.main.App; import org.geogebra.web.geogebra3D.web.euclidian3D.openGL.RendererImplShadersW; import org.geogebra.web.geogebra3D.web.euclidian3D.openGL.RendererWithImplW; import org.geogebra.web.html5.util.DynamicScriptElement; import org.geogebra.web.html5.util.ScriptLoadCallback; import org.geogebra.web.web.gui.layout.DockPanelW; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.user.client.Window; import com.googlecode.gwtgl.binding.WebGLRenderingContext; /** * web renderer for zSpace * * */ public class RendererWithImplZSpaceW extends RendererWithImplW { private ZSpaceGwt zSpace; public RendererWithImplZSpaceW(final EuclidianViewInput3DW view) { super(view); DynamicScriptElement script = (DynamicScriptElement) Document.get() .createScriptElement(); script.setSrc(GWT.getModuleBaseURL() + "js/gl-matrix-min.js"); ScriptLoadCallback scriptCallback = new ScriptLoadCallback() { private boolean canceled = false; @Override public void onLoad() { if (canceled) { return; } DynamicScriptElement script = (DynamicScriptElement) Document.get() .createScriptElement(); script.setSrc(GWT.getModuleBaseURL() + "js/zSpace.js"); ScriptLoadCallback scriptCallback = new ScriptLoadCallback() { private boolean canceled = false; @Override public void onLoad() { // create zspace object zSpace = new ZSpaceGwt(glContext, webGLCanvas.getElement()); ((InputZSpace3DW) view.getInput3D()).setZSpace(zSpace); if (canceled) { return; } } @Override public void onError() { if (canceled) { return; } } public void cancel() { canceled = true; } }; script.addLoadHandler(scriptCallback); Document.get().getBody().appendChild(script); } @Override public void onError() { if (canceled) { return; } } public void cancel() { canceled = true; } }; script.addLoadHandler(scriptCallback); Document.get().getBody().appendChild(script); } @Override protected void createGLContext(boolean preserveDrawingBuffer) { if (preserveDrawingBuffer) { glContext = getBufferedContext(webGLCanvas.getElement()); } else { // glContext = (WebGLRenderingContext) webGLCanvas // .getContext("webgl"); glContext = getBufferedContextNoPDB(webGLCanvas.getElement()); ((RendererImplShadersW) getRendererImpl()).setGL(glContext); } if (glContext == null) { Window.alert("Sorry, Your Browser doesn't support WebGL!"); } } private static native WebGLRenderingContext getBufferedContext( Element element) /*-{ return element.getContext("webgl", { preserveDrawingBuffer : true, alpha : false, antialias : true }); }-*/; private static native WebGLRenderingContext getBufferedContextNoPDB( Element element) /*-{ return element.getContext("webgl", { alpha : false, antialias : true }); }-*/; @Override public void drawScene() { if (zSpace == null) { super.drawScene(); return; } // give canvas position to zSpace DockPanelW panel = (DockPanelW) view3D.getApplication().getGuiManager() .getLayout().getDockManager().getPanel(App.VIEW_EUCLIDIAN3D); zSpace.setCanvasOffset(panel.getAbsoluteLeft(), panel.getAbsoluteTop()); // update zSpace zSpace.zspaceUpdate(); clearColorBuffer(); clearDepthBuffer(); super.drawScene(); // end zSpace zSpace.zspaceFrameEnd(); } @Override final protected void setBufferLeft() { if (zSpace == null) { return; } zSpace.zspaceLeftView(); } @Override final protected void setBufferRight() { if (zSpace == null) { return; } zSpace.zspaceRightView(); } }