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