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