WIP: Brush assets project #106303
|
@ -523,7 +523,7 @@ bool MetalDeviceQueue::enqueue(DeviceKernel kernel,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bvhMetalRT) {
|
if (bvhMetalRT && bvhMetalRT->accel_struct) {
|
||||||
/* Mark all Accelerations resources as used */
|
/* Mark all Accelerations resources as used */
|
||||||
[mtlComputeCommandEncoder useResource:bvhMetalRT->accel_struct
|
[mtlComputeCommandEncoder useResource:bvhMetalRT->accel_struct
|
||||||
usage:MTLResourceUsageRead];
|
usage:MTLResourceUsageRead];
|
||||||
|
|
|
@ -58,4 +58,4 @@ class AssetCatalogCollection {
|
||||||
static OwningAssetCatalogMap copy_catalog_map(const OwningAssetCatalogMap &orig);
|
static OwningAssetCatalogMap copy_catalog_map(const OwningAssetCatalogMap &orig);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace blender::asset_system
|
||||||
|
|
|
@ -29,7 +29,7 @@ class GField;
|
||||||
namespace blender::bke {
|
namespace blender::bke {
|
||||||
|
|
||||||
enum class AttrDomain : int8_t {
|
enum class AttrDomain : int8_t {
|
||||||
/* Use for to choose automatically based on other data. */
|
/* Used to choose automatically based on other data. */
|
||||||
Auto = -1,
|
Auto = -1,
|
||||||
/* Mesh, Curve or Point Cloud Point. */
|
/* Mesh, Curve or Point Cloud Point. */
|
||||||
Point = 0,
|
Point = 0,
|
||||||
|
|
|
@ -368,19 +368,17 @@ SphericalHarmonicL1 spherical_harmonics_triple_product(SphericalHarmonicL1 a,
|
||||||
/* Adapted from:
|
/* Adapted from:
|
||||||
* "Code Generation and Factoring for Fast Evaluation of Low-order Spherical Harmonic Products
|
* "Code Generation and Factoring for Fast Evaluation of Low-order Spherical Harmonic Products
|
||||||
* and Squares" Function "SH_product_3". */
|
* and Squares" Function "SH_product_3". */
|
||||||
|
const float L0_M0_coef = 0.282094792;
|
||||||
SphericalHarmonicL1 sh;
|
SphericalHarmonicL1 sh;
|
||||||
sh.L0.M0 = 0.282094792 * a.L0.M0 * b.L0.M0;
|
sh.L0.M0 = a.L0.M0 * b.L0.M0;
|
||||||
|
sh.L0.M0 += a.L1.Mn1 * b.L1.Mn1;
|
||||||
|
sh.L0.M0 += a.L1.M0 * b.L1.M0;
|
||||||
|
sh.L0.M0 += a.L1.Mp1 * b.L1.Mp1;
|
||||||
|
sh.L0.M0 *= L0_M0_coef;
|
||||||
|
|
||||||
vec4 ta = 0.282094791 * a.L0.M0;
|
sh.L1.Mn1 = L0_M0_coef * (a.L0.M0 * b.L1.Mn1 + b.L0.M0 * a.L1.Mn1);
|
||||||
vec4 tb = 0.282094791 * b.L0.M0;
|
sh.L1.M0 = L0_M0_coef * (a.L0.M0 * b.L1.M0 + b.L0.M0 * a.L1.M0);
|
||||||
|
sh.L1.Mp1 = L0_M0_coef * (a.L0.M0 * b.L1.Mp1 + b.L0.M0 * a.L1.Mp1);
|
||||||
sh.L1.Mn1 = ta * b.L1.Mn1 + tb * a.L1.Mn1;
|
|
||||||
sh.L1.M0 = ta * b.L1.M0 + tb * a.L1.M0;
|
|
||||||
sh.L1.Mp1 = ta * b.L1.Mp1 + tb * a.L1.Mp1;
|
|
||||||
|
|
||||||
sh.L0.M0 += 0.282094791 * (a.L1.Mn1 * b.L1.Mn1);
|
|
||||||
sh.L0.M0 += 0.282094795 * (a.L1.M0 * b.L1.M0);
|
|
||||||
sh.L0.M0 += 0.282094791 * (a.L1.Mp1 * b.L1.Mp1);
|
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,8 @@
|
||||||
#include "BLI_listbase.h"
|
#include "BLI_listbase.h"
|
||||||
#include "BLI_math_matrix.h"
|
#include "BLI_math_matrix.h"
|
||||||
#include "BLI_path_util.h"
|
#include "BLI_path_util.h"
|
||||||
|
#include "BLI_sort.hh"
|
||||||
|
#include "BLI_span.hh"
|
||||||
#include "BLI_string.h"
|
#include "BLI_string.h"
|
||||||
#include "BLI_timeit.hh"
|
#include "BLI_timeit.hh"
|
||||||
|
|
||||||
|
@ -453,6 +455,16 @@ static void report_job_duration(const ImportJobData *data)
|
||||||
std::cout << '\n';
|
std::cout << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sort_readers(blender::MutableSpan<AbcObjectReader *> readers)
|
||||||
|
{
|
||||||
|
blender::parallel_sort(
|
||||||
|
readers.begin(), readers.end(), [](const AbcObjectReader *a, const AbcObjectReader *b) {
|
||||||
|
const char *na = a->name().c_str();
|
||||||
|
const char *nb = b->name().c_str();
|
||||||
|
return BLI_strcasecmp(na, nb) < 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status)
|
static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status)
|
||||||
{
|
{
|
||||||
SCOPE_TIMER("Alembic import, objects reading and creation");
|
SCOPE_TIMER("Alembic import, objects reading and creation");
|
||||||
|
@ -509,6 +521,10 @@ static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status)
|
||||||
|
|
||||||
/* Create objects and set scene frame range. */
|
/* Create objects and set scene frame range. */
|
||||||
|
|
||||||
|
/* Sort readers by name: when creating a lot of objects in Blender,
|
||||||
|
* it is much faster if the order is sorted by name. */
|
||||||
|
sort_readers(data->readers);
|
||||||
|
|
||||||
const float size = float(data->readers.size());
|
const float size = float(data->readers.size());
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
|
@ -531,7 +547,7 @@ static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status)
|
||||||
<< " is invalid.\n";
|
<< " is invalid.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
*data->progress = 0.1f + 0.3f * (++i / size);
|
*data->progress = 0.1f + 0.6f * (++i / size);
|
||||||
*data->do_update = true;
|
*data->do_update = true;
|
||||||
|
|
||||||
if (G.is_break) {
|
if (G.is_break) {
|
||||||
|
|
|
@ -107,7 +107,7 @@ static void node_rna(StructRNA *srna)
|
||||||
rna_enum_attribute_domain_without_corner_items,
|
rna_enum_attribute_domain_without_corner_items,
|
||||||
NOD_storage_enum_accessors(domain),
|
NOD_storage_enum_accessors(domain),
|
||||||
int(AttrDomain::Point),
|
int(AttrDomain::Point),
|
||||||
enums::domain_experimental_grease_pencil_version3_fn);
|
enums::domain_without_corner_experimental_grease_pencil_version3_fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_register()
|
static void node_register()
|
||||||
|
|
Loading…
Reference in New Issue