Commit: f2ed497129bea76eeb03f3e15c54acb1136621eb Author: Jacques Lucke Date: Thu Jun 27 13:46:03 2019 +0200 Branches: functions https://developer.blender.org/rBf2ed497129bea76eeb03f3e15c54acb1136621eb
initialize attributes with default values =================================================================== M source/blender/simulations/bparticles/attributes.hpp M source/blender/simulations/bparticles/core.cpp M source/blender/simulations/bparticles/particles_container.cpp =================================================================== diff --git a/source/blender/simulations/bparticles/attributes.hpp b/source/blender/simulations/bparticles/attributes.hpp index a953a6ab31f..2e21b1ca729 100644 --- a/source/blender/simulations/bparticles/attributes.hpp +++ b/source/blender/simulations/bparticles/attributes.hpp @@ -170,6 +170,9 @@ class AttributeArrays { void *get_ptr(uint index) const; + void init_default(uint index); + void init_default(StringRef name); + ArrayRef<uint8_t> get_byte(uint index) const; ArrayRef<uint8_t> get_byte(StringRef name); ArrayRef<float> get_float(uint index) const; @@ -246,6 +249,23 @@ inline void *AttributeArrays::get_ptr(uint index) const return POINTER_OFFSET(ptr, m_start * size); } +inline void AttributeArrays::init_default(uint index) +{ + void *default_value = m_core.info().default_value_ptr(index); + void *dst = this->get_ptr(index); + AttributeType type = m_core.get_type(index); + uint element_size = size_of_attribute_type(type); + + for (uint i = 0; i < m_size; i++) { + memcpy(POINTER_OFFSET(dst, element_size * i), default_value, element_size); + } +} + +inline void AttributeArrays::init_default(StringRef name) +{ + this->init_default(this->attribute_index(name)); +} + inline ArrayRef<uint8_t> AttributeArrays::get_byte(uint index) const { BLI_assert(m_core.get_type(index) == AttributeType::Byte); diff --git a/source/blender/simulations/bparticles/core.cpp b/source/blender/simulations/bparticles/core.cpp index 0bda6770598..590010fd9e8 100644 --- a/source/blender/simulations/bparticles/core.cpp +++ b/source/blender/simulations/bparticles/core.cpp @@ -74,11 +74,17 @@ EmitTarget &EmitterInterface::request(uint particle_type_id, uint size) while (remaining_size > 0) { ParticlesBlock &block = m_allocator.get_non_full_block(particle_type_id); - uint size_to_use = std::min(block.size(), remaining_size); + uint size_to_use = std::min(block.inactive_amount(), remaining_size); + Range<uint> range(block.active_amount(), block.active_amount() + size_to_use); block.active_amount() += size_to_use; blocks.append(&block); - ranges.append(Range<uint>(0, size_to_use)); + ranges.append(range); + + AttributeArrays attributes = block.slice(range); + for (uint i : attributes.info().attribute_indices()) { + attributes.init_default(i); + } remaining_size -= size_to_use; } diff --git a/source/blender/simulations/bparticles/particles_container.cpp b/source/blender/simulations/bparticles/particles_container.cpp index 990709c4992..50b78b51506 100644 --- a/source/blender/simulations/bparticles/particles_container.cpp +++ b/source/blender/simulations/bparticles/particles_container.cpp @@ -82,6 +82,13 @@ void ParticlesContainer::update_attributes(AttributesInfo new_info) } } + SmallVector<uint> indices_to_allocate; + for (uint i = 0; i < new_to_old_mapping.size(); i++) { + if (new_to_old_mapping[i] == -1) { + indices_to_allocate.append(i); + } + } + m_attributes_info = new_info; SmallVector<void *> arrays; @@ -94,13 +101,7 @@ void ParticlesContainer::update_attributes(AttributesInfo new_info) AttributeType type = new_info.type_of(new_index); if (old_index == -1) { - void *array = MEM_malloc_arrayN(m_block_size, size_of_attribute_type(type), __func__); - uint value_size = size_of_attribute_type(type); - void *default_ptr = new_info.default_value_ptr(new_index); - for (uint i = 0; i < m_block_size; i++) { - memcpy(POINTER_OFFSET(array, i * value_size), default_ptr, value_size); - } - arrays.append(array); + arrays.append(MEM_malloc_arrayN(m_block_size, size_of_attribute_type(type), __func__)); } else { arrays.append(block->attributes_core().get_ptr((uint)old_index)); @@ -113,6 +114,10 @@ void ParticlesContainer::update_attributes(AttributesInfo new_info) } block->m_attributes_core = AttributeArraysCore(m_attributes_info, arrays, m_block_size); + + for (uint new_index : indices_to_allocate) { + block->m_attributes_core.slice_all().init_default(new_index); + } } } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs