/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma version(1)
#pragma rs java_package_name(com.example.android.rs.vr.engine)
#pragma rs_fp_relaxed

int size;
int z;
rs_allocation volume;

static float3 nylander(float3 p, int n) {
    float3 out;
    float r = length(p);
    float phi = atan2(p.y, p.x);
    float theta = acos(p.z / r);
    float rn = pow(r, n);
    out.x = sin(n * theta) * cos(n * phi);
    out.y = sin(n * theta) * sin(n * phi);
    out.z = cos(n * theta);
    return out * rn;
}

/**
* 8 x faster than the above for n = 3
*/
static float3 nylander3(float3 p) {
    float3 out = (float3){0.f, 0.f, 0.f};
    float xy2 = p.x * p.x + p.y * p.y;
    if (xy2 == 0) return out;
    float z23x2y2 = (3 * p.z * p.z - p.x * p.x - p.y * p.y);
    out.x = (z23x2y2 * p.x * (p.x * p.x - 3 * p.y * p.y)) / xy2;
    out.y = (z23x2y2 * p.y * (3 * p.x * p.x - p.y * p.y)) / xy2;
    out.z = p.z * (p.z * p.z - 3 * p.x * p.x - 3 * p.y * p.y);
    return out;
}

static float vsize(float3 p) {
    return sqrt(p.x * p.x + p.y * p.y + p.z * p.z);
}

short __attribute__((kernel)) mandelbulb(uint32_t x, uint32_t y) {
    int size2 = size / 2;
     if (z < size2) {
          return 256-4*(size2-z+4)*hypot((float)x-size2,(float)y-size2) / size2 ;
    }
    float3 c = (float3) {(float) x, (float) y, (float) z};
    c = ((c - size2) / (size2 * .9f));

    int loop = 25;
    float3 p = c;
    float len;
    for (int i = 0; i < loop; i++) {
        //    p = nylander(p, 3) + c;
        p = nylander3(p) + c;
        len = fast_length(p);
        if (len > 2.f) return 255 - loop*10;
        if (len < .3f) return loop*10;

    }
    len = length(p);
    return (short) (255 - (len * 255) / 4);
}

void __attribute__((kernel)) copy(short in, uint32_t x, uint32_t y) {
    rsSetElementAt_short(volume, in, x, y, z);
}
