| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_RS_FILE_A3D_H |
| #define ANDROID_RS_FILE_A3D_H |
| |
| #include "RenderScript.h" |
| #include "rsFileA3DDecls.h" |
| #include "rsMesh.h" |
| |
| #include <utils/String8.h> |
| #include <stdio.h> |
| |
| // --------------------------------------------------------------------------- |
| namespace android { |
| namespace renderscript { |
| |
| class FileA3D |
| { |
| public: |
| FileA3D(); |
| ~FileA3D(); |
| |
| uint32_t mMajorVersion; |
| uint32_t mMinorVersion; |
| uint64_t mIndexOffset; |
| uint64_t mStringTableOffset; |
| bool mUse64BitOffsets; |
| |
| struct A3DIndexEntry { |
| String8 mID; |
| A3DChunkType mType; |
| uint64_t mOffset; |
| void * mRsObj; |
| }; |
| |
| bool load(Context *rsc, FILE *f); |
| |
| protected: |
| class IO |
| { |
| public: |
| IO(const uint8_t *, bool use64); |
| |
| float loadF() { |
| mPos = (mPos + 3) & (~3); |
| float tmp = reinterpret_cast<const float *>(&mData[mPos])[0]; |
| mPos += sizeof(float); |
| return tmp; |
| } |
| int32_t loadI32() { |
| mPos = (mPos + 3) & (~3); |
| int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0]; |
| mPos += sizeof(int32_t); |
| return tmp; |
| } |
| uint32_t loadU32() { |
| mPos = (mPos + 3) & (~3); |
| uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0]; |
| mPos += sizeof(uint32_t); |
| return tmp; |
| } |
| uint16_t loadU16() { |
| mPos = (mPos + 1) & (~1); |
| uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0]; |
| mPos += sizeof(uint16_t); |
| return tmp; |
| } |
| uint8_t loadU8() { |
| uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0]; |
| mPos += sizeof(uint8_t); |
| return tmp; |
| } |
| uint64_t loadOffset(); |
| void loadString(String8 *s); |
| uint64_t getPos() const {return mPos;} |
| const uint8_t * getPtr() const; |
| protected: |
| const uint8_t * mData; |
| uint64_t mPos; |
| bool mUse64; |
| }; |
| |
| |
| bool process(Context *rsc); |
| bool processIndex(Context *rsc, A3DIndexEntry *); |
| void processChunk_Mesh(Context *rsc, IO *io, A3DIndexEntry *ie); |
| void processChunk_Primitive(Context *rsc, IO *io, A3DIndexEntry *ie); |
| void processChunk_Verticies(Context *rsc, IO *io, A3DIndexEntry *ie); |
| void processChunk_Element(Context *rsc, IO *io, A3DIndexEntry *ie); |
| void processChunk_ElementSource(Context *rsc, IO *io, A3DIndexEntry *ie); |
| |
| const uint8_t * mData; |
| void * mAlloc; |
| uint64_t mDataSize; |
| Context * mRsc; |
| |
| Vector<A3DIndexEntry> mIndex; |
| Vector<String8> mStrings; |
| Vector<uint32_t> mStringIndexValues; |
| |
| }; |
| |
| |
| } |
| } |
| #endif //ANDROID_RS_FILE_A3D_H |
| |
| |