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