Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| unit formulas; | |
| interface | |
| uses CustomFormulas, TypeDefinitions; | |
| procedure doHybridPas(PIteration3D: TPIteration3D); | |
| function doHybridPasDE(PIteration3D: TPIteration3D): Double; | |
| procedure doHybridSSE2(PIteration3D: TPIteration3D); | |
| function doHybridDESSE2(PIteration3D: TPIteration3D): Double; | |
| procedure doInterpolHybridPas(PIteration3D: TPIteration3D); | |
| procedure doInterpolHybridSSE2(PIteration3D: TPIteration3D); | |
| function doInterpolHybridPasDE(PIteration3D: TPIteration3D): Double; | |
| function doInterpolHybridDESSE2(PIteration3D: TPIteration3D): Double; | |
| procedure doInterpolHybridPas4D(PIteration3D: TPIteration3D); | |
| function doInterpolHybridPas4DDE(PIteration3D: TPIteration3D): Double; | |
| //function doInterpolHybridPasIFS(PIteration3D: TPIteration3D): Double; | |
| procedure doHybrid4DPas(PIteration3D: TPIteration3D); | |
| procedure doHybrid4DSSE2(PIteration3D: TPIteration3D); | |
| function doHybrid4DDEPas(PIteration3D: TPIteration3D): Double; | |
| function doHybridIFS3D(PIteration3D: TPIteration3D): Double; | |
| function doHybridIFS3DnoVecIni(PIteration3D: TPIteration3D): Double; //to use behind common fractals, use the new vec for it | |
| procedure HybridCube(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridCubeDE(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridCubeSSE2(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridCubeSSE2DE(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridItTricorn(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridQuat(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridItIntPow2(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridItIntPow3(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridItIntPow4(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridIntP5(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridIntP6(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridIntP7(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridIntP8(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridQuatSSE2(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridItIntPow2SSE2(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridCustomIFS; | |
| procedure TestHybrid(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridCustomIFStest; | |
| procedure HybridFloatPow(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure HybridSuperCube2(var x, y, z, w: Double; PIteration3D: TPIteration3D); //Bulbox | |
| procedure HybridFolding(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| procedure EmptyFormula(var x, y, z, w: Double; PIteration3D: TPIteration3D); //for not used formulas | |
| procedure HybridItIntPow2scale(var x, y, z, w: Double; PIteration3D: TPIteration3D); //sine bulb with scaling | |
| procedure CalcSmoothIterations(PIt3D: TPIteration3D; n: Integer); | |
| procedure AexionC(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| var | |
| fIsMemberAlternating: TMandFunction = doHybridPas; | |
| fIsMemberAlternatingDE: TMandFunctionDE = doHybridPasDE; | |
| fIsMemberAlternating4D: TMandFunction = doHybrid4DPas; | |
| fIsMemberIpol: TMandFunction = doInterpolHybridPas; | |
| fIsMemberIpolDE: TMandFunctionDE = doInterpolHybridPasDE; | |
| fHybridCubeDE: ThybridIteration = HybridCubeDE; | |
| fHybridCube: ThybridIteration = HybridCube; | |
| fHybridQuat: ThybridIteration = HybridQuat; | |
| fHybridItIntPow2: ThybridIteration = HybridItIntPow2; | |
| fHybridTricorn: ThybridIteration = HybridItTricorn; | |
| fHIntFunctions: array[2..8] of ThybridIteration = (HybridItIntPow2, | |
| HybridItIntPow3, HybridItIntPow4, HybridIntP5, HybridIntP6, HybridIntP7, | |
| HybridIntP8); | |
| { testhybridDEoption: Integer = 2; //6; //11=ABox 5=4dABox 6=4dIFS | |
| testhybridRstop: Double = 1024; //1024 | |
| testhybridDEscale: Double = 0.2; //0.2; | |
| testhybridPow: Double = 2; //0,7,0 21: .SRECI2 single + reciproc single | |
| testhybridOptionCount: Integer = 14; //AmazingBox vars: scale=double, MinR=boxscale: Scale/Sqr(MinR), Sqr(MinR), Fold=double.. | |
| testhybridOptionTypes: array[0..13] of Integer = (1,1,9,1,1,1,1,1,1,6,6,6,1,1); //5:.3DoubleAngles 9:DSquare | |
| testhybridOptionVals: array[0..13] of Double = (2,0.25,0.5,2,2,2,1,1,1,0,0,0,2,2); | |
| testhybridOptionsStrings: array[0..13] of String = ('Scale','BoxFold','SphereFold','NonLin X','NonLin Y','NonLin Z','Lin X','Lin Y', | |
| 'Lin Z','Rotate X','Rotate Y','Rotate Z', 'NonLin vary', 'Lin vary'); } | |
| {.Double Scale = 1.5 asurf | |
| .Boxscale Min R = 0.5 | |
| .Double Fold = 1 | |
| .3SingleAngles Rotation1 = 5 | |
| .Double Scale vary = 0 | |
| .Integer Sphere or Cylinder = 1 } | |
| { testhybridDEoption: Integer = 2; //abox platinum | |
| testhybridRstop: Double = 1024; | |
| testhybridDEscale: Double = 0.2; | |
| testhybridPow: Double = 2; //0,7,0 21: .SRECI2 single + reciproc single | |
| testhybridOptionCount: Integer = 15; //AmazingBox vars: scale=double, MinR=boxscale: Scale/Sqr(MinR), Sqr(MinR), Fold=double.. | |
| testhybridOptionTypes: array[0..14] of Integer = (0,7,0,6,6,6,0,0,0,13,3,3,3,3,2); //6:.3SingleAngles 9:DSquare | |
| testhybridOptionVals: array[0..14] of Double = (2,0.5,1,0,0,0,0,0,0,1,0,0,0,0,0); | |
| testhybridOptionsStrings: array[0..14] of String = ('Scale','Min R/IR','Fold','RotationX','RotationY','RotationZ', | |
| 'Inv xC','Inv yC','Inv zC','Inv Radius','FoldX, XY angle','FoldX, XZ angle','FoldY, XY angle','FoldY, YZ angle', | |
| 'Abs XYZ switches'); } | |
| testhybridDEoption: Integer = -1; //X+SinY | |
| testhybridRstop: Double = 16; | |
| testhybridDEscale: Double = 0.2; | |
| testhybridPow: Double = 2; //0,7,0 21: .SRECI2 single + reciproc single | |
| testhybridOptionCount: Integer = 6; //AmazingBox vars: scale=double, MinR=boxscale: Scale/Sqr(MinR), Sqr(MinR), Fold=double.. | |
| testhybridOptionTypes: array[0..5] of Integer = (2,2,1,1,1,1); //6:.3SingleAngles 9:DSquare | |
| testhybridOptionVals: array[0..5] of Double = (1,2,0,1,1,0); | |
| testhybridOptionsStrings: array[0..5] of String = ('Index1','Index2','Offset 1','Scale 1','Scale 2','Offset 2'); | |
| {.Double Scale = 2 | |
| .Boxscale MinR/IR = 0.5 | |
| .Double Fold = 1 | |
| .3SingleAngles Rotate = 0 | |
| .Double Inv xC = 0 | |
| .Double Inv yC = 0 | |
| .Double Inv zC = 0 | |
| .DRecipro Inv Radius = 1 | |
| .DoubleAngle FoldX, XY angle = 0 | |
| .DoubleAngle FoldX, XZ angle = 0 | |
| .DoubleAngle FoldY, XY angle = 0 | |
| .DoubleAngle FoldY, YZ angle = 0 | |
| .Integer Abs XYZ switches = 0 }{ testhybridDEoption: Integer = 11; //amazing surf | |
| testhybridRstop: Double = 20; | |
| testhybridDEscale: Double = 0.2; | |
| testhybridPow: Double = 2; //0,7,0 21: .SRECI2 single + reciproc single | |
| testhybridOptionCount: Integer = 8; //AmazingBox vars: scale=double, MinR=boxscale: Scale/Sqr(MinR), Sqr(MinR), Fold=double.. | |
| testhybridOptionTypes: array[0..7] of Integer = (0,7,0,6,6,6,0,2); //6:.3SingleAngles 9:DSquare | |
| testhybridOptionVals: array[0..7] of Double = (1.5,0.5,1,5,5,5,0,1); | |
| testhybridOptionsStrings: array[0..7] of String = ('Scale','Min R','Fold','Roatation','','','Scale vary','Sphere or Cylinder'); | |
| { testhybridDEoption: Integer = 11; //smoothbox | |
| testhybridRstop: Double = 1024; //1024 | |
| testhybridDEscale: Double = 0.2; //0.2; | |
| testhybridPow: Double = 2; //0,7,0 21: .SRECI2 single + reciproc single | |
| testhybridOptionCount: Integer = 8; //AmazingBox vars: scale=double, MinR=boxscale: Scale/Sqr(MinR), Sqr(MinR), Fold=double.. | |
| testhybridOptionTypes: array[0..7] of Integer = (0,7,0,0,2,0,2,0); //5:.3DoubleAngles 9:DSquare | |
| testhybridOptionVals: array[0..7] of Double = (2,0.5,1,0,6,1,4,0.3); | |
| testhybridOptionsStrings: array[0..7] of String = ('Scale','Min R','Fold','Scale vary','Sharpness (Integer 2+)', | |
| 'Fix (BoxFold)','Sh. of BallFold (Int 3+)','Fix (BallFold)'); } | |
| const cs05: Single = 0.5; | |
| cs099: Single = 0.99; | |
| testIFSDEoption: Integer = 20; | |
| testIFSOptionCount: Integer = 10; //Plane with otrap map coloring | |
| testIFSOptionTypes: array [0..9] of Integer = (0,0,0,0,0,2,2,1,1,2); | |
| testIFSOptionVals: array [0..9] of Double = (0,1,0,0,1,0,0,0,1,0); | |
| testIFSOptionsStrings: array [0..9] of String = ('Normal Z','Normal Y','Normal X','Offset','Scale', | |
| 'Otrap color map','Map channel','Otrap offset','Otrap scale', 'Solid (0,1)'); // } | |
| { testIFSDEoption: Integer = 20; | |
| testIFSOptionCount: Integer = 13; //Sphere | |
| testIFSOptionTypes: array [0..12] of Integer = (0,14,14,0,14,13,13,13,2,2,1,1,0); //.3SingleAngles = 6 .2Doubles = 14 .Integer = 2 | |
| testIFSOptionVals: array [0..12] of Double = (1,2,0,0,3,1,1,1,1,0,1,1,0); // .SINGLEANGLE = 4 (sin,cos) .DSqrReci = 15 | |
| testIFSOptionsStrings: array [0..12] of String = ('Radius','Scale','Z add','Y add','X add', //.DRECIPRO = 13 | |
| 'Z size','Y size','X size','Apply add+scale','Otrap option','Otrap offset','Otrap scale', | |
| 'Inside radius'); // } | |
| { testIFSDEoption: Integer = 20; | |
| testIFSOptionCount: Integer = 9; //Box rounded | |
| testIFSOptionTypes: array [0..8] of Integer = (0,0,0,14,14,0,0,14,2); //.3SingleAngles = 6 .2Doubles = 14 .Integer = 2 | |
| testIFSOptionVals: array [0..8] of Double = (1,1,1,2,0,1,1,0.1,1); // .SINGLEANGLE = 4 (sin,cos) .DSqrReci = 15 | |
| testIFSOptionsStrings: array [0..8] of String = ('Z halfwidth','Y halfwidth','X halfwidth', | |
| 'Scale','Z add','Y add','X add','Border','Apply add+scale'); // } | |
| { testIFSDEoption: Integer = 20; | |
| testIFSOptionCount: Integer =14; //sphere map | |
| testIFSOptionTypes: array [0..13] of Integer = (2,2,1,1,1,1,1,1,6,6,6,2,1,1); //4=SINGLEANGLE 1=single | |
| testIFSOptionVals: array [0..13] of Single = (10,0,0,0,0,1,1,0.35,0,0,0,1,0,1); | |
| testIFSOptionsStrings: array [0..13] of String = //spheremap/Heightmap: col-nr position changed! | |
| ('Map nr', 'Col nr', 'Xoffset', 'Yoffset', 'Zoffset', 'Xscale', 'Yscale', 'Hscale', | |
| 'Rotation', 'Rotation', 'Rotation', 'OTrap Color nr', 'Color offset', 'Color mult'); } | |
| { testIFSDEoption: Integer = 20; | |
| testIFSOptionCount: Integer = 15; //HeightMapSphere with OTrap | |
| testIFSOptionTypes: array [0..14] of Integer = (2,2,1,1,1,1,1,1,18,1,1,1,2,1,1); | |
| testIFSOptionVals: array [0..14] of Single = (10,0,0,0,0,1,1,0.35,1,0,0,0,1,0,1); | |
| testIFSOptionsStrings: array [0..14] of String = ('Map nr', 'Map channel', 'X off', | |
| 'Y off', 'Z off', 'Length', 'Radius', 'Map height', 'Scale', 'X rot', 'Y rot', 'Z rot' | |
| , 'OTrap channel','OTrap offset', 'OTrap mul'); } | |
| implementation | |
| uses Math, DivUtils, LightAdjust, Math3D, SysUtils; | |
| procedure HybridCustomIFStest; | |
| asm | |
| { testIFSOptionTypes: array [0..9] of Integer = (0,0,0,0,0,2,2,1,1,2); | |
| testIFSOptionVals: array [0..9] of Double = (0,1,0,0,1,0,0,0,1,0); | |
| testIFSOptionsStrings: array [0..9] of String = ('Normal Z','Normal Y','Normal X','Offset','Scale', | |
| 'Otrap color map','Map channel','Otrap offset','Otrap scale', 'Solid (0,1)'); | |
| testIFSOptionsStrings: array [0..7] of String = ('Normal Z','Normal Y','Normal X','Offset','Scale', | |
| -16 -24 -32 -40 -48 | |
| 'Otrap color map','Map channel','Otrap offset','Otrap scale', 'Solid(0|1)'); | |
| -52 -56 -60 -64 -68} | |
| //PlaneIFS DotProd(Normal,P) - Offset | |
| movupd xmm0, [esi - 120] //x,y | |
| movsd xmm1, [esi - 104] //z | |
| mulpd xmm0, [edi - 32] | |
| mulsd xmm1, [edi - 16] | |
| addsd xmm1, xmm0 | |
| unpckhpd xmm0, xmm0 | |
| addsd xmm1, xmm0 | |
| subsd xmm1, [edi - 40] | |
| cmp [edi - 68], 0 | |
| jne @up | |
| andpd xmm1, [edi] | |
| @up: movsd [esi - 32], xmm1 //Rout: Double; //+56 | |
| mov edx, [edi - 52] | |
| test edx, edx | |
| jz @out | |
| push ecx //otrap coloring | |
| add esp, -32 | |
| { ClearSVec(Vortho^); | |
| NVec := DVecToSVec(NormaliseVector(Vin)); | |
| if Abs(NVec[0]) > 0.1 then | |
| begin | |
| Vortho^[0] := NVec[2]; | |
| Vortho^[2] := -NVec[0]; | |
| end else begin | |
| Vortho^[1] := -NVec[2]; | |
| Vortho^[2] := NVec[1]; | |
| end; | |
| NormaliseSVectorVar(Vortho^); | |
| TPLightSD(Vortho)^[1] := SVectorCross(Vortho^, NVec); | |
| } | |
| fld qword [edi - 16] | |
| fld qword [edi - 24] | |
| fld qword [edi - 32] //nx,ny,nz | |
| fld st //makeorthovecs | |
| fabs | |
| fcomp s011 | |
| fnstsw ax | |
| and ah, 41H | |
| jnz @@1 | |
| fld st(2) | |
| fmul st, st | |
| fld st(1) | |
| fmul st, st | |
| faddp | |
| fsqrt | |
| fld1 | |
| fdivrp //1/Sqrt(rr) | |
| fldz | |
| fld st(4) | |
| fmul st, st(2) | |
| fld st(3) | |
| fchs | |
| fmulp st(2), st //vo[0],0,vo[2],nx,ny,nz | |
| jmp @@2 | |
| @@1: | |
| fld st(2) | |
| fmul st, st | |
| fld st(2) | |
| fmul st, st | |
| faddp | |
| fsqrt | |
| fld1 | |
| fdivrp //1/Sqrt(rr) | |
| fld st(3) | |
| fchs | |
| fmul st, st(1) | |
| fld st(3) | |
| fmulp st(2), st //0,vo[1],vo[2],nx,ny,nz | |
| fldz | |
| @@2: | |
| fld st | |
| fmul qword [esi - 120] //x | |
| fld st(2) | |
| fmul qword [esi - 112] //y | |
| faddp | |
| fld st(3) | |
| fmul qword [esi - 104] //z | |
| faddp | |
| fmul qword [edi - 48] | |
| fstp qword [esp] | |
| fld st(5) | |
| fmul st, st(2) | |
| fld st(5) | |
| fmul st, st(4) | |
| fsubrp //r0,vo[0],vo[1],vo[2],nx,ny,nz | |
| fxch | |
| fmul st(6), st //vo[0],r0,vo[1],vo[2],nx,ny,nz*vo[0] | |
| fxch st(4) | |
| fmul st(3), st //nx,r0,vo[1],vo[2]*nx,vo[0],ny,nz*vo[0] | |
| fmulp st(2), st //r0, vo[1]*nx, vo[2]*nx, vo[0], ny, nz*vo[0] | |
| fxch st(4) //ny, vo[1]*nx, vo[2]*nx, vo[0], r0, nz*vo[0] | |
| fmulp st(3), st //vo[1]*nx, vo[2]*nx, vo[0]*ny, r0, nz*vo[0] | |
| fsubrp st(2), st //vo[2]*nx, vo[1]*nx-vo[0]*ny=r2, r0, nz*vo[0] | |
| fsubp st(3), st //r2, r0, nz*vo[0] - vo[2]*nx = r1 | |
| fmul qword [esi - 104] //z | |
| fxch | |
| fmul qword [esi - 120] //x | |
| faddp | |
| fxch | |
| fmul qword [esi - 112] //y | |
| faddp | |
| fmul qword [edi - 48] | |
| fstp qword [esp + 8] | |
| mov eax, esp | |
| mov ecx, esp | |
| call [esi + 268] //+356 - 88 = 268 | |
| // PMapFunc2: esi+356 // eax edx ecx | |
| //function GetMapPixelDirectXY(PVec3D: TPVec3D; MapNr: Integer): TVec3D; //Direct pixel coords 0..1 with tiling | |
| mov ecx, [edi - 56] | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fadd dword [edi - 60] | |
| fmul dword [edi - 64] | |
| fstp qword [esi + 128] | |
| add esp, 32 | |
| pop ecx | |
| @out: | |
| { | |
| //IFS formula, rounded Box with otrap coloring modes | |
| movupd xmm0, [esi - 120] //x,y | |
| movsd xmm1, [esi - 104] //z | |
| mulpd xmm0, [edi - 48] //*Scale | |
| mulsd xmm1, [edi - 48] | |
| addpd xmm0, [edi - 80] //+translate | |
| addsd xmm1, [edi - 64] | |
| xorpd xmm4, xmm4 | |
| cmp [edi - 100], 0 | |
| je @@1 | |
| movsd xmm5, [esi + 112] //accumulated scale | |
| mulsd xmm5, [edi - 48] | |
| movupd [esi - 120], xmm0 | |
| movsd [esi - 104], xmm1 | |
| movsd [esi + 112], xmm5 | |
| @@1: | |
| andpd xmm0, [edi] // abs=and [$7FFFFFFF,$7FFFFFFF] | |
| andpd xmm1, [edi] | |
| subpd xmm0, [edi - 32] | |
| subsd xmm1, [edi - 16] | |
| addpd xmm0, [edi - 96] | |
| addsd xmm1, [edi - 96] | |
| maxpd xmm0, xmm4 | |
| maxsd xmm1, xmm4 | |
| mulpd xmm0, xmm0 | |
| mulsd xmm1, xmm1 | |
| addsd xmm1, xmm0 | |
| shufpd xmm0, xmm0, 1 | |
| addsd xmm1, xmm0 | |
| sqrtsd xmm1, xmm1 | |
| subsd xmm1, [edi - 96] | |
| cmp [edi - 100], 0 | |
| jne @@2 | |
| divsd xmm1, [edi - 48] | |
| @@2: | |
| mov eax, [edi - 104] | |
| movsd [esi - 32], xmm1 //Rout: Double; //+56 | |
| and eax, 3 | |
| fld qword [esi + eax * 8 - 128] | |
| fmul dword [edi - 112] | |
| fadd dword [edi - 108] | |
| fstp qword [esi + 128] | |
| //IFS formula, cylinder with scale + radius + barrel + tip, SSE2 +OTrap +inside radius | |
| { movupd xmm0, [esi - 112] //y,z | |
| movsd xmm1, [esi - 120] //x | |
| mulpd xmm0, [edi - 48] //*Scale | |
| mulsd xmm1, [edi - 48] | |
| addpd xmm0, [edi - 64] //+translate | |
| addsd xmm1, [edi - 72] | |
| cmp [edi - 92], 0 | |
| je @@1 | |
| movsd xmm5, [esi + 112] //accumulated scale +200 | |
| mulsd xmm5, [edi - 48] | |
| movupd [esi - 112], xmm0 | |
| movsd [esi - 120], xmm1 | |
| movsd [esi + 112], xmm5 | |
| @@1: | |
| movapd xmm4, xmm1 | |
| mulpd xmm0, xmm0 | |
| andpd xmm1, [edi] //abs(x) | |
| pshufd xmm2, xmm0, $4E | |
| movapd xmm3, xmm1 | |
| subsd xmm1, [edi - 32] //-xhw | |
| addsd xmm0, xmm2 | |
| minsd xmm3, [edi - 32] | |
| mulsd xmm4, [edi - 88] //tip | |
| mulsd xmm3, xmm3 | |
| sqrtsd xmm0, xmm0 | |
| movsd xmm2, [edi - 112] //Inside radius | |
| mulsd xmm3, [edi - 80] //Barrel | |
| subsd xmm2, xmm0 | |
| subsd xmm0, [edi - 16] //Radius | |
| subsd xmm2, xmm3 | |
| addsd xmm0, xmm3 | |
| subsd xmm2, xmm4 | |
| addsd xmm0, xmm4 | |
| maxsd xmm0, xmm2 | |
| maxsd xmm0, xmm1 | |
| cmp [edi - 92], 0 | |
| jne @@2 | |
| divsd xmm0, [edi - 48] | |
| @@2: | |
| mov eax, [edi - 96] | |
| movsd [esi - 32], xmm0 //Rout: Double; //+56 | |
| and eax, 3 | |
| fld qword [esi + eax * 8 - 128] | |
| fmul dword [edi - 104] | |
| fadd dword [edi - 100] | |
| fstp qword [esi + 128] } | |
| { push ecx // Cylinder heightmap | |
| add esp, -32 // 'Map nr', 'Map channel', 'X off', 'Y off', 'Z off', | |
| // -12 -16 -20 -24 -28 | |
| // 'Length', 'Radius', 'Map height', 'Scale', 'X rot', 'Y rot', 'Z rot', | |
| // -32 -36 -40 -44 .. -76 | |
| // 'OTrap channel','OTrap offset', 'OTrap mul' | |
| fld qword [esi - 104] // -80 -84 -88 | |
| fsub dword [edi - 28] | |
| fld qword [esi - 112] | |
| fsub dword [edi - 24] | |
| fld qword [esi - 120] //x,y,z | |
| fsub dword [edi - 20] | |
| fld st(0) // rotate+scale x,y,z | |
| fmul dword [edi - 36-32] | |
| fld st(2) //y,cz,x,y,z | |
| fmul dword [edi - 40-32] | |
| faddp //cz+cy,x,y,z | |
| fld st(3) | |
| fmul dword [edi - 44-32] | |
| faddp //nz,x,y,z | |
| fld st(1) //x,nz,x,y,z | |
| fmul dword [edi - 12-32] | |
| fld st(3) //y,cx,nz,x,y,z | |
| fmul dword [edi - 16-32] | |
| faddp //cx+cy,nz,x,y,z | |
| fld st(4) | |
| fmul dword [edi - 20-32] | |
| faddp //nx,nz,x,y,z | |
| fxch st(2) //x,nz,nx,y,z | |
| fmul dword [edi - 24-32] | |
| fxch st(3) //y,nz,nx,cx,z | |
| fmul dword [edi - 28-32] | |
| faddp st(3), st(0) //nz,nx,cx+cy,z | |
| fxch st(3) //z,nx,cx+cy,nz | |
| fmul dword [edi - 32-32] | |
| faddp st(2), st(0) //nx,ny,nz | |
| fld st(1) | |
| fmul st, st | |
| fld st(1) | |
| fmul st, st | |
| faddp | |
| fsqrt | |
| fst dword [esp + 28] | |
| fsub dword [edi - 36] //Rdist,x,y,z | |
| fld st(3) | |
| fabs | |
| fsub dword [edi - 32] | |
| // fst dword [esp + 28] //Zdist | |
| fcom | |
| fnstsw ax | |
| shr ah, 1 | |
| jc @@0 | |
| fxch // top/bottom flat without map | |
| @@0: | |
| fstp st | |
| //speedup: map only if distance to surface is less than... | |
| fld st //r,r,x,y,z | |
| fabs | |
| fld dword [edi - 40] //Hmul,r',Rdist,x,y,z | |
| fabs | |
| fcompp //Rdist,x,y,z | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @@1 | |
| @@2: | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| fcompp | |
| fstp st | |
| add esp, 32 | |
| pop ecx | |
| ret | |
| @@1: | |
| //convert x,y to angle | |
| fstp dword [esp + 24] //radius | |
| fld st(1) //y,x,y,z | |
| fpatan | |
| fmul qword [edi] //0.5/Pi | |
| fstp qword [esp] //y,z | |
| fstp st //qword [esp + 8] | |
| //divide by pi*2 and radius | |
| fmul qword [edi] | |
| fdiv dword [edi - 36] //radius | |
| fstp qword [esp + 8] | |
| mov eax, esp | |
| mov edx, [edi - 12] | |
| mov ecx, esp | |
| call [esi + 268] //+356 - 88 = 268 | |
| // PMapFunc2: esi+356 // eax edx ecx | |
| //function GetMapPixelDirectXY(PVec3D: TPVec3D; MapNr: Integer): TVec3D; //Direct pixel coords 0..1 with tiling | |
| // PMapFunc: TLMSfunction;//+352 pointer to a map function: function GetMapPixelSphere(PVec3D: TPVec3D; MapNr: Integer): TVec3D; | |
| // PMapFunc2: TLMSfunction;//+356 pointer to 2nd map function, PVec3D: X,Y double used to get direct pixel in range 0..1 | |
| mov ecx, [edi - 16] | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fsub qword [edi - 8] | |
| fmul dword [edi - 40] //amplitude H scale | |
| fmul dword [esp + 28] //new, to decrease top/bottom inside | |
| fsubr dword [esp + 24] | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| mov ecx, [edi - 80] //Otrap color mapnr | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fadd dword [edi - 84] | |
| fmul dword [edi - 88] | |
| fstp qword [esi + 128] //dfree1 for otrap coloring | |
| add esp, 32 | |
| pop ecx | |
| { push ecx // sphere heightmap | |
| add esp, -32 // 'Map nr', 'Map channel', 'X off', 'Y off', 'Z off', | |
| // -12 -16 -20 -24 -28 | |
| // 'X scale', 'Y scale', 'H scale', 'Scale', 'X rot', 'Y rot', 'Z rot', | |
| // -32 -36 -40 -44 .. -76 | |
| // 'OTrap channel','OTrap offset', 'OTrap mul' | |
| fld qword [esi - 104] // -80 -84 -88 | |
| fsub dword [edi - 28] | |
| fld qword [esi - 112] | |
| fmul dword [edi - 36] | |
| fsub dword [edi - 24] | |
| fld qword [esi - 120] //x,y,z | |
| fmul dword [edi - 32] | |
| fsub dword [edi - 20] | |
| fld st(0) // rotate+scale x,y,z | |
| fmul dword [edi - 36-32] | |
| fld st(2) //y,cz,x,y,z | |
| fmul dword [edi - 40-32] | |
| faddp //cz+cy,x,y,z | |
| fld st(3) | |
| fmul dword [edi - 44-32] | |
| faddp //nz,x,y,z | |
| fld st(1) //x,nz,x,y,z | |
| fmul dword [edi - 12-32] | |
| fld st(3) //y,cx,nz,x,y,z | |
| fmul dword [edi - 16-32] | |
| faddp //cx+cy,nz,x,y,z | |
| fld st(4) | |
| fmul dword [edi - 20-32] | |
| faddp //nx,nz,x,y,z | |
| fxch st(2) //x,nz,nx,y,z | |
| fmul dword [edi - 24-32] | |
| fxch st(3) //y,nz,nx,cx,z | |
| fmul dword [edi - 28-32] | |
| faddp st(3), st(0) //nz,nx,cx+cy,z | |
| fxch st(3) //z,nx,cx+cy,nz | |
| fmul dword [edi - 32-32] | |
| faddp st(2), st(0) //nx,ny,nz | |
| fld st(2) | |
| fmul st, st | |
| fld st(2) | |
| fmul st, st | |
| faddp | |
| fld st(1) | |
| fmul st, st | |
| faddp | |
| fsqrt | |
| fld1 | |
| fsubp //Rdist,x,y,z | |
| //speedup: map only if distance to surface is less than... | |
| fld st //r,r,x,y,z | |
| fabs | |
| fld dword [edi - 40] //Hmul,r',Rdist,x,y,z | |
| fabs | |
| fcompp //Rdist,x,y,z | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @@1 | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| fcompp | |
| fstp st | |
| add esp, 32 | |
| pop ecx | |
| ret // | |
| @@1: | |
| fstp qword [esp + 24] | |
| fstp qword [esp] | |
| fstp qword [esp + 8] | |
| fstp qword [esp + 16] | |
| mov eax, esp | |
| mov edx, [edi - 12] | |
| mov ecx, esp | |
| call [esi + 264] //+356 - 88 = 268 | |
| // PMapFunc2: esi+356 // eax edx ecx | |
| //function GetMapPixelDirectXY(PVec3D: TPVec3D; MapNr: Integer): TVec3D; //Direct pixel coords 0..1 with tiling | |
| // PMapFunc: TLMSfunction;//+352 pointer to a map function: function GetMapPixelSphere(PVec3D: TPVec3D; MapNr: Integer): TVec3D; | |
| // PMapFunc2: TLMSfunction;//+356 pointer to 2nd map function, PVec3D: X,Y double used to get direct pixel in range 0..1 | |
| mov ecx, [edi - 16] | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fsub qword [edi - 8] | |
| fmul dword [edi - 40] //amplitude H scale | |
| fsubr qword [esp + 24] | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| mov ecx, [edi - 80] //Otrap color mapnr | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fadd dword [edi - 84] | |
| fmul dword [edi - 88] | |
| fstp qword [esi + 128] //dfree1 for otrap coloring | |
| add esp, 32 | |
| pop ecx} | |
| { push ecx // added OTrap coloring + speedup | |
| add esp, -32 // HeightMap [nr: integer; Xoffset, Yoffset, Hoffset, Xscale, Yscale, Hscale, Rotation: SingleRotmatrix, Color nr, Color OTrap Color offset, Color mult | |
| fld qword [esi - 104] // -12 -16 -20 -24 -28 -32 -36 -40..-72 -76 -80 -84 -88 | |
| fld qword [esi - 112] | |
| fld qword [esi - 120] //x,y,z | |
| fld st(0) // rotate+scale x,y,z | |
| fmul dword [edi - 36-28] | |
| fld st(2) //y,cz,x,y,z | |
| fmul dword [edi - 40-28] | |
| faddp //cz+cy,x,y,z | |
| fld st(3) | |
| fmul dword [edi - 44-28] | |
| faddp //nz,x,y,z | |
| fld st(1) //x,nz,x,y,z | |
| fmul dword [edi - 12-28] | |
| fld st(3) //y,cx,nz,x,y,z | |
| fmul dword [edi - 16-28] | |
| faddp //cx+cy,nz,x,y,z | |
| fld st(4) | |
| fmul dword [edi - 20-28] | |
| faddp //nx,nz,x,y,z | |
| fxch st(2) //x,nz,nx,y,z | |
| fmul dword [edi - 24-28] | |
| fxch st(3) //y,nz,nx,cx,z | |
| fmul dword [edi - 28-28] | |
| faddp st(3), st(0) //nz,nx,cx+cy,z | |
| fxch st(3) //z,nx,cx+cy,nz | |
| fmul dword [edi - 32-28] | |
| faddp st(2), st(0) //nx,ny,nz | |
| fld st(2) //speedup: map only if distance to surface is less than... | |
| fadd dword [edi - 24] //z+off,x,y,z | |
| fld dword [edi - 36] //Hmul,z',x,y,z | |
| fmul qword [edi - 8] | |
| fsubp | |
| fabs | |
| fld dword [edi - 36] | |
| fabs | |
| fadd qword [esi - 136] //It3Dex.Rold, absolute DEstop add! | |
| fcompp | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @@1 | |
| fcompp //nz | |
| fld qword [edi - 8] //0.5 | |
| fmul dword [edi - 36] //amplitude H scale | |
| fsub dword [edi - 24] //H offset | |
| fsubrp //-z | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| add esp, 32 | |
| pop ecx | |
| ret | |
| @@1: | |
| fmul dword [edi - 28] | |
| fsub dword [edi - 16] // offsets after rot+scale! todo: only check map if Abs(distsphere) < mapscale*2+Abs(offset) | |
| fstp qword [esp] | |
| fmul dword [edi - 32] | |
| fsub dword [edi - 20] | |
| fstp qword [esp + 8] | |
| fstp qword [esp + 24] | |
| mov eax, esp | |
| mov edx, [edi - 12] | |
| mov ecx, esp | |
| call [esi + 268] //+356 - 88 = 268 | |
| // PMapFunc2: esi+356 // eax edx ecx | |
| //function GetMapPixelDirectXY(PVec3D: TPVec3D; MapNr: Integer): TVec3D; //Direct pixel coords 0..1 with tiling | |
| mov ecx, [edi - 76] | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fmul dword [edi - 36] //amplitude H scale | |
| fsub dword [edi - 24] //H offset | |
| fsub qword [esp + 24] //-z | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| mov ecx, [edi - 80] //Otrap color mapnr | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fadd dword [edi - 84] | |
| fmul dword [edi - 88] | |
| fstp qword [esi + 128] //dfree1 for otrap coloring | |
| add esp, 32 | |
| pop ecx } | |
| { push ecx // sphere heightmap | |
| add esp, -32 // HeightMap[nr: integer; Col nr, Xoffset, Yoff, Zoff, Xscale, Yscale, Hscale, Rotn: SingleM, Col nr, Colo | |
| fld qword [esi - 104] // -12 -16 -20 -24 -28 -32 -36 -40 -44..-76 -80 -84 | |
| fsub dword [edi - 28] | |
| fld qword [esi - 112] | |
| fsub dword [edi - 24] | |
| fld qword [esi - 120] //x,y,z | |
| fsub dword [edi - 20] | |
| fld st(0) // rotate+scale x,y,z | |
| fmul dword [edi - 36-32] | |
| fld st(2) //y,cz,x,y,z | |
| fmul dword [edi - 40-32] | |
| faddp //cz+cy,x,y,z | |
| fld st(3) | |
| fmul dword [edi - 44-32] | |
| faddp //nz,x,y,z | |
| fld st(1) //x,nz,x,y,z | |
| fmul dword [edi - 12-32] | |
| fld st(3) //y,cx,nz,x,y,z | |
| fmul dword [edi - 16-32] | |
| faddp //cx+cy,nz,x,y,z | |
| fld st(4) | |
| fmul dword [edi - 20-32] | |
| faddp //nx,nz,x,y,z | |
| fmul dword [edi - 32] | |
| fxch st(2) //x,nz,nx,y,z | |
| fmul dword [edi - 24-32] | |
| fxch st(3) //y,nz,nx,cx,z | |
| fmul dword [edi - 28-32] | |
| faddp st(3), st(0) //nz,nx,cx+cy,z | |
| fxch st(3) //z,nx,cx+cy,nz | |
| fmul dword [edi - 32-32] | |
| faddp st(2), st(0) //nx,ny,nz | |
| fxch | |
| fmul dword [edi - 36] | |
| fxch | |
| fld st(2) | |
| fmul st, st | |
| fld st(2) | |
| fmul st, st | |
| faddp | |
| fld st(1) | |
| fmul st, st | |
| faddp | |
| fsqrt | |
| fld1 | |
| fsubp //Rdist,x,y,z | |
| //speedup: map only if distance to surface is less than... | |
| fld st //r,r,x,y,z | |
| fabs | |
| fld dword [edi - 40] //Hmul,r',Rdist,x,y,z | |
| fabs | |
| fadd qword [esi - 136] //abs destop | |
| fcompp //Rdist,x,y,z | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @@1 | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| fcompp | |
| fstp st | |
| add esp, 32 | |
| pop ecx | |
| ret // | |
| @@1: | |
| fstp qword [esp + 24] | |
| fstp qword [esp] | |
| fstp qword [esp + 8] | |
| fstp qword [esp + 16] | |
| mov eax, esp | |
| mov edx, [edi - 12] | |
| mov ecx, esp | |
| call [esi + 264] //+356 - 88 = 268 | |
| // PMapFunc2: esi+356 // eax edx ecx | |
| //function GetMapPixelDirectXY(PVec3D: TPVec3D; MapNr: Integer): TVec3D; //Direct pixel coords 0..1 with tiling | |
| // PMapFunc: TLMSfunction;//+352 pointer to a map function: function GetMapPixelSphere(PVec3D: TPVec3D; MapNr: Integer): TVec3D; | |
| // PMapFunc2: TLMSfunction;//+356 pointer to 2nd map function, PVec3D: X,Y double used to get direct pixel in range 0..1 | |
| mov ecx, [edi - 16] | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fsub qword [edi - 8] | |
| fmul dword [edi - 40] //amplitude H scale | |
| fsubr qword [esp + 24] | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| mov ecx, [edi - 80] //Otrap color mapnr | |
| and ecx, 3 | |
| fld qword [esp + ecx * 8] //col of map | |
| fadd dword [edi - 84] | |
| fmul dword [edi - 88] | |
| fstp qword [esi + 128] //dfree1 for otrap coloring | |
| add esp, 32 | |
| pop ecx //} | |
| { fld st(2) //speedup: map only if distance to surface is less than... | |
| fadd dword [edi - 24] //z+off,x,y,z | |
| fld dword [edi - 36] //Hmul,z',x,y,z | |
| fmul qword [edi - 8] | |
| fsubp | |
| fabs | |
| fld dword [edi - 36] | |
| fabs | |
| fadd qword [esi - 136] //It3Dex.Rold, absolute DEstop add! | |
| fcompp | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @@1 | |
| fcompp //nz | |
| fld qword [edi - 8] //0.5 | |
| fmul dword [edi - 36] //amplitude H scale | |
| fsub dword [edi - 24] //H offset | |
| fsubrp //-z | |
| fstp qword [esi - 32] //Rout: Double; +56 is distance | |
| add esp, 32 | |
| pop ecx | |
| ret | |
| @@1: | |
| //IFS formula, sine-water (wave) with Roff | |
| add esp, -32 | |
| movupd xmm0, [esi - 120] //x,y | |
| movsd xmm1, [esi - 104] //z | |
| mulpd xmm0, [edi - 32] //*Scale | |
| mulsd xmm1, [edi - 32] | |
| addpd xmm0, [edi - 64] //+translate | |
| addsd xmm1, [edi - 48] | |
| cmp dword [edi - 76], 0 //apply add+scale | |
| je @@1 | |
| movsd xmm5, [esi + 112] //accumulated scale +200 | |
| mulsd xmm5, [edi - 32] | |
| movupd [esi - 120], xmm0 | |
| movsd [esi - 104], xmm1 | |
| movsd [esi + 112], xmm5 | |
| @@1: | |
| movupd [esp], xmm0 | |
| movsd [esp + 16], xmm1 | |
| mov edx, [edi - 84] //flipXZ | |
| and edx, 1 | |
| fld qword [edi - 72] //Amplitude | |
| shl edx, 4 | |
| fstp qword [esp + 24] | |
| fld qword [esp + edx] | |
| cmp dword [edi - 80], 0 //Circular | |
| je @@3 | |
| fmul st(0), st(0) | |
| fld qword [esp + 8] | |
| fmul st(0), st(0) | |
| faddp | |
| fsqrt | |
| fmul qword [edi - 16] //frequency | |
| cmp dword [edi - 88], 0 //amplitude on r | |
| je @@5 | |
| fld1 | |
| fadd st, st(1) | |
| fdivr qword [esp + 24] | |
| fstp qword [esp + 24] | |
| @@5: | |
| fcos | |
| jmp @@4 | |
| @@3: | |
| fmul qword [edi - 16] //frequency | |
| fcos | |
| fld qword [esp + 8] | |
| fmul qword [edi - 16] //frequency | |
| fcos | |
| faddp | |
| @@4: | |
| neg edx | |
| fmul qword [esp + 24] //amplitude (/(R+1) | |
| fsub qword [esp + edx + 16] | |
| cmp [edi - 76], 0 | |
| jne @@2 | |
| fdiv qword [edi - 32] | |
| @@2: | |
| fstp qword [esi - 32] //Rout: Double; //+56 | |
| add esp, 32 //} | |
| //IFS formula, Box with trapez [Z size, Y size, X size, Scale, Add Z, Add Y, Add X, trapez, twist, apply add+scale | |
| { movupd xmm0, [esi - 120] //x,y d , d , d ,2doubles, 2d, d , d , d , s , integer | |
| movsd xmm1, [esi - 104] //z | |
| mulpd xmm0, [edi - 48] //*Scale | |
| mulsd xmm1, [edi - 48] | |
| addpd xmm0, [edi - 80] //+translate | |
| addsd xmm1, [edi - 64] | |
| cmp [edi - 96], 0 | |
| je @@1 | |
| movsd xmm5, [esi + 112] //accumulated scale | |
| mulsd xmm5, [edi - 48] | |
| movupd [esi - 120], xmm0 | |
| movsd [esi - 104], xmm1 | |
| movsd [esi + 112], xmm5 | |
| @@1: | |
| cmp [edi - 92], 0 | |
| je @@3 | |
| add esp, -24 //twist | |
| movupd [esp], xmm0 | |
| movsd [esp + 16], xmm1 | |
| fld dword [edi - 92] | |
| fmul qword [esp + 16] //z | |
| fsincos //cos, sin | |
| fld qword [esp + 8] | |
| fld qword [esp] //x,y,c,s | |
| fld st(3) | |
| fmul st, st(1) //s*x,x,y,c,s | |
| fld st(2) | |
| fmul st, st(4) | |
| faddp | |
| fstp qword [esp] //x,y,c,s | |
| fmulp st(2), st //y,c*x,s | |
| fmulp st(2), st //c*x, s*y | |
| fsubrp | |
| fstp qword [esp + 8] | |
| movupd xmm0, [esp] | |
| add esp, 24 | |
| @@3: | |
| // pshufd xmm3, xmm0, $4E //y to xmm3 | |
| movsd xmm3, xmm1 | |
| andpd xmm0, [edi] // abs=and [$7FFFFFFF,$7FFFFFFF] | |
| andpd xmm1, [edi] | |
| mulsd xmm3, [edi - 88] //trapez | |
| subpd xmm0, [edi - 32] //x,y size | |
| subsd xmm1, [edi - 16] //z size | |
| subsd xmm0, xmm3 //trapez todo: downscale DE if in trapez region... | |
| maxsd xmm1, xmm0 | |
| UNPCKHPD xmm0, xmm0 | |
| maxsd xmm1, xmm0 | |
| cmp [edi - 96], 0 | |
| jne @@2 | |
| divsd xmm1, [edi - 48] | |
| @@2: | |
| mov eax, [edi - 100] | |
| movsd [esi - 32], xmm1 //Rout: Double; //+56 | |
| and eax, 3 | |
| fld qword [esi + eax * 8 - 128] | |
| fmul dword [edi - 108] | |
| fadd dword [edi - 104] | |
| fstp qword [esi + 128] } | |
| //IFS formula, sphere with scale + radius + xyz scale, SSE2 + new otrap option | |
| {.Version = 6 | |
| .DEoption = 20 | |
| .SSE2 | |
| .Double Radius = 1 | |
| .2Doubles Scale = 2 | |
| .2Doubles Z add = 0 | |
| .Double Y add = 0 | |
| .2Doubles X add = 3 | |
| .DSqrReci Z size = 1 | |
| .DSqrReci Y size = 1 | |
| .DSqrReci X size = 1 | |
| .Integer apply scale+add = 1 -100 | |
| .Integer OTrap option (0..3) = 0 -104 | |
| .Single OTrap offset = 1 -108 | |
| .Single OTrap scale = 1 -112 | |
| .Double Inside radius = 0 } //-120 new: DE = Max(DE, DEinside = Inside_radius - R) | |
| { movupd xmm0, [esi - 120] //x,y | |
| movsd xmm1, [esi - 104] //z | |
| mulpd xmm0, [edi - 32] //*Scale | |
| mulsd xmm1, [edi - 32] | |
| addpd xmm0, [edi - 64] //+translate | |
| addsd xmm1, [edi - 48] | |
| cmp [edi - 100], 0 | |
| je @@1 | |
| movsd xmm5, [esi + 112] //accumulated scale +200 | |
| mulsd xmm5, [edi - 32] | |
| movupd [esi - 120], xmm0 | |
| movsd [esi - 104], xmm1 | |
| movsd [esi + 112], xmm5 | |
| @@1: | |
| movapd xmm3, [edi - 96] | |
| movsd xmm4, [edi - 80] | |
| mulpd xmm0, xmm3 //y,x size | |
| mulsd xmm1, xmm4 | |
| mulpd xmm0, xmm0 | |
| mulsd xmm1, xmm1 | |
| addsd xmm1, xmm0 // zz'+xx' | |
| unpckhpd xmm0, xmm0 | |
| addsd xmm1, xmm0 | |
| sqrtsd xmm1, xmm1 // |vec*scale| | |
| movsd xmm2, [edi - 120] //inside radius | |
| subsd xmm2, xmm1 //DE' insideR | |
| subsd xmm1, [edi - 16] //DE' outsideR | |
| maxsd xmm1, xmm2 | |
| andpd xmm3, [edi] // / min(scales) (here max of reciscales) | |
| andpd xmm4, [edi] //abs | |
| maxsd xmm4, xmm3 | |
| unpckhpd xmm3, xmm3 | |
| maxsd xmm4, xmm3 | |
| divsd xmm1, xmm4 | |
| { andpd xmm3, [edi] | |
| andpd xmm4, [edi] | |
| movapd xmm5, xmm3 | |
| movsd xmm6, xmm4 | |
| addsd xmm6, xmm5 | |
| shufpd xmm5, xmm5, 1 | |
| addsd xmm6, xmm5 | |
| addsd xmm6, [edi + 24] | |
| // mulpd xmm3, xmm3 | |
| // mulsd xmm4, xmm4 | |
| mulpd xmm3, [edi - 96] //old calc, DE is stretched like size | |
| mulsd xmm4, [edi - 80] //y,x size DSqrReci ! -> D+reciD, multiply before sqr | |
| // mulpd xmm3, xmm3 | |
| // mulsd xmm4, xmm4 | |
| andpd xmm3, [edi] | |
| andpd xmm4, [edi] //abs | |
| addsd xmm4, xmm3 | |
| shufpd xmm3, xmm3, 1 | |
| addsd xmm4, xmm3 | |
| sqrtsd xmm4, xmm4 | |
| divsd xmm4, xmm1 | |
| divsd xmm2, xmm4 //} | |
| { movapd xmm3, [edi - 96] //y,x size | |
| movsd xmm4, [edi - 80] //z size | |
| movsd xmm2, [edi - 16] //radius | |
| movsd xmm7, [edi - 120] //inside radius | |
| movapd xmm5, xmm3 | |
| movsd xmm6, xmm4 | |
| shufpd xmm2, xmm2, 1 | |
| shufpd xmm7, xmm7, 1 | |
| mulpd xmm3, xmm2 | |
| mulsd xmm4, xmm2 | |
| mulpd xmm5, xmm7 | |
| mulsd xmm6, xmm7 | |
| andpd xmm0, [edi] //and $7FFFF.. abs() | |
| andpd xmm1, [edi] | |
| movapd xmm2, xmm0 | |
| movsd xmm7, xmm1 | |
| subpd xmm0, xmm3 | |
| subsd xmm1, xmm4 | |
| subpd xmm2, xmm5 | |
| subsd xmm7, xmm6 | |
| mulpd xmm0, xmm0 | |
| mulsd xmm1, xmm1 | |
| mulpd xmm2, xmm2 | |
| mulsd xmm7, xmm7 | |
| addsd xmm1, xmm0 | |
| addsd xmm7, xmm2 | |
| shufpd xmm0, xmm0, 1 //unpckhpd ? | |
| shufpd xmm2, xmm2, 1 | |
| addsd xmm1, xmm0 | |
| addsd xmm7, xmm2 | |
| sqrtsd xmm1, xmm1 //outside DE make sqrtpd... | |
| sqrtsd xmm7, xmm7 //inside DE | |
| xorpd xmm0, xmm0 | |
| subsd xmm0, xmm7 | |
| maxsd xmm1, xmm0 } | |
| { cmp [edi - 100], 0 | |
| jne @@2 | |
| divsd xmm1, [edi - 32] | |
| @@2: | |
| mov eax, [edi - 104] | |
| movsd [esi - 32], xmm1 //Rout: Double; //+56 | |
| and eax, 3 | |
| fld qword [esi + eax * 8 - 128] | |
| fmul dword [edi - 112] | |
| fadd dword [edi - 108] | |
| fstp qword [esi + 128] // } | |
| end; | |
| procedure ipow2(var x, y: Double); //x:=x*x-y*y y:=2xy | |
| asm | |
| fld qword [eax] | |
| fld qword [edx] | |
| fld st(0) //y,y,x | |
| fmul st(0), st(2) //y*x,y,x | |
| fadd st(0), st(0) | |
| fstp qword [edx] | |
| fmul st(0), st(0) //y*y,x | |
| fxch | |
| fmul st(0), st(0) //x*x,y*y | |
| fsubrp st(1), st(0) | |
| fstp qword [eax] | |
| end; | |
| procedure ComplexSqr(var xy: TComplex); //x:=x*x-y*y y:=2xy | |
| asm | |
| fld qword [eax] | |
| fld qword [eax + 8] //y,x | |
| fld st(0) //y,y,x | |
| fmul st(0), st(2) //y*x,y,x | |
| fadd st(0), st(0) | |
| fstp qword [eax + 8] | |
| fmul st(0), st(0) //y*y,x | |
| fxch | |
| fmul st(0), st(0) //x*x,y*y | |
| fsubrp st(1), st(0) | |
| fstp qword [eax] | |
| end; | |
| function ComplexMul(c1, c2: TComplex): TComplex; //r[0] := x1*x2-y1*y2 r[1]:=x1*y2+x2*y1 | |
| begin | |
| Result[0] := c1[0] * c2[0] - c1[1] * c2[1]; | |
| Result[1] := c1[0] * c2[1] + c1[1] * c2[0]; | |
| end; | |
| function ComplexSqr2(c1: TComplex): TComplex; | |
| begin | |
| Result[0] := c1[0] * c1[0] - c1[1] * c1[1]; | |
| Result[1] := 2 * c1[0] * c1[1]; | |
| end; | |
| function CConj(c1: TComplex): TComplex; | |
| begin | |
| Result[0] := c1[0]; | |
| Result[1] := -c1[1]; | |
| end; | |
| function ComplexPower(cB, cE: TComplex): TComplex; | |
| var c1, c2: TComplex; | |
| s, c, d: Double; | |
| begin | |
| c1[0] := 0.5 * Ln(Sqr(cB[0]) + Sqr(cB[1])); | |
| c1[1] := ArcTan2(cB[1], cB[0]); | |
| c2[0] := cE[0] * c1[0] - cE[1] * c1[1]; | |
| c2[1] := cE[0] * c1[1] + cE[1] * c1[0]; | |
| d := Exp(c2[0]); | |
| SinCosD(c2[1], s, c); | |
| Result[0] := c * d; | |
| Result[1] := s * d; | |
| end; | |
| function ComplexSub(c1, c2: TComplex): TComplex; | |
| begin | |
| Result[0] := c1[0] - c2[0]; | |
| Result[1] := c1[1] - c2[1]; | |
| end; | |
| function ComplexAdd(c1, c2: TComplex): TComplex; | |
| begin | |
| Result[0] := c1[0] + c2[0]; | |
| Result[1] := c1[1] + c2[1]; | |
| end; | |
| function ComplexScale(c1: TComplex; d: Double): TComplex; | |
| begin | |
| Result[0] := c1[0] * d; | |
| Result[1] := c1[1] * d; | |
| end; | |
| procedure QuatRotate(v: TPVec3D; q: TQuaternion); | |
| var //w: TVec3D; | |
| w, x, y, z: Double; | |
| begin | |
| { w := v; | |
| v[0] := w[0] * (1 - 2 * (Sqr(q[1]) - Sqr(q[2]))) + w[1] * () + w[2] * (); | |
| v[1] := w[0] * () + w[1] * () + w[2] * (); | |
| v[2] := w[0] * () + w[1] * () + w[2] * (); } | |
| w := -q[0] * v[0] - q[1] * v[1] - q[2] * v[2]; | |
| x := q[3] * v[0] + q[1] * v[2] - q[2] * v[1]; | |
| y := q[3] * v[1] - q[0] * v[2] + q[2] * v[0]; | |
| z := q[3] * v[2] + q[0] * v[1] - q[1] * v[0]; | |
| v[0] := (w * -q[0] + x * q[3] - y * q[2] + z * q[1]); | |
| v[1] := (w * -q[1] + x * q[2] + y * q[3] - z * q[0]); | |
| v[2] := (w * -q[2] - x * q[1] + y * q[0] + z * q[3]); | |
| end; | |
| procedure QuatMultiply(q1, q2: TPQuaternion); | |
| var qt: TQuaternion; | |
| begin | |
| qt := q1^; | |
| q1[3] := (qt[3]*q2[3] - qt[0]*q2[0] - qt[1]*q2[1] - qt[2]*q2[2]); | |
| q1[0] := (qt[3]*q2[0] + qt[0]*q2[3] + qt[1]*q2[2] - qt[2]*q2[1]); | |
| q1[1] := (qt[3]*q2[1] - qt[0]*q2[2] + qt[1]*q2[3] + qt[2]*q2[0]); | |
| q1[2] := (qt[3]*q2[2] + qt[0]*q2[1] - qt[1]*q2[0] + qt[2]*q2[3]); | |
| end; | |
| function Heart(x, y, z: Double): Double; | |
| var xx, yy, zz, a: Double; | |
| begin | |
| xx := x*x; | |
| yy := y*y; | |
| zz := z*z; | |
| a := 2*xx + yy + zz - 1; | |
| a := a*a*a; | |
| zz := zz * z; | |
| Result := a - 0.1 * xx * zz - yy * zz; | |
| end; | |
| procedure TestHybrid(var x, y, z, w: Double; PIteration3D: TPIteration3D); //available if 't' pressed on intern formula | |
| const piM05: Double = 0.5 * Pi; | |
| d0148: Double = 0.148148148148148; | |
| {asm | |
| push esi // SinY with index, preoffset, prescale, scale, offset | |
| push edi | |
| mov esi, [ebp + 8] | |
| mov edi, [esi + 48] | |
| mov esi, [edi - 12] | |
| and esi, 3 | |
| fld qword [eax + esi * 8] | |
| fsub dword [edi - 16] | |
| fmul dword [edi - 20] | |
| fsin | |
| fmul dword [edi - 24] | |
| fadd dword [edi - 28] | |
| fstp qword [eax + esi * 8] | |
| pop edi | |
| pop esi } | |
| asm | |
| { push esi // kalisets | |
| push edi | |
| mov esi, [ebp + 8] | |
| mov edi, [esi + 48] | |
| fld qword [eax] | |
| fabs | |
| fld qword [edx] | |
| fabs | |
| fld qword [ecx] | |
| fabs | |
| fld st(2) | |
| fmul st, st | |
| fld st(2) | |
| fmul st, st | |
| faddp | |
| fld st(1) | |
| fmul st, st | |
| faddp | |
| fadd qword [edi - 24] | |
| fld qword [edi - 16] | |
| fdivrp | |
| fmul st(3), st | |
| fmul st(2), st | |
| fmul st(1), st | |
| fmul qword [ecx + 8] | |
| fstp qword [ecx + 8] | |
| fadd qword [esi + $28] | |
| fstp qword [ecx] | |
| fadd qword [esi + $20] | |
| fstp qword [edx] | |
| fadd qword [esi + $18] | |
| fstp qword [eax] | |
| pop edi | |
| pop esi } | |
| push esi // PlusSinApp fast V1+Sin(V2) with index, preoffset, prescale, scale, offset | |
| push edi | |
| push eax | |
| push edx | |
| mov esi, [ebp + 8] | |
| mov edi, [esi + 48] | |
| mov esi, [edi - 16] | |
| and esi, 3 | |
| fld qword [eax + esi * 8] | |
| xor edx, edx | |
| fsub dword [edi - 20] | |
| fmul dword [edi - 24] | |
| fmul qword [edi] // Pi05d // | |
| fld st | |
| fsub qword [edi - 8] | |
| frndint | |
| fsubp | |
| fadd st, st | |
| fld1 | |
| fcomp | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @1 | |
| fld1 | |
| fadd st, st | |
| fsubrp | |
| xor edx, $80000000 | |
| @1: fldpi | |
| fmulp | |
| fcom qword [edi + 8] //piM05 // | |
| fnstsw ax | |
| shr ah, 1 | |
| jc @2 | |
| fldpi | |
| fsubp | |
| xor edx, $80000000 | |
| @2: fld st | |
| fmul st, st | |
| fmul st, st(1) | |
| fmul qword [edi + 16] //d0148 // | |
| fsubp | |
| test edx, $80000000 | |
| jns @3 | |
| fchs | |
| @3: | |
| pop edx | |
| pop eax | |
| mov esi, [edi - 12] | |
| fmul dword [edi - 28] | |
| and esi, 3 | |
| fadd dword [edi - 32] | |
| fadd qword [eax + esi * 8] | |
| fstp qword [eax + esi * 8] | |
| pop edi | |
| pop esi | |
| { testhybridOptionsStrings: array[0..14] of String = ('Scale','Min R/IR','Fold','RotationX','RotationY','RotationZ', | |
| -$10 -$18-$20 -$28 -$2C..-4C | |
| 'Inv xC','Inv yC','Inv zC','Inv Radius','FoldX, XY angle','FoldX, XZ angle','FoldY, XY angle','FoldY, YZ angle', | |
| -$54 -$5C -$64 -$6C -$74 -$7C -$84 -$8C -$94 -$9C -$A4 -$AC | |
| 'Abs XYZ switches'); } | |
| //-$B0 | |
| { push esi | |
| push ebx | |
| mov esi, [ebp+$08] | |
| mov ebx,eax | |
| mov esi, [esi+$30] | |
| add esp, -$20 | |
| add esi, -$40 | |
| fld qword ptr [esi-$28+$40] //fold | |
| fld qword ptr [ebx] //x,f #2 | |
| fmul qword ptr [esi-$0000008c+$40] //x',f | |
| fld qword ptr [ecx] //z,x',f #3 | |
| fmul qword ptr [esi-$00000084+$40] //z',x',f | |
| fsubp //zx,f | |
| fld qword ptr [ebx] //x,zx,f #3 | |
| fmul qword ptr [esi-$00000084+$40] | |
| fld qword ptr [ecx] //z,x',zx,f #4 | |
| fmul qword ptr [esi-$0000008c+$40] | |
| faddp //zx2,zx,f #3 | |
| fstp qword ptr [esp+$08] //zx,f #2 esp8=zx2 | |
| fld st //#3 | |
| fmul qword ptr [esi-$7c+$40] //zx',zx,f | |
| fld qword ptr [edx] //#4 | |
| fmul qword ptr [esi-$74+$40] //y',zx',zx,f | |
| fsubp //yzx,zx,f #3 | |
| fxch //zx,yzx,f | |
| fmul qword ptr [esi-$74+$40] | |
| fld qword ptr [edx] //#4 | |
| fmul qword ptr [esi-$7c+$40] //y',zx',yzx,f | |
| faddp //yzx2,yzx,f #3 | |
| fxch | |
| fld st //yzx,yzx,yzx2,f #4 | |
| fsub st, st(3) //yzx-f,yzx,yzx2,f | |
| fabs | |
| fadd st, st(1) //abs(yzx-f)+yzx,yzx,yzx2,f | |
| fxch //yzx,abs(yzx-f)+yzx,yzx2,f | |
| fadd st, st(3) | |
| fabs //abs(yzx+f),abs(yzx-f)+yzx,yzx2,f | |
| fsubrp //abs(yzx+f)-abs(yzx-f)+yzx,yzx2,f | |
| fld st //ayzxf,ayzxf,yzx2,f #4 | |
| fmul qword ptr [esi-$7c+$40] //ayzxf',ayzxf,yzx2,f | |
| fld st(2) //yzx2,ayzxf',ayzxf,yzx2,f #5 | |
| fmul qword ptr [esi-$74+$40] | |
| fsubp //ayzxf2,ayzxf,yzx2,f #4 | |
| fld st //ayzxf2,ayzxf2,ayzxf,yzx2,f #5 | |
| fmul qword ptr [esi-$0000008c+$40] //ayzxf2',ayzxf2,ayzxf,yzx2,f #5 | |
| fld qword ptr [esp+$08] //zx2,ayzxf2',ayzxf2,ayzxf,yzx2,f #6 | |
| fmul qword ptr [esi-$00000084+$40] //zx2',ayzxf2',ayzxf2,ayzxf,yzx2,f | |
| fsubp //kk,ayzxf2,ayzxf,yzx2,f #5 | |
| fxch st(2) //ayzxf,ayzxf2,kk,yzx2,f | |
| fmul qword ptr [esi-$74+$40] //ayzxf',ayzxf2,kk,yzx2,f | |
| fxch //ayzxf2,ayzxf',kk,yzx2,f | |
| fxch st(3) //yzx2,ayzxf',kk,ayzxf2,f #5 | |
| fmul qword ptr [esi-$7c+$40] //yzx2',ayzxf',kk,ayzxf2,f | |
| faddp //ya3,kk,ayzxf2,f #4 | |
| fxch st(2) //ayzxf2,kk,ya3,f | |
| fmul qword ptr [esi-$00000084+$40] //ayzxf2',kk,ya3,f | |
| fld qword ptr [esp+$08] //zx2,ayzxf2',kk,ya3,f #5 | |
| fmul qword ptr [esi-$0000008c+$40] //zx2',ayzxf2',kk,ya3,f | |
| faddp //za3,kk,ya3,f #4 | |
| fld st(2) //ya3,za3,kk,ya3,f #5 | |
| fmul qword ptr [esi-$000000ac+$40] //ya3',za3,kk,ya3,f | |
| fld st(1) //za3,ya3',za3,kk,ya3,f #6 | |
| fmul qword ptr [esi-$000000a4+$40] //za3',ya3',za3,kk,ya3,f | |
| fsubp //yz4,za3,kk,ya3,f #5 | |
| fxch //za3,yz4,kk,ya3,f | |
| fmul qword ptr [esi-$000000ac+$40] //za3',yz4,kk,ya3,f | |
| fxch st(3) //ya3,yz4,kk,za3',f #5 | |
| fmul qword ptr [esi-$000000a4+$40] //ya3',yz4,kk,za3',f | |
| faddp st(3), st //yz4,kk,jj,f #4 | |
| // fxch st(2) //jj,kk,yz4,f | |
| // fstp qword ptr [esp+$08] //kk,yz4,f #3 esp8=jj | |
| // fxch //yz4,kk,f | |
| fld st //yz4,yz4,kk,jj,f #4 | |
| fmul qword ptr [esi-$9c+$40] //yz4',yz4,kk,jj,f | |
| fld st(2) //kk,yz4',yz4,kk,jj,f #5 | |
| fmul qword ptr [esi-$94+$40] //kk',yz4',yz4,kk,jj,f | |
| fsubp //ll,yz4,kk,jj,f #4 | |
| fxch st(2) //kk,yz4,ll,jj,f | |
| fmul qword ptr [esi-$9c+$40] //kk',yz4,ll,jj,f | |
| fxch //yz4,kk',ll,jj,f | |
| fmul qword ptr [esi-$94+$40] //yz4',kk',ll,jj,f | |
| faddp //mm,ll,jj,f #3 | |
| fxch //ll,mm,jj,f | |
| fld st //ll,ll,mm,jj,f #4 | |
| fsub st, st(4) //ll',ll,mm,jj,f | |
| fabs | |
| fadd st, st(1) //ll'',ll,mm,jj,f | |
| fxch //ll,ll'',mm,jj,f | |
| fadd st, st(4) | |
| fabs | |
| fsubrp //nn,mm,jj,f | |
| fld st //nn,nn,mm,jj,f | |
| fmul qword ptr [esi-$0000009c+$40] //nn',nn,mm,jj,f | |
| fld st(2) //mm,nn',nn,mm,jj,f #5 | |
| fmul qword ptr [esi-$00000094+$40] //mm',nn',nn,mm,jj,f | |
| fsubp //oo,nn,mm,jj,f #4 | |
| fld st //oo,oo,nn,mm,jj,f #5 | |
| fmul qword ptr [esi-$000000ac+$40] //oo',oo,nn,mm,jj,f | |
| fld st(4)//qword ptr [esp+$08] //jj,oo',oo,nn,mm,jj,f #6 #7 | |
| fmul qword ptr [esi-$000000a4+$40] //jj',oo',oo,nn,mm,jj,f | |
| fsubp //jo,oo,nn,mm,jj,f #5 | |
| fld qword ptr [esi-$00000094+$40] //cf,jo,oo,nn,mm,jj,f | |
| fmulp st(3), st //jo,oo,nn',mm,jj,f #5 *nn | |
| // fxch st(2) //nn',oo,jo,mm,jj,f | |
| fxch st(3) //mm,oo,nn',jo,jj,f | |
| fmul qword ptr [esi-$0000009c+$40] //mm',oo,nn',jo,jj,f | |
| faddp st(2), st //oo,mn2,jo,jj,f #4 | |
| fmul qword ptr [esi-$000000a4+$40] //oo',mn2,jo,jj,f | |
| fld qword ptr [esi-$000000ac+$40] //cf2,oo',mn2,jo,jj,f | |
| fmulp st(4), st //oo',mn2,jo,jj',f | |
| faddp st(3), st //mn2,jo,jo2,f | |
| // fxch //mn2,jo,jo2,f | |
| fxch st(2) //jo2,jo,mn2,f | |
| fld st //jo2,jo2,jo,mn2,f #5 | |
| fsub st, st(4) // | |
| fabs // | |
| fadd st, st(1) // | |
| fxch | |
| fadd st, st(4) | |
| fabs | |
| fsubrp //jj,jo,mn2,f #4 | |
| mov eax, [esi-$b0+$40] | |
| nop | |
| test eax, $04 | |
| jz @4e9 | |
| fabs | |
| @4E9: test eax, $02 | |
| jz @4fa | |
| fxch st(1) | |
| fabs | |
| fxch st(1) | |
| @4FA: test eax, $01 | |
| jz @50b | |
| fxch st(2) | |
| fabs | |
| fxch st(2) | |
| @50B: fadd qword ptr [esi-$64+$40] | |
| fld qword ptr [esi-$5c+$40] //#5 | |
| faddp st(2), st //#4 | |
| fld qword ptr [esi-$54+$40] //#5 | |
| faddp st(3), st //#4 | |
| fld st //#5 | |
| fmul st, st | |
| fld st(2) //#6 | |
| fmul st, st | |
| faddp //#5 | |
| fld st(3) //#6 | |
| fmul st, st | |
| faddp //#5 | |
| fmul qword ptr [esi-$6c+$40] | |
| fcom qword ptr [esi-$20+$40] | |
| fstsw ax | |
| shr ah, 1 | |
| jnb @547 | |
| fstp st //#4 | |
| fld qword ptr [esi-$18+$40] //#5 | |
| jmp @55d | |
| @547: fld1 //#6 | |
| fcom st(1) | |
| fstsw ax | |
| shr ah, 1 | |
| jb @558 | |
| fstp st //#5 | |
| fdivr qword ptr [esi-$10+$40] | |
| jmp @55d | |
| @558: fcompp //#4 | |
| fld qword ptr [esi-$10+$40] //#5 | |
| @55D: fld qword ptr [ecx+$08] //#6 | |
| fmul st, st(1) | |
| fstp qword ptr [ecx+$08] //#5 | |
| fmul st(3), st | |
| fmul st(2), st | |
| fmulp //#4 | |
| fld qword ptr [esi-$10+$40] //#5 | |
| fld qword ptr [esi-$64+$40] //#6 | |
| fmul st, st(1) | |
| fsubp st(2), st //#5 | |
| fld qword ptr [esi-$5c+$40] //#6 | |
| fmul st, st(1) | |
| fsubp st(3), st //#5 | |
| fmul qword ptr [esi-$54+$40] //#5 | |
| fsubp st(3), st //#4 | |
| fxch st(2) | |
| fld st //#5 | |
| fmul dword ptr [esi-$44+$40] | |
| fld st(2) //#6 | |
| fmul dword ptr [esi-$48+$40] | |
| faddp //#5 | |
| fld st(3) //#6 | |
| fmul dword ptr [esi-$4c+$40] | |
| faddp //#5 | |
| fld st(1) //#6 | |
| fmul dword ptr [esi-$2c+$40] | |
| fld st(3) //#7 | |
| fmul dword ptr [esi-$30+$40] | |
| faddp //#6 | |
| fld st(4) //#7 | |
| fmul dword ptr [esi-$34+$40] | |
| faddp //#6 | |
| fxch st(2) | |
| fmul dword ptr [esi-$38+$40] | |
| fxch st(3) | |
| fmul dword ptr [esi-$3c+$40] | |
| faddp st(3), st //#5 | |
| fxch st(3) | |
| fmul dword ptr [esi-$40+$40] | |
| mov esi, [ebp+$08] | |
| faddp st(2), st //#4 | |
| fadd qword ptr [esi+$18] | |
| fstp qword ptr [ebx] // ? //#1 | |
| fadd qword ptr [esi+$20] | |
| fstp qword ptr [edx] //x,? //#2 | |
| fadd qword ptr [esi+$28] | |
| fstp qword ptr [ecx] //y,x,? //#3 | |
| fstp st | |
| add esp, $20 | |
| mov eax,ebx | |
| pop ebx | |
| pop esi | |
| { push esi //amazing surf | |
| push edi | |
| push ebx | |
| mov edi, [ebp+$08] | |
| mov ebx, eax | |
| mov esi, [edi+$30] | |
| add edi, $00000080 | |
| cmp dword [edi+$50], 0 | |
| jnle @4b | |
| inc dword [edi+$50] | |
| fld qword [esi-$10] | |
| fstp qword [edi+$48] | |
| @4b: fld qword [edi+$48] | |
| fld1 | |
| fld st(1) | |
| fabs | |
| fsubrp | |
| fmul qword [esi-$54] | |
| faddp | |
| fstp qword [edi+$48] //scale | |
| fld qword [esi-$28] //fold | |
| fld qword [ebx] //x,fold | |
| fld st //x,x,fold | |
| fsub st, st(2) //x-fold,x,fold | |
| fabs | |
| fadd st, st(1) //x+abs(x-fold),x,fold | |
| fxch | |
| fadd st, st(2) | |
| fabs | |
| fsubrp //x',fold | |
| fld qword ptr [edx] | |
| fld st(0) | |
| fsub st, st(3) | |
| fabs | |
| fadd st, st(1) | |
| fxch | |
| fadd st, st(3) | |
| fabs | |
| fsubrp //y',x',fold | |
| fst qword ptr [edx] | |
| fmul st, st //yy,x',fold | |
| fxch st(1) | |
| fst qword ptr [ebx] //x',yy,fold | |
| fmul st, st | |
| faddp //xx+yy,fold | |
| fstp st(1) //xx+yy | |
| cmp dword ptr [esi-$58], 0 //sphere / cylinder | |
| jnz @9f | |
| fld qword ptr [ecx] | |
| fmul st, st | |
| faddp //xx+yy+zz | |
| @9F: fcom qword ptr [esi-$20] | |
| fstsw ax | |
| shr ah, 1 | |
| jnb @af | |
| fstp st | |
| fld qword ptr [esi-$18] | |
| jmp @3c5 | |
| @AF: fld1 | |
| fcom st(1) | |
| fstsw ax | |
| shr ah, 1 | |
| jb @3c0 | |
| fstp st(0) | |
| fdivr qword ptr [edi+$48] | |
| jmp @3c5 | |
| @3C0: fcompp | |
| fld qword ptr [edi+$48] | |
| @3C5: fld qword ptr [ecx+$08] //w,scale' | |
| fmul st, st(1) | |
| fstp qword ptr [ecx+$08] | |
| fld qword ptr [ecx] //z,scale' | |
| fmul st, st(1) | |
| fadd qword ptr [edi-$58] //z',scale' | |
| fld qword ptr [edx] //y,z',scale' | |
| fmul st, st(2) | |
| fadd qword ptr [edi-$60] //y',z',scale' | |
| fld qword ptr [ebx] | |
| fmul st, st(3) | |
| fadd qword ptr [edi-$68] //x',y',z',scale' | |
| fld st | |
| fmul dword ptr [esi-$44] | |
| fld st(2) | |
| fmul dword ptr [esi-$48] | |
| faddp | |
| fld st(3) | |
| fmul dword ptr [esi-$4c] | |
| faddp | |
| fld st(1) | |
| fmul dword ptr [esi-$2c] | |
| fld st(3) | |
| fmul dword ptr [esi-$30] | |
| faddp | |
| fld st(4) | |
| fmul dword ptr [esi-$34] | |
| faddp | |
| fxch st(2) | |
| fmul dword ptr [esi-$38] | |
| fxch st(3) | |
| fmul dword ptr [esi-$3c] | |
| faddp st(3), st | |
| fxch st(3) | |
| fmul dword ptr [esi-$40] | |
| faddp st(2), st | |
| fstp qword ptr [ebx] | |
| fstp qword ptr [edx] | |
| fstp qword ptr [ecx] | |
| fstp st | |
| mov eax, ebx | |
| pop ebx | |
| pop edi | |
| pop esi | |
| // pop ebp | |
| // ret $0008 | |
| {asm | |
| push esi //smoothbox lucas with options fold fold x2 | |
| push edi | |
| push ebx | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov edi, [esi + 48] //was:PAligned16 | |
| mov ebx, eax | |
| add esi, $70 | |
| jmp @3 | |
| nop | |
| nop | |
| nop | |
| @intpow: // eax = exponent | |
| shr eax, 1 | |
| jz @a | |
| jnc @0 | |
| fld st | |
| jmp @1 | |
| @0: fld1 | |
| fxch // base, 1(result) | |
| @1: fmul st, st // base * base | |
| @2: shr eax, 1 | |
| jnc @1 | |
| fmul st(1), st //base', result*base' | |
| jnz @1 | |
| fstp st | |
| @a: ret | |
| // nop | |
| @sboxfold: //address of float in eax | |
| fld qword [eax] //x (y or z) | |
| fabs | |
| push eax | |
| mov eax, [edi-$34] | |
| fld st | |
| call @intpow //x^,x | |
| pop eax | |
| fmul qword [edi - $3C] //xp,x | |
| fxch //x,xp | |
| fld qword [edi - $28] //fold,x,xp | |
| fadd st, st //2*fold,x,xp | |
| fsub st, st(1) //2*fold-x,x,xp | |
| fmul st, st(2) //(2*fold-x)*xp,x,xp | |
| faddp //(2*fold-x)*xp+x,xp | |
| fld1 //1,(2*fold-x)*xp+x,xp | |
| faddp st(2), st //(2*fold-x)*xp+x,xp+1 | |
| fdivrp //(2*fold-x)*xp+x/(1+xp) | |
| test byte [eax + 7], $80 //sign bit | |
| jns @4 | |
| fchs | |
| @4: ret | |
| nop | |
| @3: call @sboxfold | |
| mov eax, edx | |
| call @sboxfold | |
| mov eax, ecx | |
| call @sboxfold //z,y,x | |
| cmp dword [esi + $60], 0 | |
| jnle @5 | |
| inc dword [esi + $60] | |
| fld qword [edi - $10] | |
| fstp qword [esi + $58] | |
| @5: fld qword [esi + $58] | |
| fld1 | |
| fld st(1) | |
| fabs | |
| fsubrp | |
| fmul qword [edi - $30] | |
| faddp | |
| fstp qword [esi + $58] | |
| fld qword [edi - $20] | |
| fcomp qword [edi] //0.99 cs099 // | |
| fstsw ax | |
| shr ah, 1 | |
| jb @6 | |
| fld1 | |
| jmp @7 | |
| // nop | |
| @6: fld st(2) | |
| fmul st, st | |
| fld st(2) | |
| fmul st, st | |
| faddp | |
| fld st(1) | |
| fmul st, st | |
| faddp //rr,z,y,x | |
| fld1 | |
| fadd qword [edi - $20] | |
| fmul qword [edi - 8] //0.5*(1+MinR),rr,z,y,x | |
| fld1 | |
| fsub qword [edi - $20] | |
| fmul qword [edi - 8] //0.5*(1-MinR),0.5*(1+MinR),rr,z,y,x | |
| fxch st(2) //rr,m,n,z,y,x | |
| fsub st, st(1) //rr-m,m,n,z,y,x | |
| ftst | |
| fstsw ax | |
| push eax //sign bit | |
| fabs | |
| fdiv st, st(2) //r1,m,n,z,y,x | |
| fld st //r1,r1,m,n,z,y,x | |
| mov eax, [edi - $40] | |
| shr eax, 1 | |
| jnc @9 | |
| fsqrt | |
| rcl eax, 1 | |
| @9: call @intpow | |
| fmul qword [edi - $48] //r1^*fixballfold=rp,r1,m,n,z,y,x | |
| fld1 | |
| fadd st, st(1) //rp+1,rp,r1,m,n,z,y,x | |
| fxch st(2) | |
| faddp //rp+r1,rp+1,m,n,z,y,x | |
| fdivrp //(rp+r1)/(rp+1),m,n,z,y,x | |
| pop eax | |
| fmulp st(2), st //m,(rp+r1)/(rp+1)*n,z,y,x | |
| fxch | |
| shr ah, 1 | |
| jnb @8 | |
| fchs | |
| @8: faddp //m+rs*(rp+r1)/(rp+1)*n,z,y,x | |
| @7: fld qword [esi + $58]//scale,r',z,y,x | |
| fdivrp //scale/r',z,y,x | |
| fld qword [ecx + 8] | |
| fmul st, st(1) | |
| fstp qword [ecx + 8] | |
| fmul st(3), st | |
| fmul st(2), st | |
| fmulp | |
| fadd qword [esi - $48] | |
| fstp qword [ecx] | |
| fadd qword [esi - $50] | |
| fstp qword [edx] | |
| fadd qword [esi - $58] | |
| fstp qword [ebx] | |
| mov eax, ebx | |
| pop ebx | |
| pop edi | |
| pop esi | |
| {asm | |
| push esi //Amazing box x87 with options fold fold x2 | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov edi, [esi + 48] //was:PAligned16 | |
| fld qword [ecx] //x | |
| fld qword [edx] | |
| fld qword [eax] //x,y,z | |
| fld st | |
| fmul qword [edi - 24] | |
| fld st(2) | |
| fmul qword [edi - 32] | |
| faddp | |
| fld st(3) | |
| fmul qword [edi - 40] | |
| faddp //foldx,x,y,z folding with x = abs(x+fold) - abs(x-fold) - x | |
| fadd qword [edi - 16] | |
| fld st(1) | |
| fsub st, st(1) | |
| fabs | |
| fxch //foldx,abs(x-fold),x,y,z | |
| fadd st, st(2) | |
| fabs | |
| fsubrp | |
| fsub st, st(1) //newx,x,y,z | |
| fld st(1) | |
| fmul qword [edi - 56] | |
| fld st(3) | |
| fmul qword [edi - 64] | |
| faddp | |
| fld st(4) | |
| fmul qword [edi - 72] | |
| faddp //foldy,newx,x,y,z | |
| fadd qword [edi - 48] | |
| fld st(3) | |
| fsub st, st(1) | |
| fabs | |
| fxch //foldy,abs(y-yfold),newx,x,y,z | |
| fadd st, st(4) | |
| fabs | |
| fsubrp | |
| fsub st, st(3) //newy,newx,x,y,z | |
| fxch st(2) | |
| fmul qword [edi - 88] //x*az,newx,newy,y,z | |
| fxch st(3) //y,newx,newy,z',z | |
| fmul qword [edi - 96] | |
| faddp st(3), st //newx,newy,z'',z | |
| fld st(3) | |
| fmul qword [edi - 104] | |
| fadd qword [edi - 80] | |
| faddp st(3), st //newx,newy,foldz,z | |
| fld st(2) | |
| fsub st, st(4) | |
| fabs //abs(z-foldz),newx,newy,foldz,z | |
| fxch st(3) //foldz,newx,newy,abs(z-foldz),z | |
| fadd st, st(4) | |
| fabs | |
| fsubrp st(3), st //newx,newy,abs(z+foldz)-abs(z-foldz),z | |
| fxch st(3) | |
| fsubp st(2), st //newy,newz,newx | |
| fstp qword [edx] | |
| fstp qword [ecx] | |
| fstp qword [eax] | |
| pop edi | |
| pop esi } | |
| // var xa, ya, za, R, cosPhi, sinPhi, cosTheta, sinTheta, ph, th: Double; | |
| // var mul, rr: Double; | |
| // dSin1, dCos1, dSin2, dCos2, pp: Double; | |
| // q: TQuaternion; | |
| // v1: TVec3D; | |
| // z1, z2: TComplex; | |
| // h, xx,yy,zz,aa,delta: Double; | |
| // i, a: Integer; | |
| // xyzIn, xyzOut: array[0..2] of Double; | |
| // i, i2, i3: Integer; | |
| // cxy, czw, cccs, ccsn: TComplex; | |
| //x4,y4,z4,x2,y2,z2,uu,vv: Double; | |
| //const c1d3 : Double = 1/3; null: Single = 1E-10; | |
| //const complex1dsqrt: TComplex = (-0.5, 0); | |
| //const root2: Single = 1.4142136; | |
| {begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| {void circInvert(inout vec3 p, inout float dz, in float r) { | |
| float l = length(p); | |
| if (l<r) { | |
| p*=r*r/(l*l); | |
| dz*=r*r/(l*l);} | |
| {vec3 formula(in vec3 a, in vec3 p, inout float dz) { | |
| if (abs(p.x)<linear_a.x&&abs(p.y)<linear_a.y&&abs(p.z)<linear_a.z) | |
| nonlinearPull(a,dz,linear_a.x,linear_a.y,linear_a.z); | |
| wrapBox(a,wrap.x,wrap.y,wrap.z); | |
| circInvert(a,dz,radius); | |
| a*=scale; dz*=abs(scale.x); | |
| rotate(a,dz,angle/180*3.14159265358979323846264); // Ditto? | |
| a+=p; dz+=1; | |
| linearPull(a,dz,linear_b.x,linear_b.y,linear_b.z); // ? | |
| return a; | |
| void linearPull(inout vec3 p, inout float dz, float h, float w, float d) { | |
| if (abs(p.x)>w&&abs(p.y)>h&&abs(p.z)>d) { | |
| h*=2; w*=2; d*=2; | |
| if (p.x<0) p.x+=w; | |
| else p.x-=w; | |
| if (p.y<0) p.y+=h; | |
| else p.y-=h; | |
| if (p.z<0) p.z+=d; | |
| else p.z-=d; | |
| void nonlinearPull(inout vec3 p, inout float dz, float h, float w, float d) { | |
| if (abs(p.x)>w&&abs(p.y)>h&&abs(p.z)>d) { | |
| h*=2; w*=2; d*=2; | |
| if (p.x>0) p.x-=w*floor(p.x/w); | |
| else p.x-=w*ceil(p.x/w); | |
| if (p.y>0) p.y-=h*floor(p.y/h); | |
| else p.y-=h*ceil(p.y/h); | |
| if (p.z>0) p.z-=d*floor(p.z/d); | |
| else p.z-=d*ceil(p.z/d); | |
| -12 -16 -24 -28 -32 -36 -40 -44 | |
| ('Scale','BoxFold','CFold','NonLin X','NonLin Y','NonLin Z','Lin X','Lin Y', | |
| 'Lin Z','Rotate X','Rotate Y','Rotate Z', nonlinvary,linvary } | |
| // -48 -52..-84 -88 -92 | |
| { if bFirstIt = 0 then | |
| begin | |
| PSingle(@Dfree1)^ := PSingle(Integer(PVar) - 28)^; | |
| PSingle(Integer(@Dfree1) + 4)^ := PSingle(Integer(PVar) - 32)^; | |
| PSingle(@Dfree2)^ := PSingle(Integer(PVar) - 36)^; | |
| PSingle(Integer(@Dfree2) + 4)^ := PSingle(Integer(PVar) - 40)^; | |
| PSingle(@Deriv3)^ := PSingle(Integer(PVar) - 44)^; | |
| PSingle(Integer(@Deriv3) + 4)^ := PSingle(Integer(PVar) - 48)^; | |
| Inc(bFirstIt); | |
| end; | |
| // if (abs(J1) < PSingle(@Dfree1)^) and (abs(J2) < PSingle(Integer(@Dfree1) + 4)^) and //Mandelex | |
| // (abs(J3) < PSingle(@Dfree2)^) and (abs(x) > PSingle(@Dfree1)^) and | |
| if (abs(J1) < x) and (abs(J2) < y) and //Mandelex | |
| (abs(J3) < z) and (abs(x) > PSingle(@Dfree1)^) and | |
| (abs(y) > PSingle(Integer(@Dfree1) + 4)^) and (abs(z) > PSingle(@Dfree2)^) then | |
| begin //nonlin pull | |
| PSingle(@Dfree1)^ := PSingle(@Dfree1)^ * PSingle(Integer(PVar) - 88)^; | |
| PSingle(Integer(@Dfree1) + 4)^ := PSingle(Integer(@Dfree1) + 4)^ * PSingle(Integer(PVar) - 88)^; | |
| PSingle(@Dfree2)^ := PSingle(@Dfree2)^ * PSingle(Integer(PVar) - 88)^; | |
| if x > 0 then x := MaxCD(0, x - PSingle(@Dfree1)^ * Trunc(x / PSingle(@Dfree1)^)) | |
| else x := MinCD(0, x - PSingle(@Dfree1)^ * (1 + Trunc(x / PSingle(@Dfree1)^))); | |
| if y > 0 then y := MaxCD(0, y - PSingle(Integer(@Dfree1) + 4)^ * Trunc(y / PSingle(Integer(@Dfree1) + 4)^)) | |
| else y := MinCD(0, y - PSingle(Integer(@Dfree1) + 4)^ * (1 + Trunc(y / PSingle(Integer(@Dfree1) + 4)^))); | |
| if z > 0 then z := MaxCD(0, z - PSingle(@Dfree2)^ * Trunc(z / PSingle(@Dfree2)^)) | |
| else z := MinCD(0, z - PSingle(@Dfree2)^ * (1 + Trunc(z / PSingle(@Dfree2)^))); | |
| end; | |
| x := abs(x+PSingle(Integer(PVar) - 16)^) - abs(x-PSingle(Integer(PVar) - 16)^) - x; | |
| y := abs(y+PSingle(Integer(PVar) - 16)^) - abs(y-PSingle(Integer(PVar) - 16)^) - y; | |
| z := abs(z+PSingle(Integer(PVar) - 16)^) - abs(z-PSingle(Integer(PVar) - 16)^) - z; | |
| rr := x*x + y*y + z*z; | |
| if (rr < PDouble(Integer(PVar) - 24)^) then | |
| rr := (PDouble(Integer(PVar) - 24)^ + s03) / (rr + s03) * PSingle(Integer(PVar) - 12)^ //circ invert + scale | |
| else rr := PSingle(Integer(PVar) - 12)^; | |
| x := x * rr; | |
| y := y * rr; | |
| z := z * rr; | |
| w := w * rr; | |
| //rotate | |
| if (abs(x) > PSingle(Integer(@Dfree2) + 4)^) and (abs(y) > PSingle(@Deriv3)^) and | |
| (abs(z) > PSingle(Integer(@Deriv3) + 4)^) then //lin pull | |
| begin //only one value + adjust w to w := w * NewLength(vec) / OldLength(vec); | |
| PSingle(Integer(@Dfree2) + 4)^ := PSingle(Integer(@Dfree2) + 4)^ * PSingle(Integer(PVar) - 92)^; | |
| PSingle(@Deriv3)^ := PSingle(@Deriv3)^ * PSingle(Integer(PVar) - 92)^; | |
| PSingle(Integer(@Deriv3) + 4)^ := PSingle(Integer(@Deriv3) + 4)^ * PSingle(Integer(PVar) - 92)^; | |
| if x < 0 then x := MinCD(0, x + PSingle(Integer(@Dfree2) + 4)^) | |
| else x := MaxCD(0, x - PSingle(Integer(@Dfree2) + 4)^); | |
| if y < 0 then y := MinCD(0, y + PSingle(@Deriv3)^) | |
| else y := MaxCD(0, y - PSingle(@Deriv3)^); | |
| if z < 0 then z := MinCD(0, z + PSingle(Integer(@Deriv3) + 4)^) | |
| else z := MaxCD(0, z - PSingle(Integer(@Deriv3) + 4)^); | |
| end; | |
| end; | |
| { th := ArcTan2(y, x); | |
| ph := ArcTan2(z, Sqrt(Sqr(x) + Sqr(y))); | |
| R := Power(Rout, 0.5 * PDouble(Integer(PVar) - 32)^); | |
| SinCosD(PDouble(Integer(PVar) - 32)^ * ph, sinPhi, cosPhi); | |
| SinCosD(PDouble(Integer(PVar) - 32)^ * th, sinTheta, cosTheta); | |
| x := R * cosPhi * cosTheta + J1; | |
| y := R * cosPhi * sinTheta + J2; | |
| z := PDouble(Integer(PVar) - 24)^ * R * sinPhi + J3; | |
| th := ArcTan2(y, x); | |
| ph := ArcTan2(z, Sqrt(Sqr(x) + Sqr(y))); | |
| R := Power(Rout, 0.5 * PDouble(Integer(PVar) - 16)^); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * ph, sinPhi, cosPhi); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * th, sinTheta, cosTheta); | |
| x := x + R * cosPhi * cosTheta + J1; | |
| y := y + R * cosPhi * sinTheta + J2; | |
| z := z + PDouble(Integer(PVar) - 24)^ * R * sinPhi + J3; | |
| end; | |
| //David M | |
| { R := Sqrt(Rout); | |
| ya := (1 - Abs(x)) / R * Power(y + z, 5) + 2 * x * z; | |
| xa := x * x - y * y - z * z + j1; | |
| y := 2 * x * y + j2; | |
| z := ya + j3; | |
| x := xa; | |
| { xa := x; | |
| ya := y; | |
| za := z; | |
| Inc(bFirstIt); | |
| if (bFirstIt and 1) = 0 then | |
| begin | |
| x := x * x - y * y + J1; | |
| y := 2 * xa * y + J2; | |
| // z := z + J3; | |
| end else begin | |
| x := x * x - z * z + J1; | |
| // y := y * y - z * z + J2; | |
| // y := y + J2; | |
| z := 2 * xa * z + J3; | |
| end; } | |
| { //other newton triplex | |
| xa := x; | |
| ya := y; | |
| za := z; | |
| x := x * x - 2 * y * z + J1; | |
| y := - z * z + 2 * xa * y + J2; | |
| z := ya * ya + 2 * xa * z + J3; | |
| { //asdam slonofractal | |
| xa := x; | |
| ya := y; | |
| za := Abs(z); | |
| x := x * x - root2 * y * y + 2 * za * x + J1; | |
| y := 2 * xa * y + 2 * za * y + J2; | |
| z := z * z - root2 * ya * ya + Abs(J3); } | |
| // end; | |
| { v1 := NormaliseVector(@x); | |
| SinCosD(ArcCos(v1[0]), SinPhi, CosPhi); | |
| q[0] := 0; | |
| q[1] := 0; | |
| q[2] := -v1[1] * SinPhi; | |
| q[3] := CosPhi; | |
| QuatRotate(@v1, q); | |
| InvertQuat(q); | |
| QuatRotate(@v1, q); | |
| x := Rout * v1[0] + J1; | |
| y := Rout * v1[1] + J2; | |
| z := Rout * v1[2] + J3; | |
| { | |
| R := Power(Rout, 0.5 * PDouble(Integer(PVar) - 16)^); | |
| xa := R * cosPhi * cosTheta; | |
| ya := R * cosPhi * sinTheta; | |
| za := R * sinPhi * PDouble(Integer(PVar) - 48)^; | |
| x := xa + J1; | |
| y := ya + J2; | |
| z := za + J3; | |
| { SinCosD(ph * PDouble(Integer(PVar) - 24)^, sinPhi, cosPhi); | |
| SinCosD(th * PDouble(Integer(PVar) - 24)^, sinTheta, cosTheta); | |
| R := Power(Rout, 0.5 * PDouble(Integer(PVar) - 16)^); | |
| x := R * cosPhi * cosTheta + J1; | |
| y := R * cosPhi * sinTheta + J2; | |
| z := R * sinPhi * PDouble(Integer(PVar) - 40)^ + J3; } | |
| // end; | |
| //asm | |
| { th := ArcTan2(y, x); | |
| ph := ArcTan2(z, Sqrt(Sqr(x) + Sqr(y))); // ArcSin(z / R); | |
| pp := Power(Rout, 0.5 * PDouble(Integer(PVar) - 16)^); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * ph, sinPhi, cosPhi); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * th, sinTheta, cosTheta); | |
| x := pp * cosPhi * cosTheta + J1; | |
| y := pp * cosPhi * sinTheta + J2; | |
| z := PDouble(Integer(PVar) - 24)^ * pp * sinPhi + J3; | |
| push esi //TrifoxComplexAngles 'R intpow','Angle scale','Flip The-Phi (0,1)', 'Angle intpow','Norm R angle (0,1)','Norm fix','Z mul' | |
| push edi | |
| // add esp, -8 | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov edi, [esi + 48] | |
| fld1 // Result := 1 | |
| mov eax, [edi - 12] // Int power | |
| fld qword [esi + 56] //Rout | |
| fsqrt //R=base, Result | |
| jmp @@2 | |
| @@1: fmul st, st { X := Base * Base | |
| @@2: shr eax,1 | |
| jnc @@1 | |
| fmul st(1), st //B,R*B { Result := Result * X | |
| jnz @@1 | |
| fstp st //r' | |
| fldz | |
| fld1 //1,0,r | |
| fld qword [edx - 8] | |
| fld qword [edx] | |
| fld qword [ecx] //z,y,x,1,0,r | |
| fld st(2) | |
| fmul st, st //xx,z,y,x,1,0,r | |
| fld st(2) | |
| fmul st, st //yy,xx,z,y,x,1,0,r | |
| faddp | |
| fsqrt //sqrt(xx+yy),z,y,x,1,0,r | |
| fpatan //phi,y,x,1,0,r | |
| fxch st(2) //x,y,phi,1,0,r | |
| fpatan //theta,phi, 1,0,r | |
| fld dword [edi - 16] | |
| fmul st(2), st | |
| fmulp | |
| cmp dword [edi - 24], 0 | |
| jz @@3 | |
| fxch | |
| @@3: | |
| cmp dword [edi - 32], 0 | |
| jz @@7 // reciprocal r angle | |
| fld st(1) | |
| fmul st, st | |
| fld st(1) | |
| fmul st, st | |
| faddp | |
| fadd dword [edi - 36] | |
| // fsqrt | |
| fld1 | |
| fdivrp | |
| fmul st(2), st | |
| fmulp | |
| @@7: | |
| mov eax, [edi - 28] // int angle pow | |
| jmp @@5 | |
| @@4: fld st(1) //by,bx,by,rx,ry Base*Base: st = st*st - st(1)*st(1); st(1) = 2*st*st(1) | |
| fmul st, st(1) | |
| fadd st, st //2bxby,bx,by,rx,ry | |
| fxch st(2) //by,bx,2bxby,rx,ry | |
| fmul st, st | |
| fxch | |
| fmul st, st //bxbx,byby,2bxby,rx,ry | |
| fsubrp | |
| @@5: shr eax,1 | |
| jnc @@4 | |
| fld st(2) // R=R*Base: st(2) = st(2)*st - st(3)*st(1); st(3) = st(3)*st + st(2)*st(1) | |
| fmul st, st(1) //rx*bx,bx,by,rx,ry | |
| fld st(4) | |
| fmul st, st(3) //ry*by,rx*bx,bx,by,rx,ry | |
| fsubp //rx*bx-ry*by,bx,by,rx,ry | |
| fxch st(3) //rx,bx,by,rx',ry | |
| fmul st, st(2) | |
| fld st(1) //bx,rx*by,bx,by,rx',ry | |
| fmulp st(5), st //rx*by,bx,by,rx',ry*bx | |
| faddp st(4), st //bx,by,rx',ry*bx+rx*by | |
| jnz @@4 | |
| fcompp //theta',phi', r | |
| {const s3: Single = 3; | |
| asm //GenIntPower on Pixelpos: R1type on Px pos, R2type on Py pos | |
| push esi //variable int rotations 2-11 RotType: 0:x|y 1:x|z 2:y|z 3:xy|z 4:xz|y 5:yz|x | |
| push edi //Rpower,Rot1 pow,type, EnableRot2,Rot2 pow,type, EnableRot3, Rot3 pow,type, Zmul = 10 paras | |
| push ebx // -12 -16 -20 -24 -28 -32 -36 -40 -44 -52(double) | |
| mov esi, [ebp + 8] //const: [edi] int64, int64 xor mask, double 1.0 | |
| mov edi, [esi + 48] | |
| // movapd xmm6, [edi] | |
| xorpd xmm6, xmm6 | |
| movhpd xmm6, [edi + 80] | |
| add esp, -16 | |
| fld1 | |
| fadd st, st | |
| fld qword [esi + 16] //Pz,2 | |
| fabs | |
| fmul s3 | |
| faddp | |
| fistp dword [esp] | |
| fld qword [esi] //Px | |
| fabs | |
| fadd st, st | |
| fistp dword [esp + 4] //type 0..11 | |
| fld qword [esi + 8] //Py | |
| fabs | |
| fadd st, st | |
| fistp dword [esp + 8] //type 0..11 | |
| movupd xmm0, [eax] //x,y calc R | |
| movsd xmm5, [ecx] | |
| mulpd xmm0, xmm0 | |
| mulsd xmm5, xmm5 | |
| db $66,$0F,$7C,$C0 //haddpd xmm0, xmm0 | |
| addsd xmm5, xmm0 | |
| movsd xmm2, [edi + 32] //1.0 | |
| sqrtsd xmm1, xmm5 //Rin, sqr(Rin) | |
| divsd xmm2, xmm1 //1/Rin | |
| mov edx, [esp] //int Rpower | |
| cmp edx, 4 | |
| jl @2 | |
| movsd xmm3, xmm5 | |
| mulsd xmm5, xmm5 //r^4 | |
| cmp edx, 8 | |
| jl @1 | |
| mulsd xmm5, xmm5 //r^8 | |
| cmp edx, 10 | |
| jl @2 | |
| jmp @3 | |
| @1: cmp edx, 6 | |
| jl @2 | |
| @3: mulsd xmm5, xmm3 //*r² | |
| @2: shr edx, 1 | |
| jnc @up | |
| mulsd xmm5, xmm1 | |
| @up: | |
| unpcklpd xmm2, xmm2 | |
| movupd xmm0, [eax] | |
| movsd xmm1, [ecx] | |
| mulpd xmm0, xmm2 | |
| movsd [eax + 8], xmm5 | |
| mulsd xmm1, xmm2 //norm input vec | |
| mov edx, [esp] //int rot1 pow | |
| mov ebx, [esp + 4] //int rot1 type | |
| call @rotate | |
| cmp [edi - 24], 0 | |
| jz @@skipr2 | |
| mov edx, [esp] //int rot2 pow | |
| mov ebx, [esp + 8] //int rot2 type | |
| call @rotate | |
| @@skipr2: | |
| cmp [edi - 36], 0 | |
| jz @@fin | |
| mov edx, [edi - 40] //int rot3 pow | |
| mov ebx, [edi - 44] //int rot3 type | |
| call @rotate | |
| @@fin: | |
| mov esi, [ebp + 8] | |
| movsd xmm5, [eax + 8] | |
| movupd xmm3, [esi + 24] //J1,J2 | |
| unpcklpd xmm5, xmm5 | |
| mulsd xmm1, xmm5 | |
| mulpd xmm0, xmm5 //scale output vec | |
| mulsd xmm1, [edi - 52] | |
| addpd xmm0, xmm3 | |
| addsd xmm1, [esi + 40] | |
| movupd [eax], xmm0 | |
| movsd [ecx], xmm1 | |
| add esp, 16 | |
| pop ebx | |
| pop edi | |
| pop esi | |
| pop ebp | |
| ret 8 | |
| @rotate: //ecx = type 0:x|y 1:x|z 2:y|z 3:xy|z 4:xz|y 5:yz|x call @CINTPOW xmm0 + edx pow | |
| xor esi, esi | |
| cmp ebx, 6 | |
| jl @@ud | |
| add esi, 1 | |
| sub ebx, 6 | |
| @@ud: | |
| cmp ebx, 3 | |
| jl @2dr | |
| sub ebx, 4 | |
| jns @u4 | |
| movapd xmm5, xmm0 //rottype 3 xy|z xmm0 Lo = Rxy, xmm0 Hi = z | |
| mulpd xmm0, xmm0 | |
| db $66,$0F,$7C,$C0 //haddpd xmm0, xmm0 $C0 + $38 + $07 first xmm reg + second xmm reg 0-7 | |
| sqrtsd xmm0, xmm0 //Rxy | |
| movsd [ecx], xmm0 | |
| unpcklpd xmm0, xmm1 //xmm1 Lo to xmm0 Hi -> Rxy,z | |
| call @CINTPOW | |
| movapd xmm1, xmm0 //Rxy',z' | |
| divsd xmm0, [ecx] //Rxy'/Rxy change of x,y | |
| unpcklpd xmm0, xmm0 | |
| unpckhpd xmm1, xmm1 //z back to xmm1 Lo | |
| mulpd xmm0, xmm5 //scale x,y by Rxy'/Rxy | |
| ret | |
| @u4: //rottype 4 xz|y | |
| sub ebx, 1 | |
| jns @u5 | |
| movhpd [eax], xmm0 //y rottype 4 xz|y | |
| unpcklpd xmm0, xmm1 //x,z | |
| movapd xmm5, xmm0 | |
| mulpd xmm0, xmm0 | |
| db $66,$0F,$7C,$C0 //haddpd xmm0, xmm0 $C0 + $38 + $07 first xmm reg + second xmm reg 0-7 | |
| sqrtsd xmm0, xmm0 //Rxz | |
| movsd [ecx], xmm0 | |
| movhpd xmm0, [eax] //xmm1 Lo to xmm0 Hi -> Rxz,y | |
| call @CINTPOW | |
| movapd xmm1, xmm0 //Rxz',y' | |
| divsd xmm0, [ecx] //Rxz'/Rxz | |
| unpcklpd xmm0, xmm0 | |
| mulpd xmm0, xmm5 //scale x,z | |
| unpckhpd xmm1, xmm0 //y,z | |
| unpcklpd xmm0, xmm1 //x',y' | |
| unpckhpd xmm1, xmm1 //z | |
| ret | |
| @u5: //rottype 5 yz|x | |
| movsd [eax], xmm0 //x | |
| unpcklpd xmm1, xmm1 | |
| unpckhpd xmm0, xmm1 //y,z | |
| movapd xmm5, xmm0 | |
| mulpd xmm0, xmm0 | |
| db $66,$0F,$7C,$C0 //haddpd xmm0, xmm0 $C0 + $38 + $07 first xmm reg + second xmm reg 0-7 | |
| sqrtsd xmm0, xmm0 //Ryz | |
| movsd [ecx], xmm0 | |
| movhpd xmm0, [eax] //xmm1 Lo to xmm0 Hi -> Ryz,x | |
| call @CINTPOW | |
| movapd xmm1, xmm0 //Ryz',x' | |
| divsd xmm1, [ecx] //Ryz'/Ryz | |
| unpcklpd xmm1, xmm1 | |
| mulpd xmm1, xmm5 //scale y,z | |
| unpckhpd xmm0, xmm0 //x,x | |
| unpcklpd xmm0, xmm1 //x,y | |
| unpckhpd xmm1, xmm1 //z | |
| ret | |
| @2dr: //norm 2d vec: 0:x|y 1:x|z 2:y|z to 1 and call pow xmm5=xmm5/(R3d*Rvec2d) vec3d=vec3d/Rvec2d R3d=xmm2 | |
| sub ebx, 1 | |
| jns @u1 | |
| movapd xmm3, xmm0 //rottype 0 x|y | |
| mulpd xmm3, xmm3 | |
| db $66,$0F,$7C,$DB //haddpd xmm3, xmm3 $C0 + $38 + $07 first xmm reg + second xmm reg 0-7 | |
| sqrtsd xmm5, xmm3 //Rxy | |
| movsd xmm4, [edi + 32] //1.0 | |
| divsd xmm4, xmm5 //1/Rvec2D | |
| unpcklpd xmm4, xmm4 | |
| unpcklpd xmm5, xmm5 | |
| movsd [ecx], xmm1 //save Z | |
| mulpd xmm0, xmm4 //norm xy | |
| call @CINTPOW | |
| movsd xmm1, [ecx] | |
| mulpd xmm0, xmm5 //scale back to vec3 norm | |
| ret | |
| @u1: sub ebx, 1 | |
| jns @u2 | |
| movhpd [ecx], xmm0 //y rottype 1 x|z | |
| unpcklpd xmm0, xmm1 //x,z | |
| movapd xmm3, xmm0 | |
| mulpd xmm3, xmm3 | |
| db $66,$0F,$7C,$DB //haddpd xmm3, xmm3 | |
| sqrtsd xmm5, xmm3 //Rxz | |
| movsd xmm4, [edi + 32] //1.0 | |
| divsd xmm4, xmm5 //1/Rvec2D | |
| unpcklpd xmm4, xmm4 | |
| unpcklpd xmm5, xmm5 | |
| mulpd xmm0, xmm4 //norm xz | |
| call @CINTPOW | |
| mulpd xmm0, xmm5 //scale back x,z | |
| pshufd xmm1, xmm0, $4E //z | |
| movhpd xmm0, [ecx] //x,y | |
| ret | |
| @u2: // rottype 2 y|z | |
| movsd [ecx], xmm0 //x | |
| unpckhpd xmm0, xmm0 //y,y | |
| unpcklpd xmm0, xmm1 //y,z | |
| movapd xmm3, xmm0 | |
| mulpd xmm3, xmm3 | |
| db $66,$0F,$7C,$DB //haddpd xmm3, xmm3 | |
| sqrtsd xmm5, xmm3 //Ryz | |
| movsd xmm4, [edi + 32] //1.0 +16 in m3f! | |
| divsd xmm4, xmm5 //1/Rvec2D | |
| unpcklpd xmm4, xmm4 | |
| unpcklpd xmm5, xmm5 | |
| mulpd xmm0, xmm4 //norm yz | |
| call @CINTPOW | |
| mulpd xmm0, xmm5 //scale back y,z | |
| pshufd xmm1, xmm0, $4E //z | |
| unpcklpd xmm0, xmm0 //y,y | |
| movlpd xmm0, [ecx] //x,y | |
| ret | |
| @CINTPOW: //comlex power of xmm0, edx contains exponent new option: flip x|y | |
| cmp esi, 0 | |
| jz @@u1 | |
| shufpd xmm0, xmm0, 1 | |
| @@u1: | |
| movapd xmm1, xmm0 | |
| call @CMUL | |
| cmp edx, 2 | |
| jle @@ex | |
| movapd xmm3, xmm1 //z | |
| cmp edx, 4 | |
| jl @@2 | |
| movapd xmm4, xmm0 //z² | |
| movapd xmm1, xmm0 | |
| call @CMUL //z^4 | |
| cmp edx, 8 | |
| jl @@1 | |
| movapd xmm1, xmm0 | |
| call @CMUL //z^8 | |
| cmp edx, 10 | |
| jl @@2 | |
| jmp @@3 | |
| @@1: //<8 | |
| cmp edx, 6 | |
| jl @@2 | |
| @@3: | |
| movapd xmm1, xmm4 | |
| call @CMUL | |
| @@2: //<4 | |
| shr edx, 1 | |
| jnc @@ex | |
| movapd xmm1, xmm3 | |
| call @CMUL | |
| @@ex: | |
| cmp esi, 0 | |
| jz @@u2 | |
| shufpd xmm0, xmm0, 1 | |
| @@u2: | |
| ret | |
| @CMUL: // xmm0 * xmm1 = xmm0 (x1,y1)*(x2,y2)=(x,y) (real=lo,imag=hi) xmm1 stays intact for further multiplications | |
| pshufd xmm2, xmm0, $4E //y1,x1 | |
| mulpd xmm0, xmm1 //x1*x2,y1*y2 | |
| mulpd xmm2, xmm1 //y1*x2,x1*y2 | |
| xorpd xmm0, xmm6 //x1*x2,-y1*y2 | |
| db $66,$0F,$7C,$C2 //haddpd xmm0, xmm2 //x1*x2-y1*y2,y1*x2+x1*y2 SSE3 $C0 + $38 + $07 first xmm reg + second xmm reg 0-7 | |
| ret | |
| //Aexion HeartBox | |
| { x := abs(x+PDouble(Integer(PVar) - 40)^) - abs(x-PDouble(Integer(PVar) - 40)^) - x; | |
| y := abs(y+PDouble(Integer(PVar) - 40)^) - abs(y-PDouble(Integer(PVar) - 40)^) - y; | |
| z := abs(z+PDouble(Integer(PVar) - 40)^) - abs(z-PDouble(Integer(PVar) - 40)^) - z; | |
| xx := x*x; | |
| yy := y*y; | |
| zz := z*z; | |
| aa := 2*xx + yy + zz - 1; | |
| h := (aa*aa*aa - 0.1 * xx * zz * z - yy * zz * z) * PDouble(Integer(PVar) - 48)^; //0.0005 | |
| r := Sqrt((xx + yy + zz) * h); //-sqrt(r*h);//reverse it | |
| if r < PDouble(Integer(PVar) - 32)^ then r := PDouble(Integer(PVar) - 24)^ else | |
| if r < 1 then r := PDouble(Integer(PVar) - 16)^ / r | |
| else r := PDouble(Integer(PVar) - 16)^; | |
| x := r * x + J1; | |
| y := r * y + J2; | |
| z := r * z + J3; | |
| w := r * w; | |
| //David new complex: | |
| { // r := x*x + y*y + z*z + w*w; | |
| cxy[0] := x; | |
| cxy[1] := y; | |
| czw[0] := z; | |
| czw[1] := w; | |
| cccs := ComplexPower(CConj(ComplexAdd(ComplexSqr2(cxy), ComplexSqr2(czw))), complex1dsqrt); | |
| ccsn := ComplexMul(czw, cccs); | |
| cccs := ComplexMul(cxy, cccs); | |
| cxy := ComplexScale(ComplexSub(Complexsqr2(cccs), ComplexSqr2(ccsn)), Rout); | |
| czw := ComplexScale(ComplexMul(cccs, ccsn), 2 * Rout); | |
| x := cxy[0] + J1; | |
| y := PDouble(Integer(PVar) - 16)^ * cxy[1] + J2; | |
| z := PDouble(Integer(PVar) - 24)^ * czw[0] + J3; | |
| w := czw[1] + J4; | |
| //knighty smoothbox | |
| { x := Sqrt(PDouble(Integer(PVar) - 24)^ + Sqr(x + 1)) - Sqrt(PDouble(Integer(PVar) - 24)^ + Sqr(x - 1)) - x; | |
| y := Sqrt(PDouble(Integer(PVar) - 24)^ + Sqr(y + 1)) - Sqrt(PDouble(Integer(PVar) - 24)^ + Sqr(y - 1)) - y; | |
| z := Sqrt(PDouble(Integer(PVar) - 24)^ + Sqr(z + 1)) - Sqrt(PDouble(Integer(PVar) - 24)^ + Sqr(z - 1)) - z; | |
| r := Sqrt(x*x + y*y + z*z + 1e-80); | |
| k := 3 * r - 2; | |
| r := PDouble(Integer(PVar) - 16)^ * ((k*k*k - k + 6) ) / ((k*k + 1) + (r * 0.7 / (r + 1)) ) / (3 * r); | |
| x := r * x + J1; | |
| y := r * y + J2; | |
| z := r * z + J3; | |
| w := w * (Abs(r) * 0.9 + 0.2); | |
| { if bFirstIt = 0 then //Aexion chrystalbox | |
| begin | |
| Inc(bFirstIt); | |
| x := abs(J3) - PDouble(Integer(PVar) - 32)^; | |
| y := abs(0.86602540378443864676372317075294*J1-0.5*J3) - PDouble(Integer(PVar) - 32)^; | |
| z := abs(-0.86602540378443864676372317075294*J1-0.5*J3) - PDouble(Integer(PVar) - 32)^; | |
| w := abs(J2) - PDouble(Integer(PVar) - 32)^; | |
| J1 := x; | |
| J2 := y; | |
| J3 := z; | |
| J4 := w; | |
| x := 0; | |
| y := 0; | |
| z := 0; | |
| w := 0; | |
| end; | |
| x := abs(x+PDouble(Integer(PVar) - 24)^) - abs(x-PDouble(Integer(PVar) - 24)^) - x; | |
| y := abs(y+PDouble(Integer(PVar) - 24)^) - abs(y-PDouble(Integer(PVar) - 24)^) - y; | |
| z := abs(z+PDouble(Integer(PVar) - 24)^) - abs(z-PDouble(Integer(PVar) - 24)^) - z; | |
| w := abs(w+PDouble(Integer(PVar) - 24)^) - abs(w-PDouble(Integer(PVar) - 24)^) - w; | |
| vm := abs(x) + abs(y) + abs(z) + abs(w); //sqrt(x*x+y*y+z*z+w*w); | |
| if (vm < 0.05) then | |
| begin | |
| x := x*4; | |
| y := y*4; | |
| z := z*4; | |
| w := w*4; | |
| end //1.5 | |
| else if (vm < 1) then | |
| begin | |
| vsq := 1 / vm*vm*vm; | |
| x := x * vsq; | |
| y := y * vsq; | |
| z := z * vsq; | |
| w := w * vsq; | |
| end; | |
| x := PDouble(Integer(PVar) - 16)^ * x + J1; | |
| y := PDouble(Integer(PVar) - 16)^ * y + J2; | |
| z := PDouble(Integer(PVar) - 16)^ * z + J3; | |
| w := PDouble(Integer(PVar) - 16)^ * w + J4; | |
| Deriv1 := Deriv1 * PDouble(Integer(PVar) - 16)^; } | |
| {// nHybrid: array[0..5] of Integer; //+76 conditional ItCounts | |
| if PInteger(Integer(PVar) - 56)^ = 0 then | |
| r := PDouble(Integer(PVar) - 16)^ * x + PDouble(Integer(PVar) - 24)^ * y + | |
| PDouble(Integer(PVar) - 32)^ * z + PDouble(Integer(PVar) - 40)^ | |
| else | |
| r := PDouble(Integer(PVar) - 16)^ * C1 + PDouble(Integer(PVar) - 24)^ * C2 + | |
| PDouble(Integer(PVar) - 32)^ * C3 + PDouble(Integer(PVar) - 40)^; | |
| i2 := PInteger(Integer(PVar) - 52)^; | |
| if i2 < 0 then i2 := 0 else | |
| if i2 > 99999 then i2 := 99999; | |
| i3 := 0; | |
| if r < 0 then | |
| begin | |
| i3 := i2; | |
| i2 := 0; | |
| end; | |
| i := PInteger(Integer(PVar) - 44)^; | |
| if i < 1 then i := 1 else | |
| if i > 6 then i := 6; | |
| if PInteger(Integer(PIteration3D) + 72 + i shl 2)^ < 0 then | |
| PInteger(Integer(PIteration3D) + 72 + i shl 2)^ := i2 or $80000000 | |
| else | |
| PInteger(Integer(PIteration3D) + 72 + i shl 2)^ := i2; | |
| i := PInteger(Integer(PVar) - 48)^; | |
| if i < 1 then i := 1 else | |
| if i > 6 then i := 6; | |
| if PInteger(Integer(PIteration3D) + 72 + i shl 2)^ < 0 then | |
| PInteger(Integer(PIteration3D) + 72 + i shl 2)^ := i3 or $80000000 | |
| else | |
| PInteger(Integer(PIteration3D) + 72 + i shl 2)^ := i3; } | |
| //Its a 4th power lambdabulb with a seed of 1.0625 + i*0.2375 with shadows. The function is z = c*(z-z^p) | |
| { if bFirstIt = 0 then | |
| begin | |
| Inc(bFirstIt); | |
| Dfree1 := Sqrt(J1*J1 + J2*J2 + J3*J3); | |
| if Dfree1 < 1e-60 then Dfree2 := 0 else | |
| Dfree2 := ArcSin(J3 / Dfree1); | |
| Deriv2 := ArcTan2(J2, J1); | |
| end; | |
| r := Sqrt(Rout); | |
| ph := ArcTan2(y, x) * PDouble(Integer(PVar) - 16)^; | |
| th := ArcSin(z / r) * PDouble(Integer(PVar) - 16)^; | |
| r1 := Power(r, PDouble(Integer(PVar) - 16)^); | |
| SinCosD(ph, Sx, Cx); | |
| SinCosD(th, Sy, Cy); | |
| xa := x - (Cx * Cy * r1); | |
| ya := y - (Sx * Cy * r1); | |
| za := z - (Sy * r1); | |
| r1 := Sqrt(xa*xa + ya*ya + za*za); | |
| ph := ArcTan2(ya, xa) + Deriv2; | |
| th := ArcSin(za / r1) + Dfree2; //+ | |
| r := r1 * Dfree1; | |
| SinCosD(ph, Sx, Cx); | |
| SinCosD(th, Sy, Cy); | |
| x := Cx * Cy * r; | |
| y := Sx * Cy * r; | |
| z := Sy * r; } | |
| { | |
| m := 1/Sqrt(x*x + y*y); //normalize vec(x,y) | |
| x := x*m; | |
| y := y*m; | |
| z := z*m; | |
| ipow2(x,y); //rotate vec(x,y), radius=1 is unchanged | |
| m := 1/Sqrt(x*x + y*y + z*z); //normalize vec(x,y,z) | |
| x := x*m; | |
| y := y*m; | |
| z := z*m; | |
| m := Sqrt(x*x + y*y); //length of vec(x,y) | |
| mt := m; | |
| ipow2(m,z); //rotate vec(z,|vec(x,y)|) | |
| m := m/mt*R; | |
| x := x * m + J1; | |
| y := y * m + J2; | |
| z := z * R + J3; } | |
| { r := Sqrt(Rout); | |
| r1 := PDouble(Integer(PVar) - 16)^ * r / Sqrt(Sqr(x) + Sqr(y) + 1e-40); //infpoles | |
| phi := r1 * ArcSin(z / r); | |
| theta := r1 * ArcTan2(y, x); | |
| SinCosD(phi, Sx, Cx); | |
| SinCosD(theta, Sz, Cz); | |
| r := Power(r, r1); | |
| x := r * Cz * Cx + J1; | |
| y := r * Sz * Cx + J2; | |
| z := r * Sx * PDouble(Integer(PVar) - 24)^ + J3; | |
| //Menger4d | |
| { x := abs(x); | |
| y := abs(y); | |
| z := abs(z); | |
| w := abs(w); | |
| if x<y then begin r:=x; x:=y; y:=r; end; | |
| if x<z then begin r:=x; x:=z; z:=r; end; | |
| if x<w then begin r:=x; x:=w; w:=r; end; | |
| if y<z then begin r:=y; y:=z; z:=r; end; | |
| if y<w then begin r:=y; y:=w; w:=r; end; | |
| if z<w then begin r:=z; z:=w; w:=r; end; | |
| //rotate4d | |
| Rotate4D(@x, TPSMatrix4(Integer(PVar) - 88)); | |
| r := PDouble(Integer(PVar) - 16)^; | |
| Deriv1 := Deriv1 * r; | |
| x := x*r - (r-1); | |
| y := y*r - (r-1); | |
| w := w*r + PDouble(Integer(PVar) - 24)^; | |
| r1 := 0.5*(r-1)/r; | |
| z := (-abs(z - r1) + r1) * r; } | |
| { R := Sqrt(Rout); //FloatP with derivatives | |
| th := ArcTan2(y, x); | |
| ph := ArcSin(z / R); | |
| pp := Power(R, PDouble(Integer(PVar) - 16)^); | |
| if bFirstIt = 0 then | |
| begin | |
| bFirstIt := 1; // derivatives | |
| thd := 0; | |
| phd := 0; | |
| ppd := 1; | |
| end else begin | |
| thd := ArcTan2(Deriv2, Deriv1); // derivatives | |
| phd := ArcSin(Deriv3 / RoutDeriv); | |
| ppd := Power(R, PDouble(Integer(PVar) - 16)^ - 1); | |
| end; | |
| SinCosD(phd + (PDouble(Integer(PVar) - 16)^ - 1) * ph, Sx, Cx); | |
| SinCosD(thd + (PDouble(Integer(PVar) - 16)^ - 1) * th, Sy, Cy); | |
| R2 := PDouble(Integer(PVar) - 16)^ * Power(R, PDouble(Integer(PVar) - 16)^ - 1) * RoutDeriv; | |
| Deriv1 := R2 * Cx * Cy + 1; | |
| Deriv2 := R2 * Cx * Sy; | |
| Deriv3 := R2 * Sx; | |
| RoutDeriv := Sqrt(Deriv1 * Deriv1 + Deriv2 * Deriv2 + Deriv3 * Deriv3); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * ph, Sx, Cx); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * th, Sy, Cy); | |
| x := pp * Cx * Cy + J1; | |
| y := pp * Cx * Sy + J2; | |
| z := PDouble(Integer(PVar) - 24)^ * pp * Sx + J3; } | |
| end; | |
| procedure doInterpolHybridPas(PIteration3D: TPIteration3D); //interpolate between 2 formulas. nHybrid[n] is single-weight | |
| var X1, Y1: TVec4D; //new ext version | |
| XX, YY: Double; | |
| S1, S2: Single; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| if DoJulia then mCopyVec(@J1, @JU1) else mCopyVec(@J1, @C1); | |
| mCopyVec(@x, @C1); | |
| w := 0; | |
| Rout := x * x + y * y + z * z; | |
| OTrap := Rout; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| S1 := PSingle(@nHybrid[0])^; | |
| S2 := PSingle(@nHybrid[1])^; | |
| repeat | |
| Rold := Rout; | |
| mCopyVec4(@Y1, @x); | |
| PVar := fHPVar[0]; | |
| fHybrid[0](x, y, z, w, PIteration3D); | |
| mCopyVec4(@x1, @x); | |
| mCopyVec4(@x, @Y1); | |
| PVar := fHPVar[1]; | |
| fHybrid[1](x, y, z, w, PIteration3D); | |
| XX := Sqrt(Sqr(x1[0]) + Sqr(x1[1]) + Sqr(x1[2])); | |
| YY := Sqrt(x * x + y * y + z * z); | |
| XX := XX * S1 + YY * S2; | |
| x := x1[0] * S1 + x * S2; | |
| y := x1[1] * S1 + y * S2; | |
| z := x1[2] * S1 + z * S2; | |
| w := x1[3] * S1 + w * S2; | |
| YY := XX / Sqrt(x * x + y * y + z * z + 1e-40); | |
| x := x * YY; | |
| y := y * YY; | |
| z := z * YY; | |
| Inc(ItResultI); | |
| Rout := XX * XX; | |
| if Rout < OTrap then OTrap := Rout; | |
| until | |
| (ItResultI >= maxIt) or (Rout > RStop); | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, 0); | |
| end; | |
| end; | |
| procedure doInterpolHybridSSE2(PIteration3D: TPIteration3D); // new ext version | |
| asm | |
| push eax | |
| push ebx | |
| push ecx | |
| push edx | |
| push esi | |
| push edi //x = edi-32 y = edi-24 .. Rold = edi - 48, Rstop = edi - 40, (i = edi + 212 = btmp = esi - 44) | |
| add esp, -72 | |
| mov edi, eax //was: Rold = esp, Rstop = esp + 8, aligned16: esp + 16, X1 = a16 X2 = a16+8.. Y1 = a16+32 .. | |
| lea esi, eax + 256 | |
| mov eax, esp | |
| add eax, 35 | |
| and eax, $FFFFFFF0 | |
| mov [esp], eax // aligned 16 Ybuf aligned16: esp, X1 = a16.. = Y1 = (aligned) | |
| cvtps2pd xmm7, [edi + 76] //nHybrid[0] +76 weights in double for s1,s2 (lo,hi part) | |
| movupd xmm0, [edi] | |
| movsd xmm1, [edi + 16] | |
| movupd [edi - 32], xmm0 //xyz=C | |
| movupd [edi - 16], xmm1 | |
| cmp dword [esi - 104], 0 //DoJulia:+152 | |
| jz @sjup | |
| movupd xmm2, [esi + 64] | |
| movsd xmm3, [esi + 80] | |
| movupd [edi + 24], xmm2 //J=Ju | |
| movsd [edi + 40], xmm3 | |
| jmp @skipIfJulia | |
| @sjup: | |
| movupd [edi + 24], xmm0 //J=C | |
| movsd [edi + 40], xmm1 | |
| @skipIfJulia: | |
| mulpd xmm0, xmm0 | |
| mulsd xmm1, xmm1 | |
| CVTSS2SD xmm5, [edi + 72] //RStop in double | |
| addsd xmm1, xmm0 | |
| unpckhpd xmm0, xmm0 | |
| movsd [edi - 40], xmm5 | |
| addsd xmm1, xmm0 | |
| xor ebx, ebx | |
| movsd [esi - 64], xmm1 //OTrap=Rout | |
| movsd [edi + 56], xmm1 //Rout | |
| mov [esi - 48], ebx //bFirstIt := 0; +208 | |
| mov [edi + 64], ebx //ItresultI :=0 +64 | |
| @Repeat: | |
| movsd xmm2, [edi + 56] | |
| mov ebx, [edi + 100] //fHPVar[0] +100 | |
| mov eax, [esp] | |
| mov [edi + 48], ebx //PVars: +48 | |
| movsd [edi - 48], xmm2 //Rold := Rout | |
| movupd xmm0, [edi - 32] //Y:=xyz | |
| movupd xmm1, [edi - 16] | |
| movapd [eax], xmm0 | |
| movapd [eax + 16], xmm1 | |
| lea eax, edi - 32 // x | |
| lea edx, edi - 24 // y | |
| lea ecx, edi - 16 // z | |
| lea ebx, edi - 8 // w | |
| push ebx | |
| push edi | |
| call [edi + 124] //fHybrid[0] of ThybridIteration2 | |
| mov eax, [esp] | |
| movupd xmm0, [edi - 32] // mCopyVec4(@x1, @x); | |
| movupd xmm1, [edi - 16] // mCopyVec4(@x, @Y1); | |
| movapd xmm2, [eax] | |
| movapd xmm3, [eax + 16] | |
| movapd [eax], xmm0 | |
| movapd [eax + 16], xmm1 | |
| movupd [edi - 32], xmm2 //xyz=Y1 | |
| movupd [edi - 16], xmm3 | |
| mov ebx, [edi + 104] //fHPVar[1] | |
| mov [edi + 48], ebx //PVars: +48 | |
| lea eax, edi - 32 // x | |
| lea edx, edi - 24 // y | |
| lea ecx, edi - 16 // z | |
| lea ebx, edi - 8 // w | |
| push ebx | |
| push edi | |
| call [edi + 128] //fHybrid[1] of ThybridIteration2 | |
| mov eax, [esp] | |
| movupd xmm0, [edi - 32] //x,y was: y1 | |
| movapd xmm2, [eax] //x[0,1] | |
| movupd xmm1, [edi - 16] //z,w | |
| movapd xmm3, [eax + 16] //x[2,3] | |
| movapd xmm5, xmm0 //x,y | |
| movapd xmm6, xmm2 //x[0,1] | |
| mulpd xmm0, xmm0 //x²,y² | |
| mulpd xmm2, xmm2 //x[0]²,x[1]² | |
| mulsd xmm1, xmm1 //z²,w | |
| mulsd xmm3, xmm3 //x[2]² | |
| addsd xmm1, xmm0 //z²+x² | |
| addsd xmm3, xmm2 //x[2]²+x[0]² | |
| unpckhpd xmm0, xmm0 //y² | |
| unpckhpd xmm2, xmm2 //x[1]² | |
| addsd xmm1, xmm0 //x²+y²+z² | |
| addsd xmm3, xmm2 //x[0]²+x[1]²+x[2]² | |
| unpcklpd xmm3, xmm1 //x[0]²+x[1]²+x[2]²,x²+y²+z² | |
| sqrtpd xmm0, xmm3 //xx,yy | |
| mulpd xmm0, xmm7 //xx*s1,yy*s2 | |
| pshufd xmm2, xmm0, $4E | |
| addsd xmm0, xmm2 //XX = xx*s1+yy*s2 | |
| pshufd xmm3, xmm7, $4E //wy | |
| movsd xmm2, xmm7 //wx | |
| unpcklpd xmm3, xmm3 //s2,s2 | |
| unpcklpd xmm2, xmm2 //s1,s1 | |
| movupd xmm1, [edi - 16] //z,w | |
| mulpd xmm5, xmm3 //x,y *s2 | |
| mulpd xmm6, xmm2 //x[0,1] *s1 | |
| mulpd xmm3, xmm1 //z,w *s2 | |
| mulpd xmm2, [eax + 16] //x[2,3] *s1 | |
| addpd xmm5, xmm6 //x,y | |
| addpd xmm3, xmm2 //z,w | |
| movapd xmm4, xmm5 //x,y | |
| movsd xmm2, xmm3 //z | |
| mulpd xmm4, xmm4 //x²,y² | |
| mulsd xmm2, xmm2 //z² 4D: mulpd | |
| addsd xmm2, xmm4 //z²+x² 4D: addpd ... | |
| unpckhpd xmm4, xmm4 //y² | |
| addsd xmm4, xmm2 //x²+y²+z² | |
| addsd xmm4, d1em40 | |
| sqrtsd xmm4, xmm4 | |
| movsd xmm2, xmm0 //XX | |
| divsd xmm2, xmm4 //YY := XX / Sqrt(x * x + y * y + z * z + 1e-40); | |
| unpcklpd xmm2, xmm2 //YY,YY | |
| mulpd xmm5, xmm2 | |
| mulsd xmm3, xmm2 | |
| movupd [edi - 32], xmm5 //x,y | |
| movupd [edi - 16], xmm3 //z,w | |
| mulsd xmm0, xmm0 | |
| movsd [edi + 56], xmm0 //Rout := XX * XX; | |
| movsd xmm1, xmm0 | |
| inc dword [edi + 64] //Inc(ItResultI) | |
| minsd xmm0, [esi - 64] | |
| movsd [esi - 64], xmm0 //OTrap := Min(Rout, OTrap); | |
| mov eax, [edi + 64] | |
| cmp eax, [edi + 68] //maxIt: +68 | |
| jnl @out | |
| comisd xmm1, [edi - 40] //RStop | |
| jc @Repeat | |
| @out: | |
| cmp byte [esi - 108], 0 //CalcSIT: +148 | |
| jz @NoCalcSITout | |
| mov eax, edi | |
| xor edx, edx | |
| call CalcSmoothIterations //(PIt3D: TPIteration3D; n: Integer); | |
| @NoCalcSITout: | |
| add esp, 72 | |
| pop edi | |
| pop esi | |
| pop edx | |
| pop ecx | |
| pop ebx | |
| pop eax | |
| end; | |
| function doInterpolHybridPasDE(PIteration3D: TPIteration3D): Double; | |
| var X1, Y1: TVec4D; | |
| XX, YY: Double; | |
| S1, S2: Single; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| if DoJulia then mCopyVec(@J1, @JU1) else mCopyVec(@J1, @C1); | |
| mCopyVec(@x, @C1); | |
| Rout := x * x + y * y + z * z; | |
| OTrap := Rout; | |
| if (DEoption and $18) = 16 then w := Rout else w := 1; | |
| S1 := PSingle(@nHybrid[0])^; | |
| S2 := PSingle(@nHybrid[1])^; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| repeat | |
| Rold := Rout; | |
| mCopyVec4(@Y1, @x); | |
| PVar := fHPVar[0]; | |
| fHybrid[0](x, y, z, w, PIteration3D); | |
| mCopyVec4(@x1, @x); | |
| mCopyVec4(@x, @Y1); | |
| PVar := fHPVar[1]; | |
| fHybrid[1](x, y, z, w, PIteration3D); | |
| XX := Sqrt(Sqr(x1[0]) + Sqr(x1[1]) + Sqr(x1[2])); | |
| YY := Sqrt(x * x + y * y + z * z); | |
| XX := XX * S1 + YY * S2; | |
| x := x1[0] * S1 + x * S2; | |
| y := x1[1] * S1 + y * S2; | |
| z := x1[2] * S1 + z * S2; | |
| w := Abs(x1[3]) * S1 + Abs(w) * S2; | |
| YY := XX / Sqrt(x * x + y * y + z * z + 1e-40); | |
| x := x * YY; | |
| y := y * YY; | |
| z := z * YY; | |
| Inc(ItResultI); | |
| Rout := XX * XX; | |
| if Rout < OTrap then OTrap := Rout; | |
| until | |
| (ItResultI >= maxIt) or (Rout > RStop); | |
| case DEoption and 7 of | |
| 4: Result := Abs(z) * Ln(Abs(z)) / w; //Julia? | |
| 7: Result := Sqrt(Rout / RStop) * Power(PDouble(Integer(PVar) - 16)^, -ItResultI); //Pvar does only work for single formula | |
| else Result := Sqrt(Rout) / Abs(w); //AmBox + IFS | |
| end; // distance = 0.5 * r * log(r) / r_dz; for analytical powers! | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, 0); | |
| end; | |
| end; | |
| function doInterpolHybridDESSE2(PIteration3D: TPIteration3D): Double; // new ext version | |
| asm | |
| push eax | |
| push ebx | |
| push ecx | |
| push edx | |
| push esi | |
| push edi //x = edi-32 y = edi-24 .. Rold = edi - 48, Rstop = edi - 40, i = edi + 212 = btmp = esi - 44 | |
| add esp, -72 | |
| mov edi, eax //was: Rold = esp, Rstop = esp + 8, aligned16: esp + 16, X1 = a16 X2 = a16+8.. Y1 = a16+32 .. | |
| lea esi, eax + 256 | |
| mov eax, esp | |
| add eax, 35 | |
| and eax, $FFFFFFF0 | |
| mov [esp], eax // aligned 16 Ybuf aligned16: esp, X1 = a16.. = Y1 = (aligned) | |
| cvtps2pd xmm7, [edi + 76] //nHybrid[0] +76 weights in double for s1,s2 (lo,hi part) | |
| movupd xmm0, [edi] | |
| movsd xmm1, [edi + 16] | |
| movupd [edi - 32], xmm0 //xyz=C | |
| movupd [edi - 16], xmm1 | |
| cmp dword [esi - 104], 0 //DoJulia:+152 | |
| jz @sjup | |
| movupd xmm2, [esi + 64] | |
| movsd xmm3, [esi + 80] | |
| movupd [edi + 24], xmm2 //J=Ju | |
| movsd [edi + 40], xmm3 | |
| jmp @skipIfJulia | |
| @sjup: | |
| movupd [edi + 24], xmm0 //J=C | |
| movsd [edi + 40], xmm1 | |
| @skipIfJulia: | |
| mulpd xmm0, xmm0 | |
| mulsd xmm1, xmm1 | |
| CVTSS2SD xmm5, [edi + 72] //RStop in double | |
| addsd xmm1, xmm0 | |
| unpckhpd xmm0, xmm0 | |
| movsd [edi - 40], xmm5 | |
| addsd xmm1, xmm0 | |
| xor ebx, ebx | |
| movsd [esi - 64], xmm1 //OTrap=Rout | |
| movsd [edi + 56], xmm1 //Rout | |
| mov [esi - 48], ebx //bFirstIt := 0; +208 | |
| mov [edi + 64], ebx //ItresultI :=0 +64 | |
| mov eax, [esi - 96] //DEoption +160 | |
| and eax, $18 | |
| sub eax, 16 | |
| jnz @UU1 | |
| fld qword [edi + 56] | |
| jmp @UU2 | |
| @UU1: | |
| fld1 | |
| @UU2: | |
| fstp qword [edi - 8] // if (DEoption and $18) = 16 then w := Rout else w := 1; | |
| @Repeat: | |
| movsd xmm2, [edi + 56] | |
| mov ebx, [edi + 100] //fHPVar[0] +100 | |
| mov eax, [esp] | |
| mov [edi + 48], ebx //PVars: +48 | |
| movsd [edi - 48], xmm2 //Rold := Rout | |
| movupd xmm0, [edi - 32] //Y:=xyz | |
| movupd xmm1, [edi - 16] | |
| movapd [eax], xmm0 | |
| movapd [eax + 16], xmm1 | |
| lea eax, edi - 32 // x | |
| lea edx, edi - 24 // y | |
| lea ecx, edi - 16 // z | |
| lea ebx, edi - 8 // w | |
| push ebx | |
| push edi | |
| call [edi + 124] //fHybrid[0] of ThybridIteration2 | |
| mov eax, [esp] | |
| movupd xmm0, [edi - 32] // mCopyVec4(@x1, @x); | |
| movupd xmm1, [edi - 16] // mCopyVec4(@x, @Y1); | |
| movapd xmm2, [eax] | |
| movapd xmm3, [eax + 16] | |
| movapd [eax], xmm0 | |
| movapd [eax + 16], xmm1 | |
| movupd [edi - 32], xmm2 //xyz=Y1 | |
| movupd [edi - 16], xmm3 | |
| mov ebx, [edi + 104] //fHPVar[1] | |
| mov [edi + 48], ebx //PVars: +48 | |
| lea eax, edi - 32 // x | |
| lea edx, edi - 24 // y | |
| lea ecx, edi - 16 // z | |
| lea ebx, edi - 8 // w | |
| push ebx | |
| push edi | |
| call [edi + 128] //fHybrid[1] of ThybridIteration2 | |
| mov eax, [esp] | |
| movupd xmm0, [edi - 32] //x,y was: y1 | |
| movapd xmm2, [eax] //x[0,1] | |
| movupd xmm1, [edi - 16] //z,w | |
| movapd xmm3, [eax + 16] //x[2,3] | |
| movapd xmm5, xmm0 //x,y | |
| movapd xmm6, xmm2 //x[0,1] | |
| mulpd xmm0, xmm0 //x²,y² | |
| mulpd xmm2, xmm2 //x[0]²,x[1]² | |
| mulsd xmm1, xmm1 //z²,w | |
| mulsd xmm3, xmm3 //x[2]² | |
| addsd xmm1, xmm0 //z²+x² | |
| addsd xmm3, xmm2 //x[2]²+x[0]² | |
| unpckhpd xmm0, xmm0 //y² | |
| unpckhpd xmm2, xmm2 //x[1]² | |
| addsd xmm1, xmm0 //x²+y²+z² | |
| addsd xmm3, xmm2 //x[0]²+x[1]²+x[2]² | |
| unpcklpd xmm3, xmm1 //x[0]²+x[1]²+x[2]²,x²+y²+z² | |
| sqrtpd xmm0, xmm3 //xx,yy | |
| mulpd xmm0, xmm7 //xx*s1,yy*s2 | |
| pshufd xmm2, xmm0, $4E | |
| addsd xmm0, xmm2 //XX = xx*s1+yy*s2 | |
| pshufd xmm3, xmm7, $4E //wy | |
| movsd xmm2, xmm7 //wx | |
| unpcklpd xmm3, xmm3 //s2,s2 | |
| unpcklpd xmm2, xmm2 //s1,s1 | |
| movupd xmm1, [edi - 16] //z,w | |
| mulpd xmm5, xmm3 //x,y *s2 | |
| mulpd xmm6, xmm2 //x[0,1] *s1 | |
| mulpd xmm3, xmm1 //z,w *s2 | |
| mulpd xmm2, [eax + 16] //x[2,3] *s1 | |
| addpd xmm5, xmm6 //x,y | |
| addpd xmm3, xmm2 //z,w | |
| movapd xmm4, xmm5 //x,y | |
| movsd xmm2, xmm3 //z | |
| mulpd xmm4, xmm4 //x²,y² | |
| mulsd xmm2, xmm2 //z² 4D: mulpd | |
| addsd xmm2, xmm4 //z²+x² 4D: addpd ... | |
| unpckhpd xmm4, xmm4 //y² | |
| addsd xmm4, xmm2 //x²+y²+z² | |
| addsd xmm4, d1em40 | |
| sqrtsd xmm4, xmm4 | |
| movsd xmm2, xmm0 //XX | |
| divsd xmm2, xmm4 //YY := XX / Sqrt(x * x + y * y + z * z + 1e-40); | |
| unpcklpd xmm2, xmm2 //YY,YY | |
| mulpd xmm5, xmm2 | |
| mulsd xmm3, xmm2 | |
| movupd [edi - 32], xmm5 //x,y | |
| movupd [edi - 16], xmm3 //z,w | |
| mulsd xmm0, xmm0 | |
| movsd [edi + 56], xmm0 //Rout := XX * XX; | |
| movsd xmm1, xmm0 | |
| inc dword [edi + 64] //Inc(ItResultI) | |
| minsd xmm0, [esi - 64] | |
| movsd [esi - 64], xmm0 //OTrap := Min(Rout, OTrap); | |
| mov eax, [edi + 64] | |
| cmp eax, [edi + 68] //maxIt: +68 | |
| jnl @out | |
| comisd xmm1, [edi - 40] //RStop | |
| jc @Repeat | |
| @out: | |
| mov eax, [esi - 96] //DEoption +160 | |
| and eax, 7 | |
| sub eax, 4 | |
| jnz @UU3 //Result := Abs(z) * Ln(Abs(z)) / w; | |
| fld qword [edi - 16] | |
| fabs | |
| fldln2 | |
| fld st(1) | |
| fyl2x | |
| fmulp | |
| fdiv qword [edi - 8] //Result | |
| jmp @UU6 | |
| @UU3: | |
| sub eax, 3 // / intPower faster? | |
| jnz @UU4 //Result := Sqrt(Rout/RStop) * Power(PDouble(Integer(PVar) - 16)^, -ItResultI); | |
| mov eax, [edi + 48] | |
| fild dword [edi + 64] //ItResultI | |
| fchs //-ItresultI | |
| fld qword [eax - 16] //(Pvar-16)^ (= scale or something) | |
| fldln2 //power function base,expo -> st, st(1) | |
| fxch | |
| fyl2x | |
| fxch | |
| fmulp | |
| fldl2e | |
| fmulp | |
| fld st(0) | |
| frndint | |
| fsub st(1), st(0) | |
| fxch | |
| f2xm1 | |
| fld1 | |
| faddp | |
| fscale | |
| fstp st(1) //end of power function | |
| fld qword [edi + 56] | |
| fdiv dword [edi + 72] //rout/rstop,pow | |
| fsqrt | |
| fmulp | |
| jmp @UU6 | |
| @UU4: // else Result := Sqrt(Rout) / Abs(w); | |
| fld qword [edi + 56] | |
| fsqrt | |
| fld qword [edi - 8] | |
| fabs | |
| fdivp | |
| @UU6: | |
| cmp byte [esi - 108], 0 //CalcSIT: +148 | |
| jz @NoCalcSITout | |
| mov eax, edi | |
| xor edx, edx | |
| call CalcSmoothIterations //(PIt3D: TPIteration3D; n: Integer); | |
| @NoCalcSITout: | |
| add esp, 72 | |
| pop edi | |
| pop esi | |
| pop edx | |
| pop ecx | |
| pop ebx | |
| pop eax | |
| end; | |
| procedure doInterpolHybridPas4D(PIteration3D: TPIteration3D); | |
| var X1, Y1: TVec4D; | |
| XX, YY: Double; | |
| S1, S2: Single; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| Rotate4Dex(@C1, @x, @SMatrix4); | |
| if DoJulia then | |
| begin | |
| mCopyVec(@J1, @JU1); | |
| J4 := Ju4; | |
| end | |
| else | |
| begin | |
| mCopyVec(@J1, @x); | |
| J4 := w; | |
| end; | |
| Rout := x*x + y*y + z*z + w*w; | |
| OTrap := Rout; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| S1 := PSingle(@nHybrid[0])^; | |
| S2 := PSingle(@nHybrid[1])^; | |
| repeat | |
| Rold := Rout; | |
| mCopyVec4(@Y1, @x); | |
| PVar := fHPVar[0]; | |
| fHybrid[0](x, y, z, w, PIteration3D); | |
| mCopyVec4(@x1, @x); | |
| mCopyVec4(@x, @Y1); | |
| PVar := fHPVar[1]; | |
| fHybrid[1](x, y, z, w, PIteration3D); | |
| XX := Sqrt(Sqr(x1[0]) + Sqr(x1[1]) + Sqr(x1[2]) + Sqr(x1[3])); | |
| YY := Sqrt(x*x + y*y + z*z + w*w); | |
| XX := XX * S1 + YY * S2; | |
| x := x1[0] * S1 + x * S2; | |
| y := x1[1] * S1 + y * S2; | |
| z := x1[2] * S1 + z * S2; | |
| w := x1[3] * S1 + w * S2; | |
| YY := XX / Sqrt(x*x + y*y + z*z + w*w + 1e-40); | |
| x := x * YY; | |
| y := y * YY; | |
| z := z * YY; | |
| w := w * YY; | |
| Inc(ItResultI); | |
| Rout := XX * XX; | |
| if Rout < OTrap then OTrap := Rout; | |
| until | |
| (ItResultI >= maxIt) or (Rout > RStop); | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, 0); | |
| end; | |
| end; | |
| function doInterpolHybridPas4DDE(PIteration3D: TPIteration3D): Double; | |
| var X1, Y1: TVec4D; | |
| XX, YY, DT, DD: Double; | |
| S1, S2: Single; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| Rotate4Dex(@C1, @x, @SMatrix4); | |
| if DoJulia then | |
| begin | |
| mCopyVec(@J1, @JU1); | |
| J4 := Ju4; | |
| end | |
| else | |
| begin | |
| mCopyVec(@J1, @x); | |
| J4 := w; | |
| end; | |
| Rout := x*x + y*y + z*z + w*w; | |
| OTrap := Rout; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| case (DEoption and $38) of | |
| 16: Deriv1 := Rout; | |
| 32: begin Deriv1 := 1; Deriv2 := 0; Deriv3 := 0; end; | |
| else Deriv1 := 1; | |
| end; | |
| S1 := PSingle(@nHybrid[0])^; | |
| S2 := PSingle(@nHybrid[1])^; | |
| repeat | |
| Rold := Rout; | |
| mCopyVec4(@Y1, @x); | |
| DT := Deriv1; | |
| PVar := fHPVar[0]; | |
| fHybrid[0](x, y, z, w, PIteration3D); | |
| mCopyVec4(@x1, @x); | |
| mCopyVec4(@x, @Y1); | |
| DD := Deriv1; | |
| Deriv1 := DT; | |
| PVar := fHPVar[1]; | |
| fHybrid[1](x, y, z, w, PIteration3D); | |
| XX := Sqrt(Sqr(x1[0]) + Sqr(x1[1]) + Sqr(x1[2]) + Sqr(x1[3])); | |
| YY := Sqrt(x*x + y*y + z*z + w*w); | |
| XX := XX * S1 + YY * S2; | |
| x := x1[0] * S1 + x * S2; | |
| y := x1[1] * S1 + y * S2; | |
| z := x1[2] * S1 + z * S2; | |
| w := x1[3] * S1 + w * S2; | |
| Deriv1 := Abs(DD) * S1 + Abs(Deriv1) * S2; | |
| YY := XX / Sqrt(x*x + y*y + z*z + w*w + 1e-40); | |
| x := x * YY; | |
| y := y * YY; | |
| z := z * YY; | |
| w := w * YY; | |
| Inc(ItResultI); | |
| Rout := XX * XX; | |
| if Rout < OTrap then OTrap := Rout; | |
| until | |
| (ItResultI >= maxIt) or (Rout > RStop); | |
| case DEoption and 7 of //and 38 = 32... | |
| 4: Result := Abs(z) * Ln(Abs(z)) / Deriv1; | |
| 7: Result := Sqrt(Rout / RStop) * Power(PDouble(Integer(PVar) - 16)^, -ItResultI); //Pvar does only work for single formula | |
| else Result := Sqrt(Rout) / Abs(Deriv1); //AmBox4D + IFS4D // / Intpower? | |
| end; | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, 0); | |
| end; | |
| end; | |
| function doHybridIFS3D(PIteration3D: TPIteration3D): Double; | |
| asm | |
| push eax | |
| push ebx | |
| push ecx | |
| push edx | |
| push esi | |
| push edi //x = esi-128 y = esi-120 .. btmp = esi+116 (eax+212) | |
| lea esi, eax + 88 | |
| movupd xmm0, [eax] | |
| movsd xmm1, [eax + 16] | |
| movupd [eax - 32], xmm0 //X=Cx | |
| movsd [eax - 16], xmm1 | |
| lea edx, esi + 128 | |
| cmp dword [esi + 64], 0 //DoJulia:+152 | |
| jz @sjup | |
| movupd xmm0, [edx + 104] //J=Ju +320 -88=+232 -128=104 | |
| movsd xmm1, [edx + 120] | |
| @sjup: | |
| movupd [eax + 24], xmm0 //J=C | |
| movsd [eax + 40], xmm1 | |
| @skipIfJulia: | |
| xor ebx, ebx //n:=0 | |
| mov eax, [esi + 296] | |
| mov [esi + 120], ebx //bFirstIt := 0; +208 | |
| mov [esi - 24], ebx //ItresultI:=0 +64 | |
| mov [esi - 36], eax //bIsInsideRender tmp in SmothIts | |
| movzx ebx, word [esi + 102] | |
| fldz | |
| fld d65535 //minDE ini | |
| fld1 | |
| fstp qword [esi + 112] //VaryScale: //+200 absScale, must be changed in formulas | |
| fstp qword [esi + TIteration3Dext.OTrap - 144] // 104 OTrap: Double; //+192 min of AbsScale | |
| fstp qword [edx + TIteration3Dext.Dfree1 - 144 - 128] //+248 +56 | |
| mov edi, [esi + ebx * 4 + 12] //fHPVar[0] +100 | |
| mov ecx, [esi + ebx * 4 - 12] //i:=nHybrid[0] +76 | |
| and ecx, $7FFFFFFF | |
| @Repeat: | |
| cmp ecx, 0 | |
| jnle @up2 | |
| @While: | |
| inc ebx | |
| cmp bx, word [esi + 62] //5 wEndTo: Word; //+150 | |
| jle @up3 | |
| movzx ebx, word [esi + 100] //n := iRepeatFrom //+188 | |
| @up3: | |
| mov ecx, [esi + ebx * 4 - 12] //i := nHybrid[n]; +76 | |
| and ecx, $7FFFFFFF | |
| jle @While | |
| mov edi, [esi + ebx * 4 + 12] //fHPVar:array[0..5] of Pointer; //+100 | |
| @up2: | |
| call [esi + ebx * 4 + 36] //fHybrid[0..5] of ThybridIteration2; //+124 | |
| dec ecx //Dec(i) | |
| cmp [esi + ebx * 4 - 12], 0 | |
| jl @Repeat | |
| movsd xmm0, [esi - 32] //DEout relative; Rout: Double; //+56 | |
| inc dword [esi - 24] //Inc(ItResultI) //+64 | |
| divsd xmm0, [esi + 112] //abs Scale VaryScale: Double; //+200 | |
| mov eax, [esi - 24] | |
| ucomisd xmm0, [esi + 104] // memorize the smallest DE for itresult | |
| jnc @skip | |
| lea edx, esi + 104 | |
| mov [esi + 124], eax // bTmp: Integer; //+212 | |
| fld qword [edx + TIteration3Dext.Dfree1 - 144-104] //+128 | |
| movsd [edx], xmm0 //result DE output | |
| fstp qword [edx + TIteration3Dext.Dfree2 - 144-104] //+136 | |
| cmp dword [esi - 36], 0 //was: +384 -88=296 bIsInsideRender | |
| js @skip //if outside, compare if DE is lower than minDE | |
| ucomisd xmm0, [esi - 128] //compare with RstopD, that contains the DEstop condition. Stop if nearer. | |
| jc @out | |
| @skip: | |
| cmp eax, [esi - 20] //maxIt: +68 | |
| jl @Repeat | |
| @out: | |
| fild dword [esi + 124] | |
| mov eax, [esi + 124] //it on minDE | |
| fstp dword [esi - 36] //SmoothItD: Single; //+52 | |
| mov [esi - 24], eax //ItResultI | |
| add esi, 104 | |
| fld qword [esi] //MinDE in OTrap | |
| fld qword [esi + 32] //Dfree2 | |
| fstp qword [esi] //OTrap | |
| pop edi | |
| pop esi | |
| pop edx | |
| pop ecx | |
| pop ebx | |
| pop eax | |
| end; | |
| function doHybridIFS3DnoVecIni(PIteration3D: TPIteration3D): Double; //to use behind common fractals, use the new vec for it | |
| asm | |
| push eax | |
| push ebx | |
| push ecx | |
| push edx | |
| push esi | |
| push edi //x = esi-128 y = esi-120 .. btmp = esi+116 (eax+212) | |
| lea esi, eax + 88 // | |
| xor ebx, ebx //n:=0 | |
| mov eax, [esi + 296] | |
| mov [esi + 120], ebx //bFirstIt := 0; +208 | |
| mov [esi + 124], ebx | |
| mov [esi - 24], ebx //ItresultI:=0 +64 | |
| mov [esi - 36], eax //bIsInsideRender tmp in SmothIts | |
| movzx ebx, word [esi + 102] //n := iStartFrom | |
| fldz | |
| fld d65535 //minDE ini | |
| fld1 | |
| fstp qword [esi + 112] //VaryScale: //+200 absScale, must be changed in formulas | |
| fstp qword [esi + TIteration3Dext.OTrap - 144] // 104 OTrap: Double; //+192 min of AbsScale | |
| fstp qword [esi + TIteration3Dext.Dfree1 - 144] //+248 +56 | |
| // fstp qword [esi + TIteration3Dext.Dfree2 - 144] //+248 +56 | |
| mov edi, [esi + ebx * 4 + 12] //fHPVar[0] +100 | |
| mov ecx, [esi + ebx * 4 - 12] //i:=nHybrid[n] +76 | |
| and ecx, $7FFFFFFF | |
| @Repeat: | |
| cmp ecx, 0 | |
| jnle @up2 | |
| @While: | |
| inc ebx | |
| cmp bx, word [esi + 62] //5 wEndTo: Word; //+150 | |
| jle @up3 | |
| movzx ebx, word [esi + 100] //n := iRepeatFrom //+188 | |
| @up3: | |
| mov ecx, [esi + ebx * 4 - 12] //i := nHybrid[n]; +76 | |
| and ecx, $7FFFFFFF | |
| jle @While | |
| mov edi, [esi + ebx * 4 + 12] //fHPVar:array[0..5] of Pointer; //+100 | |
| @up2: | |
| call [esi + ebx * 4 + 36] //fHybrid[0..5] of ThybridIteration2; //+124 | |
| dec ecx //Dec(i) | |
| cmp [esi + ebx * 4 - 12], 0 | |
| jl @Repeat | |
| movsd xmm0, [esi - 32] //DEout relative; Rout: Double; //+56 | |
| inc dword [esi - 24] //Inc(ItResultI) //+64 | |
| divsd xmm0, [esi + 112] //abs Scale VaryScale: Double; //+200 | |
| mov eax, [esi - 24] | |
| ucomisd xmm0, [esi + 104] // memorize the smallest DE for itresult | |
| jnc @skip | |
| lea edx, esi + 104 | |
| mov [esi + 124], eax // bTmp: Integer; //+212 | |
| fld qword [edx + TIteration3Dext.Dfree1 - 144-104] //+128 otrap color option | |
| movsd [edx], xmm0 //result DE output | |
| fstp qword [edx + TIteration3Dext.Dfree2 - 144-104] //+136 | |
| cmp dword [esi - 36], 0 //was: +384 -88=296 bIsInsideRender | |
| jne @skip //if outside, compare if DE is lower than minDE | |
| ucomisd xmm0, [esi - 128] //compare with RstopD, that contains the DEstop condition. Stop if nearer. | |
| jc @out | |
| @skip: | |
| cmp eax, [esi - 20] //maxIt: +68 | |
| jl @Repeat | |
| @out: | |
| fild dword [esi + 124] | |
| mov eax, [esi + 124] //it on minDE | |
| fstp dword [esi - 36] //SmoothItD: Single; //+52 | |
| mov [esi - 24], eax //ItResultI | |
| add esi, 104 | |
| fld qword [esi] //MinDE in OTrap | |
| fld qword [esi + 32] //Dfree2 | |
| fstp qword [esi] //OTrap | |
| pop edi | |
| pop esi | |
| pop edx | |
| pop ecx | |
| pop ebx | |
| pop eax | |
| end; | |
| procedure CalcSmoothIterations(PIt3D: TPIteration3D; n: Integer); | |
| {var d: Double; | |
| begin | |
| if PIt3D.Rout <= 1 then | |
| PIt3D.SmoothItD := PIt3D.ItResultI | |
| else if PIt3D.Rold < 1 then | |
| PIt3D.SmoothItD := PIt3D.ItResultI + PIt3D.LNRStop - Ln(0.5 * Ln(PIt3D.Rout)) * PIt3D.fHln[n] | |
| else | |
| begin | |
| d := Ln(0.5 * Ln(PIt3D.Rout)); | |
| PIt3D.SmoothItD := PIt3D.ItResultI + (PIt3D.LNRStop - d) / (d - Ln(0.5 * Ln(PIt3D.Rold))); | |
| end; // } | |
| asm | |
| add eax, $34 | |
| cmp dword [eax + TIteration3D.Rout + 4 - $34], $3FF00000 //Rout <= 1? [Rout+4] //+$3c cmp with $3FF0.. does not work always!!! | |
| jg @@1 | |
| fild dword [eax + TIteration3D.ItResultI - $34] //+$40 | |
| fstp dword [eax + TIteration3D.SmoothItD - $34] //+$34 | |
| ret | |
| @@1: | |
| fld qword [eax + TIteration3D.Rout - $34] //+$38 Rout | |
| cmp dword [eax + TIteration3Dext.Rold - 56 + 4 - $34], $3FF00000 //Rold <= 1? -$2c | |
| jnb @@2 | |
| fldln2 | |
| fxch //Rout,ln | |
| fyl2x | |
| fmul s05 //ln(Rout)*0.5 | |
| fldln2 | |
| fxch | |
| fyl2x | |
| fmul dword [eax + edx * 4 + TIteration3D.fHln - $34] // PIt3D.fHln[n] +$00a4 | |
| fild dword [eax + TIteration3D.ItResultI - $34] //+$40 | |
| fadd dword [eax + TIteration3D.LNRStop - $34] //+$009c | |
| fsubrp | |
| fstp dword [eax + TIteration3D.SmoothItD - $34] //+$34 | |
| ret | |
| @@2: | |
| fldln2 | |
| fxch | |
| fyl2x //ln(Rout) | |
| fmul s05 | |
| fldln2 | |
| fxch | |
| fyl2x //d | |
| fldln2 //ln2,d | |
| fld qword [eax + TIteration3Dext.Rold - 56 - $34] //Rold,ln2,d | |
| fyl2x | |
| fmul s05 | |
| fldln2 | |
| fxch | |
| fyl2x | |
| fsubr st, st(1) //d - Ln(0.5 * Ln(PIt3D.Rold)), d | |
| fld dword [eax + TIteration3D.LNRStop - $34] //+$009c | |
| fsubrp st(2), st //d - Ln(0.5 * Ln(PIt3D.Rold)), PIt3D.LNRStop - d | |
| fadd d1em100 //test | |
| fdivp //div0 sometimes | |
| fiadd dword [eax + TIteration3D.ItResultI - $34] //+$40 | |
| fstp dword [eax + TIteration3D.SmoothItD - $34] //+$34 | |
| end; | |
| procedure doHybridPas(PIteration3D: TPIteration3D); //new ext version | |
| var n: Integer; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| if DoJulia then mCopyVec(@J1, @JU1) else mCopyVec(@J1, @C1); | |
| mCopyVec(@x, @C1); | |
| w := 0; | |
| Rout := x * x + y * y + z * z; | |
| OTrap := Rout; | |
| n := iStartFrom; | |
| bTmp := nHybrid[n] and $7FFFFFFF; | |
| PVar := fHPVar[n]; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| repeat | |
| Rold := Rout; | |
| while bTmp <= 0 do | |
| begin | |
| Inc(n); | |
| if n > EndTo then n := iRepeatFrom; | |
| bTmp := nHybrid[n] and $7FFFFFFF; | |
| if bTmp > 0 then PVar := fHPVar[n]; | |
| end; | |
| fHybrid[n](x, y, z, w, PIteration3D); | |
| Dec(bTmp); | |
| if nHybrid[n] < 0 then Continue else | |
| begin | |
| Inc(ItResultI); | |
| Rout := x * x + y * y + z * z; | |
| if Rout < OTrap then OTrap := Rout; | |
| end; | |
| until (ItResultI >= maxIt) or (Rout > RStop); | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, n); | |
| end; | |
| end; | |
| function doHybrid4DDEPas(PIteration3D: TPIteration3D): Double; | |
| var n: Integer; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| Rotate4Dex(@C1, @x, @SMatrix4); | |
| if DoJulia then | |
| begin | |
| mCopyVec(@J1, @JU1); | |
| J4 := Ju4; | |
| end | |
| else | |
| begin | |
| mCopyVec(@J1, @x); | |
| J4 := w; | |
| end; | |
| Rout := x*x + y*y + z*z + w*w; | |
| case (DEoption and $38) of | |
| 16: Deriv1 := Rout; | |
| 32: begin Deriv1 := 1; Deriv2 := 0; Deriv3 := 0; end; | |
| else Deriv1 := 1; | |
| end; | |
| OTrap := Rout; | |
| n := iStartFrom; | |
| bTmp := nHybrid[n] and $7FFFFFFF; | |
| PVar := fHPVar[n]; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| repeat | |
| Rold := Rout; | |
| while bTmp <= 0 do | |
| begin | |
| Inc(n); | |
| if n > EndTo then n := iRepeatFrom; | |
| bTmp := nHybrid[n] and $7FFFFFFF; | |
| if bTmp > 0 then PVar := fHPVar[n]; | |
| end; | |
| fHybrid[n](x, y, z, w, PIteration3D); //todo: parse 3d DEs deriv1 to w and back | |
| Dec(bTmp); | |
| if nHybrid[n] >= 0 then | |
| begin | |
| Inc(ItResultI); | |
| Rout := (x * x + y * y + z * z + w * w); | |
| if Rout < OTrap then OTrap := Rout; | |
| end; | |
| until | |
| (ItResultI >= maxIt) or (Rout > RStop); | |
| case DEoption and 7 of | |
| 4: Result := Abs(z) * Ln(Abs(z)) / Deriv1; | |
| 7: Result := Sqrt(Rout / RStop) * Power(PDouble(Integer(PVar) - 16)^, -ItResultI); //Pvar does only work for single formula | |
| else Result := Sqrt(Rout) / Abs(Deriv1); //AmBox4D + IFS4D | |
| end; | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, n); | |
| end; | |
| end; | |
| procedure doHybrid4DPas(PIteration3D: TPIteration3D); | |
| var n: Integer; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin //eax, edx, ecx | |
| Rotate4Dex(@C1, @x, @SMatrix4); | |
| if DoJulia then | |
| begin | |
| mCopyVec(@J1, @JU1); | |
| J4 := Ju4; | |
| end | |
| else | |
| begin | |
| mCopyVec(@J1, @x); | |
| // w := w + dWadd4dstep; //test: 4d projection, stepping with w add parameter | |
| J4 := w; | |
| end; | |
| Rout := x*x + y*y + z*z + w*w; | |
| OTrap := Rout; | |
| n := iStartFrom; | |
| bTmp := nHybrid[n] and $7FFFFFFF; | |
| PVar := fHPVar[n]; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| repeat | |
| Rold := Rout; | |
| while bTmp <= 0 do | |
| begin | |
| Inc(n); | |
| if n > EndTo then n := iRepeatFrom; | |
| bTmp := nHybrid[n] and $7FFFFFFF; | |
| if bTmp > 0 then PVar := fHPVar[n]; | |
| end; | |
| fHybrid[n](x, y, z, w, PIteration3D); | |
| Dec(bTmp); | |
| if nHybrid[n] >= 0 then | |
| begin | |
| Inc(ItResultI); //test: abs( + + - ); minkowski | |
| Rout := x * x + y * y + z * z + w * w; | |
| if Rout < OTrap then OTrap := Rout; | |
| end; | |
| until | |
| (ItResultI >= maxIt) or (Rout > RStop); | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, n); | |
| end; | |
| end; | |
| procedure doHybrid4DSSE2(PIteration3D: TPIteration3D); //new ext version | |
| asm | |
| push eax | |
| push ebx | |
| push ecx | |
| push edx | |
| push esi | |
| push edi //x = edi-32 y = edi-24 .. Rold = edi - 48, Rstop = edi - 40, i = edi + 212 = btmp = esi - 44 | |
| mov edi, eax | |
| lea esi, eax + 256 | |
| lea edx, edi -32 | |
| mov ecx, esi | |
| call Rotate4Dex //(@C1, @x, SMatrix4); C1=It3D=eax | |
| movupd xmm6, [edi - 32] | |
| movupd xmm7, [edi - 16] | |
| cmp dword [esi - 104], 0 //DoJulia:+152 | |
| jz @sjup | |
| movupd xmm2, [esi + 64] | |
| movupd xmm3, [esi + 80] | |
| movupd [edi + 24], xmm2 //J=Ju | |
| movlpd [edi + 40], xmm3 | |
| movhpd [edi - 56], xmm3 | |
| jmp @skipIfJulia | |
| @sjup: | |
| movupd [edi + 24], xmm6 //J=C | |
| movlpd [edi + 40], xmm7 | |
| movhpd [edi - 56], xmm7 //J4 = edi - 56 | |
| @skipIfJulia: | |
| mulpd xmm6, xmm6 | |
| mulpd xmm7, xmm7 | |
| CVTSS2SD xmm5, [edi + 72] //RStop in double | |
| addpd xmm7, xmm6 | |
| pshufd xmm6, xmm7, $4E | |
| movsd [edi - 40], xmm5 | |
| addsd xmm7, xmm6 //xmm7=Rout | |
| movsd [esi - 64], xmm7 //OTrap=Rout | |
| movsd [edi + 56], xmm7 //Rout | |
| xor ebx, ebx //n:=0 | |
| mov [esi - 48], ebx //bFirstIt := 0; +208 | |
| mov [edi + 64], ebx //ItresultI:=0 +64 | |
| movzx ebx, word [esi - 66] //n:=iStartFrom | |
| mov eax, [edi + ebx * 4 + 100] //fHPVar[0] +100 | |
| mov [edi + 48], eax //PVars: +48 | |
| mov eax, [edi + ebx * 4 + 76] //i:=nHybrid[0] +76 | |
| and eax, $7FFFFFFF | |
| mov [esi - 44], eax //i(=It3D.btmp) | |
| @Repeat: | |
| movsd [edi - 48], xmm7 //Rold := Rout | |
| cmp dword [esi - 44], 0 | |
| jnle @up2 | |
| @While: | |
| inc ebx | |
| cmp bx, word [esi - 106] //5 wEndTo: Word; //+150 | |
| jle @up3 | |
| movzx ebx, word [esi - 68] //n := iRepeatFrom | |
| @up3: | |
| mov eax, [edi + ebx * 4 + 76] //i := nHybrid[n]; +76 | |
| and eax, $7FFFFFFF | |
| jle @While | |
| mov [esi - 44], eax | |
| mov eax, [edi + ebx * 4 + 100] //fHPVar:array[0..5] of Pointer; | |
| mov [edi + 48], eax //PVars: +48 | |
| @up2: | |
| lea eax, edi - 8 //was: esp + 24 w | |
| push eax | |
| push edi | |
| lea edx, edi - 24 //was: esp + 16 y | |
| lea ecx, edi - 16 //was: esp + 24 z | |
| add eax, -24 // x | |
| call [edi + ebx * 4 + 124] //fHybrid[0..5] of ThybridIteration2; //+124 | |
| dec [esi - 44] //Dec(i) write at addr... false dIFS?? | |
| cmp [edi + ebx * 4 + 76], 0 //nHybrid[fnr] | |
| jl @Repeat //SkipMaxItTest | |
| movupd xmm6, [edi - 32] | |
| movupd xmm7, [edi - 16] | |
| mulpd xmm6, xmm6 | |
| mulpd xmm7, xmm7 | |
| addpd xmm7, xmm6 | |
| pshufd xmm6, xmm7, $4E | |
| addsd xmm7, xmm6 //xmm7=Rout | |
| movsd xmm5, xmm7 | |
| minsd xmm5, qword [esi - 64] | |
| movsd [edi + 56], xmm7 //Rout | |
| movsd [esi - 64], xmm5 //OTrap | |
| inc dword [edi + 64] //Inc(ItResultI) | |
| mov eax, [edi + 64] | |
| cmp eax, [edi + 68] //maxIt: +68 | |
| jnl @out | |
| comisd xmm7, [edi - 40] //RStop | |
| jc @Repeat | |
| @out: | |
| cmp byte [esi - 108], 0 //CalcSIT: +148 | |
| jz @NoCalcSITout | |
| mov eax, edi | |
| mov edx, ebx | |
| call CalcSmoothIterations //(PIt3D: TPIteration3D; n: Integer); | |
| @NoCalcSITout: | |
| pop edi | |
| pop esi | |
| pop edx | |
| pop ecx | |
| pop ebx | |
| pop eax | |
| end; | |
| function doHybridPasDE(PIteration3D: TPIteration3D): Double; //new ext version | |
| var n: Integer; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin | |
| if DoJulia then mCopyVec(@J1, @JU1) else mCopyVec(@J1, @C1); | |
| mCopyVec(@x, @C1); | |
| Rout := x * x + y * y + z * z; | |
| OTrap := Rout; | |
| n := iStartFrom; | |
| btmp := nHybrid[n] and $7FFFFFFF; | |
| PVar := fHPVar[n]; | |
| case (DEoption and $38) of | |
| 16: w := Rout; | |
| 32: begin Deriv1 := 1; Deriv2 := 0; Deriv3 := 0; end; | |
| else w := 1; | |
| end; | |
| bFirstIt := 0; | |
| ItResultI := 0; | |
| repeat | |
| Rold := Rout; | |
| while btmp <= 0 do | |
| begin | |
| Inc(n); | |
| if n > EndTo then n := iRepeatFrom; | |
| btmp := nHybrid[n] and $7FFFFFFF; | |
| PVar := fHPVar[n]; | |
| end; | |
| fHybrid[n](x, y, z, w, PIteration3D); //access violation with new formulaclass sometimes | |
| Dec(btmp); | |
| if nHybrid[n] >= 0 then | |
| begin | |
| Inc(ItResultI); | |
| Rout := x * x + y * y + z * z; | |
| if Rout < OTrap then OTrap := Rout; | |
| end; | |
| until | |
| (ItResultI >= maxIt) or (Rout > RStop); | |
| if (DEoption and $38) = 32 then | |
| Result := Sqrt(Rout) * 0.5 * Ln(Rout) / Deriv1 | |
| else | |
| case DEoption and 7 of | |
| 4: Result := Abs(y) * Ln(Abs(y)) / w; //Julia? | |
| 7: Result := Sqrt(Rout / RStop) * Power(PDouble(Integer(PVar) - 16)^, -ItResultI); //Bulb, not really working | |
| else Result := Sqrt(Rout) / Abs(w); //AmBox + IFS | |
| end; | |
| if CalcSIT then CalcSmoothIterations(PIteration3D, n); | |
| end; | |
| end; | |
| procedure doHybridSSE2(PIteration3D: TPIteration3D); //new ext version | |
| asm | |
| push eax | |
| push ebx | |
| push ecx | |
| push edx | |
| push esi | |
| push edi //x = edi-32 y = edi-24 .. Rold = edi - 48, Rstop = edi - 40, (i = edi + 212 = btmp = esi - 44) | |
| mov edi, eax // = [edi - 32] | |
| lea esi, eax + 256 | |
| movupd xmm6, [edi] //Iteration3D by calcMissed not aligned16?! | |
| movsd xmm7, [edi + 16] | |
| movupd [edi - 32], xmm6 //X=C | |
| movupd [edi - 16], xmm7 | |
| cmp dword [esi - 104], 0 //DoJulia:+152 | |
| jz @sjup | |
| movupd xmm2, [esi + 64] | |
| movsd xmm3, [esi + 80] | |
| movupd [edi + 24], xmm2 //J=Ju | |
| movsd [edi + 40], xmm3 | |
| jmp @skipIfJulia | |
| @sjup: | |
| movupd [edi + 24], xmm6 //J=C | |
| movsd [edi + 40], xmm7 | |
| @skipIfJulia: | |
| mulpd xmm6, xmm6 | |
| mulsd xmm7, xmm7 | |
| CVTSS2SD xmm5, [edi + 72] //RStop in double | |
| addsd xmm7, xmm6 | |
| shufpd xmm6, xmm6, 1 | |
| movsd [edi - 40], xmm5 | |
| addsd xmm7, xmm6 //xmm7=Rout | |
| movsd [esi - 64], xmm7 //OTrap=Rout | |
| movsd [edi + 56], xmm7 //Rout | |
| xor ebx, ebx | |
| mov [esi - 48], ebx //bFirstIt := 0; +208 | |
| mov [edi + 64], ebx //ItresultI:=0 +64 | |
| movzx ebx, word [esi - 66] //n := iStartFrom | |
| mov eax, [edi + ebx * 4 + 100] //fHPVar[0] +100 | |
| mov [edi + 48], eax //PVars: +48 | |
| mov eax, [edi + ebx * 4 + 76] //i:=nHybrid[0] +76 | |
| and eax, $7FFFFFFF | |
| mov [esi - 44], eax //btmp | |
| @Repeat: | |
| movsd [edi - 48], xmm7 //Rold := Rout | |
| cmp dword [esi - 44], 0 | |
| jnle @up2 | |
| @While: | |
| inc ebx | |
| cmp bx, word [esi - 106] //5 wEndTo: Word; //+150 | |
| jle @up3 | |
| movzx ebx, word [esi - 68] //n := iRepeatFrom | |
| @up3: | |
| mov eax, [edi + ebx * 4 + 76] //i := nHybrid[n]; +76 | |
| and eax, $7FFFFFFF | |
| jle @While | |
| mov [esi - 44], eax //was btmp, now own var | |
| mov eax, [edi + ebx * 4 + 100] //fHPVar:array[0..5] of Pointer; | |
| mov [edi + 48], eax //PVars: +48 | |
| @up2: | |
| lea eax, edi - 8 // w | |
| push eax | |
| push edi | |
| lea edx, edi - 24 | |
| lea ecx, edi - 16 | |
| add eax, -24 | |
| call [edi + ebx * 4 + 124] //fHybrid[0..5] of ThybridIteration2; //+124 fp overflow: it3dex.z > 1eXXX ! | |
| dec [esi - 44] //Dec(i) | |
| cmp [edi + ebx * 4 + 76], 0 | |
| jl @Repeat //SkipMaxItTest | |
| movupd xmm6, [edi - 32] | |
| movupd xmm7, [edi - 16] | |
| mulpd xmm6, xmm6 | |
| mulsd xmm7, xmm7 //4D: mulpd | |
| addsd xmm7, xmm6 //4D: addpd | |
| shufpd xmm6, xmm6, 1 //4D: pshufd xmm6, xmm7, $4E | |
| addsd xmm7, xmm6 //xmm7=Rout | |
| movsd xmm5, xmm7 | |
| minsd xmm5, qword [esi - 64] | |
| movsd [edi + 56], xmm7 //Rout | |
| movsd [esi - 64], xmm5 //OTrap | |
| inc dword [edi + 64] //Inc(ItResultI) | |
| mov eax, [edi + 64] | |
| cmp eax, [edi + 68] //maxIt: +68 | |
| jnl @out | |
| comisd xmm7, [edi - 40] //RStop | |
| jc @Repeat | |
| @out: | |
| cmp byte [esi - 108], 0 //CalcSIT: +148 | |
| jz @NoCalcSITout | |
| mov eax, edi | |
| mov edx, ebx | |
| call CalcSmoothIterations //(PIt3D: TPIteration3D; n: Integer); | |
| @NoCalcSITout: | |
| pop edi | |
| pop esi | |
| pop edx | |
| pop ecx | |
| pop ebx | |
| pop eax | |
| end; | |
| function doHybridDESSE2(PIteration3D: TPIteration3D): Double; //result in st(0) new ext version | |
| asm | |
| push eax | |
| push ebx | |
| push ecx | |
| push edx | |
| push esi | |
| push edi //x = edi-32 y = edi-24 .. Rold = edi - 48, Rstop = edi - 40, (i = edi + 212 = btmp = esi - 44) | |
| mov edi, eax | |
| lea esi, eax + 256 | |
| movupd xmm6, [edi] //Iteration3D by calcMissed not aligned16?! | |
| movsd xmm7, [edi + 16] | |
| movupd [edi - 32], xmm6 //X=C | |
| movupd [edi - 16], xmm7 | |
| cmp dword [esi - 104], 0 //DoJulia:+152 | |
| jz @sjup | |
| movupd xmm2, [esi + 64] | |
| movsd xmm3, [esi + 80] | |
| movupd [edi + 24], xmm2 //J=Ju | |
| movsd [edi + 40], xmm3 | |
| jmp @skipIfJulia | |
| @sjup: | |
| movupd [edi + 24], xmm6 //J=C | |
| movsd [edi + 40], xmm7 | |
| @skipIfJulia: | |
| mulpd xmm6, xmm6 | |
| mulsd xmm7, xmm7 | |
| CVTSS2SD xmm5, [edi + 72] //RStop in double | |
| addsd xmm7, xmm6 | |
| shufpd xmm6, xmm6, 1 | |
| movsd [edi - 40], xmm5 | |
| addsd xmm7, xmm6 //xmm7=Rout | |
| movsd [esi - 64], xmm7 //OTrap=Rout | |
| movsd [edi + 56], xmm7 //Rout | |
| movsd [edi - 48], xmm7 //Rold := Rout | |
| xor ebx, ebx //n:=0 | |
| mov [edi + 208], ebx //mov [esi - 48], ebx //bFirstIt := 0; +208 | |
| mov [edi + 64], ebx //ItresultI:=0 +64 | |
| movzx ebx, word [esi - 66] //n := iStartFrom | |
| mov eax, [edi + ebx * 4 + 100] //fHPVar[n] +100 | |
| mov [edi + 48], eax //PVars: +48 | |
| mov eax, [edi + ebx * 4 + 76] //i:=nHybrid[n] +76 | |
| and eax, $7FFFFFFF | |
| mov [esi - 44], eax | |
| mov eax, [esi - 96] //DEoption +160 | |
| and eax, $38 // case (DEoption and $38) of | |
| sub eax, 16 | |
| jnz @UU1 | |
| fld qword [edi + 56] // 16: w := Rout; | |
| jmp @UU2 | |
| @UU1: | |
| sub eax, 16 | |
| jnz @UU | |
| fld1 | |
| fstp qword [esi - 24] // deriv1 | |
| fldz // 32: begin Deriv1 := 1; Deriv2 := 0; Deriv3 := 0; end; | |
| fst qword [esi - 16] | |
| fst qword [esi - 8] | |
| jmp @UU2 | |
| @UU: | |
| fld1 // else w := 1; | |
| @UU2: | |
| fstp qword [edi - 8] //w := Rout,1,0 | |
| @Repeat: | |
| movsd [edi - 48], xmm7 //Rold := Rout | |
| cmp dword [esi - 44], 0 | |
| jnle @up2 | |
| @While: | |
| inc ebx | |
| // cmp ebx, 5 | |
| cmp bx, word [esi - 106] //5 wEndTo: Word; //+150 | |
| jle @up3 | |
| movzx ebx, word [esi - 68] //n := iRepeatFrom | |
| @up3: | |
| mov eax, [edi + ebx * 4 + 76] //i := nHybrid[n]; +76 | |
| and eax, $7FFFFFFF | |
| jle @While | |
| mov [esi - 44], eax | |
| mov eax, [edi + ebx * 4 + 100] //fHPVar:array[0..5] of Pointer; | |
| mov [edi + 48], eax //PVars: +48 | |
| @up2: | |
| lea eax, edi - 8 //was: esp + 24 w | |
| push eax | |
| push edi | |
| lea edx, edi - 24 //was: esp + 16 y | |
| lea ecx, edi - 16 //was: esp + 24 z | |
| add eax, -24 // x | |
| call [edi + ebx * 4 + 124] //fHybrid[0..5] of ThybridIteration2; //+124 error in called function sometimes!!! | |
| dec [esi - 44] //Dec(i) //Write off...??? bug in call... of mandbox or menger??! abox as testhybrid! esi has changed? | |
| cmp [edi + ebx * 4 + 76], 0 | |
| jl @Repeat //SkipMaxItTest | |
| movupd xmm6, [edi - 32] | |
| movupd xmm7, [edi - 16] | |
| mulpd xmm6, xmm6 | |
| mulsd xmm7, xmm7 | |
| addsd xmm7, xmm6 | |
| shufpd xmm6, xmm6, 1 | |
| addsd xmm7, xmm6 //xmm7=Rout | |
| movsd xmm5, xmm7 | |
| minsd xmm5, qword [esi - 64] | |
| movsd [edi + 56], xmm7 //Rout | |
| movsd [esi - 64], xmm5 //OTrap | |
| inc dword [edi + 64] //Inc(ItResultI) | |
| mov eax, [edi + 64] | |
| cmp eax, [edi + 68] //maxIt: +68 | |
| jnl @out | |
| comisd xmm7, [edi - 40] //RStop | |
| jc @Repeat | |
| @out: | |
| mov eax, [esi - 96] //DEoption +160 if (DEoption and $38) = 32 then | |
| and eax, 38 | |
| sub eax, 32 | |
| jnz @JU1 | |
| fld qword [edi + 56] //rout Result := Sqrt(Rout) * 0.5 * Ln(Rout) / RoutDeriv | |
| fldln2 | |
| fld st(1) //rout,ln2,rout | |
| fyl2x //ln(rout),rout | |
| fxch | |
| fsqrt | |
| fmulp | |
| fmul cs05 | |
| fdiv qword [esi - 24] //Deriv1 | |
| jmp @UU6 | |
| @JU1: | |
| mov eax, [esi - 96] //DEoption +160 | |
| and eax, 7 | |
| sub eax, 4 | |
| jnz @UU3 //Result := Abs(X3) * Ln(Abs(X3)) / X4; | |
| fld qword [edi - 16] //X3 | |
| fabs | |
| fldln2 | |
| fld st(1) //absX3,ln2,absX3 | |
| fyl2x //ln(absX3),absX3 | |
| fmulp | |
| fdiv qword [edi - 8] //Result | |
| jmp @UU6 | |
| @UU3: | |
| sub eax, 3 | |
| jnz @UU4 //Result := Sqrt(Rout/RStop) * Power(PDouble(Integer(PVar) - 16)^, -ItResultI); | |
| mov eax, [edi + 48] | |
| fild dword [edi + 64] //ItResultI | |
| fchs //-ItresultI | |
| fld [eax - 16] //(Pvar-16)^ (= scale or something) | |
| fldln2 //power function x,pow | |
| fxch | |
| fyl2x | |
| fxch | |
| fmulp | |
| fldl2e | |
| fmulp | |
| fld st(0) | |
| frndint | |
| fsub st(1), st(0) | |
| fxch | |
| f2xm1 | |
| fld1 | |
| faddp | |
| fscale | |
| fstp st(1) //end of power function | |
| fld qword [edi + 56] | |
| fdiv dword [edi + 72] //rout/rstop,pow | |
| fsqrt | |
| fmulp | |
| jmp @UU6 | |
| @UU4: // else Result := Sqrt(Rout) / Abs(X4); | |
| fld qword [edi + 56] | |
| fsqrt | |
| fld qword [edi - 8] | |
| fabs | |
| fdivp | |
| @UU6: | |
| cmp byte [esi - 108], 0 //CalcSIT: +148 | |
| jz @NoCalcSITout | |
| mov eax, edi | |
| mov edx, ebx | |
| call CalcSmoothIterations //(PIt3D: TPIteration3D; n: Integer); | |
| @NoCalcSITout: | |
| pop edi | |
| pop esi | |
| pop edx | |
| pop ecx | |
| pop ebx | |
| pop eax | |
| end; | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| procedure HybridItTricorn(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi | |
| push edi | |
| fld qword [edx] | |
| fld st(0) | |
| fmul st(0), st(1) // y*y, y | |
| fld qword [eax] // x, y*y, y | |
| mov esi, [ebp + 8] // PIteration3D | |
| fld st(0) // x, x, y*y, y | |
| fmul st(0), st(1) // x*x, x, y*y, y | |
| fld qword [ecx] // z, x*x, x, y*y, y | |
| fld st(0) | |
| mov edi, [esi + 48] | |
| fmul st(0), st(1) // z*z, z, x*x, x, y*y, y | |
| faddp st(4), st(0) // z, x*x, x, y*y+z*z, y | |
| fmul st(0), st(2) // z*x, x*x, x, y*y+z*z, y | |
| fmul qword [edi - 16] | |
| fld qword [esi + 40] | |
| fmul qword [edi - 24] | |
| faddp | |
| fstp qword [ecx] // x*x, x, y*y+z*z, y | |
| fsubrp st(2), st(0) // x, x*x-y*y-z*z, y | |
| fmulp st(2), st(0) // x*x-y*y-z*z, y*x | |
| fadd qword [esi + 24] | |
| fstp qword [eax] // y*x | |
| fadd st(0), st(0) | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| pop edi | |
| pop esi | |
| end; | |
| {procedure HybridItTricorn(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| var xt: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| xt := x; | |
| x := x * x - y * y - z * z + J1; | |
| y := 2 * xt * y + J2; | |
| z := dOption1 * xt * z + J3; | |
| end; | |
| end;} | |
| procedure HybridQuat(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| var xt, yt, zt: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| xt := x; //orig | |
| yt := y; | |
| zt := z; | |
| x := x * x - y * y - z * z - w * w + J1; | |
| y := 2 * (y * xt + z * w) + J2; | |
| z := 2 * (z * xt + PDouble(Integer(PVar) - 16)^ * yt * w) + J3; | |
| w := 2 * (w * xt + yt * zt) + PDouble(Integer(PVar) - 24)^ | |
| + PDouble(Integer(PIteration3D) - 56)^; | |
| end; | |
| end; | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| procedure HybridQuatSSE2(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] | |
| mov edi, [esi + 48] //PVars | |
| movupd xmm0, [eax] //x,y | |
| movupd xmm1, [ecx] //z,w | |
| movapd xmm6, xmm0 //x,y | |
| movapd xmm5, xmm1 //z,w | |
| movapd xmm3, xmm1 //z,w | |
| xorpd xmm4, xmm4 //0,0 | |
| mulpd xmm6, xmm6 //xx,yy | |
| mulpd xmm5, xmm5 //zz,ww | |
| movupd xmm2, [edx] //y,z | |
| subsd xmm4, xmm5 //-zz | |
| shufpd xmm3, xmm0, 1 //w,x | |
| shufpd xmm4, xmm5, 2 //-zz, ww | |
| mulpd xmm2, xmm0 //yx, zy | |
| addpd xmm4, xmm6 //xx-zz, yy+ww | |
| mulpd xmm0, xmm1 //xz, yw | |
| mulpd xmm3, xmm1 //wz, xw | |
| pshufd xmm6, xmm0, $4E //yw, xz | |
| pshufd xmm1, xmm4, $4E //yy+ww, xx-zz | |
| mulsd xmm6, [edi - 16] //ywMul, xz | |
| addpd xmm2, xmm3 //yx+wz, zy+xw -> y, w | |
| addsd xmm6, xmm0 //ywMul + xz -> z | |
| subpd xmm4, xmm1 //xx-zz-yy-ww -> x | |
| addpd xmm2, xmm2 //y,w | |
| addsd xmm6, xmm6 //z | |
| shufpd xmm2, xmm2, 1 //w, y | |
| movupd xmm5, [esi + 24] //J1,J2 | |
| addsd xmm2, [edi - 24] | |
| addsd xmm2, [esi - 56] //+J4 | |
| shufpd xmm6, xmm2, 0 //z, w | |
| shufpd xmm4, xmm2, 2 //x, y | |
| addsd xmm6, [esi + 40] //+J3 | |
| addpd xmm4, xmm5 //+J1,2 | |
| movupd [eax], xmm4 | |
| movupd [ecx], xmm6 | |
| pop edi | |
| pop esi | |
| end; | |
| procedure HybridItIntPow2(var x, y, z, w: Double; PIteration3D: TPIteration3D); //sine bulb | |
| asm | |
| push esi | |
| push edi | |
| fld qword [ecx] | |
| fld qword [edx] | |
| fld qword [eax] //x,y,z | |
| mov esi, [ebp + 8] //PIteration3D | |
| fld st(1) //y,x,y,z | |
| fmul st(0), st(2) // y*y,x,y,z | |
| fld st(1) // x,y*y,x,y,z | |
| fmul st(0), st(2) // x*x, y*y,x,y,z | |
| fld st(0) // x*x, x*x, y*y,x,y,z | |
| fadd st(0), st(2) // xx+yy, xx, yy,x,y,z | |
| fld st(0) // xx+yy, xx+yy, xx, yy,x,y,z | |
| fsqrt | |
| mov edi, [esi + 48] | |
| fmul qword [edi - 16] //*dOption1=Zmul | |
| fmul st(0), st(6) //*z | |
| fadd st(0), st(0) //*2 | |
| fadd qword [esi + 40] //+cz nly for test | |
| fstp qword [ecx] //xx+yy, xx, yy,x,y,z | |
| fld st(5) //z, xx+yy, xx, yy,x,y,z | |
| fmulp st(6), st(0) //xx+yy, xx, yy,x,y,z*z | |
| fld st(0) //xx+yy, xx+yy, xx, yy,x,y,z*z | |
| fsubrp st(6), st(0) //xx+yy, xx, yy,x,y, a - z*z | |
| fdivp st(5), st(0) //xx, yy,x,y, a - z*z / a = a | |
| fsubrp //xx-yy,x,y, a | |
| fmul st(0), st(3) //a(xx-yy),x,y, a | |
| fadd qword [esi + 24] | |
| fstp qword [eax] //x,y, a | |
| fmulp | |
| fmulp //x*y*a | |
| fadd st(0), st(0) //*2 | |
| fadd qword [esi + 32] //+ cy only for test | |
| fstp qword [edx] | |
| pop edi | |
| pop esi //SineP2 | |
| end; | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| procedure HybridItIntPow2SSE2(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi | |
| push ebx | |
| mov esi, [ebp + 8] | |
| movlpd xmm0, [eax] // x | |
| movhpd xmm0, [edx] // x, y | |
| movlpd xmm1, [ecx] // z | |
| movapd xmm2, xmm0 | |
| mov ebx, [esi + 48] //Pvars | |
| movsd xmm3, xmm1 | |
| mulpd xmm2, xmm2 // S1, S2 | |
| mulsd xmm3, xmm3 // S3 | |
| pshufd xmm5, xmm2, $4E // S2, S1 | |
| movapd xmm4, xmm5 | |
| addpd xmm5, xmm2 // S1+S2 | |
| subsd xmm2, xmm4 // S1-S2 | |
| movapd xmm6, xmm5 | |
| mulsd xmm1, [ebx - 16] // z*dZmul | |
| sqrtsd xmm4, xmm6 // Sqrt(S2+S1) | |
| addsd xmm1, xmm1 // z*dZmul*2 | |
| subsd xmm6, xmm3 // (S1+S2)-S3 | |
| mulsd xmm1, xmm4 // z*dZmul*2*Sqrt(S2+S1) | |
| movsd xmm3, [edx] // y | |
| addsd xmm1, [esi + 40] // z*dZmul*Sqrt(S2+S1)+J3 = z | |
| divsd xmm6, xmm5 // (XT-S3)/XT = XT | |
| addsd xmm3, xmm3 // y*2 | |
| movsd [ecx], xmm1 // z | |
| mulsd xmm3, xmm0 // y*2*x | |
| mulsd xmm2, xmm6 // (S1-S2)*XT | |
| mulsd xmm3, xmm6 // y*2*x*XT | |
| addsd xmm2, [esi + 24] // (S1-S2)*XT+J1 = x | |
| addsd xmm3, [esi + 32] // y*2*x*XT+J2 = y | |
| movsd [eax], xmm2 // x | |
| movsd [edx], xmm3 // y | |
| pop ebx | |
| pop esi | |
| end; | |
| procedure HybridFloatPow(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| {var th, ph, pp: Double; | |
| Esin1, Ecos1, Esin2, Ecos2: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| // R := Sqrt(Rout); | |
| th := ArcTan2(y, x); | |
| ph := ArcTan2(z, Sqrt(Sqr(x) + Sqr(y))); // ArcSin(z / R); | |
| pp := Power(Rout, 0.5 * PDouble(Integer(PVar) - 16)^); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * ph, Esin1, Ecos1); | |
| SinCosD(PDouble(Integer(PVar) - 16)^ * th, Esin2, Ecos2); | |
| x := pp * Ecos1 * Ecos2 + J1; | |
| y := pp * Ecos1 * Esin2 + J2; | |
| z := PDouble(Integer(PVar) - 24)^ * pp * Esin1 + J3; | |
| end; } | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov edi, [esi + 48] | |
| fld qword [edi - 16] | |
| fld qword [edx] | |
| fld qword [eax] | |
| fld st(1) | |
| fld st(1) | |
| fpatan //theta, x, y, pow | |
| fmul st, st(3) | |
| fsincos //Costheta, Sintheta, x, y, pow | |
| fld qword [ecx] //z,Costheta, Sintheta,x,y,pow | |
| fxch st(3) //x,Costheta, Sintheta,z,y,pow | |
| fmul st, st | |
| fxch st(4) //y,Costheta, Sintheta,z,xx,pow | |
| fmul st, st | |
| faddp st(4), st //Costheta,Sintheta,z,xx+yy,pow | |
| fxch st(2) //z,Sintheta,Costheta,xx+yy,pow | |
| fxch //Sintheta,z,Costheta,xx+yy,pow | |
| fxch st(3) //xx+yy,z,Costheta,Sintheta,pow | |
| fsqrt | |
| fpatan //phi,Costheta, Sintheta,pow | |
| fmul st, st(3) | |
| fsincos //Cosphi,Sinphi,Costheta,Sintheta,pow | |
| fxch st(4) //pow,Sinphi,Costheta,Sintheta,Cosphi | |
| fmul qword [edi - 8] //*0.5 because of Rout=sqr(R) | |
| fld qword [esi + 56] //SqrRadius, pow*0.5,Sinphi,Costheta,Sintheta,Cosphi | |
| fldln2 //power function x,pow | |
| fxch | |
| fyl2x | |
| fxch | |
| fmulp | |
| fldl2e | |
| fmulp | |
| fld st(0) | |
| frndint | |
| fsub st(1), st(0) | |
| fxch | |
| f2xm1 | |
| fld1 | |
| faddp | |
| fscale | |
| fstp st(1) //NewRadius,Sinphi,Costheta,Sintheta,Cosphi | |
| fxch st(2) //Costheta,Sinphi,NewRadius,Sintheta,Cosphi | |
| fmul st, st(4) | |
| fmul st, st(2) | |
| fadd qword [esi + 24] | |
| fstp qword [eax] //Sinphi,NewRadius,Sintheta,Cosphi | |
| fxch st(3) //Cosphi,NewRadius,Sintheta,Sinphi | |
| fmulp st(2), st //NewRadius,Sintheta*Cosphi,Sinphi | |
| fmul st(1), st | |
| fmulp st(2), st //Sintheta*Cosphi*r,Sinphi*r | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| fmul qword [edi - 24] | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] | |
| pop edi | |
| pop esi | |
| end; | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| procedure HybridItIntPow3(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| fld qword [edx] | |
| fmul st, st // y*y | |
| fld qword [eax] // x, y*y | |
| mov edi, [esi + 48] // PVars | |
| fmul st, st // x*x, y*y | |
| fld st(0) // x*x, x*x, y*y | |
| fadd st(0), st(2) // x*x+y*y = R, x*x = sx, y*y = sy | |
| fld qword [ecx] | |
| fmul st, st // sz, R, sx, sy | |
| fld qword [edi + 120] // 3, sz, R, sx, sy | |
| fld st(1) // sz, 3, sz, R, sx, sy | |
| fmul st(0), st(1) // 3*sz, 3, sz, R, sx, sy | |
| fld st(3) | |
| fadd qword [edi + 24] | |
| fdivp // 3*sz/R, 3, sz, R, sx, sy | |
| fld1 | |
| fsubrp | |
| // fsubr qword [edi + 32] // A, 3, sz, R, sx, sy 1-3*sz/R | |
| fld st(1) // 3, A, 3, sz, R, sx, sy | |
| fmul st(0), st(6) // 3*sy, .. | |
| fsubr st(0), st(5) // sx-3*sy, .. | |
| fmul st(0), st(1) // A*(sx-3*sy), A, 3, sz, R, sx, sy | |
| fmul qword [eax] | |
| fadd qword [esi + 24] | |
| fstp qword [eax] // A, 3, sz, R, sx, sy | |
| fxch st(4) // sx, 3, sz, R, A, sy | |
| fmul st(0), st(1) // 3*sx, 3, sz, R, A, sy | |
| fsubrp st(5), st(0) // 3, sz, R, A, 3*sx-sy was: sy-3*sx! | |
| fmulp st(2), st(0) // sz, 3*R, A, 3*sx-sy | |
| fsubrp // sz-3*R, A, 3*sx-sy | |
| fmul qword [ecx] | |
| fmul qword [edi - 16] //*dZmul | |
| fsubr qword [esi + 40] | |
| fstp qword [ecx] // A, 3*sx-sy | |
| fmulp // A*(3*sx-sy) | |
| fmul qword [edx] | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| pop edi | |
| pop esi | |
| end; | |
| procedure HybridItIntPow4(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| {var R, A, yt: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| R := x * x + y * y; | |
| yt := y; | |
| A := 1 + (sz * (sz - 6 * R)) / (R * R + d1em40); | |
| y := 4 * x * y * A * (sx - sy) + J2; //4: PVars + 128 | |
| z := PDouble(Integer(PVar) - 16)^ * 4 * Sqrt(R) * z * (R - sz) + J3; //6: PVars + 144 | |
| x := A * (sx * (sx - 6 * sy) + sy * sy) + J1; | |
| end; } | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| fld qword [edx] | |
| fmul st, st // y*y | |
| fld qword [eax] // x, y*y | |
| mov edi, [esi + 48] // PVars | |
| fld st | |
| fmul st, st // x*x, x, y*y | |
| fld st(0) // x*x, x*x, x, y*y | |
| fadd st(0), st(3) // x*x+y*y = R, sx, x, sy | |
| fld qword [ecx] | |
| fmul st, st // sz, R, sx, x, sy | |
| fld qword [edi + 144] // 6, sz, R, sx, x, sy | |
| fmul st, st(2) // 6*R, sz, R, sx, x, sy | |
| fsubr st, st(1) // sz - 6*R, sz, R, sx, x, sy | |
| fmul st(0), st(1) // sz * (sz - 6 * R), sz, R, sx, x, sy | |
| fld st(2) | |
| fmul st, st // R*R, sz * (sz - 6 * R), sz, R, sx, x, sy | |
| fadd qword [edi + 24] // 24-112 +1e-40 | |
| fdivp // sz * (sz - 6 * R) / R*R, sz, R, sx, x, sy | |
| fld1 | |
| faddp // A, sz, R, sx, x, sy | |
| fld st(5) // sy, A, sz, R, sx, x, sy | |
| fmul qword [edi + 144] // 6*sy, A, sz, R, sx, x, sy | |
| fsubr st, st(4) // sx-6*sy, A, sz, R, sx, x, sy | |
| fmul st(0), st(4) // sx*(sx-6*sy), A, sz, R, sx, x, sy | |
| fld st(6) | |
| fmul st, st | |
| faddp // sy*sy + sx*(sx-6*sy), A, sz, R, sx, x, sy | |
| fmul st, st(1) | |
| fadd qword [esi + 24] | |
| fstp qword [eax] // A, sz, R, sx, x, sy | |
| fxch st(2) // R, sz, A, sx, x, sy | |
| fsubr st(1), st // R, R-sz, A, sx, x, sy | |
| fsqrt | |
| fmulp // sqrt(R)*(R-sz), A, sx, x, sy | |
| fmul qword [ecx] | |
| fmul qword [edi + 128] //*4 | |
| fmul qword [edi - 16] //*dZmul | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] // A, sx, x, sy | |
| fxch // sx, A, x, sy y := 4 * x * y * A * (sx - sy) + J2; | |
| fsubrp st(3), st // A, x, sx-sy | |
| fmulp // A*x, sx-sy | |
| fmulp | |
| fmul qword [edi + 128] //*4 | |
| fmul qword [edx] //*y | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| pop edi | |
| pop esi | |
| end; | |
| procedure HybridIntP5(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| {var sx, sy, sz, A, R: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| sx := x*x; | |
| sy := y*y; | |
| R := sx + sy; | |
| sz := z*z; | |
| A := 1 + 5*(sz*sz - 2*R*sz) / (R*R + d1em40); | |
| y := A*y*(5*sx*sx - sy*(10*sx - sy)) + J2; | |
| z := PDouble(Integer(PVar) - 16)^*z*(sz*(sz - 10*R) + 5*R*R) + J3; | |
| x := A*x*(sx*(sx - 10*sy) + 5*sy*sy) + J1; | |
| end; } | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| fld qword [edx] | |
| fmul st, st // y*y | |
| fld qword [eax] // x, y*y | |
| mov edi, [esi + 48] // PVars | |
| fmul st, st // x*x, y*y | |
| fld st // x*x, x*x, y*y | |
| fadd st, st(2) // x*x+y*y = R, sx, sy | |
| fld qword [ecx] | |
| fmul st, st // sz, R, sx, sy | |
| fld qword [edi + 136] // 5, sz, R, sx, sy | |
| fld st // 5, 5, sz, R, sx, sy | |
| fld st(2) | |
| fmul st, st(4) | |
| fadd st, st // sz*R*2, 5, 5, sz, R, sx, sy | |
| fld st(3) | |
| fmul st, st | |
| fsubrp // sz*sz - sz*R*2, 5, 5, sz, R, sx, sy | |
| fmulp // (sz*sz - sz*R*2) * 5, 5, sz, R, sx, sy | |
| fld st(3) | |
| fmul st, st // R*R, (sz*sz - sz*R*2) * 5, 5, sz, R, sx, sy | |
| fadd qword [edi + 24] // 24-112 +1e-40 | |
| fdivp // (sz*sz - sz*R*2) * 5 / R*R, 5, sz, R, sx, sy | |
| fld1 | |
| faddp // A, 5, sz, R, sx, sy | |
| fld st(4) // sx, A, 5, sz, R, sx, sy | |
| fmul qword [edi + 168] // 10*sx, A, 5, sz, R, sx, sy | |
| fsub st, st(6) // 10*sx - sy, A, 5, sz, R, sx, sy | |
| fmul st, st(6) // sy*(10*sx - sy), A, 5, sz, R, sx, sy | |
| fld st(5) | |
| fmul st, st | |
| fmul st, st(3) // 5*sx*sx, sy*(10*sx - sy), A, 5, sz, R, sx, sy | |
| fsubrp // 5*sx*sx - sy*(10*sx - sy), A, 5, sz, R, sx, sy | |
| fmul st, st(1) | |
| fmul qword [edx] | |
| fadd qword [esi + 32] | |
| fstp qword [edx] // A, 5, sz, R, sx, sy | |
| fld st(3) | |
| fmul st, st(2) | |
| fadd st, st // 10*R, A, 5, sz, R, sx, sy | |
| fsubr st, st(3) // sz-10*R, A, 5, sz, R, sx, sy | |
| fmulp st(3), st // A, 5, sz*(sz-10*R), R, sx, sy | |
| fxch st(3) // R, 5, sz*(sz-10*R), A, sx, sy | |
| fmul st, st // | |
| fmul st, st(1) // | |
| faddp st(2), st // 5, sz*(sz-10*R)+5*R*R, A, sx, sy | |
| fld st(4) | |
| fmul st, st | |
| fmul st, st(1) // 5*sy*sy, 5, sz*(sz-10*R)+5*R*R, A, sx, sy | |
| fxch st(5) // sy, 5, sz*(sz-10*R)+5*R*R, A, sx, 5*sy*sy | |
| fmulp | |
| fadd st, st // 10*sy, sz*(sz-10*R)+5*R*R, A, sx, 5*sy*sy | |
| fsubr st, st(3) // sx-10*sy, sz*(sz-10*R)+5*R*R, A, sx, 5*sy*sy | |
| fmulp st(3), st // sz*(sz-10*R)+5*R*R, A, sx*(sx-10*sy), 5*sy*sy | |
| fmul qword [ecx] | |
| fmul qword [edi - 16] //*dZmul | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] // A, sx*(sx-10*sy), 5*sy*sy | |
| fmul qword [eax] | |
| fxch // sx*(sx-10*sy), A*x, 5*sy*sy | |
| faddp st(2), st // A*x, sx*(sx-10*sy)+5*sy*sy | |
| fmulp | |
| fadd qword [esi + 24] | |
| fstp qword [eax] | |
| pop edi | |
| pop esi | |
| end; | |
| procedure HybridIntP6(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| {var S1, S2, sz, A, R: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| S1 := x*x; | |
| S2 := y*y; | |
| R := S1 + S2; | |
| sz := z*z; | |
| A := 1 - (sz*(sz*(sz - 15*R) + 15*R*R)) / (R*R*R + d1em40); | |
| y := 2*A*x*y*(S1*(3*S1 - 10*S2) + 3*S2*S2) + J2; | |
| z := PDouble(Integer(PVar) - 16)^*2*z*Sqrt(R)*(sz*(3*sz - 10*R) + 3*R*R) + J3; | |
| x := A*(S1*S1*(S1 - 15*S2) + S2*S2*(15*S1 - S2)) + J1; | |
| end; } | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| fld qword [edx] | |
| fmul st, st // y*y | |
| fld qword [eax] // x, y*y | |
| mov edi, [esi + 48] // PVars | |
| fmul st, st // x*x, y*y | |
| fld st // x*x, x*x, y*y | |
| fadd st, st(2) // x*x+y*y = R, sx, sy | |
| fld qword [ecx] | |
| add edi, 112 | |
| fmul st, st // sz, R, sx, sy | |
| fld qword [edi + 176-112] // 15, sz, R, sx, sy | |
| fld st // 15, 15, sz, R, sx, sy | |
| fmul st, st(3) // 15*R, | |
| fsubr st, st(2) // sz-R*15, 15, sz, R, sx, sy | |
| fmul st, st(2) | |
| fld st(3) | |
| fmul st, st // R*R, sz*(sz-R*15), 15, sz, R, sx, sy | |
| fxch | |
| fld st(1) // R*R, sz*(sz-R*15), R*R, 15, sz, R, sx, sy | |
| fmulp st(3), st // sz*(sz-R*15), R*R, 15*R*R, sz, R, sx, sy | |
| faddp st(2), st // R*R, 15*R*R+sz*(sz-R*15), sz, R, sx, sy | |
| fxch // 15*R*R+sz*(sz-R*15), R*R, sz, R, sx, sy | |
| fmul st, st(2) // sz*(15*R*R+sz*(sz-R*15)), R*R, sz, R, sx, sy | |
| fld st(1) | |
| fmul st, st(4) // R*R*R, sz*(15*R*R+sz*(sz-R*15)), R*R, sz, R, sx, sy | |
| fadd qword [edi + 24-112] // 24-112 +1e-40 | |
| fdivp // sz*(15*R*R+sz*(sz-R*15)) / R*R*R, R*R, sz, R, sx, sy | |
| fld1 | |
| fsubrp // 1 - sz*(15*R*R+sz*(sz-R*15)) / R*R*R, R*R, sz, R, sx, sy | |
| fld st(5) // sy, A, R*R, sz, R, sx, sy | |
| fmul qword [edi + 168-112] // 10*sy, A, R*R, sz, R, sx, sy | |
| fld st(5) | |
| fmul qword [edi + 120-112] // 3*sx, 10*sy, A, R*R, sz, R, sx, sy | |
| fsubrp // 3*sx-10*sy, A, R*R, sz, R, sx, sy | |
| fmul st, st(5) // sx*(3*sx-10*sy), A, R*R, sz, R, sx, sy | |
| fld st(6) // sy, | |
| fmul st, st | |
| fmul qword [edi + 120-112] // 3*sy*sy, sx*(3*sx-10*sy), A, R*R, sz, R, sx, sy | |
| faddp // 3*sy*sy+sx*(3*sx-10*sy), A, R*R, sz, R, sx, sy | |
| fmul st, st(1) | |
| fmul qword [edx] | |
| fmul qword [eax] // z := PDouble(Integer(PVar) - 16)^*2*z*Sqrt(R)*(sz*(3*sz - 10*R) + 3*R*R) + J3; | |
| fadd st, st // x := A*(S1*S1*(S1 - 15*S2) + S2*S2*(15*S1 - S2)) + J1; | |
| fadd qword [esi + 32] | |
| fstp qword [edx] // A, R*R, sz, R, sx, sy | |
| fld st(3) | |
| fmul qword [edi + 168-112] | |
| fld st(3) // sz, 10*R, A, R*R, sz, R, sx, sy | |
| fmul qword [edi + 120-112] | |
| fsubrp // 3*sz-10*R, A, R*R, sz, R, sx, sy | |
| fmulp st(3), st // A, R*R, sz*(3*sz-10*R), R, sx, sy | |
| fxch | |
| fmul qword [edi + 120-112] // 3*R*R, A, sz*(3*sz-10*R), R, sx, sy | |
| faddp st(2), st // A, sz*(3*sz-10*R)+3*R*R, R, sx, sy | |
| fld qword [edi + 176-112] // 15 | |
| fld st // 15, 15, A, sz*(3*sz-10*R)+3*R*R, R, sx, sy | |
| fmul st, st(5) | |
| fsub st, st(6) | |
| fmul st, st(6) | |
| fmul st, st(6) // S2*S2*(15*S1-S2), 15, A, sz*(3*sz-10*R)+3*R*R, R, sx, sy | |
| fxch | |
| fmulp st(6), st // S2*S2*(15*S1-S2), A, sz*(3*sz-10*R)+3*R*R, R, sx, 15*sy | |
| fxch st(5) // 15*sy, A, sz*(3*sz-10*R)+3*R*R, R, sx, S2*S2*(15*S1-S2) | |
| fsubr st, st(4) // sx-15*sy, A, sz*(3*sz-10*R)+3*R*R, R, sx, S2*S2*(15*S1-S2) | |
| fmul st, st(4) | |
| fmulp st(4), st // A, sz*(3*sz-10*R)+3*R*R, R, sx*sx*(sx-15*sy), S2*S2*(15*S1-S2) | |
| fxch st(4) // S2*S2*(15*S1-S2), sz*(3*sz-10*R)+3*R*R, R, sx*sx*(sx-15*sy), A | |
| faddp st(3), st // sz*(3*sz-10*R)+3*R*R, R, S2*S2*(15*S1-S2)+sx*sx*(sx-15*sy), A | |
| fxch | |
| fsqrt | |
| fmulp // (sz*(3*sz-10*R)+3*R*R)*sqrt(R), S2*S2*(15*S1-S2)+sx*sx*(sx-15*sy), A | |
| fmul qword [ecx] | |
| fmul qword [edi - 16-112] //*dZmul | |
| fadd st, st | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] // S2*S2*(15*S1-S2)+sx*sx*(sx-15*sy), A | |
| fmulp | |
| fadd qword [esi + 24] | |
| fstp qword [eax] | |
| pop edi | |
| pop esi | |
| end; | |
| procedure HybridIntP7(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| {var S1, S2, S3, A, R: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| S1 := x*x; | |
| S2 := y*y; | |
| R := S1 + S2; | |
| S3 := z*z; | |
| A := 1 - 7*(S3*(S3*(S3 - 5*R) + 3*R*R)) / (R*R*R + d1em40); | |
| y := A*y*(S1*(S1*(7*S1 - 35*S2) + 21*S2*S2) - S2*S2*S2) + J2; | |
| z := J3 - PDouble(Integer(PVar) - 16)^* (z*S3*S3*S3 - 7*z*R*(S3*(3*S3 - 5*R) + R*R) ); | |
| x := A*x*(S1*(S1*(S1 - 21*S2) + 35*S2*S2) - 7*S2*S2*S2) + J1; | |
| end; } | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| fld qword [edx] | |
| fmul st, st // y*y | |
| fld qword [eax] // x, y*y | |
| mov edi, [esi + 48] // PVars | |
| fmul st, st // x*x, y*y | |
| fld st // x*x, x*x, y*y | |
| fadd st, st(2) // x*x+y*y = R, sx, sy | |
| fld qword [ecx] | |
| add edi, 112 | |
| fmul st, st // sz, R, sx, sy | |
| fld st(1) // R, sz, R, sx, sy | |
| fmul qword [edi + 136-112] // 5R, | |
| fsubr st, st(1) // sz-5R, sz, R, sx, sy | |
| fmul st, st(1) // sz(sz-5R), sz, R, sx, sy | |
| fld st(2) | |
| fmul st, st // R*R, sz(sz-5R), sz, R, sx, sy | |
| fxch // sz(sz-5R), R*R, sz, R, sx, sy | |
| fld st(1) // R*R, sz(sz-5R), R*R, sz, R, sx, sy | |
| fmul qword [edi + 120-112] // 3*R*R, sz(sz-5R), R*R, sz, R, sx, sy | |
| faddp // 3RR+sz(sz-5R), R*R, sz, R, sx, sy | |
| fmul st, st(2) // sz(3RR+sz(sz-5R)), R*R, sz, R, sx, sy | |
| fmul qword [edi + 152-112] | |
| fld st(1) | |
| fmul st, st(4) // R*R*R, 7sz(3RR+sz(sz-5R)), R*R, sz, R, sx, sy | |
| fadd qword [edi + 24-112] // 24-112 +1e-40 | |
| fdivp // 7sz(3RR+sz(sz-5R))/RRR, R*R, sz, R, sx, sy | |
| fld1 | |
| fsubrp // A, R*R, sz, R, sx, sy | |
| fld st(5) // sy, A, R*R, sz, R, sx, sy | |
| fmul qword [edi + 200-112] // 35*sy, A, R*R, sz, R, sx, sy | |
| fld st(5) | |
| fmul qword [edi + 152-112] // 7*sx, 35*sy, A, R*R, sz, R, sx, sy | |
| fsubrp // 7*sx-35*sy, A, R*R, sz, R, sx, sy | |
| fmul st, st(5) // sx*(7*sx-35*sy), A, R*R, sz, R, sx, sy | |
| fld st(6) // sy, | |
| fmul st, st | |
| fmul qword [edi + 184-112] // 21*sy*sy, sx*(7*sx-35*sy), A, R*R, sz, R, sx, sy | |
| faddp // 21sysy+sx(7sx-35sy), A, R*R, sz, R, sx, sy | |
| fmul st, st(5) | |
| fld st(6) | |
| fmul st, st | |
| fmul st, st(7) // sysysy, sx(21sysy+sx(7sx-35sy)), A, R*R, sz, R, sx, sy | |
| fsubp // sx(21sysy+sx(7sx-35sy))-sysysy, A, R*R, sz, R, sx, sy | |
| fmul st, st(1) | |
| fmul qword [edx] | |
| fadd qword [esi + 32] | |
| fstp qword [edx] // A, R*R, sz, R, sx, sy | |
| fmul qword [eax] // z := J3 - PDouble(Integer(PVar) - 16)^*z*(sz*sz*sz - 7*R*(sz*(3*sz - 5*R) + R*R)); | |
| // x := A*x*(sx*(sx*(sx - 21*sy) + 35*sy*sy) - 7*sy*sy*sy) + J1; | |
| fld st(3) | |
| fmul qword [edi + 136-112] // 5R, A*x, R*R, sz, R, sx, sy | |
| fld st(3) // sz, 5R, A*x, R*R, sz, R, sx, sy | |
| fmul qword [edi + 120-112] | |
| fsubrp // 3sz-5R, A*x, R*R, sz, R, sx, sy | |
| fmul st, st(3) // sz(3sz-5R), A*x, R*R, sz, R, sx, sy | |
| faddp st(2), st // A*x, RR+sz(3sz-5R), sz, R, sx, sy | |
| fxch | |
| fmul qword [edi + 152-112] // 7(RR+sz(3sz-5R)), A*x, sz, R, sx, sy | |
| fmulp st(3), st // A*x, sz, 7R(sz(3sz-5R)+RR), sx, sy | |
| fld st(1) | |
| fmul st, st | |
| fmulp st(2), st // A*x, szszsz, 7R(RR+sz(3sz-5R)), sx, sy | |
| fxch // szszsz, A*x, 7R(RR+sz(3sz-5R)), sx, sy | |
| fsubrp st(2), st // A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| fld st(3) // sy, A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| fmul qword [edi + 184-112] // 21sy, A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| fsubr st, st(3) // sx-21sy, A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| fmul st, st(3) // sx(sx-21sy) | |
| fld st(4) // sy, sx(sx-21sy), A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| fmul st, st // sysy, sx(sx-21sy), A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| fmul qword [edi + 200-112] // 35sysy, sx(sx-21sy), A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| faddp // 35sysy+sx(sx-21sy), A*x, szszsz-7R(RR+sz(3sz-5R)), sx, sy | |
| fmulp st(3), st // A*x, szszsz-7R(RR+sz(3sz-5R)), sx(35sysy+sx(sx-21sy)), sy | |
| fxch st(3) // sy, szszsz-7R(RR+sz(3sz-5R)), sx(35sysy+sx(sx-21sy)), A*x | |
| fld st | |
| fmul st, st | |
| fmulp | |
| fmul qword [edi + 152-112] // 7sysysy, szszsz-7R(RR+sz(3sz-5R)), sx(35sysy+sx(sx-21sy)), A*x | |
| fsubp st(2), st // szszsz-7R(RR+sz(3sz-5R)), sx(35sysy+sx(sx-21sy))-7sysysy, A*x | |
| fmul qword [ecx] | |
| fmul qword [edi - 16-112] //*dZmul | |
| fsubr qword [esi + 40] | |
| fstp qword [ecx] // sx(35sysy+sx(sx-21sy))-7sysysy, A*x | |
| fmulp | |
| fadd qword [esi + 24] | |
| fstp qword [eax] | |
| pop edi | |
| pop esi | |
| end; | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| procedure HybridIntP8(var x, y, z, w: Double; PIteration3D: TPIteration3D); //P8 white's formula | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D | |
| fld qword [eax] //x | |
| mov edi, [esi + 48] //PVars | |
| fmul st(0), st(0) //xx | |
| fld qword [edx] //y | |
| add edi, 88 | |
| fmul st(0), st(0) //yy,xx | |
| fld qword [ecx] //z,yy,xx | |
| fmul st(0), st(0) //zz,yy,xx | |
| fld st(2) //xx,zz,yy,xx | |
| fadd st(0), st(2) //xx+yy=r,zz,yy,xx | |
| fld st(0) //r,r,zz,yy,xx | |
| fmul st(0), st(1) //rr,r,zz,yy,xx | |
| fld st(2) | |
| fmul st(0), st(0) //zzzz(S3*S3),rr,r,zz,yy,xx | |
| fld st(2) //r,zzzz(S3*S3),rr,r,zz,yy,xx z calculation | |
| fmul st(0), st(4) //r*zz | |
| fmul qword [edi + 56] //6*r*zz,zzzz(S3*S3),rr,r,zz,yy,xx | |
| fsubr st(0), st(1) //zzzz-6rzz,zzzz,rr,r,zz,yy,xx | |
| fadd st(0), st(2) //zzzz-6rzz+rr,zzzz,rr,r,zz,yy,xx | |
| fld st(4) //zz,zzzz-6rzz+rr,zzzz,rr,r,zz,yy,xx | |
| fsub st(0), st(4) //zz-r,zzzz-6rzz+rr,zzzz,rr,r,zz,yy,xx | |
| fmulp //(zz-r)*(zzzz-6rzz+rr),zzzz,rr,r,zz,yy,xx | |
| fld st(3) //r,(zz-r)*(zzzz-6rzz+rr),zzzz,rr,r,zz,yy,xx | |
| fsqrt | |
| fmulp //sqrt(r)*(zz-r)*(zzzz-6rzz+rr),zzzz,rr,r,zz,yy,xx | |
| fmul qword [ecx] //*z | |
| fmul qword [edi + 72] //*8 | |
| fmul qword [edi - 104] //*dZmul | |
| fchs | |
| fadd qword [esi + 40] //+J3 | |
| fstp qword [ecx] //zzzz,rr,r,zz,yy,xx | |
| fld st(0) //zzzz,zzzz,rr,r,zz,yy,xx a calculation | |
| fadd st(0), st(2) //zzzz+rr,zzzz,rr,r,zz,yy,xx | |
| fmulp st(3), st(0) //zzzz,rr,r*(zzzz+rr),zz,yy,xx | |
| fld st(1) //rr,zzzz,rr,r*(zzzz+rr),zz,yy,xx | |
| fmul qword [edi + 120] //rr*70,zzzz,rr,r*(zzzz+rr),zz,yy,xx | |
| fadd st(0), st(1) | |
| fmulp //(rr*70+zzzz)*zzzz,rr,r*(zzzz+rr),zz,yy,xx | |
| fxch st(2) //r*(zzzz+rr),rr,(rr*70+zzzz)*zzzz,zz,yy,xx | |
| fmulp st(3), st(0) //rr,(rr*70+zzzz)*zzzz,zz*r*(zzzz+rr),yy,xx | |
| fxch st(2) //zz*r*(zzzz+rr),(rr*70+zzzz)*zzzz,rr,yy,xx | |
| fmul qword [edi + 104] //28*zz*r*(zzzz+rr),(rr*70+zzzz)*zzzz,rr,yy,xx | |
| fsubp //(rr*70+zzzz)*zzzz-28*zz*r*(zzzz+rr),rr,yy,xx | |
| fxch st(1) | |
| fmul st(0), st(0) //rrrr,(rr*70+zzzz)*zzzz-28*zz*r*(zzzz+rr),yy,xx | |
| fadd qword [edi - 64] // 24-88 +1e-40 | |
| fdivp //(zzzz*(rr*70+zzzz)-28*zz*r*(zzzz+rr))/rrrr,yy,xx | |
| fadd qword [edi - 56] //a,yy,xx +1 | |
| fld st(1) //yy,a,yy,xx y calculation | |
| fmul qword [edi + 64] //7*yy,a,yy,xx + 152-128=24 | |
| fld st(3) //xx,7*yy,a,yy,xx | |
| fmul qword [edi + 64] //7*xx,7*yy,a,yy,xx | |
| fsub st(0), st(3) //7*xx-yy,7*yy,a,yy,xx | |
| fld st(4) //xx,7*xx-yy,7*yy,a,yy,xx | |
| fsubr st(2), st(0) //xx,7*xx-yy,xx-7*yy,a,yy,xx | |
| fmul st(0), st(0) //xxxx,7*xx-yy,xx-7*yy,a,yy,xx | |
| fmul st(2), st(0) //xxxx,7xx-yy,xxxx(xx-7yy),a,yy,xx | |
| fld st(4) //yy,xxxx,7xx-yy,xxxx(xx-7yy),a,yy,xx | |
| fmul st(0), st(0) //yyyy,xxxx,7xx-yy,xxxx(xx-7yy),a,yy,xx | |
| fmul st(2), st(0) //yyyy,xxxx,yyyy(7xx-yy),xxxx(xx-7yy),a,yy,xx | |
| fxch st(2) //yyyy(7xx-yy),xxxx,yyyy,xxxx(xx-7yy),a,yy,xx | |
| faddp st(3), st(0) //xxxx,yyyy,yyyy(7xx-yy)+xxxx(xx-7yy),a,yy,xx | |
| fxch st(2) //yyyy(7xx-yy)+xxxx(xx-7yy),yyyy,xxxx,a,yy,xx | |
| fmul qword [edi + 72] //*8 | |
| fmul qword [eax] //*x | |
| fmul qword [edx] //*y | |
| fmul st(0), st(3) //*a | |
| fadd qword [esi + 32] //+J2 | |
| fstp qword [edx] //yyyy,xxxx,a,yy,xx | |
| fld st(1) //xxxx,yyyy,xxxx,a,yy,xx | |
| fmul qword [edi + 120] //70xxxx,yyyy,xxxx,a,yy,xx | |
| fadd st(0), st(1) //70xxxx+yyyy,yyyy,xxxx,a,yy,xx | |
| fmul st(0), st(1) //yyyy(70xxxx+yyyy),yyyy,xxxx,a,yy,xx | |
| fxch st(1) //yyyy,yyyy(70xxxx+yyyy),xxxx,a,yy,xx | |
| fadd st(0), st(2) //yyyy+xxxx,yyyy(70xxxx+yyyy),xxxx,a,yy,xx | |
| fmulp st(4), st(0) //yyyy(70xxxx+yyyy),xxxx,a,yy(yyyy+xxxx),xx | |
| fxch st(4) //xx,xxxx,a,yy(yyyy+xxxx),yyyy(70xxxx+yyyy) | |
| fmulp st(3), st(0) //xxxx,a,xxyy(yyyy+xxxx),yyyy(70xxxx+yyyy) | |
| fmul st(0), st(0) //xxxx*xxxx,a,xxyy(yyyy+xxxx),yyyy(70xxxx+yyyy) | |
| faddp st(3), st(0) //a,xxyy(yyyy+xxxx),xxxx*xxxx+yyyy(70xxxx+yyyy) | |
| fxch st(1) //xxyy(yyyy+xxxx),a,xxxx*xxxx+yyyy(70xxxx+yyyy) | |
| fmul qword [edi + 104] | |
| fsubp st(2), st(0) //a,xxxx*xxxx+yyyy(70xxxx+yyyy)-28xxyy(yyyy+xxxx) | |
| fmulp | |
| fadd qword [esi + 24] | |
| fstp qword [eax] | |
| pop edi | |
| pop esi | |
| end; | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| procedure HybridCubeSSE2(var x, y, z, w: Double; PIteration3D: TPIteration3D); // is used in alt hybrid without DE on w | |
| asm | |
| push esi | |
| push ebx | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov ebx, [esi + 48] | |
| movupd xmm2, [eax] //[x,y] | |
| movsd xmm4, [ecx] //[z] | |
| movapd xmm0, xmm2 | |
| maxpd xmm0, [ebx - 64] //const:-1,-1,1,1 | |
| maxsd xmm4, [ebx - 64] | |
| minpd xmm0, [ebx - 48] | |
| minsd xmm4, [ebx - 48] | |
| addpd xmm0, xmm0 | |
| addsd xmm4, xmm4 | |
| subpd xmm0, xmm2 | |
| subsd xmm4, [ecx] | |
| movapd xmm1, xmm0 //x, y | |
| movsd xmm5, xmm4 | |
| mulpd xmm1, xmm1 //x*x, y*y | |
| mulsd xmm5, xmm5 //z*z | |
| pshufd xmm6, xmm1, $4E //y*y, x*x copies and swaps hi<>lo | |
| addsd xmm1, xmm5 //x*x + z*z | |
| addsd xmm1, xmm6 // w = sqr(r) | |
| ucomisd xmm1, [ebx - 32] //<dOption2 was:dOpt3 | |
| jnb @u1 | |
| movsd xmm3, [ebx - 24] //dOption1 | |
| jmp @u3 | |
| @u1:ucomisd xmm1, [ebx + 32] //<1 ? ucomisd slow? | |
| movsd xmm3, [ebx - 16] //dPow = scale //Was:dOpt2 | |
| jnb @u3 | |
| divsd xmm3, xmm1 | |
| @u3:shufpd xmm3, xmm3, 0 | |
| movupd xmm5, [esi + 24] //[J1,J2] | |
| mulpd xmm0, xmm3 | |
| mulsd xmm4, xmm3 | |
| addpd xmm0, xmm5 | |
| addsd xmm4, [esi + 40] //J3 | |
| movlpd [eax], xmm0 | |
| movhpd [edx], xmm0 | |
| movsd [ecx], xmm4 | |
| pop ebx | |
| pop esi | |
| end; | |
| procedure HybridCube(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi //Amazing box x87 with options fold fold x2 | |
| push ebx | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov esi, [esi + 48] //was:PAligned16 | |
| mov ebx, eax | |
| fld qword [esi - 40] //fold | |
| fld qword [eax] //x,fold | |
| fld st(0) //x,x,fold folding with x = abs(x+fold) - abs(x-fold) - x | |
| fsub st(0), st(2) | |
| fabs | |
| fadd st(0), st(1) //abs(x-fold)+x,x,fold | |
| fxch //x,abs(x-fold)+x,fold | |
| fadd st(0), st(2) | |
| fabs | |
| fsubrp //abs(x+fold)-(abs(x-fold)+x),fold | |
| fld qword [edx] //y,fold | |
| fld st(0) | |
| fsub st(0), st(3) | |
| fabs | |
| fadd st(0), st(1) | |
| fxch | |
| fadd st(0), st(3) | |
| fabs | |
| fsubrp | |
| fld qword [ecx] //y,fold | |
| fld st(0) | |
| fsub st(0), st(4) | |
| fabs | |
| fadd st(0), st(1) | |
| fxch | |
| fadd st(0), st(4) | |
| fabs | |
| fsubrp //z,y,x,fold | |
| fld st(0) //7 | |
| fmul st(0), st(1) | |
| fld st(2) //8 | |
| fmul st(0), st(3) | |
| faddp //7 | |
| fld st(3) //8 | |
| fmul st(0), st(4) | |
| faddp //r,z,y,x,-fold,fold,fold x2 | |
| fcom qword [esi - 32] | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @@7 | |
| fstp st(0) | |
| fld qword [esi - 24] | |
| jmp @@9 | |
| @@7: //r,z,y,x,-fold,fold,fold x2 | |
| fld1 | |
| fcom st(1) | |
| fnstsw ax | |
| shr ah, 1 | |
| jc @@8 | |
| fstp st(0) | |
| fdivr qword [esi - 16] | |
| jmp @@9 | |
| @@8: | |
| fcompp | |
| fld qword [esi - 16] | |
| @@9: | |
| fmul st(3), st(0) //mul,zr,yr,xr,-fold,fold, foldx2 | |
| fmul st(2), st(0) | |
| fmulp //zr,yr,xr,-fold,fold, foldx2 | |
| mov esi, [ebp + 8] | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| fadd qword [esi + 24] | |
| fstp qword [ebx] | |
| fstp st(0) | |
| mov eax, ebx | |
| pop ebx | |
| pop esi | |
| end; | |
| procedure HybridCubeDE(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi //Amazing box without adding c x87 with option fold | |
| push ebx | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov ebx, eax | |
| mov esi, [esi + 48] //was:PAligned16 | |
| fld qword [esi - 40] //fold | |
| fld st(0) | |
| fchs //-fold,fold | |
| fld qword [ebx] //x,-fold,fold | |
| fld st(0) //x,x,-fold,fold folding with x = abs(x+fold) - abs(x-fold) - x | |
| fadd st(0), st(2) | |
| fabs | |
| fadd st(0), st(1) | |
| fxch //x,abs(x-fold)+x,-fold,fold | |
| fadd st(0), st(3) | |
| fabs | |
| fsubrp //abs(x+fold)-(abs(x-fold)+x),-fold,fold | |
| fld qword [edx] //y,x,-fold,fold | |
| fld st(0) | |
| fadd st(0), st(3) | |
| fabs | |
| fadd st(0), st(1) | |
| fxch | |
| fadd st(0), st(4) | |
| fabs | |
| fsubrp | |
| fld qword [ecx] //z,y,x,-fold,fold | |
| fld st(0) | |
| fadd st(0), st(4) | |
| fabs | |
| fadd st(0), st(1) | |
| fxch | |
| fadd st(0), st(5) | |
| fabs | |
| fsubrp | |
| fld st(0) //7 | |
| fmul st(0), st(1) | |
| fld st(2) //8 | |
| fmul st(0), st(3) | |
| faddp //7 | |
| fld st(3) //8 | |
| fmul st(0), st(4) | |
| faddp //r,z,y,x,-fold,fold | |
| fcom qword [esi - 32] | |
| fnstsw ax | |
| shr ah, 1 | |
| jnc @@7 | |
| fstp st(0) | |
| fld qword [esi - 24] | |
| jmp @@9 | |
| @@7: //r,z,y,x,-fold,fold | |
| fld1 | |
| fcom st(1) | |
| fnstsw ax | |
| shr ah, 1 | |
| jc @@8 | |
| fstp st(0) | |
| fdivr qword [esi - 16] | |
| jmp @@9 | |
| @@8: | |
| fcompp | |
| fld qword [esi - 16] | |
| @@9: | |
| fld qword [ecx + 8] //w,mul,zr,yr,xr,-fold,fold | |
| fmul st(0), st(1) | |
| fstp qword [ecx + 8] | |
| fmul st(3), st(0) //mul,zr,yr,xr,-fold,fold | |
| fmul st(2), st(0) | |
| fmulp //zr,yr,xr,-fold,fold | |
| mov esi, [ebp + 8] | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| fadd qword [esi + 24] | |
| fstp qword [ebx] | |
| fcompp | |
| mov eax, ebx | |
| pop ebx | |
| pop esi | |
| end; | |
| procedure HybridCubeSSE2DE(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi | |
| push ebx | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov ebx, [esi + 48] //was:PAligned16 | |
| movupd xmm2, [eax] //[x,y] | |
| movsd xmm4, [ecx] //[z] | |
| movapd xmm0, xmm2 | |
| maxpd xmm0, [ebx - 64] //const:-R,-R,R,R | |
| maxsd xmm4, [ebx - 64] | |
| minpd xmm0, [ebx - 48] | |
| minsd xmm4, [ebx - 48] | |
| addpd xmm0, xmm0 | |
| addsd xmm4, xmm4 | |
| subpd xmm0, xmm2 | |
| subsd xmm4, [ecx] | |
| movapd xmm1, xmm0 //x, y | |
| movsd xmm5, xmm4 | |
| mulpd xmm1, xmm1 //x*x, y*y | |
| mulsd xmm5, xmm5 //z*z | |
| pshufd xmm2, xmm1, $4E //y*y, x*x copies and swaps hi<>lo | |
| addsd xmm1, xmm5 | |
| addsd xmm1, xmm2 // w = sqr(r) | |
| ucomisd xmm1, [ebx - 32] //<dOption2 //7/6 clocks ucomisd latency :-( | |
| movsd xmm3, [ebx - 24] //dOption1 | |
| jb @u3 | |
| ucomisd xmm1, [ebx + 32] //<1 ? | |
| movsd xmm3, [ebx - 16] //dPow = scale | |
| jnb @u3 | |
| divsd xmm3, xmm1 | |
| @u3: | |
| movhpd xmm4, [ecx + 8] | |
| shufpd xmm3, xmm3, 0 //r, r | |
| movupd xmm5, [esi + 24] //[J1,J2] | |
| mulpd xmm0, xmm3 | |
| mulpd xmm4, xmm3 | |
| addpd xmm0, xmm5 | |
| addsd xmm4, [esi + 40] //J3 | |
| movupd [eax], xmm0 | |
| movupd [ecx], xmm4 | |
| pop ebx | |
| pop esi | |
| end; | |
| procedure HybridItIntPow2scale(var x, y, z, w: Double; PIteration3D: TPIteration3D); //sine bulb with scaling | |
| asm | |
| push esi | |
| push edi | |
| mov edi, [ebp + 8] | |
| mov esi, [edi + 48] | |
| fld qword [ecx] | |
| fld qword [edx] | |
| fld qword [eax] //x,y,z | |
| fld qword [esi - 72] // scaling | |
| fld1 | |
| fdivrp | |
| fmul st(3), st(0) | |
| fmul st(2), st(0) | |
| fmulp | |
| fld st(1) //y,x,y,z | |
| fmul st(0), st(2) // y*y,x,y,z | |
| fld st(1) // x,y*y,x,y,z | |
| fmul st(0), st(2) // x*x, y*y,x,y,z | |
| fld st(0) // x*x, x*x, y*y,x,y,z | |
| fadd st(0), st(2) // xx+yy, xx, yy,x,y,z | |
| fld st(0) // xx+yy, xx+yy, xx, yy,x,y,z | |
| fsqrt | |
| fmul st(0), st(6) //*z | |
| fadd st(0), st(0) //*2 | |
| fchs | |
| fmul qword [esi - 72] | |
| fadd qword [edi + 40] | |
| fstp qword [ecx] //xx+yy, xx, yy,x,y,z | |
| fld st(5) //z, xx+yy, xx, yy,x,y,z | |
| fmulp st(6), st(0) //xx+yy, xx, yy,x,y,z*z | |
| fld st(0) //xx+yy, xx+yy, xx, yy,x,y,z*z | |
| fsubrp st(6), st(0) //xx+yy, xx, yy,x,y, a - z*z | |
| fdivp st(5), st(0) //xx, yy,x,y, a - z*z / a = a | |
| fsubrp //xx-yy,x,y, a | |
| fmul st(0), st(3) //a(xx-yy),x,y, a | |
| fmul qword [esi - 72] | |
| fadd qword [edi + 24] | |
| fstp qword [eax] //x,y, a | |
| fmulp | |
| fmulp //x*y*a | |
| fadd st(0), st(0) //*2 | |
| fmul qword [esi - 72] | |
| fadd qword [edi + 32] | |
| fstp qword [edx] | |
| pop edi | |
| pop esi | |
| end; | |
| procedure HybridSuperCube2(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| var R1, R2, m, m2: Double; | |
| xyzIn, xyzOut: TVec3D; | |
| begin | |
| // testhybridOptionVals: array[0..5] of Double = (2, 0.5, 1, 1, 2, 1.9); | |
| if PIteration3D.Rout < PDouble(Integer(PIteration3D.PVar) - 80)^ then //smooth Bulbox | |
| with PIteration3D^ do | |
| begin | |
| if Rout < PDouble(Integer(PVar) - 88)^ then | |
| HybridItIntPow2scale(x, y, z, w, PIteration3D) //ThybridIteration(pCodePointer) := fHIntFunctions[Round(dSIpow)]; | |
| else | |
| begin | |
| R1 := PDouble(Integer(PVar) - 88)^; | |
| m := (Rout - R1) / (PDouble(Integer(PVar) - 80)^ - R1); | |
| FastMove(x, xyzIn, 24); | |
| HybridItIntPow2scale(x, y, z, w, PIteration3D); | |
| FastMove(x, xyzOut, 24); | |
| FastMove(xyzIn, x, 24); | |
| fHybridCube(x, y, z, w, PIteration3D); | |
| R1 := Sqrt(Sqr(x) + Sqr(y) + Sqr(z)); | |
| m2 := 1 - m; | |
| R2 := R1 * m + m2 * Sqrt(Sqr(xyzOut[0]) + Sqr(xyzOut[1]) + Sqr(xyzOut[2])); | |
| x := x * m + m2 * xyzOut[0]; | |
| y := y * m + m2 * xyzOut[1]; | |
| z := z * m + m2 * xyzOut[2]; | |
| R1 := R2 / Sqrt(Sqr(x) + Sqr(y) + Sqr(z) + 1e-40); | |
| x := x * R1; | |
| y := y * R1; | |
| z := z * R1; | |
| end; | |
| end | |
| else fHybridCube(x, y, z, w, PIteration3D); | |
| { if PIteration3D.Rout < PDouble(Integer(PIteration3D.PVar) - 80)^ then //Bulbox, only RThreshold | |
| HybridItIntPow2scale(x, y, z, w, PIteration3D) //bscale5 vid=34s, 29.6s | |
| else | |
| fHybridCube(x, y, z, w, PIteration3D); } | |
| end; | |
| procedure HybridFolding(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi | |
| push edi | |
| push ebx | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov edi, [esi + 48] | |
| fld qword [edi - 24] //fold | |
| fld qword [eax] //x,fold | |
| fld st(0) //x,x,fold folding with x = abs(x+fold) - abs(x-fold) - x | |
| fsub st(0), st(2) | |
| fabs | |
| fadd st(0), st(1) //abs(x-fold)+x,x,fold | |
| fxch //x,abs(x-fold)+x,fold | |
| fadd st(0), st(2) | |
| fabs | |
| fsubrp //abs(x+fold)-(abs(x-fold)+x),fold | |
| fstp qword [eax] | |
| fld qword [edx] //y,fold | |
| fld st(0) | |
| fsub st(0), st(2) | |
| fabs | |
| fadd st(0), st(1) | |
| fxch | |
| fadd st(0), st(2) | |
| fabs | |
| fsubrp | |
| fstp qword [edx] | |
| fld qword [ecx] //z,fold | |
| fld st(0) | |
| fsub st(0), st(2) //z-fold,z,fold | |
| fabs | |
| fadd st(0), st(1) //z+abs(z-fold),z,fold | |
| fxch st(2) | |
| faddp //z+fold,z+abs(z-fold) | |
| fabs | |
| fsubrp //z' | |
| fstp qword [ecx] | |
| mov ebx, [ebp + 12] | |
| push ebx | |
| push esi | |
| call [edi - 52] | |
| pop ebx | |
| pop edi | |
| pop esi | |
| end; | |
| procedure EmptyFormula(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| begin //not used formulas, itCount might be set to bigger 0 and executed! | |
| end; | |
| //########### from here: custom formulas generation, not at runtime -> use IFStest instead! | |
| procedure HybridCustomIFS; //for IFS, different calling convention! esi+edi is @it3dext.x+128 and @Pvar | |
| asm | |
| end; | |
| {function ArcSin(const X : Double) : Double; overload; | |
| asm | |
| //Result := ArcTan2(X, Sqrt((1+X) * (1-X))) | |
| FLD X x | |
| FLD1 1,x | |
| FADD ST(0), ST(1) 1+x,x | |
| FLD1 1,1+x,x | |
| FSUB ST(0), ST(2) 1-x,1+x,x | |
| FMULP ST(1), ST(0) (1-x)*(1+x),x | |
| FSQRT | |
| FPATAN | |
| end;} | |
| { fld1 1 | |
| fld X x,1 | |
| fst st(2) x,1,x | |
| fmul st(0), st(0) xx,1,x | |
| fsubp 1-xx | |
| fsqrt | |
| fpatan} | |
| { fldln2 power function | |
| fxch | |
| fyl2x | |
| fxch | |
| fmulp | |
| fldl2e | |
| fmulp | |
| fld st(0) | |
| frndint | |
| fsub st(1), st(0) | |
| fxch | |
| f2xm1 | |
| fld1 | |
| faddp | |
| fscale | |
| fstp st(1) | |
| } | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| {procedure HybridCustomRiemann(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| asm | |
| push esi | |
| push edi | |
| mov esi, [ebp + 8] //PIteration3D //Riemann | |
| mov edi, [esi + 48] | |
| fld qword [eax] | |
| fld qword [edx] | |
| fld qword [ecx] | |
| fld qword [esi + 56] //Rout,z,y,x | |
| fsqrt | |
| fld1 //1,sqrt(Rout),z,y,x | |
| fdivrp //1/sqrt(Rout),z,y,x | |
| fmul st(3), st(0) | |
| fmul st(2), st(0) | |
| fmulp //z,y,x *rx | |
| fld1 //1,z,y,x | |
| fsub st(2), st(0) //1,z,y-1,x | |
| fdivr st(2), st(0) //1,z,1/(y-1),x | |
| fxch st(2) //1/(y-1),z,1,x | |
| fmul st(3), st(0) | |
| fmulp //z/(y-1),1,x/(y-1) =rz,1,rx | |
| fld st(2) //rx,rz,1,rx | |
| fmul st(0), st(3) //rxrx,rz,1,rx | |
| fsub st(0), st(2) //rxrx-1,rz,1,rx | |
| fxch //rz,rxrx-1,1,rx | |
| fxch st(3) //rx,rxrx-1,1,rz | |
| fadd st(0), st(0) //2rx,rxrx-1,1,rz | |
| fxch | |
| fpatan //atx,1,rz arctan(st1/st0) arctan2(y,x) (2rx,rxrx-1) | |
| fld st(2) //rz,atx,1,rz | |
| fmul st(0), st(3) | |
| fsub st(0), st(2) //rzrz-1,atx,1,rz | |
| fxch //atx,rzrz-1,1,rz | |
| fxch st(3) //rz,rzrz-1,1,atx | |
| fadd st(0), st(0) //2rz,rzrz-1,1,atx | |
| fxch | |
| fpatan //atz,1,atx | |
| fld qword [edi - 16] //p,atz,1,atx | |
| fmul st(3), st(0) //p,atz,1,p*atx | |
| fmulp //p*atz,1,p*atx | |
| fsincos //cosz,sinz,1,patx | |
| fadd st(0), st(2) //cosz+1,sinz,1,patx | |
| fdivp //rz,1,patx | |
| fxch st(2) //patx,1,rz | |
| fsincos //cosx,sinx,1,rz | |
| fadd st(0), st(2) //cosx+1,sinx,1,rz | |
| fdivp //rx,1,rz | |
| fld st(0) //rx,rx,1,rz | |
| fmul st(0), st(1) //rxrx,rx,1,rz | |
| fld st(3) //rz,rxrx,rx,1,rz | |
| fmul st(0), st(4) | |
| faddp //rzrz+rxrx,rx,1,rz | |
| fld st(0) //rzrz+rxrx,rzrz+rxrx,rx,1,rz | |
| fadd st(0), st(3) //rzrz+rxrx+1,rzrz+rxrx,rx,1,rz | |
| fdivr st(0), st(3) //1/rzx1,rzx,rx,1,rz | |
| fxch //rzx,05c,rx,1,rz | |
| fsubrp st(3), st(0) //05c,rx,rzx-1,rz | |
| fmul st(3), st(0) //05c,rx,rzx-1,rz*05c | |
| fmul st(2), st(0) | |
| fmulp //05a,b,05c | |
| fld qword [edi - 16] //p,05a,b,05c | |
| fmul qword [edi - 8] //05p,05a,b,05c | |
| fld qword [esi + 56] //rout,05p,05a,b,05c | |
| fldln2 //ln2,rout,05p,05a,b,05c power function | |
| fxch | |
| fyl2x | |
| fxch | |
| fmulp | |
| fldl2e | |
| fmulp | |
| fld st(0) | |
| frndint | |
| fsub st(1), st(0) | |
| fxch | |
| f2xm1 | |
| fld1 | |
| faddp | |
| fscale | |
| fstp st(1) | |
| fmul st(3), st(0) //pow(rout),05a,b,05c | |
| fmul st(2), st(0) | |
| fmulp //05a,b,05c | |
| fadd st(0), st(0) | |
| fadd qword [esi + 24] | |
| fstp qword [eax] //2b,c | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| fadd st(0), st(0) | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] | |
| pop edi | |
| pop esi | |
| end; } | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| {procedure HybridCustomPas(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| var i: Integer; | |
| psi, psi2, cs, sn, a, xt, yt, zt: Double; | |
| begin | |
| with PIteration3D^ do | |
| begin | |
| i := Integer(PVar); | |
| asm | |
| fld qword [edi] | |
| fld qword [esi] | |
| fpatan | |
| fstp qword [ebp - $10] | |
| end; // 0 +8 +16 +24 +32 | |
| psi := psi + PDouble(i + 32)^; //msltoe Vars: Pi/8, Pi/4, 1, 2, 2*Pi | |
| psi2 := 0; | |
| while (psi > PDouble(i)^) do | |
| begin | |
| psi := psi - PDouble(i + 8)^; | |
| psi2 := psi2 - PDouble(i + 8)^; | |
| end; | |
| asm | |
| fld qword [ebp - $18] | |
| fsincos | |
| fstp qword [ebp - $20] | |
| fstp qword [ebp - $28] | |
| end; | |
| // cs := Cos(psi2); | |
| // sn := Sin(psi2); | |
| yt := y*cs - z*sn; | |
| zt := y*sn + z*cs; | |
| y := yt; | |
| z := zt; | |
| a := PDouble(i + 16)^ - z*z / (x*x + y*y + z*z); | |
| xt := (x*x - y*y) * a; | |
| yt := PDouble(i + 24)^ *x*y * a; | |
| zt := PDouble(i + 24)^ *z*Sqrt(x*x + y*y); | |
| x := xt + J1; | |
| y := yt*cs + zt*sn + J2; | |
| z := zt*cs - yt*sn + J3; | |
| end; | |
| end; | |
| {function ArcTan2D(Y, X: Double): Double; | |
| asm | |
| FLD Y | |
| FLD X | |
| FPATAN | |
| FWAIT | |
| end; } | |
| //x:eax,y:edx,z:ecx,w:esp->ebp+12, PIt:ebp+8 | |
| procedure AexionC(var x, y, z, w: Double; PIteration3D: TPIteration3D); | |
| {var ph, th, pp, r1, Sx, Cx, Sy, Cy: Double; | |
| pb: PByteArray; | |
| pd: PDouble; | |
| begin | |
| with TPIteration3Dext(Integer(PIteration3D) - 56)^ do | |
| begin //Aexion rotate c [Power, Z mul, Enable RotC (0,1), Cond Phi (0,1), Power C, Cz mul, Mod (0,1)] | |
| pb := Pointer(Integer(PVar) - 56); ATth(1,2) ATph(3,4) | |
| pd := @pb[56-16]; Modus: 0: J1|J3,J2 J3,J1 mod and 1 -> | |
| r1 := x*x + y*y + z*z; 1: J1|J2,J3 J2,J1 xch 2<>3 | |
| th := ArcTan2D(Sqrt(x*x + z*z), y) * pd^; 2: J2|J3,J1 J3,J2 xch 1<>2 | |
| ph := ArcTan2D(z, x) * pd^; 3: J1|J3,J2 J3,J1 diffs | |
| SinCosD(ph, Sx, Cx); 4: J1|J2,J3 J2,J1 xch 2<>3 | |
| SinCosD(th, Sy, Cy); 5: J2|J3,J1 J3,J2 xch 1<>2 | |
| r1 := Power(r1, pd^ * 0.5); | |
| x := Cy * Cx * r1 + J1; | |
| y := Cy * Sx * r1 + J2; | |
| z := r1 * Sy * PDouble(@pb[56-24])^ + J3; | |
| if pb[56-28] <> 0 then //rotate c | |
| begin | |
| if pb[56-52] <> 0 then | |
| begin | |
| pp := LengthOfVec(SubtractVectors(TPVec3D(@x), TPVec3D(@J1)^)); | |
| pd := @pp; | |
| end | |
| else pd := @pb[56-40]; | |
| r1 := Sqrt(J1*J1 + J2*J2 + J3*J3); | |
| if pb[56-56] = 1 then | |
| begin | |
| th := ArcTan2D(Sqrt(Sqr(x - J1) + Sqr(z - J3)), y - J2) * pd^; | |
| ph := ArcTan2D(z - J3, x - J1) * pd^; | |
| end else begin | |
| th := ArcTan2D(Sqrt(J1*J1 + J3*J3), J2) * pd^; | |
| ph := ArcTan2D(J3, J1) * pd^; | |
| end; | |
| if (pb[56-32] <> 0) and (x > 0) then ph := -ph; // conditional phi1 := (x>0)?atan2(cz,cx)*8:-atan2(cz,cx)*8; | |
| SinCosD(ph, Sx, Cx); // ph := ph xor ((UserInCond and 1) shl 31) and x) xor $80000000; | |
| SinCosD(th, Sy, Cy); | |
| J1 := Cy * Cx * r1; | |
| J2 := Cy * Sx * r1; | |
| J3 := r1 * Sy * PDouble(@pb[56-48])^; | |
| end; | |
| end; } | |
| asm | |
| push esi | |
| push edi | |
| push ebx | |
| push ecx | |
| mov esi, [ebp + 8] //PIteration3D | |
| mov edi, [esi + 48] | |
| fld qword [ecx] | |
| fld qword [edx] | |
| fld qword [eax] //x,y,z | |
| fld st(1) | |
| fmul st, st //yy,x,y,z | |
| fxch st(2) //y,x,yy,z | |
| fld st(3) | |
| fmul st, st //zz,y,x,yy,z | |
| fld st(2) | |
| fmul st, st //xx,zz,y,x,yy,z | |
| fld st(1) //zz,xx,zz,y,x,yy,z | |
| fadd st, st(1) | |
| faddp st(5), st //xx,zz,y,x,r1,z | |
| faddp | |
| fsqrt //sqrt(xx+zz),y,x,r1,z | |
| fxch | |
| fpatan //th,x,r1,z | |
| fxch st(3) | |
| fxch //x,z,r1,th | |
| fpatan //ph,r1,th | |
| fld qword [edi - 16] //pow,ph,r1,th | |
| fmul st(3), st | |
| fmul st(1), st | |
| fmul qword [edi - 8] //pow*0.5,ph,r1,th | |
| fxch //ph,pow',r1,th | |
| fxch st(2) //r1,pow',ph,th | |
| fldln2 //power function base,expo -> st, st(1) | |
| fxch | |
| fyl2x | |
| fxch | |
| fmulp | |
| fldl2e | |
| fmulp | |
| fld st(0) | |
| frndint | |
| fsub st(1), st(0) | |
| fxch | |
| f2xm1 | |
| fld1 | |
| faddp | |
| fscale | |
| fstp st(1) //r1',ph,th | |
| fxch st(2) //th, ph, r1 | |
| fsincos //ct,st, ph, r1 | |
| fxch st(2) //ph, st,ct, r1 | |
| fsincos //cosP,sinP, sinT,cosT, r1 | |
| fmul st, st(3) | |
| fmul st, st(4) | |
| fadd qword [esi + 24] | |
| fstp qword [eax] //sinP, sinT,cosT, r1 | |
| fmulp st(2), st //sinT,cosT*SinP, r1 | |
| fmul st, st(2) | |
| fmul qword [edi - 24] | |
| fadd qword [esi + 40] | |
| fstp qword [ecx] //cosT*SinP, r1 | |
| fmulp | |
| fadd qword [esi + 32] | |
| fstp qword [edx] | |
| cmp dword [edi - 28], 0 | |
| jz @@1 | |
| fld qword [edi - 40] //pd^ | |
| cmp dword [edi - 52], 0 | |
| jz @@2 | |
| fld qword [eax] | |
| fsub qword [esi + 24] | |
| fmul st, st | |
| fld qword [edx] | |
| fsub qword [esi + 32] | |
| fmul st, st | |
| faddp | |
| fld qword [ecx] | |
| fsub qword [esi + 40] | |
| fmul st, st | |
| faddp | |
| fsqrt | |
| fmulp | |
| @@2: //pd^ | |
| fld qword [esi + 24] | |
| fmul st, st | |
| fld qword [esi + 32] | |
| fmul st, st | |
| faddp | |
| fld qword [esi + 40] | |
| fmul st, st | |
| faddp | |
| fsqrt //r1, pd^ | |
| mov ebx, [edi - 56] | |
| test ebx, 16 //Modus Bit1: Flip atan theta, 2: Flip atan phi, 3: Flip theta and phi, 4: Flip CxCy, 5: diffs | |
| jz @@4 // r,y z,x y<>x/z y<>x | |
| fld qword [eax] | |
| fsub qword [esi + 24] | |
| fld qword [ecx] | |
| fsub qword [esi + 40] | |
| fld qword [edx] | |
| fsub qword [esi + 32] | |
| jmp @@5 | |
| @@4: | |
| fld qword [esi + 24] | |
| fld qword [esi + 40] | |
| fld qword [esi + 32] | |
| @@5: //Cy, Cz, Cx, r1, pd^ | |
| xor eax, eax //offset for cond phi test, normally x, or z if only flip-at2 | |
| xor ecx, ecx | |
| add ecx, 8 | |
| test ebx, 8 //Modus bit4: flip CYCX | |
| jz @@6 | |
| fxch //st(2) //(Cx,Cz,Cy) | |
| add ecx, 8 //(Cz,Cx,Cy) test: Flip Cy<>Cz | |
| // mov eax, ecx | |
| // xor ecx, ecx | |
| @@6: //y, z, x, r1, pd^ | |
| fld st(1) | |
| fmul st, st | |
| fld st(3) | |
| fmul st, st | |
| faddp //xx+zz, y, z, x, r1, pd^ | |
| fsqrt //sqrt(sqr(j1)+sqr(j3)), y, z, x, r1, pd | |
| test ebx, 1 //flip AT theta | |
| jnz @@8 | |
| fxch | |
| @@8: | |
| fpatan //th, Cz, Cx, r1, pd | |
| fxch st(2) //Cx, Cz, th, r1, pd | |
| test ebx, 2 //flip AT phi | |
| jz @@9 | |
| fxch | |
| add eax, 24 | |
| sub eax, ecx | |
| // mov eax, 16 | |
| @@9: | |
| fpatan //ph, th, r1, pd | |
| test ebx, 4 | |
| jz @@7 | |
| fxch | |
| mov eax, ecx | |
| @@7: | |
| cmp dword [edi - 32], 0 | |
| jz @@10 | |
| test dword [edx + eax - 4], $80000000 | |
| jnz @@10 | |
| fchs | |
| @@10: | |
| fmul st, st(3) | |
| fxch st(3) //pd, th, r1, ph | |
| fmulp //th, r1, ph | |
| fsincos //costh,sinth,r1,ph | |
| fxch st(3) //ph,sinth,r1,costh | |
| fsincos //Cx,Sx,Sy,r1,Cy | |
| fmul st, st(4) | |
| fmul st, st(3) | |
| fstp qword [esi + 24] //Sx,Sy,r1,Cy | |
| fmulp st(3), st //Sy,r1,Cy*Sx | |
| fmul st, st(1) | |
| fmul qword [edi - 48] | |
| fstp qword [esi + 40] //r1,Cy*Sx | |
| fmulp | |
| fstp qword [esi + 32] | |
| @@1: | |
| pop ecx | |
| pop ebx | |
| pop edi | |
| pop esi | |
| end; | |
| end. | |