Merge pull request #72684 from clayjohn/mm-update

Fix MultiMesh visible_instance_count being ignored after the first frame
This commit is contained in:
Rémi Verschelde 2023-02-04 00:40:36 +01:00
commit 0b1d516f67
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 12 additions and 6 deletions

View file

@ -1835,8 +1835,12 @@ void MeshStorage::multimesh_set_visible_instances(RID p_multimesh, int p_visible
}
if (multimesh->data_cache.size()) {
//there is a data cache..
// There is a data cache, but we may need to update some sections.
_multimesh_mark_all_dirty(multimesh, false, true);
int start = multimesh->visible_instances >= 0 ? multimesh->visible_instances : multimesh->instances;
for (int i = start; i < p_visible; i++) {
_multimesh_mark_dirty(multimesh, i, true);
}
}
multimesh->visible_instances = p_visible;
@ -1868,7 +1872,7 @@ void MeshStorage::_update_dirty_multimeshes() {
if (multimesh->data_cache_used_dirty_regions > 32 || multimesh->data_cache_used_dirty_regions > visible_region_count / 2) {
// If there too many dirty regions, or represent the majority of regions, just copy all, else transfer cost piles up too much
glBindBuffer(GL_ARRAY_BUFFER, multimesh->buffer);
glBufferData(GL_ARRAY_BUFFER, MIN(visible_region_count * region_size, multimesh->instances * multimesh->stride_cache * sizeof(float)), data, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, MIN(visible_region_count * region_size, multimesh->instances * multimesh->stride_cache * sizeof(float)), data);
glBindBuffer(GL_ARRAY_BUFFER, 0);
} else {
// Not that many regions? update them all