15b539461dcc159bd89297443780d635ccc5e3564John Hoford/*
25b539461dcc159bd89297443780d635ccc5e3564John Hoford * Copyright (C) 2015 The Android Open Source Project
35b539461dcc159bd89297443780d635ccc5e3564John Hoford *
45b539461dcc159bd89297443780d635ccc5e3564John Hoford * Licensed under the Apache License, Version 2.0 (the "License");
55b539461dcc159bd89297443780d635ccc5e3564John Hoford * you may not use this file except in compliance with the License.
65b539461dcc159bd89297443780d635ccc5e3564John Hoford * You may obtain a copy of the License at
75b539461dcc159bd89297443780d635ccc5e3564John Hoford *
85b539461dcc159bd89297443780d635ccc5e3564John Hoford *      http://www.apache.org/licenses/LICENSE-2.0
95b539461dcc159bd89297443780d635ccc5e3564John Hoford *
105b539461dcc159bd89297443780d635ccc5e3564John Hoford * Unless required by applicable law or agreed to in writing, software
115b539461dcc159bd89297443780d635ccc5e3564John Hoford * distributed under the License is distributed on an "AS IS" BASIS,
125b539461dcc159bd89297443780d635ccc5e3564John Hoford * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135b539461dcc159bd89297443780d635ccc5e3564John Hoford * See the License for the specific language governing permissions and
145b539461dcc159bd89297443780d635ccc5e3564John Hoford * limitations under the License.
155b539461dcc159bd89297443780d635ccc5e3564John Hoford */
165b539461dcc159bd89297443780d635ccc5e3564John Hofordpackage com.example.android.rs.vr.engine;
175b539461dcc159bd89297443780d635ccc5e3564John Hoford
185b539461dcc159bd89297443780d635ccc5e3564John Hoford
195b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.graphics.Color;
205b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Allocation;
215b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Element;
225b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.RenderScript;
235b539461dcc159bd89297443780d635ccc5e3564John Hofordimport android.renderscript.Type;
245b539461dcc159bd89297443780d635ccc5e3564John Hoford
255b539461dcc159bd89297443780d635ccc5e3564John Hoford/**
265b539461dcc159bd89297443780d635ccc5e3564John Hoford * Defines the material properties of a pixel value
275b539461dcc159bd89297443780d635ccc5e3564John Hoford * RGB, Opacity diffuse specular, ambient
285b539461dcc159bd89297443780d635ccc5e3564John Hoford */
295b539461dcc159bd89297443780d635ccc5e3564John Hofordpublic class Material {
305b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int SIZE = 64 * 1024;
315b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int STRIDE = 8;
325b539461dcc159bd89297443780d635ccc5e3564John Hoford
335b539461dcc159bd89297443780d635ccc5e3564John Hoford    Allocation mOpacityAllocation;
345b539461dcc159bd89297443780d635ccc5e3564John Hoford    Allocation mColorMapAllocation;
355b539461dcc159bd89297443780d635ccc5e3564John Hoford
365b539461dcc159bd89297443780d635ccc5e3564John Hoford    public byte[] mOpacityTable = new byte[SIZE];
375b539461dcc159bd89297443780d635ccc5e3564John Hoford    MaterialProp[] mMaterialProp = new MaterialProp[0];
385b539461dcc159bd89297443780d635ccc5e3564John Hoford    public byte[] mColor = new byte[SIZE * STRIDE]; // table contain r, g, b, A, S, D
395b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int RED = 0;
405b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int GREEN = 1;
415b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int BLUE = 2;
425b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int DIFF = 4;
435b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int SPEC = 5;
445b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static final int AMB = 6;
455b539461dcc159bd89297443780d635ccc5e3564John Hoford
465b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static class MaterialProp {
475b539461dcc159bd89297443780d635ccc5e3564John Hoford        int mPos;
485b539461dcc159bd89297443780d635ccc5e3564John Hoford        int mRed;
495b539461dcc159bd89297443780d635ccc5e3564John Hoford        int mGreen;
505b539461dcc159bd89297443780d635ccc5e3564John Hoford        int mBlue;
515b539461dcc159bd89297443780d635ccc5e3564John Hoford        float mDiffuse;
525b539461dcc159bd89297443780d635ccc5e3564John Hoford        float mSpecular;
535b539461dcc159bd89297443780d635ccc5e3564John Hoford        float mAmbient;
545b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
555b539461dcc159bd89297443780d635ccc5e3564John Hoford
565b539461dcc159bd89297443780d635ccc5e3564John Hoford    /**
575b539461dcc159bd89297443780d635ccc5e3564John Hoford     * Clamp limits to less than or equal to 255
585b539461dcc159bd89297443780d635ccc5e3564John Hoford     * this is done with a very efficient bit fiddling trick
595b539461dcc159bd89297443780d635ccc5e3564John Hoford     * @param c value being clamped
605b539461dcc159bd89297443780d635ccc5e3564John Hoford     * @return values in the range 0-255
615b539461dcc159bd89297443780d635ccc5e3564John Hoford     */
625b539461dcc159bd89297443780d635ccc5e3564John Hoford    private static int clamp(int c) {
635b539461dcc159bd89297443780d635ccc5e3564John Hoford        final int N = 255; // the value clamp is limiting to
645b539461dcc159bd89297443780d635ccc5e3564John Hoford        c &= ~(c >> 31);
655b539461dcc159bd89297443780d635ccc5e3564John Hoford        c -= N;
665b539461dcc159bd89297443780d635ccc5e3564John Hoford        c &= (c >> 31);
675b539461dcc159bd89297443780d635ccc5e3564John Hoford        c += N;
685b539461dcc159bd89297443780d635ccc5e3564John Hoford        return c;
695b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
705b539461dcc159bd89297443780d635ccc5e3564John Hoford
715b539461dcc159bd89297443780d635ccc5e3564John Hoford    public static class Opactiy {
725b539461dcc159bd89297443780d635ccc5e3564John Hoford        int mPos;
735b539461dcc159bd89297443780d635ccc5e3564John Hoford        float mValue;
745b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
755b539461dcc159bd89297443780d635ccc5e3564John Hoford
765b539461dcc159bd89297443780d635ccc5e3564John Hoford    public Opactiy[] mOpacity = new Opactiy[0];
775b539461dcc159bd89297443780d635ccc5e3564John Hoford
785b539461dcc159bd89297443780d635ccc5e3564John Hoford    public Material() {
795b539461dcc159bd89297443780d635ccc5e3564John Hoford        simpleSetup(1150, 1300);
805b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
815b539461dcc159bd89297443780d635ccc5e3564John Hoford
825b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void simpleSetup(int start, int end) {
835b539461dcc159bd89297443780d635ccc5e3564John Hoford        float diffuse = .7f;
845b539461dcc159bd89297443780d635ccc5e3564John Hoford        float specular = .0f;
855b539461dcc159bd89297443780d635ccc5e3564John Hoford        float ambient = .3f;
865b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = Short.MIN_VALUE; i < Short.MAX_VALUE; i++) {
875b539461dcc159bd89297443780d635ccc5e3564John Hoford            int off = i & 0xFFFF;
885b539461dcc159bd89297443780d635ccc5e3564John Hoford            int p = STRIDE * (off);
895b539461dcc159bd89297443780d635ccc5e3564John Hoford            byte v = (byte) clamp((int) (255 * (i - start) / (end - start)));
905b539461dcc159bd89297443780d635ccc5e3564John Hoford            mColor[p + RED] = v;
915b539461dcc159bd89297443780d635ccc5e3564John Hoford            mColor[p + GREEN] = v;
925b539461dcc159bd89297443780d635ccc5e3564John Hoford            mColor[p + BLUE] = v;
935b539461dcc159bd89297443780d635ccc5e3564John Hoford            mColor[p + DIFF] = (byte) (255 * diffuse);
945b539461dcc159bd89297443780d635ccc5e3564John Hoford            mColor[p + SPEC] = (byte) (255 * specular);
955b539461dcc159bd89297443780d635ccc5e3564John Hoford            mColor[p + AMB] = (byte) (255 * ambient);
965b539461dcc159bd89297443780d635ccc5e3564John Hoford            mOpacityTable[off] = v;
975b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
985b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
995b539461dcc159bd89297443780d635ccc5e3564John Hoford
1005b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setup(int[] means, int start, int end) {
1015b539461dcc159bd89297443780d635ccc5e3564John Hoford        int[] pos = new int[means.length - 1];
1025b539461dcc159bd89297443780d635ccc5e3564John Hoford        int[] red = new int[means.length - 1];
1035b539461dcc159bd89297443780d635ccc5e3564John Hoford        int[] green = new int[means.length - 1];
1045b539461dcc159bd89297443780d635ccc5e3564John Hoford        int[] blue = new int[means.length - 1];
1055b539461dcc159bd89297443780d635ccc5e3564John Hoford
1065b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < pos.length; i++) {
1075b539461dcc159bd89297443780d635ccc5e3564John Hoford            pos[i] = (means[i] + means[i + 1]) / 2;
1085b539461dcc159bd89297443780d635ccc5e3564John Hoford            float f = i / (float) (pos.length - 1);
1095b539461dcc159bd89297443780d635ccc5e3564John Hoford            float h = 1 - f * f * f;
1105b539461dcc159bd89297443780d635ccc5e3564John Hoford            float s = (float) (1 / (1 + Math.exp((f - .5) * 5)));
1115b539461dcc159bd89297443780d635ccc5e3564John Hoford            int rgb = Color.HSVToColor(new float[]{360 * h, s, f});
1125b539461dcc159bd89297443780d635ccc5e3564John Hoford            red[i] = (rgb >> 16) & 0xff;
1135b539461dcc159bd89297443780d635ccc5e3564John Hoford            green[i] = (rgb >> 8) & 0xff;
1145b539461dcc159bd89297443780d635ccc5e3564John Hoford            blue[i] = (rgb >> 0) & 0xff;
1155b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1165b539461dcc159bd89297443780d635ccc5e3564John Hoford        mMaterialProp = new MaterialProp[pos.length];
1175b539461dcc159bd89297443780d635ccc5e3564John Hoford
1185b539461dcc159bd89297443780d635ccc5e3564John Hoford        float diffuse = .7f;
1195b539461dcc159bd89297443780d635ccc5e3564John Hoford        float specular = .0f;
1205b539461dcc159bd89297443780d635ccc5e3564John Hoford        float ambient = .3f;
1215b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < pos.length; i++) {
1225b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i] = new MaterialProp();
1235b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mAmbient = ambient;
1245b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mSpecular = specular;
1255b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mDiffuse = diffuse;
1265b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mPos = pos[i];
1275b539461dcc159bd89297443780d635ccc5e3564John Hoford            float t = i / (float) (pos.length - 1);
1285b539461dcc159bd89297443780d635ccc5e3564John Hoford
1295b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mRed = red[i];
1305b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mGreen = green[i];
1315b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mBlue = blue[i];
1325b539461dcc159bd89297443780d635ccc5e3564John Hoford
1335b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1345b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity = new Opactiy[2];
1355b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[0] = new Opactiy();
1365b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[0].mPos = start;
1375b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[0].mValue = 0;
1385b539461dcc159bd89297443780d635ccc5e3564John Hoford
1395b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[1] = new Opactiy();
1405b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[1].mPos = end;
1415b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[1].mValue = 1;
1425b539461dcc159bd89297443780d635ccc5e3564John Hoford
1435b539461dcc159bd89297443780d635ccc5e3564John Hoford        buildOpacityTable();
1445b539461dcc159bd89297443780d635ccc5e3564John Hoford        buildMaterialProp();
1455b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1465b539461dcc159bd89297443780d635ccc5e3564John Hoford
1475b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setup(int[][] opacity, int[][] material) {
1485b539461dcc159bd89297443780d635ccc5e3564John Hoford        mMaterialProp = new MaterialProp[material.length];
1495b539461dcc159bd89297443780d635ccc5e3564John Hoford
1505b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < material.length; i++) {
1515b539461dcc159bd89297443780d635ccc5e3564John Hoford            int rgb = material[i][1] & 0xFFFFFF;
1525b539461dcc159bd89297443780d635ccc5e3564John Hoford
1535b539461dcc159bd89297443780d635ccc5e3564John Hoford            float ambient = (material[i].length > 2) ? material[i][2] / 100.f : .2f;
1545b539461dcc159bd89297443780d635ccc5e3564John Hoford            float diffuse = (material[i].length > 3) ? material[i][3] / 100.f : .6f;
1555b539461dcc159bd89297443780d635ccc5e3564John Hoford            float specular = (material[i].length > 4) ? material[i][4] / 100.f : .2f;
1565b539461dcc159bd89297443780d635ccc5e3564John Hoford
1575b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i] = new MaterialProp();
1585b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mAmbient = ambient;
1595b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mSpecular = specular;
1605b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mDiffuse = diffuse;
1615b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mRed = (rgb >> 16) & 0xff;
1625b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mGreen = (rgb >> 8) & 0xff;
1635b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mBlue = (rgb >> 0) & 0xff;
1645b539461dcc159bd89297443780d635ccc5e3564John Hoford
1655b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mPos = material[i][0];
1665b539461dcc159bd89297443780d635ccc5e3564John Hoford
1675b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1685b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity = new Opactiy[opacity.length];
1695b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < opacity.length; i++) {
1705b539461dcc159bd89297443780d635ccc5e3564John Hoford            mOpacity[i] = new Opactiy();
1715b539461dcc159bd89297443780d635ccc5e3564John Hoford            mOpacity[i].mPos = opacity[i][0];
1725b539461dcc159bd89297443780d635ccc5e3564John Hoford            mOpacity[i].mValue = opacity[i][1] / 255.f;
1735b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1745b539461dcc159bd89297443780d635ccc5e3564John Hoford        buildOpacityTable();
1755b539461dcc159bd89297443780d635ccc5e3564John Hoford        buildMaterialProp();
1765b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
1775b539461dcc159bd89297443780d635ccc5e3564John Hoford
1785b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void setup(int start, int end) {
1795b539461dcc159bd89297443780d635ccc5e3564John Hoford        int[] pos = {1050, 1140, 1200, 1210, 1231};
1805b539461dcc159bd89297443780d635ccc5e3564John Hoford
1815b539461dcc159bd89297443780d635ccc5e3564John Hoford        mMaterialProp = new MaterialProp[pos.length];
1825b539461dcc159bd89297443780d635ccc5e3564John Hoford
1835b539461dcc159bd89297443780d635ccc5e3564John Hoford        float diffuse = .7f;
1845b539461dcc159bd89297443780d635ccc5e3564John Hoford        float specular = .0f;
1855b539461dcc159bd89297443780d635ccc5e3564John Hoford        float ambient = .3f;
1865b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = 0; i < pos.length; i++) {
1875b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i] = new MaterialProp();
1885b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mAmbient = ambient;
1895b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mSpecular = specular;
1905b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mDiffuse = diffuse;
1915b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mPos = pos[i];
1925b539461dcc159bd89297443780d635ccc5e3564John Hoford            float t = i / (float) (pos.length - 1);
1935b539461dcc159bd89297443780d635ccc5e3564John Hoford            int rgb = (int) (Math.random() * 0xFFFFFF);
1945b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mRed = (rgb >> 16) & 0xff;
1955b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mGreen = (rgb >> 8) & 0xff;
1965b539461dcc159bd89297443780d635ccc5e3564John Hoford            mMaterialProp[i].mBlue = (rgb >> 0) & 0xff;
1975b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
1985b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity = new Opactiy[2];
1995b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[0] = new Opactiy();
2005b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[0].mPos = start;
2015b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[0].mValue = 0;
2025b539461dcc159bd89297443780d635ccc5e3564John Hoford
2035b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[1] = new Opactiy();
2045b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[1].mPos = end;
2055b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacity[1].mValue = 1;
2065b539461dcc159bd89297443780d635ccc5e3564John Hoford
2075b539461dcc159bd89297443780d635ccc5e3564John Hoford        buildOpacityTable();
2085b539461dcc159bd89297443780d635ccc5e3564John Hoford        buildMaterialProp();
2095b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
2105b539461dcc159bd89297443780d635ccc5e3564John Hoford
2115b539461dcc159bd89297443780d635ccc5e3564John Hoford    void buildOpacityTable() {
2125b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mOpacity.length == 0) {
2135b539461dcc159bd89297443780d635ccc5e3564John Hoford            return;
2145b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
2155b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = Short.MIN_VALUE; i <= mOpacity[0].mPos; i++) {
2165b539461dcc159bd89297443780d635ccc5e3564John Hoford            int p = i & 0xFFFF;
2175b539461dcc159bd89297443780d635ccc5e3564John Hoford            mOpacityTable[p] = (byte) (mOpacity[0].mValue * 255);
2185b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
2195b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int k = 0; k < mOpacity.length - 1; k++) {
2205b539461dcc159bd89297443780d635ccc5e3564John Hoford            for (int i = mOpacity[k].mPos; i < mOpacity[k + 1].mPos; i++) {
2215b539461dcc159bd89297443780d635ccc5e3564John Hoford                int p = i & 0xFFFF;
2225b539461dcc159bd89297443780d635ccc5e3564John Hoford                float dist = mOpacity[k + 1].mPos - mOpacity[k].mPos;
2235b539461dcc159bd89297443780d635ccc5e3564John Hoford                float t = (i - mOpacity[k].mPos) / dist;
2245b539461dcc159bd89297443780d635ccc5e3564John Hoford                float v = mOpacity[k].mValue * (1 - t) + t * mOpacity[k + 1].mValue;
2255b539461dcc159bd89297443780d635ccc5e3564John Hoford                mOpacityTable[p] = (byte) (v * 255);
2265b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
2275b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
2285b539461dcc159bd89297443780d635ccc5e3564John Hoford        int last = mOpacity.length - 1;
2295b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int i = mOpacity[last].mPos; i <= Short.MAX_VALUE; i++) {
2305b539461dcc159bd89297443780d635ccc5e3564John Hoford            int p = i & 0xFFFF;
2315b539461dcc159bd89297443780d635ccc5e3564John Hoford            mOpacityTable[p] = (byte) (mOpacity[last].mValue * 255);
2325b539461dcc159bd89297443780d635ccc5e3564John Hoford
2335b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
2345b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
2355b539461dcc159bd89297443780d635ccc5e3564John Hoford
2365b539461dcc159bd89297443780d635ccc5e3564John Hoford    public void buildMaterialProp() {
2375b539461dcc159bd89297443780d635ccc5e3564John Hoford        MaterialProp[] m = mMaterialProp;
2385b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (m.length == 0) {
2395b539461dcc159bd89297443780d635ccc5e3564John Hoford            return;
2405b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
2415b539461dcc159bd89297443780d635ccc5e3564John Hoford        {
2425b539461dcc159bd89297443780d635ccc5e3564John Hoford            MaterialProp mp = m[0];
2435b539461dcc159bd89297443780d635ccc5e3564John Hoford            int red = m[0].mRed;
2445b539461dcc159bd89297443780d635ccc5e3564John Hoford            int green = m[0].mGreen;
2455b539461dcc159bd89297443780d635ccc5e3564John Hoford            int blue = m[0].mBlue;
2465b539461dcc159bd89297443780d635ccc5e3564John Hoford
2475b539461dcc159bd89297443780d635ccc5e3564John Hoford            for (int i = Short.MIN_VALUE; i <= m[0].mPos; i++) {
2485b539461dcc159bd89297443780d635ccc5e3564John Hoford                int p = STRIDE * (i & 0xFFFF);
2495b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + RED] = (byte) red;
2505b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + GREEN] = (byte) green;
2515b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + BLUE] = (byte) blue;
2525b539461dcc159bd89297443780d635ccc5e3564John Hoford
2535b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + DIFF] = (byte) (255 * mp.mDiffuse);
2545b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + SPEC] = (byte) (255 * mp.mSpecular);
2555b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + AMB] = (byte) (255 * mp.mAmbient);
2565b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
2575b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
2585b539461dcc159bd89297443780d635ccc5e3564John Hoford        for (int k = 0; k < m.length - 1; k++) {
2595b539461dcc159bd89297443780d635ccc5e3564John Hoford            for (int i = m[k].mPos; i < m[k + 1].mPos; i++) {
2605b539461dcc159bd89297443780d635ccc5e3564John Hoford                int p = STRIDE * (i & 0xFFFF);
2615b539461dcc159bd89297443780d635ccc5e3564John Hoford                float dist = m[k + 1].mPos - m[k].mPos;
2625b539461dcc159bd89297443780d635ccc5e3564John Hoford                float t2 = (i - m[k].mPos) / dist;
2635b539461dcc159bd89297443780d635ccc5e3564John Hoford                float t1 = 1 - t2;
2645b539461dcc159bd89297443780d635ccc5e3564John Hoford
2655b539461dcc159bd89297443780d635ccc5e3564John Hoford
2665b539461dcc159bd89297443780d635ccc5e3564John Hoford                int red = (int) (m[k].mRed * t1 + m[k + 1].mRed * t2);
2675b539461dcc159bd89297443780d635ccc5e3564John Hoford                int green = (int) (m[k].mGreen * t1 + m[k + 1].mGreen * t2);
2685b539461dcc159bd89297443780d635ccc5e3564John Hoford                int blue = (int) (m[k].mBlue * t1 + m[k + 1].mBlue * t2);
2695b539461dcc159bd89297443780d635ccc5e3564John Hoford
2705b539461dcc159bd89297443780d635ccc5e3564John Hoford                float diffuse = m[k].mDiffuse * t1 + m[k + 1].mDiffuse * t2;
2715b539461dcc159bd89297443780d635ccc5e3564John Hoford                float specular = m[k].mSpecular * t1 + m[k + 1].mSpecular * t2;
2725b539461dcc159bd89297443780d635ccc5e3564John Hoford                float ambient = m[k].mAmbient * t1 + m[k + 1].mAmbient * t2;
2735b539461dcc159bd89297443780d635ccc5e3564John Hoford
2745b539461dcc159bd89297443780d635ccc5e3564John Hoford
2755b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + RED] = (byte) red;
2765b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + GREEN] = (byte) green;
2775b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + BLUE] = (byte) blue;
2785b539461dcc159bd89297443780d635ccc5e3564John Hoford
2795b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + DIFF] = (byte) (255 * diffuse);
2805b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + SPEC] = (byte) (255 * specular);
2815b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + AMB] = (byte) (255 * ambient);
2825b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
2835b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
2845b539461dcc159bd89297443780d635ccc5e3564John Hoford        {
2855b539461dcc159bd89297443780d635ccc5e3564John Hoford            int last = m.length - 1;
2865b539461dcc159bd89297443780d635ccc5e3564John Hoford            MaterialProp mp = m[last];
2875b539461dcc159bd89297443780d635ccc5e3564John Hoford            int red = mp.mRed;
2885b539461dcc159bd89297443780d635ccc5e3564John Hoford            int green = mp.mGreen;
2895b539461dcc159bd89297443780d635ccc5e3564John Hoford            int blue = mp.mBlue;
2905b539461dcc159bd89297443780d635ccc5e3564John Hoford            for (int i = mp.mPos; i <= Short.MAX_VALUE; i++) {
2915b539461dcc159bd89297443780d635ccc5e3564John Hoford                int p = STRIDE * (i & 0xFFFF);
2925b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + RED] = (byte) red;
2935b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + GREEN] = (byte) green;
2945b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + BLUE] = (byte) blue;
2955b539461dcc159bd89297443780d635ccc5e3564John Hoford
2965b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + DIFF] = (byte) (255 * mp.mDiffuse);
2975b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + SPEC] = (byte) (255 * mp.mSpecular);
2985b539461dcc159bd89297443780d635ccc5e3564John Hoford                mColor[p + AMB] = (byte) (255 * mp.mAmbient);
2995b539461dcc159bd89297443780d635ccc5e3564John Hoford            }
3005b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
3015b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
3025b539461dcc159bd89297443780d635ccc5e3564John Hoford
3035b539461dcc159bd89297443780d635ccc5e3564John Hoford    public Allocation getOpacityAllocation(RenderScript rs) {
3045b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mOpacityAllocation == null) {
3055b539461dcc159bd89297443780d635ccc5e3564John Hoford            Type.Builder b = new Type.Builder(rs, Element.U8(rs));
3065b539461dcc159bd89297443780d635ccc5e3564John Hoford            b.setX(mOpacityTable.length);
3075b539461dcc159bd89297443780d635ccc5e3564John Hoford            mOpacityAllocation = Allocation.createTyped(rs, b.create());
3085b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
3095b539461dcc159bd89297443780d635ccc5e3564John Hoford        mOpacityAllocation.copyFromUnchecked(mOpacityTable);
3105b539461dcc159bd89297443780d635ccc5e3564John Hoford        return mOpacityAllocation;
3115b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
3125b539461dcc159bd89297443780d635ccc5e3564John Hoford
3135b539461dcc159bd89297443780d635ccc5e3564John Hoford    public Allocation getColorMapAllocation(RenderScript rs) {
3145b539461dcc159bd89297443780d635ccc5e3564John Hoford        if (mColorMapAllocation == null) {
3155b539461dcc159bd89297443780d635ccc5e3564John Hoford            Type.Builder b = new Type.Builder(rs, Element.U8_4(rs));
3165b539461dcc159bd89297443780d635ccc5e3564John Hoford            b.setX(mColor.length / 4);
3175b539461dcc159bd89297443780d635ccc5e3564John Hoford            mColorMapAllocation = Allocation.createTyped(rs, b.create());
3185b539461dcc159bd89297443780d635ccc5e3564John Hoford        }
3195b539461dcc159bd89297443780d635ccc5e3564John Hoford        mColorMapAllocation.copyFromUnchecked(mColor);
3205b539461dcc159bd89297443780d635ccc5e3564John Hoford        return mColorMapAllocation;
3215b539461dcc159bd89297443780d635ccc5e3564John Hoford    }
3225b539461dcc159bd89297443780d635ccc5e3564John Hoford}
323