15ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford/*
25ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * Copyright (C) 2015 The Android Open Source Project
35ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford *
45ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * Licensed under the Apache License, Version 2.0 (the "License");
55ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * you may not use this file except in compliance with the License.
65ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * You may obtain a copy of the License at
75ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford *
85ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford *      http://www.apache.org/licenses/LICENSE-2.0
95ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford *
105ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * Unless required by applicable law or agreed to in writing, software
115ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * distributed under the License is distributed on an "AS IS" BASIS,
125ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * See the License for the specific language governing permissions and
145ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford * limitations under the License.
155ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford */
165ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
175ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford#pragma version(1)
185ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford#pragma rs java_package_name(com.example.android.rs.vr.engine)
195ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford#pragma rs_fp_relaxed
205ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
215ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordint size;
225ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordint z;
235ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordrs_allocation volume;
245ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
255ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic float sigmoid(float f) {
265ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (float) (1 / (1 + exp(f / 2)));
275ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
285ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
295ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic float pillDistance(float3 p1, float3 p2, float3 img) {
305ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
315ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    if (dot(p2 - p1, img - p1) > 0 && dot(p1 - p2, img - p2) > 0) {
325ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        return length(cross(img - p1, img - p2)) / length(p2 - p1);
335ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
345ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return min(distance(p1, img), distance(p2, img));
355ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
365ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
375ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic short pill(float3 p1, float3 p2, float rad, short max, float3 img) {
385ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (short) (max * sigmoid(pillDistance(p1, p2, img) - rad));
395ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
405ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
415ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic short cogPill(float3 p1, float3 p2, float rad, short max, float3 img) {
425ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float3 vec = (p1 + p2) / 2 - img;
435ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float angle = fabs(2 * fract(atan2pi(vec.z, vec.y) * 5) - 1);
445ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (short) (max
455ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford            * sigmoid(pillDistance(p1, p2, img) - rad * (1 + angle / 2)));
465ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
475ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
485ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic float cylinderDistance(float3 p1, float3 p2, float3 img) {
495ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float dot1 = dot(p2 - p1, img - p1);
505ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float dot2 = dot(p1 - p2, img - p2);
515ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    if (dot1 > 0 && dot2 > 0) {
525ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        return length(cross(img - p1, img - p2)) / length(p2 - p1);
535ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
545ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return -dot1 * dot2;
555ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
565ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
575ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic short cylinder(float3 p1, float3 p2, float rad, short max, float3 img) {
585ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (short) (max * sigmoid(cylinderDistance(p1, p2, img) - rad));
595ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
605ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
615ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic short cogCylinder(float3 p1, float3 p2, float rad, short max, float3 img) {
625ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float3 vec = (p1 + p2) / 2 - img;
635ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float angle = fabs(2 * fract(atan2pi(vec.y, vec.x) * 6) - 1);
645ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (short) (max
655ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford            * sigmoid(cylinderDistance(p1, p2, img) - rad * (1 + angle / 5)));
665ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
675ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
685ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic float distanceCircle(float3 center, float radius, float3 normal,
695ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 img) {
705ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float3 pc = img - center;
715ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float tmp1 = dot(normal, pc);
725ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    tmp1 = tmp1 * tmp1;
735ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float tmp2 = (sqrt(length(pc) * length(pc) - tmp1) - radius);
745ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return tmp1 + tmp2 * tmp2;
755ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
765ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
775ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic short circle(float3 center, float circleRadius, float3 normal, float rad,
785ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        short max, float3 img) {
795ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (short) (max
805ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford            * sigmoid(distanceCircle(center, circleRadius, normal, img) - rad));
815ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
825ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
835ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic float distanceDisk(float3 center, float radius, float3 normal,
845ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 img) {
855ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float3 pc = img - center;
865ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float tmp1 = dot(normal, pc);
875ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    tmp1 = tmp1 * tmp1;
885ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float tmp2 = (sqrt(length(pc) * length(pc) - tmp1) - radius);
895ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    if (length(pc - dot(normal, pc) * normal) > radius) {
905ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        return (tmp1 + tmp2 * tmp2);
915ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
925ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return tmp1;
935ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
945ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
95de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouillet/* Unused function:
965ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic short disk(float3 center, float circleRadius, float3 normal, float rad,
975ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        short max, float3 img) {
985ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (short) (max
995ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford            * sigmoid(distanceDisk(center, circleRadius, normal, img) - rad));
1005ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
101de235208fd6bcaa29c95404d990f7b5e212435f9Jean-Luc Brouillet*/
1025ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1035ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic short cogDisk(float3 center, float circleRadius, float3 normal,
1045ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float rad, short max, float3 img) {
1055ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float3 vec = center - img;
1065ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float angle = fabs(2 * fract(atan2pi(vec.y, vec.x) * 20) - 1);
1075ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return (short) (max
1085ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford            * sigmoid(
1095ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford                    distanceDisk(center, circleRadius * (1 + angle / 10),
1105ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford                            normal, img) - rad));
1115ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
1125ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1135ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic float andyBody(float3 img) {
1145ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    short v = 0;
1155ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // body
1165ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * 0.5f, size * 0.5f, size * 0.3f };
1175ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * 0.5f, size * 0.5f, size * 0.65f };
1185ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float radius = size * 0.22f;
1195ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, cylinder(p1, p2, radius, 144, img));
1205ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        p2.z = size * 0.4f;
1215ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, radius, 144, img));
1225ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 normal = { 0.0f, 0.0f, 1.0f };
123027b30b3090dd5671b58223369ef7751e145d4d3hoford        v -= circle(p1, radius*0.9f, normal, size * 0.05f, 144, img);
1245ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1255ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float armOffset = 0.27f;
1265ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // arm 1
1275ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * (0.5f - armOffset), size * 0.5f, size * 0.4f };
1285ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * (0.5f - armOffset), size * 0.5f, size * 0.57f };
1295ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.09f, 144, img));
1305ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1315ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // arm 2
1325ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * (0.5f + armOffset), size * 0.5f, size * 0.4f };
1335ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * (0.5f + armOffset), size * 0.5f, size * 0.57f };
1345ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.09f, 144, img));
1355ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1365ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // leg 1
1375ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * 0.6f, size * 0.5f, size * 0.6f };
1385ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * 0.6f, size * 0.5f, size * 0.8f };
1395ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.08f, 144, img));
1405ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1415ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // leg 2
1425ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * 0.4f, size * 0.5f, size * 0.6f };
1435ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * 0.4f, size * 0.5f, size * 0.8f };
1445ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.08f, 144, img));
1455ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1465ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float3 p1 = { size * 0.5f, size * 0.5f, size * 0.3f };
1475ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    ;
1485ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // antenna
149027b30b3090dd5671b58223369ef7751e145d4d3hoford        float spacex = .1f;
1505ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1515ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * (0.5f - spacex), size * 0.5f, size * 0.07f };
1525ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.017f, 400, img));
1535ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p3 = { size * (0.5f + spacex), size * 0.5f, size * 0.07f };
1545ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p3, size * 0.017f, 400, img));
1555ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1565ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // eyes
157027b30b3090dd5671b58223369ef7751e145d4d3hoford        float spacex = .105f;
1585ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * (0.5f - spacex), size * 0.4f, size * 0.2f };
1595ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p3 = { size * (0.5f + spacex), size * 0.4f, size * 0.2f };
1605ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v -= pill(p2, p2, size * 0.018f, 144, img);
1615ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v -= pill(p3, p3, size * 0.018f, 144, img);
1625ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.032f, 400, img));
1635ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p3, size * 0.032f, 400, img));
1645ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1655ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return v;
1665ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1675ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
1685ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1695ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordstatic float andySkeleton(float3 img) {
1705ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    short v = 0;
1715ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // body
1725ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * 0.5f, size * 0.5f, size * 0.3f };
1735ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float radius = size * 0.15f;
1745ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1755ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 normal = { 0.0f, 0.0f, 1.0f };
1765ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        for (int i = 0; i < 5; i++) {
177027b30b3090dd5671b58223369ef7751e145d4d3hoford            p1.z += size * 0.04f;
178027b30b3090dd5671b58223369ef7751e145d4d3hoford            v += circle(p1, radius, normal, size * 0.07f, 400, img);
1795ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        }
1805ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        p1.z = size * 0.3f;
1815ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * 0.5f, size * 0.5f, size * 0.6f };
182027b30b3090dd5671b58223369ef7751e145d4d3hoford        v = max(v, cogDisk(p2, radius * 0.7f, normal, size * 0.07f, 400, img));
183027b30b3090dd5671b58223369ef7751e145d4d3hoford        v = max(v, cogCylinder(p1, p2, size * 0.04f, 400, img));
1845ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1855ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1865ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float armOffset = 0.27f;
1875ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    {
1885ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * (0.5f - armOffset), size * 0.5f, size * 0.4f };
1895ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * (0.5f + armOffset), size * 0.5f, size * 0.4f };
1905ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, cogPill(p1, p2, size * 0.02f, 400, img));
1915ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1925ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
1935ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // arm 1
1945ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * (0.5f - armOffset), size * 0.5f, size * 0.4f };
1955ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * (0.5f - armOffset), size * 0.5f, size * 0.57f };
1965ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.02f, 400, img));
1975ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
1985ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // arm 2
1995ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * (0.5f + armOffset), size * 0.5f, size * 0.4f };
2005ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * (0.5f + armOffset), size * 0.5f, size * 0.57f };
2015ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.02f, 400, img));
2025ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
2035ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // leg 1
2045ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * 0.6f, size * 0.5f, size * 0.6f };
2055ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * 0.6f, size * 0.5f, size * 0.8f };
2065ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.02f, 400, img));
2075ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
2085ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    { // leg 2
2095ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p1 = { size * 0.4f, size * 0.5f, size * 0.6f };
2105ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        float3 p2 = { size * 0.4f, size * 0.5f, size * 0.8f };
2115ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford        v = max(v, pill(p1, p2, size * 0.02f, 400, img));
2125ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    }
2135ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return v;
2145ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
2155ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
2165ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordshort __attribute__((kernel)) andy(uint32_t x, uint32_t y) {
2175ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float3 img = { x, y, z };
2185ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    float v = andyBody(img);
2195ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    v = max(v, andySkeleton(img));
2205ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    return v;
2215ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
2225ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
2235ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford
2245ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hofordvoid __attribute__((kernel)) copy(short in, uint32_t x, uint32_t y) {
2255ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford    rsSetElementAt_short(volume, in, x, y, z);
2265ee349cd7a75079b6bac1d8ace66455ecd1afb17John Hoford}
227