void Rendering::Mesh::updatePositions(FEMMesh* inputMesh) { const TVecCoord& in = inputMesh->positions; TVecCoord& out = m_vertices; if (d_map_f.size() != out.size() || d_map_i.size() != out.size()) return; DEVICE_METHOD(TetraMapper3f_apply)( out.size(), d_map_i.deviceRead(), d_map_f.deviceRead(), out.deviceWrite(), in.deviceRead() ); const GLvoid * pointer = NULL; pointer = this->m_vertices.hostRead(); glBindBuffer(GL_ARRAY_BUFFER, d_VBO); glBufferData(GL_ARRAY_BUFFER, this->m_vertices.size() * sizeof(TCoord), NULL, GL_STREAM_DRAW); // Buffer orphaning, a common way to improve streaming perf. See above link for details. glBufferSubData(GL_ARRAY_BUFFER, 0, this->m_vertices.size() * sizeof(TCoord), pointer ); /*for (unsigned int i=0;i<out.size();++i) { out[i] = in[map_i[i][0]] * map_f[i][0] + in[map_i[i][1]] * map_f[i][1] + in[map_i[i][2]] * map_f[i][2] + in[map_i[i][3]] * map_f[i][3]; }*/ }
void SurfaceMesh::updatePositions(FEMMesh* inputMesh) { const TVecCoord& in = inputMesh->positions; TVecCoord& out = positions; if (map_f.size() != out.size() || map_i.size() != out.size()) return; DEVICE_METHOD(TetraMapper3f_apply)( out.size(), map_i.deviceRead(), map_f.deviceRead(), out.deviceWrite(), in.deviceRead() ); /*for (unsigned int i=0;i<out.size();++i) { out[i] = in[map_i[i][0]] * map_f[i][0] + in[map_i[i][1]] * map_f[i][1] + in[map_i[i][2]] * map_f[i][2] + in[map_i[i][3]] * map_f[i][3]; }*/ }