Cleanup: spelling in comments
This commit is contained in:
parent
268f93d763
commit
0ba83fde1f
@ -257,7 +257,7 @@ class BlenderVolumeLoader : public VDBImageLoader {
|
|||||||
|
|
||||||
BL::Volume b_volume;
|
BL::Volume b_volume;
|
||||||
#ifdef WITH_OPENVDB
|
#ifdef WITH_OPENVDB
|
||||||
/* Store tree user so that the openvdb grid that is shared with Blender is not unloaded. */
|
/* Store tree user so that the OPENVDB grid that is shared with Blender is not unloaded. */
|
||||||
blender::bke::VolumeTreeAccessToken tree_access_token;
|
blender::bke::VolumeTreeAccessToken tree_access_token;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
@ -516,7 +516,7 @@ class AddPresetTrackingSettings(AddPresetBase, Operator):
|
|||||||
|
|
||||||
|
|
||||||
class AddPresetEEVEERaytracing(AddPresetBase, Operator):
|
class AddPresetEEVEERaytracing(AddPresetBase, Operator):
|
||||||
"""Add or remove an EEVEE raytracing preset"""
|
"""Add or remove an EEVEE ray-tracing preset"""
|
||||||
bl_idname = "render.eevee_raytracing_preset_add"
|
bl_idname = "render.eevee_raytracing_preset_add"
|
||||||
bl_label = "Add Raytracing Preset"
|
bl_label = "Add Raytracing Preset"
|
||||||
preset_menu = "RENDER_PT_eevee_next_raytracing_presets"
|
preset_menu = "RENDER_PT_eevee_next_raytracing_presets"
|
||||||
|
@ -681,7 +681,7 @@ void ANIM_armature_bonecoll_remove_from_index(bArmature *armature, int index)
|
|||||||
armature_bonecoll_is_child_of(
|
armature_bonecoll_is_child_of(
|
||||||
armature, parent_bcoll_index, active_collection_index - 1))
|
armature, parent_bcoll_index, active_collection_index - 1))
|
||||||
{
|
{
|
||||||
/* The child preceeding active_collection_index is a sibling of the removed collection. */
|
/* The child preceding active_collection_index is a sibling of the removed collection. */
|
||||||
ANIM_armature_bonecoll_active_index_set(armature, active_collection_index - 1);
|
ANIM_armature_bonecoll_active_index_set(armature, active_collection_index - 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -721,7 +721,7 @@ int ANIM_armature_bonecoll_get_index_by_name(bArmature *armature, const char *na
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear BONE_COLLECTION_ANCESTORS_VISIBLE on all decendents of this bone collection. */
|
/** Clear #BONE_COLLECTION_ANCESTORS_VISIBLE on all decedents of this bone collection. */
|
||||||
static void ancestors_visible_descendants_clear(bArmature *armature, BoneCollection *parent_bcoll)
|
static void ancestors_visible_descendants_clear(bArmature *armature, BoneCollection *parent_bcoll)
|
||||||
{
|
{
|
||||||
for (BoneCollection *bcoll : armature->collection_children(parent_bcoll)) {
|
for (BoneCollection *bcoll : armature->collection_children(parent_bcoll)) {
|
||||||
@ -730,7 +730,7 @@ static void ancestors_visible_descendants_clear(bArmature *armature, BoneCollect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set or clear BONE_COLLECTION_ANCESTORS_VISIBLE on all decendents of this bone collection. */
|
/** Set or clear #BONE_COLLECTION_ANCESTORS_VISIBLE on all decedents of this bone collection. */
|
||||||
static void ancestors_visible_descendants_update(bArmature *armature, BoneCollection *parent_bcoll)
|
static void ancestors_visible_descendants_update(bArmature *armature, BoneCollection *parent_bcoll)
|
||||||
{
|
{
|
||||||
if (!parent_bcoll->is_visible_effectively()) {
|
if (!parent_bcoll->is_visible_effectively()) {
|
||||||
@ -749,7 +749,7 @@ static void ancestors_visible_descendants_update(bArmature *armature, BoneCollec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set/clear BONE_COLLECTION_ANCESTORS_VISIBLE on this bone collection and all its decendents. */
|
/** Set/clear BONE_COLLECTION_ANCESTORS_VISIBLE on this bone collection and all its decedents. */
|
||||||
static void ancestors_visible_update(bArmature *armature,
|
static void ancestors_visible_update(bArmature *armature,
|
||||||
const BoneCollection *parent_bcoll,
|
const BoneCollection *parent_bcoll,
|
||||||
BoneCollection *bcoll)
|
BoneCollection *bcoll)
|
||||||
|
@ -1495,7 +1495,7 @@ class ANIM_armature_bone_collections_liboverrides
|
|||||||
ANIM_armature_bone_collections_testlist::SetUp();
|
ANIM_armature_bone_collections_testlist::SetUp();
|
||||||
|
|
||||||
/* TODO: make this clone `arm` into `dst_arm`, instead of assuming the below
|
/* TODO: make this clone `arm` into `dst_arm`, instead of assuming the below
|
||||||
* code is still in sync with the superclass. */
|
* code is still in sync with the super-class. */
|
||||||
memset(&dst_arm, 0, sizeof(dst_arm));
|
memset(&dst_arm, 0, sizeof(dst_arm));
|
||||||
STRNCPY(dst_arm.id.name, "ARArmatureDST");
|
STRNCPY(dst_arm.id.name, "ARArmatureDST");
|
||||||
|
|
||||||
@ -1524,7 +1524,7 @@ class ANIM_armature_bone_collections_liboverrides
|
|||||||
|
|
||||||
TEST_F(ANIM_armature_bone_collections_liboverrides, bcoll_insert_copy_after)
|
TEST_F(ANIM_armature_bone_collections_liboverrides, bcoll_insert_copy_after)
|
||||||
{
|
{
|
||||||
/* Mimick that a new root, two children, and two grandchildren were added via library overrides.
|
/* Mimic that a new root, two children, and two grandchildren were added via library overrides.
|
||||||
* These were saved in `arm`, and now need to be copied into `dst_arm`. */
|
* These were saved in `arm`, and now need to be copied into `dst_arm`. */
|
||||||
BoneCollection *src_root = ANIM_armature_bonecoll_new(&arm, "new_root");
|
BoneCollection *src_root = ANIM_armature_bonecoll_new(&arm, "new_root");
|
||||||
const int root_index = armature_bonecoll_find_index(&arm, src_root);
|
const int root_index = armature_bonecoll_find_index(&arm, src_root);
|
||||||
|
@ -124,7 +124,7 @@ class SocketValueVariant {
|
|||||||
/**
|
/**
|
||||||
* Convert the stored value into a single value. For simple value access, this is not necessary,
|
* Convert the stored value into a single value. For simple value access, this is not necessary,
|
||||||
* because #get` does the conversion implicitly. However, it is necessary if one wants to use
|
* because #get` does the conversion implicitly. However, it is necessary if one wants to use
|
||||||
* #get_single_ptr. Context-dependend fields or grids will just result in a fallback value.
|
* #get_single_ptr. Context-depended fields or grids will just result in a fallback value.
|
||||||
*
|
*
|
||||||
* The caller has to make sure that the stored value is a single value, field or grid.
|
* The caller has to make sure that the stored value is a single value, field or grid.
|
||||||
*/
|
*/
|
||||||
|
@ -31,7 +31,7 @@ namespace blender::bke::volume_grid {
|
|||||||
*
|
*
|
||||||
* A grid contains the following:
|
* A grid contains the following:
|
||||||
* - Transform: The mapping between index and object space. It also determines e.g. the voxel size.
|
* - Transform: The mapping between index and object space. It also determines e.g. the voxel size.
|
||||||
* - Meta-data: Contains e.g. the name and grid class (fog volume or sdf) and potentially other
|
* - Meta-data: Contains e.g. the name and grid class (fog volume or SDF) and potentially other
|
||||||
* data.
|
* data.
|
||||||
* - Tree: This is the heavy data that contains all the voxel values.
|
* - Tree: This is the heavy data that contains all the voxel values.
|
||||||
*
|
*
|
||||||
@ -44,12 +44,12 @@ namespace blender::bke::volume_grid {
|
|||||||
* with independent meta-data and transforms. The tree is only actually copied when necessary.
|
* with independent meta-data and transforms. The tree is only actually copied when necessary.
|
||||||
* - Lazy loading of the entire grid or just the tree: When constructing the #VolumeGridData it is
|
* - Lazy loading of the entire grid or just the tree: When constructing the #VolumeGridData it is
|
||||||
* possible to provide a callback that lazy-loads the grid when it is first accessed. This is
|
* possible to provide a callback that lazy-loads the grid when it is first accessed. This is
|
||||||
* especially benefitial when loading grids from a file and it's not clear in the beginning if
|
* especially beneficial when loading grids from a file and it's not clear in the beginning if
|
||||||
* the tree is actually needed. It's also supported to just load the meta-data and transform
|
* the tree is actually needed. It's also supported to just load the meta-data and transform
|
||||||
* first and to load the tree only when it's used. This allows e.g. transforming or renaming the
|
* first and to load the tree only when it's used. This allows e.g. transforming or renaming the
|
||||||
* grid without loading the tree.
|
* grid without loading the tree.
|
||||||
* - Unloading of the tree: It's possible to unload the tree data when it is not in use. This is
|
* - Unloading of the tree: It's possible to unload the tree data when it is not in use. This is
|
||||||
* only supported on a shared grid if the tree could be reloaded (e.g. by reading it from a vdb
|
* only supported on a shared grid if the tree could be reloaded (e.g. by reading it from a VDB
|
||||||
* file) and if no one is currently accessing the grid data.
|
* file) and if no one is currently accessing the grid data.
|
||||||
*/
|
*/
|
||||||
class VolumeGridData : public ImplicitSharingMixin {
|
class VolumeGridData : public ImplicitSharingMixin {
|
||||||
|
@ -44,8 +44,8 @@ struct GridsFromFile {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all the data stored in a .vdb file. This does not actually load the tree data, which is done
|
* Get all the data stored in a `.vdb` file.
|
||||||
* on demand.
|
* This does not actually load the tree data, which is done on demand.
|
||||||
*/
|
*/
|
||||||
GridsFromFile get_all_grids_from_file(StringRef file_path, int simplify_level = 0);
|
GridsFromFile get_all_grids_from_file(StringRef file_path, int simplify_level = 0);
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ void clear_tree(VolumeGridData &grid);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes sure that the volume grid is loaded afterwards. This is necessary to call this for
|
* Makes sure that the volume grid is loaded afterwards. This is necessary to call this for
|
||||||
* correctness, because the grid will be loaded on demand anyway. Sometimes it may be benefitial
|
* correctness, because the grid will be loaded on demand anyway. Sometimes it may be beneficial
|
||||||
* for performance to load the grid eagerly though.
|
* for performance to load the grid eagerly though.
|
||||||
*/
|
*/
|
||||||
void load(const VolumeGridData &grid);
|
void load(const VolumeGridData &grid);
|
||||||
|
@ -16,7 +16,7 @@ namespace blender::bke::volume_grid {
|
|||||||
#ifdef WITH_OPENVDB
|
#ifdef WITH_OPENVDB
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multiple #VolumeDataGrid can implictly share the same underlying tree with different
|
* Multiple #VolumeDataGrid can implicitly share the same underlying tree with different
|
||||||
* meta-data/transforms.
|
* meta-data/transforms.
|
||||||
*/
|
*/
|
||||||
class OpenvdbTreeSharingInfo : public ImplicitSharingInfo {
|
class OpenvdbTreeSharingInfo : public ImplicitSharingInfo {
|
||||||
@ -247,7 +247,7 @@ GVolumeGrid VolumeGridData::copy() const
|
|||||||
{
|
{
|
||||||
std::lock_guard lock{mutex_};
|
std::lock_guard lock{mutex_};
|
||||||
this->ensure_grid_loaded();
|
this->ensure_grid_loaded();
|
||||||
/* Can't use #MEM_new because the default construtor is private. */
|
/* Can't use #MEM_new because the default constructor is private. */
|
||||||
VolumeGridData *new_copy = new (MEM_mallocN(sizeof(VolumeGridData), __func__)) VolumeGridData();
|
VolumeGridData *new_copy = new (MEM_mallocN(sizeof(VolumeGridData), __func__)) VolumeGridData();
|
||||||
/* Makes a deep copy of the meta-data but shares the tree. */
|
/* Makes a deep copy of the meta-data but shares the tree. */
|
||||||
new_copy->grid_ = grid_->copyGrid();
|
new_copy->grid_ = grid_->copyGrid();
|
||||||
|
@ -15,7 +15,7 @@ void main()
|
|||||||
ivec2 texel = ivec2(gl_GlobalInvocationID.xy);
|
ivec2 texel = ivec2(gl_GlobalInvocationID.xy);
|
||||||
float depth = texture_load(depth_tx, texel).x;
|
float depth = texture_load(depth_tx, texel).x;
|
||||||
|
|
||||||
/* Compute Vu in equation (7). */
|
/* Compute `Vu` in equation (7). */
|
||||||
const float distance_to_image_of_object = (focal_length * depth) / (depth - focal_length);
|
const float distance_to_image_of_object = (focal_length * depth) / (depth - focal_length);
|
||||||
|
|
||||||
/* Compute C in equation (8). Notice that the last multiplier was included in the absolute since
|
/* Compute C in equation (8). Notice that the last multiplier was included in the absolute since
|
||||||
|
@ -510,7 +510,7 @@ void DeferredLayer::end_sync()
|
|||||||
RenderBuffersInfoData &rbuf_data = inst_.render_buffers.data;
|
RenderBuffersInfoData &rbuf_data = inst_.render_buffers.data;
|
||||||
|
|
||||||
/* NOTE: For tile-based GPU architectures, barriers are not always needed if implicit local
|
/* NOTE: For tile-based GPU architectures, barriers are not always needed if implicit local
|
||||||
* ordering is guarnteed via either blending order or explicit raster_order_groups. */
|
* ordering is guaranteed via either blending order or explicit raster_order_groups. */
|
||||||
bool is_tbdr_arch_metal = (GPU_platform_architecture() == GPU_ARCHITECTURE_TBDR) &&
|
bool is_tbdr_arch_metal = (GPU_platform_architecture() == GPU_ARCHITECTURE_TBDR) &&
|
||||||
(GPU_backend_get_type() == GPU_BACKEND_METAL);
|
(GPU_backend_get_type() == GPU_BACKEND_METAL);
|
||||||
|
|
||||||
|
@ -1206,7 +1206,7 @@ enum GBufferMode : uint32_t {
|
|||||||
GBUF_REFRACTION_COLORLESS = 13u,
|
GBUF_REFRACTION_COLORLESS = 13u,
|
||||||
|
|
||||||
/** Special configurations. Packs multiple closures into less layer. */
|
/** Special configurations. Packs multiple closures into less layer. */
|
||||||
/* TODO(fclem): This is isn't currently working due to monolitic nature of the evaluation. */
|
/* TODO(@fclem): This is isn't currently working due to monolithic nature of the evaluation. */
|
||||||
GBUF_METAL_CLEARCOAT = 15u,
|
GBUF_METAL_CLEARCOAT = 15u,
|
||||||
|
|
||||||
/** IMPORTANT: Needs to be less than 16 for correct packing in g-buffer header. */
|
/** IMPORTANT: Needs to be less than 16 for correct packing in g-buffer header. */
|
||||||
|
@ -59,7 +59,7 @@ void main()
|
|||||||
for (int i = 0; i < GBUFFER_LAYER_MAX && i < gbuf.closure_count; i++) {
|
for (int i = 0; i < GBUFFER_LAYER_MAX && i < gbuf.closure_count; i++) {
|
||||||
vec3 closure_light = load_radiance_direct(texel, i);
|
vec3 closure_light = load_radiance_direct(texel, i);
|
||||||
|
|
||||||
/* TODO(fclem): Enable for OpenGL and Vulkan once they fully support specialization constants.
|
/* TODO(fclem): Enable for OpenGL and VULKAN once they fully support specialization constants.
|
||||||
*/
|
*/
|
||||||
#ifndef GPU_METAL
|
#ifndef GPU_METAL
|
||||||
bool use_combined_lightprobe_eval = uniform_buf.pipeline.use_combined_lightprobe_eval;
|
bool use_combined_lightprobe_eval = uniform_buf.pipeline.use_combined_lightprobe_eval;
|
||||||
|
@ -87,7 +87,7 @@ void main()
|
|||||||
#ifdef MAT_SUBSURFACE
|
#ifdef MAT_SUBSURFACE
|
||||||
if (has_sss) {
|
if (has_sss) {
|
||||||
/* Add to diffuse light for processing inside the Screen Space SSS pass.
|
/* Add to diffuse light for processing inside the Screen Space SSS pass.
|
||||||
* The tranlucent light is not outputed as a separate quantity because
|
* The translucent light is not outputted as a separate quantity because
|
||||||
* it is over the closure_count. */
|
* it is over the closure_count. */
|
||||||
vec3 sss_profile = subsurface_transmission(gbuffer_closure_get(gbuf, 0).data.rgb, thickness);
|
vec3 sss_profile = subsurface_transmission(gbuffer_closure_get(gbuf, 0).data.rgb, thickness);
|
||||||
stack.cl[0].light_shadowed += stack.cl[gbuf.closure_count].light_shadowed * sss_profile;
|
stack.cl[0].light_shadowed += stack.cl[gbuf.closure_count].light_shadowed * sss_profile;
|
||||||
|
@ -85,7 +85,7 @@ struct GBufferReader {
|
|||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
/** \name Load / Store macros
|
/** \name Load / Store macros
|
||||||
*
|
*
|
||||||
* This allows for writting unit tests that read and write during the same shader invocation.
|
* This allows for writing unit tests that read and write during the same shader invocation.
|
||||||
* \{ */
|
* \{ */
|
||||||
|
|
||||||
#ifdef GBUFFER_LOAD
|
#ifdef GBUFFER_LOAD
|
||||||
@ -666,7 +666,7 @@ GBufferWriter gbuffer_pack(GBufferDataUndetermined data_in)
|
|||||||
|
|
||||||
if (has_diffuse) {
|
if (has_diffuse) {
|
||||||
if (has_sss) {
|
if (has_sss) {
|
||||||
/* Subsurface need to be first to be outputed in first lighting texture. */
|
/* Subsurface need to be first to be outputted in first lighting texture. */
|
||||||
gbuffer_closure_subsurface_pack(gbuf, data_in.diffuse);
|
gbuffer_closure_subsurface_pack(gbuf, data_in.diffuse);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -692,7 +692,7 @@ GBufferWriter gbuffer_pack(GBufferDataUndetermined data_in)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO(fclem): Allow misxing of translucent and refraction. */
|
/* TODO(@fclem): Allow mixing of translucent and refraction. */
|
||||||
if (has_translucent && !has_refraction) {
|
if (has_translucent && !has_refraction) {
|
||||||
gbuffer_closure_translucent_pack(gbuf, data_in.translucent);
|
gbuffer_closure_translucent_pack(gbuf, data_in.translucent);
|
||||||
}
|
}
|
||||||
@ -833,4 +833,4 @@ GBufferReader gbuffer_read(samplerGBufferHeader header_tx,
|
|||||||
return gbuf;
|
return gbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
@ -36,7 +36,7 @@ void main()
|
|||||||
gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres);
|
gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres);
|
||||||
|
|
||||||
#ifndef GPU_METAL
|
#ifndef GPU_METAL
|
||||||
/* TODO(fclem): Support specialization on OpenGL and Vulkan. */
|
/* TODO(fclem): Support specialization on OpenGL and VULKAN. */
|
||||||
int closure_index = uniform_buf.raytrace.closure_index;
|
int closure_index = uniform_buf.raytrace.closure_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ void main()
|
|||||||
gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres);
|
gbuf_header_tx, gbuf_closure_tx, gbuf_normal_tx, texel_fullres);
|
||||||
|
|
||||||
#ifndef GPU_METAL
|
#ifndef GPU_METAL
|
||||||
/* TODO(fclem): Support specialization on OpenGL and Vulkan. */
|
/* TODO(fclem): Support specialization on OpenGL and VULKAN. */
|
||||||
int closure_index = uniform_buf.raytrace.closure_index;
|
int closure_index = uniform_buf.raytrace.closure_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ void main()
|
|||||||
uniform_buf.raytrace.resolution_bias;
|
uniform_buf.raytrace.resolution_bias;
|
||||||
|
|
||||||
#ifndef GPU_METAL
|
#ifndef GPU_METAL
|
||||||
/* TODO(fclem): Support specialization on OpenGL and Vulkan. */
|
/* TODO(fclem): Support specialization on OpenGL and VULKAN. */
|
||||||
int closure_index = uniform_buf.raytrace.closure_index;
|
int closure_index = uniform_buf.raytrace.closure_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ void main()
|
|||||||
uniform_buf.raytrace.resolution_bias;
|
uniform_buf.raytrace.resolution_bias;
|
||||||
|
|
||||||
#ifndef GPU_METAL
|
#ifndef GPU_METAL
|
||||||
/* TODO(fclem): Support specialization on OpenGL and Vulkan. */
|
/* TODO(fclem): Support specialization on OpenGL and VULKAN. */
|
||||||
int closure_index = uniform_buf.raytrace.closure_index;
|
int closure_index = uniform_buf.raytrace.closure_index;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ void main()
|
|||||||
ray_view.max_time = 1000.0;
|
ray_view.max_time = 1000.0;
|
||||||
|
|
||||||
#ifndef GPU_METAL
|
#ifndef GPU_METAL
|
||||||
/* TODO(fclem): Support specialization on OpenGL and Vulkan. */
|
/* TODO(fclem): Support specialization on OpenGL and VULKAN. */
|
||||||
bool trace_refraction = uniform_buf.raytrace.trace_refraction;
|
bool trace_refraction = uniform_buf.raytrace.trace_refraction;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1023,11 +1023,12 @@ static bool move_to_collection_poll(bContext *C)
|
|||||||
/**
|
/**
|
||||||
* Encode the parameters into an integer, and return as void*.
|
* Encode the parameters into an integer, and return as void*.
|
||||||
*
|
*
|
||||||
* This makes it possible to use these values and pass them directly as 'custom data' pointer to
|
* NOTE(@sybren): This makes it possible to use these values and pass them directly as
|
||||||
* `uiItemMenuF()`. This makes it possible to give every menu a unique bone collection index for
|
* 'custom data' pointer to `uiItemMenuF()`. This makes it possible to give every menu a unique
|
||||||
* which it should show the child collections, without having to allocate memory or use static
|
* bone collection index for which it should show the child collections, without having to allocate
|
||||||
* variables. See `move_to_collection_invoke()` in `object_edit.cc` for the alternative that I
|
* memory or use static variables. See `move_to_collection_invoke()` in `object_edit.cc`
|
||||||
* (Sybren) wanted to avoid. */
|
* for the alternative that I wanted to avoid.
|
||||||
|
*/
|
||||||
static void *menu_custom_data_encode(const int bcoll_index, const bool is_move_operation)
|
static void *menu_custom_data_encode(const int bcoll_index, const bool is_move_operation)
|
||||||
{
|
{
|
||||||
/* Add 1 to the index, so that it's never negative (it can be -1 to indicate 'all roots'). */
|
/* Add 1 to the index, so that it's never negative (it can be -1 to indicate 'all roots'). */
|
||||||
|
@ -2293,9 +2293,9 @@ uiLayout *uiLayoutRow(uiLayout *layout, bool align);
|
|||||||
* property name pair. This gives the caller flexibility to decide who should own the open-state.
|
* property name pair. This gives the caller flexibility to decide who should own the open-state.
|
||||||
*
|
*
|
||||||
* \param C: The context is necessary because sometimes the panel may be forced to be open by the
|
* \param C: The context is necessary because sometimes the panel may be forced to be open by the
|
||||||
* context even of the open-property is `false`. This can happen with e.g. property search.
|
* context even of the open-property is `false`. This can happen with e.g. property search.
|
||||||
* \param layout: The `uiLayout` that should contain the subpanel. Only layouts that span the full
|
* \param layout: The `uiLayout` that should contain the sub-panel.
|
||||||
* width of the region are supported for now.
|
* Only layouts that span the full width of the region are supported for now.
|
||||||
* \param name: Text that's shown in the panel header. It should already be translated.
|
* \param name: Text that's shown in the panel header. It should already be translated.
|
||||||
* \param open_prop_owner: Data that contains the open-property.
|
* \param open_prop_owner: Data that contains the open-property.
|
||||||
* \param open_prop_name: Name of the open-property in `open_prop_owner`.
|
* \param open_prop_name: Name of the open-property in `open_prop_owner`.
|
||||||
|
@ -219,7 +219,7 @@ class BoneCollectionItem : public AbstractTreeViewItem {
|
|||||||
uiItemL(sub, "", icon);
|
uiItemL(sub, "", icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Visibility eyecon. */
|
/* Visibility eye icon. */
|
||||||
{
|
{
|
||||||
uiLayout *visibility_sub = uiLayoutRow(sub, true);
|
uiLayout *visibility_sub = uiLayoutRow(sub, true);
|
||||||
uiLayoutSetActive(visibility_sub, bone_collection_.is_visible_ancestors());
|
uiLayoutSetActive(visibility_sub, bone_collection_.is_visible_ancestors());
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
static CLG_LogRef LOG = {"io.drop_import_file"};
|
static CLG_LogRef LOG = {"io.drop_import_file"};
|
||||||
|
|
||||||
/* Retuns the list of file paths stored in #WM_OT_drop_import_file operator properties. */
|
/** Returns the list of file paths stored in #WM_OT_drop_import_file operator properties. */
|
||||||
static blender::Vector<std::string> drop_import_file_paths(const wmOperator *op)
|
static blender::Vector<std::string> drop_import_file_paths(const wmOperator *op)
|
||||||
{
|
{
|
||||||
blender::Vector<std::string> result;
|
blender::Vector<std::string> result;
|
||||||
|
@ -207,7 +207,7 @@ struct Node {
|
|||||||
bool applied;
|
bool applied;
|
||||||
|
|
||||||
/* shape keys */
|
/* shape keys */
|
||||||
char shapeName[MAX_NAME]; /* sizeof(KeyBlock::name). */
|
char shapeName[MAX_NAME]; /* `sizeof(KeyBlock::name)`. */
|
||||||
|
|
||||||
/* Geometry modification operations.
|
/* Geometry modification operations.
|
||||||
*
|
*
|
||||||
|
@ -58,7 +58,7 @@ static blender::float2 rgb_to_uv_normalized(const float rgb[3])
|
|||||||
{
|
{
|
||||||
/* Exact same math as rgb_to_yuv BT709 case. Duplicated here
|
/* Exact same math as rgb_to_yuv BT709 case. Duplicated here
|
||||||
* since this function is called a lot, and non-inline function
|
* since this function is called a lot, and non-inline function
|
||||||
* call plus colorspace switch in there overhead does add up. */
|
* call plus color-space switch in there overhead does add up. */
|
||||||
float r = rgb[0], g = rgb[1], b = rgb[2];
|
float r = rgb[0], g = rgb[1], b = rgb[2];
|
||||||
/* We don't need y. */
|
/* We don't need y. */
|
||||||
float u = -0.09991f * r - 0.33609f * g + 0.436f * b;
|
float u = -0.09991f * r - 0.33609f * g + 0.436f * b;
|
||||||
|
@ -19,7 +19,7 @@ namespace blender::ed::seq {
|
|||||||
struct ScopeHistogram {
|
struct ScopeHistogram {
|
||||||
/* Byte images just have bins for the 0..255 range. */
|
/* Byte images just have bins for the 0..255 range. */
|
||||||
static constexpr int BINS_BYTE = 256;
|
static constexpr int BINS_BYTE = 256;
|
||||||
/* Float images spead -0.25..+1.25 range over 512 bins. */
|
/* Float images spread -0.25..+1.25 range over 512 bins. */
|
||||||
static constexpr int BINS_FLOAT = 512;
|
static constexpr int BINS_FLOAT = 512;
|
||||||
static constexpr float FLOAT_VAL_MIN = -0.25f;
|
static constexpr float FLOAT_VAL_MIN = -0.25f;
|
||||||
static constexpr float FLOAT_VAL_MAX = 1.25f;
|
static constexpr float FLOAT_VAL_MAX = 1.25f;
|
||||||
|
@ -517,7 +517,7 @@ static void draw_seq_waveform_overlay(TimelineDrawContext *timeline_ctx,
|
|||||||
CLAMP_MIN(value_min, -1.0f);
|
CLAMP_MIN(value_min, -1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are drawing only half ot the waveform, mirroring the lower part upwards.
|
/* We are drawing only half to the waveform, mirroring the lower part upwards.
|
||||||
* If both min and max are on the same side of zero line, we want to draw a bar
|
* If both min and max are on the same side of zero line, we want to draw a bar
|
||||||
* between them. If min and max cross zero, we want to fill bar from zero to max
|
* between them. If min and max cross zero, we want to fill bar from zero to max
|
||||||
* of those. */
|
* of those. */
|
||||||
|
@ -102,7 +102,7 @@ struct MTLRenderPipelineStateInstance {
|
|||||||
/* Common compute pipeline state. */
|
/* Common compute pipeline state. */
|
||||||
struct MTLComputePipelineStateCommon {
|
struct MTLComputePipelineStateCommon {
|
||||||
|
|
||||||
/* Threadgroup information is common for all PSO variants.*/
|
/* Thread-group information is common for all PSO variants. */
|
||||||
int threadgroup_x_len = 1;
|
int threadgroup_x_len = 1;
|
||||||
int threadgroup_y_len = 1;
|
int threadgroup_y_len = 1;
|
||||||
int threadgroup_z_len = 1;
|
int threadgroup_z_len = 1;
|
||||||
|
@ -56,7 +56,7 @@ const char *MTLLogParser::parse_line(const char *source_combined,
|
|||||||
int64_t file_start = src.find(needle);
|
int64_t file_start = src.find(needle);
|
||||||
if (file_start == -1) {
|
if (file_start == -1) {
|
||||||
/* Can be generated code or wrapper code outside of the main sources.
|
/* Can be generated code or wrapper code outside of the main sources.
|
||||||
* But should be already catched by the above case. */
|
* But should be already caught by the above case. */
|
||||||
log_item.cursor.row = -1;
|
log_item.cursor.row = -1;
|
||||||
wrapper_error_ = true;
|
wrapper_error_ = true;
|
||||||
}
|
}
|
||||||
@ -74,7 +74,7 @@ const char *MTLLogParser::parse_line(const char *source_combined,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (parsed_error_) {
|
else if (parsed_error_) {
|
||||||
/* Skip the redundant lines that we be outputed above the error. */
|
/* Skip the redundant lines that we be outputted above the error. */
|
||||||
return skip_line(log_line);
|
return skip_line(log_line);
|
||||||
}
|
}
|
||||||
else if (wrapper_error_) {
|
else if (wrapper_error_) {
|
||||||
|
@ -208,8 +208,8 @@ void curves_vector(vec3 vector,
|
|||||||
vec3 end_slopes,
|
vec3 end_slopes,
|
||||||
out vec3 result)
|
out vec3 result)
|
||||||
{
|
{
|
||||||
/* Evaluate each component on its curve map. The componenets are first normalized into the [0, 1]
|
/* Evaluate each component on its curve map.
|
||||||
* range. */
|
* The components are first normalized into the [0, 1] range. */
|
||||||
vec3 parameters = (vector - range_minimums) * range_dividers;
|
vec3 parameters = (vector - range_minimums) * range_dividers;
|
||||||
vec3 coordinates = compute_curve_map_coordinates(parameters);
|
vec3 coordinates = compute_curve_map_coordinates(parameters);
|
||||||
result.x = texture(curve_map, vec2(coordinates.x, layer)).x;
|
result.x = texture(curve_map, vec2(coordinates.x, layer)).x;
|
||||||
|
@ -45,7 +45,7 @@ void get_armature_bone_names(const Object *ob_arm, bool use_deform, Vector<std::
|
|||||||
/**
|
/**
|
||||||
* Return the USD joint path corresponding to the given bone. For example, for the bone
|
* Return the USD joint path corresponding to the given bone. For example, for the bone
|
||||||
* "Hand", this function might return the full path "Shoulder/Elbow/Hand" of the joint
|
* "Hand", this function might return the full path "Shoulder/Elbow/Hand" of the joint
|
||||||
* in the hierachy.
|
* in the hierarchy.
|
||||||
*
|
*
|
||||||
* \param bone: The bone whose path will be queried.
|
* \param bone: The bone whose path will be queried.
|
||||||
* \return: The path to the joint
|
* \return: The path to the joint
|
||||||
|
@ -135,7 +135,7 @@ void ensure_blend_shape_skeleton(pxr::UsdStageRefPtr stage, pxr::UsdPrim &mesh_p
|
|||||||
skel.GetRestTransformsAttr().Set(rest_transforms);
|
skel.GetRestTransformsAttr().Set(rest_transforms);
|
||||||
|
|
||||||
/* Some DCCs seem to require joint names to bind the
|
/* Some DCCs seem to require joint names to bind the
|
||||||
* skeleton to blendshapes. */
|
* skeleton to blend-shapes. */
|
||||||
pxr::VtTokenArray joints({usdtokens::joint1});
|
pxr::VtTokenArray joints({usdtokens::joint1});
|
||||||
skel.CreateJointsAttr().Set(joints);
|
skel.CreateJointsAttr().Set(joints);
|
||||||
}
|
}
|
||||||
@ -284,13 +284,13 @@ void create_blend_shapes(pxr::UsdStageRefPtr stage,
|
|||||||
point_indices_attr.Set(indices);
|
point_indices_attr.Set(indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the blendshape names and targets on the shape. */
|
/* Set the blend-shape names and targets on the shape. */
|
||||||
pxr::UsdAttribute blendshape_attr = skel_api.CreateBlendShapesAttr();
|
pxr::UsdAttribute blendshape_attr = skel_api.CreateBlendShapesAttr();
|
||||||
blendshape_attr.Set(blendshape_names);
|
blendshape_attr.Set(blendshape_names);
|
||||||
skel_api.CreateBlendShapeTargetsRel().SetTargets(blendshape_paths);
|
skel_api.CreateBlendShapeTargetsRel().SetTargets(blendshape_paths);
|
||||||
|
|
||||||
/* Some DCCs seem to require joint indices and weights to
|
/* Some DCCs seem to require joint indices and weights to
|
||||||
* bind the skeleton for blendshapes, so we we create these
|
* bind the skeleton for blend-shapes, so we we create these
|
||||||
* primvars, if needed. */
|
* primvars, if needed. */
|
||||||
|
|
||||||
if (!skel_api.GetJointIndicesAttr().HasAuthoredValue()) {
|
if (!skel_api.GetJointIndicesAttr().HasAuthoredValue()) {
|
||||||
|
@ -44,9 +44,9 @@ const Key *get_mesh_shape_key(const Object *obj);
|
|||||||
bool is_mesh_with_shape_keys(const Object *obj);
|
bool is_mesh_with_shape_keys(const Object *obj);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert shape keys on the given object to USD blend shapes. The blend shapes
|
* Convert shape keys on the given object to USD blend shapes. The blend-shapes
|
||||||
* will be added to the stage as children of the given USD mesh prim. The blendshape
|
* will be added to the stage as children of the given USD mesh prim. The blend-shape
|
||||||
* names and targets will also be set as properites on the prim.
|
* names and targets will also be set as properties on the primitive.
|
||||||
*
|
*
|
||||||
* \param stage: The stage
|
* \param stage: The stage
|
||||||
* \param obj: The mesh object whose shape keys will be converted to blend shapes
|
* \param obj: The mesh object whose shape keys will be converted to blend shapes
|
||||||
|
@ -396,7 +396,7 @@ void USDStageReader::collect_readers(Main *bmain)
|
|||||||
collect_readers(bmain, root, readers_);
|
collect_readers(bmain, root, readers_);
|
||||||
|
|
||||||
if (params_.support_scene_instancing) {
|
if (params_.support_scene_instancing) {
|
||||||
/* Collect the scenegraph instance prototypes. */
|
/* Collect the scene-graph instance prototypes. */
|
||||||
std::vector<pxr::UsdPrim> protos = stage_->GetPrototypes();
|
std::vector<pxr::UsdPrim> protos = stage_->GetPrototypes();
|
||||||
|
|
||||||
for (const pxr::UsdPrim &proto_prim : protos) {
|
for (const pxr::UsdPrim &proto_prim : protos) {
|
||||||
|
@ -39,7 +39,7 @@ class USDStageReader {
|
|||||||
* traversal, for importing unused materials. */
|
* traversal, for importing unused materials. */
|
||||||
blender::Vector<std::string> material_paths_;
|
blender::Vector<std::string> material_paths_;
|
||||||
|
|
||||||
/* Readers for scenegraph instance prototypes. */
|
/* Readers for scene-graph instance prototypes. */
|
||||||
ProtoReaderMap proto_readers_;
|
ProtoReaderMap proto_readers_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -1116,7 +1116,7 @@ void skel_export_chaser(pxr::UsdStageRefPtr stage,
|
|||||||
const ObjExportMap &shape_key_mesh_export_map,
|
const ObjExportMap &shape_key_mesh_export_map,
|
||||||
const Depsgraph *depsgraph)
|
const Depsgraph *depsgraph)
|
||||||
{
|
{
|
||||||
/* We may need to compute the world transforms of certain prims when
|
/* We may need to compute the world transforms of certain primitives when
|
||||||
* setting skinning data. Using a shared transform cache can make computing
|
* setting skinning data. Using a shared transform cache can make computing
|
||||||
* the transforms more efficient. */
|
* the transforms more efficient. */
|
||||||
pxr::UsdGeomXformCache xf_cache(1.0);
|
pxr::UsdGeomXformCache xf_cache(1.0);
|
||||||
@ -1152,7 +1152,7 @@ void skinned_mesh_export_chaser(pxr::UsdStageRefPtr stage,
|
|||||||
CLOG_WARN(&LOG, "Invalid armature modifier for skinned mesh %s", mesh_obj->id.name + 2);
|
CLOG_WARN(&LOG, "Invalid armature modifier for skinned mesh %s", mesh_obj->id.name + 2);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Look up the USD skeleton correpsoning to the armature object. */
|
/* Look up the USD skeleton corresponding to the armature object. */
|
||||||
const pxr::SdfPath *path = armature_export_map.lookup_ptr(arm_obj);
|
const pxr::SdfPath *path = armature_export_map.lookup_ptr(arm_obj);
|
||||||
if (!path) {
|
if (!path) {
|
||||||
CLOG_WARN(&LOG, "No export map entry for armature object %s", mesh_obj->id.name + 2);
|
CLOG_WARN(&LOG, "No export map entry for armature object %s", mesh_obj->id.name + 2);
|
||||||
@ -1175,7 +1175,7 @@ void shape_key_export_chaser(pxr::UsdStageRefPtr stage,
|
|||||||
{
|
{
|
||||||
Map<pxr::SdfPath, pxr::SdfPathSet> skel_to_mesh;
|
Map<pxr::SdfPath, pxr::SdfPathSet> skel_to_mesh;
|
||||||
|
|
||||||
/* We will keep track of the mesh prims to clean up the temporary
|
/* We will keep track of the mesh primitives to clean up the temporary
|
||||||
* weights attribute at the end. */
|
* weights attribute at the end. */
|
||||||
Vector<pxr::UsdPrim> mesh_prims;
|
Vector<pxr::UsdPrim> mesh_prims;
|
||||||
|
|
||||||
@ -1194,7 +1194,7 @@ void shape_key_export_chaser(pxr::UsdStageRefPtr stage,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep track of all the mesh prims with blend shapes, for cleanup below. */
|
/* Keep track of all the mesh primitives with blend shapes, for cleanup below. */
|
||||||
mesh_prims.append(mesh_prim);
|
mesh_prims.append(mesh_prim);
|
||||||
|
|
||||||
pxr::UsdSkelBindingAPI skel_api = pxr::UsdSkelBindingAPI::Apply(mesh_prim);
|
pxr::UsdSkelBindingAPI skel_api = pxr::UsdSkelBindingAPI::Apply(mesh_prim);
|
||||||
|
@ -99,7 +99,7 @@ using ObjExportMap = Map<const Object *, pxr::SdfPath>;
|
|||||||
* \param stage: The stage
|
* \param stage: The stage
|
||||||
* \param armature_export_map: Map armature objects to USD skeletons
|
* \param armature_export_map: Map armature objects to USD skeletons
|
||||||
* \param skinned_mesh_export_map: Map mesh objects to USD skinned meshes
|
* \param skinned_mesh_export_map: Map mesh objects to USD skinned meshes
|
||||||
* \param shape_key_export_map: Map mesh objects with shape keye to USD meshes
|
* \param shape_key_export_map: Map mesh objects with shape-key to USD meshes
|
||||||
* with blend shape targets
|
* with blend shape targets
|
||||||
* \param depsgraph: The dependency graph in which objects were evaluated
|
* \param depsgraph: The dependency graph in which objects were evaluated
|
||||||
*/
|
*/
|
||||||
@ -128,7 +128,7 @@ void skinned_mesh_export_chaser(pxr::UsdStageRefPtr stage,
|
|||||||
* Complete the export process for shape keys.
|
* Complete the export process for shape keys.
|
||||||
*
|
*
|
||||||
* \param stage: The stage
|
* \param stage: The stage
|
||||||
* \param shape_key_export_map: Map mesh objects with shape keye to USD meshes
|
* \param shape_key_export_map: Map mesh objects with shape-key to USD meshes
|
||||||
* with blend shape targets
|
* with blend shape targets
|
||||||
*/
|
*/
|
||||||
void shape_key_export_chaser(pxr::UsdStageRefPtr stage,
|
void shape_key_export_chaser(pxr::UsdStageRefPtr stage,
|
||||||
|
@ -95,7 +95,7 @@ void create_skel_roots(pxr::UsdStageRefPtr stage, const USDExportParams ¶ms)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to find a commmon ancestor of the skinned prim and its bound skeleton. */
|
/* Try to find a common ancestor of the skinned prim and its bound skeleton. */
|
||||||
pxr::UsdSkelRoot prim_skel_root = pxr::UsdSkelRoot::Find(prim);
|
pxr::UsdSkelRoot prim_skel_root = pxr::UsdSkelRoot::Find(prim);
|
||||||
pxr::UsdSkelRoot skel_skel_root = pxr::UsdSkelRoot::Find(skel.GetPrim());
|
pxr::UsdSkelRoot skel_skel_root = pxr::UsdSkelRoot::Find(skel.GetPrim());
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ namespace blender::io::usd {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* We must structure the scene graph to encapsulate skinned prim under a UsdSkelRoot
|
* We must structure the scene graph to encapsulate skinned prim under a UsdSkelRoot
|
||||||
* prim. Per the USD documentation, a SkelRoot is a
|
* prim. Per the USD documentation, a SkelRoot is a:
|
||||||
*
|
*
|
||||||
* "Boundable prim type used to identify a scope beneath which skeletally-posed primitives are
|
* "Boundable prim type used to identify a scope beneath which skeletally-posed primitives are
|
||||||
* defined. A SkelRoot must be defined at or above a skinned primitive for any skinning behaviors
|
* defined. A SkelRoot must be defined at or above a skinned primitive for any skinning behaviors
|
||||||
|
@ -31,9 +31,11 @@ namespace usdtokens {
|
|||||||
static const pxr::TfToken Anim("Anim", pxr::TfToken::Immortal);
|
static const pxr::TfToken Anim("Anim", pxr::TfToken::Immortal);
|
||||||
} // namespace usdtokens
|
} // namespace usdtokens
|
||||||
|
|
||||||
/* Get the pose matrix for the given channe. The matrix is computed
|
/**
|
||||||
* relative to its parent, if a parent exists. The returned matrix
|
* Get the pose matrix for the given channel.
|
||||||
* corresponds to the USD joint-local transform. */
|
* The matrix is computed relative to its parent, if a parent exists.
|
||||||
|
* The returned matrix corresponds to the USD joint-local transform.
|
||||||
|
*/
|
||||||
static pxr::GfMatrix4d parent_relative_pose_mat(const bPoseChannel *pchan)
|
static pxr::GfMatrix4d parent_relative_pose_mat(const bPoseChannel *pchan)
|
||||||
{
|
{
|
||||||
/* Note that the float matrix will be returned as GfMatrix4d, because
|
/* Note that the float matrix will be returned as GfMatrix4d, because
|
||||||
|
@ -256,7 +256,7 @@ class DefocusOperation : public NodeOperation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Computes the distance in meters to the image of the focus point across a lens of the specified
|
/* Computes the distance in meters to the image of the focus point across a lens of the specified
|
||||||
* focal length. This computes Vp in equation (7) of the paper:
|
* focal length. This computes `Vp` in equation (7) of the paper:
|
||||||
*
|
*
|
||||||
* Potmesil, Michael, and Indranil Chakravarty. "A lens and aperture camera model for synthetic
|
* Potmesil, Michael, and Indranil Chakravarty. "A lens and aperture camera model for synthetic
|
||||||
* image generation." ACM SIGGRAPH Computer Graphics 15.3 (1981): 297-305. */
|
* image generation." ACM SIGGRAPH Computer Graphics 15.3 (1981): 297-305. */
|
||||||
|
@ -99,6 +99,7 @@ dict_custom = {
|
|||||||
"deduplicating",
|
"deduplicating",
|
||||||
"deduplication",
|
"deduplication",
|
||||||
"defocus",
|
"defocus",
|
||||||
|
"defocusing",
|
||||||
"defragment",
|
"defragment",
|
||||||
"defragmented",
|
"defragmented",
|
||||||
"defragmenting",
|
"defragmenting",
|
||||||
@ -349,6 +350,7 @@ dict_custom = {
|
|||||||
"sidedness",
|
"sidedness",
|
||||||
"simplices",
|
"simplices",
|
||||||
"situationally",
|
"situationally",
|
||||||
|
"skeletally",
|
||||||
"skinnable",
|
"skinnable",
|
||||||
"skippable",
|
"skippable",
|
||||||
"sortable",
|
"sortable",
|
||||||
@ -486,6 +488,7 @@ dict_custom = {
|
|||||||
"unshadowed",
|
"unshadowed",
|
||||||
"unshared",
|
"unshared",
|
||||||
"unsharp",
|
"unsharp",
|
||||||
|
"unspecialized",
|
||||||
"unsqueezed",
|
"unsqueezed",
|
||||||
"unstretch",
|
"unstretch",
|
||||||
"unsubdivided",
|
"unsubdivided",
|
||||||
|
Loading…
Reference in New Issue
Block a user