rsMesh.cpp revision fb6b614bcea88a587a7ea4530be45ff0ffa0210e
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__; 38a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mVerticies = NULL; 39a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mVerticiesCount = 0; 40a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 41a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 42a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 43a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 44a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMesh::~Mesh() 45a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 46a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 47a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 48fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Mesh::serialize(OStream *stream) const 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 51fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 52fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 54fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mVerticiesCount); 57fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 58fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t vCount = 0; vCount < mVerticiesCount; vCount ++) { 59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Verticies_t *verts = mVerticies[vCount]; 60fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 61fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mAllocationCount); 62fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 63fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t aCount = 0; aCount < verts->mAllocationCount; aCount++) { 64fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mAllocations[aCount]->serialize(stream); 65fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 66fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mVertexDataSize); 67fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 68fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mOffsetCoord); 69fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mOffsetTex); 70fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mOffsetNorm); 71fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 72fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mSizeCoord); 73fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mSizeTex); 74fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(verts->mSizeNorm ); 75fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 76fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mPrimitivesCount); 78fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the primitives 79fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 80fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 81fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 82fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU8((uint8_t)prim->mType); 83fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // We store the index to the vertices 85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // So iterate over our vertices to find which one we point to 86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t vertexIndex = 0; 87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t vCount = 0; vCount < mVerticiesCount; vCount ++) { 88fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(prim->mVerticies == mVerticies[vCount]) { 89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk vertexIndex = vCount; 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk break; 91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 93fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(vertexIndex); 94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(prim->mIndexCount); 96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t ct = 0; ct < prim->mIndexCount; ct++) { 97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU16(prim->mIndicies[ct]); 98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(prim->mRestartCounts); 101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t ct = 0; ct < prim->mRestartCounts; ct++) { 102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU16(prim->mRestarts[ct]); 103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 104fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 106fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DClassID classID = (A3DClassID)stream->loadU32(); 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(classID != A3D_CLASS_ID_MESH) { 112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Mesh * mesh = new Mesh(rsc); 117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mVerticiesCount = stream->loadU32(); 123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mesh->mVerticiesCount) { 124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mVerticies = new Verticies_t *[mesh->mVerticiesCount]; 125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 126fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk else { 127fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mVerticies = NULL; 128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 129fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 130fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t vCount = 0; vCount < mesh->mVerticiesCount; vCount ++) { 131fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Verticies_t *verts = new Verticies_t(); 132fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store our vertices one the mesh 133fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mVerticies[vCount] = verts; 134fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mAllocationCount = stream->loadU32(); 136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mAllocations = new Allocation *[verts->mAllocationCount]; 137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 138fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("processChunk_Verticies count %i", verts->mAllocationCount); 139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t aCount = 0; aCount < verts->mAllocationCount; aCount++) { 140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mAllocations[aCount] = Allocation::createFromStream(rsc, stream); 141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mVertexDataSize = stream->loadU32(); 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mOffsetCoord = stream->loadU32(); 145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mOffsetTex = stream->loadU32(); 146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mOffsetNorm = stream->loadU32(); 147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mSizeCoord = stream->loadU32(); 149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mSizeTex = stream->loadU32(); 150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk verts->mSizeNorm = stream->loadU32(); 151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 152fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mesh->mPrimitivesCount) { 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk else { 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives = NULL; 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 161fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // load all primitives 162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Primitive_t * prim = new Primitive_t; 164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives[pCount] = prim; 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mType = (RsPrimitive)stream->loadU8(); 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // We store the index to the vertices 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t vertexIndex = stream->loadU32(); 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(vertexIndex < mesh->mVerticiesCount) { 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mVerticies = mesh->mVerticies[vertexIndex]; 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk else { 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mVerticies = NULL; 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mIndexCount = stream->loadU32(); 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(prim->mIndexCount){ 179fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mIndicies = new uint16_t[prim->mIndexCount]; 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t ct = 0; ct < prim->mIndexCount; ct++) { 181fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mIndicies[ct] = stream->loadU16(); 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk else { 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mIndicies = NULL; 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 187fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 188fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mRestartCounts = stream->loadU32(); 189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (prim->mRestartCounts) { 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mRestarts = new uint16_t[prim->mRestartCounts]; 191fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t ct = 0; ct < prim->mRestartCounts; ct++) { 192fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mRestarts[ct] = stream->loadU16(); 193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 195fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk else { 197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk prim->mRestarts = NULL; 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 201fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mesh; 203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 204a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 205a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 206a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::MeshContext() 207a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 208a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 209a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 210a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::~MeshContext() 211a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 212a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 213a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 214