Compare commits
5 Commits
node-tree-
...
temp-sprea
Author | SHA1 | Date | |
---|---|---|---|
045bdd5308 | |||
ae51cde3d7 | |||
25f8050830 | |||
ff013946bb | |||
74de45712d |
@@ -34,7 +34,8 @@ class SPREADSHEET_HT_header(bpy.types.Header):
|
|||||||
layout.prop(space, "object_eval_state", text="")
|
layout.prop(space, "object_eval_state", text="")
|
||||||
if space.object_eval_state != "ORIGINAL":
|
if space.object_eval_state != "ORIGINAL":
|
||||||
layout.prop(space, "geometry_component_type", text="")
|
layout.prop(space, "geometry_component_type", text="")
|
||||||
layout.prop(space, "attribute_domain", text="")
|
if space.geometry_component_type != 'INSTANCES':
|
||||||
|
layout.prop(space, "attribute_domain", text="")
|
||||||
|
|
||||||
if used_id:
|
if used_id:
|
||||||
layout.label(text=used_id.name, icon="OBJECT_DATA")
|
layout.label(text=used_id.name, icon="OBJECT_DATA")
|
||||||
|
@@ -89,6 +89,25 @@ struct float4x4 {
|
|||||||
return m * float3(v);
|
return m * float3(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float3 translation() const
|
||||||
|
{
|
||||||
|
return float3(values[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 to_euler() const
|
||||||
|
{
|
||||||
|
float3 euler;
|
||||||
|
mat4_to_eul(euler, values);
|
||||||
|
return euler;
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 scale() const
|
||||||
|
{
|
||||||
|
float3 scale;
|
||||||
|
mat4_to_size(scale, values);
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
float4x4 inverted() const
|
float4x4 inverted() const
|
||||||
{
|
{
|
||||||
float4x4 result;
|
float4x4 result;
|
||||||
|
@@ -52,10 +52,15 @@ class ColumnLayoutDrawer : public SpreadsheetDrawer {
|
|||||||
const int minimum_column_width = 3 * UI_UNIT_X;
|
const int minimum_column_width = 3 * UI_UNIT_X;
|
||||||
const int header_name_padding = UI_UNIT_X;
|
const int header_name_padding = UI_UNIT_X;
|
||||||
for (const SpreadsheetColumn *column : column_layout_.columns) {
|
for (const SpreadsheetColumn *column : column_layout_.columns) {
|
||||||
StringRefNull name = column->name();
|
if (column->default_width == 0.0f) {
|
||||||
const int name_width = BLF_width(fontid, name.data(), name.size());
|
StringRefNull name = column->name();
|
||||||
const int width = std::max(name_width + header_name_padding, minimum_column_width);
|
const int name_width = BLF_width(fontid, name.data(), name.size());
|
||||||
column_widths_.append(width);
|
const int width = std::max(name_width + header_name_padding, minimum_column_width);
|
||||||
|
column_widths_.append(width);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
column_widths_.append(column->default_width * UI_UNIT_X);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,6 +177,42 @@ class ColumnLayoutDrawer : public SpreadsheetDrawer {
|
|||||||
0,
|
0,
|
||||||
nullptr);
|
nullptr);
|
||||||
}
|
}
|
||||||
|
else if (std::holds_alternative<ObjectCellValue>(cell_value.value)) {
|
||||||
|
const ObjectCellValue value = *std::get_if<ObjectCellValue>(&cell_value.value);
|
||||||
|
uiDefIconTextBut(params.block,
|
||||||
|
UI_BTYPE_LABEL,
|
||||||
|
0,
|
||||||
|
ICON_OBJECT_DATA,
|
||||||
|
reinterpret_cast<const ID *const>(value.object)->name + 2,
|
||||||
|
params.xmin,
|
||||||
|
params.ymin,
|
||||||
|
params.width,
|
||||||
|
params.height,
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
else if (std::holds_alternative<CollectionCellValue>(cell_value.value)) {
|
||||||
|
const CollectionCellValue value = *std::get_if<CollectionCellValue>(&cell_value.value);
|
||||||
|
uiDefIconTextBut(params.block,
|
||||||
|
UI_BTYPE_LABEL,
|
||||||
|
0,
|
||||||
|
ICON_OUTLINER_COLLECTION,
|
||||||
|
reinterpret_cast<const ID *const>(value.collection)->name + 2,
|
||||||
|
params.xmin,
|
||||||
|
params.ymin,
|
||||||
|
params.width,
|
||||||
|
params.height,
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int column_width(int column_index) const final
|
int column_width(int column_index) const final
|
||||||
|
@@ -20,8 +20,19 @@
|
|||||||
|
|
||||||
#include "spreadsheet_draw.hh"
|
#include "spreadsheet_draw.hh"
|
||||||
|
|
||||||
|
struct Object;
|
||||||
|
struct Collection;
|
||||||
|
|
||||||
namespace blender::ed::spreadsheet {
|
namespace blender::ed::spreadsheet {
|
||||||
|
|
||||||
|
struct ObjectCellValue {
|
||||||
|
const Object *object;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CollectionCellValue {
|
||||||
|
const Collection *collection;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a small type that can hold the value of a cell in a spreadsheet. This type allows us to
|
* This is a small type that can hold the value of a cell in a spreadsheet. This type allows us to
|
||||||
* decouple the drawing of individual cells from the code that generates the data to be displayed.
|
* decouple the drawing of individual cells from the code that generates the data to be displayed.
|
||||||
@@ -30,7 +41,8 @@ class CellValue {
|
|||||||
public:
|
public:
|
||||||
/* The implementation just uses a `std::variant` for simplicity. It can be encapsulated better,
|
/* The implementation just uses a `std::variant` for simplicity. It can be encapsulated better,
|
||||||
* but it's not really worth the complixity for now. */
|
* but it's not really worth the complixity for now. */
|
||||||
using VariantType = std::variant<std::monostate, int, float, bool>;
|
using VariantType =
|
||||||
|
std::variant<std::monostate, int, float, bool, ObjectCellValue, CollectionCellValue>;
|
||||||
|
|
||||||
VariantType value;
|
VariantType value;
|
||||||
};
|
};
|
||||||
@@ -56,6 +68,9 @@ class SpreadsheetColumn {
|
|||||||
{
|
{
|
||||||
return name_;
|
return name_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The default width of newly created columns, in UI units. */
|
||||||
|
float default_width = 0.0f;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Utility class for the function below. */
|
/* Utility class for the function below. */
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
#include "BKE_mesh_wrapper.h"
|
#include "BKE_mesh_wrapper.h"
|
||||||
#include "BKE_modifier.h"
|
#include "BKE_modifier.h"
|
||||||
|
|
||||||
|
#include "DNA_ID.h"
|
||||||
#include "DNA_mesh_types.h"
|
#include "DNA_mesh_types.h"
|
||||||
#include "DNA_meshdata_types.h"
|
#include "DNA_meshdata_types.h"
|
||||||
#include "DNA_space_types.h"
|
#include "DNA_space_types.h"
|
||||||
@@ -38,6 +39,65 @@ namespace blender::ed::spreadsheet {
|
|||||||
using blender::bke::ReadAttribute;
|
using blender::bke::ReadAttribute;
|
||||||
using blender::bke::ReadAttributePtr;
|
using blender::bke::ReadAttributePtr;
|
||||||
|
|
||||||
|
static void add_columns_for_instances(const InstancesComponent &instances_component,
|
||||||
|
SpreadsheetColumnLayout &column_layout,
|
||||||
|
ResourceCollector &resources)
|
||||||
|
{
|
||||||
|
Span<InstancedData> instance_data = instances_component.instanced_data();
|
||||||
|
Span<float4x4> transforms = instances_component.transforms();
|
||||||
|
|
||||||
|
Vector<std::unique_ptr<SpreadsheetColumn>> &columns =
|
||||||
|
resources.construct<Vector<std::unique_ptr<SpreadsheetColumn>>>("columns");
|
||||||
|
|
||||||
|
columns.append(spreadsheet_column_from_function(
|
||||||
|
"Name", [instance_data](int index, CellValue &r_cell_value) {
|
||||||
|
const InstancedData &data = instance_data[index];
|
||||||
|
if (data.type == INSTANCE_DATA_TYPE_OBJECT) {
|
||||||
|
if (data.data.object != nullptr) {
|
||||||
|
r_cell_value.value = ObjectCellValue{data.data.object};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (data.type == INSTANCE_DATA_TYPE_COLLECTION) {
|
||||||
|
if (data.data.collection != nullptr) {
|
||||||
|
r_cell_value.value = CollectionCellValue{data.data.collection};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
columns.last()->default_width = 8.0f;
|
||||||
|
|
||||||
|
static std::array<char, 3> axis_char = {'X', 'Y', 'Z'};
|
||||||
|
for (const int i : {0, 1, 2}) {
|
||||||
|
std::string name = std::string("Position ") + axis_char[i];
|
||||||
|
columns.append(spreadsheet_column_from_function(
|
||||||
|
name, [transforms, i](int index, CellValue &r_cell_value) {
|
||||||
|
r_cell_value.value = transforms[index].translation()[i];
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const int i : {0, 1, 2}) {
|
||||||
|
std::string name = std::string("Rotation ") + axis_char[i];
|
||||||
|
columns.append(spreadsheet_column_from_function(
|
||||||
|
name, [transforms, i](int index, CellValue &r_cell_value) {
|
||||||
|
r_cell_value.value = transforms[index].to_euler()[i];
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const int i : {0, 1, 2}) {
|
||||||
|
std::string name = std::string("Scale ") + axis_char[i];
|
||||||
|
columns.append(spreadsheet_column_from_function(
|
||||||
|
name, [transforms, i](int index, CellValue &r_cell_value) {
|
||||||
|
r_cell_value.value = transforms[index].scale()[i];
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::unique_ptr<SpreadsheetColumn> &column : columns) {
|
||||||
|
column_layout.columns.append(column.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
column_layout.row_indices = instance_data.index_range().as_span();
|
||||||
|
}
|
||||||
|
|
||||||
static Vector<std::string> get_sorted_attribute_names_to_display(
|
static Vector<std::string> get_sorted_attribute_names_to_display(
|
||||||
const GeometryComponent &component, const AttributeDomain domain)
|
const GeometryComponent &component, const AttributeDomain domain)
|
||||||
{
|
{
|
||||||
@@ -342,6 +402,12 @@ void spreadsheet_columns_from_geometry(const bContext *C,
|
|||||||
if (component == nullptr) {
|
if (component == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (component_type == GEO_COMPONENT_TYPE_INSTANCES) {
|
||||||
|
add_columns_for_instances(
|
||||||
|
*static_cast<const InstancesComponent *>(component), column_layout, resources);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!component->attribute_domain_supported(domain)) {
|
if (!component->attribute_domain_supported(domain)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -7320,6 +7320,11 @@ static void rna_def_space_spreadsheet(BlenderRNA *brna)
|
|||||||
ICON_POINTCLOUD_DATA,
|
ICON_POINTCLOUD_DATA,
|
||||||
"Point Cloud",
|
"Point Cloud",
|
||||||
"Point cloud component containing only point data"},
|
"Point cloud component containing only point data"},
|
||||||
|
{GEO_COMPONENT_TYPE_INSTANCES,
|
||||||
|
"INSTANCES",
|
||||||
|
ICON_EMPTY_AXIS,
|
||||||
|
"Instances",
|
||||||
|
"Instances of objects or collections"},
|
||||||
{0, NULL, 0, NULL, NULL},
|
{0, NULL, 0, NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user