rsMesh.h revision a04e30dbb5ab11592b03666bb3d102070759c58e
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
21a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include "RenderScript.h"
22a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
23a89371c6f144b9049efe7689105feee2c4a38384Jason Sams// ---------------------------------------------------------------------------
24a89371c6f144b9049efe7689105feee2c4a38384Jason Samsnamespace android {
25a89371c6f144b9049efe7689105feee2c4a38384Jason Samsnamespace renderscript {
26a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
27a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
28a89371c6f144b9049efe7689105feee2c4a38384Jason Sams// An element is a group of Components that occupies one cell in a structure.
29afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Mesh : public ObjectBase {
30a89371c6f144b9049efe7689105feee2c4a38384Jason Samspublic:
31e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Mesh(Context *);
32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
33a89371c6f144b9049efe7689105feee2c4a38384Jason Sams    ~Mesh();
34a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    // Either mIndexBuffer, mPrimitiveBuffer or both could have a NULL reference
364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    // If both are null, mPrimitive only would be used to render the mesh
37a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct Primitive_t {
384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        ObjectBaseRef<Allocation> mIndexBuffer;
394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        RsPrimitive mPrimitive;
40a89371c6f144b9049efe7689105feee2c4a38384Jason Sams    };
41a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    // compatibility to not break the build
43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    ObjectBaseRef<Allocation> *mVertexBuffers;
44a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    uint32_t mVertexBufferCount;
45a5597fcd411badad50c1345b3eca26453da45bbbJason Sams    Primitive_t ** mPrimitives;
46a5597fcd411badad50c1345b3eca26453da45bbbJason Sams    uint32_t mPrimitivesCount;
47a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    // end compatibility
48a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
49099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    virtual void serialize(OStream *stream) const;
50099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
51099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    static Mesh *createFromStream(Context *rsc, IStream *stream);
52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    void init();
53a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct Hal {
55a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        mutable void *drv;
56a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
57a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        struct State {
58a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // Contains vertex data
59a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // Position, normal, texcoord, etc could either be strided in one allocation
60a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            // of provided separetely in multiple ones
61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            ObjectBaseRef<Allocation> *vertexBuffers;
62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t vertexBuffersCount;
63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            Primitive_t ** primitives;
65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk            uint32_t primitivesCount;
66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        };
67a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        State state;
68a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    };
69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    Hal mHal;
70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    void setVertexBuffer(Allocation *vb, uint32_t index) {
72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        mHal.state.vertexBuffers[index].set(vb);
73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
74a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    void setPrimitive(Allocation *idx, RsPrimitive prim, uint32_t index) {
76a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        mHal.state.primitives[index]->mIndexBuffer.set(idx);
77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        mHal.state.primitives[index]->mPrimitive = prim;
78a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void render(Context *) const;
814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void renderPrimitive(Context *, uint32_t primIndex) const;
824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void renderPrimitiveRange(Context *, uint32_t primIndex, uint32_t start, uint32_t len) const;
834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void uploadAll(Context *);
84b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
85ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    // Bounding volumes
86ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    float mBBoxMin[3];
87ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    float mBBoxMax[3];
88ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    void computeBBox();
89a89371c6f144b9049efe7689105feee2c4a38384Jason Samsprotected:
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