CarouselRS.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 android.content.res.Resources;
205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap;
215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.*;
225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.RenderScript.RSMessage;
235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.Sampler.Value;
245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.ProgramRaster.CullMode;
255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.Log;
265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport com.android.internal.R;
285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport static android.renderscript.Element.*;
305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport static android.renderscript.Sampler.Value.LINEAR;
315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport static android.renderscript.Sampler.Value.WRAP;
325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport static android.renderscript.Sampler.Value.CLAMP;
335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
347cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller/**
357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This is a support class for Carousel renderscript.  It handles most of the low-level interactions
367cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * with Renderscript as well as dispatching events.
377cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller *
387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */
395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpublic class CarouselRS  {
405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int DEFAULT_VISIBLE_SLOTS = 1;
415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int DEFAULT_CARD_COUNT = 1;
425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    // Client messages *** THIS LIST MUST MATCH THOSE IN carousel.rs ***
445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_CARD_SELECTED = 100;
455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_REQUEST_TEXTURE = 200;
465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_INVALIDATE_TEXTURE = 210;
475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_REQUEST_GEOMETRY = 300;
485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_INVALIDATE_GEOMETRY = 310;
495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_ANIMATION_STARTED = 400;
505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_ANIMATION_FINISHED = 500;
517cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public static final int CMD_REQUEST_DETAIL_TEXTURE = 600;
527cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public static final int CMD_INVALIDATE_DETAIL_TEXTURE = 610;
537cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public static final int CMD_REPORT_FIRST_CARD_POSITION = 700;
547cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public static final int CMD_PING = 1000; // for debugging
555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final String TAG = "CarouselRS";
575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int DEFAULT_SLOT_COUNT = 10;
585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final boolean MIPMAP = false;
597cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    private static final boolean DBG = false;
605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private RenderScriptGL mRS;
625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Resources mRes;
631126aa8ba186b42baf5b14c66d44b59f43888b70Stephen Hines    private ScriptC_carousel mScript;
645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ScriptField_Card mCards;
655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Sampler mSampler;
665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ProgramStore mProgramStore;
675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ProgramFragment mFragmentProgram;
685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ProgramVertex mVertexProgram;
695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ProgramRaster mRasterProgram;
705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private CarouselCallback mCallback;
715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private float[] mEyePoint = new float[3];
725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private float[] mAtPoint = new float[3];
735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private float[] mUp = new float[3];
745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static interface CarouselCallback {
765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when a card is selected
785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onCardSelected(int n);
815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when texture is needed for card n.  This happens when the given card becomes
845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * visible.
855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onRequestTexture(int n);
885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when a texture is no longer needed for card n.  This happens when the card
915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * goes out of view.
925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onInvalidateTexture(int n);
955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
977cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * Called when detail texture is needed for card n.  This happens when the given card
987cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * becomes visible.
997cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * @param n the id of the card
1007cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         */
1017cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        void onRequestDetailTexture(int n);
1027cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1037cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        /**
1047cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * Called when a detail texture is no longer needed for card n.  This happens when the card
1057cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * goes out of view.
1067cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * @param n the id of the card
1077cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         */
1087cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        void onInvalidateDetailTexture(int n);
1097cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1107cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        /**
1115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when geometry is needed for card n.
1125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card.
1135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onRequestGeometry(int n);
1155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1179afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller         * Called when geometry is no longer needed for card n. This happens when the card goes
1185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * out of view.
1195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
1205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onInvalidateGeometry(int n);
1225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when card animation (e.g. a fling) has started.
1255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onAnimationStarted();
1275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when card animation has stopped.
1305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onAnimationFinished();
132198a060d650bc849ef0f25b597888fac9546803bJack Palevich
133198a060d650bc849ef0f25b597888fac9546803bJack Palevich        /**
134198a060d650bc849ef0f25b597888fac9546803bJack Palevich         * Called when the current position has been requested.
135198a060d650bc849ef0f25b597888fac9546803bJack Palevich         */
136198a060d650bc849ef0f25b597888fac9546803bJack Palevich        void onReportFirstCardPosition(int n);
1375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    };
1385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private RSMessage mRsMessage = new RSMessage() {
1405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public void run() {
1415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (mCallback == null) return;
1425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            switch (mID) {
1435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_CARD_SELECTED:
1445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onCardSelected(mData[0]);
1455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_REQUEST_TEXTURE:
1485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onRequestTexture(mData[0]);
1495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_INVALIDATE_TEXTURE:
152c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    setTexture(mData[0], null);
1535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onInvalidateTexture(mData[0]);
1545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1567cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                case CMD_REQUEST_DETAIL_TEXTURE:
1577cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    mCallback.onRequestDetailTexture(mData[0]);
1587cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    break;
1597cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1607cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                case CMD_INVALIDATE_DETAIL_TEXTURE:
161c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    setDetailTexture(mData[0], 0, 0, null);
1627cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    mCallback.onInvalidateDetailTexture(mData[0]);
1637cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    break;
1647cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_REQUEST_GEOMETRY:
1665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onRequestGeometry(mData[0]);
1675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_INVALIDATE_GEOMETRY:
170c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    setGeometry(mData[0], null);
1715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onInvalidateGeometry(mData[0]);
1725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_ANIMATION_STARTED:
1755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onAnimationStarted();
1765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_ANIMATION_FINISHED:
1795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onAnimationFinished();
1805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
182198a060d650bc849ef0f25b597888fac9546803bJack Palevich                case CMD_REPORT_FIRST_CARD_POSITION:
183198a060d650bc849ef0f25b597888fac9546803bJack Palevich                    mCallback.onReportFirstCardPosition(mData[0]);
184198a060d650bc849ef0f25b597888fac9546803bJack Palevich                    break;
185198a060d650bc849ef0f25b597888fac9546803bJack Palevich
1865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_PING:
1877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    if (DBG) Log.v(TAG, "PING...");
1885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                default:
1915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    Log.e(TAG, "Unknown RSMessage: " + mID);
1925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
1935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
1945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    };
1955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void init(RenderScriptGL rs, Resources res, int resId) {
1975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS = rs;
1985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRes = res;
1995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        // create the script object
2011126aa8ba186b42baf5b14c66d44b59f43888b70Stephen Hines        mScript = new ScriptC_carousel(mRS, mRes, resId, true);
2025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS.mMessageCallback = mRsMessage;
2035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initProgramStore();
2055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initFragmentProgram();
2065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initRasterProgram();
2075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initVertexProgram();
2085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setSlotCount(DEFAULT_SLOT_COUNT);
2105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setVisibleSlots(DEFAULT_VISIBLE_SLOTS);
2115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        createCards(DEFAULT_CARD_COUNT);
2125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setStartAngle(0.0f);
2145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setRadius(1.0f);
2155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        // update the camera
2175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        boolean pcam = true;
2185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (pcam) {
2195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            float eye[] = { 20.6829f, 2.77081f, 16.7314f };
2205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            float at[] = { 14.7255f, -3.40001f, -1.30184f };
2215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            float up[] = { 0.0f, 1.0f, 0.0f };
2225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            setLookAt(eye, at, up);
2235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            setRadius(20.0f);
2245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            // Fov: 25
2255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        } else {
2265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mScript.invoke_lookAt(2.5f, 2.0f, 2.5f, 0.0f, -0.75f, 0.0f,  0.0f, 1.0f, 0.0f);
2275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mScript.set_cardRotation(0.0f);
2285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            setRadius(1.5f);
2295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        resumeRendering();
2325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLookAt(float[] eye, float[] at, float[] up) {
2355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        for (int i = 0; i < 3; i++) {
2365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mEyePoint[i] = eye[i];
2375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mAtPoint[i] = at[i];
2385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mUp[i] = up[i];
2395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_lookAt(eye[0], eye[1], eye[2], at[0], at[1], at[2], up[0], up[1], up[2]);
2415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setRadius(float radius) {
2445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_radius(radius);
2455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
247c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setCardRotation(float cardRotation) {
248c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_cardRotation(cardRotation);
249c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
250c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
251c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setSwaySensitivity(float swaySensitivity) {
252c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_swaySensitivity(swaySensitivity);
253c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
254c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
255c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setFrictionCoefficient(float frictionCoeff) {
256c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_frictionCoeff(frictionCoeff);
257c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
258c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
259c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setDragFactor(float dragFactor) {
260c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_dragFactor(dragFactor);
261c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
262c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
2635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initVertexProgram() {
2645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
2655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mVertexProgram = pvb.create();
2665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramVertex.MatrixAllocation pva = new ProgramVertex.MatrixAllocation(mRS);
2675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mVertexProgram.bindAllocation(pva);
2685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        pva.setupProjectionNormalized(1, 1);
2695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_vertexProgram(mVertexProgram);
2705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initRasterProgram() {
2735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramRaster.Builder programRasterBuilder = new ProgramRaster.Builder(mRS);
2745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRasterProgram = programRasterBuilder.create();
2755ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        //mRasterProgram.setCullMode(CullMode.NONE);
2765ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_rasterProgram(mRasterProgram);
2775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initFragmentProgram() {
2805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        Sampler.Builder sampleBuilder = new Sampler.Builder(mRS);
2813e919976d4eb87384c1be0ab82caf985f786aa47Jim Miller        sampleBuilder.setMin(Value.LINEAR);
2825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        sampleBuilder.setMag(LINEAR);
2835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        sampleBuilder.setWrapS(CLAMP);
2845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        sampleBuilder.setWrapT(CLAMP);
2855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mSampler = sampleBuilder.create();
2865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramFragment.Builder fragmentBuilder = new ProgramFragment.Builder(mRS);
2875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        fragmentBuilder.setTexture(ProgramFragment.Builder.EnvMode.DECAL,
2885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                           ProgramFragment.Builder.Format.RGBA, 0);
2895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mFragmentProgram = fragmentBuilder.create();
2905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mFragmentProgram.bindSampler(mSampler, 0);
2915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_fragmentProgram(mFragmentProgram);
2925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initProgramStore() {
2955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramStore.Builder programStoreBuilder = new ProgramStore.Builder(mRS, null, null);
2965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        programStoreBuilder.setDepthFunc(ProgramStore.DepthFunc.LESS);
2979afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        programStoreBuilder.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
2985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
299a3cb716626b477c98ba912698c765eab20f27286Jim Miller        programStoreBuilder.setDitherEnable(true);
3005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        programStoreBuilder.setDepthMask(true);
3015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mProgramStore = programStoreBuilder.create();
3025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_programStore(mProgramStore);
3035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void createCards(int count)
3065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3073df59346f395434454d310b070fff195089fbaf1Jim Miller        // Because RenderScript can't have allocations with 0 dimensions, we always create
3083df59346f395434454d310b070fff195089fbaf1Jim Miller        // an allocation of at least one card. This relies on invoke_createCards() to keep
3093df59346f395434454d310b070fff195089fbaf1Jim Miller        // track of when the allocation is not valid.
3103df59346f395434454d310b070fff195089fbaf1Jim Miller        mCards = new ScriptField_Card(mRS, count > 0 ? count : 1);
3115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.bind_cards(mCards);
3125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_createCards(count);
3135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setVisibleSlots(int count)
3165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_visibleSlotCount(count);
3185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3207c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setVisibleDetails(int count) {
3217c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mScript.set_visibleDetailCount(count);
3227c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
3237c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
3247c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setDrawDetailBelowCard(boolean below) {
3257c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mScript.set_drawDetailBelowCard(below);
3267c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
3277c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
3287c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setDrawRuler(boolean drawRuler) {
3297c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mScript.set_drawRuler(drawRuler);
3307c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
3317c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
3325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setDefaultBitmap(Bitmap bitmap)
3335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_defaultTexture(allocationFromBitmap(bitmap, MIPMAP));
3355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLoadingBitmap(Bitmap bitmap)
3385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_loadingTexture(allocationFromBitmap(bitmap, MIPMAP));
3405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setDefaultGeometry(Mesh mesh)
3435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_defaultGeometry(mesh);
3455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLoadingGeometry(Mesh mesh)
3485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_loadingGeometry(mesh);
3505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setStartAngle(float theta)
3535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_startAngle(theta);
3555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setCallback(CarouselCallback callback)
3585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mCallback = callback;
3605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Allocation allocationFromBitmap(Bitmap bitmap, boolean mipmap)
3635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (bitmap == null) return null;
365e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        Allocation allocation = Allocation.createFromBitmap(mRS, bitmap,
366a3cb716626b477c98ba912698c765eab20f27286Jim Miller                elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), mipmap);
3675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        allocation.uploadToTexture(0);
3685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        return allocation;
3695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setTexture(int n, Bitmap bitmap)
3725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3733df59346f395434454d310b070fff195089fbaf1Jim Miller        if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
3743df59346f395434454d310b070fff195089fbaf1Jim Miller
375c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller        synchronized(this) {
376c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            ScriptField_Card.Item item = mCards.get(n);
377c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (item == null) {
378c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "setTexture(): no item at index " + n);
379c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item = new ScriptField_Card.Item();
3805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
381c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (bitmap != null) {
382c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "creating new bitmap");
383a3cb716626b477c98ba912698c765eab20f27286Jim Miller                item.texture = Allocation.createFromBitmap(mRS, bitmap,
384a3cb716626b477c98ba912698c765eab20f27286Jim Miller                        elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), MIPMAP);
385c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "uploadToTexture(" + n + ")");
386c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item.texture.uploadToTexture(0);
387c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "done...");
388c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            } else {
389c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (item.texture != null) {
390c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    if (DBG) Log.v(TAG, "unloading texture " + n);
391c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // Don't wait for GC to free native memory.
392c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // Only works if textures are not shared.
393c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.texture.destroy();
394c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.texture = null;
395c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                }
396c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            }
397c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mCards.set(item, n, false); // This is primarily used for reference counting.
398c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mScript.invoke_setTexture(n, item.texture);
3995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
4005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4027cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    void setDetailTexture(int n, float offx, float offy, Bitmap bitmap)
4037cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    {
4043df59346f395434454d310b070fff195089fbaf1Jim Miller        if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
4053df59346f395434454d310b070fff195089fbaf1Jim Miller
406c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller        synchronized(this) {
407c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            ScriptField_Card.Item item = mCards.get(n);
408c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (item == null) {
409c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "setDetailTexture(): no item at index " + n);
410c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item = new ScriptField_Card.Item();
411c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            }
412c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            float width = 0.0f;
413c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            float height = 0.0f;
414c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (bitmap != null) {
415e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich                item.detailTexture = Allocation.createFromBitmap(mRS, bitmap,
416e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich                        elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), MIPMAP);
417c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item.detailTexture.uploadToTexture(0);
418c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                width = bitmap.getWidth();
419c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                height = bitmap.getHeight();
420c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            } else {
421c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (item.detailTexture != null) {
422c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    if (DBG) Log.v(TAG, "unloading texture " + n);
423c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // Don't wait for GC to free native memory.
424c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // Only works if textures are not shared.
425c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.detailTexture.destroy();
426c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.detailTexture = null;
427c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                }
4287cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            }
429c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mCards.set(item, n, false); // This is primarily used for reference counting.
430c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mScript.invoke_setDetailTexture(n, offx, offy, item.detailTexture);
4317cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        }
4327cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    }
4337cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
4345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setGeometry(int n, Mesh geometry)
4355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4363df59346f395434454d310b070fff195089fbaf1Jim Miller        if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
4373df59346f395434454d310b070fff195089fbaf1Jim Miller
438c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller        synchronized(this) {
439c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            final boolean mipmap = false;
440c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            ScriptField_Card.Item item = mCards.get(n);
441c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (item == null) {
442c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "setGeometry(): no item at index " + n);
443c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item = new ScriptField_Card.Item();
444c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            }
445c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (geometry != null) {
446c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item.geometry = geometry;
447c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            } else {
448c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "unloading geometry " + n);
449c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (item.geometry != null) {
450c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // item.geometry.destroy();
451c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.geometry = null;
452c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                }
4535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
454c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mCards.set(item, n, false);
455c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mScript.invoke_setGeometry(n, item.geometry);
4565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
4575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
459b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller    public void setBackgroundColor(Float4 color) {
460b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller        mScript.set_backgroundColor(color);
461b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller    }
462b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller
4639afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller    public void setBackgroundTexture(Bitmap bitmap) {
4649afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        Allocation texture = null;
4659afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        if (bitmap != null) {
466e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            texture = Allocation.createFromBitmap(mRS, bitmap,
467e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich                    elementForBitmap(bitmap, Bitmap.Config.RGB_565), MIPMAP);
4689afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller            texture.uploadToTexture(0);
4699afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        }
4709afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        mScript.set_backgroundTexture(texture);
4719afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller    }
4729afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller
4737cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public void setDetailLineTexture(Bitmap bitmap) {
4747cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        Allocation texture = null;
4757cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        if (bitmap != null) {
476e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            texture = Allocation.createFromBitmap(mRS, bitmap,
477e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich                    elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), MIPMAP);
4787cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            texture.uploadToTexture(0);
4797cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        }
4807cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        mScript.set_detailLineTexture(texture);
4817cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    }
4827cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
4835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void pauseRendering() {
4845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        // Used to update multiple states at once w/o redrawing for each.
4855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS.contextBindRootScript(null);
4865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void resumeRendering() {
4895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS.contextBindRootScript(mScript);
4905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void doMotion(float x, float y) {
4935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_doMotion(x,y);
4945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void doSelection(float x, float y) {
4975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_doSelection(x, y);
4985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
5005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void doStart(float x, float y) {
5015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_doStart(x, y);
5025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
5035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
5045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void doStop(float x, float y) {
5055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_doStop(x, y);
5065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
5075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
5085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setSlotCount(int n) {
5095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_slotCount(n);
5105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
511198a060d650bc849ef0f25b597888fac9546803bJack Palevich
512198a060d650bc849ef0f25b597888fac9546803bJack Palevich    public void requestFirstCardPosition() {
513198a060d650bc849ef0f25b597888fac9546803bJack Palevich        mScript.invoke_requestFirstCardPosition();
514198a060d650bc849ef0f25b597888fac9546803bJack Palevich    }
515e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich
516e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich    private Element elementForBitmap(Bitmap bitmap, Bitmap.Config defaultConfig) {
517e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        Bitmap.Config config = bitmap.getConfig();
518e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        if (config == null) {
519e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            config = defaultConfig;
520e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        }
521e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        if (config == Bitmap.Config.ALPHA_8) {
522e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return A_8(mRS);
523e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else if (config == Bitmap.Config.RGB_565) {
524e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return RGB_565(mRS);
525e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else if (config == Bitmap.Config.ARGB_4444) {
526e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return RGBA_4444(mRS);
527e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else if (config == Bitmap.Config.ARGB_8888) {
528e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return RGBA_8888(mRS);
529e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else {
530e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            throw new IllegalArgumentException("Unknown configuration");
531e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        }
532e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich    }
5335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller}
534