rsFileA3D.cpp revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 19a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsContext.h" 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 23a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 24a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsFileA3D.h" 25a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 26a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsMesh.h" 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsAnimation.h" 28a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 29d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 30a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android; 31a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android::renderscript; 32a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 33afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::FileA3D(Context *rsc) : ObjectBase(rsc) { 34fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = NULL; 35fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = NULL; 36fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = NULL; 37fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = NULL; 38fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 39fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMajorVersion = 0; 40fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMinorVersion = 1; 41fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mDataSize = 0; 42a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 43a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 44afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::~FileA3D() { 45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mIndex.size(); i ++) { 46fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mIndex[i]; 47fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 48afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mWriteIndex.size(); i ++) { 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteIndex[i]; 50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream) { 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mReadStream) { 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 57afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAlloc) { 58fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mAlloc); 59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 60a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 61a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 62afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid FileA3D::parseHeader(IStream *headerStream) { 63b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMajorVersion = headerStream->loadU32(); 64b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMinorVersion = headerStream->loadU32(); 65b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t flags = headerStream->loadU32(); 66b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mUse64BitOffsets = (flags & 1) != 0; 67b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 68b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numIndexEntries = headerStream->loadU32(); 69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numIndexEntries; i ++) { 70b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk A3DIndexEntry *entry = new A3DIndexEntry(); 71b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream->loadString(&entry->mObjectName); 72383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGV("Header data, entry name = %s", entry->mObjectName.string()); 73b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mType = (RsA3DClassID)headerStream->loadU32(); 74afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 75b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadOffset(); 76b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadOffset(); 77afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 78b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadU32(); 79b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadU32(); 80b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 81b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = NULL; 82b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mIndex.push(entry); 83b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 84b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 85b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(const void *data, size_t length) { 87b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const uint8_t *localData = (const uint8_t *)data; 88b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 89b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t lengthRemaining = length; 90b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t magicStrLen = 12; 91b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if ((length < magicStrLen) || 92b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcmp(data, "Android3D_ff", magicStrLen)) { 93b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 94b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 95b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 96b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += magicStrLen; 97b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= magicStrLen; 98b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 99b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Next we get our header size 100b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint64_t headerSize = 0; 101afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(headerSize)) { 102b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 103b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 104b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 105b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&headerSize, localData, sizeof(headerSize)); 106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(headerSize); 107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(headerSize); 108b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 109afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < headerSize) { 110b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 111b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 112b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 113b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Now open the stream to parse the header 114dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk IStream headerStream(localData, false); 115b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 116b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 117b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += headerSize; 118b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= headerSize; 119b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 120afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(mDataSize)) { 121b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 122b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 123b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 124b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Read the size of the data 125b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&mDataSize, localData, sizeof(mDataSize)); 126b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(mDataSize); 127b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(mDataSize); 128b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 129afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < mDataSize) { 130b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 131b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 132b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 133b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // We should know enough to read the file in at this point. 134dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk mData = (uint8_t *)localData; 135b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 136b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 137b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return true; 138b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 139b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 140afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(FILE *f) { 141a5597fcd411badad50c1345b3eca26453da45bbbJason Sams char magicString[12]; 142a5597fcd411badad50c1345b3eca26453da45bbbJason Sams size_t len; 143a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGV("file open 1"); 145a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(magicString, 1, 12, f); 146a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if ((len != 12) || 147a5597fcd411badad50c1345b3eca26453da45bbbJason Sams memcmp(magicString, "Android3D_ff", 12)) { 148a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 149a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 150a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 152fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = 0; 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&headerSize, 1, sizeof(headerSize), f); 154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(headerSize) || headerSize == 0) { 155a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 156a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 157a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *headerData = (uint8_t *)malloc(headerSize); 159afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!headerData) { 160a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 161a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 162a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(headerData, 1, headerSize, f); 164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != headerSize) { 165a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 166a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now open the stream to parse the header 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk IStream headerStream(headerData, false); 170b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 172b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk free(headerData); 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&mDataSize, 1, sizeof(mDataSize), f); 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(mDataSize) || mDataSize == 0) { 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 178a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 179a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 180383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGV("file open size = %lli", mDataSize); 181a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 182a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We should know enough to read the file in at this point. 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = malloc(mDataSize); 184a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (!mAlloc) { 185a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 186a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 187a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = (uint8_t *)mAlloc; 188a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(mAlloc, 1, mDataSize, f); 189a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != mDataSize) { 190a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 191a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 192a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 195383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk LOGV("Header is read an stream initialized"); 196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 197a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 198a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 199b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouksize_t FileA3D::getNumIndexEntries() const { 200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex.size(); 201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 202a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 203b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchoukconst FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const { 204afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index < mIndex.size()) { 205fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex[index]; 206a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 207fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 208fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 209a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 210b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex SakhartchoukObjectBase *FileA3D::initializeFromEntry(size_t index) { 211afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index >= mIndex.size()) { 212b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 213b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 214b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 215b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D::A3DIndexEntry *entry = mIndex[index]; 216afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!entry) { 217fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 218a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 219a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 220afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 221b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 222b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 223b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 224b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Seek to the beginning of object 226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream->reset(entry->mOffset); 227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk switch (entry->mType) { 228b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_UNKNOWN: 229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 230b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_MESH: 231b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Mesh::createFromStream(mRSC, mReadStream); 232b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 233b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_TYPE: 234b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Type::createFromStream(mRSC, mReadStream); 235b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 236b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ELEMENT: 237b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Element::createFromStream(mRSC, mReadStream); 238b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 239b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ALLOCATION: 240b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Allocation::createFromStream(mRSC, mReadStream); 241b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 242b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_VERTEX: 243b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = ProgramVertex::createFromStream(mRSC, mReadStream); 244b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 245b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_RASTER: 246b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = ProgramRaster::createFromStream(mRSC, mReadStream); 247b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 248b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_FRAGMENT: 249b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = ProgramFragment::createFromStream(mRSC, mReadStream); 250b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 251b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_STORE: 252b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = ProgramStore::createFromStream(mRSC, mReadStream); 253b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 254b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SAMPLER: 255b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Sampler::createFromStream(mRSC, mReadStream); 256b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 257b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ANIMATION: 258b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Animation::createFromStream(mRSC, mReadStream); 259b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 260b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_1D: 261b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Adapter1D::createFromStream(mRSC, mReadStream); 262b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 263b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_2D: 264b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Adapter2D::createFromStream(mRSC, mReadStream); 265b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 266b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SCRIPT_C: 267fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 268a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 269afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 270b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 271b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 272b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 273a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 274a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 275afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::writeFile(const char *filename) { 276afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 277fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("No objects to write\n"); 278fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 279a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 280afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream->getPos() == 0) { 281fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("No objects to write\n"); 282fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 283a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 284a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 285fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk FILE *writeHandle = fopen(filename, "wb"); 286afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!writeHandle) { 287fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("Couldn't open the file for writing\n"); 288fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 289b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 290b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 291fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Open a new stream to make writing the header easier 292fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk OStream headerStream(5*1024, false); 293fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMajorVersion); 294fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMinorVersion); 295fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t is64Bit = 0; 296fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(is64Bit); 297fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 298fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t writeIndexSize = mWriteIndex.size(); 299fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(writeIndexSize); 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < writeIndexSize; i ++) { 301b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addString(&mWriteIndex[i]->mObjectName); 302fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32((uint32_t)mWriteIndex[i]->mType); 303afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 304fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mOffset); 305b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mLength); 306afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 307fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset; 308fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(offset); 309b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk offset = (uint32_t)mWriteIndex[i]->mLength; 310b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addU32(offset); 311b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 312a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 313a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 314fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write our magic string so we know we are reading the right file 315fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 magicString(A3D_MAGIC_KEY); 316fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(magicString.string(), sizeof(char), magicString.size(), writeHandle); 317a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 318fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the size of the header to make it easier to parse when we read it 319fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = headerStream.getPos(); 320fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&headerSize, sizeof(headerSize), 1, writeHandle); 321a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 322fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write our header 323fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle); 324a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 325fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the size of the data part of the file for easier parsing later 326fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t fileDataSize = mWriteStream->getPos(); 327fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle); 328a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 329fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle); 330b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 331fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk int status = fclose(writeHandle); 332a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 333afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (status != 0) { 334fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("Couldn't close file\n"); 335fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 336fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 337a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 338fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 339fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 340fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 341fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid FileA3D::appendToFile(ObjectBase *obj) { 342afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!obj) { 343fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return; 344fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 345afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 346fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk const uint64_t initialStreamSize = 256*1024; 347fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = new OStream(initialStreamSize, false); 348a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 349fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DIndexEntry *indexEntry = new A3DIndexEntry(); 350b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mObjectName.setTo(obj->getName()); 351fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mType = obj->getClassId(); 352fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mOffset = mWriteStream->getPos(); 353b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mRsObj = obj; 354fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteIndex.push(indexEntry); 355fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk obj->serialize(mWriteStream); 356b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset; 357b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mWriteStream->align(4); 358a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 359a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 360a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace android { 361a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace renderscript { 362a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 363afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len) { 364dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 365dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 366dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk FILE *f = fopen("/sdcard/test.a3d", "rb"); 367dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk if (f) { 368dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk fa3d->load(f); 369dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk fclose(f); 370dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk fa3d->incUserRef(); 371dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return fa3d; 372dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk } 373dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk delete fa3d; 374dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return NULL; 375dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 376dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 377dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 378dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 379dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 380afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) { 381dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 382afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 383dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk LOGE("Can't load entry. No valid file"); 384dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return NULL; 385dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk } 386dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 387dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk ObjectBase *obj = fa3d->initializeFromEntry(index); 388dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk LOGV("Returning object with name %s", obj->getName()); 389dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 390dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk return obj; 391dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 392dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 393dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 394afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file) { 395b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 396b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 397afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (fa3d) { 398b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = fa3d->getNumIndexEntries(); 399afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 400b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk *numEntries = 0; 401b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 402b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 403b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 404afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file) { 405b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = static_cast<FileA3D *>(file); 406b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 407afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!fa3d) { 408b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk LOGE("Can't load index entries. No valid file"); 409b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 410b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 411b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 412b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numFileEntries = fa3d->getNumIndexEntries(); 413afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numFileEntries != numEntries || numEntries == 0 || fileEntries == NULL) { 414b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk LOGE("Can't load index entries. Invalid number requested"); 415b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return; 416b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 417b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 418afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numFileEntries; i ++) { 419b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i); 420b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fileEntries[i].classID = entry->getType(); 421b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fileEntries[i].objectName = entry->getObjectName().string(); 422b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 423b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 424b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 425afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsFile rsaFileA3DCreateFromAssetStream(RsContext con, const void *data, uint32_t len) { 426b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if (data == NULL) { 427b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk LOGE("File load failed. Asset stream is NULL"); 428b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return NULL; 429b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 430b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 431dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk Context *rsc = static_cast<Context *>(con); 432b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D *fa3d = new FileA3D(rsc); 433b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk fa3d->incUserRef(); 434b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 435dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk fa3d->load(data, len); 436b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return fa3d; 437b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 438