rsMesh.cpp revision ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771
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 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 18a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include "rsContext.h" 19a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 20a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include <GLES/gl.h> 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <GLES2/gl2.h> 22a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include <GLES/glext.h> 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h> 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGl/glext.h> 28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 30fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 32fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 33a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 34e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsMesh::Mesh(Context *rsc) : ObjectBase(rsc) 35a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 36f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 37f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 38a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 39a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers = NULL; 414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBufferCount = 0; 42a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 43a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 44a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMesh::~Mesh() 45a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mVertexBuffers) { 474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mVertexBuffers; 484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mPrimitives) { 514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete mPrimitives[i]; 534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mPrimitives; 554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 56a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 57a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::render(Context *rsc) const 59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 64fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (primIndex >= mPrimitivesCount) { 674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk LOGE("Invalid primitive index"); 684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 72fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mIndexBuffer->getType()->getDimX()); 754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mVertexBuffers[0]->getType()->getDimX()); 794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const 824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (len < 1 || primIndex >= mPrimitivesCount) { 844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 1"); 884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk VertexArray va; 894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->uploadCheck(rsc); 914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct]->getIsBufferObject()) { 924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID()); 934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setActiveBuffer(mVertexBuffers[ct]->getPtr()); 95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->getType()->enableGLVertexBuffer(&va); 974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 2"); 1014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 1024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 1034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->uploadCheck(rsc); 1044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, prim->mIndexBuffer->getBufferObjectID()); 1054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawElements(prim->mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); 1064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 1074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawArrays(prim->mGLPrimitive, start, len); 1084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange"); 1114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) 1154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mVertexBufferCount; ct ++) { 1174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct].get()) { 1184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); 1194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 1234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mIndexBuffer.get()) { 1244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); 1254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::uploadAll"); 1294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::updateGLPrimitives() 1324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 1344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk switch(mPrimitives[i]->mPrimitive) { 1354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_POINT: mPrimitives[i]->mGLPrimitive = GL_POINTS; break; 1364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE: mPrimitives[i]->mGLPrimitive = GL_LINES; break; 1374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE_STRIP: mPrimitives[i]->mGLPrimitive = GL_LINE_STRIP; break; 1384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE: mPrimitives[i]->mGLPrimitive = GL_TRIANGLES; break; 1394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_STRIP: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_STRIP; break; 1404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_FAN: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_FAN; break; 1414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const 1464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Need to identify ourselves 1484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 1494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk String8 name(getName()); 1514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addString(&name); 1524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Store number of vertex streams 1544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(mVertexBufferCount); 1554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mVertexBufferCount; vCount ++) { 1564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[vCount]->serialize(stream); 157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mPrimitivesCount); 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the primitives 161fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU8((uint8_t)prim->mPrimitive); 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(prim->mIndexBuffer.get()) { 1674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(1); 1684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->serialize(stream); 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 1704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk else { 1714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(0); 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 179b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 180b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if(classID != RS_A3D_CLASS_ID_MESH) { 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Mesh * mesh = new Mesh(rsc); 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 187fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 188fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBufferCount = stream->loadU32(); 1924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mesh->mVertexBufferCount) { 1934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers = new ObjectBaseRef<Allocation>[mesh->mVertexBufferCount]; 194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mesh->mVertexBufferCount; vCount ++) { 1964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 1974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers[vCount].set(vertexAlloc); 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 201fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mesh->mPrimitivesCount) { 203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // load all primitives 2064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 2074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t * prim = new Primitive_t; 2084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mPrimitives[pCount] = prim; 209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mPrimitive = (RsPrimitive)stream->loadU8(); 211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Check to see if the index buffer was stored 2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 2144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(isIndexPresent) { 2154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 2164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer.set(indexAlloc); 217fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 218fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->updateGLPrimitives(); 2224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->uploadAll(rsc); 2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mesh; 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 226a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 227ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 228ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 229ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 230ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 231ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Type *bufferType = mVertexBuffers[ct]->getType(); 235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 236ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 237ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(strcmp(bufferElem->getFieldName(ct), "position") == 0) { 239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 241ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 242ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr = (float*)((uint8_t*)mVertexBuffers[ct]->getPtr() + offset); 243ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 244ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 245ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 246ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 247ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(posPtr) { 248ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 249ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 250ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 251ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 252ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 253ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 254ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(!posPtr) { 255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk LOGE("Unable to compute bounding box"); 256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for(uint32_t i = 0; i < numVerts; i ++) { 262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for(uint32_t v = 0; v < vectorSize; v ++) { 263ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 264ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 265ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 266ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 267ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 268ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 269ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 270a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 271a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::MeshContext() 272a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 273a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 274a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 275a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::~MeshContext() 276a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 277a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 278a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 2794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 2804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 2814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2824e9a7a8ded109e16b163789274899447cef02642Alex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, uint32_t vtxCount, uint32_t idxCount) 2834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 2854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 2864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = idxCount; 2884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 2894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < idxCount; ct ++) { 2904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[ct] = new Mesh::Primitive_t; 2914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 2944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 2954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 2974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) 3004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 3034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 3054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) 3084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 3114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mIndexBuffer.set((Allocation *)va); 3134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 3144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 317d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchoukvoid rsi_MeshGetVertexBufferCount(Context *rsc, RsMesh mv, int32_t *numVtx) 318d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 319d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 320d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numVtx = sm->mVertexBufferCount; 321d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 322d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 323d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchoukvoid rsi_MeshGetIndexCount(Context *rsc, RsMesh mv, int32_t *numIdx) 324d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 325d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 326d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numIdx = sm->mPrimitivesCount; 327d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 328d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 329d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchoukvoid rsi_MeshGetVertices(Context *rsc, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) 330d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 331d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 332d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(vtxDataCount == sm->mVertexBufferCount); 333d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 334d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk for(uint32_t ct = 0; ct < vtxDataCount; ct ++) { 335d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk vtxData[ct] = sm->mVertexBuffers[ct].get(); 336d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mVertexBuffers[ct]->incUserRef(); 337d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 338d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 339d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 340d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchoukvoid rsi_MeshGetIndices(Context *rsc, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) 341d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 342d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 343d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(idxDataCount == sm->mPrimitivesCount); 344d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 345d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk for(uint32_t ct = 0; ct < idxDataCount; ct ++) { 346d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk va[ct] = sm->mPrimitives[ct]->mIndexBuffer.get(); 347d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk primType[ct] = sm->mPrimitives[ct]->mPrimitive; 348d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk if(sm->mPrimitives[ct]->mIndexBuffer.get()) { 349d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mPrimitives[ct]->mIndexBuffer->incUserRef(); 350d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 351d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 352d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 353d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 354d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 355d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 356d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 357d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 3584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}} 359