CarouselView.java revision a3cb716626b477c98ba912698c765eab20f27286
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 com.android.ex.carousel.CarouselRS.CarouselCallback; 205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.Context; 225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.res.Resources; 235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap; 24a3cb716626b477c98ba912698c765eab20f27286Jim Millerimport android.graphics.PixelFormat; 255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap.Config; 265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.FileA3D; 27b0f070636c29ad178f4e21306f301fe3d20c183bJim Millerimport android.renderscript.Float4; 285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.Mesh; 295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.RSSurfaceView; 305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.RenderScriptGL; 315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.AttributeSet; 325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.Log; 335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.view.MotionEvent; 345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.view.SurfaceHolder; 355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 367cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller/** 377cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * <p> 387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This class represents the basic building block for using a 3D Carousel. The Carousel is 397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * basically a scene of cards and slots. The spacing between cards is dictated by the number 407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * of slots and the radius. The number of visible cards dictates how far the Carousel can be moved. 417cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * If the number of cards exceeds the number of slots, then the Carousel will continue to go 427cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * around until the last card can be seen. 437cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpublic abstract class CarouselView extends RSSurfaceView { 455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private static final boolean USE_DEPTH_BUFFER = true; 465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private final int DEFAULT_SLOT_COUNT = 10; 47c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private final float DEFAULT_RADIUS = 20.0f; 487c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma private final int DEFAULT_VISIBLE_DETAIL_COUNT = 3; 49c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private final float DEFAULT_SWAY_SENSITIVITY = 0.0f; 50c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private final float DEFAULT_FRICTION_COEFFICIENT = 10.0f; 51c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private final float DEFAULT_DRAG_FACTOR = 0.25f; 525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private static final String TAG = "CarouselView"; 537cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller private static final boolean DBG = false; 545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private CarouselRS mRenderScript; 555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private RenderScriptGL mRS; 565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private Context mContext; 575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private boolean mTracking; 589afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller 597cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller // These shadow the state of the renderer in case the surface changes so the surface 607cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller // can be restored to its previous state. 615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private Bitmap mDefaultBitmap; 625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private Bitmap mLoadingBitmap; 639afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller private Bitmap mBackgroundBitmap; 647cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller private Bitmap mDefaultLineBitmap = Bitmap.createBitmap( 657cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller new int[] {0x80ffffff, 0xffffffff, 0x80ffffff}, 0, 3, 3, 1, Bitmap.Config.ARGB_4444); 665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private Mesh mDefaultGeometry; 675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private Mesh mLoadingGeometry; 685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private int mCardCount = 0; 695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private int mVisibleSlots = 0; 707c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma private int mVisibleDetails = DEFAULT_VISIBLE_DETAIL_COUNT; 717c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma private boolean mDrawDetailBelowCard = false; 727c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma private boolean mDrawRuler = true; 735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private float mStartAngle; 74c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mRadius = DEFAULT_RADIUS; 75c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mCardRotation = 0.0f; 76c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mSwaySensitivity = DEFAULT_SWAY_SENSITIVITY; 77c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mFrictionCoefficient = DEFAULT_FRICTION_COEFFICIENT; 78c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mDragFactor = DEFAULT_DRAG_FACTOR; 795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private int mSlotCount = DEFAULT_SLOT_COUNT; 80c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mEye[] = { 20.6829f, 2.77081f, 16.7314f }; 81c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mAt[] = { 14.7255f, -3.40001f, -1.30184f }; 82c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma private float mUp[] = { 0.0f, 1.0f, 0.0f }; 836b1fa13e79a6ae467d16da223fd36db53fa5a5cbJim Miller private Float4 mBackgroundColor = new Float4(0.0f, 0.0f, 0.0f, 1.0f); 84a3cb716626b477c98ba912698c765eab20f27286Jim Miller private CarouselCallback mCarouselCallback; 855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public static class Info { 879afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller public Info(int _resId) { resId = _resId; } 885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public int resId; // resource for renderscript resource (e.g. R.raw.carousel) 895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public abstract Info getRenderScriptInfo(); 925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public CarouselView(Context context) { 945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller this(context, null); 955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Constructor used when this widget is created from a layout file. 995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public CarouselView(Context context, AttributeSet attrs) { 1015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller super(context, attrs); 1025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mContext = context; 1035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller boolean useDepthBuffer = true; 104e386bbba584685f6261e6dc846c9d05c79b53535Bryan Mawhinney ensureRenderScript(); 1055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller // TODO: add parameters to layout 1065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller private void ensureRenderScript() { 109e386bbba584685f6261e6dc846c9d05c79b53535Bryan Mawhinney if (mRS == null) { 110e386bbba584685f6261e6dc846c9d05c79b53535Bryan Mawhinney mRS = createRenderScript(USE_DEPTH_BUFFER); 111e386bbba584685f6261e6dc846c9d05c79b53535Bryan Mawhinney } 1125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript = new CarouselRS(); 1135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.init(mRS, getResources(), getRenderScriptInfo().resId); 1145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller @Override 1175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 1185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller super.surfaceChanged(holder, format, w, h); 1195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller //mRS.contextSetSurface(w, h, holder.getSurface()); 1205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.init(mRS, getResources(), getRenderScriptInfo().resId); 1215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setSlotCount(mSlotCount); 1225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller createCards(mCardCount); 1235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setVisibleSlots(mVisibleSlots); 1247c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma setVisibleDetails(mVisibleDetails); 1257c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma setDrawDetailBelowCard(mDrawDetailBelowCard); 1267c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma setDrawRuler(mDrawRuler); 1275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setCallback(mCarouselCallback); 1285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setDefaultBitmap(mDefaultBitmap); 1295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setLoadingBitmap(mLoadingBitmap); 1305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setDefaultGeometry(mDefaultGeometry); 1315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setLoadingGeometry(mLoadingGeometry); 132b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller setBackgroundColor(mBackgroundColor.x, mBackgroundColor.y, mBackgroundColor.z, 133b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller mBackgroundColor.w); 1349afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller setBackgroundBitmap(mBackgroundBitmap); 1357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller setDetailLineBitmap(mDefaultLineBitmap); 1365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller setStartAngle(mStartAngle); 137c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma setRadius(mRadius); 138c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma setCardRotation(mCardRotation); 139c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma setSwaySensitivity(mSwaySensitivity); 140c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma setFrictionCoefficient(mFrictionCoefficient); 141c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma setDragFactor(mDragFactor); 142c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma setLookAt(mEye, mAt, mUp); 1435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Loads geometry from a resource id. 1475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * 1485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param resId 1495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @return the loaded mesh or null if it cannot be loaded 1505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public Mesh loadGeometry(int resId) { 1525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller Resources res = mContext.getResources(); 1535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller FileA3D model = FileA3D.createFromResource(mRS, res, resId); 1545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller FileA3D.IndexEntry entry = model.getIndexEntry(0); 1555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if(entry == null || entry.getClassID() != FileA3D.ClassID.MESH) { 1565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller return null; 1575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller return (Mesh) entry.getObject(); 1595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller /** 1625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Load A3D file from resource. If resId == 0, will clear geometry for this item. 1635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param n 1645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * @param resId 1655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */ 1665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setGeometryForItem(int n, Mesh mesh) { 167c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null) { 168c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRenderScript.setGeometry(n, mesh); 169c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 1705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1727cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 1737cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Set the number of slots around the Carousel. Basically equivalent to the poles horses 1747cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * might attach to on a real Carousel. 1757cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 1767cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param n the number of slots 1777cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 1785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setSlotCount(int n) { 1795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mSlotCount = n; 1805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 1815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setSlotCount(n); 1825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1857cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 1867cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Sets the number of visible slots around the Carousel. This is primarily used as a cheap 1877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * form of clipping. The Carousel will never show more than this many cards. 1887cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param n the number of visible slots 1897cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 1905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setVisibleSlots(int n) { 1915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mVisibleSlots = n; 1925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 1935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setVisibleSlots(n); 1945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 1965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 1977cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 1987c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * Set the number of detail textures that can be visible at one time. 1997c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * 2007c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * @param n the number of slots 2017c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma */ 2027c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma public void setVisibleDetails(int n) { 2037c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mVisibleDetails = n; 2047c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma if (mRenderScript != null) { 2057c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mRenderScript.setVisibleDetails(n); 2067c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 2077c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 2087c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma 2097c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma /** 2107c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * Set whether to draw the detail texture above or below the card. 2117c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * 2127c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * @param below False for above, true for below. 2137c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma */ 2147c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma public void setDrawDetailBelowCard(boolean below) { 2157c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mDrawDetailBelowCard = below; 2167c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma if (mRenderScript != null) { 2177c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mRenderScript.setDrawDetailBelowCard(below); 2187c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 2197c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 2207c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma 2217c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma /** 2227c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * Set whether to draw a ruler from the card to the detail texture 2237c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * 2247c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma * @param drawRuler True to draw a ruler, false to draw nothing where the ruler would go. 2257c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma */ 2267c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma public void setDrawRuler(boolean drawRuler) { 2277c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mDrawRuler = drawRuler; 2287c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma if (mRenderScript != null) { 2297c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma mRenderScript.setDrawRuler(drawRuler); 2307c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 2317c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma } 2327c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma 2337c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma /** 2347cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This dictates how many cards are in the deck. If the number of cards is greater than the 2357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * number of slots, then the Carousel goes around n / slot_count times. 2367cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 2377cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Can be called again to increase or decrease the number of cards. 2387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 2397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param n the number of cards to create. 2407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 2415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void createCards(int n) { 2425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCardCount = n; 2435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 2445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.createCards(n); 2455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 248a3cb716626b477c98ba912698c765eab20f27286Jim Miller public int getCardCount() { 249a3cb716626b477c98ba912698c765eab20f27286Jim Miller return mCardCount; 250a3cb716626b477c98ba912698c765eab20f27286Jim Miller } 251a3cb716626b477c98ba912698c765eab20f27286Jim Miller 2527cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 2537cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This sets the texture on card n. It should only be called in response to 2547cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * {@link CarouselCallback#onRequestTexture(int)}. Since there's no guarantee 2557cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * that a given texture is still on the screen, replacing this texture should be done 2567cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * by first setting it to null and then waiting for the next 2577cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * {@link CarouselCallback#onRequestTexture(int)} to swap it with the new one. 2587cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 2597cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param n the card given by {@link CarouselCallback#onRequestTexture(int)} 2607cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param bitmap the bitmap image to show 2617cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 2625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setTextureForItem(int n, Bitmap bitmap) { 263c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma // Also check against mRS, to handle the case where the result is being delivered by a 264c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma // background thread but the sender no longer exists. 265c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null && mRS != null) { 2667cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (DBG) Log.v(TAG, "setTextureForItem(" + n + ")"); 2679afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller mRenderScript.setTexture(n, bitmap); 2687cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (DBG) Log.v(TAG, "done"); 2695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 2715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 2727cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 2737cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This sets the detail texture that floats above card n. It should only be called in response 2747cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * to {@link CarouselCallback#onRequestDetailTexture(int)}. Since there's no guarantee 2757cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * that a given texture is still on the screen, replacing this texture should be done 2767cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * by first setting it to null and then waiting for the next 2777cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * {@link CarouselCallback#onRequestDetailTexture(int)} to swap it with the new one. 2787cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 2797cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param n the card to set the help text 2807cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param offx an optional offset to apply to the texture, in pixel coordinates 2817cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param offy an optional offset to apply to the texture, in pixel coordinates 2827cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param bitmap the bitmap to show as the detail 2837cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 2847cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller public void setDetailTextureForItem(int n, float offx, float offy, Bitmap bitmap) { 2857cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (mRenderScript != null) { 2867cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (DBG) Log.v(TAG, "setDetailTextureForItem(" + n + ")"); 2877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller mRenderScript.setDetailTexture(n, offx, offy, bitmap); 2887cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (DBG) Log.v(TAG, "done"); 2897cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 2907cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 2917cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 2927cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 2937cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Sets the bitmap to show on a card when the card draws the very first time. 2947cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Generally, this bitmap will only be seen during the first few frames of startup 2957cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * or when the number of cards are changed. It can be ignored in most cases, 2967cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * as the cards will generally only be in the loading or loaded state. 2977cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 2987cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param bitmap 2997cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 3005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setDefaultBitmap(Bitmap bitmap) { 3019afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller mDefaultBitmap = bitmap; 3025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 3035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setDefaultBitmap(bitmap); 3045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3077cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 3087cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Sets the bitmap to show on the card while the texture is loading. It is set to this 3097cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * value just before {@link CarouselCallback#onRequestTexture(int)} is called and changed 3107cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * when {@link CarouselView#setTextureForItem(int, Bitmap)} is called. It is shared by all 3117cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * cards. 3127cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 3137cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param bitmap 3147cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 3155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setLoadingBitmap(Bitmap bitmap) { 3165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mLoadingBitmap = bitmap; 3175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 3185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setLoadingBitmap(bitmap); 3195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3227cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 323b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * Sets background to specified color. If a background texture is specified with 324b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * {@link CarouselView#setBackgroundBitmap(Bitmap)}, then this call has no effect. 325b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * 326b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * @param red the amount of red 327b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * @param green the amount of green 328b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * @param blue the amount of blue 329b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * @param alpha the amount of alpha 330b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller */ 331b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller public void setBackgroundColor(float red, float green, float blue, float alpha) { 332b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller mBackgroundColor = new Float4(red, green, blue, alpha); 333b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller if (mRenderScript != null) { 334b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller mRenderScript.setBackgroundColor(mBackgroundColor); 335b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller } 336b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller } 337b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller /** 338b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * Can be used to optionally set the background to a bitmap. When set to something other than 339b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller * null, this overrides {@link CarouselView#setBackgroundColor(Float4)}. 3407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 3417cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param bitmap 3427cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 3439afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller public void setBackgroundBitmap(Bitmap bitmap) { 3449afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller mBackgroundBitmap = bitmap; 3459afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller if (mRenderScript != null) { 3469afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller mRenderScript.setBackgroundTexture(bitmap); 3479afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller } 3489afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller } 3499afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller 3507cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 3517cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This texture is used to draw a line from the card alongside the texture detail. The line 3527cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * will be as wide as the texture. It can be used to give the line glow effects as well as 3537cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * allowing other blending effects. It is typically one dimensional, e.g. 3x1. 3547cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 3557cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param bitmap 3567cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 3577cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller public void setDetailLineBitmap(Bitmap bitmap) { 3587cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller mDefaultLineBitmap = bitmap; 3597cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller if (mRenderScript != null) { 3607cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller mRenderScript.setDetailLineTexture(bitmap); 3617cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 3627cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller } 3637cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller 3647cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 3657cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This geometry will be shown when no geometry has been loaded for a given slot. If not set, 3667cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * a quad will be drawn in its place. It is shared for all cards. 3677cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 3687cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param mesh 3697cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 3705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setDefaultGeometry(Mesh mesh) { 3715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mDefaultGeometry = mesh; 3725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 3735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setDefaultGeometry(mesh); 3745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3777cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 3787cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This is an intermediate version of the object to show while geometry is loading. If not set, 3797cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * a quad will be drawn in its place. It is shared for all cards. 3807cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 3817cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param mesh 3827cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 3835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setLoadingGeometry(Mesh mesh) { 3845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mLoadingGeometry = mesh; 3855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 3865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setLoadingGeometry(mesh); 3875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 3895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 3907cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 3917cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Sets the callback for receiving events from RenderScript. 3927cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 3937cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param callback 3947cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 3955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setCallback(CarouselCallback callback) 3965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 3975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mCarouselCallback = callback; 3985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 3995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setCallback(callback); 4005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4037cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller /** 4047cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Sets the startAngle for the Carousel. The start angle is the first position of the first 4057cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * slot draw. Cards will be drawn from this angle in a counter-clockwise manner around the 4067cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * Carousel. 4077cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * 4087cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * @param angle the angle, in radians. 4097cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */ 4105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public void setStartAngle(float angle) 4115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller { 4125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mStartAngle = angle; 4135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript != null) { 4145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.setStartAngle(angle); 4155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 417c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 418c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setRadius(float radius) { 419c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRadius = radius; 420c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null) { 421c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRenderScript.setRadius(radius); 422c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 423c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 424c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 425c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setCardRotation(float cardRotation) { 426c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mCardRotation = cardRotation; 427c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null) { 428c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRenderScript.setCardRotation(cardRotation); 429c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 430c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 431c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 432c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setSwaySensitivity(float swaySensitivity) { 433c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mSwaySensitivity = swaySensitivity; 434c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null) { 435c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRenderScript.setSwaySensitivity(swaySensitivity); 436c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 437c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 438c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 439c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setFrictionCoefficient(float frictionCoefficient) { 440c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mFrictionCoefficient = frictionCoefficient; 441c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null) { 442c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRenderScript.setFrictionCoefficient(frictionCoefficient); 443c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 444c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 445c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 446c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setDragFactor(float dragFactor) { 447c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mDragFactor = dragFactor; 448c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null) { 449c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRenderScript.setDragFactor(dragFactor); 450c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 451c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 452c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma 453c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma public void setLookAt(float[] eye, float[] at, float[] up) { 454c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mEye = eye; 455c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mAt = at; 456c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mUp = up; 457c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma if (mRenderScript != null) { 458c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma mRenderScript.setLookAt(eye, at, up); 459c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 460c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma } 4615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 462198a060d650bc849ef0f25b597888fac9546803bJack Palevich public void requestFirstCardPosition() { 463198a060d650bc849ef0f25b597888fac9546803bJack Palevich if (mRenderScript != null) { 464198a060d650bc849ef0f25b597888fac9546803bJack Palevich mRenderScript.requestFirstCardPosition(); 465198a060d650bc849ef0f25b597888fac9546803bJack Palevich } 466198a060d650bc849ef0f25b597888fac9546803bJack Palevich } 467198a060d650bc849ef0f25b597888fac9546803bJack Palevich 4685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller @Override 4695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller protected void onDetachedFromWindow() { 4705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller super.onDetachedFromWindow(); 4715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if(mRS != null) { 4725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRS = null; 4735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller destroyRenderScript(); 4745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller @Override 4785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller protected void onAttachedToWindow() { 4795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller super.onAttachedToWindow(); 4805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller ensureRenderScript(); 4815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller @Override 4845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller public boolean onTouchEvent(MotionEvent event) { 4855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller final int action = event.getAction(); 4865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller final float x = event.getX(); 4875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller final float y = event.getY(); 4885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mRenderScript == null) { 4905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller return true; 4915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 4925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller switch (action) { 4945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case MotionEvent.ACTION_DOWN: 4955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mTracking = true; 4965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.doStart(x, y); 4975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 4985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 4995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case MotionEvent.ACTION_MOVE: 5005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller if (mTracking) { 5015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.doMotion(x, y); 5025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 5035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 5045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 5055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller case MotionEvent.ACTION_UP: 5065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mRenderScript.doStop(x, y); 5075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller mTracking = false; 5085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller break; 5095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 5105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller 5115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller return true; 5125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller } 5135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller} 514