Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
  }
}