19constexpr hmm_mat4 MY_HMM_FROM(
float (&
v)[16]) {
return {{{
v[0],
v[1],
v[2],
v[3]}, {
v[4],
v[5],
v[6],
v[7]}, {
v[8],
v[9],
v[10],
v[11]}, {
v[12],
v[13],
v[14],
v[15]}}}; }
21void GPUDisplay::setAnimationPoint()
23 if (mCfgL.animationMode & 4)
25 float rxy = sqrtf(mXYZ[0] * mXYZ[0] + mXYZ[2] * mXYZ[2]);
26 float anglePhi = atan2f(mXYZ[0], mXYZ[2]);
27 float angleTheta = atan2f(mXYZ[1], rxy);
28 if (mAnimateVectors[0].
size()) {
29 mAnimationCloseAngle(anglePhi, mAnimateVectors[2].back());
31 if (mAnimateVectors[0].
size()) {
32 mAnimationCloseAngle(angleTheta, mAnimateVectors[3].back());
34 mAnimateVectors[1].emplace_back(0);
35 mAnimateVectors[2].emplace_back(anglePhi);
36 mAnimateVectors[3].emplace_back(angleTheta);
38 for (int32_t
i = 0;
i < 3;
i++) {
39 mAnimateVectors[
i + 1].emplace_back(mXYZ[
i]);
43 float r = sqrtf(mXYZ[0] * mXYZ[0] + mXYZ[1] * mXYZ[1] + mXYZ[2] * mXYZ[2]);
44 mAnimateVectors[4].emplace_back(
r);
45 if (mCfgL.animationMode & 1)
47 for (int32_t
i = 0;
i < 3;
i++) {
48 float newangle = mAngle[
i];
49 if (mAnimateVectors[0].
size()) {
50 mAnimationCloseAngle(newangle, mAnimateVectors[
i + 5].back());
52 mAnimateVectors[
i + 5].emplace_back(newangle);
54 mAnimateVectors[8].emplace_back(0);
57 createQuaternionFromMatrix(
v, mViewMatrixP);
58 if (mAnimateVectors[0].
size()) {
59 mAnimateCloseQuaternion(
v, mAnimateVectors[5].back(), mAnimateVectors[6].back(), mAnimateVectors[7].back(), mAnimateVectors[8].back());
61 for (int32_t
i = 0;
i < 4;
i++) {
62 mAnimateVectors[
i + 5].emplace_back(
v[
i]);
66 if (mAnimateVectors[0].
size()) {
67 delay = mAnimateVectors[0].back() + ((int32_t)(mAnimationDelay * 20)) / 20.f;
69 mAnimateVectors[0].emplace_back(delay);
70 mAnimateConfig.emplace_back(mCfgL);
73void GPUDisplay::resetAnimation()
75 for (int32_t
i = 0;
i < 9;
i++) {
76 mAnimateVectors[
i].clear();
78 mAnimateConfig.clear();
82void GPUDisplay::removeAnimationPoint()
84 if (mAnimateVectors[0].
size() == 0) {
87 for (int32_t
i = 0;
i < 9;
i++) {
88 mAnimateVectors[
i].pop_back();
90 mAnimateConfig.pop_back();
93void GPUDisplay::startAnimation()
95 for (int32_t
i = 0;
i < 8;
i++) {
96 mAnimationSplines[
i].create(mAnimateVectors[0], mAnimateVectors[
i + 1]);
101 mAnimationLastBase = 0;
104int32_t GPUDisplay::animateCamera(
float& animateTime,
float& mixSlaveImage,
hmm_mat4& nextViewMatrix)
106 float time = animateTime;
107 if (mAnimate &&
time < 0) {
108 if (mAnimateScreenshot) {
109 time = mAnimationFrame / 30.f;
114 float maxTime = mAnimateVectors[0].back();
115 if (
time >= maxTime) {
117 mAnimate = mAnimateScreenshot = 0;
118 SetInfo(
"Animation finished. (%1.2f seconds, %d frames)",
time, mAnimationFrame);
120 SetInfo(
"Running mAnimation: time %1.2f/%1.2f, frames %d",
time, maxTime, mAnimationFrame);
128 for (int32_t
i = 0;
i < 8;
i++) {
129 vals[
i] = mAnimationSplines[
i].evaluate(
time);
131 if (mAnimationChangeConfig && animateTime < 0) {
133 int32_t k = mAnimateVectors[0].size() - 1;
134 while (base < k && time > mAnimateVectors[0][base]) {
137 if (base > mAnimationLastBase + 1) {
138 mAnimationLastBase = base - 1;
141 if (base != mAnimationLastBase && mAnimateVectors[0][mAnimationLastBase] != mAnimateVectors[0][base] && memcmp(&mAnimateConfig[base], &mAnimateConfig[mAnimationLastBase],
sizeof(mAnimateConfig[base]))) {
142 mixSlaveImage = 1.f - (
time - mAnimateVectors[0][mAnimationLastBase]) / (mAnimateVectors[0][base] - mAnimateVectors[0][mAnimationLastBase]);
143 if (mixSlaveImage > 0) {
144 mCfgL = mAnimateConfig[mAnimationLastBase];
146 DrawGLScene_internal(
time,
true);
150 if (memcmp(&mAnimateConfig[base], &mCfgL,
sizeof(mCfgL))) {
151 mCfgL = mAnimateConfig[base];
156 if (mCfgL.animationMode != 6) {
157 if (mCfgL.animationMode & 1)
159 nextViewMatrix = nextViewMatrix *
HMM_Rotate(-vals[4] * 180.f / CAMath::Pi(), {{1, 0, 0}}) *
HMM_Rotate(vals[5] * 180.f / CAMath::Pi(), {{0, 1, 0}}) *
HMM_Rotate(-vals[6] * 180.f / CAMath::Pi(), {{0, 0, 1}});
161 const float mag = sqrtf(vals[4] * vals[4] + vals[5] * vals[5] + vals[6] * vals[6] + vals[7] * vals[7]);
165 for (int32_t
i = 0;
i < 4;
i++) {
170 float xx = vals[4] * vals[4], xy = vals[4] * vals[5], xz = vals[4] * vals[6], xw = vals[4] * vals[7], yy = vals[5] * vals[5], yz = vals[5] * vals[6], yw = vals[5] * vals[7], zz = vals[6] * vals[6], zw = vals[6] * vals[7];
171 float mat[16] = {1 - 2 * (yy + zz), 2 * (xy - zw), 2 * (xz + yw), 0, 2 * (xy + zw), 1 - 2 * (xx + zz), 2 * (yz - xw), 0, 2 * (xz - yw), 2 * (yz + xw), 1 - 2 * (xx + yy), 0, 0, 0, 0, 1};
172 nextViewMatrix = nextViewMatrix *
MY_HMM_FROM(mat);
175 if (mCfgL.animationMode & 4)
177 const float r = vals[3],
phi = vals[1], theta = vals[2];
178 vals[2] =
r * cosf(phi) * cosf(theta);
179 vals[0] =
r * sinf(phi) * cosf(theta);
180 vals[1] =
r * sinf(theta);
181 }
else if (mCfgL.animationMode & 2) {
182 float r = sqrtf(vals[0] * vals[0] + vals[1] * vals[1] + vals[2] * vals[2]);
183 if (fabsf(
r) < 0.0001f) {
187 for (int32_t
i = 0;
i < 3;
i++) {
191 if (mCfgL.animationMode == 6) {
192 nextViewMatrix =
HMM_LookAt({{vals[0], vals[1], vals[2]}}, {{0, 0, 0}}, {{0, 1, 0}});
194 nextViewMatrix = nextViewMatrix *
HMM_Translate({{-vals[0], -vals[1], -vals[2]}});
constexpr hmm_mat4 MY_HMM_FROM(float(&v)[16])
HMM_INLINE hmm_mat4 HMM_Translate(hmm_vec3 Translation)
HMM_EXTERN hmm_mat4 HMM_LookAt(hmm_vec3 Eye, hmm_vec3 Center, hmm_vec3 Up)
HMM_EXTERN hmm_mat4 HMM_Rotate(float Angle, hmm_vec3 Axis)
double GetCurrentElapsedTime(bool reset=false)