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