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;
148aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            }
149aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
150dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            entry.mLoadedObj.updateFromNative();
151dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            return entry.mLoadedObj;
152aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
153aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
154460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        IndexEntry(RenderScript rs, int index, long id, String name, EntryType type) {
155aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mRS = rs;
156aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mIndex = index;
157aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mID = id;
158aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mName = name;
159e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk            mEntryType = type;
160aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            mLoadedObj = null;
161aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
162aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
163aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
164aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    IndexEntry[] mFileEntries;
165581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk    InputStream mInputStream;
166aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
167460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray    FileA3D(long id, RenderScript rs, InputStream stream) {
1680de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
169581cc64028e8b8f66cec8105bf530b16d5fb34ebAlex Sakhartchouk        mInputStream = stream;
170aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
171aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
172aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    private void initEntries() {
173e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        int numFileEntries = mRS.nFileA3DGetNumIndexEntries(getID(mRS));
174aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        if(numFileEntries <= 0) {
175aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return;
176aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
177aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
178aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        mFileEntries = new IndexEntry[numFileEntries];
179aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        int[] ids = new int[numFileEntries];
180aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        String[] names = new String[numFileEntries];
181aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
182e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nFileA3DGetIndexEntries(getID(mRS), numFileEntries, ids, names);
183aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
184aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        for(int i = 0; i < numFileEntries; i ++) {
185e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mFileEntries[i] = new IndexEntry(mRS, i, getID(mRS), names[i], EntryType.toEntryType(ids[i]));
186aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
187aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
188aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
1899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
19065c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
191ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * Returns the number of objects stored inside the a3d file
192ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
193ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return the number of objects stored inside the a3d file
194f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
195e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    public int getIndexEntryCount() {
196aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        if(mFileEntries == null) {
197aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return 0;
198aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
199aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        return mFileEntries.length;
200aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
201aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
2029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
20365c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
204f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Returns an index entry from the list of all objects inside
205f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * FileA3D
206f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
207f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param index number of the entry from the list to return
208ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    *
209ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return entry in the a3d file described by the index
210f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
211aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    public IndexEntry getIndexEntry(int index) {
212e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        if(getIndexEntryCount() == 0 || index < 0 || index >= mFileEntries.length) {
213aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk            return null;
214aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
215aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        return mFileEntries[index];
216aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
217aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
2189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
21965c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
220f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from an asset stored on disk
221f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
222f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
223f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param mgr asset manager used to load asset
224f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
225f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
226ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
227f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
228b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromAsset(RenderScript rs, AssetManager mgr, String path) {
229b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        rs.validate();
230460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = rs.nFileA3DCreateFromAsset(mgr, path);
231b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
232b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
233b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from asset " + path);
234b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
235b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, null);
236b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
237b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
238e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
239e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
24165c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
242f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from a file stored on disk
243f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
244f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
245f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
246f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
247ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
248f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
249b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromFile(RenderScript rs, String path) {
250460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = rs.nFileA3DCreateFromFile(path);
251b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
252b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
253b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from " + path);
254b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
255b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, null);
256b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
257b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
258e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
259e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2609c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
26165c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
262f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from a file stored on disk
263f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
264f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
265f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param path location of the file to load
266f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
267ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
268f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
269b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromFile(RenderScript rs, File path) {
270e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        return createFromFile(rs, path.getAbsolutePath());
271e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
272e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2739c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
27465c80f824711f084c4ece9204f543a7809534294Jason Sams    * @deprecated in API 16
275f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * Creates a FileA3D object from an application resource
276f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
277f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param rs Context to which the object will belong.
278f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param res resource manager used for loading
279f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    * @param id resource to create FileA3D from
280f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    *
281ec0d3353b16741c69681577eb43ccfea435eb4baAlex Sakhartchouk    * @return a3d file containing renderscript objects
282f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk    */
283b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public FileA3D createFromResource(RenderScript rs, Resources res, int id) {
284aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
285aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        rs.validate();
286aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        InputStream is = null;
287aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        try {
288b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            is = res.openRawResource(id);
289b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } catch (Exception e) {
290b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to open resource " + id);
291b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
292aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
293460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray        long fileId = 0;
294b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if (is instanceof AssetManager.AssetInputStream) {
2950e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat            long asset = ((AssetManager.AssetInputStream) is).getNativeAsset();
296b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            fileId = rs.nFileA3DCreateFromAssetStream(asset);
297b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } else {
298b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unsupported asset stream");
299b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
300aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
301b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fileId == 0) {
302b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create a3d file from resource " + id);
303aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk        }
304b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        FileA3D fa3d = new FileA3D(fileId, rs, is);
305b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        fa3d.initEntries();
306b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return fa3d;
307aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
308aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    }
309aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk}
310