void rgbTween (float r1, float g1, float b1, float r2, float g2, float b2, float tween, int direction, float &outr, float &outg, float &outb) { float h1, s1, l1, h2, s2, l2, outh, outs, outl; rgb2hsl (r1, g1, b1, h1, s1, l1); rgb2hsl (r2, g2, b2, h2, s2, l2); hslTween (h1, s1, l1, h2, s2, l2, tween, direction, outh, outs, outl); hsl2rgb (outh, outs, outl, outr, outg, outb); }
void rgbTween(double r1, double g1, double b1, double r2, double g2, double b2, double tween, int direction, double &outr, double &outg, double &outb){ double h1, s1, l1, h2, s2, l2, outh, outs, outl; rgb2hsl(r1, g1, b1, h1, s1, l1); rgb2hsl(r2, g2, b2, h2, s2, l2); hslTween(h1, s1, l1, h2, s2, l2, tween, direction, outh, outs, outl); hsl2rgb(outh, outs, outl, outr, outg, outb); }
void CCyclone::Update(CScreensaverCyclone* base) { int i; int temp; float between; float diff; int direction; float point[3]; float step; float blend; // update cyclone's path temp = gCycloneSettings.dComplexity + 2; if (m_xyzChange[temp][0] >= m_xyzChange[temp][1]) { m_oldxyz[temp][0] = m_xyz[temp][0]; m_oldxyz[temp][1] = m_xyz[temp][1]; m_oldxyz[temp][2] = m_xyz[temp][2]; m_targetxyz[temp][0] = rsRandf(float(WIDTH*2)) - float(WIDTH); m_targetxyz[temp][1] = float(HIGHT); m_targetxyz[temp][2] = rsRandf(float(WIDTH*2)) - float(WIDTH); m_xyzChange[temp][0] = 0.0f; m_xyzChange[temp][1] = rsRandf(150.0f / float(gCycloneSettings.dSpeed)) + 75.0f / float(gCycloneSettings.dSpeed); } temp = gCycloneSettings.dComplexity + 1; if (m_xyzChange[temp][0] >= m_xyzChange[temp][1]) { m_oldxyz[temp][0] = m_xyz[temp][0]; m_oldxyz[temp][1] = m_xyz[temp][1]; m_oldxyz[temp][2] = m_xyz[temp][2]; m_targetxyz[temp][0] = m_xyz[temp+1][0]; m_targetxyz[temp][1] = rsRandf(float(HIGHT / 3)) + float(HIGHT / 4); m_targetxyz[temp][2] = m_xyz[temp+1][2]; m_xyzChange[temp][0] = 0.0f; m_xyzChange[temp][1] = rsRandf(100.0f / float(gCycloneSettings.dSpeed)) + 75.0f / float(gCycloneSettings.dSpeed); } for (i = gCycloneSettings.dComplexity; i > 1; i--) { if (m_xyzChange[i][0] >= m_xyzChange[i][1]) { m_oldxyz[i][0] = m_xyz[i][0]; m_oldxyz[i][1] = m_xyz[i][1]; m_oldxyz[i][2] = m_xyz[i][2]; m_targetxyz[i][0] = m_targetxyz[i+1][0] + (m_targetxyz[i+1][0] - m_targetxyz[i+2][0]) / 2.0f + rsRandf(float(WIDTH / 2)) - float(WIDTH / 4); m_targetxyz[i][1] = (m_targetxyz[i+1][1] + m_targetxyz[i-1][1]) / 2.0f + rsRandf(float(HIGHT / 8)) - float(HIGHT / 16); m_targetxyz[i][2] = m_targetxyz[i+1][2] + (m_targetxyz[i+1][2] - m_targetxyz[i+2][2]) / 2.0f + rsRandf(float(WIDTH / 2)) - float(WIDTH / 4); if (m_targetxyz[i][1] > HIGHT) m_targetxyz[i][1] = HIGHT; if (m_targetxyz[i][1] < -HIGHT) m_targetxyz[i][1] = -HIGHT; m_xyzChange[i][0] = 0.0f; m_xyzChange[i][1] = rsRandf(75.0f / float(gCycloneSettings.dSpeed)) + 50.0f / float(gCycloneSettings.dSpeed); } } if (m_xyzChange[1][0] >= m_xyzChange[1][1]) { m_oldxyz[1][0] = m_xyz[1][0]; m_oldxyz[1][1] = m_xyz[1][1]; m_oldxyz[1][2] = m_xyz[1][2]; m_targetxyz[1][0] = m_targetxyz[2][0] + rsRandf(float(WIDTH / 2)) - float(WIDTH / 4); m_targetxyz[1][1] = -rsRandf(float(HIGHT / 2)) - float(HIGHT / 4); m_targetxyz[1][2] = m_targetxyz[2][2] + rsRandf(float(WIDTH / 2)) - float(WIDTH / 4); m_xyzChange[1][0] = 0.0f; m_xyzChange[1][1] = rsRandf(50.0f / float(gCycloneSettings.dSpeed)) + 30.0f / float(gCycloneSettings.dSpeed); } if (m_xyzChange[0][0] >= m_xyzChange[0][1]) { m_oldxyz[0][0] = m_xyz[0][0]; m_oldxyz[0][1] = m_xyz[0][1]; m_oldxyz[0][2] = m_xyz[0][2]; m_targetxyz[0][0] = m_xyz[1][0] + rsRandf(float(WIDTH / 8)) - float(WIDTH / 16); m_targetxyz[0][1] = float(-HIGHT); m_targetxyz[0][2] = m_xyz[1][2] + rsRandf(float(WIDTH / 8)) - float(WIDTH / 16); m_xyzChange[0][0] = 0.0f; m_xyzChange[0][1] = rsRandf(100.0f / float(gCycloneSettings.dSpeed)) + 75.0f / float(gCycloneSettings.dSpeed); } for (i = 0; i < (gCycloneSettings.dComplexity+3); i++) { between = m_xyzChange[i][0] / m_xyzChange[i][1] * (2 * M_PI); between = (1.0f - float(cos(between))) / 2.0f; m_xyz[i][0] = ((m_targetxyz[i][0] - m_oldxyz[i][0]) * between) + m_oldxyz[i][0]; m_xyz[i][1] = ((m_targetxyz[i][1] - m_oldxyz[i][1]) * between) + m_oldxyz[i][1]; m_xyz[i][2] = ((m_targetxyz[i][2] - m_oldxyz[i][2]) * between) + m_oldxyz[i][2]; m_xyzChange[i][0] += base->FrameTime(); } // Update cyclone's widths temp = gCycloneSettings.dComplexity + 2; if (m_widthChange[temp][0] >= m_widthChange[temp][1]) { m_oldWidth[temp] = m_width[temp]; m_targetWidth[temp] = rsRandf(225.0f) + 75.0f; m_widthChange[temp][0] = 0.0f; m_widthChange[temp][1] = rsRandf(50.0f / float(gCycloneSettings.dSpeed)) + 50.0f / float(gCycloneSettings.dSpeed); } temp = gCycloneSettings.dComplexity + 1; if (m_widthChange[temp][0] >= m_widthChange[temp][1]) { m_oldWidth[temp] = m_width[temp]; m_targetWidth[temp] = rsRandf(100.0f) + 15.0f; m_widthChange[temp][0] = 0.0f; m_widthChange[temp][1] = rsRandf(50.0f / float(gCycloneSettings.dSpeed)) + 50.0f / float(gCycloneSettings.dSpeed); } for (i = gCycloneSettings.dComplexity; i > 1; i--) { if (m_widthChange[i][0] >= m_widthChange[i][1]) { m_oldWidth[i] = m_width[i]; m_targetWidth[i] = rsRandf(50.0f) + 15.0f; m_widthChange[i][0] = 0.0f; m_widthChange[i][1] = rsRandf(50.0f / float(gCycloneSettings.dSpeed)) + 40.0f / float(gCycloneSettings.dSpeed); } } if (m_widthChange[1][0] >= m_widthChange[1][1]) { m_oldWidth[1] = m_width[1]; m_targetWidth[1] = rsRandf(40.0f) + 5.0f; m_widthChange[1][0] = 0.0f; m_widthChange[1][1] = rsRandf(50.0f / float(gCycloneSettings.dSpeed)) + 30.0f / float(gCycloneSettings.dSpeed); } if (m_widthChange[0][0] >= m_widthChange[0][1]) { m_oldWidth[0] = m_width[0]; m_targetWidth[0] = rsRandf(30.0f) + 5.0f; m_widthChange[0][0] = 0.0f; m_widthChange[0][1] = rsRandf(50.0f / float(gCycloneSettings.dSpeed)) + 20.0f / float(gCycloneSettings.dSpeed); } for (i = 0; i < (gCycloneSettings.dComplexity+3); i++) { between = m_widthChange[i][0] / m_widthChange[i][1]; m_width[i] = ((m_targetWidth[i] - m_oldWidth[i]) * between) + m_oldWidth[i]; m_widthChange[i][0] += base->FrameTime(); } // Update cyclones color if (m_hslChange[0] >= m_hslChange[1]) { m_oldhsl[0] = m_hsl[0]; m_oldhsl[1] = m_hsl[1]; m_oldhsl[2] = m_hsl[2]; m_targethsl[0] = rsRandf(1.0f); m_targethsl[1] = rsRandf(1.0f); m_targethsl[2] = rsRandf(1.0f) + 0.5f; if (m_targethsl[2] > 1.0f) m_targethsl[2] = 1.0f; m_hslChange[0] = 0.0f; m_hslChange[1] = rsRandf(30.0f) + 2.0f; } between = m_hslChange[0] / m_hslChange[1]; diff = m_targethsl[0] - m_oldhsl[0]; direction = 0; if ((m_targethsl[0] > m_oldhsl[0] && diff > 0.5f) || (m_targethsl[0] < m_oldhsl[0] && diff < -0.5f)) if (diff > 0.5f) direction = 1; hslTween(m_oldhsl[0], m_oldhsl[1], m_oldhsl[2], m_targethsl[0], m_targethsl[1], m_targethsl[2], between, direction, m_hsl[0], m_hsl[1], m_hsl[2]); m_hslChange[0] += base->FrameTime(); if (gCycloneSettings.dShowCurves) { unsigned int ptr = 0; sLight curves[std::max(gCycloneSettings.dComplexity+3, 50)]; base->m_lightingEnabled = 0; for (step=0.0; step<1.0; step+=0.02f) { point[0] = point[1] = point[2] = 0.0f; for (i = 0; i < (gCycloneSettings.dComplexity+3); i++) { blend = base->m_fact[gCycloneSettings.dComplexity+2] / (base->m_fact[i] * base->m_fact[gCycloneSettings.dComplexity+2-i]) * powf(step, float(i)) * powf((1.0f - step), float(gCycloneSettings.dComplexity+2-i)); point[0] += m_xyz[i][0] * blend; point[1] += m_xyz[i][1] * blend; point[2] += m_xyz[i][2] * blend; } curves[ptr ].color = sColor(0.0f, 1.0f, 0.0f); curves[ptr++].vertex = sPosition(point); } base->DrawEntry(GL_LINE_STRIP, curves, ptr); ptr = 0; for (i = 0; i < (gCycloneSettings.dComplexity+3); i++) { curves[ptr ].color = sColor(1.0f, 0.0f, 0.0f); curves[ptr++].vertex = sPosition(&m_xyz[i][0]); } base->DrawEntry(GL_LINE_STRIP, curves, ptr); base->m_lightingEnabled = 1; } }