// File: intheswim[P]FractalTubes/infra.cpp
// Function: getTransformedCoords(float, float, float, float, float, float, float, float, float, float, double&, double&, double&)
static void getTransformedCoords (float orig_x, float orig_y, float orig_z,
                           float tX, float tY, float tZ,
                           float angle, float rX, float rY, float rZ,
                           double & ret_x, double &ret_y, double & ret_z)
{
    orig_x += tX;
    orig_y += tY;
    orig_z += tZ;
    
    tX = tY = tZ = 0;
    
    double radians = M_PI * angle / 180.0;
    
    double c = cos (radians);
    double s = sin (radians);
    
    // normalize rX, rY, rZ
    
    double r = sqrt (rX * rX + rY * rY + rZ * rZ);
    
    rX /= r;
    rY /= r;
    rZ /= r;
    
    double A = rX * rX * (1-c) + c;
    double B = rX * rY * (1-c) - rZ * s;
    double C = rX * rZ * (1-c) + rY * s;
    double D = rY * rX * (1-c) + rZ * s;
    double E = rY * rY * (1-c) + c;
    double F = rY * rZ * (1-c) - rX * s;
    double G = rX * rZ * (1-c) - rY * s;
    double H = rY * rZ * (1-c) + rX * s;
    double I = rZ * rZ * (1-c) + c;
    
    ret_x = A * orig_x + B * orig_y + C * orig_z + tX;
    ret_y = D * orig_x + E * orig_y + F * orig_z + tY;
    ret_z = G * orig_x + H * orig_y + I * orig_z + tZ;
    
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movss 0x18(%rbp), %xmm8
movss 0x10(%rbp), %xmm8
movss %xmm0, -0x4(%rbp)
movss %xmm1, -0x8(%rbp)
movss %xmm2, -0xc(%rbp)
movss %xmm3, -0x10(%rbp)
movss %xmm4, -0x14(%rbp)
movss %xmm5, -0x18(%rbp)
movss %xmm6, -0x1c(%rbp)
movss %xmm7, -0x20(%rbp)
movq %rdi, -0x28(%rbp)
movq %rsi, -0x30(%rbp)
movq %rdx, -0x38(%rbp)
movss -0x10(%rbp), %xmm0
addss -0x4(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
movss -0x14(%rbp), %xmm0
addss -0x8(%rbp), %xmm0
movss %xmm0, -0x8(%rbp)
movss -0x18(%rbp), %xmm0
addss -0xc(%rbp), %xmm0
movss %xmm0, -0xc(%rbp)
xorps %xmm0, %xmm0
movss %xmm0, -0x18(%rbp)
xorps %xmm0, %xmm0
movss %xmm0, -0x14(%rbp)
xorps %xmm0, %xmm0
movss %xmm0, -0x10(%rbp)
movss -0x1c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd 0x8cdf(%rip), %xmm0     # 0xe2b0
mulsd %xmm1, %xmm0
movsd 0x8ccb(%rip), %xmm1     # 0xe2a8
divsd %xmm1, %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x40(%rbp), %xmm0
callq 0x3710
movsd %xmm0, -0x48(%rbp)
movsd -0x40(%rbp), %xmm0
callq 0x3090
movsd %xmm0, -0x50(%rbp)
movss -0x20(%rbp), %xmm1
movss -0x20(%rbp), %xmm2
movss 0x10(%rbp), %xmm0
mulss 0x10(%rbp), %xmm0
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movss 0x18(%rbp), %xmm0
movss 0x18(%rbp), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
callq 0x6880
cvtss2sd %xmm0, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x58(%rbp), %xmm1
movss -0x20(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x20(%rbp)
movsd -0x58(%rbp), %xmm1
movss 0x10(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x10(%rbp)
movsd -0x58(%rbp), %xmm1
movss 0x18(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x18(%rbp)
movss -0x20(%rbp), %xmm0
mulss -0x20(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8ba9(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movsd -0x48(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
movss -0x20(%rbp), %xmm0
mulss 0x10(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8b7c(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movss 0x18(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd -0x50(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x68(%rbp)
movss -0x20(%rbp), %xmm0
mulss 0x18(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8b2f(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movss 0x10(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd -0x50(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x70(%rbp)
movss 0x10(%rbp), %xmm0
mulss -0x20(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8af9(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movss 0x18(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd -0x50(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x78(%rbp)
movss 0x10(%rbp), %xmm0
mulss 0x10(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8ac3(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movsd -0x48(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x80(%rbp)
movss 0x10(%rbp), %xmm0
mulss 0x18(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8a96(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movss -0x20(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd -0x50(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x88(%rbp)
movss -0x20(%rbp), %xmm0
mulss 0x18(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x8a46(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movss 0x10(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd -0x50(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x90(%rbp)
movss 0x10(%rbp), %xmm0
mulss 0x18(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x89f6(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movss -0x20(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd -0x50(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x98(%rbp)
movss 0x18(%rbp), %xmm0
mulss 0x18(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x89bd(%rip), %xmm2     # 0xe250
subsd -0x48(%rbp), %xmm2
movsd -0x48(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0xa0(%rbp)
movsd -0x60(%rbp), %xmm1
movss -0x4(%rbp), %xmm0
cvtss2sd %xmm0, %xmm2
movsd -0x68(%rbp), %xmm0
movss -0x8(%rbp), %xmm3
cvtss2sd %xmm3, %xmm3
mulsd %xmm3, %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x70(%rbp), %xmm0
movss -0xc(%rbp), %xmm2
cvtss2sd %xmm2, %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movss -0x10(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
addsd %xmm1, %xmm0
movq -0x28(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x78(%rbp), %xmm1
movss -0x4(%rbp), %xmm0
cvtss2sd %xmm0, %xmm2
movsd -0x80(%rbp), %xmm0
movss -0x8(%rbp), %xmm3
cvtss2sd %xmm3, %xmm3
mulsd %xmm3, %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x88(%rbp), %xmm0
movss -0xc(%rbp), %xmm2
cvtss2sd %xmm2, %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movss -0x14(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
addsd %xmm1, %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x90(%rbp), %xmm1
movss -0x4(%rbp), %xmm0
cvtss2sd %xmm0, %xmm2
movsd -0x98(%rbp), %xmm0
movss -0x8(%rbp), %xmm3
cvtss2sd %xmm3, %xmm3
mulsd %xmm3, %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0xa0(%rbp), %xmm0
movss -0xc(%rbp), %xmm2
cvtss2sd %xmm2, %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movss -0x18(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
addsd %xmm1, %xmm0
movq -0x38(%rbp), %rax
movsd %xmm0, (%rax)
addq $0xa0, %rsp
popq %rbp
retq
nopl (%rax,%rax)