/*
 * Waveform.hpp
 *
 *  Created on: Jun 25, 2008
 *      Author: pete
 */
#ifndef WAVEFORM_HPP_
#define WAVEFORM_HPP_

#include "Renderable.hpp"
#include <vector>


class ColoredPoint
{
public:
  float x;
  float y;
  float r;
  float g;
  float b;
  float a;

  ColoredPoint():x(0.5),y(0.5),r(1),g(1),b(1),a(1){};
};

class WaveformContext
{
public:
  float sample;
  int samples;
  int sample_int;
  float left;
  float right;
  BeatDetect *music;

  WaveformContext(int samples, BeatDetect *music):samples(samples),music(music){};
};


class Waveform : public RenderItem
{
public:

  int   samples; /* number of samples associated with this wave form. Usually powers of 2 */
  bool  spectrum; /* spectrum data or pcm data */
  bool  dots; /* draw wave as dots or lines */
  bool  thick; /* draw thicker lines */
  bool  additive; /* add color values together */

  float scaling; /* scale factor of waveform */
  float smoothing; /* smooth factor of waveform */
  int   sep;  /* no idea what this is yet... */

  Waveform(int samples);
  void Draw(RenderContext &context);

private:
  virtual ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context)=0;
  std::vector<ColoredPoint> points;
  std::vector<float> pointContext;
};

#endif /* WAVEFORM_HPP_ */
