void MeshPose::setPose(std::string aName) { unsigned int index = 0; while (index < m_vNames.size() && m_vNames[index] != aName) { index++; } if (index < m_vNames.size()) { m_ActivePose = index; setPose(index); } resetCompilationFlags(); }
void MeshPose::setPose(unsigned int index) { // this allows for easy cycling between poses if (index >= m_vOffsets.size()) index = index % m_vOffsets.size(); m_ActivePose = index; // if there are offsets if (m_vOffsets.size()) { // add Pose offsets to the Reference pose // and set the result in the vertexdata std::shared_ptr<std::vector<VertexData::Attr>>& vertexData = m_VertexData->getDataOf(VertexData::GetAttribIndex(std::string("position"))); std::vector<vec3> offsets = m_vOffsets[index]->getOffsets(); vec3 v; for (unsigned int i = 0 ; i < vertexData->size(); i++) { v.x = m_ReferencePose[i].x + offsets[i].x; v.y = m_ReferencePose[i].y + offsets[i].y; v.z = m_ReferencePose[i].z + offsets[i].z; vertexData->at(i).set(v.x, v.y, v.z); } } // else set the reference pose else { // similar to above, but without adding the offsets std::shared_ptr<std::vector<VertexData::Attr>>& vertexData = m_VertexData->getDataOf(VertexData::GetAttribIndex(std::string("position"))); vec3 v; for (unsigned int i = 0 ; i < vertexData->size(); i++) { v.x = m_ReferencePose[i].x; v.y = m_ReferencePose[i].y; v.z = m_ReferencePose[i].z; vertexData->at(i).set(v.x, v.y, v.z); } } resetCompilationFlags(); }
void MeshPose::setPose(std::map<unsigned int , float > *influences) { // THIS IS WHERE THE MESH IS SET BASED ON THE POSE INFLUENCES std::vector<VertexData::Attr>& vertexData = m_pVertexData->getDataOf(VertexData::getAttribIndex("position")); vec3 v; std::map<unsigned int , float >::iterator iter; // first set the vertex data to the reference pose for (unsigned int i = 0 ; i < vertexData.size(); i++) { v.x = m_ReferencePose[i].x; v.y = m_ReferencePose[i].y; v.z = m_ReferencePose[i].z; vertexData[i].set(v.x, v.y, v.z); } // for each pose vec4 v2; for (iter = influences->begin(); iter != influences->end(); ++iter) { //SLOG("Pose %d Influence %f", (*iter).first,(*iter).second); std::vector<vec3> offsets = m_vOffsets[(*iter).first]->getOffsets(); for (unsigned int i = 0 ; i < vertexData.size(); i++) { v2.x = offsets[i].x * (*iter).second; v2.y = offsets[i].y * (*iter).second; v2.z = offsets[i].z * (*iter).second; v2.w = 0.0; vertexData[i].add(v2); } } resetCompilationFlags(); }
void MeshPose::setReferencePose() { std::vector<VertexData::Attr>& vertexData = m_pVertexData->getDataOf(VertexData::getAttribIndex("position")); vec3 v; std::map<unsigned int , float >::iterator iter; // set the vertex data to the reference pose for (unsigned int i = 0 ; i < vertexData.size(); i++) { v.x = m_ReferencePose[i].x; v.y = m_ReferencePose[i].y; v.z = m_ReferencePose[i].z; vertexData[i].set(v.x, v.y, v.z); } resetCompilationFlags(); }