summaryrefslogtreecommitdiffstats
path: root/hacks/glx/rotator.c
diff options
context:
space:
mode:
authorSimon Rettberg2024-09-06 14:42:37 +0200
committerSimon Rettberg2024-09-06 14:42:37 +0200
commitbadef32037f52f79abc1f1440b786cd71afdf270 (patch)
tree412b792d4cab4a7a110db82fcf74fe8a1ac55ec1 /hacks/glx/rotator.c
parentDelete pre-6.00 files (diff)
downloadxscreensaver-master.tar.gz
xscreensaver-master.tar.xz
xscreensaver-master.zip
Diffstat (limited to 'hacks/glx/rotator.c')
-rw-r--r--hacks/glx/rotator.c274
1 files changed, 0 insertions, 274 deletions
diff --git a/hacks/glx/rotator.c b/hacks/glx/rotator.c
deleted file mode 100644
index ab05130..0000000
--- a/hacks/glx/rotator.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/* xscreensaver, Copyright (c) 1998-2016 Jamie Zawinski <jwz@jwz.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. No representations are made about the suitability of this
- * software for any purpose. It is provided "as is" without express or
- * implied warranty.
- */
-
-#include <math.h>
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include "rotator.h"
-#include "yarandom.h"
-
-struct rotator {
-
- double spin_x_speed, spin_y_speed, spin_z_speed; /* scaling factors >= 0. */
- double wander_speed;
-
- double rotx, roty, rotz; /* current object rotation, -1 to +1.
- Sign indicates direction of motion.
- 0.25 means +90 deg, positive velocity.
- -0.25 means +90 deg, negative velocity
- (not +270 deg or -90 deg!)
- Yes, this is stupid.
- */
- double dx, dy, dz; /* current rotational velocity, >= 0. */
- double ddx, ddy, ddz; /* current rotational acceleration, +/-. */
- double d_max; /* max rotational velocity, > 0. */
-
- int wander_frame; /* position in the wander cycle, >= 0. */
-};
-
-
-#undef ABS
-#define ABS(x) ((x)<0?-(x):(x))
-
-#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-/* Stay in the range [0-1).
- 1.01 => 0.01.
- -0.01 => 0.99
- */
-#define CLAMP(i) do { \
- while ((i) < 0) (i)++; \
- while ((i) >= 1) (i)--; \
- } while (0)
-
-#undef EPSILON
-#define EPSILON 0.000001
-
-
-static void
-rotate_1 (double *pos, double *v, double *dv, double speed, double max_v)
-{
- /* Sign of *pos is direction of motion.
- Sign of *v is always positive.
- It would make way more sense for *v to indicate direction of motion.
- What was I thinking?
- */
-
- double ppos = *pos;
-
- if (speed == 0) return;
-
- /* tick position */
- if (ppos < 0)
- /* Ignore but preserve the sign on ppos. It's kind of like:
- ppos = old_sign * (abs(ppos) + (v * old_sign))
- This is why it would make more sense for that sign bit to be on v.
- */
- ppos = -(ppos + *v);
- else
- ppos += *v;
-
- CLAMP (ppos);
- *pos = (*pos > 0 ? ppos : -ppos); /* preserve old sign bit on pos. */
-
- /* accelerate */
- *v += *dv;
-
- /* clamp velocity */
- if (*v > max_v || *v < -max_v)
- {
- *dv = -*dv;
- }
- /* If it stops, start it going in the other direction. */
- /* Since *v is always positive, <= 0 means stopped. */
- else if (*v < 0)
- {
- if (random() % 4)
- {
- *v = 0; /* don't let velocity be negative */
-
- if (random() % 2) /* stay stopped, and kill acceleration */
- *dv = 0;
- else if (*dv < 0) /* was decelerating, accelerate instead */
- *dv = -*dv;
- }
- else
- {
- *v = -*v; /* switch to tiny positive velocity, or zero */
- *dv = -*dv; /* toggle acceleration */
- *pos = -*pos; /* reverse direction of motion */
- }
- }
-
- /* Alter direction of rotational acceleration randomly. */
- if (! (random() % 120))
- *dv = -*dv;
-
- /* Change acceleration very occasionally. */
- if (! (random() % 200))
- {
-#if 0 /* this might make more sense: */
- if (*dv > -EPSILON && *dv < EPSILON)
- *dv += 10 * (*dv < 0 ? -EPSILON : EPSILON);
-#else
- if (*dv == 0)
- *dv = 0.00001;
-#endif
- else if (random() & 1)
- *dv *= 1.2;
- else
- *dv *= 0.8;
- }
-}
-
-
-/* Returns a rotator object, which encapsulates rotation and motion state.
-
- spin_[xyz]_speed indicates the relative speed of rotation.
- Specify 0 if you don't want any rotation around that axis.
-
- spin_accel specifies a scaling factor for the acceleration that is
- randomly applied to spin: if you want the speed to change faster,
- make this > 1.
-
- wander_speed indicates the relative speed through space.
-
- If randomize_initial_state_p is true, then the initial position and
- rotation will be randomized (even if the spin speeds are 0.) If it
- is false, then all values will be initially zeroed.
- */
-rotator *
-make_rotator (double spin_x_speed,
- double spin_y_speed,
- double spin_z_speed,
- double spin_accel,
- double wander_speed,
- int randomize_initial_state_p)
-{
- rotator *r = (rotator *) calloc (1, sizeof(*r));
- double d, dd;
-
- if (!r) return 0;
-
- if (spin_x_speed < 0 || spin_y_speed < 0 || spin_z_speed < 0 ||
- wander_speed < 0)
- abort();
-
- r->spin_x_speed = spin_x_speed;
- r->spin_y_speed = spin_y_speed;
- r->spin_z_speed = spin_z_speed;
- r->wander_speed = wander_speed;
-
- if (randomize_initial_state_p)
- {
- /* Sign on position is direction of travel. Stripped before returned. */
- r->rotx = frand(1.0) * RANDSIGN();
- r->roty = frand(1.0) * RANDSIGN();
- r->rotz = frand(1.0) * RANDSIGN();
-
- r->wander_frame = random() % 0xFFFF;
- }
- else
- {
- r->rotx = r->roty = r->rotz = 0;
- r->wander_frame = 0;
- }
-
- d = 0.006;
- dd = 0.00006;
-
- r->dx = BELLRAND(d * r->spin_x_speed);
- r->dy = BELLRAND(d * r->spin_y_speed);
- r->dz = BELLRAND(d * r->spin_z_speed);
-
- r->d_max = r->dx * 2;
-
- r->ddx = (dd + frand(dd+dd)) * r->spin_x_speed * spin_accel;
- r->ddy = (dd + frand(dd+dd)) * r->spin_y_speed * spin_accel;
- r->ddz = (dd + frand(dd+dd)) * r->spin_z_speed * spin_accel;
-
-# if 0
- fprintf (stderr, "rotator:\n");
- fprintf (stderr, " wander: %3d %6.2f\n", r->wander_frame, r->wander_speed);
- fprintf (stderr, " speed: %6.2f %6.2f %6.2f\n",
- r->spin_x_speed, r->spin_y_speed, r->spin_z_speed);
- fprintf (stderr, " rot: %6.2f %6.2f %6.2f\n",
- r->rotx, r->roty, r->rotz);
- fprintf (stderr, " d: %6.2f %6.2f %6.2f, %6.2f\n",
- r->dx, r->dy, r->dz,
- r->d_max);
- fprintf (stderr, " dd: %6.2f %6.2f %6.2f\n",
- r->ddx, r->ddy, r->ddz);
-# endif
-
- return r;
-}
-
-
-void
-free_rotator (rotator *r)
-{
- free (r);
-}
-
-void
-get_rotation (rotator *rot, double *x_ret, double *y_ret, double *z_ret,
- int update_p)
-{
- double x, y, z;
-
- if (update_p) {
- rotate_1 (&rot->rotx, &rot->dx, &rot->ddx, rot->spin_x_speed, rot->d_max);
- rotate_1 (&rot->roty, &rot->dy, &rot->ddy, rot->spin_y_speed, rot->d_max);
- rotate_1 (&rot->rotz, &rot->dz, &rot->ddz, rot->spin_z_speed, rot->d_max);
- }
-
- x = rot->rotx;
- y = rot->roty;
- z = rot->rotz;
- if (x < 0) x = -x;
- if (y < 0) y = -y;
- if (z < 0) z = -z;
-
- if (x_ret) *x_ret = x;
- if (y_ret) *y_ret = y;
- if (z_ret) *z_ret = z;
-}
-
-
-void
-get_position (rotator *rot, double *x_ret, double *y_ret, double *z_ret,
- int update_p)
-{
- double x = 0.5, y = 0.5, z = 0.5;
-
- if (rot->wander_speed != 0)
- {
- if (update_p)
- rot->wander_frame++;
-
-# define SINOID(F) ((1 + sin((rot->wander_frame * (F)) / 2 * M_PI)) / 2.0)
- x = SINOID (0.71 * rot->wander_speed);
- y = SINOID (0.53 * rot->wander_speed);
- z = SINOID (0.37 * rot->wander_speed);
-# undef SINOID
- }
-
- if (x_ret) *x_ret = x;
- if (y_ret) *y_ret = y;
- if (z_ret) *z_ret = z;
-}