You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
4.0 KiB
189 lines
4.0 KiB
/*
|
|
// 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);
|
|
}
|
|
}
|