void dynlightreaching(const vec &target, vec &color, vec &dir, bool hud) { vec dyncolor(0, 0, 0);//, dyndir(0, 0, 0); loopv(dynlights) { dynlight &d = dynlights[i]; if(d.curradius<=0) continue; vec ray(hud ? d.hud : d.o); ray.sub(target); float mag = ray.squaredlen(); if(mag >= d.curradius*d.curradius) continue; vec color = d.curcolor; color.mul(1 - sqrtf(mag)/d.curradius); dyncolor.add(color); //dyndir.add(ray.mul(intensity/mag)); } #if 0 if(!dyndir.iszero()) { dyndir.normalize(); float x = dyncolor.magnitude(), y = color.magnitude(); if(x+y>0) { dir.mul(x); dyndir.mul(y); dir.add(dyndir).div(x+y); if(dir.iszero()) dir = vec(0, 0, 1); else dir.normalize(); } } #endif color.add(dyncolor); }
void gethl(){ ldb x,y; ifstream ifl ("lti"); for(int i=0;i<30;++i){ ifl>>x>>y; hl.add(cpx(x,y)); } for(int n=0;n<Nc;++n){ cpx ps(0,0); for(int k=0;k<30;++k){ ps += hl[k] * ekn[modnc(-1*k*n)]; } hlt.add(ps); } }
void modu(vec<cpx>& m,bool psi[][8]){ int num; for(int i=0;i<Nc;++i){ num = 0; for(int j=0;j<md;++j){ num += psi[i][j]*pw[j]; } m.add(symget(num)); } }
void ltifc(vec<cpx>& y,vec<cpx> x){ cpx zn,ps; for(int n=0;n<Nc+L-1;++n){ zn = cpx(dist(rgen),dist(rgen)); ps = cpx(0,0); for(int l=0;l<=n && l<30;++l){ ps += hl[l]*x[n-l] + zn; } y.add(ps); } }
void dft(vec<cpx>& u,vec<cpx> ut,bool inverse){ int j = ((inverse)?1:-1); for(int n=0;n<Nc;++n){ cpx ps(0,0); for(int k=0;k<Nc;++k){ ps += ut[k] * ekn[modnc(j*k*n)]; } ps = ps / cpx(pow(Nc,0.5),0); u.add(ps); } }
void swayhudgun(int curtime) { fpsent *d = hudplayer(); if(d->state!=CS_SPECTATOR) { if(d->physstate>=PHYS_SLOPE) swaymillis += curtime; float k = pow(0.7f, curtime/10.0f); swaydir.mul(k); vec vel(d->vel); vel.add(d->falling); swaydir.add(vec(vel).mul((1-k)/(15*max(vel.magnitude(), d->maxspeed)))); } }
bool effect::drawline(vec &from, vec &to, float size, int type, int elapse) { if(size <= 0) return false; size *= this->size; int fade, gravity, num; setvars(this, type, fade, gravity, num); num *= from.dist(to) / (10 * size) * partmul * (elapse ? logf(elapse) / 3 : 1); if(particle == PART_STREAK || particle == PART_LIGHTNING) num /= 2; num = min<int>(min(num, linemaxsteps), from.dist(to) / linemininterval); if(!num) return false; vec delta = vec(to).sub(from).div(num); loopi(num) { switch(particle) { case PART_EXPLOSION: case PART_EXPLOSION_BLUE: particle_fireball(from, size * 2, particle, fade, colour, size * 2); break; case PART_STREAK: case PART_LIGHTNING: { if(!curtime) return false; vec start = vec(rnd(360) * RAD, rnd(360) * RAD).mul(4 * size).add(from); vec end = vec(delta).mul(1.5).add(start); particle_flare(start, end, fade, particle, colour, size); break; } default: particle_splash(particle, 2, fade, from, colour, size, max<int>(1, size * 5), gravity); break; } from.add(delta); } return true; }
void detc(vec<cpx>& u,vec<cpx> ut){ for(int i=0;i<Nc;++i) u.add(ut[i]/hlt[i]); }
void cycrem(vec<cpx>&u,vec<cpx> y){ for(int i=0;i<Nc;++i) u.add(y[L+i-1]); }
void cycins(vec<cpx>&x,vec<cpx> u){ for(int i=1;i<L;++i) x.add(u[Nc-L+i]); for(int i=0;i<Nc;++i) x.add(u[i]); }
void getekn(){ for(int i=0;i<Nc;++i) ekn.add(cpx(cos(2*pi*i/Nc),sin(2*pi*i/Nc))); }