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