21 const std::vector<std::shared_ptr<Node>>& scene_nodes) {
22 if (!skin.joints() || !skin.inverse_bind_matrices() ||
23 skin.joints()->size() != skin.inverse_bind_matrices()->size()) {
30 result.joints_.reserve(skin.joints()->size());
31 for (
auto joint : *skin.joints()) {
32 if (joint < 0 ||
static_cast<size_t>(joint) > scene_nodes.size()) {
34 result.joints_.push_back(
nullptr);
37 if (scene_nodes[joint]) {
38 scene_nodes[joint]->SetIsJoint(
true);
40 result.joints_.push_back(scene_nodes[joint]);
43 result.inverse_bind_matrices_.reserve(skin.inverse_bind_matrices()->size());
44 for (
size_t matrix_i = 0; matrix_i < skin.inverse_bind_matrices()->size();
46 const auto* ip_matrix = skin.inverse_bind_matrices()->Get(matrix_i);
49 result.inverse_bind_matrices_.push_back(matrix);
51 result.joints_[matrix_i]->SetGlobalTransform(matrix.Invert());
54 return std::make_unique<Skin>(std::move(
result));
68 auto required_pixels = joints_.size() * 4;
69 auto dimension_size = std::max(
76 texture_descriptor.
size = {dimension_size, dimension_size};
80 result->SetLabel(
"Joints Texture");
86 std::vector<Matrix> joints;
89 for (
size_t joint_i = 0; joint_i < joints_.size(); joint_i++) {
90 const Node* joint = joints_[joint_i].get();
98 while (joint && joint->
IsJoint()) {
110 joints[joint_i] = joints[joint_i] * inverse_bind_matrices_[joint_i];
113 if (!
result->SetContents(
reinterpret_cast<uint8_t*
>(joints.data()),
114 joints.size() *
sizeof(
Matrix))) {
115 FML_LOG(
ERROR) <<
"Could not set contents of joint texture.";
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...