/*
* Copyright (C) 2011 aki@akjava.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.akjava.gwt.threetest.client;
import java.util.ArrayList;
import java.util.List;
import com.akjava.gwt.lib.client.GWTHTMLUtils;
import com.akjava.gwt.lib.client.LogUtils;
import com.akjava.gwt.lib.client.URLUtils;
import com.akjava.gwt.stats.client.Stats;
import com.akjava.gwt.three.client.java.ui.CameraMoveWidget;
import com.akjava.gwt.three.client.java.ui.CameraRotationWidget;
import com.akjava.gwt.three.client.js.THREE;
import com.akjava.gwt.three.client.js.renderers.WebGLRenderer;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class MainWidget extends Composite {
public static CameraMoveWidget cameraMove;
public static CameraRotationWidget cameraRotation;
private static MainWidgetUiBinder uiBinder = GWT.create(MainWidgetUiBinder.class);
interface MainWidgetUiBinder extends UiBinder<Widget, MainWidget> {
}
private Demo lastDemo;
public static Stats stats;
final Demo[] demos=new Demo[]{new CellShaderDemo(),new DragDemo(),new IKBoneDemo(),new CanvasDemo(),
new SimpleCubeDemo(),new SphereDemo(),new SplineDemo(),new LoadObjDemo()
,new ParticleDemo(),new ParticleSmoke(),new GeometryCube(),new CameraOrthoGraphics(),new HelloCSS3DDemo(),new PlainDemo(),new PickDemo(),new TileDemo(),
new SkeletonHelperDemo()
//new RenderTargetDemo() not complete
//new AngleDemo(), some of them for test,others now upgrading
/*
new DragDemo(),
new SplineDemo(),//new CanvasDemo(),
new NormalmapDemo(),new SimpleAnimation(),new ParticleDemo2(),
new ExplotionDemo3(),new ExplotionDemo2(),new ParticleDemo(),
new ExplotionDemo(),new QuotaViewDemo(),new LoadObjDemo(),
new PickDemo(),new ShadowDemo(),new TextureDemo(),
new CylinderDemo(),new PlainDemo(),new SimpleDemo(),new SphereDemo()
*/
};
int width=500,height=500;
private int rendererType;
public static final int RENDERER_WEBGL=0;
public static final int RENDERER_CANVAS=1;
public static final int RENDERER_CSS3D=2;
public void stop(){
if(lastDemo!=null){
lastDemo.stop();
lastDemo.clearHandlerRegistration();
}
}
private void changeRenderer(String renderer){
String token="renderer="+renderer.toLowerCase();
Window.open(URLUtils.getLocalChangedUrl("default",token), "_self", null);
}
public MainWidget() {
try{
stats=Stats.insertStatsToRootPanel();
stats.setPosition(8, 0);
initWidget(uiBinder.createAndBindUi(this));
Label dummy=new Label();
dummy.setHeight("50px");
side.add(dummy);
side.add(new Label("Renderer"));
VerticalPanel renderers=new VerticalPanel();
side.add(renderers);
RadioButton webglButton=new RadioButton("renderer", "WebGL");
webglButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
changeRenderer("webgl");
}
});
renderers.add(webglButton);
webglButton.setValue(true);
RadioButton canvasButton=new RadioButton("renderer", "Canvas");
canvasButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
changeRenderer("canvas");
}
});
//renderers.add(canvasButton);
//somehow not work on r70,stop support canvas render
/*
* somehow not work
*
RadioButton css3dButton=new RadioButton("renderer", "CSS3D");
css3dButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
changeRenderer("css3d");
}
});
renderers.add(css3dButton);
*/
/*
final ListBox rendererListBox=new ListBox(false);
rendererListBox.setWidth("90px");
rendererListBox.addItem("WebGL");
rendererListBox.addItem("Canvas");
rendererListBox.addItem("CSS3D");
rendererListBox.setSelectedIndex(0);
side.add(rendererListBox);
rendererListBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
String token="renderer="+rendererListBox.getItemText(rendererListBox.getSelectedIndex()).toLowerCase();
Window.open(URLUtils.getLocalChangedUrl("default",token), "_self", null);
}
});
*/
String type=URLUtils.getFirstTokenValue("renderer","webgl");
if(type.equals("canvas")){
rendererType=RENDERER_CANVAS;
renderer = THREE.CanvasRenderer();
renderer.gwtSetType("canvas");
}else if(type.equals("css3d")){
renderer=THREE.CSS3DRenderer();
rendererType=RENDERER_CSS3D;
renderer.gwtSetType("css3d");
}
else{
renderer = THREE.WebGLRenderer();
rendererType=RENDERER_WEBGL;
if(renderer!=null){
renderer.gwtSetType("webgl");
}
}
if(renderer!=null){
//for canvas
GWTHTMLUtils.disableSelectionStart(renderer.getDomElement());
//for css3
GWTHTMLUtils.disableOnDragAndDrop(renderer.getDomElement());
renderer.setSize(width, height);
}else{
}
TabPanel stackPanel = new TabPanel();
stackPanel.setSize("360px","506px");
controler.add(stackPanel);
howToPanel = new ScrollPanel();
howToPanel.setSize("360px","480px");
stackPanel.add(howToPanel,"How to");
stackPanel.selectTab(0);
controlPanel = new VerticalPanel();
controlPanel.setSize("100%","100%");
stackPanel.add(controlPanel,"Controler");
CameraMoveWidget cameraMove=new CameraMoveWidget();
cameraMove.setVisible(false);//useless
controler.add(cameraMove);
MainWidget.cameraMove=cameraMove;
CameraRotationWidget cameraRotation=new CameraRotationWidget();
cameraRotation.setVisible(false);//useless
controler.add(cameraRotation);
MainWidget.cameraRotation=cameraRotation;
if(renderer!=null){
HTMLPanel div=new HTMLPanel("");
div.getElement().appendChild(renderer.getDomElement());
focusPanel = new FocusPanel();
focusPanel.add(div);
}
getMain().add(focusPanel);
int selection=0;
if(rendererType==RENDERER_CANVAS){
selection=1;
canvasButton.setValue(true);
}else if(rendererType==RENDERER_CSS3D){
selection=2;
//css3dButton.setValue(true);
}
//rendererListBox.setSelectedIndex(selection);
List<Demo> supportedDemo=new ArrayList<Demo>();
for(int i=0;i<demos.length;i++){
if(renderer==null){
break;
}
if(rendererType==RENDERER_CANVAS){
if(demos[i].isSupportCanvas()){
supportedDemo.add(demos[i]);
}
}else if(rendererType==RENDERER_CSS3D){
if(demos[i].isSupportCSS3D()){
supportedDemo.add(demos[i]);
}
}else{
if(demos[i].isSupportWebGL()){
supportedDemo.add(demos[i]);
}
}
}
for(int i=0;i<supportedDemo.size();i++){
DemoButton demoButton=new DemoButton(supportedDemo.get(i));
side.add(demoButton);
if(i==0){
demoButton.startDemo();
}
}
}catch (Exception e) {
LogUtils.log(e.getMessage());
side.add(new Label("maybe your browser not support webgl.use Chrome Browser or click canvas or css3d renderer.sadly mobile browser does not support webgl."));
}
}
@UiField VerticalPanel main,side,controler;
private WebGLRenderer renderer;
private FocusPanel focusPanel;
private ScrollPanel howToPanel;
private VerticalPanel controlPanel;
public VerticalPanel getMain(){
return main;
}
public class DemoButton extends Button implements ClickHandler{
Demo demo;
public DemoButton(Demo demo){
super();
this.demo=demo;
setText(demo.getName());
this.addClickHandler(this);
}
@Override
public void onClick(ClickEvent event) {
startDemo();
}
public void startDemo(){
stop();
demo.start(renderer,width,height,focusPanel);
//howToPanel.clear();
howToPanel.setWidget(new HTMLPanel(demo.getHowToHtml()));
controlPanel.clear();
Widget w=demo.getControler();
if(w!=null){
controlPanel.add(w);
}
lastDemo=demo;
}
}
}