1aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk/*
265c80f824711f084c4ece9204f543a7809534294Jason Sams * Copyright (C) 2008-2012 The Android Open Source Project
3aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
4aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * you may not use this file except in compliance with the License.
6aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * You may obtain a copy of the License at
7aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
8aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
10aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * See the License for the specific language governing permissions and
14aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk * limitations under the License.
15aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk */
16aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
17aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukpackage android.renderscript;
18aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
19e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport java.io.File;
20aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport java.io.InputStream;
21aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
22aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukimport android.content.res.AssetManager;
23e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport android.content.res.Resources;
24aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
259c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
26a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide
2765c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16
28c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * FileA3D allows users to load RenderScript objects from files
29f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * or resources stored on disk. It could be used to load items
30c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * such as 3D geometry data converted to a RenderScript format from
31f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * content creation tools. Currently only meshes are supported
32f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * in FileA3D.
33f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk *
34f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * When successfully loaded, FileA3D will contain a list of
35f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * index entries for all the objects stored inside it.
36aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk *
37aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk **/
38aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchoukpublic class FileA3D extends BaseObj {
39aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
4165c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
42f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Specifies what renderscript object type is contained within
43f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * the FileA3D IndexEntry
44f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    **/
45e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public enum EntryType {
46e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
479c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
4865c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
49ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Unknown or or invalid object, nothing will be loaded
50ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        **/
51e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        UNKNOWN (0),
529c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
5365c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
54c11e25c4e653124def1fb18e203b894f42106cbeTim Murray        * RenderScript Mesh object
55ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        **/
56e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        MESH (1);
57e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
58e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        int mID;
59e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        EntryType(int id) {
60e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            mID = id;
61e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
62e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
63e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        static EntryType toEntryType(int intID) {
64e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            return EntryType.values()[intID];
65e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
66e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
67e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
6965c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
70c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    * IndexEntry contains information about one of the RenderScript
71f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * objects inside the file's index. It could be used to query the
7211518acc8c416023d8c2192b441a1767205676d9Robert Ly    * object's type and also name and load the object itself if
73f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * necessary.
74f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
75dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    public static class IndexEntry {
76aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        RenderScript mRS;
77aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        int mIndex;
78460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long mID;
79aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        String mName;
80e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        EntryType mEntryType;
81aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        BaseObj mLoadedObj;
82aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
839c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
8465c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
85ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Returns the name of a renderscript object the index entry
86ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * describes
87ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        *
88f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @return name of a renderscript object the index entry
89ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * describes
90ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        *
91f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
92aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        public String getName() {
93aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return mName;
94aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
95aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
969c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
9765c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
98ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Returns the type of a renderscript object the index entry
99ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * describes
100f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @return type of a renderscript object the index entry
101f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        *         describes
102f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
103e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        public EntryType getEntryType() {
104e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            return mEntryType;
105e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
106e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
1079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
10865c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
109ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Used to load the object described by the index entry
110ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * @return base renderscript object described by the entry
111f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
112aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        public BaseObj getObject() {
113dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mRS.validate();
114dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            BaseObj obj = internalCreate(mRS, this);
115dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            return obj;
116dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
117dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
1189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
11965c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
120ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * Used to load the mesh described by the index entry, object
121ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        * described by the index entry must be a renderscript mesh
122ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk        *
123f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @return renderscript mesh object described by the entry
124f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        */
125e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        public Mesh getMesh() {
126e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            return (Mesh)getObject();
127e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        }
128e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
129dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        static synchronized BaseObj internalCreate(RenderScript rs, IndexEntry entry) {
130dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            if(entry.mLoadedObj != null) {
131dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                return entry.mLoadedObj;
132aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
133aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
134e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            // to be purged on cleanup
135e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            if(entry.mEntryType == EntryType.UNKNOWN) {
136aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk                return null;
137aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
138aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1390e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat            long objectID = rs.nFileA3DGetEntryByIndex(entry.mID, entry.mIndex);
140aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            if(objectID == 0) {
141aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk                return null;
142aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
143aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
144e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            switch (entry.mEntryType) {
145aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            case MESH:
146dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk                entry.mLoadedObj = new Mesh(objectID, rs);
147aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk                break;
148bca8e6d35fc16506ce1070000ce3804bbeaee399Jason Sams
149bca8e6d35fc16506ce1070000ce3804bbeaee399Jason Sams            default:
150bca8e6d35fc16506ce1070000ce3804bbeaee399Jason Sams                throw new RSRuntimeException("Unrecognized object type in file.");
151aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
152aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
153dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            entry.mLoadedObj.updateFromNative();
154dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            return entry.mLoadedObj;
155aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
156aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
157460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        IndexEntry(RenderScript rs, int index, long id, String name, EntryType type) {
158aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mRS = rs;
159aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mIndex = index;
160aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mID = id;
161aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mName = name;
162e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            mEntryType = type;
163aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mLoadedObj = null;
164aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
165aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
166aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
167aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    IndexEntry[] mFileEntries;
168581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    InputStream mInputStream;
169aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
170460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    FileA3D(long id, RenderScript rs, InputStream stream) {
1710de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
172581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk        mInputStream = stream;
1736484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni        guard.open("destroy");
174aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
175aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
176aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    private void initEntries() {
177e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int numFileEntries = mRS.nFileA3DGetNumIndexEntries(getID(mRS));
178aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        if(numFileEntries <= 0) {
179aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return;
180aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
181aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
182aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        mFileEntries = new IndexEntry[numFileEntries];
183aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        int[] ids = new int[numFileEntries];
184aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        String[] names = new String[numFileEntries];
185aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
186e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nFileA3DGetIndexEntries(getID(mRS), numFileEntries, ids, names);
187aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
188aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        for(int i = 0; i < numFileEntries; i ++) {
189e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mFileEntries[i] = new IndexEntry(mRS, i, getID(mRS), names[i], EntryType.toEntryType(ids[i]));
190aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
191aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
192aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1939c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
19465c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
195ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * Returns the number of objects stored inside the a3d file
196ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
197ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return the number of objects stored inside the a3d file
198f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
199e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public int getIndexEntryCount() {
200aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        if(mFileEntries == null) {
201aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return 0;
202aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
203aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        return mFileEntries.length;
204aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
205aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
2069c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
20765c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
208f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Returns an index entry from the list of all objects inside
209f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * FileA3D
210f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
211f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param index number of the entry from the list to return
212ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
213ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return entry in the a3d file described by the index
214f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
215aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    public IndexEntry getIndexEntry(int index) {
216e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        if(getIndexEntryCount() == 0 || index < 0 || index >= mFileEntries.length) {
217aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return null;
218aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
219aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        return mFileEntries[index];
220aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
221aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
2229c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
22365c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
224f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from an asset stored on disk
225f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
226f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
227f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param mgr asset manager used to load asset
228f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
229f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
230ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
231f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
232b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromAsset(RenderScript rs, AssetManager mgr, String path) {
233b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        rs.validate();
234460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = rs.nFileA3DCreateFromAsset(mgr, path);
235b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
236b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
237b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from asset " + path);
238b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
239b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, null);
240b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
241b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
242e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
243e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2449c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
24565c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
246f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from a file stored on disk
247f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
248f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
249f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
250f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
251ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
252f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
253b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromFile(RenderScript rs, String path) {
254460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = rs.nFileA3DCreateFromFile(path);
255b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
256b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
257b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from " + path);
258b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
259b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, null);
260b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
261b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
262e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
263e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
26565c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
266f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from a file stored on disk
267f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
268f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
269f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
270f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
271ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
272f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
273b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromFile(RenderScript rs, File path) {
274e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        return createFromFile(rs, path.getAbsolutePath());
275e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
276e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2779c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
27865c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
279f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from an application resource
280f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
281f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
282f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param res resource manager used for loading
283f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param id resource to create FileA3D from
284f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
285ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
286f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
287b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromResource(RenderScript rs, Resources res, int id) {
288aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
289aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        rs.validate();
290aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        InputStream is = null;
291aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        try {
292b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            is = res.openRawResource(id);
293b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } catch (Exception e) {
294b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to open resource " + id);
295b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
296aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
297460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = 0;
298b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if (is instanceof AssetManager.AssetInputStream) {
2990e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat            long asset = ((AssetManager.AssetInputStream) is).getNativeAsset();
300b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            fileId = rs.nFileA3DCreateFromAssetStream(asset);
301b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } else {
302b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unsupported asset stream");
303b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
304aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
305b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
306b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from resource " + id);
307aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
308b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, is);
309b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
310b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
311aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
312aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
313aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
314