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