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