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