summaryrefslogtreecommitdiff
path: root/NET/worlds/scape/TrajectoryBehavior.java
diff options
context:
space:
mode:
authorFuwn <[email protected]>2021-05-03 16:38:41 -0700
committerFuwn <[email protected]>2021-05-03 16:38:41 -0700
commite1e781bb2135ef78592226f1a3eaba4925702f1f (patch)
tree8a5b590463ed413e1c6eabb719130e701b95ca63 /NET/worlds/scape/TrajectoryBehavior.java
downloadworlds.jar-e1e781bb2135ef78592226f1a3eaba4925702f1f.tar.xz
worlds.jar-e1e781bb2135ef78592226f1a3eaba4925702f1f.zip
:star:HEADmain
Diffstat (limited to 'NET/worlds/scape/TrajectoryBehavior.java')
-rw-r--r--NET/worlds/scape/TrajectoryBehavior.java446
1 files changed, 446 insertions, 0 deletions
diff --git a/NET/worlds/scape/TrajectoryBehavior.java b/NET/worlds/scape/TrajectoryBehavior.java
new file mode 100644
index 0000000..0d4b594
--- /dev/null
+++ b/NET/worlds/scape/TrajectoryBehavior.java
@@ -0,0 +1,446 @@
+/* */ package NET.worlds.scape;
+/* */
+/* */ import java.io.IOException;
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public class TrajectoryBehavior
+/* */ extends SwitchableBehavior
+/* */ implements FrameHandler, BumpHandler
+/* */ {
+/* */ protected Point3 dir;
+/* */ public float linearVel;
+/* */ public Point3 axis;
+/* */ public float angularVel;
+/* */ private RollingAttribute attr;
+/* */ public float linearDamp;
+/* */ public float bounceDamp;
+/* */ public float angularDamp;
+/* */ public float gravity;
+/* */ private long lastTime;
+/* 47 */ private boolean bumplock = false;
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public TrajectoryBehavior(Point3Temp linearVelocity, float linearDamping, Point3Temp angularAxis, float angularVelocity, float angularDamping)
+/* */ {
+/* 64 */ this.dir = new Point3();
+/* 65 */ this.linearVel = 0.0F;
+/* 66 */ this.linearDamp = linearDamping;
+/* 67 */ addVelocity(linearVelocity);
+/* */
+/* 69 */ this.axis = new Point3(angularAxis);
+/* 70 */ this.axis.normalize();
+/* 71 */ this.angularVel = angularVelocity;
+/* 72 */ this.angularDamp = angularDamping;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public TrajectoryBehavior()
+/* */ {
+/* 82 */ this(Point3Temp.make(0.0F, 0.0F, 0.0F));
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public TrajectoryBehavior(Point3Temp vel)
+/* */ {
+/* 92 */ this(vel, 0.0F, Point3Temp.make(0.0F, 0.0F, 1.0F), 0.0F, 0.0F);
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */ public void setDir(Point3Temp d)
+/* */ {
+/* 100 */ double len = Math.sqrt(d.x * d.x + d.y * d.y + d.z * d.z);
+/* */
+/* 102 */ if (len == 0.0D)
+/* */ {
+/* 104 */ this.dir.x = 0.0F;
+/* 105 */ this.dir.y = 0.0F;
+/* 106 */ this.dir.z = 0.0F;
+/* 107 */ return;
+/* */ }
+/* */
+/* */
+/* 111 */ this.dir.x = ((float)(d.x / len));
+/* 112 */ this.dir.y = ((float)(d.y / len));
+/* 113 */ this.dir.z = ((float)(d.z / len));
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public TrajectoryBehavior addVelocity(Point3Temp vector)
+/* */ {
+/* 122 */ this.dir.times(this.linearVel).plus(vector);
+/* 123 */ float len = this.dir.length();
+/* 124 */ if (len > 0.0F)
+/* 125 */ this.dir.dividedBy(len);
+/* 126 */ this.linearVel = len;
+/* */
+/* 128 */ return this;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public void setNotifyAttribute(RollingAttribute attr)
+/* */ {
+/* 137 */ this.attr = attr;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public boolean handle(FrameEvent e)
+/* */ {
+/* 146 */ this.bumplock = false;
+/* 147 */ WObject o = e.receiver;
+/* 148 */ float dT = (float)(e.time - this.lastTime) / 1000.0F;
+/* */
+/* */
+/* */
+/* 152 */ if (this.lastTime == 0L) {
+/* 153 */ this.lastTime = e.time;
+/* 154 */ return true;
+/* */ }
+/* 156 */ this.lastTime = e.time;
+/* */
+/* */
+/* */
+/* */
+/* 161 */ Room room = o.getRoom();
+/* 162 */ if (o.getZ() > room.floorHeight(o.getX(), o.getY(), o.getZ())) {
+/* 163 */ addVelocity(Point3Temp.make(0.0F, 0.0F, -this.gravity * dT));
+/* 164 */ } else if (this.dir.z < 0.0F) {
+/* 165 */ this.dir.z = (-this.dir.z);
+/* 166 */ if (this.bounceDamp < 1.0D) {
+/* 167 */ this.linearVel *= this.bounceDamp;
+/* 168 */ if ((this.linearVel < 0.2D) && (this.linearVel > -0.2D)) {
+/* 169 */ this.linearVel = 0.0F;
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* 174 */ if (this.linearVel != 0.0F) {
+/* 175 */ Point3Temp dist = Point3Temp.make(this.dir).times(dT * this.linearVel);
+/* 176 */ o.moveThrough(dist);
+/* */
+/* 178 */ if (this.linearDamp != 0.0F) {
+/* 179 */ this.linearVel = ((float)(this.linearVel * Math.exp(-this.linearDamp * dT)));
+/* 180 */ if (Math.abs(this.linearVel) < this.linearDamp * 16.0F) {
+/* 181 */ this.linearVel = 0.0F;
+/* 182 */ if (this.attr != null) {
+/* 183 */ this.attr.notifyStopped();
+/* */ }
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* 189 */ if (this.angularVel != 0.0F) {
+/* 190 */ o.spin(this.axis.x, this.axis.y, this.axis.z, this.angularVel * dT);
+/* 191 */ if (this.angularDamp != 0.0F) {
+/* 192 */ this.angularVel = ((float)(this.angularVel * Math.exp(-this.angularDamp * dT)));
+/* 193 */ if (Math.abs(this.angularVel) < this.angularDamp * 0.6F)
+/* 194 */ this.angularVel = 0.0F;
+/* */ }
+/* */ }
+/* 197 */ return true;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public boolean handle(BumpEventTemp b)
+/* */ {
+/* 209 */ if (this.bumplock) {
+/* 210 */ return true;
+/* */ }
+/* 212 */ if (this.attr != null) {
+/* 213 */ this.attr.handle(b);
+/* */ } else
+/* 215 */ processBumpEvent(b);
+/* 216 */ this.bumplock = true;
+/* 217 */ return true;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public void processBumpEvent(BumpEventTemp b)
+/* */ {
+/* 229 */ b.postBumpPath.minus(b.postBumpPath);
+/* */
+/* */
+/* */
+/* 233 */ if ((this.dir.x == 0.0F) && (this.dir.y == 0.0F) && (this.dir.z == 0.0F)) {
+/* 234 */ return;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* 241 */ WObject bumper = b.receiver == b.target ?
+/* 242 */ (WObject)b.source : b.target;
+/* */ Point3Temp norm;
+/* 244 */ Point3Temp norm; if (((bumper instanceof Camera)) || ((bumper instanceof Hologram)))
+/* */ {
+/* 246 */ float orientation = (float)((360.0F - bumper.getYaw() + 90.0F) *
+/* 247 */ 3.141592653589793D / 180.0D);
+/* 248 */ norm = Point3Temp.make((float)Math.cos(orientation),
+/* 249 */ (float)Math.sin(orientation),
+/* 250 */ 0.0F);
+/* */ } else {
+/* 252 */ norm = Point3Temp.make(b.bumpNormal);
+/* */ }
+/* 254 */ float lb = (float)Math.sqrt(norm.x * norm.x +
+/* 255 */ norm.y * norm.y + norm.z * norm.z);
+/* 256 */ norm.x /= lb;
+/* 257 */ norm.y /= lb;
+/* 258 */ norm.z /= lb;
+/* */
+/* */
+/* */
+/* 262 */ float projection = Math.abs(this.dir.x * norm.x +
+/* 263 */ this.dir.y * norm.y +
+/* 264 */ this.dir.z * norm.z);
+/* */
+/* */
+/* 267 */ this.dir.x += norm.x * 2.0F * projection;
+/* 268 */ this.dir.y += norm.y * 2.0F * projection;
+/* 269 */ this.dir.z += norm.z * 2.0F * projection;
+/* */
+/* */
+/* 272 */ double n = Math.sqrt(this.dir.x * this.dir.x + this.dir.y * this.dir.y + this.dir.z * this.dir.z);
+/* 273 */ if (n != 0.0D)
+/* */ {
+/* 275 */ Point3 tmp380_377 = this.dir;tmp380_377.x = ((float)(tmp380_377.x / n)); Point3
+/* 276 */ tmp396_393 = this.dir;tmp396_393.y = ((float)(tmp396_393.y / n)); Point3
+/* 277 */ tmp412_409 = this.dir;tmp412_409.z = ((float)(tmp412_409.z / n));
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* 283 */ if (this.bounceDamp < 1.0D) {
+/* 284 */ this.linearVel *= this.bounceDamp;
+/* 285 */ if ((this.linearVel < 0.2D) && (this.linearVel > -0.2D)) {
+/* 286 */ this.linearVel = 0.0F;
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public String toString()
+/* */ {
+/* 302 */ return
+/* */
+/* */
+/* 305 */ super.toString() + "[" + getName() + ": lin. velocity " + this.linearVel + ", lin. damp " + this.linearDamp + ", direction " + this.dir + ", ang. vel " + this.angularVel + ", ang. damp " + this.angularDamp + ", axis " + this.axis + "]";
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public Object properties(int index, int offset, int mode, Object value)
+/* */ throws NoSuchPropertyException
+/* */ {
+/* 315 */ Object ret = null;
+/* 316 */ switch (index - offset) {
+/* */ case 0:
+/* 318 */ if (mode == 0) {
+/* 319 */ ret = FloatPropertyEditor.make(
+/* 320 */ new Property(this, index, "Linear Velocity"));
+/* 321 */ } else if (mode == 1) {
+/* 322 */ ret = new Float(this.linearVel);
+/* 323 */ } else if (mode == 2)
+/* 324 */ this.linearVel = ((Float)value).floatValue();
+/* 325 */ break;
+/* */ case 1:
+/* 327 */ if (mode == 0) {
+/* 328 */ ret = FloatPropertyEditor.make(
+/* 329 */ new Property(this, index, "Linear Damping"));
+/* 330 */ } else if (mode == 1) {
+/* 331 */ ret = new Float(this.linearDamp);
+/* 332 */ } else if (mode == 2)
+/* 333 */ this.linearDamp = ((Float)value).floatValue();
+/* 334 */ break;
+/* */ case 2:
+/* 336 */ if (mode == 0) {
+/* 337 */ ret = Point3PropertyEditor.make(
+/* 338 */ new Property(this, index, "Direction"));
+/* 339 */ } else if (mode == 1) {
+/* 340 */ ret = new Point3(this.dir);
+/* 341 */ } else if (mode == 2)
+/* 342 */ this.dir = ((Point3)value);
+/* 343 */ break;
+/* */ case 3:
+/* 345 */ if (mode == 0) {
+/* 346 */ ret = FloatPropertyEditor.make(
+/* 347 */ new Property(this, index, "Angular Velocity"));
+/* 348 */ } else if (mode == 1) {
+/* 349 */ ret = new Float(this.angularVel);
+/* 350 */ } else if (mode == 2)
+/* 351 */ this.angularVel = ((Float)value).floatValue();
+/* 352 */ break;
+/* */ case 4:
+/* 354 */ if (mode == 0) {
+/* 355 */ ret = FloatPropertyEditor.make(
+/* 356 */ new Property(this, index, "Angular Damping"));
+/* 357 */ } else if (mode == 1) {
+/* 358 */ ret = new Float(this.angularDamp);
+/* 359 */ } else if (mode == 2)
+/* 360 */ this.angularDamp = ((Float)value).floatValue();
+/* 361 */ break;
+/* */ case 5:
+/* 363 */ if (mode == 0) {
+/* 364 */ ret = Point3PropertyEditor.make(
+/* 365 */ new Property(this, index, "Axis"));
+/* 366 */ } else if (mode == 1) {
+/* 367 */ ret = new Point3(this.axis);
+/* 368 */ } else if (mode == 2)
+/* 369 */ this.axis = ((Point3)value);
+/* 370 */ break;
+/* */ case 6:
+/* 372 */ if (mode == 0) {
+/* 373 */ ret = FloatPropertyEditor.make(
+/* 374 */ new Property(this, index,
+/* 375 */ "Gravitational Acceleration"));
+/* 376 */ } else if (mode == 1) {
+/* 377 */ ret = new Float(this.gravity);
+/* 378 */ } else if (mode == 2)
+/* 379 */ this.gravity = ((Float)value).floatValue();
+/* 380 */ break;
+/* */ case 7:
+/* 382 */ if (mode == 0) {
+/* 383 */ ret = FloatPropertyEditor.make(
+/* 384 */ new Property(this, index,
+/* 385 */ "Bounce Damping (1 = superball, 0 = beanbag)"));
+/* 386 */ } else if (mode == 1) {
+/* 387 */ ret = new Float(this.bounceDamp);
+/* 388 */ } else if (mode == 2) {
+/* 389 */ this.bounceDamp = ((Float)value).floatValue();
+/* 390 */ this.bounceDamp = ((float)Math.max(0.0D, Math.min(1.0D, this.bounceDamp)));
+/* */ }
+/* 392 */ break;
+/* */ default:
+/* 394 */ ret = super.properties(index, offset + 8, mode, value);
+/* */ }
+/* 396 */ return ret;
+/* */ }
+/* */
+/* */
+/* */
+/* */
+/* 402 */ private static Object classCookie = new Object();
+/* */
+/* */ public void saveState(Saver s)
+/* */ throws IOException
+/* */ {
+/* 407 */ s.saveVersion(0, classCookie);
+/* 408 */ super.saveState(s);
+/* */
+/* 410 */ s.saveFloat(this.linearVel);
+/* 411 */ s.saveFloat(this.linearDamp);
+/* 412 */ s.save(this.dir);
+/* 413 */ s.saveFloat(this.angularVel);
+/* 414 */ s.saveFloat(this.angularDamp);
+/* 415 */ s.save(this.axis);
+/* 416 */ s.saveFloat(this.gravity);
+/* 417 */ s.saveFloat(this.bounceDamp);
+/* */ }
+/* */
+/* */ public void restoreState(Restorer r)
+/* */ throws IOException, TooNewException
+/* */ {
+/* 423 */ switch (r.restoreVersion(classCookie)) {
+/* */ case 0:
+/* 425 */ super.restoreState(r);
+/* */
+/* 427 */ this.linearVel = r.restoreFloat();
+/* 428 */ this.linearDamp = r.restoreFloat();
+/* 429 */ this.dir = ((Point3)r.restore());
+/* 430 */ this.angularVel = r.restoreFloat();
+/* 431 */ this.angularDamp = r.restoreFloat();
+/* 432 */ this.axis = ((Point3)r.restore());
+/* 433 */ this.gravity = r.restoreFloat();
+/* 434 */ this.bounceDamp = r.restoreFloat();
+/* 435 */ break;
+/* */ default:
+/* 437 */ throw new TooNewException();
+/* */ }
+/* */ }
+/* */ }
+
+
+/* Location: C:\Program Files (x86)\Worlds Inc\WorldsPlayer - Win7\lib\worlds.jar!\NET\worlds\scape\TrajectoryBehavior.class
+ * Java compiler version: 6 (50.0)
+ * JD-Core Version: 0.7.1
+ */ \ No newline at end of file