blob: 967168593b91949be302a761ebe3ca650aef3886 [file] [log] [blame]
#include "Pipeline.hpp"
#include "Transformation.hpp"
#include "MilkdropCompatability.hpp"
#include "Waveform.hpp"
#include "NativePreset.hpp"
class Dancer : public Waveform
{
public:
float meanbass;
float meanmid;
float meantreb;
float mi2_prg;
float gam;
float mi_prg;
float ba_prg;
float tr_prg;
float dim;
float xpos;
float ypos;
float rand_offset1;
float rand_offset2;
float rand_offset3;
Dancer():Waveform(16)
{
thick = true;
smoothing = 0.5;
meanbass = 0;
meanmid = 0;
meantreb = 0;
mi2_prg = 0;
gam = 0;
mi_prg = 0;
ba_prg = 0;
tr_prg = 0;
dim = (rand()%20)*.01;
//dim *= 0.5;
dim += 0.4;
ypos = ((rand()%60)*.01)-0.3;
xpos = ((rand()%60)*.01)-0.3;
xpos+=(1-dim) * 0.5;
ypos+=(1-dim) * 0.5;
rand_offset1= (rand()%200)*.01;
rand_offset2= (rand()%400)*.01;
rand_offset3= (rand()%600)*.01;
}
ColoredPoint PerPoint(ColoredPoint p, const WaveformContext context)
{
meanbass = 0.01*(meanbass*99+context.music->bass);
meantreb = 0.01*(meantreb*99+context.music->treb);
meanmid = 0.01*(meanmid*99+context.music->mid);
float bassdiff = (context.music->bass - meanbass)*15;
float trebdiff = (context.music->treb - meantreb)*15;
float middiff = (context.music->mid - meanmid)*15;
float ba = min(above(bassdiff,0)*bassdiff*.005,.11);
float tr = min(above(trebdiff,0)*trebdiff*.005,.11);
float mi = min(above(middiff,0)*middiff*.005,.11);
mi2_prg = mi2_prg+mi;
gam = abs(gam-above(mi2_prg,5));
mi2_prg= if_milk(above(mi2_prg,5),0,mi2_prg);
float s = context.sample_int;
//Gambe
p.x= if_milk(equal(int(s),1),.4,.4);
p.y= if_milk(equal(int(s),1),.2+((ba+tr)*.5)*gam,.2+((ba+tr)*.5)*gam);
p.x= if_milk(equal(int(s),2),.5+sin(ba*100)*.03,p.x);
p.y= if_milk(equal(int(s),2),.4,p.y);
p.x= if_milk(equal(int(s),3),.6,p.x);
p.y= if_milk(equal(int(s),3),.2+((ba+tr)*.5)*(1-gam),p.y);
p.x= if_milk(equal(int(s),4),.5+sin(ba*100)*.03,p.x);
p.y= if_milk(equal(int(s),4),.4,p.y);
//Corpo
p.x= if_milk(equal(int(s),5),.5,p.x);
p.y= if_milk(equal(int(s),5),.6,p.y);
//Braccia
p.x= if_milk(equal(int(s),6),.4-mi*.23,p.x);
p.y= if_milk(equal(int(s),6),.5+mi,p.y);
p.x= if_milk(equal(int(s),7),.5,p.x);
p.y= if_milk(equal(int(s),7),.6,p.y);
p.x= if_milk(equal(int(s),8),.6+tr*.23,p.x);
p.y= if_milk(equal(int(s),8),.5+tr,p.y);
p.x= if_milk(equal(int(s),9),.5,p.x);
p.y= if_milk(equal(int(s),9),.6,p.y);
//Testa
p.x= if_milk(equal(int(s),10),.5,p.x);
p.y= if_milk(equal(int(s),10),.62,p.y);
p.x= if_milk(equal(int(s),11),.47-ba*.23,p.x);
p.y= if_milk(equal(int(s),11),.62,p.y);
p.x= if_milk(equal(int(s),12),.47-ba*.23,p.x);
p.y= if_milk(equal(int(s),12),.67+ba*.23,p.y);
p.x= if_milk(equal(int(s),13),.53+ba*.23,p.x);
p.y= if_milk(equal(int(s),13),.67+ba*.23,p.y);
p.x= if_milk(equal(int(s),14),.53+ba*.23,p.x);
p.y= if_milk(equal(int(s),14),.62,p.y);
p.x= if_milk(equal(int(s),15),.50,p.x);
p.y= if_milk(equal(int(s),15),.62,p.y);
mi_prg= if_milk(above(mi_prg,5),0,mi_prg+mi*.1);
ba_prg= if_milk(above(ba_prg,5),0,ba_prg+ba*.1);
tr_prg= if_milk(above(tr_prg,5),0,tr_prg+tr*.1);
float temp_dim = dim + 0.2 * sin(mi_prg + rand_offset1);
float temp_xpos = xpos + 0.2 * cos(ba_prg + rand_offset2);
float temp_ypos = ypos + 0.2* sin(tr_prg + rand_offset3);
p.x=p.x*temp_dim+temp_xpos;
p.y=p.y*temp_dim+temp_ypos;
float hm=context.sample+mi2_prg;
float ht=context.sample+tr_prg;
float hb=context.sample+ba_prg;
p.r=hm;
p.g=ht;
p.b=hb;
p.a=.8;
return p;
}
};
class MstressJuppyDancer : public Pipeline
{
public:
Dancer dancer[10];
float dx, dy, cx, cy, time;
float q1,meanmid,middiff,mi_prg,gam, bass;
MstressJuppyDancer() : Pipeline()
{
for(int x = 0; x< 10; x++)
drawables.push_back(&dancer[x]);
textureWrap = false;
screenDecay = 0.3;
q1 = 0;
meanmid = 0;
middiff = 0;
mi_prg = 0;
gam = 0;
}
virtual void Render(const BeatDetect &music, const PipelineContext &context)
{
meanmid = 0.01*(meanmid*99+music.mid);
middiff = (music.mid - meanmid)*15;
float mi = min(above(middiff,0)*middiff*.005,.11);
mi_prg = mi_prg+mi;
gam = abs(gam-above(mi_prg,.5));
mi_prg= if_milk(above(mi_prg,.5),0,mi_prg);
q1 = gam;
bass = music.bass;
}
virtual PixelPoint PerPixel(PixelPoint p, const PerPixelContext context)
{
float sx = -below(p.y,0.8)*.001;
float dx = .01*bass*(1-q1*2)*below(p.y,0.8);
float rot=rot+.051*below(p.y,0.8);
float cx=trunc(p.x*16)/16;
float cy=trunc(p.y*16)/16;
Transforms::Scale(p,context,sx,1,cx,cy);
Transforms::Rotate(p,context,rot,cx,cy);
Transforms::Transform(p,context,dx,0);
return p;
}
};
typedef NativePreset<MstressJuppyDancer> MstressJuppyDancerPreset;
extern "C" MstressJuppyDancerPreset * create(const char * url) {
return new MstressJuppyDancerPreset(std::string(url));
}
extern "C" void destroy(MstressJuppyDancerPreset * preset) {
delete preset;
}