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