CarouselController.java revision 358868df5043b240c9a241c7bb75128ff94b1f34
1c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma/*
2c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * Copyright (C) 2010 The Android Open Source Project
3c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma *
4c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * Licensed under the Apache License, Version 2.0 (the "License");
5c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * you may not use this file except in compliance with the License.
6c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * You may obtain a copy of the License at
7c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma *
8c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma *      http://www.apache.org/licenses/LICENSE-2.0
9c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma *
10c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * Unless required by applicable law or agreed to in writing, software
11c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * distributed under the License is distributed on an "AS IS" BASIS,
12c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * See the License for the specific language governing permissions and
14c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * limitations under the License.
15c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma */
16c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
17c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumapackage com.android.ex.carousel;
18c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
19c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport com.android.ex.carousel.CarouselRS.CarouselCallback;
207cc5787b49708f63aeb818bdd06efed3d4229925Jim Shumaimport com.android.ex.carousel.CarouselView.DetailAlignment;
21c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
22c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport android.content.res.Resources;
23c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport android.graphics.Bitmap;
24c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport android.renderscript.FileA3D;
25c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport android.renderscript.Float4;
26c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport android.renderscript.Mesh;
27c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport android.renderscript.RenderScriptGL;
28c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumaimport android.util.Log;
29c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
30c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma/**
31c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * <p>
32c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * This class represents the basic building block for using a 3D Carousel. The Carousel is
33c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * basically a scene of cards and slots.  The spacing between cards is dictated by the number
34c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * of slots and the radius. The number of visible cards dictates how far the Carousel can be moved.
35c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * If the number of cards exceeds the number of slots, then the Carousel will continue to go
36c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma * around until the last card can be seen.
37c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma */
38c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shumapublic class CarouselController {
39c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private final int DEFAULT_SLOT_COUNT = 10;
40c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private final float DEFAULT_RADIUS = 20.0f;
41c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private final int DEFAULT_VISIBLE_DETAIL_COUNT = 3;
424fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    private final int DEFAULT_PREFETCH_CARD_COUNT = 2;
430cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    private final int DEFAULT_ROW_COUNT = 1;
440cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    private final float DEFAULT_ROW_SPACING = 0.0f;
45c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private final float DEFAULT_SWAY_SENSITIVITY = 0.0f;
46c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private final float DEFAULT_FRICTION_COEFFICIENT = 10.0f;
47c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private final float DEFAULT_DRAG_FACTOR = 0.25f;
484a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney    private final int DEFAULT_DETAIL_ALIGNMENT =
494a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney            DetailAlignment.VIEW_TOP | DetailAlignment.LEFT;
50c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private CarouselRS mRenderScript;
51c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private RenderScriptGL mRS;
52c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private static final String TAG = "CarouselController";
53c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private static final boolean DBG = false;
54c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
55c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    // These shadow the state of the renderer in case the surface changes so the surface
56c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    // can be restored to its previous state.
57c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private Bitmap mDefaultBitmap;
58c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private Bitmap mLoadingBitmap;
59c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private Bitmap mBackgroundBitmap;
60c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private Bitmap mDefaultLineBitmap = Bitmap.createBitmap(
615621100edc38c6e7f7fd7ef54945ba035204fe49Jim Shuma            new int[] {0x00000000, 0xffffffff, 0x00000000}, 0, 3, 3, 1, Bitmap.Config.ARGB_4444);
62358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney    private int mDefaultGeometry;
63358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney    private int mLoadingGeometry;
6451dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney    private float[] mDefaultCardMatrix;
65c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private int mCardCount = 0;
66c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private int mVisibleSlots = 0;
67c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private int mVisibleDetails = DEFAULT_VISIBLE_DETAIL_COUNT;
684fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    private int mPrefetchCardCount = DEFAULT_PREFETCH_CARD_COUNT;
694a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney    private int mDetailTextureAlignment = DEFAULT_DETAIL_ALIGNMENT;
70fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller    private boolean mForceBlendCardsWithZ = false;
71c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private boolean mDrawRuler = true;
72c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mStartAngle;
73a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    private float mCarouselRotationAngle;
74c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mRadius = DEFAULT_RADIUS;
75c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mCardRotation = 0.0f;
7683d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    private boolean mCardsFaceTangent = false;
77c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mSwaySensitivity = DEFAULT_SWAY_SENSITIVITY;
78c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mFrictionCoefficient = DEFAULT_FRICTION_COEFFICIENT;
79c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mDragFactor = DEFAULT_DRAG_FACTOR;
80c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private int mSlotCount = DEFAULT_SLOT_COUNT;
810cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    private int mRowCount = DEFAULT_ROW_COUNT;
820cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    private float mRowSpacing = DEFAULT_ROW_SPACING;
83c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mEye[] = { 20.6829f, 2.77081f, 16.7314f };
84c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mAt[] = { 14.7255f, -3.40001f, -1.30184f };
85c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mUp[] = { 0.0f, 1.0f, 0.0f };
86c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private Float4 mBackgroundColor = new Float4(0.0f, 0.0f, 0.0f, 1.0f);
87c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private CarouselCallback mCarouselCallback;
88c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private float mRezInCardCount = 0.0f;
89c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private long mFadeInDuration = 250L;
90c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    private Bitmap mDetailLoadingBitmap = Bitmap.createBitmap(
91c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            new int[] {0}, 0, 1, 1, 1, Bitmap.Config.ARGB_4444);
92be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    private int mDragModel = CarouselRS.DRAG_MODEL_SCREEN_DELTA;
9314d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma    private int mFillDirection = CarouselRS.FILL_DIRECTION_CCW;
94c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
95c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public CarouselController() {
96c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        boolean useDepthBuffer = true;
97c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
98c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
99c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setRS(RenderScriptGL rs, CarouselRS renderScript) {
100c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mRS = rs;
101c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mRenderScript = renderScript;
102c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
103c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
104c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void onSurfaceChanged() {
105c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setSlotCount(mSlotCount);
1069c019da0f3083c4b82552fb2fe5b052f90073cb9Bryan Mawhinney        setDefaultCardMatrix(mDefaultCardMatrix);
107c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        createCards(mCardCount);
108c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setVisibleSlots(mVisibleSlots);
109c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setVisibleDetails(mVisibleDetails);
1104fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        setPrefetchCardCount(mPrefetchCardCount);
1110cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        setRowCount(mRowCount);
1120cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        setRowSpacing(mRowSpacing);
1134a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        setDetailTextureAlignment(mDetailTextureAlignment);
114fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        setForceBlendCardsWithZ(mForceBlendCardsWithZ);
115c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setDrawRuler(mDrawRuler);
116c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setCallback(mCarouselCallback);
117c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setDefaultBitmap(mDefaultBitmap);
118c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setLoadingBitmap(mLoadingBitmap);
119c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setDefaultGeometry(mDefaultGeometry);
120c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setLoadingGeometry(mLoadingGeometry);
121c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setBackgroundColor(mBackgroundColor.x, mBackgroundColor.y, mBackgroundColor.z,
122c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma                mBackgroundColor.w);
123c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setBackgroundBitmap(mBackgroundBitmap);
124c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setDetailLineBitmap(mDefaultLineBitmap);
125c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setStartAngle(mStartAngle);
126a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        setCarouselRotationAngle(mCarouselRotationAngle);
127c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setRadius(mRadius);
128c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setCardRotation(mCardRotation);
12983d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        setCardsFaceTangent(mCardsFaceTangent);
130c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setSwaySensitivity(mSwaySensitivity);
131c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setFrictionCoefficient(mFrictionCoefficient);
132c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setDragFactor(mDragFactor);
133be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller        setDragModel(mDragModel);
13414d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma        setFillDirection(mFillDirection);
135c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setLookAt(mEye, mAt, mUp);
136c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setRezInCardCount(mRezInCardCount);
137c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setFadeInDuration(mFadeInDuration);
138c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        setDetailLoadingBitmap(mDetailLoadingBitmap);
139c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
140c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
141c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
142c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Loads geometry from a resource id.
143c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
144c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param resId
145c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @return the loaded mesh or null if it cannot be loaded
146c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
147358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney    public Mesh loadGeometry(int resId) {
148358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney        if (mRenderScript != null) {
149358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney          return mRenderScript.loadGeometry(resId);
150c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
151358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney        return null;
152c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
153c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
154c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
155c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Load A3D file from resource.  If resId == 0, will clear geometry for this item.
156c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n
157c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param resId
158c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
159c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setGeometryForItem(int n, Mesh mesh) {
160c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
161c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setGeometry(n, mesh);
162c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
163c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
164c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
165c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
166c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Set the number of slots around the Carousel. Basically equivalent to the poles horses
167c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * might attach to on a real Carousel.
168c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
169c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n the number of slots
170c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
171c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setSlotCount(int n) {
172c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mSlotCount = n;
173c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
174c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setSlotCount(n);
175c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
176c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
177c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
178c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
179c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Sets the number of visible slots around the Carousel.  This is primarily used as a cheap
180c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * form of clipping. The Carousel will never show more than this many cards.
181c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n the number of visible slots
182c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
183c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setVisibleSlots(int n) {
184c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mVisibleSlots = n;
185c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
186c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setVisibleSlots(n);
187c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
188c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
189c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
190c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
191c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Set the number of detail textures that can be visible at one time.
192c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
193c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n the number of slots
194c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
195c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setVisibleDetails(int n) {
196c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mVisibleDetails = n;
197c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
198c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setVisibleDetails(n);
199c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
200c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
201c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
202c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
2034fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * Set the number of cards to pre-load that are outside of the visible region, as determined by
2044fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * setVisibleSlots(). This number gets added to the number of visible slots and used to
2054fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * determine when resources for cards should be loaded. This number should be small (n <= 4)
2064fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * for systems with limited texture memory or views that show more than half dozen cards in the
2074fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * view.
2084fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     *
2094fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * @param n the number of cards; should be even, so the count is the same on each side
2104fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     */
2114fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    public void setPrefetchCardCount(int n) {
2124fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        mPrefetchCardCount = n;
2134fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        if (mRenderScript != null) {
2144fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma            mRenderScript.setPrefetchCardCount(n);
2154fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        }
2164fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    }
2174fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma
2184fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    /**
2190cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney     * Sets the number of rows of cards to show in each slot.
2200cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney     */
2210cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    public void setRowCount(int n) {
2220cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        mRowCount = n;
2230cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        if (mRenderScript != null) {
2240cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney            mRenderScript.setRowCount(n);
2250cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        }
2260cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    }
2270cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney
2280cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    /**
2290cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney     * Sets the spacing between each row of cards when rowCount > 1.
2300cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney     */
2310cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    public void setRowSpacing(float s) {
2320cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        mRowSpacing = s;
2330cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        if (mRenderScript != null) {
2340cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney            mRenderScript.setRowSpacing(s);
2350cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney        }
2360cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    }
2370cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney
2380cec8afdb4f9d78adf88c9b9b41e993aef617beaBryan Mawhinney    /**
2394a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney     * Sets how detail textures are aligned with respect to the card.
240c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
2414a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney     * @param alignment a bitmask of DetailAlignment flags.
242c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
2434a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney    public void setDetailTextureAlignment(int alignment) {
2444a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        int xBits = alignment & DetailAlignment.HORIZONTAL_ALIGNMENT_MASK;
2454a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        if (xBits == 0 || ((xBits & (xBits - 1)) != 0)) {
2464a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney            throw new IllegalArgumentException(
2474a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney                    "Must specify exactly one horizontal alignment flag");
2484a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        }
2494a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        int yBits = alignment & DetailAlignment.VERTICAL_ALIGNMENT_MASK;
2504a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        if (yBits == 0 || ((yBits & (yBits - 1)) != 0)) {
2514a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney            throw new IllegalArgumentException(
2524a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney                    "Must specify exactly one vertical alignment flag");
253c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
254c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
2554a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        mDetailTextureAlignment = alignment;
2564fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        if (mRenderScript != null) {
2574a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney            mRenderScript.setDetailTextureAlignment(alignment);
2584fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        }
2594fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    }
2604fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma
2614fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    /**
262fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * Set whether depth is enabled while blending. Generally, this is discouraged because
263fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * it causes bad artifacts. Careful attention to geometry and alpha transparency of
264fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * textures can mitigate much of this. Geometry for an individual item must be drawn
265fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * back-to-front, for example.
266bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma     *
267fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * @param enabled True to enable depth while blending, and false to disable it.
268bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma     */
269fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller    public void setForceBlendCardsWithZ(boolean enabled) {
270fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mForceBlendCardsWithZ = enabled;
271bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma        if (mRenderScript != null) {
272fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller            mRenderScript.setForceBlendCardsWithZ(enabled);
273bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma        }
274bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma    }
275bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma
276bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma    /**
277c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Set whether to draw a ruler from the card to the detail texture
278c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
279c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param drawRuler True to draw a ruler, false to draw nothing where the ruler would go.
280c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
281c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setDrawRuler(boolean drawRuler) {
282c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mDrawRuler = drawRuler;
283c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
284c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setDrawRuler(drawRuler);
285c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
286c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
287c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
288c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
289c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This dictates how many cards are in the deck.  If the number of cards is greater than the
290c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * number of slots, then the Carousel goes around n / slot_count times.
291c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
292c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Can be called again to increase or decrease the number of cards.
293c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
294c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n the number of cards to create.
295c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
296c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void createCards(int n) {
297c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mCardCount = n;
298c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
299c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.createCards(n);
300c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
301c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
302c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
303c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public int getCardCount() {
304c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        return mCardCount;
305c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
306c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
307c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
308c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This sets the texture on card n.  It should only be called in response to
309c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * {@link CarouselCallback#onRequestTexture(int)}.  Since there's no guarantee
310c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * that a given texture is still on the screen, replacing this texture should be done
311c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * by first setting it to null and then waiting for the next
312c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * {@link CarouselCallback#onRequestTexture(int)} to swap it with the new one.
313c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
314c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n the card given by {@link CarouselCallback#onRequestTexture(int)}
315c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param bitmap the bitmap image to show
316c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
317c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setTextureForItem(int n, Bitmap bitmap) {
318c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        // Also check against mRS, to handle the case where the result is being delivered by a
319c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        // background thread but the sender no longer exists.
320c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null && mRS != null) {
321c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            if (DBG) Log.v(TAG, "setTextureForItem(" + n + ")");
322c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setTexture(n, bitmap);
323c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            if (DBG) Log.v(TAG, "done");
324c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
325c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
326c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
327c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
328c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This sets the detail texture that floats above card n. It should only be called in response
329c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * to {@link CarouselCallback#onRequestDetailTexture(int)}.  Since there's no guarantee
330c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * that a given texture is still on the screen, replacing this texture should be done
331c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * by first setting it to null and then waiting for the next
332c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * {@link CarouselCallback#onRequestDetailTexture(int)} to swap it with the new one.
333c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
334c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n the card to set detail texture for
335c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param offx an optional offset to apply to the texture (in pixels) from top of detail line
336c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param offy an optional offset to apply to the texture (in pixels) from top of detail line
337c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param loffx an optional offset to apply to the line (in pixels) from left edge of card
338c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param loffy an optional offset to apply to the line (in pixels) from top of screen
339c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param bitmap the bitmap to show as the detail
340c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
341c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setDetailTextureForItem(int n, float offx, float offy, float loffx, float loffy,
342c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            Bitmap bitmap) {
3437ec486bf1373232a35efa96622f31ac1aff5456bBryan Mawhinney        if (mRenderScript != null && mRS != null) {
344c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            if (DBG) Log.v(TAG, "setDetailTextureForItem(" + n + ")");
345c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setDetailTexture(n, offx, offy, loffx, loffy, bitmap);
346c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            if (DBG) Log.v(TAG, "done");
3476af401bca5f8854524d128e9df5700035fae1160Jim Shuma        }
3486af401bca5f8854524d128e9df5700035fae1160Jim Shuma    }
3496af401bca5f8854524d128e9df5700035fae1160Jim Shuma
3506af401bca5f8854524d128e9df5700035fae1160Jim Shuma    /**
3518441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     * Sets the specified texture as invalid. If {@code eraseCurrent} is true,
3528441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     * the texture will be immediately cleared from view and an invalidate
3538441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     * handler will be called. If {@code eraseCurrent} is false, a replacement
3548441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     * texture will be requested, and the old texture will be left in place in
3558441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     * the meantime.
3568441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     *
3578441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     * @param n the card to invalidate the detail texture for
3588441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     * @param eraseCurrent whether to erase the current texture
3598441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey     */
3608441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey    public void invalidateTexture(int n, boolean eraseCurrent) {
3618441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey        if (mRenderScript != null && mRS != null) {
3628441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey            if (DBG) Log.v(TAG, "invalidateTexture(" + n + ", " + eraseCurrent + ")");
3638441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey            mRenderScript.invalidateTexture(n, eraseCurrent);
3648441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey            if (DBG) Log.v(TAG, "done");
3658441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey        }
3668441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey    }
3678441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey
3688441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey    /**
3696af401bca5f8854524d128e9df5700035fae1160Jim Shuma     * Sets the specified detail texture as invalid. If eraseCurrent is true, the texture will be
3706af401bca5f8854524d128e9df5700035fae1160Jim Shuma     * immediately cleared from view and an invalidate handler will be called. If eraseCurrent is
3716af401bca5f8854524d128e9df5700035fae1160Jim Shuma     * false, a replacement texture will be requested, and the old texture will be left in place
3726af401bca5f8854524d128e9df5700035fae1160Jim Shuma     * in the meantime.
3736af401bca5f8854524d128e9df5700035fae1160Jim Shuma     * @param n the card to invalidate the detail texture for
3746af401bca5f8854524d128e9df5700035fae1160Jim Shuma     * @param eraseCurrent whether to erase the current texture
3756af401bca5f8854524d128e9df5700035fae1160Jim Shuma     */
3766af401bca5f8854524d128e9df5700035fae1160Jim Shuma    public void invalidateDetailTexture(int n, boolean eraseCurrent) {
3776af401bca5f8854524d128e9df5700035fae1160Jim Shuma        if (mRenderScript != null && mRS != null) {
3788441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey            if (DBG) Log.v(TAG, "invalidateDetailTexture(" + n + ", " + eraseCurrent + ")");
3798441b1025afe64748f9e3483baacee92171bbfa3Jeff Sharkey            mRenderScript.invalidateDetailTexture(n, eraseCurrent);
3806af401bca5f8854524d128e9df5700035fae1160Jim Shuma            if (DBG) Log.v(TAG, "done");
381c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
382c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
383c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
384c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
385c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Sets the bitmap to show on a card when the card draws the very first time.
386c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Generally, this bitmap will only be seen during the first few frames of startup
387c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * or when the number of cards are changed.  It can be ignored in most cases,
388c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * as the cards will generally only be in the loading or loaded state.
389c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
390c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param bitmap
391c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
392c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setDefaultBitmap(Bitmap bitmap) {
393c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mDefaultBitmap = bitmap;
394c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
395c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setDefaultBitmap(bitmap);
396c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
397c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
398c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
399c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
400c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Sets the bitmap to show on the card while the texture is loading. It is set to this
401c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * value just before {@link CarouselCallback#onRequestTexture(int)} is called and changed
402c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * when {@link CarouselView#setTextureForItem(int, Bitmap)} is called. It is shared by all
403c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * cards.
404c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
405c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param bitmap
406c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
407c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setLoadingBitmap(Bitmap bitmap) {
408c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mLoadingBitmap = bitmap;
409c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
410c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setLoadingBitmap(bitmap);
411c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
412c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
413c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
414c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
415c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Sets background to specified color.  If a background texture is specified with
416c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * {@link CarouselView#setBackgroundBitmap(Bitmap)}, then this call has no effect.
417c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
418c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param red the amount of red
419c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param green the amount of green
420c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param blue the amount of blue
421c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param alpha the amount of alpha
422c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
423c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setBackgroundColor(float red, float green, float blue, float alpha) {
424c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mBackgroundColor = new Float4(red, green, blue, alpha);
425c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
426c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setBackgroundColor(mBackgroundColor);
427c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
428c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
429c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
430c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
431c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Can be used to optionally set the background to a bitmap. When set to something other than
4324fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma     * null, this overrides {@link CarouselController#setBackgroundColor(Float4)}.
433c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
434c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param bitmap
435c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
436c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setBackgroundBitmap(Bitmap bitmap) {
437c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mBackgroundBitmap = bitmap;
438c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
439c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setBackgroundTexture(bitmap);
440c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
441c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
442c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
443c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
444c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Can be used to optionally set a "loading" detail bitmap. Typically, this is just a black
445c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * texture with alpha = 0 to allow details to slowly fade in.
446c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
447c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param bitmap
448c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
449c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setDetailLoadingBitmap(Bitmap bitmap) {
450c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mDetailLoadingBitmap = bitmap;
451c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
452c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setDetailLoadingTexture(bitmap);
453c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
454c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
455c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
456c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
457c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This texture is used to draw a line from the card alongside the texture detail. The line
458c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * will be as wide as the texture. It can be used to give the line glow effects as well as
459c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * allowing other blending effects. It is typically one dimensional, e.g. 3x1.
460c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
461c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param bitmap
462c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
463c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setDetailLineBitmap(Bitmap bitmap) {
464c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mDefaultLineBitmap = bitmap;
465c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
466c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setDetailLineTexture(bitmap);
467c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
468c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
469c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
470c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
471c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This geometry will be shown when no geometry has been loaded for a given slot. If not set,
472fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * a quad will be drawn in its place. It is shared for all cards. If something other than
473fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * simple planar geometry is used, consider enabling depth test with
474fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * {@link CarouselController#setForceBlendCardsWithZ(boolean)}
475c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
476c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param mesh
477c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
478358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney    public void setDefaultGeometry(int resId) {
479358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney        mDefaultGeometry = resId;
480c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
481358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney            Mesh mesh = mRenderScript.loadGeometry(resId);
482c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setDefaultGeometry(mesh);
483c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
484c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
485c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
486c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
48751dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney     * Sets the matrix used to transform card geometries.  By default, this
48851dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney     * is the identity matrix, but you can specify a different matrix if you
48951dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney     * want to scale, translate and / or rotate the card before drawing.
49051dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney     *
49151dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney     * @param matrix array of 9 or 16 floats representing a 3x3 or 4x4 matrix,
49251dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney     * or null as a shortcut for an identity matrix.
49351dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney     */
49451dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney    public void setDefaultCardMatrix(float[] matrix) {
49551dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney        mDefaultCardMatrix = matrix;
49651dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney        if (mRenderScript != null) {
49751dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney           mRenderScript.setDefaultCardMatrix(matrix);
49851dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney        }
49951dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney    }
50051dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney
50151dd0196e4f3bd4086545f5bf30038ca9ad9ac27Bryan Mawhinney    /**
502c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This is an intermediate version of the object to show while geometry is loading. If not set,
503fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * a quad will be drawn in its place.  It is shared for all cards. If something other than
504fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * simple planar geometry is used, consider enabling depth test with
505fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller     * {@link CarouselView#setForceBlendCardsWithZ(boolean)}
506c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
507358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney     * @param resId
508c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
509358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney    public void setLoadingGeometry(int resId) {
510358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney        mLoadingGeometry = resId;
511c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
512358868df5043b240c9a241c7bb75128ff94b1f34Bryan Mawhinney            Mesh mesh = mRenderScript.loadGeometry(resId);
513c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setLoadingGeometry(mesh);
514c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
515c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
516c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
517c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
518c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Sets the callback for receiving events from RenderScript.
519c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
520c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param callback
521c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
522c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setCallback(CarouselCallback callback)
523c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    {
524c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mCarouselCallback = callback;
525c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
526c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setCallback(callback);
527c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
528c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
529c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
530c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
531594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     * Gets the callback for receiving events from Renderscript.
532594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     */
533594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    public CarouselCallback getCallback() {
534594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        return mCarouselCallback;
535594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    }
536594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
537594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    /**
538c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Sets the startAngle for the Carousel. The start angle is the first position of the first
539c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * slot draw.  Cards will be drawn from this angle in a counter-clockwise manner around the
540c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Carousel.
541c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
542c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param angle the angle, in radians.
543c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
544c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setStartAngle(float angle)
545c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    {
546c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mStartAngle = angle;
547c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
548c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setStartAngle(angle);
549c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
550c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
551c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
552a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    /**
553a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * Set the current carousel rotation angle, in card units.
554a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * This is measured in card positions, not in radians or degrees.
555a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     *
556a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * A value of 0.0 means that card 0 is in the home position.
557a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * A value of 1.0 means that card 1 is in the home position, and so on.
558a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * The maximum value will be somewhat less than the total number of cards.
559a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     *
560a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     * @param angle
561a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich     */
562a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    public void setCarouselRotationAngle(float angle) {
563a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        mCarouselRotationAngle = angle;
564a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        if (mRenderScript != null) {
565a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich            mRenderScript.setCarouselRotationAngle(angle);
566a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        }
567a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    }
568a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich
569c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setRadius(float radius) {
570c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mRadius = radius;
571c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
572c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setRadius(radius);
573c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
574c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
575c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
576be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    /**
577be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     * Sets the current model for dragging. There are currently four drag models:
578be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     * {@link CarouselView#DRAG_MODEL_SCREEN_DELTA}
579be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     * {@link CarouselView#DRAG_MODEL_PLANE}
580be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     * {@link CarouselView#DRAG_MODEL_CYLINDER_INSIDE}
581be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     * {@link CarouselView#DRAG_MODEL_CYLINDER_OUTSIDE}
582be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     *
583be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     * @param model
584be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller     */
585be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    public void setDragModel(int model) {
586be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller        mDragModel  = model;
587be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller        if (mRenderScript != null) {
588be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller            mRenderScript.setDragModel(model);
589be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller        }
590be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    }
591be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller
59214d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma    /** Sets the direction to fill in cards around the carousel.
59314d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma     *
59414d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma     * @param direction Either {@link CarouselRS#FILL_DIRECTION_CCW} or
59514d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma     * {@link CarouselRS#FILL_DIRECTION_CW}.
59614d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma     */
59714d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma    public void setFillDirection(int direction) {
59814d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma        mFillDirection = direction;
59914d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma        if (mRenderScript != null) {
60014d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma            mRenderScript.setFillDirection(direction);
60114d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma        }
60214d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma    }
60314d2c1ec52bb04b5120c2bfdd1a8811a238573ceJim Shuma
604c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setCardRotation(float cardRotation) {
605c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mCardRotation = cardRotation;
606c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
607c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setCardRotation(cardRotation);
608c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
609c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
610c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
61183d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    public void setCardsFaceTangent(boolean faceTangent) {
61283d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        mCardsFaceTangent = faceTangent;
61383d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        if (mRenderScript != null) {
61483d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney            mRenderScript.setCardsFaceTangent(faceTangent);
61583d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        }
61683d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    }
61783d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney
618c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setSwaySensitivity(float swaySensitivity) {
619c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mSwaySensitivity = swaySensitivity;
620c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
621c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setSwaySensitivity(swaySensitivity);
622c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
623c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
624c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
625c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setFrictionCoefficient(float frictionCoefficient) {
626c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mFrictionCoefficient = frictionCoefficient;
627c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
628c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setFrictionCoefficient(frictionCoefficient);
629c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
630c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
631c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
632c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setDragFactor(float dragFactor) {
633c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mDragFactor = dragFactor;
634c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
635c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setDragFactor(dragFactor);
636c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
637c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
638c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
639c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setLookAt(float[] eye, float[] at, float[] up) {
640c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mEye = eye;
641c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mAt = at;
642c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mUp = up;
643c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
644c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setLookAt(eye, at, up);
645c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
646c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
647c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
648c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
649c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This sets the number of cards in the distance that will be shown "rezzing in".
650c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * These alpha values will be faded in from the background to the foreground over
651c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * 'n' cards.  A floating point value is used to allow subtly changing the rezzing in
652c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * position.
653c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
654c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param n the number of cards to rez in.
655c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
656c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setRezInCardCount(float n) {
657c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mRezInCardCount = n;
658c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
659c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setRezInCardCount(n);
660c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
661c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
662c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
663c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
664c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * This sets the duration (in ms) that a card takes to fade in when loaded via a call
665c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * to {@link CarouselView#setTextureForItem(int, Bitmap)}. The timer starts the
666c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * moment {@link CarouselView#setTextureForItem(int, Bitmap)} is called and continues
667c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * until all of the cards have faded in.  Note: using large values will extend the
668c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * animation until all cards have faded in.
669c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     *
670c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param t
671c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
672c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    public void setFadeInDuration(long t) {
673c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        mFadeInDuration = t;
674c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        if (mRenderScript != null) {
675c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma            mRenderScript.setFadeInDuration(t);
676c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma        }
677c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
678c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
679c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
680c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Tells the carousel that a touch event has started at the designated location.
681c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param x The number of pixels from the left edge that the event occurred
682c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param y The number of pixels from the top edge that the event occurred
6831882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller     * @param t The time stamp of the event
684c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
6851882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller    public void onTouchStarted(float x, float y, long t) {
6861882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller        mRenderScript.doStart(x, y, t);
687c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
688c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
689c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
690c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Tells the carousel that a touch event has moved to the designated location.
691c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param x The number of pixels from the left edge that the event occurred
692c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param y The number of pixels from the top edge that the event occurred
6931882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller     * @param t The time stamp of the event
694c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
6951882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller    public void onTouchMoved(float x, float y, long t) {
6961882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller        mRenderScript.doMotion(x, y, t);
697c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
698c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma
699c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    /**
700594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     * Tells the carousel that the user has long-pressed.
701594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma     */
702594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    public void onLongPress() {
703594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        mRenderScript.doLongPress();
704594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    }
705594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
706594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    /**
707c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * Tells the carousel that a touch event has stopped at the designated location.
708c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param x The number of pixels from the left edge that the event occurred
709c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     * @param y The number of pixels from the top edge that the event occurred
7101882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller     * @param t The time stamp of the event
711c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma     */
7121882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller    public void onTouchStopped(float x, float y, long t) {
7131882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller        mRenderScript.doStop(x, y, t);
714c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma    }
715c7f405d16c2c7143de7fcda9c4f77f9758b5342aJim Shuma}
716