forked from blender/blender
main sync #3
@ -745,6 +745,8 @@ class ASSETBROWSER_PT_metadata(asset_utils.AssetBrowserPanel, Panel):
|
|||||||
row.operator("asset.open_containing_blend_file", text="", icon='TOOL_SETTINGS')
|
row.operator("asset.open_containing_blend_file", text="", icon='TOOL_SETTINGS')
|
||||||
|
|
||||||
layout.prop(asset_file_handle.asset_data, "description")
|
layout.prop(asset_file_handle.asset_data, "description")
|
||||||
|
layout.prop(asset_file_handle.asset_data, "license")
|
||||||
|
layout.prop(asset_file_handle.asset_data, "copyright")
|
||||||
layout.prop(asset_file_handle.asset_data, "author")
|
layout.prop(asset_file_handle.asset_data, "author")
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,6 +44,8 @@ AssetMetaData::~AssetMetaData()
|
|||||||
}
|
}
|
||||||
MEM_SAFE_FREE(author);
|
MEM_SAFE_FREE(author);
|
||||||
MEM_SAFE_FREE(description);
|
MEM_SAFE_FREE(description);
|
||||||
|
MEM_SAFE_FREE(copyright);
|
||||||
|
MEM_SAFE_FREE(license);
|
||||||
BLI_freelistN(&tags);
|
BLI_freelistN(&tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,13 +163,19 @@ void BKE_asset_metadata_write(BlendWriter *writer, AssetMetaData *asset_data)
|
|||||||
if (asset_data->properties) {
|
if (asset_data->properties) {
|
||||||
IDP_BlendWrite(writer, asset_data->properties);
|
IDP_BlendWrite(writer, asset_data->properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (asset_data->author) {
|
if (asset_data->author) {
|
||||||
BLO_write_string(writer, asset_data->author);
|
BLO_write_string(writer, asset_data->author);
|
||||||
}
|
}
|
||||||
if (asset_data->description) {
|
if (asset_data->description) {
|
||||||
BLO_write_string(writer, asset_data->description);
|
BLO_write_string(writer, asset_data->description);
|
||||||
}
|
}
|
||||||
|
if (asset_data->copyright) {
|
||||||
|
BLO_write_string(writer, asset_data->copyright);
|
||||||
|
}
|
||||||
|
if (asset_data->license) {
|
||||||
|
BLO_write_string(writer, asset_data->license);
|
||||||
|
}
|
||||||
|
|
||||||
LISTBASE_FOREACH (AssetTag *, tag, &asset_data->tags) {
|
LISTBASE_FOREACH (AssetTag *, tag, &asset_data->tags) {
|
||||||
BLO_write_struct(writer, AssetTag, tag);
|
BLO_write_struct(writer, AssetTag, tag);
|
||||||
}
|
}
|
||||||
@ -185,6 +193,8 @@ void BKE_asset_metadata_read(BlendDataReader *reader, AssetMetaData *asset_data)
|
|||||||
|
|
||||||
BLO_read_data_address(reader, &asset_data->author);
|
BLO_read_data_address(reader, &asset_data->author);
|
||||||
BLO_read_data_address(reader, &asset_data->description);
|
BLO_read_data_address(reader, &asset_data->description);
|
||||||
|
BLO_read_data_address(reader, &asset_data->copyright);
|
||||||
|
BLO_read_data_address(reader, &asset_data->license);
|
||||||
BLO_read_list(reader, &asset_data->tags);
|
BLO_read_list(reader, &asset_data->tags);
|
||||||
BLI_assert(BLI_listbase_count(&asset_data->tags) == asset_data->tot_tags);
|
BLI_assert(BLI_listbase_count(&asset_data->tags) == asset_data->tot_tags);
|
||||||
}
|
}
|
||||||
|
@ -272,7 +272,7 @@ static bool library_foreach_ID_link(Main *bmain,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bmain != NULL && bmain->relations != NULL && (flag & IDWALK_READONLY) &&
|
if (bmain != NULL && bmain->relations != NULL && (flag & IDWALK_READONLY) &&
|
||||||
(flag & IDWALK_DO_INTERNAL_RUNTIME_POINTERS) == 0 &&
|
(flag & (IDWALK_DO_INTERNAL_RUNTIME_POINTERS | IDWALK_DO_LIBRARY_POINTER)) == 0 &&
|
||||||
(((bmain->relations->flag & MAINIDRELATIONS_INCLUDE_UI) == 0) ==
|
(((bmain->relations->flag & MAINIDRELATIONS_INCLUDE_UI) == 0) ==
|
||||||
((data.flag & IDWALK_INCLUDE_UI) == 0))) {
|
((data.flag & IDWALK_INCLUDE_UI) == 0))) {
|
||||||
/* Note that this is minor optimization, even in worst cases (like id being an object with
|
/* Note that this is minor optimization, even in worst cases (like id being an object with
|
||||||
|
@ -56,13 +56,16 @@ using namespace blender::bke::idprop;
|
|||||||
* "catalog_name": "<catalog_name>",
|
* "catalog_name": "<catalog_name>",
|
||||||
* "description": "<description>",
|
* "description": "<description>",
|
||||||
* "author": "<author>",
|
* "author": "<author>",
|
||||||
|
* "copyright": "<copyright>",
|
||||||
|
* "license": "<license>",
|
||||||
* "tags": ["<tag>"],
|
* "tags": ["<tag>"],
|
||||||
* "properties": [..]
|
* "properties": [..]
|
||||||
* }]
|
* }]
|
||||||
* }
|
* }
|
||||||
* \endcode
|
* \endcode
|
||||||
*
|
*
|
||||||
* NOTE: entries, author, description, tags and properties are optional attributes.
|
* NOTE: entries, author, description, copyright, license, tags and properties are optional
|
||||||
|
* attributes.
|
||||||
*
|
*
|
||||||
* NOTE: File browser uses name and idcode separate. Inside the index they are joined together like
|
* NOTE: File browser uses name and idcode separate. Inside the index they are joined together like
|
||||||
* #ID.name.
|
* #ID.name.
|
||||||
@ -75,6 +78,8 @@ constexpr StringRef ATTRIBUTE_ENTRIES_CATALOG_ID("catalog_id");
|
|||||||
constexpr StringRef ATTRIBUTE_ENTRIES_CATALOG_NAME("catalog_name");
|
constexpr StringRef ATTRIBUTE_ENTRIES_CATALOG_NAME("catalog_name");
|
||||||
constexpr StringRef ATTRIBUTE_ENTRIES_DESCRIPTION("description");
|
constexpr StringRef ATTRIBUTE_ENTRIES_DESCRIPTION("description");
|
||||||
constexpr StringRef ATTRIBUTE_ENTRIES_AUTHOR("author");
|
constexpr StringRef ATTRIBUTE_ENTRIES_AUTHOR("author");
|
||||||
|
constexpr StringRef ATTRIBUTE_ENTRIES_COPYRIGHT("copyright");
|
||||||
|
constexpr StringRef ATTRIBUTE_ENTRIES_LICENSE("license");
|
||||||
constexpr StringRef ATTRIBUTE_ENTRIES_TAGS("tags");
|
constexpr StringRef ATTRIBUTE_ENTRIES_TAGS("tags");
|
||||||
constexpr StringRef ATTRIBUTE_ENTRIES_PROPERTIES("properties");
|
constexpr StringRef ATTRIBUTE_ENTRIES_PROPERTIES("properties");
|
||||||
|
|
||||||
@ -178,6 +183,26 @@ struct AssetEntryReader {
|
|||||||
return lookup.lookup(ATTRIBUTE_ENTRIES_AUTHOR)->as_string_value()->value();
|
return lookup.lookup(ATTRIBUTE_ENTRIES_AUTHOR)->as_string_value()->value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool has_copyright() const
|
||||||
|
{
|
||||||
|
return lookup.contains(ATTRIBUTE_ENTRIES_COPYRIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringRefNull get_copyright() const
|
||||||
|
{
|
||||||
|
return lookup.lookup(ATTRIBUTE_ENTRIES_COPYRIGHT)->as_string_value()->value();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool has_license() const
|
||||||
|
{
|
||||||
|
return lookup.contains(ATTRIBUTE_ENTRIES_LICENSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringRefNull get_license() const
|
||||||
|
{
|
||||||
|
return lookup.lookup(ATTRIBUTE_ENTRIES_LICENSE)->as_string_value()->value();
|
||||||
|
}
|
||||||
|
|
||||||
StringRefNull get_catalog_name() const
|
StringRefNull get_catalog_name() const
|
||||||
{
|
{
|
||||||
return lookup.lookup(ATTRIBUTE_ENTRIES_CATALOG_NAME)->as_string_value()->value();
|
return lookup.lookup(ATTRIBUTE_ENTRIES_CATALOG_NAME)->as_string_value()->value();
|
||||||
@ -267,6 +292,16 @@ struct AssetEntryWriter {
|
|||||||
attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_AUTHOR, new StringValue(author)));
|
attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_AUTHOR, new StringValue(author)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void add_copyright(const StringRefNull copyright)
|
||||||
|
{
|
||||||
|
attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_COPYRIGHT, new StringValue(copyright)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_license(const StringRefNull license)
|
||||||
|
{
|
||||||
|
attributes.append_as(std::pair(ATTRIBUTE_ENTRIES_LICENSE, new StringValue(license)));
|
||||||
|
}
|
||||||
|
|
||||||
void add_tags(const ListBase /* AssetTag */ *asset_tags)
|
void add_tags(const ListBase /* AssetTag */ *asset_tags)
|
||||||
{
|
{
|
||||||
ArrayValue *tags = new ArrayValue();
|
ArrayValue *tags = new ArrayValue();
|
||||||
@ -305,6 +340,12 @@ static void init_value_from_file_indexer_entry(AssetEntryWriter &result,
|
|||||||
if (asset_data.author != nullptr) {
|
if (asset_data.author != nullptr) {
|
||||||
result.add_author(asset_data.author);
|
result.add_author(asset_data.author);
|
||||||
}
|
}
|
||||||
|
if (asset_data.copyright != nullptr) {
|
||||||
|
result.add_copyright(asset_data.copyright);
|
||||||
|
}
|
||||||
|
if (asset_data.license != nullptr) {
|
||||||
|
result.add_license(asset_data.license);
|
||||||
|
}
|
||||||
|
|
||||||
if (!BLI_listbase_is_empty(&asset_data.tags)) {
|
if (!BLI_listbase_is_empty(&asset_data.tags)) {
|
||||||
result.add_tags(&asset_data.tags);
|
result.add_tags(&asset_data.tags);
|
||||||
@ -372,6 +413,18 @@ static void init_indexer_entry_from_value(FileIndexerEntry &indexer_entry,
|
|||||||
BLI_strncpy(author_c_str, author.c_str(), author.size() + 1);
|
BLI_strncpy(author_c_str, author.c_str(), author.size() + 1);
|
||||||
asset_data->author = author_c_str;
|
asset_data->author = author_c_str;
|
||||||
}
|
}
|
||||||
|
if (entry.has_copyright()) {
|
||||||
|
const StringRefNull copyright = entry.get_copyright();
|
||||||
|
char *copyright_c_str = static_cast<char *>(MEM_mallocN(copyright.size() + 1, __func__));
|
||||||
|
BLI_strncpy(copyright_c_str, copyright.c_str(), copyright.size() + 1);
|
||||||
|
asset_data->copyright = copyright_c_str;
|
||||||
|
}
|
||||||
|
if (entry.has_license()) {
|
||||||
|
const StringRefNull license = entry.get_license();
|
||||||
|
char *license_c_str = static_cast<char *>(MEM_mallocN(license.size() + 1, __func__));
|
||||||
|
BLI_strncpy(license_c_str, license.c_str(), license.size() + 1);
|
||||||
|
asset_data->license = license_c_str;
|
||||||
|
}
|
||||||
|
|
||||||
const StringRefNull catalog_name = entry.get_catalog_name();
|
const StringRefNull catalog_name = entry.get_catalog_name();
|
||||||
BLI_strncpy(asset_data->catalog_simple_name,
|
BLI_strncpy(asset_data->catalog_simple_name,
|
||||||
|
@ -72,6 +72,12 @@ typedef struct AssetMetaData {
|
|||||||
/** Optional description of this asset for display in the UI. Dynamic length. */
|
/** Optional description of this asset for display in the UI. Dynamic length. */
|
||||||
char *description;
|
char *description;
|
||||||
|
|
||||||
|
/** Optional copyright of this asset for display in the UI. Dynamic length. */
|
||||||
|
char *copyright;
|
||||||
|
|
||||||
|
/** Optional license of this asset for display in the UI. Dynamic length. */
|
||||||
|
char *license;
|
||||||
|
|
||||||
/** User defined tags for this asset. The asset manager uses these for filtering, but how they
|
/** User defined tags for this asset. The asset manager uses these for filtering, but how they
|
||||||
* function exactly (e.g. how they are registered to provide a list of searchable available tags)
|
* function exactly (e.g. how they are registered to provide a list of searchable available tags)
|
||||||
* is up to the asset-engine. */
|
* is up to the asset-engine. */
|
||||||
|
@ -205,6 +205,74 @@ static void rna_AssetMetaData_description_set(PointerRNA *ptr, const char *value
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rna_AssetMetaData_copyright_get(PointerRNA *ptr, char *value)
|
||||||
|
{
|
||||||
|
AssetMetaData *asset_data = ptr->data;
|
||||||
|
|
||||||
|
if (asset_data->copyright) {
|
||||||
|
strcpy(value, asset_data->copyright);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
value[0] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rna_AssetMetaData_copyright_length(PointerRNA *ptr)
|
||||||
|
{
|
||||||
|
AssetMetaData *asset_data = ptr->data;
|
||||||
|
return asset_data->copyright ? strlen(asset_data->copyright) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rna_AssetMetaData_copyright_set(PointerRNA *ptr, const char *value)
|
||||||
|
{
|
||||||
|
AssetMetaData *asset_data = ptr->data;
|
||||||
|
|
||||||
|
if (asset_data->copyright) {
|
||||||
|
MEM_freeN(asset_data->copyright);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value[0]) {
|
||||||
|
asset_data->copyright = BLI_strdup(value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
asset_data->copyright = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rna_AssetMetaData_license_get(PointerRNA *ptr, char *value)
|
||||||
|
{
|
||||||
|
AssetMetaData *asset_data = ptr->data;
|
||||||
|
|
||||||
|
if (asset_data->license) {
|
||||||
|
strcpy(value, asset_data->license);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
value[0] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rna_AssetMetaData_license_length(PointerRNA *ptr)
|
||||||
|
{
|
||||||
|
AssetMetaData *asset_data = ptr->data;
|
||||||
|
return asset_data->license ? strlen(asset_data->license) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rna_AssetMetaData_license_set(PointerRNA *ptr, const char *value)
|
||||||
|
{
|
||||||
|
AssetMetaData *asset_data = ptr->data;
|
||||||
|
|
||||||
|
if (asset_data->license) {
|
||||||
|
MEM_freeN(asset_data->license);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value[0]) {
|
||||||
|
asset_data->license = BLI_strdup(value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
asset_data->license = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void rna_AssetMetaData_active_tag_range(
|
static void rna_AssetMetaData_active_tag_range(
|
||||||
PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
|
PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
|
||||||
{
|
{
|
||||||
@ -397,6 +465,30 @@ static void rna_def_asset_data(BlenderRNA *brna)
|
|||||||
RNA_def_property_ui_text(
|
RNA_def_property_ui_text(
|
||||||
prop, "Description", "A description of the asset to be displayed for the user");
|
prop, "Description", "A description of the asset to be displayed for the user");
|
||||||
|
|
||||||
|
prop = RNA_def_property(srna, "copyright", PROP_STRING, PROP_NONE);
|
||||||
|
RNA_def_property_editable_func(prop, "rna_AssetMetaData_editable");
|
||||||
|
RNA_def_property_string_funcs(prop,
|
||||||
|
"rna_AssetMetaData_copyright_get",
|
||||||
|
"rna_AssetMetaData_copyright_length",
|
||||||
|
"rna_AssetMetaData_copyright_set");
|
||||||
|
RNA_def_property_ui_text(
|
||||||
|
prop,
|
||||||
|
"Copyright",
|
||||||
|
"Copyright notice for this asset. An empty copyright notice does not necessarily indicate "
|
||||||
|
"that this is copyright-free. Contact the author if any clarification is needed");
|
||||||
|
|
||||||
|
prop = RNA_def_property(srna, "license", PROP_STRING, PROP_NONE);
|
||||||
|
RNA_def_property_editable_func(prop, "rna_AssetMetaData_editable");
|
||||||
|
RNA_def_property_string_funcs(prop,
|
||||||
|
"rna_AssetMetaData_license_get",
|
||||||
|
"rna_AssetMetaData_license_length",
|
||||||
|
"rna_AssetMetaData_license_set");
|
||||||
|
RNA_def_property_ui_text(prop,
|
||||||
|
"License",
|
||||||
|
"The type of license this asset is distributed under. An empty license "
|
||||||
|
"name does not necessarily indicate that this is free of licensing "
|
||||||
|
"terms. Contact the author if any clarification is needed");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "tags", PROP_COLLECTION, PROP_NONE);
|
prop = RNA_def_property(srna, "tags", PROP_COLLECTION, PROP_NONE);
|
||||||
RNA_def_property_struct_type(prop, "AssetTag");
|
RNA_def_property_struct_type(prop, "AssetTag");
|
||||||
RNA_def_property_editable_func(prop, "rna_AssetMetaData_editable");
|
RNA_def_property_editable_func(prop, "rna_AssetMetaData_editable");
|
||||||
|
Loading…
Reference in New Issue
Block a user