rsFileA3D.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
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 29a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android; 30a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android::renderscript; 31a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 32a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 33a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 34a5597fcd411badad50c1345b3eca26453da45bbbJason SamsFileA3D::FileA3D() 35a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 36a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mRsc = NULL; 37fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = NULL; 38fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mData = NULL; 39fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = NULL; 40fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = NULL; 41fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 42fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMajorVersion = 0; 43fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMinorVersion = 1; 44fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mDataSize = 0; 45a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 46a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 47a5597fcd411badad50c1345b3eca26453da45bbbJason SamsFileA3D::~FileA3D() 48a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(size_t i = 0; i < mIndex.size(); i ++) { 50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mIndex[i]; 51fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(size_t i = 0; i < mWriteIndex.size(); i ++) { 53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteIndex[i]; 54fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mWriteStream) { 56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 57fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 58fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mReadStream) { 59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 60fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 61fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mAlloc) { 62fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mAlloc); 63fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 64a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 65a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 66a5597fcd411badad50c1345b3eca26453da45bbbJason Samsbool FileA3D::load(Context *rsc, FILE *f) 67a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 68a5597fcd411badad50c1345b3eca26453da45bbbJason Sams char magicString[12]; 69a5597fcd411badad50c1345b3eca26453da45bbbJason Sams size_t len; 70a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 71a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open 1"); 72a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(magicString, 1, 12, f); 73a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if ((len != 12) || 74a5597fcd411badad50c1345b3eca26453da45bbbJason Sams memcmp(magicString, "Android3D_ff", 12)) { 75a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 76a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 77a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 78fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 79fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = 0; 80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&headerSize, 1, sizeof(headerSize), f); 81fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(headerSize) || headerSize == 0) { 82a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 83a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 84a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *headerData = (uint8_t *)malloc(headerSize); 86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(!headerData) { 87a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 88a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 89a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(headerData, 1, headerSize, f); 91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != headerSize) { 92a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 93a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now open the stream to parse the header 96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk IStream headerStream(headerData, false); 97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMajorVersion = headerStream.loadU32(); 99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMinorVersion = headerStream.loadU32(); 100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t flags = headerStream.loadU32(); 101a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mUse64BitOffsets = (flags & 1) != 0; 102a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 103a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open 64bit = %i", mUse64BitOffsets); 104a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t numIndexEntries = headerStream.loadU32(); 106fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t i = 0; i < numIndexEntries; i ++) { 107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DIndexEntry *entry = new A3DIndexEntry(); 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.loadString(&entry->mID); 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk entry->mType = (A3DClassID)headerStream.loadU32(); 110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mUse64BitOffsets){ 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk entry->mOffset = headerStream.loadOffset(); 112a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk else { 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk entry->mOffset = headerStream.loadU32(); 115a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk entry->mRsObj = NULL; 117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mIndex.push(entry); 118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&mDataSize, 1, sizeof(mDataSize), f); 122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(mDataSize) || mDataSize == 0) { 123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 124a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 125a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 126a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open size = %lli", mDataSize); 127a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 128a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We should know enough to read the file in at this point. 129fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = malloc(mDataSize); 130a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (!mAlloc) { 131a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 132a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 133a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = (uint8_t *)mAlloc; 134a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(mAlloc, 1, mDataSize, f); 135a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != mDataSize) { 136a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 137a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 138a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mRsc = rsc; 142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("Header is read an stream initialized"); 144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 145a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 146a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouksize_t FileA3D::getNumLoadedEntries() const { 148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex.size(); 149a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 150a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukconst FileA3D::A3DIndexEntry *FileA3D::getLoadedEntry(size_t index) const { 152fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(index < mIndex.size()) { 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex[index]; 154a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 157a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukObjectBase *FileA3D::initializeFromEntry(const FileA3D::A3DIndexEntry *entry) { 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(!entry) { 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 161a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 162a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Seek to the beginning of object 164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream->reset(entry->mOffset); 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk switch (entry->mType) { 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_UNKNOWN: 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_MESH: 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Mesh::createFromStream(mRsc, mReadStream); 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_SIMPLE_MESH: 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return SimpleMesh::createFromStream(mRsc, mReadStream); 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_TYPE: 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Type::createFromStream(mRsc, mReadStream); 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_ELEMENT: 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Element::createFromStream(mRsc, mReadStream); 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_ALLOCATION: 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Allocation::createFromStream(mRsc, mReadStream); 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_PROGRAM_VERTEX: 179fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ProgramVertex::createFromStream(mRsc, mReadStream); 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_PROGRAM_RASTER: 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ProgramRaster::createFromStream(mRsc, mReadStream); 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_PROGRAM_FRAGMENT: 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ProgramFragment::createFromStream(mRsc, mReadStream); 184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_PROGRAM_STORE: 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ProgramStore::createFromStream(mRsc, mReadStream); 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_SAMPLER: 187fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Sampler::createFromStream(mRsc, mReadStream); 188fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_ANIMATION: 189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Animation::createFromStream(mRsc, mReadStream); 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_LIGHT: 191fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Light::createFromStream(mRsc, mReadStream); 192fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_ADAPTER_1D: 193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Adapter1D::createFromStream(mRsc, mReadStream); 194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_ADAPTER_2D: 195fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return Adapter2D::createFromStream(mRsc, mReadStream); 196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk case A3D_CLASS_ID_SCRIPT_C: 197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 198a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 200a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukbool FileA3D::writeFile(const char *filename) 203a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(!mWriteStream) { 205fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("No objects to write\n"); 206fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 207a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 208fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mWriteStream->getPos() == 0) { 209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("No objects to write\n"); 210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 211a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 212a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 213fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk FILE *writeHandle = fopen(filename, "wb"); 214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(!writeHandle) { 215fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("Couldn't open the file for writing\n"); 216fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 217b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 218b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Open a new stream to make writing the header easier 220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk OStream headerStream(5*1024, false); 221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMajorVersion); 222fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMinorVersion); 223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t is64Bit = 0; 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(is64Bit); 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t writeIndexSize = mWriteIndex.size(); 227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(writeIndexSize); 228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t i = 0; i < writeIndexSize; i ++) { 229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addString(&mWriteIndex[i]->mID); 230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32((uint32_t)mWriteIndex[i]->mType); 231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mUse64BitOffsets){ 232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mOffset); 233fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 234fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk else { 235fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset; 236fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(offset); 237b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 238a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 239a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 240fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write our magic string so we know we are reading the right file 241fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 magicString(A3D_MAGIC_KEY); 242fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(magicString.string(), sizeof(char), magicString.size(), writeHandle); 243a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 244fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the size of the header to make it easier to parse when we read it 245fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = headerStream.getPos(); 246fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&headerSize, sizeof(headerSize), 1, writeHandle); 247a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 248fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write our header 249fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle); 250a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 251fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the size of the data part of the file for easier parsing later 252fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t fileDataSize = mWriteStream->getPos(); 253fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle); 254a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 255fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle); 256b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 257fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk int status = fclose(writeHandle); 258a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 259fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(status != 0) { 260fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("Couldn't close file\n"); 261fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 262fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 263a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 264fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 265fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 266fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 267fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid FileA3D::appendToFile(ObjectBase *obj) { 268fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(!obj) { 269fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return; 270fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 271fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(!mWriteStream) { 272fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk const uint64_t initialStreamSize = 256*1024; 273fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = new OStream(initialStreamSize, false); 274a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 275fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DIndexEntry *indexEntry = new A3DIndexEntry(); 276fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mID.setTo(obj->getName()); 277fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mType = obj->getClassId(); 278fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mOffset = mWriteStream->getPos(); 279fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mRsObj = (void*)obj; 280fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteIndex.push(indexEntry); 281fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk obj->serialize(mWriteStream); 282a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 283a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 284a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace android { 285a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace renderscript { 286a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 287a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 288a5597fcd411badad50c1345b3eca26453da45bbbJason SamsRsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len) 289a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 290a5597fcd411badad50c1345b3eca26453da45bbbJason Sams FileA3D *fa3d = new FileA3D; 291a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 292a5597fcd411badad50c1345b3eca26453da45bbbJason Sams FILE *f = fopen("/sdcard/test.a3d", "rb"); 293a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (f) { 294a5597fcd411badad50c1345b3eca26453da45bbbJason Sams fa3d->load(rsc, f); 295a5597fcd411badad50c1345b3eca26453da45bbbJason Sams fclose(f); 296a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return fa3d; 297a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 298a5597fcd411badad50c1345b3eca26453da45bbbJason Sams delete fa3d; 299a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return NULL; 300a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 301a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 302a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 303a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 304a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 305