/* * Copyright 2016 Nathan Howard * * This file is part of OpenGrave * * OpenGrave is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenGrave is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenGrave. If not, see <http://www.gnu.org/licenses/>. */ package com.opengrave.og.states; import java.awt.Color; import java.io.File; import java.util.HashMap; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import com.opengrave.common.event.EventDispatcher; import com.opengrave.common.event.EventHandler; import com.opengrave.common.event.EventHandlerPriority; import com.opengrave.common.event.EventListener; import com.opengrave.common.world.*; import com.opengrave.common.world.CommonObject.Type; import com.opengrave.og.MainThread; import com.opengrave.og.engine.*; import com.opengrave.og.engine.gait.BipedWalk; import com.opengrave.og.engine.gait.Gait; import com.opengrave.og.gui.*; import com.opengrave.og.gui.callback.ButtonPressedEvent; import com.opengrave.og.gui.callback.CheckButtonPressedEvent; import com.opengrave.og.gui.callback.NumberRollerChangedEvent; import com.opengrave.og.gui.callback.TextInputEvent; import com.opengrave.og.light.DayCycleSkyLight; import com.opengrave.og.models.DAEFile; import com.opengrave.og.resources.GUIXML; import com.opengrave.og.resources.Resources; import com.opengrave.og.util.Vector4f; public class IKState extends BaseState implements EventListener { Surface s; CommonObject cobj; BaseObject object; SkeletonInstance skele; ObjectStorageNode dudnode; private String modelFileName = "mod/craig.dae"; private RootNode node; FlyByCamera editCam = new FlyByCamera(); SceneView view; NumberRoller objectMaterialNumber; TextInput objectMaterialTexture, objectMaterialTextureData; TextButton objectModelFile, objectLook, objectMaterialCol, objectMaterialModel; private TextButton objectStatic; private TextButton objectAnim; private TextButton objectParticle; CheckButton skinButton, skeleButton; @Override public void start() { EventDispatcher.addHandler(this); GUIXML screenFile = new GUIXML("gui/ik.xml"); screen = screenFile.getGUI(); view = (SceneView) screen.getElementById("ikview"); objectModelFile = (TextButton) screen.getElementById("objectmodelfile"); objectMaterialNumber = (NumberRoller) screen.getElementById("objectmaterialnumber"); objectMaterialCol = (TextButton) screen.getElementById("objectmaterialcol"); objectMaterialTexture = (TextInput) screen.getElementById("objectmaterialtex"); objectMaterialTextureData = (TextInput) screen.getElementById("objectmaterialtexdata"); objectMaterialModel = (TextButton) screen.getElementById("objectmaterialmodel"); objectStatic = (TextButton) screen.getElementById("objectstatic"); objectAnim = (TextButton) screen.getElementById("objectanim"); objectParticle = (TextButton) screen.getElementById("objectparticle"); node = new RootNode(); dudnode = new ObjectStorageNode(); node.addChild(dudnode); node.setSkyLight(new DayCycleSkyLight(MainThread.config.getInteger("shadowSize", 1024))); view.setRenderView(new RenderView(node, editCam)); s = new InclineSurface(); objectMaterialNumber.setNumber(0); setObject(new CommonObject("", Type.Anim, modelFileName, new MaterialList(), new CommonLocation())); // object.startAnimation("idle", 1f, false); skinButton = (CheckButton) screen.getElementById("skin"); skeleButton = (CheckButton) screen.getElementById("skele"); Gait.init(); } public void setObject(CommonObject object) { if (object.getType() != Type.Anim) { return; } if (this.object != null) { dudnode.removeChild(this.object); } if (this.skele != null) { dudnode.removeChild(this.skele); } this.object = dudnode.createObject(object); AnimatedObject anim = (AnimatedObject) this.object; this.skele = new SkeletonInstance(anim); dudnode.addChild(this.skele); dudnode.addChild(this.object); this.object.setSurface(s); setEditingObjectMaterial(); Location l = new Location(object.getLocation()); l.setScale(0.2f, 0.2f, 0.2f); this.object.setLocation(l); if (anim.getSkeleton() != null) { anim.setWalk(new BipedWalk(anim, anim.getSkeleton().getBone("UpperLeg.left"), anim.getSkeleton().getBone("UpperLeft.right"))); } this.cobj = object; } @EventHandler(priority = EventHandlerPriority.LATE) public void onCheckBoxPress(CheckButtonPressedEvent event) { CheckButton b = event.getButton(); if (b == skinButton) { object.setVisible(b.getChecked()); } else if (b == skeleButton) { skele.setVisible(b.getChecked()); } } @Override public void stop() { } @Override public void update(float delta) { // this.skele.setLocation(this.object.getLocation()); this.skele.setSkeleton((AnimatedObject) this.object); } private void setEditingObjectMaterial() { int i = objectMaterialNumber.getNumber(); MaterialList ml = object.getMaterialList(); while (ml.getMaterial(i) == null) { ml.addMaterialForce(new Material("blank", "tex/flat.png", new Vector4f(1f, 0f, 0f, 1f))); } Material m = ml.getMaterial(i); objectMaterialModel.setString(object.getRenderableSection(i)); objectMaterialCol.getElementData().defaultColour = m.getColour(); // objectMaterialModel.setString(editingObject.getRenderableSection(i)); objectMaterialTexture.setString(m.getTextureName()); objectMaterialTextureData.setString(m.getTextureDataName()); objectModelFile.setString(modelFileName); } @EventHandler(priority = EventHandlerPriority.LATE) public void onButonPress(ButtonPressedEvent event) { if (!isActive()) { return; } Button bP = event.getButton(); if (bP.equals(objectModelFile)) { JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter("DAE Models", "xml", "dae"); chooser.setFileFilter(filter); chooser.setSelectedFile(new File(MainThread.cache, objectModelFile.getString())); int returnVal = chooser.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { String modelA = chooser.getSelectedFile().getAbsolutePath(); String cache = MainThread.cache.getAbsolutePath(); if (modelA.startsWith(cache)) { // Good String finalModel = modelA.substring(cache.length()); objectModelFile.setString(finalModel); object.setRenderableFile(finalModel); } } } else if (bP.equals(objectMaterialModel)) { String modelList = "", sep = ""; DAEFile f = Resources.loadModelFile(objectModelFile.getString()); if (f != null) { if (object.getCommonObject().getType() == Type.Static) { JPanel myPanel = new JPanel(); HashMap<String, JCheckBox> boxes = new HashMap<String, JCheckBox>(); for (String s : f.getMeshInstNames()) { JCheckBox box = new JCheckBox(s); boxes.put(s, box); myPanel.add(box); } int result = JOptionPane.showConfirmDialog(null, myPanel, "Please choose meshes for this material", JOptionPane.OK_CANCEL_OPTION); if (result == JOptionPane.OK_OPTION) { for (String s : boxes.keySet()) { JCheckBox box = boxes.get(s); if (box.isSelected()) { modelList += sep + s; sep = ","; } } object.setRenderableSection(objectMaterialNumber.getNumber(), modelList); objectMaterialModel.setString(modelList); } } else if (object.getCommonObject().getType() == Type.Anim) { JPanel myPanel = new JPanel(); HashMap<String, JCheckBox> boxes = new HashMap<String, JCheckBox>(); for (String s : f.getAnimMeshNames()) { JCheckBox box = new JCheckBox(s); boxes.put(s, box); myPanel.add(box); } int result = JOptionPane.showConfirmDialog(null, myPanel, "Please choose meshes for this material", JOptionPane.OK_CANCEL_OPTION); if (result == JOptionPane.OK_OPTION) { for (String s : boxes.keySet()) { JCheckBox box = boxes.get(s); if (box.isSelected()) { modelList += sep + s; sep = ","; } } object.setRenderableSection(objectMaterialNumber.getNumber(), modelList); objectMaterialModel.setString(modelList); } // Loading in an animated model needs Idle anim object.startAnimation("idle", 1f, false); AnimatedObject anim = (AnimatedObject) object; anim.setWalk(new BipedWalk(anim, anim.getSkeleton().getBone("UpperLeg.left"), anim.getSkeleton().getBone("UpperLeg.right"))); } } } else if (event.getButton().equals(objectStatic)) { cobj = object.getCommonObject(); cobj.setType(CommonObject.Type.Static); dudnode.removeChild(object); object = dudnode.createObject(cobj); } else if (event.getButton().equals(objectAnim)) { cobj = object.getCommonObject(); cobj.setType(CommonObject.Type.Anim); dudnode.removeChild(object); object = dudnode.createObject(cobj); } else if (event.getButton().equals(objectParticle)) { cobj = object.getCommonObject(); cobj.setType(CommonObject.Type.Particle); dudnode.removeChild(object); object = dudnode.createObject(cobj); } else if (event.getButton().equals(objectMaterialCol)) { Vector4f col = object.getMaterialList().getMaterial(objectMaterialNumber.getNumber()).getColour(); Color newColor = JColorChooser.showDialog(null, "Choose Terrain Colour", new Color(col.x, col.y, col.z)); if (newColor != null) { col = new Vector4f(newColor.getRed() / 255f, newColor.getGreen() / 255f, newColor.getBlue() / 255f, 1f); // terrainImageSample.setColour(col); object.getMaterialList().getMaterial(objectMaterialNumber.getNumber()).setColour(col); objectMaterialCol.getElementData().activeColour = col; objectMaterialCol.getElementData().defaultColour = col; } } } @EventHandler(priority = EventHandlerPriority.LATE) public void onNumberRollerChanged(NumberRollerChangedEvent event) { if (!isActive()) { return; } NumberRoller nr = event.getNumberRoller(); if (nr.equals(objectMaterialNumber)) { setEditingObjectMaterial(); } } @EventHandler(priority = EventHandlerPriority.LATE) public void onTextInput(TextInputEvent event) { if (!isActive()) { return; } TextInput in = event.getInput(); if (in.equals(objectMaterialTexture)) { MaterialList ml = object.getMaterialList(); ml.setTexture(objectMaterialNumber.getNumber(), event.getTextAfter()); } else if (in.equals(objectMaterialTextureData)) { MaterialList ml = object.getMaterialList(); ml.setDataTexture(objectMaterialNumber.getNumber(), event.getTextAfter()); } } float rx, ry; /* * @EventHandler(priority = EventHandlerPriority.LATE) * public void onJoystickInput(JoystickRawAxisEvent event){ * //System.out.println(event.getAxisName()+" "+event.getValue()); * if(event.getAxisName().equals("x")){ * if(Math.abs(event.getValue()) < 0.3f) { return; } * Location l = object.getLocation(); * l.add(new Vector3f(event.getValue() * event.getDelta() * 0.001f, 0f, * 0f)); * object.setLocation(l); * object.moveTo(l); * }else if(event.getAxisName().equals("y")){ * if(Math.abs(event.getValue()) < 0.3f) { return; } * Location l = object.getLocation(); * l.add(new Vector3f(0f, event.getValue() * event.getDelta()* 0.001f, 0f)); * object.moveTo(l); * }else if(event.getAxisName().equals("z")){ * if(Math.abs(event.getValue()) < 0.3f || event.getValue() < 0f){ return; } * Location l = object.getLocation(); * l.add(new Vector3f(0f,0f,event.getValue()* event.getDelta() * 0.001f)); * }else if(event.getAxisName().equals("rz")){ * if(Math.abs(event.getValue()) < 0.3f || event.getValue() < 0f){ return; } * Location l = object.getLocation(); * l.add(new Vector3f(0f,0f,-event.getValue()* event.getDelta() * 0.001f)); * * }else if(event.getAxisName().equalsIgnoreCase("rx")){ * rx = event.getValue(); * }else if(event.getAxisName().equalsIgnoreCase("ry")){ * ry = event.getValue(); * }else if(event.getAxisName().equals("A")){ * if(event.getValue()>0.5f){ * ((AnimatedObject) object).getWalk().removePlant(); * } * } * if(rx*rx + ry * ry >=0.9f){ // Distance from center of pad > 0.3f. * * object.lookDir(new Point(rx, ry, 0)); * } * } */ }