apophysis7x/Plugin/gdoffs.c

100 lines
3.4 KiB
C
Raw Normal View History

/*
Apophysis Plugin
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
Written by Georg Kiehne
--> http://xyrus-worx.net, http://xyrus02.deviantart.com
If you find any bugs / nags - keep them :)
*/
typedef struct {
double gdoffs_delta_x, gdoffs_delta_y;
double gdoffs_area_x, gdoffs_area_y;
double gdoffs_center_x, gdoffs_center_y;
int gdoffs_gamma, gdoffs_square;
double gdodx, gdoax, gdocx;
double gdody, gdoay, gdocy;
double gdob;
int gdog, gdos;
} Variables;
#include "apoplugin.h"
// Fine tune stuff, try not to touch :)
const double __agdod = 0.1;
const double __agdoa = 2.0;
const double __agdoc = 1.0;
APO_PLUGIN("gdoffs");
APO_VARIABLES(
VAR_REAL_RANGE(gdoffs_delta_x, 0.0, 16.0, 0.0),
VAR_REAL_RANGE(gdoffs_delta_y, 0.0, 16.0, 0.0),
VAR_REAL(gdoffs_area_x, 2.0),
VAR_REAL(gdoffs_area_y, 2.0),
VAR_REAL(gdoffs_center_x, 0.0),
VAR_REAL(gdoffs_center_y, 0.0),
VAR_INTEGER_RANGE(gdoffs_gamma, 1, 6, 1),
VAR_INTEGER_RANGE(gdoffs_square, 0, 1, 0)
);
int PluginVarPrepare(Variation* vp)
{
vp->var.gdodx = (vp->var.gdoffs_delta_x) * __agdod;
vp->var.gdody = (vp->var.gdoffs_delta_y) * __agdod;
vp->var.gdoax = ((fabs(vp->var.gdoffs_area_x) < 0.1) ? 0.1 : fabs(vp->var.gdoffs_area_x)) * __agdoa;
vp->var.gdoay = ((fabs(vp->var.gdoffs_area_y) < 0.1) ? 0.1 : fabs(vp->var.gdoffs_area_y)) * __agdoa;
vp->var.gdocx = (vp->var.gdoffs_center_x) * __agdoc;
vp->var.gdocy = (vp->var.gdoffs_center_y) * __agdoc;
vp->var.gdog = (vp->var.gdoffs_gamma);
vp->var.gdos = (vp->var.gdoffs_square);
vp->var.gdob = (double)(vp->var.gdog) * __agdoa / (MAX(vp->var.gdoax, vp->var.gdoay));
return 1;
}
inline double fcip(double a){return ((a<0)?-((int)(fabs(a))+1):0)+((a>1)?((int)(a)):0);}
inline double fclp(double a){return ((a<0)?-(fmod(fabs(a),1)):fmod(fabs(a),1));}
inline double fscl(double a){return fclp((a+1)/2); }
inline double fosc(double p, double a){return fscl(-1*cos(p*a*M_2PI));}
inline double flip(double a, double b, double c){return (c*(b-a)+a);}
int PluginVarCalc(Variation* vp)
{
double osc_x=fosc(vp->var.gdodx,1),osc_y=fosc(vp->var.gdody,1);
double in_x=(*(vp->pFTx)+vp->var.gdocx),in_y=(*(vp->pFTy)+vp->var.gdocy);
double out_x=0,out_y=0;
if ((vp->var.gdos) != 0) {
out_x = flip(flip(in_x,fosc(in_x,4),osc_x),fosc(fclp(vp->var.gdob*in_x),4),osc_x);
out_y = flip(flip(in_y,fosc(in_y,4),osc_x),fosc(fclp(vp->var.gdob*in_y),4),osc_x);
} else {
out_x = flip(flip(in_x,fosc(in_x,4),osc_x),fosc(fclp(vp->var.gdob *in_x),4),osc_x);
out_y = flip(flip(in_y,fosc(in_y,4),osc_y),fosc(fclp(vp->var.gdob *in_y),4),osc_y);
}
*(vp->pFPx) = vp->vvar*out_x;
*(vp->pFPy) = vp->vvar*out_y;
*(vp->pFPz) = vp->vvar*(*(vp->pFTz));
return 1;
}