Merge pull request #32275 from godotengine/skin_support
Added skin support and simplified APIs to override bone position + glTF 2.0 import fixes
This commit is contained in:
@ -2570,12 +2570,6 @@ void RasterizerSceneGLES2::_render_render_list(RenderList::Element **p_elements,
|
||||
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::WORLD_TRANSFORM, e->instance->transform);
|
||||
|
||||
if (skeleton) {
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::SKELETON_IN_WORLD_COORDS, skeleton->use_world_transform);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::SKELETON_TRANSFORM, skeleton->world_transform);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::SKELETON_TRANSFORM_INVERSE, skeleton->world_transform_inverse);
|
||||
}
|
||||
|
||||
if (use_lightmap_capture) { //this is per instance, must be set always if present
|
||||
glUniform4fv(state.scene_shader.get_uniform_location(SceneShaderGLES2::LIGHTMAP_CAPTURES), 12, (const GLfloat *)e->instance->lightmap_capture_data.ptr());
|
||||
state.scene_shader.set_uniform(SceneShaderGLES2::LIGHTMAP_CAPTURE_SKY, false);
|
||||
|
||||
@ -3663,23 +3663,6 @@ void RasterizerStorageGLES2::skeleton_set_base_transform_2d(RID p_skeleton, cons
|
||||
skeleton->base_transform_2d = p_base_transform;
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES2::skeleton_set_world_transform(RID p_skeleton, bool p_enable, const Transform &p_world_transform) {
|
||||
|
||||
Skeleton *skeleton = skeleton_owner.getornull(p_skeleton);
|
||||
|
||||
ERR_FAIL_COND(skeleton->use_2d);
|
||||
|
||||
skeleton->world_transform = p_world_transform;
|
||||
skeleton->use_world_transform = p_enable;
|
||||
if (p_enable) {
|
||||
skeleton->world_transform_inverse = skeleton->world_transform.affine_inverse();
|
||||
}
|
||||
|
||||
if (!skeleton->update_list.in_list()) {
|
||||
skeleton_update_list.add(&skeleton->update_list);
|
||||
}
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES2::_update_skeleton_transform_buffer(const PoolVector<float> &p_data, size_t p_size) {
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, resources.skeleton_transform_buffer);
|
||||
|
||||
@ -870,16 +870,12 @@ public:
|
||||
Set<RasterizerScene::InstanceBase *> instances;
|
||||
|
||||
Transform2D base_transform_2d;
|
||||
Transform world_transform;
|
||||
Transform world_transform_inverse;
|
||||
bool use_world_transform;
|
||||
|
||||
Skeleton() :
|
||||
use_2d(false),
|
||||
size(0),
|
||||
tex_id(0),
|
||||
update_list(this),
|
||||
use_world_transform(false) {
|
||||
update_list(this) {
|
||||
}
|
||||
};
|
||||
|
||||
@ -897,7 +893,6 @@ public:
|
||||
virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform);
|
||||
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 void skeleton_set_world_transform(RID p_skeleton, bool p_enable, const Transform &p_world_transform);
|
||||
|
||||
void _update_skeleton_transform_buffer(const PoolVector<float> &p_data, size_t p_size);
|
||||
|
||||
|
||||
@ -61,9 +61,6 @@ uniform ivec2 skeleton_texture_size;
|
||||
|
||||
#endif
|
||||
|
||||
uniform highp mat4 skeleton_transform;
|
||||
uniform highp mat4 skeleton_transform_inverse;
|
||||
uniform bool skeleton_in_world_coords;
|
||||
|
||||
#endif
|
||||
|
||||
@ -410,12 +407,9 @@ void main() {
|
||||
|
||||
#endif
|
||||
|
||||
if (skeleton_in_world_coords) {
|
||||
bone_transform = skeleton_transform * (bone_transform * skeleton_transform_inverse);
|
||||
world_matrix = bone_transform * world_matrix;
|
||||
} else {
|
||||
world_matrix = world_matrix * bone_transform;
|
||||
}
|
||||
|
||||
world_matrix = world_matrix * bone_transform;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -2260,11 +2260,6 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_
|
||||
|
||||
_set_cull(e->sort_key & RenderList::SORT_KEY_MIRROR_FLAG, e->sort_key & RenderList::SORT_KEY_CULL_DISABLED_FLAG, p_reverse_cull);
|
||||
|
||||
if (skeleton) {
|
||||
state.scene_shader.set_uniform(SceneShaderGLES3::SKELETON_TRANSFORM, skeleton->world_transform);
|
||||
state.scene_shader.set_uniform(SceneShaderGLES3::SKELETON_IN_WORLD_COORDS, skeleton->use_world_transform);
|
||||
}
|
||||
|
||||
state.scene_shader.set_uniform(SceneShaderGLES3::WORLD_TRANSFORM, e->instance->transform);
|
||||
|
||||
_render_geometry(e);
|
||||
|
||||
@ -5162,20 +5162,6 @@ void RasterizerStorageGLES3::skeleton_set_base_transform_2d(RID p_skeleton, cons
|
||||
skeleton->base_transform_2d = p_base_transform;
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES3::skeleton_set_world_transform(RID p_skeleton, bool p_enable, const Transform &p_world_transform) {
|
||||
|
||||
Skeleton *skeleton = skeleton_owner.getornull(p_skeleton);
|
||||
|
||||
ERR_FAIL_COND(skeleton->use_2d);
|
||||
|
||||
skeleton->world_transform = p_world_transform;
|
||||
skeleton->use_world_transform = p_enable;
|
||||
|
||||
if (!skeleton->update_list.in_list()) {
|
||||
skeleton_update_list.add(&skeleton->update_list);
|
||||
}
|
||||
}
|
||||
|
||||
void RasterizerStorageGLES3::update_dirty_skeletons() {
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
@ -892,15 +892,12 @@ public:
|
||||
SelfList<Skeleton> update_list;
|
||||
Set<RasterizerScene::InstanceBase *> instances; //instances using skeleton
|
||||
Transform2D base_transform_2d;
|
||||
bool use_world_transform;
|
||||
Transform world_transform;
|
||||
|
||||
Skeleton() :
|
||||
use_2d(false),
|
||||
size(0),
|
||||
texture(0),
|
||||
update_list(this),
|
||||
use_world_transform(false) {
|
||||
update_list(this) {
|
||||
}
|
||||
};
|
||||
|
||||
@ -918,7 +915,6 @@ public:
|
||||
virtual void skeleton_bone_set_transform_2d(RID p_skeleton, int p_bone, const Transform2D &p_transform);
|
||||
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 void skeleton_set_world_transform(RID p_skeleton, bool p_enable, const Transform &p_world_transform);
|
||||
|
||||
/* Light API */
|
||||
|
||||
|
||||
@ -302,8 +302,6 @@ out highp float dp_clip;
|
||||
|
||||
#ifdef USE_SKELETON
|
||||
uniform highp sampler2D skeleton_texture; // texunit:-1
|
||||
uniform highp mat4 skeleton_transform;
|
||||
uniform bool skeleton_in_world_coords;
|
||||
#endif
|
||||
|
||||
out highp vec4 position_interp;
|
||||
@ -432,14 +430,8 @@ void main() {
|
||||
vec4(0.0, 0.0, 0.0, 1.0)) *
|
||||
bone_weights.w;
|
||||
|
||||
if (skeleton_in_world_coords) {
|
||||
highp mat4 bone_matrix = skeleton_transform * (transpose(m) * inverse(skeleton_transform));
|
||||
world_matrix = bone_matrix * world_matrix;
|
||||
world_matrix = world_matrix * transpose(m);
|
||||
|
||||
} else {
|
||||
|
||||
world_matrix = world_matrix * transpose(m);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user