rsFileA3D.cpp revision e514b45de8561fbc6ef6770845102ca10b0a69d7
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "rsContext.h"
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String8.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "rsFileA3D.h"
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "rsMesh.h"
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android::renderscript;
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectFileA3D::FileA3D()
32c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian{
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRsc = NULL;
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectFileA3D::~FileA3D()
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
385728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan}
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
405728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajanbool FileA3D::load(Context *rsc, FILE *f)
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    char magicString[12];
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t len;
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("file open 1");
465728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan    len = fread(magicString, 1, 12, f);
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((len != 12) ||
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcmp(magicString, "Android3D_ff", 12)) {
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
51e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("file open 2");
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    len = fread(&mMajorVersion, 1, sizeof(mMajorVersion), f);
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (len != sizeof(mMajorVersion)) {
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("file open 3");
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    len = fread(&mMinorVersion, 1, sizeof(mMinorVersion), f);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (len != sizeof(mMinorVersion)) {
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
635728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("file open 4");
650db1a8931bb24b4f240c19210e70844af8c1e9ffIliyan Malchev    uint32_t flags;
660db1a8931bb24b4f240c19210e70844af8c1e9ffIliyan Malchev    len = fread(&flags, 1, sizeof(flags), f);
670db1a8931bb24b4f240c19210e70844af8c1e9ffIliyan Malchev    if (len != sizeof(flags)) {
680db1a8931bb24b4f240c19210e70844af8c1e9ffIliyan Malchev        return false;
690db1a8931bb24b4f240c19210e70844af8c1e9ffIliyan Malchev    }
70e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block    mUse64BitOffsets = (flags & 1) != 0;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("file open 64bit = %i", mUse64BitOffsets);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mUse64BitOffsets) {
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        len = fread(&mDataSize, 1, sizeof(mDataSize), f);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (len != sizeof(mDataSize)) {
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return false;
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
80d4851d74ac9c737acda85f1fdbc028c68f481a36Benny Wong        uint32_t tmp;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        len = fread(&tmp, 1, sizeof(tmp), f);
825728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan        if (len != sizeof(tmp)) {
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return false;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mDataSize = tmp;
86d4851d74ac9c737acda85f1fdbc028c68f481a36Benny Wong    }
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("file open size = %lli", mDataSize);
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // We should know enough to read the file in at this point.
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    fseek(f, SEEK_SET, 0);
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mAlloc= malloc(mDataSize);
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!mAlloc) {
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mData = (uint8_t *)mAlloc;
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    len = fread(mAlloc, 1, mDataSize, f);
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (len != mDataSize) {
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102d4851d74ac9c737acda85f1fdbc028c68f481a36Benny Wong    LOGE("file start processing");
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return process(rsc);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106a5a13a3ecf72554120ce5e856d514b72b70f5cf1Elliott Hughesbool FileA3D::processIndex(Context *rsc, A3DIndexEntry *ie)
107a5a13a3ecf72554120ce5e856d514b72b70f5cf1Elliott Hughes{
108a5a13a3ecf72554120ce5e856d514b72b70f5cf1Elliott Hughes    bool ret = false;
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    IO io(mData + ie->mOffset, mUse64BitOffsets);
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("process index, type %i", ie->mType);
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(ie->mType) {
114d4851d74ac9c737acda85f1fdbc028c68f481a36Benny Wong    case CHUNK_ELEMENT:
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        processChunk_Element(rsc, &io, ie);
116e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block        break;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case CHUNK_ELEMENT_SOURCE:
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        processChunk_ElementSource(rsc, &io, ie);
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case CHUNK_VERTICIES:
1219d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block        processChunk_Verticies(rsc, &io, ie);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case CHUNK_MESH:
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        processChunk_Mesh(rsc, &io, ie);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    case CHUNK_PRIMITIVE:
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        processChunk_Primitive(rsc, &io, ie);
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    default:
1305728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan        LOGE("FileA3D Unknown chunk type");
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        break;
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (ie->mRsObj != NULL);
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool FileA3D::process(Context *rsc)
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("process");
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    IO io(mData + 12, mUse64BitOffsets);
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bool ret = true;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Build the index first
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("process 1");
1449d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block    io.loadU32(); // major version, already loaded
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    io.loadU32(); // minor version, already loaded
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("process 2");
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    io.loadU32();  // flags
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    io.loadOffset(); // filesize, already loaded.
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("process 4");
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint64_t mIndexOffset = io.loadOffset();
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint64_t mStringOffset = io.loadOffset();
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("process mIndexOffset= 0x%016llx", mIndexOffset);
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("process mStringOffset= 0x%016llx", mStringOffset);
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    IO index(mData + mIndexOffset, mUse64BitOffsets);
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    IO stringTable(mData + mStringOffset, mUse64BitOffsets);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t stringEntryCount = stringTable.loadU32();
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGE("stringEntryCount %i", stringEntryCount);
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mStrings.setCapacity(stringEntryCount);
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mStringIndexValues.setCapacity(stringEntryCount);
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (stringEntryCount) {
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t stringType = stringTable.loadU32();
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LOGE("stringType %i", stringType);
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        rsAssert(stringType==0);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (uint32_t ct = 0; ct < stringEntryCount; ct++) {
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint64_t offset = stringTable.loadOffset();
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGE("string offset 0x%016llx", offset);
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            IO tmp(mData + offset, mUse64BitOffsets);
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String8 s;
1735728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan            tmp.loadString(&s);
1745728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan            LOGE("string %s", s.string());
1755728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan            mStrings.push(s);
1765728a92e29c1c9729017a82c5d0bc18fc1069923Anu Sundararajan        }
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179    LOGE("strings done");
180    uint32_t indexEntryCount = index.loadU32();
181    LOGE("index count %i", indexEntryCount);
182    mIndex.setCapacity(indexEntryCount);
183    for (uint32_t ct = 0; ct < indexEntryCount; ct++) {
184        A3DIndexEntry e;
185        uint32_t stringIndex = index.loadU32();
186        LOGE("index %i", ct);
187        LOGE("  string index %i", stringIndex);
188        e.mType = (A3DChunkType)index.loadU32();
189        LOGE("  type %i", e.mType);
190        e.mOffset = index.loadOffset();
191        LOGE("  offset 0x%016llx", e.mOffset);
192
193        if (stringIndex && (stringIndex < mStrings.size())) {
194            e.mID = mStrings[stringIndex];
195            mStringIndexValues.editItemAt(stringIndex) = ct;
196            LOGE("  id %s", e.mID.string());
197        }
198
199        mIndex.push(e);
200    }
201    LOGE("index done");
202
203    // At this point the index should be fully populated.
204    // We can now walk though it and load all the objects.
205    for (uint32_t ct = 0; ct < indexEntryCount; ct++) {
206        LOGE("processing index entry %i", ct);
207        processIndex(rsc, &mIndex.editItemAt(ct));
208    }
209
210    return ret;
211}
212
213
214FileA3D::IO::IO(const uint8_t *buf, bool use64)
215{
216    mData = buf;
217    mPos = 0;
218    mUse64 = use64;
219}
220
221uint64_t FileA3D::IO::loadOffset()
222{
223    uint64_t tmp;
224    if (mUse64) {
225        mPos = (mPos + 7) & (~7);
226        tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0];
227        mPos += sizeof(uint64_t);
228        return tmp;
229    }
230    return loadU32();
231}
232
233void FileA3D::IO::loadString(String8 *s)
234{
235    LOGE("loadString");
236    uint32_t len = loadU32();
237    LOGE("loadString len %i", len);
238    s->setTo((const char *)&mData[mPos], len);
239    mPos += len;
240}
241
242
243void FileA3D::processChunk_Mesh(Context *rsc, IO *io, A3DIndexEntry *ie)
244{
245    Mesh * m = new Mesh(rsc);
246
247    m->mPrimitivesCount = io->loadU32();
248    m->mPrimitives = new Mesh::Primitive_t *[m->mPrimitivesCount];
249
250    for (uint32_t ct = 0; ct < m->mPrimitivesCount; ct++) {
251        uint32_t index = io->loadU32();
252
253        m->mPrimitives[ct] = (Mesh::Primitive_t *)mIndex[index].mRsObj;
254    }
255    ie->mRsObj = m;
256}
257
258void FileA3D::processChunk_Primitive(Context *rsc, IO *io, A3DIndexEntry *ie)
259{
260    Mesh::Primitive_t * p = new Mesh::Primitive_t;
261
262    p->mIndexCount = io->loadU32();
263    uint32_t vertIdx = io->loadU32();
264    p->mRestartCounts = io->loadU16();
265    uint32_t bits = io->loadU8();
266    p->mType = (RsPrimitive)io->loadU8();
267
268    LOGE("processChunk_Primitive count %i, bits %i", p->mIndexCount, bits);
269
270    p->mVerticies = (Mesh::Verticies_t *)mIndex[vertIdx].mRsObj;
271
272    p->mIndicies = new uint16_t[p->mIndexCount];
273    for (uint32_t ct = 0; ct < p->mIndexCount; ct++) {
274        switch(bits) {
275        case 8:
276            p->mIndicies[ct] = io->loadU8();
277            break;
278        case 16:
279            p->mIndicies[ct] = io->loadU16();
280            break;
281        case 32:
282            p->mIndicies[ct] = io->loadU32();
283            break;
284        }
285        LOGE("  idx %i", p->mIndicies[ct]);
286    }
287
288    if (p->mRestartCounts) {
289        p->mRestarts = new uint16_t[p->mRestartCounts];
290        for (uint32_t ct = 0; ct < p->mRestartCounts; ct++) {
291            switch(bits) {
292            case 8:
293                p->mRestarts[ct] = io->loadU8();
294                break;
295            case 16:
296                p->mRestarts[ct] = io->loadU16();
297                break;
298            case 32:
299                p->mRestarts[ct] = io->loadU32();
300                break;
301            }
302            LOGE("  idx %i", p->mRestarts[ct]);
303        }
304    } else {
305        p->mRestarts = NULL;
306    }
307
308    ie->mRsObj = p;
309}
310
311void FileA3D::processChunk_Verticies(Context *rsc, IO *io, A3DIndexEntry *ie)
312{
313    Mesh::Verticies_t *cv = new Mesh::Verticies_t;
314    cv->mAllocationCount = io->loadU32();
315    cv->mAllocations = new Allocation *[cv->mAllocationCount];
316    LOGE("processChunk_Verticies count %i", cv->mAllocationCount);
317    for (uint32_t ct = 0; ct < cv->mAllocationCount; ct++) {
318        uint32_t i = io->loadU32();
319        cv->mAllocations[ct] = (Allocation *)mIndex[i].mRsObj;
320        LOGE("  idx %i", i);
321    }
322    ie->mRsObj = cv;
323}
324
325void FileA3D::processChunk_Element(Context *rsc, IO *io, A3DIndexEntry *ie)
326{
327    rsi_ElementBegin(rsc);
328
329    uint32_t count = io->loadU32();
330    LOGE("processChunk_Element count %i", count);
331    while (count--) {
332        RsDataKind dk = (RsDataKind)io->loadU8();
333        RsDataType dt = (RsDataType)io->loadU8();
334        uint32_t bits = io->loadU8();
335        bool isNorm = io->loadU8() != 0;
336        LOGE("  %i %i %i %i", dk, dt, bits, isNorm);
337        rsi_ElementAdd(rsc, dk, dt, isNorm, bits, 0);
338    }
339    LOGE("processChunk_Element create");
340    ie->mRsObj = rsi_ElementCreate(rsc);
341}
342
343void FileA3D::processChunk_ElementSource(Context *rsc, IO *io, A3DIndexEntry *ie)
344{
345    uint32_t index = io->loadU32();
346    uint32_t count = io->loadU32();
347
348    LOGE("processChunk_ElementSource count %i, index %i", count, index);
349
350    RsElement e = (RsElement)mIndex[index].mRsObj;
351
352    RsAllocation a = rsi_AllocationCreateSized(rsc, e, count);
353    Allocation * alloc = static_cast<Allocation *>(a);
354
355    float * data = (float *)alloc->getPtr();
356    while(count--) {
357        *data = io->loadF();
358        LOGE("  %f", *data);
359        data++;
360    }
361    ie->mRsObj = alloc;
362}
363
364namespace android {
365namespace renderscript {
366
367
368RsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len)
369{
370    FileA3D *fa3d = new FileA3D;
371
372    FILE *f = fopen("/sdcard/test.a3d", "rb");
373    if (f) {
374        fa3d->load(rsc, f);
375        fclose(f);
376        return fa3d;
377    }
378    delete fa3d;
379    return NULL;
380}
381
382
383}
384}
385