rsMesh.cpp revision dc763f345db3e796efc28dc4b4d8edffda5a803e
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{ 36a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 37a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers = NULL; 394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBufferCount = 0; 40a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 41a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 42a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMesh::~Mesh() 43a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mVertexBuffers) { 454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mVertexBuffers; 464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mPrimitives) { 494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete mPrimitives[i]; 514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mPrimitives; 534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 54a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 55a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::render(Context *rsc) const 57fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 62fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (primIndex >= mPrimitivesCount) { 654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk LOGE("Invalid primitive index"); 664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mIndexBuffer->getType()->getDimX()); 734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 75fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mVertexBuffers[0]->getType()->getDimX()); 774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 78fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const 804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (len < 1 || primIndex >= mPrimitivesCount) { 824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 1"); 864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk VertexArray va; 874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->uploadCheck(rsc); 894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct]->getIsBufferObject()) { 904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID()); 914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setActiveBuffer(mVertexBuffers[ct]->getPtr()); 93fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->getType()->enableGLVertexBuffer(&va); 954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 2"); 994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 1004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 1014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->uploadCheck(rsc); 1024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, prim->mIndexBuffer->getBufferObjectID()); 1034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawElements(prim->mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); 1044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 1054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawArrays(prim->mGLPrimitive, start, len); 1064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange"); 1094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) 1134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mVertexBufferCount; ct ++) { 1154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct].get()) { 1164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); 1174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 1214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mIndexBuffer.get()) { 1224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); 1234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::updateGLPrimitives() 1284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 1304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk switch(mPrimitives[i]->mPrimitive) { 1314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_POINT: mPrimitives[i]->mGLPrimitive = GL_POINTS; break; 1324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE: mPrimitives[i]->mGLPrimitive = GL_LINES; break; 1334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE_STRIP: mPrimitives[i]->mGLPrimitive = GL_LINE_STRIP; break; 1344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE: mPrimitives[i]->mGLPrimitive = GL_TRIANGLES; break; 1354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_STRIP: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_STRIP; break; 1364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_FAN: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_FAN; break; 1374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const 1424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Need to identify ourselves 1444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 1454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk String8 name(getName()); 1474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addString(&name); 1484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Store number of vertex streams 1504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(mVertexBufferCount); 1514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mVertexBufferCount; vCount ++) { 1524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[vCount]->serialize(stream); 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mPrimitivesCount); 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the primitives 157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU8((uint8_t)prim->mPrimitive); 161fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(prim->mIndexBuffer.get()) { 1634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(1); 1644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->serialize(stream); 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 1664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk else { 1674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(0); 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 175b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 176b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if(classID != RS_A3D_CLASS_ID_MESH) { 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 179fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Mesh * mesh = new Mesh(rsc); 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBufferCount = stream->loadU32(); 1884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mesh->mVertexBufferCount) { 1894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers = new ObjectBaseRef<Allocation>[mesh->mVertexBufferCount]; 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mesh->mVertexBufferCount; vCount ++) { 1924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 1934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers[vCount].set(vertexAlloc); 194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 195fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mesh->mPrimitivesCount) { 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // load all primitives 2024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 2034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t * prim = new Primitive_t; 2044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mPrimitives[pCount] = prim; 205fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mPrimitive = (RsPrimitive)stream->loadU8(); 207fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Check to see if the index buffer was stored 2094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 2104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(isIndexPresent) { 2114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer.set(indexAlloc); 213fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 215fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 216fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->updateGLPrimitives(); 2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->uploadAll(rsc); 2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mesh; 221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 222a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 223ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 224ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 225ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 226ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 227ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 228ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 229ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 230ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Type *bufferType = mVertexBuffers[ct]->getType(); 231ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(strcmp(bufferElem->getFieldName(ct), "position") == 0) { 235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 236ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 237ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr = (float*)((uint8_t*)mVertexBuffers[ct]->getPtr() + offset); 239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 241ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 242ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 243ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(posPtr) { 244ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 245ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 246ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 247ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 248ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 249ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 250ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(!posPtr) { 251ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk LOGE("Unable to compute bounding box"); 252ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 253ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 254ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for(uint32_t i = 0; i < numVerts; i ++) { 258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for(uint32_t v = 0; v < vectorSize; v ++) { 259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 263ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 264ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 265ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 266a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 267a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::MeshContext() 268a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 269a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 270a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 271a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::~MeshContext() 272a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 273a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 274a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 2754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 2764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 2774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2784e9a7a8ded109e16b163789274899447cef02642Alex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, uint32_t vtxCount, uint32_t idxCount) 2794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 2814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 2824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = idxCount; 2844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 2854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < idxCount; ct ++) { 2864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[ct] = new Mesh::Primitive_t; 2874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 2904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 2914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 2934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) 2964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 2984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 2994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 3014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) 3044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 3074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mIndexBuffer.set((Allocation *)va); 3094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 3104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 313dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 314dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 315dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) 316d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 317d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 318d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numVtx = sm->mVertexBufferCount; 319d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 320d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 321dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) 322d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 323d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 324d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numIdx = sm->mPrimitivesCount; 325d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 326d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 327dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) 328d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 329d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 330d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(vtxDataCount == sm->mVertexBufferCount); 331d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 332d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk for(uint32_t ct = 0; ct < vtxDataCount; ct ++) { 333d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk vtxData[ct] = sm->mVertexBuffers[ct].get(); 334d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mVertexBuffers[ct]->incUserRef(); 335d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 336d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 337d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 338dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) 339d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 340d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 341d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(idxDataCount == sm->mPrimitivesCount); 342d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 343d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk for(uint32_t ct = 0; ct < idxDataCount; ct ++) { 344d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk va[ct] = sm->mPrimitives[ct]->mIndexBuffer.get(); 345d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk primType[ct] = sm->mPrimitives[ct]->mPrimitive; 346d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk if(sm->mPrimitives[ct]->mIndexBuffer.get()) { 347d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mPrimitives[ct]->mIndexBuffer->incUserRef(); 348d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 349d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 350d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 351d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 352