forked from bartvdbraak/blender
Merge branch 'blender-v2.93-release'
This commit is contained in:
commit
9b64927a8a
@ -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) {
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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 {};
|
||||
}
|
||||
|
@ -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 ¶ms, 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;
|
||||
|
@ -1856,8 +1856,6 @@ typedef struct SpaceStatusBar {
|
||||
|
||||
typedef struct SpreadsheetColumnID {
|
||||
char *name;
|
||||
int index;
|
||||
char _pad[4];
|
||||
} SpreadsheetColumnID;
|
||||
|
||||
typedef struct SpreadsheetColumn {
|
||||
|
Loading…
Reference in New Issue
Block a user