rsMesh.h revision 099d7d33e55afeb3399f6e8cf8d665223ca94939
1a89371c6f144b9049efe7689105feee2c4a38384Jason Sams/*
2a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Copyright (C) 2009 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 *);
32a89371c6f144b9049efe7689105feee2c4a38384Jason Sams    ~Mesh();
33a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    // Contains vertex data
354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    // Position, normal, texcoord, etc could either be strided in one allocation
364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    // of provided separetely in multiple ones
374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    ObjectBaseRef<Allocation> *mVertexBuffers;
384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    uint32_t mVertexBufferCount;
394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    // Either mIndexBuffer, mPrimitiveBuffer or both could have a NULL reference
414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    // If both are null, mPrimitive only would be used to render the mesh
42a89371c6f144b9049efe7689105feee2c4a38384Jason Sams    struct Primitive_t
43a89371c6f144b9049efe7689105feee2c4a38384Jason Sams    {
444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        ObjectBaseRef<Allocation> mIndexBuffer;
45b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams
464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        RsPrimitive mPrimitive;
474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        uint32_t mGLPrimitive;
48a89371c6f144b9049efe7689105feee2c4a38384Jason Sams    };
49a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
50a5597fcd411badad50c1345b3eca26453da45bbbJason Sams    Primitive_t ** mPrimitives;
51a5597fcd411badad50c1345b3eca26453da45bbbJason Sams    uint32_t mPrimitivesCount;
52a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
53099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    virtual void serialize(OStream *stream) const;
54099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
55099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    static Mesh *createFromStream(Context *rsc, IStream *stream);
56099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
57099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void render(Context *) const;
594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void renderPrimitive(Context *, uint32_t primIndex) const;
604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void renderPrimitiveRange(Context *, uint32_t primIndex, uint32_t start, uint32_t len) const;
614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void uploadAll(Context *);
624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    void updateGLPrimitives();
634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
64099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
65b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
66ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    // Bounding volumes
67ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    float mBBoxMin[3];
68ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    float mBBoxMax[3];
69ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    void computeBBox();
70ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
7154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    void initVertexAttribs();
7254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
73a89371c6f144b9049efe7689105feee2c4a38384Jason Samsprotected:
7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    bool isValidGLComponent(const Element *elem, uint32_t fieldIdx);
7554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    // Attribues that allow us to map to GL
7654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    VertexArray::Attrib *mAttribs;
7754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    // This allows us to figure out which allocation the attribute
7854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    // belongs to. In the event the allocation is uploaded to GL
7954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    // buffer, it lets us properly map it
8054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    uint32_t *mAttribAllocationIndex;
8154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    uint32_t mAttribCount;
82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif
83a89371c6f144b9049efe7689105feee2c4a38384Jason Sams};
84a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
85afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass MeshContext {
86a89371c6f144b9049efe7689105feee2c4a38384Jason Samspublic:
87099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    MeshContext() {
88099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    }
89099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    ~MeshContext() {
90099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk    }
91a89371c6f144b9049efe7689105feee2c4a38384Jason Sams};
92a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
93a89371c6f144b9049efe7689105feee2c4a38384Jason Sams}
94a89371c6f144b9049efe7689105feee2c4a38384Jason Sams}
95a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#endif //ANDROID_RS_TRIANGLE_MESH_H
96a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
97a89371c6f144b9049efe7689105feee2c4a38384Jason Sams
984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
99