@@ -1155,5 +1155,77 @@ void updateTexture(const String& name, InputArray image)
11551155 CV_Assert (tex);
11561156 _createTexture (name, image.getMat ());
11571157}
1158+
1159+ void loadMesh (const String& filename, OutputArray vertices, OutputArray indices, OutputArray normals, OutputArray colors, OutputArray texCoords)
1160+ {
1161+ CV_Assert (_app);
1162+
1163+ auto mesh = MeshManager::getSingleton ().load (filename, RESOURCEGROUP_NAME);
1164+ auto smeshes = mesh->getSubMeshes ();
1165+ CV_Assert (smeshes.size () == 1 );
1166+
1167+ auto smesh = smeshes.front ();
1168+
1169+ CV_Assert (smesh->operationType == RenderOperation::OT_TRIANGLE_LIST);
1170+
1171+ if (auto ibuf = smesh->indexData ->indexBuffer )
1172+ {
1173+ auto idtype = ibuf->getType () == HardwareIndexBuffer::IT_16BIT ? CV_16S : CV_32S;
1174+ auto imat = Mat (smesh->indexData ->indexCount , 3 , idtype);
1175+ ibuf->readData (0 , ibuf->getSizeInBytes (), imat.ptr ());
1176+ imat.copyTo (indices);
1177+ }
1178+
1179+ auto vertexData = smesh->useSharedVertices ? mesh->sharedVertexData : smesh->vertexData ;
1180+ DefaultHardwareBufferManagerBase swhbm;
1181+
1182+ // download all buffers to CPU for reorganization
1183+ auto tmpVertexData = vertexData->clone (true , &swhbm);
1184+ auto tgtDecl = swhbm.createVertexDeclaration ();
1185+ tgtDecl->addElement (0 , 0 , VET_FLOAT3, VES_POSITION); // separate position buffer
1186+
1187+ bool has_normals = vertexData->vertexDeclaration ->findElementBySemantic (VES_NORMAL);
1188+ bool has_texcoords = vertexData->vertexDeclaration ->findElementBySemantic (VES_TEXTURE_COORDINATES);
1189+ bool has_colors = vertexData->vertexDeclaration ->findElementBySemantic (VES_DIFFUSE);
1190+ if (has_normals)
1191+ tgtDecl->addElement (1 , 0 , VET_FLOAT3, VES_NORMAL); // separate normal buffer
1192+ if (has_texcoords)
1193+ tgtDecl->addElement (2 , 0 , VET_FLOAT2, VES_TEXTURE_COORDINATES); // separate texcoord buffer
1194+ if (has_colors)
1195+ tgtDecl->addElement (3 , 0 , VET_UBYTE4_NORM, VES_DIFFUSE); // separate color buffer
1196+
1197+ tmpVertexData->reorganiseBuffers (tgtDecl);
1198+
1199+ // copy data
1200+ auto vertmat = Mat (vertexData->vertexCount , 3 , CV_32F);
1201+ auto posbuf = tmpVertexData->vertexBufferBinding ->getBuffer (0 );
1202+ posbuf->readData (0 , posbuf->getSizeInBytes (), vertmat.ptr ());
1203+ vertmat.copyTo (vertices);
1204+
1205+ if (has_normals && normals.needed ())
1206+ {
1207+ auto normmat = Mat (vertexData->vertexCount , 3 , CV_32F);
1208+ auto nbuf = tmpVertexData->vertexBufferBinding ->getBuffer (1 );
1209+ nbuf->readData (0 , nbuf->getSizeInBytes (), normmat.ptr ());
1210+ normmat.copyTo (normals);
1211+ }
1212+
1213+ if (has_texcoords && texCoords.needed ())
1214+ {
1215+ auto texmat = Mat (vertexData->vertexCount , 2 , CV_32F);
1216+ auto tbuf = tmpVertexData->vertexBufferBinding ->getBuffer (2 );
1217+ tbuf->readData (0 , tbuf->getSizeInBytes (), texmat.ptr ());
1218+ texmat.copyTo (texCoords);
1219+ }
1220+
1221+ if (has_colors && colors.needed ())
1222+ {
1223+ auto colmat = Mat (vertexData->vertexCount , 4 , CV_8U);
1224+ auto cbuf = tmpVertexData->vertexBufferBinding ->getBuffer (3 );
1225+ cbuf->readData (0 , cbuf->getSizeInBytes (), colmat.ptr ());
1226+ colmat.copyTo (colors);
1227+ }
1228+ }
1229+
11581230}
11591231}
0 commit comments