mirror of
https://github.com/godotengine/godot.git
synced 2026-01-06 10:11:57 +03:00
Merge pull request #68738 from lawnjelly/faster_canvas_item
[3.x] Canvas item hierarchical culling
This commit is contained in:
@@ -484,6 +484,7 @@ public:
|
||||
void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform) {}
|
||||
Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const { return Transform2D(); }
|
||||
uint32_t skeleton_get_revision(RID p_skeleton) const { return 0; }
|
||||
void skeleton_attach_canvas_item(RID p_skeleton, RID p_canvas_item, bool p_attach) {}
|
||||
|
||||
/* Light API */
|
||||
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#include "rasterizer_canvas_gles2.h"
|
||||
#include "rasterizer_scene_gles2.h"
|
||||
#include "servers/visual/shader_language.h"
|
||||
#include "servers/visual/visual_server_canvas.h"
|
||||
#include "servers/visual/visual_server_globals.h"
|
||||
|
||||
GLuint RasterizerStorageGLES2::system_fbo = 0;
|
||||
|
||||
@@ -3772,6 +3774,20 @@ void RasterizerStorageGLES2::skeleton_set_base_transform_2d(RID p_skeleton, cons
|
||||
skeleton->base_transform_2d = p_base_transform;
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES2::skeleton_attach_canvas_item(RID p_skeleton, RID p_canvas_item, bool p_attach) {
|
||||
Skeleton *skeleton = skeleton_owner.getornull(p_skeleton);
|
||||
ERR_FAIL_NULL(skeleton);
|
||||
ERR_FAIL_COND(!p_canvas_item.is_valid());
|
||||
|
||||
if (p_attach) {
|
||||
skeleton->linked_canvas_items.push_back(p_canvas_item);
|
||||
} else {
|
||||
int64_t found = skeleton->linked_canvas_items.find(p_canvas_item);
|
||||
ERR_FAIL_COND(found == -1);
|
||||
skeleton->linked_canvas_items.remove_unordered(found);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t RasterizerStorageGLES2::skeleton_get_revision(RID p_skeleton) const {
|
||||
const Skeleton *skeleton = skeleton_owner.getornull(p_skeleton);
|
||||
ERR_FAIL_COND_V(!skeleton, 0);
|
||||
@@ -4101,6 +4117,23 @@ void RasterizerStorageGLES2::_update_skeleton_transform_buffer(const PoolVector<
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES2::update_dirty_skeletons() {
|
||||
// 2D Skeletons always need to update the polygons so they
|
||||
// know the bounds have changed.
|
||||
// TODO : Could we have a separate list for 2D only?
|
||||
SelfList<Skeleton> *ele = skeleton_update_list.first();
|
||||
|
||||
while (ele) {
|
||||
Skeleton *skeleton = ele->self();
|
||||
|
||||
int num_linked = skeleton->linked_canvas_items.size();
|
||||
for (int n = 0; n < num_linked; n++) {
|
||||
const RID &rid = skeleton->linked_canvas_items[n];
|
||||
VSG::canvas->_canvas_item_skeleton_moved(rid);
|
||||
}
|
||||
|
||||
ele = ele->next();
|
||||
}
|
||||
|
||||
if (config.use_skeleton_software) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -903,6 +903,7 @@ public:
|
||||
Set<RasterizerScene::InstanceBase *> instances;
|
||||
|
||||
Transform2D base_transform_2d;
|
||||
LocalVector<RID> linked_canvas_items;
|
||||
|
||||
Skeleton() :
|
||||
use_2d(false),
|
||||
@@ -928,6 +929,7 @@ public:
|
||||
virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const;
|
||||
virtual void skeleton_set_base_transform_2d(RID p_skeleton, const Transform2D &p_base_transform);
|
||||
virtual uint32_t skeleton_get_revision(RID p_skeleton) const;
|
||||
virtual void skeleton_attach_canvas_item(RID p_skeleton, RID p_canvas_item, bool p_attach);
|
||||
|
||||
void _update_skeleton_transform_buffer(const PoolVector<float> &p_data, size_t p_size);
|
||||
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
#include "main/main.h"
|
||||
#include "rasterizer_canvas_gles3.h"
|
||||
#include "rasterizer_scene_gles3.h"
|
||||
#include "servers/visual/visual_server_canvas.h"
|
||||
#include "servers/visual/visual_server_globals.h"
|
||||
#include "servers/visual_server.h"
|
||||
|
||||
#if defined(IPHONE_ENABLED) || defined(ANDROID_ENABLED)
|
||||
@@ -5314,6 +5316,20 @@ void RasterizerStorageGLES3::skeleton_set_base_transform_2d(RID p_skeleton, cons
|
||||
skeleton->base_transform_2d = p_base_transform;
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES3::skeleton_attach_canvas_item(RID p_skeleton, RID p_canvas_item, bool p_attach) {
|
||||
Skeleton *skeleton = skeleton_owner.getornull(p_skeleton);
|
||||
ERR_FAIL_NULL(skeleton);
|
||||
ERR_FAIL_COND(!p_canvas_item.is_valid());
|
||||
|
||||
if (p_attach) {
|
||||
skeleton->linked_canvas_items.push_back(p_canvas_item);
|
||||
} else {
|
||||
int64_t found = skeleton->linked_canvas_items.find(p_canvas_item);
|
||||
ERR_FAIL_COND(found == -1);
|
||||
skeleton->linked_canvas_items.remove_unordered(found);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t RasterizerStorageGLES3::skeleton_get_revision(RID p_skeleton) const {
|
||||
const Skeleton *skeleton = skeleton_owner.getornull(p_skeleton);
|
||||
ERR_FAIL_COND_V(!skeleton, 0);
|
||||
@@ -5321,6 +5337,24 @@ uint32_t RasterizerStorageGLES3::skeleton_get_revision(RID p_skeleton) const {
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES3::update_dirty_skeletons() {
|
||||
// 2D Skeletons always need to update the polygons so they
|
||||
// know the bounds have changed.
|
||||
// TODO : Could we have a separate list for 2D only?
|
||||
SelfList<Skeleton> *ele = skeleton_update_list.first();
|
||||
|
||||
while (ele) {
|
||||
Skeleton *skeleton = ele->self();
|
||||
|
||||
int num_linked = skeleton->linked_canvas_items.size();
|
||||
for (int n = 0; n < num_linked; n++) {
|
||||
const RID &rid = skeleton->linked_canvas_items[n];
|
||||
VSG::canvas->_canvas_item_skeleton_moved(rid);
|
||||
}
|
||||
|
||||
ele = ele->next();
|
||||
}
|
||||
|
||||
// TODO : Is this update necessary for 2D software skinning?
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
while (skeleton_update_list.first()) {
|
||||
|
||||
@@ -926,7 +926,9 @@ public:
|
||||
GLuint texture;
|
||||
SelfList<Skeleton> update_list;
|
||||
Set<RasterizerScene::InstanceBase *> instances; //instances using skeleton
|
||||
|
||||
Transform2D base_transform_2d;
|
||||
LocalVector<RID> linked_canvas_items;
|
||||
|
||||
Skeleton() :
|
||||
use_2d(false),
|
||||
@@ -952,6 +954,7 @@ public:
|
||||
virtual Transform2D skeleton_bone_get_transform_2d(RID p_skeleton, int p_bone) const;
|
||||
virtual void skeleton_set_base_transform_2d(RID p_skeleton, const Transform2D &p_base_transform);
|
||||
virtual uint32_t skeleton_get_revision(RID p_skeleton) const;
|
||||
virtual void skeleton_attach_canvas_item(RID p_skeleton, RID p_canvas_item, bool p_attach);
|
||||
|
||||
/* Light API */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user