1a89371c6f144b9049efe7689105feee2c4a38384Jason Sams/*
2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *
4a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * you may not use this file except in compliance with the License.
6a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * You may obtain a copy of the License at
7a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *
8a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9a89371c6f144b9049efe7689105feee2c4a38384Jason Sams *
10a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Unless required by applicable law or agreed to in writing, software
11a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * See the License for the specific language governing permissions and
14a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * limitations under the License.
15a89371c6f144b9049efe7689105feee2c4a38384Jason Sams */
16a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
17a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#ifndef ANDROID_RS_MESH_H
18a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#define ANDROID_RS_MESH_H
19a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
20a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
21e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#include "rsObjectBase.h"
22a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
23a89371c6f144b9049efe7689105feee2c4a38384Jason Sams// ---------------------------------------------------------------------------
24a89371c6f144b9049efe7689105feee2c4a38384Jason Samsnamespace android {
25a89371c6f144b9049efe7689105feee2c4a38384Jason Samsnamespace renderscript {
264a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk/*****************************************************************************
274a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * CAUTION
284a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk *
294a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * Any layout changes for this class may require a corresponding change to be
304a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
314a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk * a partial copy of the information below.
324a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk *
334a43e3ea8a0328c56ace0af1869b4c8c781a7b26Alex Sakhartchouk *****************************************************************************/
34a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
35a89371c6f144b9049efe7689105feee2c4a38384Jason Sams// An element is a group of Components that occupies one cell in a structure.
36afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Mesh : public ObjectBase {
37a89371c6f144b9049efe7689105feee2c4a38384Jason Samspublic:
38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct Hal {
39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        mutable void *drv;
40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        struct State {
42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // Contains vertex data
43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // Position, normal, texcoord, etc could either be strided in one allocation
44a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // of provided separetely in multiple ones
45064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            Allocation **vertexBuffers;
46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t vertexBuffersCount;
47a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
48064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            // indexBuffers[i] could be NULL, in which case only primitives[i] is used
49064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            Allocation **indexBuffers;
50064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            uint32_t indexBuffersCount;
51064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk            RsPrimitive *primitives;
52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t primitivesCount;
53a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        };
54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        State state;
55a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    };
56a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    Hal mHal;
57a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
58253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    Mesh(Context *);
59253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
60253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    ~Mesh();
61253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
62e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    virtual void serialize(Context *rsc, OStream *stream) const;
63253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
64253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    static Mesh *createFromStream(Context *rsc, IStream *stream);
65253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk    void init();
66253325d2a19162c1dd18de59c357e36adf4a760bAlex Sakhartchouk
67a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    void setVertexBuffer(Allocation *vb, uint32_t index) {
68064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        mVertexBuffers[index].set(vb);
69064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        mHal.state.vertexBuffers[index] = vb;
70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    void setPrimitive(Allocation *idx, RsPrimitive prim, uint32_t index) {
73064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        mIndexBuffers[index].set(idx);
74064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        mHal.state.indexBuffers[index] = idx;
75064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk        mHal.state.primitives[index] = prim;
76a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
77099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void render(Context *) const;
794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void renderPrimitive(Context *, uint32_t primIndex) const;
804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void renderPrimitiveRange(Context *, uint32_t primIndex, uint32_t start, uint32_t len) const;
814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void uploadAll(Context *);
82b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
83ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    // Bounding volumes
84ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    float mBBoxMin[3];
85ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    float mBBoxMax[3];
86e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    void computeBBox(Context *rsc);
87a89371c6f144b9049efe7689105feee2c4a38384Jason Samsprotected:
88064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    ObjectBaseRef<Allocation> *mVertexBuffers;
89064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    ObjectBaseRef<Allocation> *mIndexBuffers;
90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    bool mInitialized;
91a89371c6f144b9049efe7689105feee2c4a38384Jason Sams};
92a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
93afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass MeshContext {
94a89371c6f144b9049efe7689105feee2c4a38384Jason Samspublic:
95099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    MeshContext() {
96099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    }
97099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    ~MeshContext() {
98099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    }
99a89371c6f144b9049efe7689105feee2c4a38384Jason Sams};
100a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
101a89371c6f144b9049efe7689105feee2c4a38384Jason Sams}
102a89371c6f144b9049efe7689105feee2c4a38384Jason Sams}
103a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif //ANDROID_RS_MESH_H
104a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
105a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
1064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
107