82 lines
2.0 KiB
C
82 lines
2.0 KiB
C
|
/*
|
||
|
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.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
09-10-04 - Optimized by Xyrus02
|
||
|
*/
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
//double v;
|
||
|
double spr;
|
||
|
double flux_spread;
|
||
|
|
||
|
} Variables;
|
||
|
|
||
|
#include "apoplugin.h"
|
||
|
|
||
|
APO_PLUGIN("flux");
|
||
|
|
||
|
APO_VARIABLES(
|
||
|
VAR_REAL(flux_spread, 0.0),
|
||
|
);
|
||
|
|
||
|
int PluginVarPrepare(Variation* vp)
|
||
|
{
|
||
|
// Why is this calculated? It isn't used...
|
||
|
//VAR(v) = 0.5 * VVAR / M_PI;
|
||
|
|
||
|
// But we only use 2 + VAR(flux_spread) so we can precalculate that :-)
|
||
|
VAR(spr) = 2 + VAR(flux_spread);
|
||
|
|
||
|
// We succeeded :-)
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
int PluginVarCalc(Variation* vp)
|
||
|
{
|
||
|
double avgr, avga;
|
||
|
double s, c;
|
||
|
|
||
|
// Avoid reduant calculations by precalculating everything what is used at least twice
|
||
|
double x = FTx,
|
||
|
y = FTy;
|
||
|
double xpv = FTx + VVAR,
|
||
|
xmv = FTx - VVAR;
|
||
|
double y2 = sqr(y);
|
||
|
|
||
|
// We have a division by zero problem in the original flux
|
||
|
// (What if y + (x-vvar) == 0 ????)
|
||
|
double frac = sqrt(y2 + sqr(xmv));
|
||
|
if (frac == 0) frac = 1.0;
|
||
|
|
||
|
// This is a huge shitload of calculations :O
|
||
|
avgr = VVAR * (VAR(spr) * sqrt(sqrt(y2 + sqr(xpv) ) / frac));
|
||
|
avga = (atan2(y , xmv) - atan2(y , xpv)) / 2.0;
|
||
|
fsincos(avga, &s, &c);
|
||
|
|
||
|
FPx += avgr * c;
|
||
|
FPy += avgr * s;
|
||
|
|
||
|
// Add 3D compatibility
|
||
|
FPz += FTz;
|
||
|
|
||
|
// Report success!
|
||
|
return TRUE;
|
||
|
}
|