164676f3c21a07d650069315572811570cbf8f728Jason Sams/*
264676f3c21a07d650069315572811570cbf8f728Jason Sams * Copyright (C) 2009 The Android Open Source Project
364676f3c21a07d650069315572811570cbf8f728Jason Sams *
464676f3c21a07d650069315572811570cbf8f728Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
564676f3c21a07d650069315572811570cbf8f728Jason Sams * you may not use this file except in compliance with the License.
664676f3c21a07d650069315572811570cbf8f728Jason Sams * You may obtain a copy of the License at
764676f3c21a07d650069315572811570cbf8f728Jason Sams *
864676f3c21a07d650069315572811570cbf8f728Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
964676f3c21a07d650069315572811570cbf8f728Jason Sams *
1064676f3c21a07d650069315572811570cbf8f728Jason Sams * Unless required by applicable law or agreed to in writing, software
1164676f3c21a07d650069315572811570cbf8f728Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1264676f3c21a07d650069315572811570cbf8f728Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1364676f3c21a07d650069315572811570cbf8f728Jason Sams * See the License for the specific language governing permissions and
1464676f3c21a07d650069315572811570cbf8f728Jason Sams * limitations under the License.
1564676f3c21a07d650069315572811570cbf8f728Jason Sams */
1664676f3c21a07d650069315572811570cbf8f728Jason Sams
1764676f3c21a07d650069315572811570cbf8f728Jason Sams#ifndef ANDROID_RS_FILE_A3D_H
1864676f3c21a07d650069315572811570cbf8f728Jason Sams#define ANDROID_RS_FILE_A3D_H
1964676f3c21a07d650069315572811570cbf8f728Jason Sams
2064676f3c21a07d650069315572811570cbf8f728Jason Sams#include "RenderScript.h"
2164676f3c21a07d650069315572811570cbf8f728Jason Sams#include "rsFileA3DDecls.h"
2264676f3c21a07d650069315572811570cbf8f728Jason Sams#include "rsMesh.h"
2364676f3c21a07d650069315572811570cbf8f728Jason Sams
2464676f3c21a07d650069315572811570cbf8f728Jason Sams#include <utils/String8.h>
2564676f3c21a07d650069315572811570cbf8f728Jason Sams#include <stdio.h>
2664676f3c21a07d650069315572811570cbf8f728Jason Sams
2764676f3c21a07d650069315572811570cbf8f728Jason Sams// ---------------------------------------------------------------------------
2864676f3c21a07d650069315572811570cbf8f728Jason Samsnamespace android {
2964676f3c21a07d650069315572811570cbf8f728Jason Samsnamespace renderscript {
3064676f3c21a07d650069315572811570cbf8f728Jason Sams
3164676f3c21a07d650069315572811570cbf8f728Jason Samsclass FileA3D
3264676f3c21a07d650069315572811570cbf8f728Jason Sams{
3364676f3c21a07d650069315572811570cbf8f728Jason Samspublic:
3464676f3c21a07d650069315572811570cbf8f728Jason Sams    FileA3D();
3564676f3c21a07d650069315572811570cbf8f728Jason Sams    ~FileA3D();
3664676f3c21a07d650069315572811570cbf8f728Jason Sams
3764676f3c21a07d650069315572811570cbf8f728Jason Sams    uint32_t mMajorVersion;
3864676f3c21a07d650069315572811570cbf8f728Jason Sams    uint32_t mMinorVersion;
3964676f3c21a07d650069315572811570cbf8f728Jason Sams    uint64_t mIndexOffset;
4064676f3c21a07d650069315572811570cbf8f728Jason Sams    uint64_t mStringTableOffset;
4164676f3c21a07d650069315572811570cbf8f728Jason Sams    bool mUse64BitOffsets;
4264676f3c21a07d650069315572811570cbf8f728Jason Sams
4364676f3c21a07d650069315572811570cbf8f728Jason Sams    struct A3DIndexEntry {
4464676f3c21a07d650069315572811570cbf8f728Jason Sams        String8 mID;
4564676f3c21a07d650069315572811570cbf8f728Jason Sams        A3DChunkType mType;
4664676f3c21a07d650069315572811570cbf8f728Jason Sams        uint64_t mOffset;
4764676f3c21a07d650069315572811570cbf8f728Jason Sams        void * mRsObj;
4864676f3c21a07d650069315572811570cbf8f728Jason Sams    };
4964676f3c21a07d650069315572811570cbf8f728Jason Sams
5064676f3c21a07d650069315572811570cbf8f728Jason Sams    bool load(Context *rsc, FILE *f);
5164676f3c21a07d650069315572811570cbf8f728Jason Sams
5264676f3c21a07d650069315572811570cbf8f728Jason Samsprotected:
5364676f3c21a07d650069315572811570cbf8f728Jason Sams    class IO
5464676f3c21a07d650069315572811570cbf8f728Jason Sams    {
5564676f3c21a07d650069315572811570cbf8f728Jason Sams    public:
5664676f3c21a07d650069315572811570cbf8f728Jason Sams        IO(const uint8_t *, bool use64);
5764676f3c21a07d650069315572811570cbf8f728Jason Sams
5864676f3c21a07d650069315572811570cbf8f728Jason Sams        float loadF() {
5964676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos = (mPos + 3) & (~3);
6064676f3c21a07d650069315572811570cbf8f728Jason Sams            float tmp = reinterpret_cast<const float *>(&mData[mPos])[0];
6164676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos += sizeof(float);
6264676f3c21a07d650069315572811570cbf8f728Jason Sams            return tmp;
6364676f3c21a07d650069315572811570cbf8f728Jason Sams        }
6464676f3c21a07d650069315572811570cbf8f728Jason Sams        int32_t loadI32() {
6564676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos = (mPos + 3) & (~3);
6664676f3c21a07d650069315572811570cbf8f728Jason Sams            int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0];
6764676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos += sizeof(int32_t);
6864676f3c21a07d650069315572811570cbf8f728Jason Sams            return tmp;
6964676f3c21a07d650069315572811570cbf8f728Jason Sams        }
7064676f3c21a07d650069315572811570cbf8f728Jason Sams        uint32_t loadU32() {
7164676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos = (mPos + 3) & (~3);
7264676f3c21a07d650069315572811570cbf8f728Jason Sams            uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0];
7364676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos += sizeof(uint32_t);
7464676f3c21a07d650069315572811570cbf8f728Jason Sams            return tmp;
7564676f3c21a07d650069315572811570cbf8f728Jason Sams        }
7664676f3c21a07d650069315572811570cbf8f728Jason Sams        uint16_t loadU16() {
7764676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos = (mPos + 1) & (~1);
7864676f3c21a07d650069315572811570cbf8f728Jason Sams            uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0];
7964676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos += sizeof(uint16_t);
8064676f3c21a07d650069315572811570cbf8f728Jason Sams            return tmp;
8164676f3c21a07d650069315572811570cbf8f728Jason Sams        }
8264676f3c21a07d650069315572811570cbf8f728Jason Sams        uint8_t loadU8() {
8364676f3c21a07d650069315572811570cbf8f728Jason Sams            uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0];
8464676f3c21a07d650069315572811570cbf8f728Jason Sams            mPos += sizeof(uint8_t);
8564676f3c21a07d650069315572811570cbf8f728Jason Sams            return tmp;
8664676f3c21a07d650069315572811570cbf8f728Jason Sams        }
8764676f3c21a07d650069315572811570cbf8f728Jason Sams        uint64_t loadOffset();
8864676f3c21a07d650069315572811570cbf8f728Jason Sams        void loadString(String8 *s);
8964676f3c21a07d650069315572811570cbf8f728Jason Sams        uint64_t getPos() const {return mPos;}
9064676f3c21a07d650069315572811570cbf8f728Jason Sams        const uint8_t * getPtr() const;
9164676f3c21a07d650069315572811570cbf8f728Jason Sams    protected:
9264676f3c21a07d650069315572811570cbf8f728Jason Sams        const uint8_t * mData;
9364676f3c21a07d650069315572811570cbf8f728Jason Sams        uint64_t mPos;
9464676f3c21a07d650069315572811570cbf8f728Jason Sams        bool mUse64;
9564676f3c21a07d650069315572811570cbf8f728Jason Sams    };
9664676f3c21a07d650069315572811570cbf8f728Jason Sams
9764676f3c21a07d650069315572811570cbf8f728Jason Sams
9864676f3c21a07d650069315572811570cbf8f728Jason Sams    bool process(Context *rsc);
9964676f3c21a07d650069315572811570cbf8f728Jason Sams    bool processIndex(Context *rsc, A3DIndexEntry *);
10064676f3c21a07d650069315572811570cbf8f728Jason Sams    void processChunk_Mesh(Context *rsc, IO *io, A3DIndexEntry *ie);
10164676f3c21a07d650069315572811570cbf8f728Jason Sams    void processChunk_Primitive(Context *rsc, IO *io, A3DIndexEntry *ie);
10264676f3c21a07d650069315572811570cbf8f728Jason Sams    void processChunk_Verticies(Context *rsc, IO *io, A3DIndexEntry *ie);
10364676f3c21a07d650069315572811570cbf8f728Jason Sams    void processChunk_Element(Context *rsc, IO *io, A3DIndexEntry *ie);
10464676f3c21a07d650069315572811570cbf8f728Jason Sams    void processChunk_ElementSource(Context *rsc, IO *io, A3DIndexEntry *ie);
10564676f3c21a07d650069315572811570cbf8f728Jason Sams
10664676f3c21a07d650069315572811570cbf8f728Jason Sams    const uint8_t * mData;
10764676f3c21a07d650069315572811570cbf8f728Jason Sams    void * mAlloc;
10864676f3c21a07d650069315572811570cbf8f728Jason Sams    uint64_t mDataSize;
10964676f3c21a07d650069315572811570cbf8f728Jason Sams    Context * mRsc;
11064676f3c21a07d650069315572811570cbf8f728Jason Sams
11164676f3c21a07d650069315572811570cbf8f728Jason Sams    Vector<A3DIndexEntry> mIndex;
11264676f3c21a07d650069315572811570cbf8f728Jason Sams    Vector<String8> mStrings;
11364676f3c21a07d650069315572811570cbf8f728Jason Sams    Vector<uint32_t> mStringIndexValues;
11464676f3c21a07d650069315572811570cbf8f728Jason Sams
11564676f3c21a07d650069315572811570cbf8f728Jason Sams};
11664676f3c21a07d650069315572811570cbf8f728Jason Sams
11764676f3c21a07d650069315572811570cbf8f728Jason Sams
11864676f3c21a07d650069315572811570cbf8f728Jason Sams}
11964676f3c21a07d650069315572811570cbf8f728Jason Sams}
12064676f3c21a07d650069315572811570cbf8f728Jason Sams#endif //ANDROID_RS_FILE_A3D_H
12164676f3c21a07d650069315572811570cbf8f728Jason Sams
12264676f3c21a07d650069315572811570cbf8f728Jason Sams
123