xenocara/app/xlockmore/modes/glx/i_sphere.cc
2006-11-26 11:07:42 +00:00

156 lines
3.8 KiB
C++

#include "i_threejetvec.h"
#include "i_figureeight.h"
#include "i_spline.h"
#include "i_sphere.h"
ThreeJetVec Arc(ThreeJet u, ThreeJet v, double xsize, double ysize, double zsize) {
ThreeJetVec result;
u = u*0.25;
result.x = Sin (u) * Sin (v) * xsize;
result.y = Sin (u) * Cos (v) * ysize;
result.z = Cos (u) * zsize;
return result;
}
ThreeJetVec Straight(ThreeJet u, ThreeJet v, double xsize, double ysize, double zsize) {
ThreeJetVec result;
u = u*0.25;
#if 0
u = (u) * (-0.15915494) + 1; /* 1/2pi */
#endif
result.x = Sin (v) * xsize;
result.y = Cos (v) * ysize;
result.z = Cos (u) * zsize;
return result;
}
ThreeJet Param1(ThreeJet x) {
double offset = 0;
x %= 4;
if (x > 2) { x = x+(-2); offset = 2; }
if (x <= 1) return x*2 + (x^2)*(-1) + offset;
else return (x^2) + x*(-2) + (2 + offset);
}
ThreeJet Param2(ThreeJet x) {
double offset = 0;
x %= 4;
if (x > 2) { x = x+(-2); offset = 2; }
if (x <= 1) return (x^2) + offset;
else return (x^2)*(-1) + x*4 + (-2 + offset);
}
static inline ThreeJet TInterp(double x) {
return ThreeJet(x,0,0);
}
ThreeJet UInterp(ThreeJet x) {
x %= 2;
if (x > 1)
x = x*(-1) + 2;
return (x^2)*3 + (x^3) * (-2);
}
#define FFPOW 3
ThreeJet FFInterp(ThreeJet x) {
x %= 2;
if (x > 1)
x = x*(-1) + 2;
x = x*1.06 + -0.05;
if (x < 0) return ThreeJet(0, 0, 0);
else if (x > 1) return ThreeJet(0, 0, 0) + 1;
else return (x ^ (FFPOW-1)) * (FFPOW) + (x^FFPOW) * (-FFPOW+1);
}
#define FSPOW 3
ThreeJet FSInterp(ThreeJet x) {
x %= 2;
if (x > 1)
x = x*(-1) + 2;
return ((x ^ (FSPOW-1)) * (FSPOW) + (x^FSPOW) * (-FSPOW+1)) * (-0.2);
}
ThreeJetVec Stage0(ThreeJet u, ThreeJet v) {
return Straight(u, v, 1, 1, 1);
}
ThreeJetVec Stage1(ThreeJet u, ThreeJet v) {
return Arc(u, v, 1, 1, 1);
}
ThreeJetVec Stage2(ThreeJet u, ThreeJet v) {
return InterpolateVec(
Arc(Param1(u), v, 0.9, 0.9, -1),
Arc(Param2(u), v, 1, 1, 0.5),
UInterp(u));
}
ThreeJetVec Stage3(ThreeJet u, ThreeJet v) {
return InterpolateVec(
Arc(Param1(u), v,-0.9,-0.9,-1),
Arc(Param2(u), v,-1, 1,-0.5),
UInterp(u));
}
ThreeJetVec Stage4(ThreeJet u, ThreeJet v) {
return Arc(u, v, -1,-1, -1);
}
ThreeJetVec Scene01(ThreeJet u, ThreeJet v, double t) {
return InterpolateVec(Stage0(u,v), Stage1(u,v), TInterp(t));
}
ThreeJetVec Scene12(ThreeJet u, ThreeJet v, double t) {
return InterpolateVec(Stage1(u,v), Stage2(u,v), TInterp(t));
}
ThreeJetVec Scene23(ThreeJet u, ThreeJet v, double t) {
t = TInterp(t) * 0.5;
double tt = (u <= 1) ? t : -t;
return InterpolateVec(
RotateZ(Arc(Param1(u), v, 0.9, 0.9,-1), ThreeJet(tt,0,0)),
RotateY(Arc(Param2(u), v, 1, 1, 0.5), ThreeJet(t,0,0)),
UInterp(u)
);
}
ThreeJetVec Scene34(ThreeJet u, ThreeJet v, double t) {
return InterpolateVec(Stage3(u,v), Stage4(u,v), TInterp(t));
}
TwoJetVec BendIn(ThreeJet u, ThreeJet v, double t) {
t = TInterp(t);
return AddFigureEight(
Scene01(u, ThreeJet(0, 0, 1), t),
u, v, ThreeJet(0, 0, 0), FSInterp(u));
}
TwoJetVec Corrugate(ThreeJet u, ThreeJet v, double t) {
t = TInterp(t);
return AddFigureEight(
Stage1(u, ThreeJet(0, 0, 1)),
u, v, FFInterp(u) * ThreeJet(t,0,0), FSInterp(u));
}
TwoJetVec PushThrough(ThreeJet u, ThreeJet v, double t) {
return AddFigureEight(
Scene12(u,ThreeJet(0, 0, 1),t),
u, v, FFInterp(u), FSInterp(u));
}
TwoJetVec Twist(ThreeJet u, ThreeJet v, double t) {
return AddFigureEight(
Scene23(u,ThreeJet(0, 0, 1),t),
u, v, FFInterp(u), FSInterp(u));
}
TwoJetVec UnPush(ThreeJet u, ThreeJet v, double t) {
return AddFigureEight(
Scene34(u,ThreeJet(0, 0, 1),t),
u, v, FFInterp(u), FSInterp(u));
}
TwoJetVec UnCorrugate(ThreeJet u, ThreeJet v, double t) {
t = TInterp((t) * (-1) + 1);
return AddFigureEight(
Stage4(u,ThreeJet(0, 0, 1)),
u, v, FFInterp(u) * ThreeJet(t,0,0), FSInterp(u));
}