Cleanup: Unnecessary copies of VArray #118437
|
@ -194,15 +194,21 @@ template<typename T> struct AttributeReader {
|
|||
*/
|
||||
const ImplicitSharingInfo *sharing_info;
|
||||
|
||||
const VArray<T> &operator*() const
|
||||
const VArray<T> &operator*() const &
|
||||
{
|
||||
return this->varray;
|
||||
}
|
||||
VArray<T> &operator*()
|
||||
|
||||
VArray<T> &operator*() &
|
||||
{
|
||||
return this->varray;
|
||||
}
|
||||
|
||||
VArray<T> operator*() &&
|
||||
{
|
||||
return std::move(this->varray);
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return this->varray;
|
||||
|
@ -329,15 +335,21 @@ struct GAttributeReader {
|
|||
return this->varray;
|
||||
}
|
||||
|
||||
const GVArray &operator*() const
|
||||
const GVArray &operator*() const &
|
||||
{
|
||||
return this->varray;
|
||||
}
|
||||
GVArray &operator*()
|
||||
|
||||
GVArray &operator*() &
|
||||
{
|
||||
return this->varray;
|
||||
}
|
||||
|
||||
GVArray operator*() &&
|
||||
{
|
||||
return std::move(this->varray);
|
||||
}
|
||||
|
||||
template<typename T> AttributeReader<T> typed() const
|
||||
{
|
||||
return {varray.typed<T>(), domain, sharing_info};
|
||||
|
|
|
@ -254,7 +254,7 @@ static VArray<float> construct_curve_length_gvarray(const CurvesGeometry &curves
|
|||
{
|
||||
curves.ensure_evaluated_lengths();
|
||||
|
||||
const VArray<bool> cyclic = curves.cyclic();
|
||||
VArray<bool> cyclic = curves.cyclic();
|
||||
VArray<float> lengths = VArray<float>::ForFunc(
|
||||
curves.curves_num(), [&curves, cyclic = std::move(cyclic)](int64_t index) {
|
||||
return curves.evaluated_length_total_for_curve(index, cyclic[index]);
|
||||
|
|
|
@ -190,6 +190,7 @@ class GVArray : public GVArrayCommon {
|
|||
GVArray(varray_tag::single /*tag*/, const CPPType &type, int64_t size, const void *value);
|
||||
|
||||
template<typename T> GVArray(const VArray<T> &varray);
|
||||
template<typename T> GVArray(VArray<T> &&varray);
|
||||
template<typename T> VArray<T> typed() const;
|
||||
|
||||
template<typename ImplT, typename... Args> static GVArray For(Args &&...args);
|
||||
|
@ -870,7 +871,11 @@ template<typename ImplT, typename... Args> inline GVArray GVArray::For(Args &&..
|
|||
return varray;
|
||||
}
|
||||
|
||||
template<typename T> inline GVArray::GVArray(const VArray<T> &varray)
|
||||
template<typename T> inline GVArray::GVArray(const VArray<T> &varray) : GVArray(VArray<T>(varray))
|
||||
{
|
||||
}
|
||||
|
||||
template<typename T> inline GVArray::GVArray(VArray<T> &&varray)
|
||||
{
|
||||
if (!varray) {
|
||||
return;
|
||||
|
@ -889,7 +894,7 @@ template<typename T> inline GVArray::GVArray(const VArray<T> &varray)
|
|||
if (varray.try_assign_GVArray(*this)) {
|
||||
return;
|
||||
}
|
||||
*this = GVArray::For<GVArrayImpl_For_VArray<T>>(varray);
|
||||
*this = GVArray::For<GVArrayImpl_For_VArray<T>>(std::move(varray));
|
||||
}
|
||||
|
||||
template<typename T> inline VArray<T> GVArray::typed() const
|
||||
|
|
|
@ -1035,7 +1035,9 @@ template<typename T> class VArraySpan final : public Span<T> {
|
|||
public:
|
||||
VArraySpan() = default;
|
||||
|
||||
VArraySpan(VArray<T> varray) : Span<T>(), varray_(std::move(varray))
|
||||
VArraySpan(const VArray<T> &varray) : VArraySpan(VArray<T>(varray)) {}
|
||||
|
||||
VArraySpan(VArray<T> &&varray) : Span<T>(), varray_(std::move(varray))
|
||||
{
|
||||
if (!varray_) {
|
||||
return;
|
||||
|
|
|
@ -263,7 +263,7 @@ static void pointcloud_extract_position_and_radius(const PointCloud &pointcloud,
|
|||
MutableSpan<float4> vbo_data{
|
||||
static_cast<float4 *>(GPU_vertbuf_get_data(cache.eval_cache.pos_rad)), pointcloud.totpoint};
|
||||
if (radii) {
|
||||
const VArraySpan<float> radii_span(radii);
|
||||
const VArraySpan<float> radii_span(std::move(radii));
|
||||
threading::parallel_for(vbo_data.index_range(), 4096, [&](IndexRange range) {
|
||||
for (const int i : range) {
|
||||
vbo_data[i].x = positions[i].x;
|
||||
|
|
|
@ -824,7 +824,7 @@ static void gather_attributes_for_propagation(
|
|||
const bke::GeometrySet &geometry_set,
|
||||
const Span<bke::GeometryComponent::Type> component_types,
|
||||
const bke::GeometryComponent::Type dst_component_type,
|
||||
const VArray<int> instance_depth,
|
||||
const VArray<int> &instance_depth,
|
||||
const IndexMask selection,
|
||||
const bke::AnonymousAttributePropagationInfo &propagation_info,
|
||||
Map<AttributeIDRef, AttributeKind> &r_attributes)
|
||||
|
|
Loading…
Reference in New Issue