1#include "dynamic_mesh.h"
3#include <cgv/math/ftransform.h>
37 for (
idx_type i = bs.blend_shape_index_range[0]; i < bs.blend_shape_index_range[1]; ++i)
42 for (
idx_type i = bs.blend_shape_index_range[0]; i < bs.blend_shape_index_range[1]; i+=2)
57 for (
idx_type i = bs.blend_shape_index_range[0]; i < bs.blend_shape_index_range[1]; ++i)
62 for (
idx_type off = 0, i = bs.blend_shape_index_range[0]; i < bs.blend_shape_index_range[1];
76void dynamic_mesh<T>::set_vertex_weight_mode(vertex_weight_mode mode)
81void dynamic_mesh<T>::begin_vertex_weight_vertex()
83 vertex_weight_index_begins.push_back(uint32_t(vertex_weight_data.size()));
90 return uint32_t(vi * get_nr_joints());
102 case vertex_weight_mode::dense:
103 return uint32_t((vi+1)*get_nr_joints());
104 case vertex_weight_mode::sparse:
106 case vertex_weight_mode::fixed:
115 case vertex_weight_mode::dense:
127void dynamic_mesh<T>::add_vertex_weight_data(T w)
132void dynamic_mesh<T>::add_vertex_weight_index(
idx_type i)
134 vertex_weight_indices.push_back(i);
137size_t dynamic_mesh<T>::get_nr_vertex_weights()
const
142size_t dynamic_mesh<T>::get_nr_vertex_weight_indices()
const
144 return vertex_weight_indices.size();
153 const vec3_type& translation,
const std::vector<vec3_type>& target_spin_vectors)
const
155 std::vector<mat3_type> target_rotations;
156 for (
const auto& sv : target_spin_vectors)
157 target_rotations.push_back(cgv::math::rotate3s<T>(sv));
162 const vec3_type& translation,
const std::vector<mat3_type>& target_rotations)
const
165 std::vector<mat4_type> Is, Ts;
166 mat4_type I = cgv::math::identity4<float>();
168 t = reference_joint_locations.front();
170 Ts.push_back(pose4(target_rotations.front(), t + translation));
172 for (ji = 1; ji < target_rotations.size(); ++ji) {
173 t = reference_joint_locations[ji] - reference_joint_locations[
joint_parents[ji]];
175 Ts.push_back(pose4(target_rotations[ji], t));
178 for (ji = 1; ji < target_rotations.size(); ++ji) {
179 Is[ji] = Is[joint_parents[ji]] * Is[ji];
180 Ts[ji] = Ts[joint_parents[ji]] * Ts[ji];
183 for (ji = 0; ji < target_rotations.size(); ++ji)
184 Ts[ji] = Ts[ji] * inverse(Is[ji]);
195 if (use_parallel_implementation) {
199 std::vector<const vec3_type*> bs_ptrs;
201 for (
size_t bi = blend_shape_offset; bi < weights.size() + blend_shape_offset; ++bi) {
204 assert(bs.blend_shape_data_range[1] - bs.blend_shape_data_range[0] == n);
208#pragma omp parallel for
209 for (
int vi = 0; vi < n; ++vi) {
211 for (
int wi = 0; wi < weights.size(); ++wi)
212 p += weights[wi]*bs_ptrs[wi][vi];
213 this->position(vi) += p;
217 for (
idx_type bi = blend_shape_offset, wi = 0; wi < weights.size(); ++wi, ++bi) {
221 for (
int j=0, i = bs.blend_shape_data_range[0]; i <
int(bs.blend_shape_data_range[1]); ++i, ++j)
225 for (uint32_t i = bs.blend_shape_data_range[0], j = bs.blend_shape_index_range[0]; i < bs.blend_shape_data_range[1]; ++i, ++j)
229 for (uint32_t i = bs.blend_shape_data_range[0], j = bs.blend_shape_index_range[0]; j < bs.blend_shape_index_range[1]; j += 2)
272 std::vector<vec3_type> tmp;
274 tmp = this->positions;
279 for (
size_t pi = 0, wi = 0; pi < P.size(); ++pi) {
288 for (
size_t pi = 0; pi < P.size(); ++pi) {
293 for (
size_t wi = beg; wi < end; ++wi)
299 for (
size_t pi = 0; pi < P.size(); ++pi) {
304 for (
size_t wi = beg; wi < end; ++wi)
fvec< T, N > & col(unsigned j)
reference a column of the matrix as a vector
this header is dependency free