summaryrefslogtreecommitdiff
path: root/src/tesseract/OldParticle.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/tesseract/OldParticle.java')
-rw-r--r--src/tesseract/OldParticle.java92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/tesseract/OldParticle.java b/src/tesseract/OldParticle.java
new file mode 100644
index 0000000..ca77acb
--- /dev/null
+++ b/src/tesseract/OldParticle.java
@@ -0,0 +1,92 @@
+package tesseract;
+
+import com.sun.j3d.utils.geometry.*;
+import java.awt.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+
+import tesseract.objects.Forceable;
+
+public class OldParticle implements Forceable {
+ private float inverseMass;
+ private Vector3f position, prevPosition;
+ private Vector3f velocity;
+ private Vector3f force;
+ private BranchGroup BG;
+ private TransformGroup TG;
+
+ private static final float RADIUS = 0.004f;
+
+ public OldParticle(Color3f color, Vector3f position, Vector3f velocity) {
+ inverseMass = 1;
+ this.position = new Vector3f(position);
+ prevPosition = new Vector3f(position);
+ this.velocity = new Vector3f(velocity);
+ force = new Vector3f();
+ TG = new TransformGroup();
+ TG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
+ TG.addChild(createShape(color));
+ BG = new BranchGroup();
+ BG.setCapability(BranchGroup.ALLOW_DETACH);
+ BG.addChild(TG);
+ updateTransformGroup();
+ }
+
+ public float getInverseMass() {
+ return inverseMass;
+ }
+
+ public Vector3f getPosition() {
+ return position;
+ }
+
+ public Vector3f getPreviousPosition() {
+ return prevPosition;
+ }
+
+ public Vector3f getVelocity() {
+ return velocity;
+ }
+
+ public Group getGroup() {
+ return BG;
+ }
+
+ public void detach() {
+ BG.detach();
+ }
+
+ public void addForce(Vector3f force) {
+ this.force.add(force);
+ }
+
+ public void updateState(float duration) {
+ // The force vector now becomes the acceleration vector.
+ force.scale(inverseMass);
+ prevPosition.set(position);
+ position.scaleAdd(duration, velocity, position);
+ position.scaleAdd(duration * duration / 2, force, position);
+ velocity.scaleAdd(duration, force, velocity);
+ // The force vector is cleared.
+ force.x = force.y = force.z = 0;
+ updateTransformGroup();
+ }
+
+ public void updateTransformGroup() {
+ Transform3D tmp = new Transform3D();
+ tmp.setTranslation(position);
+ TG.setTransform(tmp);
+ }
+
+ private Node createShape(Color3f color) {
+ ColoringAttributes cAttr;
+ if (color == null) {
+ Color randomColor = Color.getHSBColor((float)Math.random(), 1, 1);
+ color = new Color3f(randomColor);
+ }
+ cAttr = new ColoringAttributes(color, ColoringAttributes.FASTEST);
+ Appearance appearance = new Appearance();
+ appearance.setColoringAttributes(cAttr);
+ return new Sphere(RADIUS, 0, 8, appearance);
+ }
+}