rsFileA3D.cpp revision b80dfa72dfdd146a9ddee948ad76635dbea3c0cd
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 18a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsContext.h" 19a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 20a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 21a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include <utils/String8.h> 22a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsFileA3D.h" 23a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 24a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsMesh.h" 25a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 26a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android; 27a5597fcd411badad50c1345b3eca26453da45bbbJason Samsusing namespace android::renderscript; 28a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 29a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 30a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 31a5597fcd411badad50c1345b3eca26453da45bbbJason SamsFileA3D::FileA3D() 32a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 33a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mRsc = NULL; 34a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 35a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 36a5597fcd411badad50c1345b3eca26453da45bbbJason SamsFileA3D::~FileA3D() 37a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 38a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 39a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 40a5597fcd411badad50c1345b3eca26453da45bbbJason Samsbool FileA3D::load(Context *rsc, FILE *f) 41a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 42a5597fcd411badad50c1345b3eca26453da45bbbJason Sams char magicString[12]; 43a5597fcd411badad50c1345b3eca26453da45bbbJason Sams size_t len; 44a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 45a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open 1"); 46a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(magicString, 1, 12, f); 47a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if ((len != 12) || 48a5597fcd411badad50c1345b3eca26453da45bbbJason Sams memcmp(magicString, "Android3D_ff", 12)) { 49a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 50a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 51a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 52a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open 2"); 53a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(&mMajorVersion, 1, sizeof(mMajorVersion), f); 54a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != sizeof(mMajorVersion)) { 55a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 56a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 57a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 58a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open 3"); 59a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(&mMinorVersion, 1, sizeof(mMinorVersion), f); 60a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != sizeof(mMinorVersion)) { 61a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 62a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 63a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 64a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open 4"); 65a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t flags; 66a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(&flags, 1, sizeof(flags), f); 67a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != sizeof(flags)) { 68a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 69a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 70a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mUse64BitOffsets = (flags & 1) != 0; 71a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 72a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open 64bit = %i", mUse64BitOffsets); 73a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 74a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (mUse64BitOffsets) { 75a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(&mDataSize, 1, sizeof(mDataSize), f); 76a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != sizeof(mDataSize)) { 77a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 78a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 79a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } else { 80a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t tmp; 81a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(&tmp, 1, sizeof(tmp), f); 82a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != sizeof(tmp)) { 83a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 84a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 85a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mDataSize = tmp; 86a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 87a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 88a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file open size = %lli", mDataSize); 89a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 90a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We should know enough to read the file in at this point. 91a5597fcd411badad50c1345b3eca26453da45bbbJason Sams fseek(f, SEEK_SET, 0); 92a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mAlloc= malloc(mDataSize); 93a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (!mAlloc) { 94a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 95a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 96a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = (uint8_t *)mAlloc; 97a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(mAlloc, 1, mDataSize, f); 98a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != mDataSize) { 99a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 100a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 101a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 102a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("file start processing"); 103a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return process(rsc); 104a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 105a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 106a5597fcd411badad50c1345b3eca26453da45bbbJason Samsbool FileA3D::processIndex(Context *rsc, A3DIndexEntry *ie) 107a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 108a5597fcd411badad50c1345b3eca26453da45bbbJason Sams bool ret = false; 109a5597fcd411badad50c1345b3eca26453da45bbbJason Sams IO io(mData + ie->mOffset, mUse64BitOffsets); 110a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 111a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("process index, type %i", ie->mType); 112a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 113a5597fcd411badad50c1345b3eca26453da45bbbJason Sams switch(ie->mType) { 114a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case CHUNK_ELEMENT: 115a5597fcd411badad50c1345b3eca26453da45bbbJason Sams processChunk_Element(rsc, &io, ie); 116a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 117a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case CHUNK_ELEMENT_SOURCE: 118a5597fcd411badad50c1345b3eca26453da45bbbJason Sams processChunk_ElementSource(rsc, &io, ie); 119a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 120a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case CHUNK_VERTICIES: 121a5597fcd411badad50c1345b3eca26453da45bbbJason Sams processChunk_Verticies(rsc, &io, ie); 122a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 123a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case CHUNK_MESH: 124a5597fcd411badad50c1345b3eca26453da45bbbJason Sams processChunk_Mesh(rsc, &io, ie); 125a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 126a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case CHUNK_PRIMITIVE: 127a5597fcd411badad50c1345b3eca26453da45bbbJason Sams processChunk_Primitive(rsc, &io, ie); 128a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 129a5597fcd411badad50c1345b3eca26453da45bbbJason Sams default: 130a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("FileA3D Unknown chunk type"); 131a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 132a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 133a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return (ie->mRsObj != NULL); 134a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 135a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 136a5597fcd411badad50c1345b3eca26453da45bbbJason Samsbool FileA3D::process(Context *rsc) 137a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 138a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("process"); 139a5597fcd411badad50c1345b3eca26453da45bbbJason Sams IO io(mData + 12, mUse64BitOffsets); 140a5597fcd411badad50c1345b3eca26453da45bbbJason Sams bool ret = true; 141a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 142a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // Build the index first 143a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("process 1"); 144a5597fcd411badad50c1345b3eca26453da45bbbJason Sams io.loadU32(); // major version, already loaded 145a5597fcd411badad50c1345b3eca26453da45bbbJason Sams io.loadU32(); // minor version, already loaded 146a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("process 2"); 147a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 148a5597fcd411badad50c1345b3eca26453da45bbbJason Sams io.loadU32(); // flags 149a5597fcd411badad50c1345b3eca26453da45bbbJason Sams io.loadOffset(); // filesize, already loaded. 150a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("process 4"); 151a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint64_t mIndexOffset = io.loadOffset(); 152a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint64_t mStringOffset = io.loadOffset(); 153a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 154a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("process mIndexOffset= 0x%016llx", mIndexOffset); 155a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("process mStringOffset= 0x%016llx", mStringOffset); 156a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 157a5597fcd411badad50c1345b3eca26453da45bbbJason Sams IO index(mData + mIndexOffset, mUse64BitOffsets); 158a5597fcd411badad50c1345b3eca26453da45bbbJason Sams IO stringTable(mData + mStringOffset, mUse64BitOffsets); 159a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 160a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t stringEntryCount = stringTable.loadU32(); 161a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("stringEntryCount %i", stringEntryCount); 162a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mStrings.setCapacity(stringEntryCount); 163a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mStringIndexValues.setCapacity(stringEntryCount); 164a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (stringEntryCount) { 165a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t stringType = stringTable.loadU32(); 166a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("stringType %i", stringType); 167a5597fcd411badad50c1345b3eca26453da45bbbJason Sams rsAssert(stringType==0); 168a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < stringEntryCount; ct++) { 169a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint64_t offset = stringTable.loadOffset(); 170a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("string offset 0x%016llx", offset); 171a5597fcd411badad50c1345b3eca26453da45bbbJason Sams IO tmp(mData + offset, mUse64BitOffsets); 172a5597fcd411badad50c1345b3eca26453da45bbbJason Sams String8 s; 173a5597fcd411badad50c1345b3eca26453da45bbbJason Sams tmp.loadString(&s); 174a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("string %s", s.string()); 175a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mStrings.push(s); 176a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 177a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 178a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 179a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("strings done"); 180a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t indexEntryCount = index.loadU32(); 181a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("index count %i", indexEntryCount); 182a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mIndex.setCapacity(indexEntryCount); 183a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < indexEntryCount; ct++) { 184a5597fcd411badad50c1345b3eca26453da45bbbJason Sams A3DIndexEntry e; 185a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t stringIndex = index.loadU32(); 186a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("index %i", ct); 187a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE(" string index %i", stringIndex); 188a5597fcd411badad50c1345b3eca26453da45bbbJason Sams e.mType = (A3DChunkType)index.loadU32(); 189a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE(" type %i", e.mType); 190a5597fcd411badad50c1345b3eca26453da45bbbJason Sams e.mOffset = index.loadOffset(); 191a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE(" offset 0x%016llx", e.mOffset); 192a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 193a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (stringIndex && (stringIndex < mStrings.size())) { 194a5597fcd411badad50c1345b3eca26453da45bbbJason Sams e.mID = mStrings[stringIndex]; 195a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mStringIndexValues.editItemAt(stringIndex) = ct; 196a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE(" id %s", e.mID.string()); 197a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 198a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 199a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mIndex.push(e); 200a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("index done"); 202a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 203a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // At this point the index should be fully populated. 204a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We can now walk though it and load all the objects. 205a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < indexEntryCount; ct++) { 206a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("processing index entry %i", ct); 207a5597fcd411badad50c1345b3eca26453da45bbbJason Sams processIndex(rsc, &mIndex.editItemAt(ct)); 208a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 209a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 210a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return ret; 211a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 212a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 213a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 214a5597fcd411badad50c1345b3eca26453da45bbbJason SamsFileA3D::IO::IO(const uint8_t *buf, bool use64) 215a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 216a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = buf; 217a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPos = 0; 218a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mUse64 = use64; 219a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 220a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 221a5597fcd411badad50c1345b3eca26453da45bbbJason Samsuint64_t FileA3D::IO::loadOffset() 222a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 223a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint64_t tmp; 224a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (mUse64) { 225a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPos = (mPos + 7) & (~7); 226a5597fcd411badad50c1345b3eca26453da45bbbJason Sams tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0]; 227a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPos += sizeof(uint64_t); 228a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return tmp; 229a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 230a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return loadU32(); 231a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 232a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 233a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::IO::loadString(String8 *s) 234a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 235a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("loadString"); 236a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t len = loadU32(); 237a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("loadString len %i", len); 238a5597fcd411badad50c1345b3eca26453da45bbbJason Sams s->setTo((const char *)&mData[mPos], len); 239a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPos += len; 240a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 241a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 242a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 243a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_Mesh(Context *rsc, IO *io, A3DIndexEntry *ie) 244a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 245a5597fcd411badad50c1345b3eca26453da45bbbJason Sams Mesh * m = new Mesh; 246a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 247a5597fcd411badad50c1345b3eca26453da45bbbJason Sams m->mPrimitivesCount = io->loadU32(); 248a5597fcd411badad50c1345b3eca26453da45bbbJason Sams m->mPrimitives = new Mesh::Primitive_t *[m->mPrimitivesCount]; 249a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 250a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < m->mPrimitivesCount; ct++) { 251a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t index = io->loadU32(); 252a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 253a5597fcd411badad50c1345b3eca26453da45bbbJason Sams m->mPrimitives[ct] = (Mesh::Primitive_t *)mIndex[index].mRsObj; 254a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 255a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = m; 256a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 257a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 258a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_Primitive(Context *rsc, IO *io, A3DIndexEntry *ie) 259a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 260a5597fcd411badad50c1345b3eca26453da45bbbJason Sams Mesh::Primitive_t * p = new Mesh::Primitive_t; 261a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 262a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndexCount = io->loadU32(); 263a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t vertIdx = io->loadU32(); 264b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams p->mRestartCounts = io->loadU16(); 265a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t bits = io->loadU8(); 266a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mType = (RsPrimitive)io->loadU8(); 267a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 268b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams LOGE("processChunk_Primitive count %i, bits %i", p->mIndexCount, bits); 269b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 270a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mVerticies = (Mesh::Verticies_t *)mIndex[vertIdx].mRsObj; 271a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 272a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies = new uint16_t[p->mIndexCount]; 273a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < p->mIndexCount; ct++) { 274a5597fcd411badad50c1345b3eca26453da45bbbJason Sams switch(bits) { 275a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case 8: 276a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies[ct] = io->loadU8(); 277a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 278a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case 16: 279a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies[ct] = io->loadU16(); 280a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 281a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case 32: 282a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies[ct] = io->loadU32(); 283a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 284a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 285b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams LOGE(" idx %i", p->mIndicies[ct]); 286b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 287b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 288b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams if (p->mRestartCounts) { 289b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams p->mRestarts = new uint16_t[p->mRestartCounts]; 290b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams for (uint32_t ct = 0; ct < p->mRestartCounts; ct++) { 291b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams switch(bits) { 292b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams case 8: 293b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams p->mRestarts[ct] = io->loadU8(); 294b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams break; 295b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams case 16: 296b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams p->mRestarts[ct] = io->loadU16(); 297b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams break; 298b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams case 32: 299b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams p->mRestarts[ct] = io->loadU32(); 300b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams break; 301b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 302b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams LOGE(" idx %i", p->mRestarts[ct]); 303b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 304b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } else { 305b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams p->mRestarts = NULL; 306a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 307a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 308a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = p; 309a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 310a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 311a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_Verticies(Context *rsc, IO *io, A3DIndexEntry *ie) 312a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 313a5597fcd411badad50c1345b3eca26453da45bbbJason Sams Mesh::Verticies_t *cv = new Mesh::Verticies_t; 314a5597fcd411badad50c1345b3eca26453da45bbbJason Sams cv->mAllocationCount = io->loadU32(); 315a5597fcd411badad50c1345b3eca26453da45bbbJason Sams cv->mAllocations = new Allocation *[cv->mAllocationCount]; 316b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams LOGE("processChunk_Verticies count %i", cv->mAllocationCount); 317a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < cv->mAllocationCount; ct++) { 318a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t i = io->loadU32(); 319a5597fcd411badad50c1345b3eca26453da45bbbJason Sams cv->mAllocations[ct] = (Allocation *)mIndex[i].mRsObj; 320b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams LOGE(" idx %i", i); 321a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 322a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = cv; 323a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 324a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 325a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_Element(Context *rsc, IO *io, A3DIndexEntry *ie) 326a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 327a5597fcd411badad50c1345b3eca26453da45bbbJason Sams rsi_ElementBegin(rsc); 328a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 329a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t count = io->loadU32(); 330a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("processChunk_Element count %i", count); 331a5597fcd411badad50c1345b3eca26453da45bbbJason Sams while (count--) { 332a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsDataKind dk = (RsDataKind)io->loadU8(); 333a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsDataType dt = (RsDataType)io->loadU8(); 334a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t bits = io->loadU8(); 335a5597fcd411badad50c1345b3eca26453da45bbbJason Sams bool isNorm = io->loadU8() != 0; 336a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE(" %i %i %i %i", dk, dt, bits, isNorm); 337a5597fcd411badad50c1345b3eca26453da45bbbJason Sams rsi_ElementAdd(rsc, dk, dt, isNorm, bits); 338a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 339a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("processChunk_Element create"); 340a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = rsi_ElementCreate(rsc); 341a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 342a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 343a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_ElementSource(Context *rsc, IO *io, A3DIndexEntry *ie) 344a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 345a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t index = io->loadU32(); 346a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t count = io->loadU32(); 347a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 348b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams LOGE("processChunk_ElementSource count %i, index %i", count, index); 349b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 350a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsElement e = (RsElement)mIndex[index].mRsObj; 351a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 352a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsAllocation a = rsi_AllocationCreateSized(rsc, e, count); 353a5597fcd411badad50c1345b3eca26453da45bbbJason Sams Allocation * alloc = static_cast<Allocation *>(a); 354a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 355a5597fcd411badad50c1345b3eca26453da45bbbJason Sams float * data = (float *)alloc->getPtr(); 356a5597fcd411badad50c1345b3eca26453da45bbbJason Sams while(count--) { 357a5597fcd411badad50c1345b3eca26453da45bbbJason Sams *data = io->loadF(); 358b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams LOGE(" %f", *data); 359a5597fcd411badad50c1345b3eca26453da45bbbJason Sams data++; 360a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 361a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = alloc; 362a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 363a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 364a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace android { 365a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace renderscript { 366a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 367a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 368a5597fcd411badad50c1345b3eca26453da45bbbJason SamsRsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len) 369a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 370a5597fcd411badad50c1345b3eca26453da45bbbJason Sams FileA3D *fa3d = new FileA3D; 371a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 372a5597fcd411badad50c1345b3eca26453da45bbbJason Sams FILE *f = fopen("/sdcard/test.a3d", "rb"); 373a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (f) { 374a5597fcd411badad50c1345b3eca26453da45bbbJason Sams fa3d->load(rsc, f); 375a5597fcd411badad50c1345b3eca26453da45bbbJason Sams fclose(f); 376a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return fa3d; 377a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 378a5597fcd411badad50c1345b3eca26453da45bbbJason Sams delete fa3d; 379a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return NULL; 380a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 381a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 382a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 383a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 384a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 385