Welcome to Fractal Forums

Fractal Software => beta testing => Topic started by: DarkBeam on December 01, 2016, 07:13:24 PM




Title: GCC sources of MB3D formulas
Post by: DarkBeam on December 01, 2016, 07:13:24 PM
Too bad the biggest part does not exist. I made all by hand.

But now finally I am beginning to try Knighty's code ( http://www.fractalforums.com/tutorials/re-blobby-reknighty/ ). So;
Code:
// from JIT Mandelcup of Pupukuusikko :D
#include <math.h>

void __attribute__((fastcall)) Formula(
             double* x,      // [eax]
             double* y,      // [edx]
             double* arg,    // [ebp+8], points to TIteration3Dext.C1
             void* dummy     // so we end w/ ret 8 as delphi expects
             );

          
__attribute__((packed)) struct TIteration3Dext {
double Cw,Rold,RStopD,x,y,z,w; // use with neg indizes before C1. w is also used for 3d ifs and abox analytic DE
double Px, Py, Pz;             //      actual position, never change these!  Can be used as input.
double Cx, Cy, Cz;             //+24   these are the constants for adding. Pxyz or the julia seed.  Cw is @-56 (begin of struct)
void*  PVar;                   //+48   the actual formulas adress of constants and vars, constants at offset 0 increasing, user vars below -8
float  SmoothItD;              //+52
double Rout;                   //+56   the square of the vector length, can be used as input
int    ItResultI;              //+64
int    maxIt;                  //+68
float  RStop;                  //+72
int    nHybrid[6];             //+76   all formulas iteration counts or single weights in interpol-hybrid
void*  fHPVar[6];              //+100  all formulas pointer to constants+vars, PVars-8=0.5, use PVar for the actual formula
void*  fHybrid[6];             //+124  the formulas adresses
int    CalcSIT;                //+148
int    DoJulia;                //+152
float  LNRStop;                //+156
int    DEoption;               //+160
float  fHln[6];                //+164  for SmoothIts
int    iRepeatFrom;            //+188
double OTrap;                  //+192
double VaryScale;              //+200  to use in vary by its
int    bFirstIt;               //+208  used also as iteration count, is set to 0 on it-start
int    bTmp;                   //+212  tmpBuf, free of use.
double Dfree1;                 //+216
double Dfree2;                 //+224
double Deriv1;                 //+232  for 4D first deriv or as full derivs
double Deriv2;                 //+240
double Deriv3;                 //+248
float  SMatrix4[4][4];         //+256  for 4d rotation, used like most other values only by the programs iteration loop procedure
};

__CRT_INLINE double __cdecl Hypot(double x,double y) { return sqrt(x*x+y*y); }
__CRT_INLINE double __cdecl length(double x,double y,double z) { return sqrt(x*x+y*y+z*z); }
__CRT_INLINE double __cdecl recip (long double _x)
{
  double res;
  __asm__ ("fld1
"
   "fdivp": "=t" (res) : "0" (_x));
  return res;
}

// fastcall is not quite delphi fastcall.
// first two args are ok, third is in ecx in delphi, on stack here.
void __attribute__((fastcall)) Formula(
             double* x,      // [eax]
             double* y,      // [edx]
             double* arg,    // [ebp+8], points to TIteration3Dext.C1
             void* dummy     // so we end w/ ret 8 as delphi expects
             ) {
  // Compute ptr to proper start of TIteration3Dext struct.
  struct TIteration3Dext* cfg = (struct TIteration3Dext*)(arg-7);
  int* UserV = (int*)(cfg->PVar-12); // beginning of int vars
  double* UserV2 = (double*)(cfg->PVar-12-16); // beginning of dbl vars
  // no cns used!
  double temp, z_y, z_x, r;
  double mag1, mag2;
  double Scale = UserV2[0];
  double Shape = UserV2[-1]; // AAARRGGHH neg indices but it workssss :P
  
  // stereographic projection, modified a bit
  r = length(cfg->x,cfg->y,cfg->z);
  if (UserV[0]!=0) {
     cfg->x =cfg->x/r; cfg->y =cfg->y/r;
  }
  cfg->z = (cfg->z/r)+Shape;
  
  if (UserV[-1]!=0) {
     cfg->z =cfg->z*cfg->z; Shape = Shape*Shape;
  }
  
  if (UserV[-2]!=0) {
    temp = cfg->z;
  } else {
    temp = recip(cfg->z);
  }
  
  z_x = cfg->x*temp; z_y = cfg->y*temp;
 
  //complex multiplication
  temp = z_x*z_x-z_y*z_y;
  z_y = z_x*z_y; z_y += z_y;
  z_x = temp;
  
  temp = Scale*(1.+(Shape*Shape));
  //z_x = z_x*temp;
  //z_y = z_y*temp;

  
  //p = vec3(2.*z.x,2.*z.y,dot(z,z)-1)/dot(z.z+1);
  
  // inverse stereographic
  mag1 = z_x*z_x+z_y*z_y;
  mag2 = recip(mag1+1.); mag1 = mag1-1.;
              
  cfg->x = temp*mag2;
  cfg->y = z_y*cfg->x;
  cfg->x *= z_x;
  cfg->z = mag1*mag2;
  
  temp = r*r;//+Offset3;
  
  cfg->x = cfg->x * temp + cfg->Cx;
  cfg->y = cfg->y * temp + cfg->Cy;
  cfg->z = cfg->z * temp + cfg->Cz;
}


Title: Re: GCC sources of MB3D formulas
Post by: DarkBeam on December 22, 2016, 01:11:09 PM
Idk how to add the car glass color help? O0 (Credit to Eiffie Shiny Toy!!!!!) :beer:


Title: Re: GCC sources of MB3D formulas
Post by: DarkBeam on December 22, 2016, 01:19:39 PM
Source code I forgot :sad1:


Title: Re: GCC sources of MB3D formulas
Post by: knighty on December 22, 2016, 01:23:16 PM
Cool!
 :thumbsup1:


Title: Re: GCC sources of MB3D formulas
Post by: DarkBeam on December 22, 2016, 01:27:37 PM
 :beer: Thanks! Now everything works as expected, you may reuse the code to do most anything imaginable
except trigs (not done yet but just copypaste those already done), ;) and the rotations, and the single precision stuff (also used for rotations!)
so ... good luck :beer:
I will do the Kleinian asap hopefully!


Title: Re: GCC sources of MB3D formulas
Post by: DarkBeam on January 04, 2017, 10:54:23 AM
Premade project of Kleinian - everybody can modify it, make sure to credit the authors :beer:


Title: Re: GCC sources of MB3D formulas
Post by: DarkBeam on February 01, 2017, 06:44:01 PM
UPDATE!
Added current final (?) formula src code ;D
EDIT - FIXED the weird bug that prevented other difs shapes to render after JosKlein.