diff options
Diffstat (limited to 'noatun-plugins/tyler/compute.c')
| -rw-r--r-- | noatun-plugins/tyler/compute.c | 188 | 
1 files changed, 188 insertions, 0 deletions
diff --git a/noatun-plugins/tyler/compute.c b/noatun-plugins/tyler/compute.c new file mode 100644 index 0000000..78d6f90 --- /dev/null +++ b/noatun-plugins/tyler/compute.c @@ -0,0 +1,188 @@ +/* +// Copyright (C) 2000 Julien Carme +// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2, as +// published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +*/ + +#include <math.h> +#include "renderer.h" +#include "compute.h" + +#define PI 3.14159 + +t_complex fct(t_complex a,int n,int p1,int p2)   /*p1 et p2:0-4 */ +{ +	t_complex b; +	float fact; +	float an; +	float circle_size; +	float speed; +	float co,si; +	 +	a.x-=scr_par.width/2; +	a.y-=scr_par.height/2; +	 +	switch (n) { +		 +	case 0: +		an=0.025*(p1-2)+0.002; +		co=cos(an); +		si=sin(an); +		circle_size=scr_par.height*0.25; +		speed=2000+p2*500; +		b.x=(co*a.x-si*a.y); +		b.y=(si*a.x+co*a.y); +		fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; +		b.x=(b.x*fact); +		b.y=(b.y*fact); +		break; +		 +	case 1: +		an=0.015*(p1-2)+0.002; +		co=cos(an); +		si=sin(an); +		circle_size=scr_par.height*0.45; +		speed=4000+p2*1000; +		b.x=(co*a.x-si*a.y); +		b.y=(si*a.x+co*a.y); +		fact=(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; +		b.x=(b.x*fact); +		b.y=(b.y*fact); +		break; +		 +	case 2: +		an=0.002; +		co=cos(an); +		si=sin(an); +		circle_size=scr_par.height*0.25; +		speed=400+p2*100; +		b.x=(co*a.x-si*a.y); +		b.y=(si*a.x+co*a.y);   +		fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; +		b.x=(b.x*fact); +		b.y=(b.y*fact); +		break; +		 +	case 3: +		an=(sin(sqrt(a.x*a.x+a.y*a.y)/20)/20)+0.002; +		co=cos(an); +		si=sin(an); +		circle_size=scr_par.height*0.25; +		speed=4000; +		b.x=(co*a.x-si*a.y); +		b.y=(si*a.x+co*a.y); +		fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; +		b.x=(b.x*fact); +		b.y=(b.y*fact); +		break; +		 +	case 4: +		an=0.002; +		co=cos(an); +		si=sin(an);  +		circle_size=scr_par.height*0.25; +		speed=sin(sqrt(a.x*a.x+a.y*a.y)/5)*3000+4000; +		b.x=(co*a.x-si*a.y); +		b.y=(si*a.x+co*a.y); +		fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1; +		b.x=(b.x*fact); +		b.y=(b.y*fact);     +		break; +		 +	case 5: +		b.x=a.x*1.02; +		b.y=a.y*1.02; +		break; + +	case 6: +		an=0.002; +		co=cos(an); +		si=sin(an);  +		circle_size=scr_par.height*0.25; +		fact=1+cos(atan(a.x/(a.y+0.00001))*6)*0.02; +		b.x=(co*a.x-si*a.y); +		b.y=(si*a.x+co*a.y); +		b.x=(b.x*fact); +		b.y=(b.y*fact);     +		break;	 +		 +	}   +  +	b.x+=scr_par.width/2; +	b.y+=scr_par.height/2;   +	if (b.x<0) +		b.x=0; +	if (b.y<0) +		b.y=0; +	if (b.x>scr_par.width-1) +		b.x=scr_par.width-1; +	if (b.y>scr_par.height-1) +		b.y=scr_par.height-1;      +	 +	return b; +} + + +void generate_sector(int g,int f,int p1,int p2,int debut,int step,t_interpol* vector_field); + +void generate_sector(int g,int f,int p1,int p2,int debut,int step,t_interpol* vector_field) +{ +	int fin=debut+step; +	const int prop_transmitted=249; +	const int b_add=g*scr_par.width*scr_par.height;  +	t_coord c; + + +	if (fin>scr_par.height) +		fin=scr_par.height; +	for (c.y=debut;c.y<fin;c.y++)  +		for (c.x=0;c.x<scr_par.width;c.x++) { +			t_complex a; +			float fpy; +			int rw,lw,add; +			unsigned int w1,w2,w3,w4; +			unsigned int x,y; + +			a.x=(float)c.x; +			a.y=(float)c.y; +			a=fct(a,f,p1,p2); +			add=c.x+c.y*scr_par.width; +			x=(int)(a.x); +			y=(int)(a.y); +			vector_field[b_add+add].coord=(x<<16)|y; + +			fpy=a.y-floor(a.y); +			rw=(int)((a.x-floor(a.x))*prop_transmitted); +			lw=prop_transmitted-rw; +			w4=(int)(fpy*rw); +			w2=rw-w4; +			w3=(int)(fpy*lw); +			w1=lw-w3;  +			vector_field[b_add+add].weight=(w1<<24)|(w2<<16)|(w3<<8)|w4; +		} +} + +void generate_vector_field(t_interpol* vector_field)  +{ +	int f; +	int i,p1,p2; +     +	for (f=0;f<NB_FCT;f++) { +		p1=2; +		p2=2; +		for (i=0;i<scr_par.height;i+=10) +			generate_sector(f,f,p1,p2,i,10,vector_field); +	} +}  | 
