Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use LocalVector for skeleton #97744

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions drivers/gles3/storage/mesh_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2201,7 +2201,7 @@ void MeshStorage::skeleton_allocate_data(RID p_skeleton, int p_bones, bool p_2d_
glBindTexture(GL_TEXTURE_2D, 0);
GLES3::Utilities::get_singleton()->texture_allocated_data(skeleton->transforms_texture, skeleton->data.size() * sizeof(float), "Skeleton transforms texture");

memset(skeleton->data.ptrw(), 0, skeleton->data.size() * sizeof(float));
memset(skeleton->data.ptr(), 0, skeleton->data.size() * sizeof(float));

_skeleton_make_dirty(skeleton);
}
Expand Down Expand Up @@ -2232,7 +2232,7 @@ void MeshStorage::skeleton_bone_set_transform(RID p_skeleton, int p_bone, const
ERR_FAIL_INDEX(p_bone, skeleton->size);
ERR_FAIL_COND(skeleton->use_2d);

float *dataptr = skeleton->data.ptrw() + p_bone * 12;
float *dataptr = skeleton->data.ptr() + p_bone * 12;

dataptr[0] = p_transform.basis.rows[0][0];
dataptr[1] = p_transform.basis.rows[0][1];
Expand Down Expand Up @@ -2284,7 +2284,7 @@ void MeshStorage::skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, con
ERR_FAIL_INDEX(p_bone, skeleton->size);
ERR_FAIL_COND(!skeleton->use_2d);

float *dataptr = skeleton->data.ptrw() + p_bone * 8;
float *dataptr = skeleton->data.ptr() + p_bone * 8;

dataptr[0] = p_transform.columns[0][0];
dataptr[1] = p_transform.columns[1][0];
Expand Down
2 changes: 1 addition & 1 deletion drivers/gles3/storage/mesh_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ struct Skeleton {
bool use_2d = false;
int size = 0;
int height = 0;
Vector<float> data;
LocalVector<float> data;

bool dirty = false;
Skeleton *dirty_list = nullptr;
Expand Down
44 changes: 22 additions & 22 deletions scene/2d/skeleton_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ void Bone2D::_notification(int p_what) {

case NOTIFICATION_EXIT_TREE: {
if (skeleton) {
for (int i = 0; i < skeleton->bones.size(); i++) {
for (uint32_t i = 0; i < skeleton->bones.size(); i++) {
if (skeleton->bones[i].bone == this) {
skeleton->bones.remove_at(i);
break;
Expand Down Expand Up @@ -555,17 +555,17 @@ void Skeleton2D::_update_bone_setup() {

bones.sort(); //sorting so that they are always in the same order/index

for (int i = 0; i < bones.size(); i++) {
bones.write[i].rest_inverse = bones[i].bone->get_skeleton_rest().affine_inverse(); //bind pose
bones.write[i].bone->skeleton_index = i;
for (uint32_t i = 0; i < bones.size(); i++) {
bones[i].rest_inverse = bones[i].bone->get_skeleton_rest().affine_inverse(); //bind pose
bones[i].bone->skeleton_index = i;
Bone2D *parent_bone = Object::cast_to<Bone2D>(bones[i].bone->get_parent());
if (parent_bone) {
bones.write[i].parent_index = parent_bone->skeleton_index;
bones[i].parent_index = parent_bone->skeleton_index;
} else {
bones.write[i].parent_index = -1;
bones[i].parent_index = -1;
}

bones.write[i].local_pose_override = bones[i].bone->get_skeleton_rest();
bones[i].local_pose_override = bones[i].bone->get_skeleton_rest();
}

transform_dirty = true;
Expand Down Expand Up @@ -594,16 +594,16 @@ void Skeleton2D::_update_transform() {

transform_dirty = false;

for (int i = 0; i < bones.size(); i++) {
ERR_CONTINUE(bones[i].parent_index >= i);
for (uint32_t i = 0; i < bones.size(); i++) {
ERR_CONTINUE(bones[i].parent_index >= (int)i);
if (bones[i].parent_index >= 0) {
bones.write[i].accum_transform = bones[bones[i].parent_index].accum_transform * bones[i].bone->get_transform();
bones[i].accum_transform = bones[bones[i].parent_index].accum_transform * bones[i].bone->get_transform();
} else {
bones.write[i].accum_transform = bones[i].bone->get_transform();
bones[i].accum_transform = bones[i].bone->get_transform();
}
}

for (int i = 0; i < bones.size(); i++) {
for (uint32_t i = 0; i < bones.size(); i++) {
Transform2D final_xform = bones[i].accum_transform * bones[i].rest_inverse;
RS::get_singleton()->skeleton_bone_set_transform_2d(skeleton, i, final_xform);
}
Expand All @@ -621,7 +621,7 @@ int Skeleton2D::get_bone_count() const {

Bone2D *Skeleton2D::get_bone(int p_idx) {
ERR_FAIL_COND_V(!is_inside_tree(), nullptr);
ERR_FAIL_INDEX_V(p_idx, bones.size(), nullptr);
ERR_FAIL_INDEX_V(p_idx, (int)bones.size(), nullptr);

return bones[p_idx].bone;
}
Expand Down Expand Up @@ -733,14 +733,14 @@ RID Skeleton2D::get_skeleton() const {
}

void Skeleton2D::set_bone_local_pose_override(int p_bone_idx, Transform2D p_override, real_t p_amount, bool p_persistent) {
ERR_FAIL_INDEX_MSG(p_bone_idx, bones.size(), "Bone index is out of range!");
bones.write[p_bone_idx].local_pose_override = p_override;
bones.write[p_bone_idx].local_pose_override_amount = p_amount;
bones.write[p_bone_idx].local_pose_override_persistent = p_persistent;
ERR_FAIL_INDEX_MSG(p_bone_idx, (int)bones.size(), "Bone index is out of range!");
bones[p_bone_idx].local_pose_override = p_override;
bones[p_bone_idx].local_pose_override_amount = p_amount;
bones[p_bone_idx].local_pose_override_persistent = p_persistent;
}

Transform2D Skeleton2D::get_bone_local_pose_override(int p_bone_idx) {
ERR_FAIL_INDEX_V_MSG(p_bone_idx, bones.size(), Transform2D(), "Bone index is out of range!");
ERR_FAIL_INDEX_V_MSG(p_bone_idx, (int)bones.size(), Transform2D(), "Bone index is out of range!");
return bones[p_bone_idx].local_pose_override;
}

Expand Down Expand Up @@ -771,7 +771,7 @@ void Skeleton2D::execute_modifications(real_t p_delta, int p_execution_mode) {
}

// Do not cache the transform changes caused by the modifications!
for (int i = 0; i < bones.size(); i++) {
for (uint32_t i = 0; i < bones.size(); i++) {
bones[i].bone->copy_transform_to_cache = false;
}

Expand All @@ -783,7 +783,7 @@ void Skeleton2D::execute_modifications(real_t p_delta, int p_execution_mode) {

// Only apply the local pose override on _process. Otherwise, just calculate the local_pose_override and reset the transform.
if (p_execution_mode == SkeletonModificationStack2D::EXECUTION_MODE::execution_mode_process) {
for (int i = 0; i < bones.size(); i++) {
for (uint32_t i = 0; i < bones.size(); i++) {
if (bones[i].local_pose_override_amount > 0) {
bones[i].bone->set_meta("_local_pose_override_enabled_", true);

Expand All @@ -793,7 +793,7 @@ void Skeleton2D::execute_modifications(real_t p_delta, int p_execution_mode) {
bones[i].bone->propagate_call("force_update_transform");

if (bones[i].local_pose_override_persistent) {
bones.write[i].local_pose_override_amount = 0.0;
bones[i].local_pose_override_amount = 0.0;
}
} else {
// TODO: see if there is a way to undo the override without having to resort to setting every bone's transform.
Expand All @@ -804,7 +804,7 @@ void Skeleton2D::execute_modifications(real_t p_delta, int p_execution_mode) {
}

// Cache any future transform changes
for (int i = 0; i < bones.size(); i++) {
for (uint32_t i = 0; i < bones.size(); i++) {
bones[i].bone->copy_transform_to_cache = true;
}

Expand Down
2 changes: 1 addition & 1 deletion scene/2d/skeleton_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ class Skeleton2D : public Node2D {
bool local_pose_override_persistent = false;
};

Vector<Bone> bones;
LocalVector<Bone> bones;

bool bone_setup_dirty = true;
void _make_bone_setup_dirty();
Expand Down
Loading
Loading