CarouselRS.java revision 1882cebdc1b7b0551189ca33fb7cb77ef10c988b
15ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller/* 25ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Copyright (C) 2010 The Android Open Source Project 35ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * 45ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 55ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * you may not use this file except in compliance with the License. 65ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * You may obtain a copy of the License at 75ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * 85ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * http://www.apache.org/licenses/LICENSE-2.0 95ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * 105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Unless required by applicable law or agreed to in writing, software 115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * distributed under the License is distributed on an "AS IS" BASIS, 125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * See the License for the specific language governing permissions and 145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * limitations under the License. 155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpackage com.android.ex.carousel; 185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.res.Resources; 205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap; 215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.*; 22fb179e7afd8f02be63061b478b0283e3085fc25fJim Millerimport android.renderscript.ProgramStore.BlendDstFunc; 23fb179e7afd8f02be63061b478b0283e3085fc25fJim Millerimport android.renderscript.ProgramStore.BlendSrcFunc; 245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.RenderScript.RSMessage; 255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.Log; 265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport static android.renderscript.Element.*; 285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 297cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller/** 307cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This is a support class for Carousel renderscript. It handles most of the low-level interactions 317cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * with Renderscript as well as dispatching events. 327cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 337cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpublic class CarouselRS { 355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private static final int DEFAULT_VISIBLE_SLOTS = 1; 36b8c3aee40f704e71fd9a8af41f060ebae2ea445fBryan Mawhinney private static final int DEFAULT_CARD_COUNT = 0; 375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller // Client messages *** THIS LIST MUST MATCH THOSE IN carousel.rs *** 395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static final int CMD_CARD_SELECTED = 100; 40594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma public static final int CMD_CARD_LONGPRESS = 110; 415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static final int CMD_REQUEST_TEXTURE = 200; 425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static final int CMD_INVALIDATE_TEXTURE = 210; 435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static final int CMD_REQUEST_GEOMETRY = 300; 445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static final int CMD_INVALIDATE_GEOMETRY = 310; 455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static final int CMD_ANIMATION_STARTED = 400; 465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static final int CMD_ANIMATION_FINISHED = 500; 477cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller public static final int CMD_REQUEST_DETAIL_TEXTURE = 600; 487cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller public static final int CMD_INVALIDATE_DETAIL_TEXTURE = 610; 497cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller public static final int CMD_PING = 1000; // for debugging 505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 51be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller // Drag models *** THIS LIST MUST MATCH THOSE IN carousel.rs *** 52be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller public static final int DRAG_MODEL_SCREEN_DELTA = 0; 53be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller public static final int DRAG_MODEL_PLANE = 1; 54be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller public static final int DRAG_MODEL_CYLINDER_INSIDE = 2; 55be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller public static final int DRAG_MODEL_CYLINDER_OUTSIDE = 3; 56be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller 575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private static final String TAG = "CarouselRS"; 585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private static final int DEFAULT_SLOT_COUNT = 10; 595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private static final boolean MIPMAP = false; 607cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller private static final boolean DBG = false; 615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private RenderScriptGL mRS; 635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private Resources mRes; 641126aa8ba186b42baf5b14c66d44b59f43888b70Stephen Hines private ScriptC_carousel mScript; 655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private ScriptField_Card mCards; 66420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller private ScriptField_FragmentShaderConstants_s mFSConst; 67fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller private ProgramStore mProgramStoreAlphaZ; 68fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller private ProgramStore mProgramStoreAlphaNoZ; 69fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller private ProgramStore mProgramStoreNoAlphaZ; 70fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller private ProgramStore mProgramStoreNoAlphaNoZ; 71420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller private ProgramFragment mSingleTextureFragmentProgram; 72420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller private ProgramFragment mMultiTextureFragmentProgram; 735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private ProgramVertex mVertexProgram; 745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private ProgramRaster mRasterProgram; 751eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller private Allocation[] mAllocationPool; 761eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller private int mVisibleSlots; 771eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller private int mPrefetchCardCount; 785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private CarouselCallback mCallback; 79a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller private float[] mEyePoint = new float[] { 2.0f, 0.0f, 0.0f }; 80a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller private float[] mAtPoint = new float[] { 0.0f, 0.0f, 0.0f }; 81a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller private float[] mUp = new float[] { 0.0f, 1.0f, 0.0f }; 82a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller 83a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller private static final String mSingleTextureShader = new String( 849f0c6badc3e8f928c6f2658a3c85ea50319424d4Alex Sakhartchouk "varying vec2 varTex0;" + 85a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller "void main() {" + 86a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller "vec2 t0 = varTex0.xy;" + 87a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller "vec4 col = texture2D(UNI_Tex0, t0);" + 88a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller "gl_FragColor = col; " + 89a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller "}"); 90a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller 91a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller private static final String mMultiTextureShader = new String( 929f0c6badc3e8f928c6f2658a3c85ea50319424d4Alex Sakhartchouk "varying vec2 varTex0;" + 93420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller "void main() {" + 94420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller "vec2 t0 = varTex0.xy;" + 95420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller "vec4 col = texture2D(UNI_Tex0, t0);" + 96420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller "vec4 col2 = texture2D(UNI_Tex1, t0);" + 97420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller "gl_FragColor = mix(col, col2, UNI_fadeAmount);}"); 985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static interface CarouselCallback { 1005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Called when a card is selected 1025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param n the id of the card 1035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller void onCardSelected(int n); 1055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 107594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma * Called when a card is long-pressed 108594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma * @param n the id of the card 109594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma */ 110594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma void onCardLongPress(int n); 111594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma 112594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma /** 1135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Called when texture is needed for card n. This happens when the given card becomes 1145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * visible. 1155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param n the id of the card 1165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller void onRequestTexture(int n); 1185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Called when a texture is no longer needed for card n. This happens when the card 1215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * goes out of view. 1225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param n the id of the card 1235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller void onInvalidateTexture(int n); 1255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1277cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Called when detail texture is needed for card n. This happens when the given card 1287cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * becomes visible. 1297cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param n the id of the card 1307cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 1317cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller void onRequestDetailTexture(int n); 1327cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 1337cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 1347cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Called when a detail texture is no longer needed for card n. This happens when the card 1357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * goes out of view. 1367cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param n the id of the card 1377cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 1387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller void onInvalidateDetailTexture(int n); 1397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 1407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 1415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Called when geometry is needed for card n. 1425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param n the id of the card. 1435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller void onRequestGeometry(int n); 1455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1479afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller * Called when geometry is no longer needed for card n. This happens when the card goes 1485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * out of view. 1495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param n the id of the card 1505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller void onInvalidateGeometry(int n); 1525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Called when card animation (e.g. a fling) has started. 1555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller void onAnimationStarted(); 1575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Called when card animation has stopped. 160a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich * @param startAngle the angle of rotation, in radians, at which the animation stopped. 1615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 162a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich void onAnimationFinished(float carouselRotationAngle); 1635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller }; 1645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private RSMessage mRsMessage = new RSMessage() { 1665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void run() { 1675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mCallback == null) return; 1685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller switch (mID) { 1695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_CARD_SELECTED: 1705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCallback.onCardSelected(mData[0]); 1715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 1725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 173594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma case CMD_CARD_LONGPRESS: 174594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma mCallback.onCardLongPress(mData[0]); 175594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma break; 176594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma 1775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_REQUEST_TEXTURE: 1785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCallback.onRequestTexture(mData[0]); 1795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 1805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_INVALIDATE_TEXTURE: 182c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller setTexture(mData[0], null); 1835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCallback.onInvalidateTexture(mData[0]); 1845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 1855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1867cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller case CMD_REQUEST_DETAIL_TEXTURE: 1877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller mCallback.onRequestDetailTexture(mData[0]); 1887cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller break; 1897cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 1907cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller case CMD_INVALIDATE_DETAIL_TEXTURE: 191b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller setDetailTexture(mData[0], 0.0f, 0.0f, 0.0f, 0.0f, null); 1927cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller mCallback.onInvalidateDetailTexture(mData[0]); 1937cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller break; 1947cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 1955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_REQUEST_GEOMETRY: 1965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCallback.onRequestGeometry(mData[0]); 1975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 1985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_INVALIDATE_GEOMETRY: 200c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller setGeometry(mData[0], null); 2015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCallback.onInvalidateGeometry(mData[0]); 2025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 2035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_ANIMATION_STARTED: 2055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCallback.onAnimationStarted(); 2065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 2075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_ANIMATION_FINISHED: 209a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich mCallback.onAnimationFinished(Float.intBitsToFloat(mData[0])); 210198a060d650bc849ef0f25b597888fac9546803bJack Palevich break; 211198a060d650bc849ef0f25b597888fac9546803bJack Palevich 2125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case CMD_PING: 2137cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (DBG) Log.v(TAG, "PING..."); 2145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 2155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller default: 2175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller Log.e(TAG, "Unknown RSMessage: " + mID); 2185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller }; 2215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 222a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller public CarouselRS(RenderScriptGL rs, Resources res, int resId) { 2235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRS = rs; 2245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRes = res; 2255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller // create the script object 2271126aa8ba186b42baf5b14c66d44b59f43888b70Stephen Hines mScript = new ScriptC_carousel(mRS, mRes, resId, true); 2285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRS.mMessageCallback = mRsMessage; 2295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller initProgramStore(); 2305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller initFragmentProgram(); 2315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller initRasterProgram(); 2325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller initVertexProgram(); 2335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setSlotCount(DEFAULT_SLOT_COUNT); 2345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setVisibleSlots(DEFAULT_VISIBLE_SLOTS); 2355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller createCards(DEFAULT_CARD_COUNT); 2365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setStartAngle(0.0f); 237a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich setCarouselRotationAngle(0.0f); 2385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setRadius(1.0f); 239a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller setLookAt(mEyePoint, mAtPoint, mUp); 240a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller setRadius(20.0f); 241a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller // Fov: 25 2425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setLookAt(float[] eye, float[] at, float[] up) { 2455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller for (int i = 0; i < 3; i++) { 2465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mEyePoint[i] = eye[i]; 2475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mAtPoint[i] = at[i]; 2485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mUp[i] = up[i]; 2495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.invoke_lookAt(eye[0], eye[1], eye[2], at[0], at[1], at[2], up[0], up[1], up[2]); 2515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setRadius(float radius) { 254be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller mScript.invoke_setRadius(radius); 2555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 257c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setCardRotation(float cardRotation) { 258c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mScript.set_cardRotation(cardRotation); 259c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 260c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 26183d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney public void setCardsFaceTangent(boolean faceTangent) { 26283d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney mScript.set_cardsFaceTangent(faceTangent); 26383d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney } 26483d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney 265c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setSwaySensitivity(float swaySensitivity) { 266c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mScript.set_swaySensitivity(swaySensitivity); 267c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 268c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 269c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setFrictionCoefficient(float frictionCoeff) { 270c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mScript.set_frictionCoeff(frictionCoeff); 271c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 272c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 273c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setDragFactor(float dragFactor) { 274c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mScript.set_dragFactor(dragFactor); 275c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 276c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 277be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller public void setDragModel(int model) { 278be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller mScript.set_dragModel(model); 279be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller } 280be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller 2815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private void initVertexProgram() { 2825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null); 2835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mVertexProgram = pvb.create(); 2845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller ProgramVertex.MatrixAllocation pva = new ProgramVertex.MatrixAllocation(mRS); 2855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mVertexProgram.bindAllocation(pva); 2865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller pva.setupProjectionNormalized(1, 1); 2875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_vertexProgram(mVertexProgram); 2885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private void initRasterProgram() { 2915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller ProgramRaster.Builder programRasterBuilder = new ProgramRaster.Builder(mRS); 2925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRasterProgram = programRasterBuilder.create(); 2935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller //mRasterProgram.setCullMode(CullMode.NONE); 2945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_rasterProgram(mRasterProgram); 2955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private void initFragmentProgram() { 298a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // 299a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Single texture program 300a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // 301a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller ProgramFragment.ShaderBuilder pfbSingle = new ProgramFragment.ShaderBuilder(mRS); 302a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Specify the resource that contains the shader string 303a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller pfbSingle.setShader(mSingleTextureShader); 304a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Tell the builder how many textures we have 305a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller pfbSingle.setTextureCount(1); 306a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mSingleTextureFragmentProgram = pfbSingle.create(); 307a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Bind the source of constant data 308a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mSingleTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); 309a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller 310a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // 311a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Multi texture program 312a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // 313a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mFSConst = new ScriptField_FragmentShaderConstants_s(mRS, 1); 314a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mScript.bind_shaderConstants(mFSConst); 315a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller ProgramFragment.ShaderBuilder pfbMulti = new ProgramFragment.ShaderBuilder(mRS); 316a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Specify the resource that contains the shader string 317a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller pfbMulti.setShader(mMultiTextureShader); 318a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Tell the builder how many textures we have 319a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller pfbMulti.setTextureCount(2); 320a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Define the constant input layout 321a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller pfbMulti.addConstant(mFSConst.getAllocation().getType()); 322a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mMultiTextureFragmentProgram = pfbMulti.create(); 323a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller // Bind the source of constant data 324a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mMultiTextureFragmentProgram.bindConstants(mFSConst.getAllocation(), 0); 325a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mMultiTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0); 326a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mMultiTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 1); 327a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller 328a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mScript.set_linearClamp(Sampler.CLAMP_LINEAR(mRS)); 329a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mScript.set_singleTextureFragmentProgram(mSingleTextureFragmentProgram); 330a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller mScript.set_multiTextureFragmentProgram(mMultiTextureFragmentProgram); 3315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private void initProgramStore() { 334fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller final boolean dither = true; 335fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mProgramStoreAlphaZ = new ProgramStore.Builder(mRS) 336fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, 337fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA) 338fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDitherEnable(dither) 339fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthFunc(ProgramStore.DepthFunc.LESS) 340fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthMask(true) 341fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .create(); 342fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mScript.set_programStoreAlphaZ(mProgramStoreAlphaZ); 343fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller 344fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mProgramStoreAlphaNoZ = new ProgramStore.Builder(mRS) 345fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, 346fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA) 347fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDitherEnable(dither) 348fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthFunc(ProgramStore.DepthFunc.ALWAYS) 349fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthMask(false) 350fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .create(); 351fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mScript.set_programStoreAlphaNoZ(mProgramStoreAlphaNoZ); 352fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller 353fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mProgramStoreNoAlphaZ = new ProgramStore.Builder(mRS) 354fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ZERO) 355fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDitherEnable(dither) 356fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthFunc(ProgramStore.DepthFunc.LESS) 357fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthMask(true) 358fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .create(); 359fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mScript.set_programStoreNoAlphaZ(mProgramStoreNoAlphaZ); 360fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller 361fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mProgramStoreNoAlphaNoZ = new ProgramStore.Builder(mRS) 362fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ZERO) 363fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDitherEnable(dither) 364fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthFunc(ProgramStore.DepthFunc.ALWAYS) 365fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .setDepthMask(false) 366fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller .create(); 367fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mScript.set_programStoreNoAlphaNoZ(mProgramStoreNoAlphaNoZ); 3685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void createCards(int count) 3715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 3723df59346f395434454d310b070fff195089fbaf1Jim Miller // Because RenderScript can't have allocations with 0 dimensions, we always create 3733df59346f395434454d310b070fff195089fbaf1Jim Miller // an allocation of at least one card. This relies on invoke_createCards() to keep 3743df59346f395434454d310b070fff195089fbaf1Jim Miller // track of when the allocation is not valid. 3758b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich if (mCards != null) { 3768b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich // resize the array 3776f2cc8cf611860467315ecc542f71a225625eb1cJason Sams int oldSize = mCards.getAllocation().getType().getX(); 3786f2cc8cf611860467315ecc542f71a225625eb1cJason Sams int newSize = count > 0 ? count : 1; 3796f2cc8cf611860467315ecc542f71a225625eb1cJason Sams mCards.resize(newSize); 3806f2cc8cf611860467315ecc542f71a225625eb1cJason Sams mScript.invoke_createCards(oldSize, count); 3818b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich } else { 3828b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich // create array from scratch 3838b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich mCards = new ScriptField_Card(mRS, count > 0 ? count : 1); 3848b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich mScript.bind_cards(mCards); 3856f2cc8cf611860467315ecc542f71a225625eb1cJason Sams mScript.invoke_createCards(0, count); 3868b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich } 3875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setVisibleSlots(int count) 3905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 3911eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller mVisibleSlots = count; 3925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_visibleSlotCount(count); 3935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3957c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma public void setVisibleDetails(int count) { 3967c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mScript.set_visibleDetailCount(count); 3977c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 3987c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma 3994fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma public void setPrefetchCardCount(int count) { 4001eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller mPrefetchCardCount = count; 4014fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma mScript.set_prefetchCardCount(count); 4024fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma } 4034fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma 4044a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney public void setDetailTextureAlignment(int alignment) { 4054a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney mScript.set_detailTextureAlignment(alignment); 4064fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma } 4074fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma 408fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller public void setForceBlendCardsWithZ(boolean enabled) { 409fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller mScript.set_forceBlendCardsWithZ(enabled); 410bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma } 411bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma 4127c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma public void setDrawRuler(boolean drawRuler) { 4137c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mScript.set_drawRuler(drawRuler); 4147c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 4157c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma 4165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setDefaultBitmap(Bitmap bitmap) 4175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_defaultTexture(allocationFromBitmap(bitmap, MIPMAP)); 4195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setLoadingBitmap(Bitmap bitmap) 4225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_loadingTexture(allocationFromBitmap(bitmap, MIPMAP)); 4245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setDefaultGeometry(Mesh mesh) 4275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_defaultGeometry(mesh); 4295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setLoadingGeometry(Mesh mesh) 4325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_loadingGeometry(mesh); 4345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setStartAngle(float theta) 4375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_startAngle(theta); 4395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 441a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich public void setCarouselRotationAngle(float theta) { 442a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich mScript.invoke_setCarouselRotationAngle(theta); 443a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich } 444a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich 4455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setCallback(CarouselCallback callback) 4465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCallback = callback; 4485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private Allocation allocationFromBitmap(Bitmap bitmap, boolean mipmap) 4515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (bitmap == null) return null; 453e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich Allocation allocation = Allocation.createFromBitmap(mRS, bitmap, 454a3cb716626b477c98ba912698c765eab20f27286Jim Miller elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), mipmap); 4555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller allocation.uploadToTexture(0); 4565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller return allocation; 4575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4591eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller private Allocation allocationFromPool(int n, Bitmap bitmap, boolean mipmap) 4601eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller { 4611eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller int count = mVisibleSlots + mPrefetchCardCount; 4621eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller if (mAllocationPool == null || mAllocationPool.length != count) { 4631eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller Allocation[] tmp = new Allocation[count]; 4641eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller int oldsize = mAllocationPool == null ? 0 : mAllocationPool.length; 4651eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller for (int i = 0; i < Math.min(count, oldsize); i++) { 4661eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller tmp[i] = mAllocationPool[i]; 4671eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller } 4681eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller mAllocationPool = tmp; 4691eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller } 4701eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller Allocation allocation = mAllocationPool[n % count]; 4711eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller if (allocation == null) { 4721eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller allocation = allocationFromBitmap(bitmap, mipmap); 4731eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller mAllocationPool[n % count] = allocation; 4741eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller } else if (bitmap != null) { 4751eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller if (bitmap.getWidth() == allocation.getType().getX() 4761eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller && bitmap.getHeight() == allocation.getType().getY()) { 4771eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller allocation.updateFromBitmap(bitmap); 4781eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller allocation.uploadToTexture(0); 4791eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller } else { 4801eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller Log.v(TAG, "Warning, bitmap has different size. Taking slow path"); 4811eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller allocation = allocationFromBitmap(bitmap, mipmap); 4821eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller mAllocationPool[n % count] = allocation; 4831eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller } 4841eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller } 4851eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller return allocation; 4861eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller } 4871eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller 4885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setTexture(int n, Bitmap bitmap) 4895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4903df59346f395434454d310b070fff195089fbaf1Jim Miller if (n < 0) throw new IllegalArgumentException("Index cannot be negative"); 4913df59346f395434454d310b070fff195089fbaf1Jim Miller 492c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller synchronized(this) { 493c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller ScriptField_Card.Item item = mCards.get(n); 494c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (item == null) { 495c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (DBG) Log.v(TAG, "setTexture(): no item at index " + n); 496c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item = new ScriptField_Card.Item(); 4975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 498c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (bitmap != null) { 4991eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller item.texture = allocationFromPool(n, bitmap, MIPMAP); 500c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } else { 501c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (item.texture != null) { 502c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (DBG) Log.v(TAG, "unloading texture " + n); 503c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item.texture = null; 504c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } 505c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } 506c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller mCards.set(item, n, false); // This is primarily used for reference counting. 507c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller mScript.invoke_setTexture(n, item.texture); 5085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 5095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 5105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 511b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller void setDetailTexture(int n, float offx, float offy, float loffx, float loffy, Bitmap bitmap) 5127cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller { 5133df59346f395434454d310b070fff195089fbaf1Jim Miller if (n < 0) throw new IllegalArgumentException("Index cannot be negative"); 5143df59346f395434454d310b070fff195089fbaf1Jim Miller 515c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller synchronized(this) { 516c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller ScriptField_Card.Item item = mCards.get(n); 517c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (item == null) { 518c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (DBG) Log.v(TAG, "setDetailTexture(): no item at index " + n); 519c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item = new ScriptField_Card.Item(); 520c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } 521c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller float width = 0.0f; 522c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller float height = 0.0f; 523c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (bitmap != null) { 5241eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller item.detailTexture = allocationFromBitmap(bitmap, MIPMAP); 525c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller width = bitmap.getWidth(); 526c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller height = bitmap.getHeight(); 527c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } else { 528c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (item.detailTexture != null) { 529c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (DBG) Log.v(TAG, "unloading texture " + n); 530c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller // Don't wait for GC to free native memory. 531c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller // Only works if textures are not shared. 532c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item.detailTexture.destroy(); 533c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item.detailTexture = null; 534c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } 5357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 536c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller mCards.set(item, n, false); // This is primarily used for reference counting. 537b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller mScript.invoke_setDetailTexture(n, offx, offy, loffx, loffy, item.detailTexture); 5387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 5397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 5407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 5415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setGeometry(int n, Mesh geometry) 5425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 5433df59346f395434454d310b070fff195089fbaf1Jim Miller if (n < 0) throw new IllegalArgumentException("Index cannot be negative"); 5443df59346f395434454d310b070fff195089fbaf1Jim Miller 545c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller synchronized(this) { 546c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller final boolean mipmap = false; 547c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller ScriptField_Card.Item item = mCards.get(n); 548c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (item == null) { 549c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (DBG) Log.v(TAG, "setGeometry(): no item at index " + n); 550c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item = new ScriptField_Card.Item(); 551c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } 552c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (geometry != null) { 553c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item.geometry = geometry; 554c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } else { 555c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (DBG) Log.v(TAG, "unloading geometry " + n); 556c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller if (item.geometry != null) { 557c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller // item.geometry.destroy(); 558c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller item.geometry = null; 559c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller } 5605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 561c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller mCards.set(item, n, false); 562c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller mScript.invoke_setGeometry(n, item.geometry); 5635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 5645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 5655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 566b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller public void setBackgroundColor(Float4 color) { 567b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller mScript.set_backgroundColor(color); 568b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller } 569b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller 5709afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller public void setBackgroundTexture(Bitmap bitmap) { 5719afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller Allocation texture = null; 5729afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller if (bitmap != null) { 573e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich texture = Allocation.createFromBitmap(mRS, bitmap, 574e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich elementForBitmap(bitmap, Bitmap.Config.RGB_565), MIPMAP); 5759afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller texture.uploadToTexture(0); 5769afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller } 5779afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller mScript.set_backgroundTexture(texture); 5789afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller } 5799afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller 5807cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller public void setDetailLineTexture(Bitmap bitmap) { 5817cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller Allocation texture = null; 5827cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (bitmap != null) { 583e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich texture = Allocation.createFromBitmap(mRS, bitmap, 584e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), MIPMAP); 5857cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller texture.uploadToTexture(0); 5867cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 5877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller mScript.set_detailLineTexture(texture); 5887cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 5897cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 590420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller public void setDetailLoadingTexture(Bitmap bitmap) { 591420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller Allocation texture = null; 592420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller if (bitmap != null) { 593420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller texture = Allocation.createFromBitmap(mRS, bitmap, 594420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), MIPMAP); 595420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller texture.uploadToTexture(0); 596420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller } 597420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller mScript.set_detailLoadingTexture(texture); 598420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller } 599420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller 6005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void pauseRendering() { 6015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller // Used to update multiple states at once w/o redrawing for each. 6025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRS.contextBindRootScript(null); 6035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 6045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 6055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void resumeRendering() { 6065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRS.contextBindRootScript(mScript); 6075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 6085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 609594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma public void doLongPress() { 610594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma mScript.invoke_doLongPress(); 611594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma } 612594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma 6131882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller public void doMotion(float x, float y, long t) { 6141882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller mScript.invoke_doMotion(x, y, t); 6155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 6165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 6175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void doSelection(float x, float y) { 6185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.invoke_doSelection(x, y); 6195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 6205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 6211882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller public void doStart(float x, float y, long t) { 6221882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller mScript.invoke_doStart(x, y, t); 6235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 6245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 6251882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller public void doStop(float x, float y, long t) { 6261882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller mScript.invoke_doStop(x, y, t); 6275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 6285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 6295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setSlotCount(int n) { 6305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mScript.set_slotCount(n); 6315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 632198a060d650bc849ef0f25b597888fac9546803bJack Palevich 633420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller public void setRezInCardCount(float alpha) { 634420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller mScript.set_rezInCardCount(alpha); 635420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller } 636420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller 637420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller public void setFadeInDuration(long t) { 638420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller mScript.set_fadeInDuration((int)t); // TODO: Remove cast when RS supports exporting longs 639420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller } 640420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller 641e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich private Element elementForBitmap(Bitmap bitmap, Bitmap.Config defaultConfig) { 642e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich Bitmap.Config config = bitmap.getConfig(); 643e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich if (config == null) { 644e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich config = defaultConfig; 645e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich } 646e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich if (config == Bitmap.Config.ALPHA_8) { 647e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich return A_8(mRS); 648e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich } else if (config == Bitmap.Config.RGB_565) { 649e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich return RGB_565(mRS); 650e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich } else if (config == Bitmap.Config.ARGB_4444) { 651e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich return RGBA_4444(mRS); 652e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich } else if (config == Bitmap.Config.ARGB_8888) { 653e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich return RGBA_8888(mRS); 654e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich } else { 655e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich throw new IllegalArgumentException("Unknown configuration"); 656e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich } 657e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich } 6585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller} 659