Merge branch 'blender-v2.93-release'

This commit is contained in:
Jacques Lucke 2021-04-26 09:16:53 +02:00
commit 9b64927a8a
8 changed files with 107 additions and 86 deletions

View File

@ -304,7 +304,12 @@ static void update_visible_columns(ListBase &columns, DataSource &data_source)
continue;
}
used_ids.add(*column->id);
if (!used_ids.add(*column->id)) {
/* Remove duplicate columns for now. */
BLI_remlink(&columns, column);
spreadsheet_column_free(column);
continue;
}
}
data_source.foreach_default_column_ids([&](const SpreadsheetColumnID &column_id) {

View File

@ -18,6 +18,10 @@
#include <optional>
#include "BLI_color.hh"
#include "BLI_float2.hh"
#include "BLI_float3.hh"
struct Object;
struct Collection;
@ -44,6 +48,9 @@ class CellValue {
std::optional<int> value_int;
std::optional<float> value_float;
std::optional<bool> value_bool;
std::optional<float2> value_float2;
std::optional<float3> value_float3;
std::optional<Color4f> value_color;
std::optional<ObjectCellValue> value_object;
std::optional<CollectionCellValue> value_collection;
};

View File

@ -37,7 +37,6 @@ SpreadsheetColumnID *spreadsheet_column_id_copy(const SpreadsheetColumnID *src_c
{
SpreadsheetColumnID *new_column_id = spreadsheet_column_id_new();
new_column_id->name = BLI_strdup(src_column_id->name);
new_column_id->index = src_column_id->index;
return new_column_id;
}

View File

@ -24,7 +24,7 @@ namespace blender {
template<> struct DefaultHash<SpreadsheetColumnID> {
uint64_t operator()(const SpreadsheetColumnID &column_id) const
{
return get_default_hash_2(StringRef(column_id.name), column_id.index);
return get_default_hash(StringRef(column_id.name));
}
};
} // namespace blender
@ -32,7 +32,7 @@ template<> struct DefaultHash<SpreadsheetColumnID> {
inline bool operator==(const SpreadsheetColumnID &a, const SpreadsheetColumnID &b)
{
using blender::StringRef;
return StringRef(a.name) == StringRef(b.name) && a.index == b.index;
return StringRef(a.name) == StringRef(b.name);
}
namespace blender::ed::spreadsheet {

View File

@ -74,11 +74,19 @@ template<typename GetValueF> class LambdaColumnValues : public ColumnValues {
/* Utility function that simplifies creating a spreadsheet column from a lambda function. */
template<typename GetValueF>
std::unique_ptr<ColumnValues> column_values_from_function(std::string name,
int size,
GetValueF get_value)
const int size,
GetValueF get_value,
const float default_width = 0.0f)
{
return std::make_unique<LambdaColumnValues<GetValueF>>(
std::unique_ptr<ColumnValues> column_values = std::make_unique<LambdaColumnValues<GetValueF>>(
std::move(name), size, std::move(get_value));
column_values->default_width = default_width;
return column_values;
}
static constexpr float default_float_column_width = 3;
static constexpr float default_float2_column_width = 2 * default_float_column_width;
static constexpr float default_float3_column_width = 3 * default_float_column_width;
static constexpr float default_color_column_width = 4 * default_float_column_width;
} // namespace blender::ed::spreadsheet

View File

@ -47,28 +47,7 @@ void GeometryDataSource::foreach_default_column_ids(
}
SpreadsheetColumnID column_id;
column_id.name = (char *)name.c_str();
if (meta_data.data_type == CD_PROP_FLOAT3) {
for (const int i : {0, 1, 2}) {
column_id.index = i;
fn(column_id);
}
}
else if (meta_data.data_type == CD_PROP_FLOAT2) {
for (const int i : {0, 1}) {
column_id.index = i;
fn(column_id);
}
}
else if (meta_data.data_type == CD_PROP_COLOR) {
for (const int i : {0, 1, 2, 3}) {
column_id.index = i;
fn(column_id);
}
}
else {
column_id.index = -1;
fn(column_id);
}
fn(column_id);
return true;
});
}
@ -90,9 +69,6 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
const CustomDataType type = bke::cpp_type_to_custom_data_type(varray->type());
switch (type) {
case CD_PROP_FLOAT:
if (column_id.index != -1) {
return {};
}
return column_values_from_function(
column_id.name, domain_size, [varray](int index, CellValue &r_cell_value) {
float value;
@ -100,9 +76,6 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
r_cell_value.value_float = value;
});
case CD_PROP_INT32:
if (column_id.index != -1) {
return {};
}
return column_values_from_function(
column_id.name, domain_size, [varray](int index, CellValue &r_cell_value) {
int value;
@ -110,9 +83,6 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
r_cell_value.value_int = value;
});
case CD_PROP_BOOL:
if (column_id.index != -1) {
return {};
}
return column_values_from_function(
column_id.name, domain_size, [varray](int index, CellValue &r_cell_value) {
bool value;
@ -120,43 +90,37 @@ std::unique_ptr<ColumnValues> GeometryDataSource::get_column_values(
r_cell_value.value_bool = value;
});
case CD_PROP_FLOAT2: {
if (column_id.index < 0 || column_id.index > 1) {
return {};
}
const std::array<const char *, 2> suffixes = {" X", " Y"};
const std::string name = StringRef(column_id.name) + suffixes[column_id.index];
return column_values_from_function(
name, domain_size, [varray, axis = column_id.index](int index, CellValue &r_cell_value) {
column_id.name,
domain_size,
[varray](int index, CellValue &r_cell_value) {
float2 value;
varray->get(index, &value);
r_cell_value.value_float = value[axis];
});
r_cell_value.value_float2 = value;
},
default_float2_column_width);
}
case CD_PROP_FLOAT3: {
if (column_id.index < 0 || column_id.index > 2) {
return {};
}
const std::array<const char *, 3> suffixes = {" X", " Y", " Z"};
const std::string name = StringRef(column_id.name) + suffixes[column_id.index];
return column_values_from_function(
name, domain_size, [varray, axis = column_id.index](int index, CellValue &r_cell_value) {
column_id.name,
domain_size,
[varray](int index, CellValue &r_cell_value) {
float3 value;
varray->get(index, &value);
r_cell_value.value_float = value[axis];
});
r_cell_value.value_float3 = value;
},
default_float3_column_width);
}
case CD_PROP_COLOR: {
if (column_id.index < 0 || column_id.index > 3) {
return {};
}
const std::array<const char *, 4> suffixes = {" R", " G", " B", " A"};
const std::string name = StringRef(column_id.name) + suffixes[column_id.index];
return column_values_from_function(
name, domain_size, [varray, axis = column_id.index](int index, CellValue &r_cell_value) {
column_id.name,
domain_size,
[varray](int index, CellValue &r_cell_value) {
Color4f value;
varray->get(index, &value);
r_cell_value.value_float = value[axis];
});
r_cell_value.value_color = value;
},
default_color_column_width);
}
default:
break;
@ -295,15 +259,11 @@ void InstancesDataSource::foreach_default_column_ids(
}
SpreadsheetColumnID column_id;
column_id.index = -1;
column_id.name = (char *)"Name";
fn(column_id);
for (const char *name : {"Position", "Rotation", "Scale"}) {
for (const int i : {0, 1, 2}) {
column_id.name = (char *)name;
column_id.index = i;
fn(column_id);
}
column_id.name = (char *)name;
fn(column_id);
}
}
@ -314,7 +274,6 @@ std::unique_ptr<ColumnValues> InstancesDataSource::get_column_values(
return {};
}
const std::array<const char *, 3> suffixes = {" X", " Y", " Z"};
const int size = this->tot_rows();
if (STREQ(column_id.name, "Name")) {
Span<InstancedData> instance_data = component_->instanced_data();
@ -335,30 +294,33 @@ std::unique_ptr<ColumnValues> InstancesDataSource::get_column_values(
values->default_width = 8.0f;
return values;
}
if (column_id.index < 0 || column_id.index > 2) {
return {};
}
Span<float4x4> transforms = component_->transforms();
if (STREQ(column_id.name, "Position")) {
std::string name = StringRef("Position") + suffixes[column_id.index];
return column_values_from_function(
name, size, [transforms, axis = column_id.index](int index, CellValue &r_cell_value) {
r_cell_value.value_float = transforms[index].translation()[axis];
});
column_id.name,
size,
[transforms](int index, CellValue &r_cell_value) {
r_cell_value.value_float3 = transforms[index].translation();
},
default_float3_column_width);
}
if (STREQ(column_id.name, "Rotation")) {
std::string name = StringRef("Rotation") + suffixes[column_id.index];
return column_values_from_function(
name, size, [transforms, axis = column_id.index](int index, CellValue &r_cell_value) {
r_cell_value.value_float = transforms[index].to_euler()[axis];
});
column_id.name,
size,
[transforms](int index, CellValue &r_cell_value) {
r_cell_value.value_float3 = transforms[index].to_euler();
},
default_float3_column_width);
}
if (STREQ(column_id.name, "Scale")) {
std::string name = StringRef("Scale") + suffixes[column_id.index];
return column_values_from_function(
name, size, [transforms, axis = column_id.index](int index, CellValue &r_cell_value) {
r_cell_value.value_float = transforms[index].scale()[axis];
});
column_id.name,
size,
[transforms](int index, CellValue &r_cell_value) {
r_cell_value.value_float3 = transforms[index].scale();
},
default_float3_column_width);
}
return {};
}

