rsFileA3D.cpp revision a5597fcd411badad50c1345b3eca26453da45bbb
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(); 264a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t bits = io->loadU8(); 265a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mType = (RsPrimitive)io->loadU8(); 266a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 267a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mVerticies = (Mesh::Verticies_t *)mIndex[vertIdx].mRsObj; 268a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 269a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies = new uint16_t[p->mIndexCount]; 270a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < p->mIndexCount; ct++) { 271a5597fcd411badad50c1345b3eca26453da45bbbJason Sams switch(bits) { 272a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case 8: 273a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies[ct] = io->loadU8(); 274a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 275a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case 16: 276a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies[ct] = io->loadU16(); 277a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 278a5597fcd411badad50c1345b3eca26453da45bbbJason Sams case 32: 279a5597fcd411badad50c1345b3eca26453da45bbbJason Sams p->mIndicies[ct] = io->loadU32(); 280a5597fcd411badad50c1345b3eca26453da45bbbJason Sams break; 281a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 282a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 283a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 284a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = p; 285a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 286a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 287a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_Verticies(Context *rsc, IO *io, A3DIndexEntry *ie) 288a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 289a5597fcd411badad50c1345b3eca26453da45bbbJason Sams Mesh::Verticies_t *cv = new Mesh::Verticies_t; 290a5597fcd411badad50c1345b3eca26453da45bbbJason Sams cv->mAllocationCount = io->loadU32(); 291a5597fcd411badad50c1345b3eca26453da45bbbJason Sams cv->mAllocations = new Allocation *[cv->mAllocationCount]; 292a5597fcd411badad50c1345b3eca26453da45bbbJason Sams for (uint32_t ct = 0; ct < cv->mAllocationCount; ct++) { 293a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t i = io->loadU32(); 294a5597fcd411badad50c1345b3eca26453da45bbbJason Sams cv->mAllocations[ct] = (Allocation *)mIndex[i].mRsObj; 295a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 296a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = cv; 297a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 298a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 299a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_Element(Context *rsc, IO *io, A3DIndexEntry *ie) 300a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 301a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("processChunk_Element ie %p", ie); 302a5597fcd411badad50c1345b3eca26453da45bbbJason Sams rsi_ElementBegin(rsc); 303a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 304a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t count = io->loadU32(); 305a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("processChunk_Element count %i", count); 306a5597fcd411badad50c1345b3eca26453da45bbbJason Sams while (count--) { 307a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsDataKind dk = (RsDataKind)io->loadU8(); 308a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsDataType dt = (RsDataType)io->loadU8(); 309a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t bits = io->loadU8(); 310a5597fcd411badad50c1345b3eca26453da45bbbJason Sams bool isNorm = io->loadU8() != 0; 311a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE(" %i %i %i %i", dk, dt, bits, isNorm); 312a5597fcd411badad50c1345b3eca26453da45bbbJason Sams rsi_ElementAdd(rsc, dk, dt, isNorm, bits); 313a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 314a5597fcd411badad50c1345b3eca26453da45bbbJason Sams LOGE("processChunk_Element create"); 315a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = rsi_ElementCreate(rsc); 316a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 317a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 318a5597fcd411badad50c1345b3eca26453da45bbbJason Samsvoid FileA3D::processChunk_ElementSource(Context *rsc, IO *io, A3DIndexEntry *ie) 319a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 320a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t index = io->loadU32(); 321a5597fcd411badad50c1345b3eca26453da45bbbJason Sams uint32_t count = io->loadU32(); 322a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 323a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsElement e = (RsElement)mIndex[index].mRsObj; 324a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 325a5597fcd411badad50c1345b3eca26453da45bbbJason Sams RsAllocation a = rsi_AllocationCreateSized(rsc, e, count); 326a5597fcd411badad50c1345b3eca26453da45bbbJason Sams Allocation * alloc = static_cast<Allocation *>(a); 327a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 328a5597fcd411badad50c1345b3eca26453da45bbbJason Sams float * data = (float *)alloc->getPtr(); 329a5597fcd411badad50c1345b3eca26453da45bbbJason Sams while(count--) { 330a5597fcd411badad50c1345b3eca26453da45bbbJason Sams *data = io->loadF(); 331a5597fcd411badad50c1345b3eca26453da45bbbJason Sams data++; 332a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 333a5597fcd411badad50c1345b3eca26453da45bbbJason Sams ie->mRsObj = alloc; 334a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 335a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 336a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace android { 337a5597fcd411badad50c1345b3eca26453da45bbbJason Samsnamespace renderscript { 338a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 339a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 340a5597fcd411badad50c1345b3eca26453da45bbbJason SamsRsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len) 341a5597fcd411badad50c1345b3eca26453da45bbbJason Sams{ 342a5597fcd411badad50c1345b3eca26453da45bbbJason Sams FileA3D *fa3d = new FileA3D; 343a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 344a5597fcd411badad50c1345b3eca26453da45bbbJason Sams FILE *f = fopen("/sdcard/test.a3d", "rb"); 345a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (f) { 346a5597fcd411badad50c1345b3eca26453da45bbbJason Sams fa3d->load(rsc, f); 347a5597fcd411badad50c1345b3eca26453da45bbbJason Sams fclose(f); 348a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return fa3d; 349a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 350a5597fcd411badad50c1345b3eca26453da45bbbJason Sams delete fa3d; 351a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return NULL; 352a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 353a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 354a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 355a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 356a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 357