package applets; import java.applet.*; import java.awt.*; import java.awt.image.*; import java.io.*; import java.util.Date; import java.util.Vector; import java.net.URL; import shout3d.*; import shout3d.math.*; import shout3d.core.*; //Can Add/Delete Two objects from the menu. //Uses Mouses to Move Around Objects. //Left Click to move it right and left. //Right Click to move it up and down. public class AddRemoveObjectsPanel extends Shout3DPanel implements DeviceObserver, RenderObserver{ int addRemove = -1; // 0 - add, 1 - remove int moveObj = 1; int objectNumber = 0; // 0 - SmallCube, 1 - LargeCube String sSmallCube = "models/SmallCube.s3d"; String sLargeCube = "models/LargeCube.s3d"; int found_number =0; float nextX, nextY, nextZ; int startCursorX, startCursorY; Transform selectedTransform = new Transform(); boolean selected = false; boolean waitingToChangeFields = false; Transform AddMe = new Transform(); Node[] oneAddObjectKidArray; Node[] oneRemoveObjectKidArray; Node[] pathToPick; Node pathTail; Picker myPicker; public AddRemoveObjectsPanel(Shout3DApplet applet){ super(applet, 400, 300); } public void customInitialize(){ addDeviceObserver(this, "MouseInput", null); getRenderer().addRenderObserver(this, null); myPicker = getNewPicker(); } protected void finalize() throws Throwable { getRenderer().removeRenderObserver(this); removeDeviceObserver(this,"MouseInput"); super.finalize(); } public void onPreRender(Renderer r, Object userData) { if (selected == true && waitingToChangeFields){ System.out.println("Moving the Object by " + "( " + nextX + ", " + nextY + ", "+ nextZ + " )"); Transform MoveObject = selectedTransform; MoveObject.translation.getValue()[0] += nextX; MoveObject.translation.getValue()[1] += nextY; MoveObject.translation.getValue()[2] += nextZ; MoveObject.translation.setValue(MoveObject.translation.getValue()); waitingToChangeFields = false; } } public void onPostRender(Renderer r, Object userData) { //Should do Adding and Deletion between renders to //avoid accessing null pointers during rendering if (addRemove != -1){ if (addRemove == 0){ addObjectToMe(objectNumber); addRemove = -1; } } } public boolean onDeviceInput(DeviceInput di, Object userData) { //ONLY registered so far in init for MouseInput. //So no need to check. MouseInput mi = (MouseInput) di; if (mi.which == MouseInput.DOWN){ selected = false; pathToPick = myPicker.pickClosest(mi.x, mi.y); if (pathToPick != null && pathToPick.length > 0){ for (int i = pathToPick.length-1; i > -1; i--){ System.out.println(i); if (pathToPick[i] instanceof Transform){ selectedTransform = (Transform)pathToPick[i]; if (addRemove == 1){ oneRemoveObjectKidArray = new Node[1]; oneRemoveObjectKidArray[0] = selectedTransform; getScene().removeChildren(oneRemoveObjectKidArray); } else{ selected = true; startCursorX = mi.x; startCursorY = mi.y; System.out.println("Selected Object"); System.out.println("Selected " + s); break; } } } } return(true); } else if ((mi.which == MouseInput.DRAG) && (mi.button == 0)) { //Left Button to Move Left/Right nextZ = (float)((float) (mi.x - startCursorX)/-6.0); nextX =(float)((float) (mi.y - startCursorY)/6.0); startCursorX = mi.x; startCursorY = mi.y; nextY = 0; waitingToChangeFields = true; return(true); } else if ((mi.which == MouseInput.DRAG) && (mi.button == 1)) { //Left Button to Move Left/Right nextX = 0; nextZ = 0; nextY = (float)((float) (mi.y - startCursorY)/-6.0); startCursorX = mi.x; startCursorY = mi.y; waitingToChangeFields = true; return(true); } return(false); } public void addObjectToMe(int objNumber){ String[] urlArray = {""}; if (objNumber == 0) urlArray[0] = sSmallCube; else urlArray[0] = sLargeCube; //Don't load in a separate Thread boolean wasSeparate = isLoadResourcesInSeparateThread(); setLoadResourcesInSeparateThread(false); loadURL(urlArray, AddMe); setLoadResourcesInSeparateThread(wasSeparate); Searcher mySearcher = getNewSearcher(); if (objNumber == 0) mySearcher.setDefName("SmallCube"); else if (objNumber == 1) mySearcher.setDefName("LargeCube"); Node sResult[] = mySearcher.searchFirst(AddMe); oneAddObjectKidArray = new Node[1]; oneAddObjectKidArray[0] = sResult[sResult.length - 1]; getScene().addChildren(oneAddObjectKidArray); } }