View File

@ -161,6 +161,18 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer {
nullptr);
UI_but_drawflag_disable(but, UI_BUT_ICON_LEFT);
}
else if (cell_value.value_float2.has_value()) {
const float2 value = *cell_value.value_float2;
this->draw_float_vector(params, Span(&value.x, 2));
}
else if (cell_value.value_float3.has_value()) {
const float3 value = *cell_value.value_float3;
this->draw_float_vector(params, Span(&value.x, 3));
}
else if (cell_value.value_color.has_value()) {
const Color4f value = *cell_value.value_color;
this->draw_float_vector(params, Span(&value.r, 4));
}
else if (cell_value.value_object.has_value()) {
const ObjectCellValue value = *cell_value.value_object;
uiDefIconTextBut(params.block,
@ -199,6 +211,36 @@ class SpreadsheetLayoutDrawer : public SpreadsheetDrawer {
}
}
void draw_float_vector(const CellDrawParams &params, const Span<float> values) const
{
BLI_assert(!values.is_empty());
const float segment_width = (float)params.width / values.size();
for (const int i : values.index_range()) {
std::stringstream ss;
const float value = values[i];
ss << std::fixed << std::setprecision(3) << value;
const std::string value_str = ss.str();
uiBut *but = uiDefIconTextBut(params.block,
UI_BTYPE_LABEL,
0,
ICON_NONE,
value_str.c_str(),
params.xmin + i * segment_width,
params.ymin,
segment_width,
params.height,
nullptr,
0,
0,
0,
0,
nullptr);
/* Right-align Floats. */
UI_but_drawflag_disable(but, UI_BUT_TEXT_LEFT);
UI_but_drawflag_enable(but, UI_BUT_TEXT_RIGHT);
}
}
int column_width(int column_index) const final
{
return spreadsheet_layout_.columns[column_index].width;

View File

@ -1856,8 +1856,6 @@ typedef struct SpaceStatusBar {
typedef struct SpreadsheetColumnID {
char *name;
int index;
char _pad[4];
} SpreadsheetColumnID;
typedef struct SpreadsheetColumn {