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