summaryrefslogtreecommitdiffstats
path: root/src/gleem/Manip.java
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2009-06-15 23:12:27 +0000
committerKenneth Russel <[email protected]>2009-06-15 23:12:27 +0000
commit41cd6c47b23975098cd155517790e018670785e7 (patch)
tree247333528ad674d427ba96b1e05810f7961d609e /src/gleem/Manip.java
parent935d2596c13371bb745d921dbcb9f05b0c11a010 (diff)
Copied JOGL_2_SANDBOX r350 on to trunk; JOGL_2_SANDBOX branch is now closed
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/jogl-demos/trunk@352 3298f667-5e0e-4b4a-8ed4-a3559d26a5f4
Diffstat (limited to 'src/gleem/Manip.java')
-rw-r--r--src/gleem/Manip.java120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/gleem/Manip.java b/src/gleem/Manip.java
new file mode 100644
index 0000000..d498534
--- /dev/null
+++ b/src/gleem/Manip.java
@@ -0,0 +1,120 @@
+/*
+ * gleem -- OpenGL Extremely Easy-To-Use Manipulators.
+ * Copyright (C) 1998-2003 Kenneth B. Russell ([email protected])
+ *
+ * Copying, distribution and use of this software in source and binary
+ * forms, with or without modification, is permitted provided that the
+ * following conditions are met:
+ *
+ * Distributions of source code must reproduce the copyright notice,
+ * this list of conditions and the following disclaimer in the source
+ * code header files; and Distributions of binary code must reproduce
+ * the copyright notice, this list of conditions and the following
+ * disclaimer in the documentation, Read me file, license file and/or
+ * other materials provided with the software distribution.
+ *
+ * The names of Sun Microsystems, Inc. ("Sun") and/or the copyright
+ * holder may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS," WITHOUT A WARRANTY OF ANY
+ * KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, NON-INTERFERENCE, ACCURACY OF
+ * INFORMATIONAL CONTENT OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. THE
+ * COPYRIGHT HOLDER, SUN AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL THE
+ * COPYRIGHT HOLDER, SUN OR SUN'S LICENSORS BE LIABLE FOR ANY LOST
+ * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
+ * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
+ * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
+ * INABILITY TO USE THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT
+ * DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION,
+ * OPERATION OR MAINTENANCE OF ANY NUCLEAR FACILITY. THE COPYRIGHT
+ * HOLDER, SUN AND SUN'S LICENSORS DISCLAIM ANY EXPRESS OR IMPLIED
+ * WARRANTY OF FITNESS FOR SUCH USES.
+ */
+
+package gleem;
+
+import java.util.*;
+
+import gleem.linalg.*;
+import javax.media.opengl.*;
+
+/** The base class for all manipulators. Fundamentally a manipulator
+ must support a ray cast operation with itself and logic to
+ understand what to do when that ray cast actually made the
+ manipulator active. */
+
+public abstract class Manip {
+ private List motionListeners;
+
+ public Manip() {
+ motionListeners = new LinkedList();
+
+ // FIXME: The ManipManager's list should probably be maintained
+ // with weak references
+ // ManipManager.getManipManager().registerManip(this);
+ }
+
+ /** Returns true if the addition was successful, false otherwise */
+ public boolean addMotionListener(ManipMotionListener l) {
+ return motionListeners.add(l);
+ }
+
+ /** Returns true if the removal was successful, false otherwise */
+ public boolean removeMotionListener(ManipMotionListener l) {
+ return motionListeners.remove(l);
+ }
+
+ /** Cast a ray in 3-space from the camera start position in the
+ specified direction and test for intersections against all live
+ portions of this manipulator. Add all hits, in arbitrary order,
+ to the end of the given list in the form of HitPoints. Must not
+ modify the results vector in any other way (i.e., must not
+ remove any existing HitPoints from the results vector). */
+ public abstract void intersectRay(Vec3f rayStart,
+ Vec3f rayDirection,
+ List results);
+
+ /** Tell the manipulator to highlight the current portion of itself.
+ This is merely visual feedback to the user. */
+ public abstract void highlight(HitPoint hit);
+
+ /** Tell the manipulator to clear the current highlight */
+ public abstract void clearHighlight();
+
+ /** If the ManipManager decides that this manipulator is to become
+ active, it will pass back the HitPoint which made it make its
+ decision. The manipulator can then change its state to look for
+ drags of this portion of the manipulator. */
+ public abstract void makeActive(HitPoint hit);
+
+ /** When a manipulator is active, drags of the live portion cause
+ motion of the manipulator. The ManipManager keeps track of which
+ manipulator (if any) is active and takes care of calling the
+ drag() method with the current ray start and direction. The
+ manipulator must keep enough state to understand how it should
+ position and/or rotate itself. NOTE that the base class provides
+ an implementation for this method which you must call at the end
+ of your overriding method. */
+ public void drag(Vec3f rayStart,
+ Vec3f rayDirection) {
+ for (Iterator iter = motionListeners.iterator(); iter.hasNext(); ) {
+ ManipMotionListener m = (ManipMotionListener) iter.next();
+ m.manipMoved(this);
+ }
+ }
+
+ /** When the mouse button is released, makeInactive() is called. The
+ manipulator should reset its state in preparation for the next
+ drag. */
+ public abstract void makeInactive();
+
+ /** Render this Manipulator now using the given OpenGL routines and
+ assuming an OpenGL context is current. */
+ public abstract void render(GL2 gl);
+}