164676f3c21a07d650069315572811570cbf8f728Jason Sams 264676f3c21a07d650069315572811570cbf8f728Jason Sams/* 364676f3c21a07d650069315572811570cbf8f728Jason Sams * Copyright (C) 2009 The Android Open Source Project 464676f3c21a07d650069315572811570cbf8f728Jason Sams * 564676f3c21a07d650069315572811570cbf8f728Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 664676f3c21a07d650069315572811570cbf8f728Jason Sams * you may not use this file except in compliance with the License. 764676f3c21a07d650069315572811570cbf8f728Jason Sams * You may obtain a copy of the License at 864676f3c21a07d650069315572811570cbf8f728Jason Sams * 964676f3c21a07d650069315572811570cbf8f728Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 1064676f3c21a07d650069315572811570cbf8f728Jason Sams * 1164676f3c21a07d650069315572811570cbf8f728Jason Sams * Unless required by applicable law or agreed to in writing, software 1264676f3c21a07d650069315572811570cbf8f728Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1364676f3c21a07d650069315572811570cbf8f728Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1464676f3c21a07d650069315572811570cbf8f728Jason Sams * See the License for the specific language governing permissions and 1564676f3c21a07d650069315572811570cbf8f728Jason Sams * limitations under the License. 1664676f3c21a07d650069315572811570cbf8f728Jason Sams */ 1764676f3c21a07d650069315572811570cbf8f728Jason Sams 1864676f3c21a07d650069315572811570cbf8f728Jason Sams#include "rsContext.h" 1964676f3c21a07d650069315572811570cbf8f728Jason Sams 2064676f3c21a07d650069315572811570cbf8f728Jason Sams 2164676f3c21a07d650069315572811570cbf8f728Jason Sams#include <utils/String8.h> 2264676f3c21a07d650069315572811570cbf8f728Jason Sams#include "rsFileA3D.h" 2364676f3c21a07d650069315572811570cbf8f728Jason Sams 2464676f3c21a07d650069315572811570cbf8f728Jason Sams#include "rsMesh.h" 2564676f3c21a07d650069315572811570cbf8f728Jason Sams 2664676f3c21a07d650069315572811570cbf8f728Jason Samsusing namespace android; 2764676f3c21a07d650069315572811570cbf8f728Jason Samsusing namespace android::renderscript; 2864676f3c21a07d650069315572811570cbf8f728Jason Sams 2964676f3c21a07d650069315572811570cbf8f728Jason Sams 3064676f3c21a07d650069315572811570cbf8f728Jason Sams 3164676f3c21a07d650069315572811570cbf8f728Jason SamsFileA3D::FileA3D() 3264676f3c21a07d650069315572811570cbf8f728Jason Sams{ 3364676f3c21a07d650069315572811570cbf8f728Jason Sams mRsc = NULL; 3464676f3c21a07d650069315572811570cbf8f728Jason Sams} 3564676f3c21a07d650069315572811570cbf8f728Jason Sams 3664676f3c21a07d650069315572811570cbf8f728Jason SamsFileA3D::~FileA3D() 3764676f3c21a07d650069315572811570cbf8f728Jason Sams{ 3864676f3c21a07d650069315572811570cbf8f728Jason Sams} 3964676f3c21a07d650069315572811570cbf8f728Jason Sams 4064676f3c21a07d650069315572811570cbf8f728Jason Samsbool FileA3D::load(Context *rsc, FILE *f) 4164676f3c21a07d650069315572811570cbf8f728Jason Sams{ 4264676f3c21a07d650069315572811570cbf8f728Jason Sams char magicString[12]; 4364676f3c21a07d650069315572811570cbf8f728Jason Sams size_t len; 4464676f3c21a07d650069315572811570cbf8f728Jason Sams 4564676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("file open 1"); 4664676f3c21a07d650069315572811570cbf8f728Jason Sams len = fread(magicString, 1, 12, f); 4764676f3c21a07d650069315572811570cbf8f728Jason Sams if ((len != 12) || 4864676f3c21a07d650069315572811570cbf8f728Jason Sams memcmp(magicString, "Android3D_ff", 12)) { 4964676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 5064676f3c21a07d650069315572811570cbf8f728Jason Sams } 5164676f3c21a07d650069315572811570cbf8f728Jason Sams 5264676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("file open 2"); 5364676f3c21a07d650069315572811570cbf8f728Jason Sams len = fread(&mMajorVersion, 1, sizeof(mMajorVersion), f); 5464676f3c21a07d650069315572811570cbf8f728Jason Sams if (len != sizeof(mMajorVersion)) { 5564676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 5664676f3c21a07d650069315572811570cbf8f728Jason Sams } 5764676f3c21a07d650069315572811570cbf8f728Jason Sams 5864676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("file open 3"); 5964676f3c21a07d650069315572811570cbf8f728Jason Sams len = fread(&mMinorVersion, 1, sizeof(mMinorVersion), f); 6064676f3c21a07d650069315572811570cbf8f728Jason Sams if (len != sizeof(mMinorVersion)) { 6164676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 6264676f3c21a07d650069315572811570cbf8f728Jason Sams } 6364676f3c21a07d650069315572811570cbf8f728Jason Sams 6464676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("file open 4"); 6564676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t flags; 6664676f3c21a07d650069315572811570cbf8f728Jason Sams len = fread(&flags, 1, sizeof(flags), f); 6764676f3c21a07d650069315572811570cbf8f728Jason Sams if (len != sizeof(flags)) { 6864676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 6964676f3c21a07d650069315572811570cbf8f728Jason Sams } 7064676f3c21a07d650069315572811570cbf8f728Jason Sams mUse64BitOffsets = (flags & 1) != 0; 7164676f3c21a07d650069315572811570cbf8f728Jason Sams 7264676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("file open 64bit = %i", mUse64BitOffsets); 7364676f3c21a07d650069315572811570cbf8f728Jason Sams 7464676f3c21a07d650069315572811570cbf8f728Jason Sams if (mUse64BitOffsets) { 7564676f3c21a07d650069315572811570cbf8f728Jason Sams len = fread(&mDataSize, 1, sizeof(mDataSize), f); 7664676f3c21a07d650069315572811570cbf8f728Jason Sams if (len != sizeof(mDataSize)) { 7764676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 7864676f3c21a07d650069315572811570cbf8f728Jason Sams } 7964676f3c21a07d650069315572811570cbf8f728Jason Sams } else { 8064676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t tmp; 8164676f3c21a07d650069315572811570cbf8f728Jason Sams len = fread(&tmp, 1, sizeof(tmp), f); 8264676f3c21a07d650069315572811570cbf8f728Jason Sams if (len != sizeof(tmp)) { 8364676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 8464676f3c21a07d650069315572811570cbf8f728Jason Sams } 8564676f3c21a07d650069315572811570cbf8f728Jason Sams mDataSize = tmp; 8664676f3c21a07d650069315572811570cbf8f728Jason Sams } 8764676f3c21a07d650069315572811570cbf8f728Jason Sams 8864676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("file open size = %lli", mDataSize); 8964676f3c21a07d650069315572811570cbf8f728Jason Sams 9064676f3c21a07d650069315572811570cbf8f728Jason Sams // We should know enough to read the file in at this point. 9164676f3c21a07d650069315572811570cbf8f728Jason Sams fseek(f, SEEK_SET, 0); 9264676f3c21a07d650069315572811570cbf8f728Jason Sams mAlloc= malloc(mDataSize); 9364676f3c21a07d650069315572811570cbf8f728Jason Sams if (!mAlloc) { 9464676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 9564676f3c21a07d650069315572811570cbf8f728Jason Sams } 9664676f3c21a07d650069315572811570cbf8f728Jason Sams mData = (uint8_t *)mAlloc; 9764676f3c21a07d650069315572811570cbf8f728Jason Sams len = fread(mAlloc, 1, mDataSize, f); 9864676f3c21a07d650069315572811570cbf8f728Jason Sams if (len != mDataSize) { 9964676f3c21a07d650069315572811570cbf8f728Jason Sams return false; 10064676f3c21a07d650069315572811570cbf8f728Jason Sams } 10164676f3c21a07d650069315572811570cbf8f728Jason Sams 10264676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("file start processing"); 10364676f3c21a07d650069315572811570cbf8f728Jason Sams return process(rsc); 10464676f3c21a07d650069315572811570cbf8f728Jason Sams} 10564676f3c21a07d650069315572811570cbf8f728Jason Sams 10664676f3c21a07d650069315572811570cbf8f728Jason Samsbool FileA3D::processIndex(Context *rsc, A3DIndexEntry *ie) 10764676f3c21a07d650069315572811570cbf8f728Jason Sams{ 10864676f3c21a07d650069315572811570cbf8f728Jason Sams bool ret = false; 10964676f3c21a07d650069315572811570cbf8f728Jason Sams IO io(mData + ie->mOffset, mUse64BitOffsets); 11064676f3c21a07d650069315572811570cbf8f728Jason Sams 11164676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("process index, type %i", ie->mType); 11264676f3c21a07d650069315572811570cbf8f728Jason Sams 11364676f3c21a07d650069315572811570cbf8f728Jason Sams switch(ie->mType) { 11464676f3c21a07d650069315572811570cbf8f728Jason Sams case CHUNK_ELEMENT: 11564676f3c21a07d650069315572811570cbf8f728Jason Sams processChunk_Element(rsc, &io, ie); 11664676f3c21a07d650069315572811570cbf8f728Jason Sams break; 11764676f3c21a07d650069315572811570cbf8f728Jason Sams case CHUNK_ELEMENT_SOURCE: 11864676f3c21a07d650069315572811570cbf8f728Jason Sams processChunk_ElementSource(rsc, &io, ie); 11964676f3c21a07d650069315572811570cbf8f728Jason Sams break; 12064676f3c21a07d650069315572811570cbf8f728Jason Sams case CHUNK_VERTICIES: 12164676f3c21a07d650069315572811570cbf8f728Jason Sams processChunk_Verticies(rsc, &io, ie); 12264676f3c21a07d650069315572811570cbf8f728Jason Sams break; 12364676f3c21a07d650069315572811570cbf8f728Jason Sams case CHUNK_MESH: 12464676f3c21a07d650069315572811570cbf8f728Jason Sams processChunk_Mesh(rsc, &io, ie); 12564676f3c21a07d650069315572811570cbf8f728Jason Sams break; 12664676f3c21a07d650069315572811570cbf8f728Jason Sams case CHUNK_PRIMITIVE: 12764676f3c21a07d650069315572811570cbf8f728Jason Sams processChunk_Primitive(rsc, &io, ie); 12864676f3c21a07d650069315572811570cbf8f728Jason Sams break; 12964676f3c21a07d650069315572811570cbf8f728Jason Sams default: 13064676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("FileA3D Unknown chunk type"); 13164676f3c21a07d650069315572811570cbf8f728Jason Sams break; 13264676f3c21a07d650069315572811570cbf8f728Jason Sams } 13364676f3c21a07d650069315572811570cbf8f728Jason Sams return (ie->mRsObj != NULL); 13464676f3c21a07d650069315572811570cbf8f728Jason Sams} 13564676f3c21a07d650069315572811570cbf8f728Jason Sams 13664676f3c21a07d650069315572811570cbf8f728Jason Samsbool FileA3D::process(Context *rsc) 13764676f3c21a07d650069315572811570cbf8f728Jason Sams{ 13864676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("process"); 13964676f3c21a07d650069315572811570cbf8f728Jason Sams IO io(mData + 12, mUse64BitOffsets); 14064676f3c21a07d650069315572811570cbf8f728Jason Sams bool ret = true; 14164676f3c21a07d650069315572811570cbf8f728Jason Sams 14264676f3c21a07d650069315572811570cbf8f728Jason Sams // Build the index first 14364676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("process 1"); 14464676f3c21a07d650069315572811570cbf8f728Jason Sams io.loadU32(); // major version, already loaded 14564676f3c21a07d650069315572811570cbf8f728Jason Sams io.loadU32(); // minor version, already loaded 14664676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("process 2"); 14764676f3c21a07d650069315572811570cbf8f728Jason Sams 14864676f3c21a07d650069315572811570cbf8f728Jason Sams io.loadU32(); // flags 14964676f3c21a07d650069315572811570cbf8f728Jason Sams io.loadOffset(); // filesize, already loaded. 15064676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("process 4"); 15164676f3c21a07d650069315572811570cbf8f728Jason Sams uint64_t mIndexOffset = io.loadOffset(); 15264676f3c21a07d650069315572811570cbf8f728Jason Sams uint64_t mStringOffset = io.loadOffset(); 15364676f3c21a07d650069315572811570cbf8f728Jason Sams 15464676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("process mIndexOffset= 0x%016llx", mIndexOffset); 15564676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("process mStringOffset= 0x%016llx", mStringOffset); 15664676f3c21a07d650069315572811570cbf8f728Jason Sams 15764676f3c21a07d650069315572811570cbf8f728Jason Sams IO index(mData + mIndexOffset, mUse64BitOffsets); 15864676f3c21a07d650069315572811570cbf8f728Jason Sams IO stringTable(mData + mStringOffset, mUse64BitOffsets); 15964676f3c21a07d650069315572811570cbf8f728Jason Sams 16064676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t stringEntryCount = stringTable.loadU32(); 16164676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("stringEntryCount %i", stringEntryCount); 16264676f3c21a07d650069315572811570cbf8f728Jason Sams mStrings.setCapacity(stringEntryCount); 16364676f3c21a07d650069315572811570cbf8f728Jason Sams mStringIndexValues.setCapacity(stringEntryCount); 16464676f3c21a07d650069315572811570cbf8f728Jason Sams if (stringEntryCount) { 16564676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t stringType = stringTable.loadU32(); 16664676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("stringType %i", stringType); 16764676f3c21a07d650069315572811570cbf8f728Jason Sams rsAssert(stringType==0); 16864676f3c21a07d650069315572811570cbf8f728Jason Sams for (uint32_t ct = 0; ct < stringEntryCount; ct++) { 16964676f3c21a07d650069315572811570cbf8f728Jason Sams uint64_t offset = stringTable.loadOffset(); 17064676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("string offset 0x%016llx", offset); 17164676f3c21a07d650069315572811570cbf8f728Jason Sams IO tmp(mData + offset, mUse64BitOffsets); 17264676f3c21a07d650069315572811570cbf8f728Jason Sams String8 s; 17364676f3c21a07d650069315572811570cbf8f728Jason Sams tmp.loadString(&s); 17464676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("string %s", s.string()); 17564676f3c21a07d650069315572811570cbf8f728Jason Sams mStrings.push(s); 17664676f3c21a07d650069315572811570cbf8f728Jason Sams } 17764676f3c21a07d650069315572811570cbf8f728Jason Sams } 17864676f3c21a07d650069315572811570cbf8f728Jason Sams 17964676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("strings done"); 18064676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t indexEntryCount = index.loadU32(); 18164676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("index count %i", indexEntryCount); 18264676f3c21a07d650069315572811570cbf8f728Jason Sams mIndex.setCapacity(indexEntryCount); 18364676f3c21a07d650069315572811570cbf8f728Jason Sams for (uint32_t ct = 0; ct < indexEntryCount; ct++) { 18464676f3c21a07d650069315572811570cbf8f728Jason Sams A3DIndexEntry e; 18564676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t stringIndex = index.loadU32(); 18664676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("index %i", ct); 18764676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE(" string index %i", stringIndex); 18864676f3c21a07d650069315572811570cbf8f728Jason Sams e.mType = (A3DChunkType)index.loadU32(); 18964676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE(" type %i", e.mType); 19064676f3c21a07d650069315572811570cbf8f728Jason Sams e.mOffset = index.loadOffset(); 19164676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE(" offset 0x%016llx", e.mOffset); 19264676f3c21a07d650069315572811570cbf8f728Jason Sams 19364676f3c21a07d650069315572811570cbf8f728Jason Sams if (stringIndex && (stringIndex < mStrings.size())) { 19464676f3c21a07d650069315572811570cbf8f728Jason Sams e.mID = mStrings[stringIndex]; 19564676f3c21a07d650069315572811570cbf8f728Jason Sams mStringIndexValues.editItemAt(stringIndex) = ct; 19664676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE(" id %s", e.mID.string()); 19764676f3c21a07d650069315572811570cbf8f728Jason Sams } 19864676f3c21a07d650069315572811570cbf8f728Jason Sams 19964676f3c21a07d650069315572811570cbf8f728Jason Sams mIndex.push(e); 20064676f3c21a07d650069315572811570cbf8f728Jason Sams } 20164676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("index done"); 20264676f3c21a07d650069315572811570cbf8f728Jason Sams 20364676f3c21a07d650069315572811570cbf8f728Jason Sams // At this point the index should be fully populated. 20464676f3c21a07d650069315572811570cbf8f728Jason Sams // We can now walk though it and load all the objects. 20564676f3c21a07d650069315572811570cbf8f728Jason Sams for (uint32_t ct = 0; ct < indexEntryCount; ct++) { 20664676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("processing index entry %i", ct); 20764676f3c21a07d650069315572811570cbf8f728Jason Sams processIndex(rsc, &mIndex.editItemAt(ct)); 20864676f3c21a07d650069315572811570cbf8f728Jason Sams } 20964676f3c21a07d650069315572811570cbf8f728Jason Sams 21064676f3c21a07d650069315572811570cbf8f728Jason Sams return ret; 21164676f3c21a07d650069315572811570cbf8f728Jason Sams} 21264676f3c21a07d650069315572811570cbf8f728Jason Sams 21364676f3c21a07d650069315572811570cbf8f728Jason Sams 21464676f3c21a07d650069315572811570cbf8f728Jason SamsFileA3D::IO::IO(const uint8_t *buf, bool use64) 21564676f3c21a07d650069315572811570cbf8f728Jason Sams{ 21664676f3c21a07d650069315572811570cbf8f728Jason Sams mData = buf; 21764676f3c21a07d650069315572811570cbf8f728Jason Sams mPos = 0; 21864676f3c21a07d650069315572811570cbf8f728Jason Sams mUse64 = use64; 21964676f3c21a07d650069315572811570cbf8f728Jason Sams} 22064676f3c21a07d650069315572811570cbf8f728Jason Sams 22164676f3c21a07d650069315572811570cbf8f728Jason Samsuint64_t FileA3D::IO::loadOffset() 22264676f3c21a07d650069315572811570cbf8f728Jason Sams{ 22364676f3c21a07d650069315572811570cbf8f728Jason Sams uint64_t tmp; 22464676f3c21a07d650069315572811570cbf8f728Jason Sams if (mUse64) { 22564676f3c21a07d650069315572811570cbf8f728Jason Sams mPos = (mPos + 7) & (~7); 22664676f3c21a07d650069315572811570cbf8f728Jason Sams tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0]; 22764676f3c21a07d650069315572811570cbf8f728Jason Sams mPos += sizeof(uint64_t); 22864676f3c21a07d650069315572811570cbf8f728Jason Sams return tmp; 22964676f3c21a07d650069315572811570cbf8f728Jason Sams } 23064676f3c21a07d650069315572811570cbf8f728Jason Sams return loadU32(); 23164676f3c21a07d650069315572811570cbf8f728Jason Sams} 23264676f3c21a07d650069315572811570cbf8f728Jason Sams 23364676f3c21a07d650069315572811570cbf8f728Jason Samsvoid FileA3D::IO::loadString(String8 *s) 23464676f3c21a07d650069315572811570cbf8f728Jason Sams{ 23564676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("loadString"); 23664676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t len = loadU32(); 23764676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("loadString len %i", len); 23864676f3c21a07d650069315572811570cbf8f728Jason Sams s->setTo((const char *)&mData[mPos], len); 23964676f3c21a07d650069315572811570cbf8f728Jason Sams mPos += len; 24064676f3c21a07d650069315572811570cbf8f728Jason Sams} 24164676f3c21a07d650069315572811570cbf8f728Jason Sams 24264676f3c21a07d650069315572811570cbf8f728Jason Sams 24364676f3c21a07d650069315572811570cbf8f728Jason Samsvoid FileA3D::processChunk_Mesh(Context *rsc, IO *io, A3DIndexEntry *ie) 24464676f3c21a07d650069315572811570cbf8f728Jason Sams{ 245a9e7a05b84470257637c97d65f6562aa832c66efJason Sams Mesh * m = new Mesh(rsc); 24664676f3c21a07d650069315572811570cbf8f728Jason Sams 24764676f3c21a07d650069315572811570cbf8f728Jason Sams m->mPrimitivesCount = io->loadU32(); 24864676f3c21a07d650069315572811570cbf8f728Jason Sams m->mPrimitives = new Mesh::Primitive_t *[m->mPrimitivesCount]; 24964676f3c21a07d650069315572811570cbf8f728Jason Sams 25064676f3c21a07d650069315572811570cbf8f728Jason Sams for (uint32_t ct = 0; ct < m->mPrimitivesCount; ct++) { 25164676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t index = io->loadU32(); 25264676f3c21a07d650069315572811570cbf8f728Jason Sams 25364676f3c21a07d650069315572811570cbf8f728Jason Sams m->mPrimitives[ct] = (Mesh::Primitive_t *)mIndex[index].mRsObj; 25464676f3c21a07d650069315572811570cbf8f728Jason Sams } 25564676f3c21a07d650069315572811570cbf8f728Jason Sams ie->mRsObj = m; 25664676f3c21a07d650069315572811570cbf8f728Jason Sams} 25764676f3c21a07d650069315572811570cbf8f728Jason Sams 25864676f3c21a07d650069315572811570cbf8f728Jason Samsvoid FileA3D::processChunk_Primitive(Context *rsc, IO *io, A3DIndexEntry *ie) 25964676f3c21a07d650069315572811570cbf8f728Jason Sams{ 26064676f3c21a07d650069315572811570cbf8f728Jason Sams Mesh::Primitive_t * p = new Mesh::Primitive_t; 26164676f3c21a07d650069315572811570cbf8f728Jason Sams 26264676f3c21a07d650069315572811570cbf8f728Jason Sams p->mIndexCount = io->loadU32(); 26364676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t vertIdx = io->loadU32(); 2647aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams p->mRestartCounts = io->loadU16(); 26564676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t bits = io->loadU8(); 26664676f3c21a07d650069315572811570cbf8f728Jason Sams p->mType = (RsPrimitive)io->loadU8(); 26764676f3c21a07d650069315572811570cbf8f728Jason Sams 2687aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams LOGE("processChunk_Primitive count %i, bits %i", p->mIndexCount, bits); 2697aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams 27064676f3c21a07d650069315572811570cbf8f728Jason Sams p->mVerticies = (Mesh::Verticies_t *)mIndex[vertIdx].mRsObj; 27164676f3c21a07d650069315572811570cbf8f728Jason Sams 27264676f3c21a07d650069315572811570cbf8f728Jason Sams p->mIndicies = new uint16_t[p->mIndexCount]; 27364676f3c21a07d650069315572811570cbf8f728Jason Sams for (uint32_t ct = 0; ct < p->mIndexCount; ct++) { 27464676f3c21a07d650069315572811570cbf8f728Jason Sams switch(bits) { 27564676f3c21a07d650069315572811570cbf8f728Jason Sams case 8: 27664676f3c21a07d650069315572811570cbf8f728Jason Sams p->mIndicies[ct] = io->loadU8(); 27764676f3c21a07d650069315572811570cbf8f728Jason Sams break; 27864676f3c21a07d650069315572811570cbf8f728Jason Sams case 16: 27964676f3c21a07d650069315572811570cbf8f728Jason Sams p->mIndicies[ct] = io->loadU16(); 28064676f3c21a07d650069315572811570cbf8f728Jason Sams break; 28164676f3c21a07d650069315572811570cbf8f728Jason Sams case 32: 28264676f3c21a07d650069315572811570cbf8f728Jason Sams p->mIndicies[ct] = io->loadU32(); 28364676f3c21a07d650069315572811570cbf8f728Jason Sams break; 28464676f3c21a07d650069315572811570cbf8f728Jason Sams } 2857aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams LOGE(" idx %i", p->mIndicies[ct]); 2867aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams } 2877aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams 2887aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams if (p->mRestartCounts) { 2897aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams p->mRestarts = new uint16_t[p->mRestartCounts]; 2907aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams for (uint32_t ct = 0; ct < p->mRestartCounts; ct++) { 2917aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams switch(bits) { 2927aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams case 8: 2937aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams p->mRestarts[ct] = io->loadU8(); 2947aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams break; 2957aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams case 16: 2967aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams p->mRestarts[ct] = io->loadU16(); 2977aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams break; 2987aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams case 32: 2997aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams p->mRestarts[ct] = io->loadU32(); 3007aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams break; 3017aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams } 3027aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams LOGE(" idx %i", p->mRestarts[ct]); 3037aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams } 3047aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams } else { 3057aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams p->mRestarts = NULL; 30664676f3c21a07d650069315572811570cbf8f728Jason Sams } 30764676f3c21a07d650069315572811570cbf8f728Jason Sams 30864676f3c21a07d650069315572811570cbf8f728Jason Sams ie->mRsObj = p; 30964676f3c21a07d650069315572811570cbf8f728Jason Sams} 31064676f3c21a07d650069315572811570cbf8f728Jason Sams 31164676f3c21a07d650069315572811570cbf8f728Jason Samsvoid FileA3D::processChunk_Verticies(Context *rsc, IO *io, A3DIndexEntry *ie) 31264676f3c21a07d650069315572811570cbf8f728Jason Sams{ 31364676f3c21a07d650069315572811570cbf8f728Jason Sams Mesh::Verticies_t *cv = new Mesh::Verticies_t; 31464676f3c21a07d650069315572811570cbf8f728Jason Sams cv->mAllocationCount = io->loadU32(); 31564676f3c21a07d650069315572811570cbf8f728Jason Sams cv->mAllocations = new Allocation *[cv->mAllocationCount]; 3167aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams LOGE("processChunk_Verticies count %i", cv->mAllocationCount); 31764676f3c21a07d650069315572811570cbf8f728Jason Sams for (uint32_t ct = 0; ct < cv->mAllocationCount; ct++) { 31864676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t i = io->loadU32(); 31964676f3c21a07d650069315572811570cbf8f728Jason Sams cv->mAllocations[ct] = (Allocation *)mIndex[i].mRsObj; 3207aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams LOGE(" idx %i", i); 32164676f3c21a07d650069315572811570cbf8f728Jason Sams } 32264676f3c21a07d650069315572811570cbf8f728Jason Sams ie->mRsObj = cv; 32364676f3c21a07d650069315572811570cbf8f728Jason Sams} 32464676f3c21a07d650069315572811570cbf8f728Jason Sams 32564676f3c21a07d650069315572811570cbf8f728Jason Samsvoid FileA3D::processChunk_Element(Context *rsc, IO *io, A3DIndexEntry *ie) 32664676f3c21a07d650069315572811570cbf8f728Jason Sams{ 327718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams /* 32864676f3c21a07d650069315572811570cbf8f728Jason Sams rsi_ElementBegin(rsc); 32964676f3c21a07d650069315572811570cbf8f728Jason Sams 33064676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t count = io->loadU32(); 33164676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("processChunk_Element count %i", count); 33264676f3c21a07d650069315572811570cbf8f728Jason Sams while (count--) { 33364676f3c21a07d650069315572811570cbf8f728Jason Sams RsDataKind dk = (RsDataKind)io->loadU8(); 33464676f3c21a07d650069315572811570cbf8f728Jason Sams RsDataType dt = (RsDataType)io->loadU8(); 33564676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t bits = io->loadU8(); 33664676f3c21a07d650069315572811570cbf8f728Jason Sams bool isNorm = io->loadU8() != 0; 33764676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE(" %i %i %i %i", dk, dt, bits, isNorm); 33843ee06857bb7f99446d1d84f8789016c5d105558Jason Sams rsi_ElementAdd(rsc, dk, dt, isNorm, bits, 0); 33964676f3c21a07d650069315572811570cbf8f728Jason Sams } 34064676f3c21a07d650069315572811570cbf8f728Jason Sams LOGE("processChunk_Element create"); 34164676f3c21a07d650069315572811570cbf8f728Jason Sams ie->mRsObj = rsi_ElementCreate(rsc); 342718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams */ 34364676f3c21a07d650069315572811570cbf8f728Jason Sams} 34464676f3c21a07d650069315572811570cbf8f728Jason Sams 34564676f3c21a07d650069315572811570cbf8f728Jason Samsvoid FileA3D::processChunk_ElementSource(Context *rsc, IO *io, A3DIndexEntry *ie) 34664676f3c21a07d650069315572811570cbf8f728Jason Sams{ 34764676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t index = io->loadU32(); 34864676f3c21a07d650069315572811570cbf8f728Jason Sams uint32_t count = io->loadU32(); 34964676f3c21a07d650069315572811570cbf8f728Jason Sams 3507aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams LOGE("processChunk_ElementSource count %i, index %i", count, index); 3517aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams 35264676f3c21a07d650069315572811570cbf8f728Jason Sams RsElement e = (RsElement)mIndex[index].mRsObj; 35364676f3c21a07d650069315572811570cbf8f728Jason Sams 35464676f3c21a07d650069315572811570cbf8f728Jason Sams RsAllocation a = rsi_AllocationCreateSized(rsc, e, count); 35564676f3c21a07d650069315572811570cbf8f728Jason Sams Allocation * alloc = static_cast<Allocation *>(a); 35664676f3c21a07d650069315572811570cbf8f728Jason Sams 35764676f3c21a07d650069315572811570cbf8f728Jason Sams float * data = (float *)alloc->getPtr(); 35864676f3c21a07d650069315572811570cbf8f728Jason Sams while(count--) { 35964676f3c21a07d650069315572811570cbf8f728Jason Sams *data = io->loadF(); 3607aa4f3a16355848e3cdf01642aca68416e80fd14Jason Sams LOGE(" %f", *data); 36164676f3c21a07d650069315572811570cbf8f728Jason Sams data++; 36264676f3c21a07d650069315572811570cbf8f728Jason Sams } 36364676f3c21a07d650069315572811570cbf8f728Jason Sams ie->mRsObj = alloc; 36464676f3c21a07d650069315572811570cbf8f728Jason Sams} 36564676f3c21a07d650069315572811570cbf8f728Jason Sams 36664676f3c21a07d650069315572811570cbf8f728Jason Samsnamespace android { 36764676f3c21a07d650069315572811570cbf8f728Jason Samsnamespace renderscript { 36864676f3c21a07d650069315572811570cbf8f728Jason Sams 36964676f3c21a07d650069315572811570cbf8f728Jason Sams 37064676f3c21a07d650069315572811570cbf8f728Jason SamsRsFile rsi_FileOpen(Context *rsc, char const *path, unsigned int len) 37164676f3c21a07d650069315572811570cbf8f728Jason Sams{ 37264676f3c21a07d650069315572811570cbf8f728Jason Sams FileA3D *fa3d = new FileA3D; 37364676f3c21a07d650069315572811570cbf8f728Jason Sams 37464676f3c21a07d650069315572811570cbf8f728Jason Sams FILE *f = fopen("/sdcard/test.a3d", "rb"); 37564676f3c21a07d650069315572811570cbf8f728Jason Sams if (f) { 37664676f3c21a07d650069315572811570cbf8f728Jason Sams fa3d->load(rsc, f); 37764676f3c21a07d650069315572811570cbf8f728Jason Sams fclose(f); 37864676f3c21a07d650069315572811570cbf8f728Jason Sams return fa3d; 37964676f3c21a07d650069315572811570cbf8f728Jason Sams } 38064676f3c21a07d650069315572811570cbf8f728Jason Sams delete fa3d; 38164676f3c21a07d650069315572811570cbf8f728Jason Sams return NULL; 38264676f3c21a07d650069315572811570cbf8f728Jason Sams} 38364676f3c21a07d650069315572811570cbf8f728Jason Sams 38464676f3c21a07d650069315572811570cbf8f728Jason Sams 38564676f3c21a07d650069315572811570cbf8f728Jason Sams} 38664676f3c21a07d650069315572811570cbf8f728Jason Sams} 387