Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/cycles/device/device.cpp2
-rw-r--r--intern/cycles/device/device_memory.h4
-rw-r--r--intern/cycles/device/device_multi.cpp18
-rw-r--r--intern/cycles/device/opencl/opencl_split.cpp37
-rw-r--r--intern/cycles/render/buffers.cpp3
-rw-r--r--intern/cycles/render/buffers.h1
-rw-r--r--intern/cycles/test/CMakeLists.txt16
-rw-r--r--intern/cycles/test/render_graph_finalize_test.cpp410
-rw-r--r--source/blender/bmesh/bmesh_class.h6
-rw-r--r--source/blender/bmesh/intern/bmesh_core.c38
-rw-r--r--source/blender/bmesh/intern/bmesh_edgeloop.c74
-rw-r--r--source/blender/bmesh/intern/bmesh_interp.c11
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon_edgenet.c2
-rw-r--r--source/blender/bmesh/intern/bmesh_queries.c9
-rw-r--r--source/blender/bmesh/operators/bmo_split_edges.c2
-rw-r--r--source/blender/editors/space_graph/graph_select.c9
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.c10
17 files changed, 331 insertions, 321 deletions
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 0c20270ea42..923b9bd45bf 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -240,7 +240,7 @@ void Device::draw_pixels(
{
const bool use_fallback_shader = (draw_params.bind_display_space_shader_cb == NULL);
- assert(mem.type == MEM_PIXELS);
+ assert(rgba.type == MEM_PIXELS);
mem_copy_from(rgba, y, w, h, rgba.memory_elements_size(1));
GLuint texid;
diff --git a/intern/cycles/device/device_memory.h b/intern/cycles/device/device_memory.h
index 7bf8bdc1cea..e6b2d059ef3 100644
--- a/intern/cycles/device/device_memory.h
+++ b/intern/cycles/device/device_memory.h
@@ -303,7 +303,7 @@ public:
data_width = width;
data_height = height;
data_depth = depth;
- assert(device_ptr == 0);
+ assert(device_pointer == 0);
return get_data();
}
@@ -331,7 +331,7 @@ public:
data_width = width;
data_height = height;
data_depth = depth;
- assert(device_ptr == 0);
+ assert(device_pointer == 0);
return get_data();
}
diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp
index db84696bcb4..298105af50a 100644
--- a/intern/cycles/device/device_multi.cpp
+++ b/intern/cycles/device/device_multi.cpp
@@ -251,26 +251,36 @@ public:
if(!tiles[i].buffers) {
continue;
}
+
/* If the tile was rendered on another device, copy its memory to
* to the current device now, for the duration of the denoising task.
* Note that this temporarily modifies the RenderBuffers and calls
* the device, so this function is not thread safe. */
device_vector<float> &mem = tiles[i].buffers->buffer;
if(mem.device != sub_device) {
- tiles[i].buffers->copy_from_device();
+ /* Only copy from device to host once. This is faster, but
+ * also required for the case where a CPU thread is denoising
+ * a tile rendered on the GPU. In that case we have to avoid
+ * overwriting the buffer being denoised by the CPU thread. */
+ if(!tiles[i].buffers->map_neighbor_copied) {
+ tiles[i].buffers->map_neighbor_copied = true;
+ mem.copy_from_device(0, mem.data_size, 1);
+ }
Device *original_device = mem.device;
device_ptr original_ptr = mem.device_pointer;
+ size_t original_size = mem.device_size;
mem.device = sub_device;
mem.device_pointer = 0;
+ mem.device_size = 0;
- sub_device->mem_alloc(mem);
- sub_device->mem_copy_to(mem);
+ mem.copy_to_device();
tiles[i].buffer = mem.device_pointer;
mem.device = original_device;
mem.device_pointer = original_ptr;
+ mem.device_size = original_size;
}
}
}
@@ -293,7 +303,7 @@ public:
/* Copy denoised tile to the host. */
if(i == 4) {
- tiles[i].buffers->copy_from_device();
+ mem.copy_from_device(0, mem.data_size, 1);
}
sub_device->mem_free(mem);
diff --git a/intern/cycles/device/opencl/opencl_split.cpp b/intern/cycles/device/opencl/opencl_split.cpp
index 96139afa450..ae623d22f07 100644
--- a/intern/cycles/device/opencl/opencl_split.cpp
+++ b/intern/cycles/device/opencl/opencl_split.cpp
@@ -35,6 +35,25 @@ CCL_NAMESPACE_BEGIN
class OpenCLSplitKernel;
+namespace {
+
+/* Copy dummy KernelGlobals related to OpenCL from kernel_globals.h to
+ * fetch its size.
+ */
+typedef struct KernelGlobalsDummy {
+ ccl_constant KernelData *data;
+ ccl_global char *buffers[8];
+
+#define KERNEL_TEX(type, name) \
+ TextureInfo name;
+# include "kernel/kernel_textures.h"
+#undef KERNEL_TEX
+ SplitData split_data;
+ SplitParams split_param_data;
+} KernelGlobalsDummy;
+
+} // namespace
+
static string get_build_options(OpenCLDeviceBase *device, const DeviceRequestedFeatures& requested_features)
{
string build_options = "-D__SPLIT_KERNEL__ ";
@@ -110,24 +129,8 @@ public:
else if(task->type == DeviceTask::RENDER) {
RenderTile tile;
- /* Copy dummy KernelGlobals related to OpenCL from kernel_globals.h to
- * fetch its size.
- */
- typedef struct KernelGlobals {
- ccl_constant KernelData *data;
- ccl_global char *buffers[8];
-
-#define KERNEL_TEX(type, name) \
- TextureInfo name;
-#include "kernel/kernel_textures.h"
-#undef KERNEL_TEX
-
- SplitData split_data;
- SplitParams split_param_data;
- } KernelGlobals;
-
/* Allocate buffer for kernel globals */
- device_only_memory<KernelGlobals> kgbuffer(this, "kernel_globals");
+ device_only_memory<KernelGlobalsDummy> kgbuffer(this, "kernel_globals");
kgbuffer.alloc_to_device(1);
/* Keep rendering tiles until done. */
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 9ad465c3452..70912ca8e87 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -115,7 +115,8 @@ RenderTile::RenderTile()
/* Render Buffers */
RenderBuffers::RenderBuffers(Device *device)
-: buffer(device, "RenderBuffers", MEM_READ_WRITE)
+: buffer(device, "RenderBuffers", MEM_READ_WRITE),
+ map_neighbor_copied(false)
{
}
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 8563d6674ec..9fa0cdd4e27 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -74,6 +74,7 @@ public:
/* float buffer */
device_vector<float> buffer;
+ bool map_neighbor_copied;
explicit RenderBuffers(Device *device);
~RenderBuffers();
diff --git a/intern/cycles/test/CMakeLists.txt b/intern/cycles/test/CMakeLists.txt
index 80564c33be6..f4213c508fc 100644
--- a/intern/cycles/test/CMakeLists.txt
+++ b/intern/cycles/test/CMakeLists.txt
@@ -22,12 +22,17 @@ set(INC
)
set(ALL_CYCLES_LIBRARIES
- cycles_render
cycles_device
+ cycles_kernel
+ cycles_render
cycles_bvh
cycles_graph
cycles_subd
cycles_util
+ extern_clew
+ ${BLENDER_GL_LIBRARIES}
+ ${BLENDER_GLEW_LIBRARIES}
+ ${CYCLES_APP_GLEW_LIBRARY}
${OPENIMAGEIO_LIBRARIES}
)
if(WITH_CYCLES_OSL)
@@ -52,6 +57,15 @@ if(WITH_CYCLES_OPENSUBDIV)
${OPENSUBDIV_LIBRARIES}
)
endif()
+if(WITH_CUDA_DYNLOAD)
+ list(APPEND ALL_CYCLES_LIBRARIES extern_cuew)
+else()
+ list(APPEND ALL_CYCLES_LIBRARIES ${CUDA_CUDA_LIBRARY})
+endif()
+if(NOT CYCLES_STANDALONE_REPOSITORY)
+ list(APPEND ALL_CYCLES_LIBRARIES bf_intern_glew_mx bf_intern_guardedalloc ${GLEW_LIBRARY})
+endif()
+
list(APPEND ALL_CYCLES_LIBRARIES
${BOOST_LIBRARIES}
${PNG_LIBRARIES}
diff --git a/intern/cycles/test/render_graph_finalize_test.cpp b/intern/cycles/test/render_graph_finalize_test.cpp
index 3fc086cbc0c..b66a91adbda 100644
--- a/intern/cycles/test/render_graph_finalize_test.cpp
+++ b/intern/cycles/test/render_graph_finalize_test.cpp
@@ -74,7 +74,7 @@ protected:
class ShaderGraphBuilder {
public:
- explicit ShaderGraphBuilder(ShaderGraph *graph)
+ ShaderGraphBuilder(ShaderGraph *graph)
: graph_(graph)
{
node_map_["Output"] = graph->output();
@@ -155,15 +155,39 @@ protected:
} // namespace
-#define DEFINE_COMMON_VARIABLES(builder_name, mock_log_name) \
- util_logging_start(); \
- util_logging_verbosity_set(1); \
- ScopedMockLog mock_log_name; \
- DeviceInfo device_info; \
- SceneParams scene_params; \
- Scene scene(scene_params, device_info); \
- ShaderGraph graph; \
- ShaderGraphBuilder builder(&graph); \
+class RenderGraph : public testing::Test
+{
+protected:
+ ScopedMockLog log;
+ Stats stats;
+ DeviceInfo device_info;
+ Device *device_cpu;
+ SceneParams scene_params;
+ Scene *scene;
+ ShaderGraph graph;
+ ShaderGraphBuilder builder;
+
+ RenderGraph()
+ : testing::Test(),
+ builder(&graph)
+ {
+ }
+
+ virtual void SetUp()
+ {
+ util_logging_start();
+ util_logging_verbosity_set(1);
+
+ device_cpu = Device::create(device_info, stats, true);
+ scene = new Scene(scene_params, device_cpu);
+ }
+
+ virtual void TearDown()
+ {
+ delete scene;
+ delete device_cpu;
+ }
+};
#define EXPECT_ANY_MESSAGE(log) \
EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); \
@@ -177,10 +201,8 @@ protected:
/*
* Test deduplication of nodes that have inputs, some of them folded.
*/
-TEST(render_graph, deduplicate_deep)
+TEST_F(RenderGraph, deduplicate_deep)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Value1::Value to constant (0.8).");
CORRECT_INFO_MESSAGE(log, "Folding Value2::Value to constant (0.8).");
@@ -206,7 +228,7 @@ TEST(render_graph, deduplicate_deep)
.add_connection("Noise2::Color", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
EXPECT_EQ(graph.nodes.size(), 5);
}
@@ -214,10 +236,8 @@ TEST(render_graph, deduplicate_deep)
/*
* Test RGB to BW node.
*/
-TEST(render_graph, constant_fold_rgb_to_bw)
+TEST_F(RenderGraph, constant_fold_rgb_to_bw)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding RGBToBWNodeNode::Val to constant (0.8).");
CORRECT_INFO_MESSAGE(log, "Folding convert_float_to_color::value_color to constant (0.8, 0.8, 0.8).");
@@ -227,17 +247,15 @@ TEST(render_graph, constant_fold_rgb_to_bw)
.set("Color", make_float3(0.8f, 0.8f, 0.8f)))
.output_color("RGBToBWNodeNode::Val");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - folding of Emission nodes that don't emit to nothing.
*/
-TEST(render_graph, constant_fold_emission1)
+TEST_F(RenderGraph, constant_fold_emission1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Discarding closure Emission.");
@@ -246,13 +264,11 @@ TEST(render_graph, constant_fold_emission1)
.set("Color", make_float3(0.0f, 0.0f, 0.0f)))
.output_closure("Emission::Emission");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
-TEST(render_graph, constant_fold_emission2)
+TEST_F(RenderGraph, constant_fold_emission2)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Discarding closure Emission.");
@@ -261,17 +277,15 @@ TEST(render_graph, constant_fold_emission2)
.set("Strength", 0.0f))
.output_closure("Emission::Emission");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - folding of Background nodes that don't emit to nothing.
*/
-TEST(render_graph, constant_fold_background1)
+TEST_F(RenderGraph, constant_fold_background1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Discarding closure Background.");
@@ -280,13 +294,11 @@ TEST(render_graph, constant_fold_background1)
.set("Color", make_float3(0.0f, 0.0f, 0.0f)))
.output_closure("Background::Background");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
-TEST(render_graph, constant_fold_background2)
+TEST_F(RenderGraph, constant_fold_background2)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Discarding closure Background.");
@@ -295,17 +307,15 @@ TEST(render_graph, constant_fold_background2)
.set("Strength", 0.0f))
.output_closure("Background::Background");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Add Closure with only one input.
*/
-TEST(render_graph, constant_fold_shader_add)
+TEST_F(RenderGraph, constant_fold_shader_add)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding AddClosure1::Closure to socket Diffuse::BSDF.");
CORRECT_INFO_MESSAGE(log, "Folding AddClosure2::Closure to socket Diffuse::BSDF.");
@@ -322,7 +332,7 @@ TEST(render_graph, constant_fold_shader_add)
.add_connection("AddClosure2::Closure", "AddClosure3::Closure2")
.output_closure("AddClosure3::Closure");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
@@ -330,10 +340,8 @@ TEST(render_graph, constant_fold_shader_add)
* - Folding of Mix Closure with 0 or 1 fac.
* - Folding of Mix Closure with both inputs folded to the same node.
*/
-TEST(render_graph, constant_fold_shader_mix)
+TEST_F(RenderGraph, constant_fold_shader_mix)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding MixClosure1::Closure to socket Diffuse::BSDF.");
CORRECT_INFO_MESSAGE(log, "Folding MixClosure2::Closure to socket Diffuse::BSDF.");
@@ -357,17 +365,15 @@ TEST(render_graph, constant_fold_shader_mix)
.add_connection("MixClosure2::Closure", "MixClosure3::Closure2")
.output_closure("MixClosure3::Closure");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Invert with all constant inputs.
*/
-TEST(render_graph, constant_fold_invert)
+TEST_F(RenderGraph, constant_fold_invert)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Invert::Color to constant (0.68, 0.5, 0.32).");
@@ -377,17 +383,15 @@ TEST(render_graph, constant_fold_invert)
.set("Color", make_float3(0.2f, 0.5f, 0.8f)))
.output_color("Invert::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Invert with zero Fac.
*/
-TEST(render_graph, constant_fold_invert_fac_0)
+TEST_F(RenderGraph, constant_fold_invert_fac_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Invert::Color to socket Attribute::Color.");
@@ -398,17 +402,15 @@ TEST(render_graph, constant_fold_invert_fac_0)
.add_connection("Attribute::Color", "Invert::Color")
.output_color("Invert::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Invert with zero Fac and constant input.
*/
-TEST(render_graph, constant_fold_invert_fac_0_const)
+TEST_F(RenderGraph, constant_fold_invert_fac_0_const)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Invert::Color to constant (0.2, 0.5, 0.8).");
@@ -418,17 +420,15 @@ TEST(render_graph, constant_fold_invert_fac_0_const)
.set("Color", make_float3(0.2f, 0.5f, 0.8f)))
.output_color("Invert::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of MixRGB Add with all constant inputs (clamp false).
*/
-TEST(render_graph, constant_fold_mix_add)
+TEST_F(RenderGraph, constant_fold_mix_add)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding MixAdd::Color to constant (0.62, 1.14, 1.42).");
@@ -441,17 +441,15 @@ TEST(render_graph, constant_fold_mix_add)
.set("Color2", make_float3(0.4, 0.8, 0.9)))
.output_color("MixAdd::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of MixRGB Add with all constant inputs (clamp true).
*/
-TEST(render_graph, constant_fold_mix_add_clamp)
+TEST_F(RenderGraph, constant_fold_mix_add_clamp)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding MixAdd::Color to constant (0.62, 1, 1).");
@@ -464,17 +462,15 @@ TEST(render_graph, constant_fold_mix_add_clamp)
.set("Color2", make_float3(0.4, 0.8, 0.9)))
.output_color("MixAdd::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - No folding on fac 0 for dodge.
*/
-TEST(render_graph, constant_fold_part_mix_dodge_no_fac_0)
+TEST_F(RenderGraph, constant_fold_part_mix_dodge_no_fac_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding ");
@@ -489,17 +485,15 @@ TEST(render_graph, constant_fold_part_mix_dodge_no_fac_0)
.add_connection("Attribute2::Color", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - No folding on fac 0 for light.
*/
-TEST(render_graph, constant_fold_part_mix_light_no_fac_0)
+TEST_F(RenderGraph, constant_fold_part_mix_light_no_fac_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding ");
@@ -514,17 +508,15 @@ TEST(render_graph, constant_fold_part_mix_light_no_fac_0)
.add_connection("Attribute2::Color", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - No folding on fac 0 for burn.
*/
-TEST(render_graph, constant_fold_part_mix_burn_no_fac_0)
+TEST_F(RenderGraph, constant_fold_part_mix_burn_no_fac_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding ");
@@ -539,17 +531,15 @@ TEST(render_graph, constant_fold_part_mix_burn_no_fac_0)
.add_connection("Attribute2::Color", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - No folding on fac 0 for clamped blend.
*/
-TEST(render_graph, constant_fold_part_mix_blend_clamped_no_fac_0)
+TEST_F(RenderGraph, constant_fold_part_mix_blend_clamped_no_fac_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding ");
@@ -564,7 +554,7 @@ TEST(render_graph, constant_fold_part_mix_blend_clamped_no_fac_0)
.add_connection("Attribute2::Color", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
@@ -572,10 +562,8 @@ TEST(render_graph, constant_fold_part_mix_blend_clamped_no_fac_0)
* - Folding of Mix with 0 or 1 Fac.
* - Folding of Mix with both inputs folded to the same node.
*/
-TEST(render_graph, constant_fold_part_mix_blend)
+TEST_F(RenderGraph, constant_fold_part_mix_blend)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding MixBlend1::Color to socket Attribute1::Color.");
CORRECT_INFO_MESSAGE(log, "Folding MixBlend2::Color to socket Attribute1::Color.");
@@ -607,17 +595,15 @@ TEST(render_graph, constant_fold_part_mix_blend)
.add_connection("MixBlend2::Color", "MixBlend3::Color2")
.output_color("MixBlend3::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - NOT folding of MixRGB Sub with the same inputs and fac NOT 1.
*/
-TEST(render_graph, constant_fold_part_mix_sub_same_fac_bad)
+TEST_F(RenderGraph, constant_fold_part_mix_sub_same_fac_bad)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding Mix::");
@@ -631,17 +617,15 @@ TEST(render_graph, constant_fold_part_mix_sub_same_fac_bad)
.add_connection("Attribute::Color", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of MixRGB Sub with the same inputs and fac 1.
*/
-TEST(render_graph, constant_fold_part_mix_sub_same_fac_1)
+TEST_F(RenderGraph, constant_fold_part_mix_sub_same_fac_1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Mix::Color to constant (0, 0, 0).");
@@ -655,7 +639,7 @@ TEST(render_graph, constant_fold_part_mix_sub_same_fac_1)
.add_connection("Attribute::Color", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
@@ -717,10 +701,8 @@ static void build_mix_partial_test_graph(ShaderGraphBuilder &builder, NodeMix ty
/*
* Tests: partial folding for RGB Add with known 0.
*/
-TEST(render_graph, constant_fold_part_mix_add_0)
+TEST_F(RenderGraph, constant_fold_part_mix_add_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* 0 + X (fac 1) == X */
INVALID_INFO_MESSAGE(log, "Folding Mix_Cx_Fx::Color");
@@ -731,16 +713,14 @@ TEST(render_graph, constant_fold_part_mix_add_0)
INVALID_INFO_MESSAGE(log, "Folding Out");
build_mix_partial_test_graph(builder, NODE_MIX_ADD, make_float3(0, 0, 0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for RGB Sub with known 0.
*/
-TEST(render_graph, constant_fold_part_mix_sub_0)
+TEST_F(RenderGraph, constant_fold_part_mix_sub_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding Mix_Cx_Fx::Color");
INVALID_INFO_MESSAGE(log, "Folding Mix_Cx_F1::Color");
@@ -750,16 +730,14 @@ TEST(render_graph, constant_fold_part_mix_sub_0)
INVALID_INFO_MESSAGE(log, "Folding Out");
build_mix_partial_test_graph(builder, NODE_MIX_SUB, make_float3(0, 0, 0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for RGB Mul with known 1.
*/
-TEST(render_graph, constant_fold_part_mix_mul_1)
+TEST_F(RenderGraph, constant_fold_part_mix_mul_1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* 1 * X (fac 1) == X */
INVALID_INFO_MESSAGE(log, "Folding Mix_Cx_Fx::Color");
@@ -770,16 +748,14 @@ TEST(render_graph, constant_fold_part_mix_mul_1)
INVALID_INFO_MESSAGE(log, "Folding Out");
build_mix_partial_test_graph(builder, NODE_MIX_MUL, make_float3(1, 1, 1));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for RGB Div with known 1.
*/
-TEST(render_graph, constant_fold_part_mix_div_1)
+TEST_F(RenderGraph, constant_fold_part_mix_div_1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding Mix_Cx_Fx::Color");
INVALID_INFO_MESSAGE(log, "Folding Mix_Cx_F1::Color");
@@ -789,16 +765,14 @@ TEST(render_graph, constant_fold_part_mix_div_1)
INVALID_INFO_MESSAGE(log, "Folding Out");
build_mix_partial_test_graph(builder, NODE_MIX_DIV, make_float3(1, 1, 1));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for RGB Mul with known 0.
*/
-TEST(render_graph, constant_fold_part_mix_mul_0)
+TEST_F(RenderGraph, constant_fold_part_mix_mul_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* 0 * ? (fac ?) == 0 */
CORRECT_INFO_MESSAGE(log, "Folding Mix_Cx_Fx::Color to constant (0, 0, 0).");
@@ -811,16 +785,14 @@ TEST(render_graph, constant_fold_part_mix_mul_0)
INVALID_INFO_MESSAGE(log, "Folding Out1234");
build_mix_partial_test_graph(builder, NODE_MIX_MUL, make_float3(0, 0, 0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for RGB Div with known 0.
*/
-TEST(render_graph, constant_fold_part_mix_div_0)
+TEST_F(RenderGraph, constant_fold_part_mix_div_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* 0 / ? (fac ?) == 0 */
CORRECT_INFO_MESSAGE(log, "Folding Mix_Cx_Fx::Color to constant (0, 0, 0).");
@@ -832,16 +804,14 @@ TEST(render_graph, constant_fold_part_mix_div_0)
INVALID_INFO_MESSAGE(log, "Folding Out1234");
build_mix_partial_test_graph(builder, NODE_MIX_DIV, make_float3(0, 0, 0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Separate/Combine RGB with all constant inputs.
*/
-TEST(render_graph, constant_fold_separate_combine_rgb)
+TEST_F(RenderGraph, constant_fold_separate_combine_rgb)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding SeparateRGB::R to constant (0.3).");
CORRECT_INFO_MESSAGE(log, "Folding SeparateRGB::G to constant (0.5).");
@@ -857,16 +827,14 @@ TEST(render_graph, constant_fold_separate_combine_rgb)
.add_connection("SeparateRGB::B", "CombineRGB::B")
.output_color("CombineRGB::Image");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Separate/Combine XYZ with all constant inputs.
*/
-TEST(render_graph, constant_fold_separate_combine_xyz)
+TEST_F(RenderGraph, constant_fold_separate_combine_xyz)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding SeparateXYZ::X to constant (0.3).");
CORRECT_INFO_MESSAGE(log, "Folding SeparateXYZ::Y to constant (0.5).");
@@ -883,16 +851,14 @@ TEST(render_graph, constant_fold_separate_combine_xyz)
.add_connection("SeparateXYZ::Z", "CombineXYZ::Z")
.output_color("CombineXYZ::Vector");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Separate/Combine HSV with all constant inputs.
*/
-TEST(render_graph, constant_fold_separate_combine_hsv)
+TEST_F(RenderGraph, constant_fold_separate_combine_hsv)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding SeparateHSV::H to constant (0.583333).");
CORRECT_INFO_MESSAGE(log, "Folding SeparateHSV::S to constant (0.571429).");
@@ -908,16 +874,14 @@ TEST(render_graph, constant_fold_separate_combine_hsv)
.add_connection("SeparateHSV::V", "CombineHSV::V")
.output_color("CombineHSV::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Gamma with all constant inputs.
*/
-TEST(render_graph, constant_fold_gamma)
+TEST_F(RenderGraph, constant_fold_gamma)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Gamma::Color to constant (0.164317, 0.353553, 0.585662).");
@@ -927,16 +891,14 @@ TEST(render_graph, constant_fold_gamma)
.set("Gamma", 1.5f))
.output_color("Gamma::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Gamma with one constant 0 input.
*/
-TEST(render_graph, constant_fold_gamma_part_0)
+TEST_F(RenderGraph, constant_fold_gamma_part_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
INVALID_INFO_MESSAGE(log, "Folding Gamma_Cx::");
CORRECT_INFO_MESSAGE(log, "Folding Gamma_xC::Color to constant (1, 1, 1).");
@@ -960,16 +922,14 @@ TEST(render_graph, constant_fold_gamma_part_0)
.add_connection("Gamma_xC::Color", "Out::Color2")
.output_color("Out::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Gamma with one constant 1 input.
*/
-TEST(render_graph, constant_fold_gamma_part_1)
+TEST_F(RenderGraph, constant_fold_gamma_part_1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Gamma_Cx::Color to constant (1, 1, 1).");
CORRECT_INFO_MESSAGE(log, "Folding Gamma_xC::Color to socket Attribute::Color.");
@@ -993,16 +953,14 @@ TEST(render_graph, constant_fold_gamma_part_1)
.add_connection("Gamma_xC::Color", "Out::Color2")
.output_color("Out::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: BrightnessContrast with all constant inputs.
*/
-TEST(render_graph, constant_fold_bright_contrast)
+TEST_F(RenderGraph, constant_fold_bright_contrast)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding BrightContrast::Color to constant (0.16, 0.6, 1.04).");
@@ -1013,16 +971,14 @@ TEST(render_graph, constant_fold_bright_contrast)
.set("Contrast", 1.2f))
.output_color("BrightContrast::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: blackbody with all constant inputs.
*/
-TEST(render_graph, constant_fold_blackbody)
+TEST_F(RenderGraph, constant_fold_blackbody)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Blackbody::Color to constant (3.94163, 0.226523, 0).");
@@ -1031,16 +987,14 @@ TEST(render_graph, constant_fold_blackbody)
.set("Temperature", 1200.0f))
.output_color("Blackbody::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Math with all constant inputs (clamp false).
*/
-TEST(render_graph, constant_fold_math)
+TEST_F(RenderGraph, constant_fold_math)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Math::Value to constant (1.6).");
@@ -1052,16 +1006,14 @@ TEST(render_graph, constant_fold_math)
.set("Value2", 0.9f))
.output_value("Math::Value");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Math with all constant inputs (clamp true).
*/
-TEST(render_graph, constant_fold_math_clamp)
+TEST_F(RenderGraph, constant_fold_math_clamp)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Math::Value to constant (1).");
@@ -1073,7 +1025,7 @@ TEST(render_graph, constant_fold_math_clamp)
.set("Value2", 0.9f))
.output_value("Math::Value");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
@@ -1108,10 +1060,8 @@ static void build_math_partial_test_graph(ShaderGraphBuilder &builder, NodeMath
/*
* Tests: partial folding for Math Add with known 0.
*/
-TEST(render_graph, constant_fold_part_math_add_0)
+TEST_F(RenderGraph, constant_fold_part_math_add_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X + 0 == 0 + X == X */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Value to socket Attribute::Fac.");
@@ -1119,16 +1069,14 @@ TEST(render_graph, constant_fold_part_math_add_0)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_math_partial_test_graph(builder, NODE_MATH_ADD, 0.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Math Sub with known 0.
*/
-TEST(render_graph, constant_fold_part_math_sub_0)
+TEST_F(RenderGraph, constant_fold_part_math_sub_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X - 0 == X */
INVALID_INFO_MESSAGE(log, "Folding Math_Cx::");
@@ -1136,16 +1084,14 @@ TEST(render_graph, constant_fold_part_math_sub_0)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_math_partial_test_graph(builder, NODE_MATH_SUBTRACT, 0.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Math Mul with known 1.
*/
-TEST(render_graph, constant_fold_part_math_mul_1)
+TEST_F(RenderGraph, constant_fold_part_math_mul_1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X * 1 == 1 * X == X */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Value to socket Attribute::Fac.");
@@ -1153,16 +1099,14 @@ TEST(render_graph, constant_fold_part_math_mul_1)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_math_partial_test_graph(builder, NODE_MATH_MULTIPLY, 1.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Math Div with known 1.
*/
-TEST(render_graph, constant_fold_part_math_div_1)
+TEST_F(RenderGraph, constant_fold_part_math_div_1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X / 1 == X */
INVALID_INFO_MESSAGE(log, "Folding Math_Cx::");
@@ -1170,16 +1114,14 @@ TEST(render_graph, constant_fold_part_math_div_1)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_math_partial_test_graph(builder, NODE_MATH_DIVIDE, 1.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Math Mul with known 0.
*/
-TEST(render_graph, constant_fold_part_math_mul_0)
+TEST_F(RenderGraph, constant_fold_part_math_mul_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X * 0 == 0 * X == 0 */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Value to constant (0).");
@@ -1188,16 +1130,14 @@ TEST(render_graph, constant_fold_part_math_mul_0)
CORRECT_INFO_MESSAGE(log, "Discarding closure EmissionNode.");
build_math_partial_test_graph(builder, NODE_MATH_MULTIPLY, 0.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Math Div with known 0.
*/
-TEST(render_graph, constant_fold_part_math_div_0)
+TEST_F(RenderGraph, constant_fold_part_math_div_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* 0 / X == 0 */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Value to constant (0).");
@@ -1205,16 +1145,14 @@ TEST(render_graph, constant_fold_part_math_div_0)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_math_partial_test_graph(builder, NODE_MATH_DIVIDE, 0.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Math Power with known 0.
*/
-TEST(render_graph, constant_fold_part_math_pow_0)
+TEST_F(RenderGraph, constant_fold_part_math_pow_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X ^ 0 == 1 */
INVALID_INFO_MESSAGE(log, "Folding Math_Cx::");
@@ -1222,16 +1160,14 @@ TEST(render_graph, constant_fold_part_math_pow_0)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_math_partial_test_graph(builder, NODE_MATH_POWER, 0.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Math Power with known 1.
*/
-TEST(render_graph, constant_fold_part_math_pow_1)
+TEST_F(RenderGraph, constant_fold_part_math_pow_1)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* 1 ^ X == 1; X ^ 1 == X */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Value to constant (1)");
@@ -1239,16 +1175,14 @@ TEST(render_graph, constant_fold_part_math_pow_1)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_math_partial_test_graph(builder, NODE_MATH_POWER, 1.0f);
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Vector Math with all constant inputs.
*/
-TEST(render_graph, constant_fold_vector_math)
+TEST_F(RenderGraph, constant_fold_vector_math)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding VectorMath::Value to constant (1).");
CORRECT_INFO_MESSAGE(log, "Folding VectorMath::Vector to constant (3, 0, 0).");
@@ -1267,7 +1201,7 @@ TEST(render_graph, constant_fold_vector_math)
.add_connection("VectorMath::Value", "Math::Value2")
.output_color("Math::Value");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
@@ -1299,10 +1233,8 @@ static void build_vecmath_partial_test_graph(ShaderGraphBuilder &builder, NodeVe
/*
* Tests: partial folding for Vector Math Add with known 0.
*/
-TEST(render_graph, constant_fold_part_vecmath_add_0)
+TEST_F(RenderGraph, constant_fold_part_vecmath_add_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X + 0 == 0 + X == X */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Vector to socket Attribute::Vector.");
@@ -1310,16 +1242,14 @@ TEST(render_graph, constant_fold_part_vecmath_add_0)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_vecmath_partial_test_graph(builder, NODE_VECTOR_MATH_ADD, make_float3(0,0,0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Vector Math Sub with known 0.
*/
-TEST(render_graph, constant_fold_part_vecmath_sub_0)
+TEST_F(RenderGraph, constant_fold_part_vecmath_sub_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X - 0 == X */
INVALID_INFO_MESSAGE(log, "Folding Math_Cx::");
@@ -1327,16 +1257,14 @@ TEST(render_graph, constant_fold_part_vecmath_sub_0)
INVALID_INFO_MESSAGE(log, "Folding Out::");
build_vecmath_partial_test_graph(builder, NODE_VECTOR_MATH_SUBTRACT, make_float3(0,0,0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Vector Math Dot Product with known 0.
*/
-TEST(render_graph, constant_fold_part_vecmath_dot_0)
+TEST_F(RenderGraph, constant_fold_part_vecmath_dot_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X * 0 == 0 * X == X */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Vector to constant (0, 0, 0).");
@@ -1345,16 +1273,14 @@ TEST(render_graph, constant_fold_part_vecmath_dot_0)
CORRECT_INFO_MESSAGE(log, "Discarding closure EmissionNode.");
build_vecmath_partial_test_graph(builder, NODE_VECTOR_MATH_DOT_PRODUCT, make_float3(0,0,0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: partial folding for Vector Math Cross Product with known 0.
*/
-TEST(render_graph, constant_fold_part_vecmath_cross_0)
+TEST_F(RenderGraph, constant_fold_part_vecmath_cross_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
/* X * 0 == 0 * X == X */
CORRECT_INFO_MESSAGE(log, "Folding Math_Cx::Vector to constant (0, 0, 0).");
@@ -1363,16 +1289,14 @@ TEST(render_graph, constant_fold_part_vecmath_cross_0)
CORRECT_INFO_MESSAGE(log, "Discarding closure EmissionNode.");
build_vecmath_partial_test_graph(builder, NODE_VECTOR_MATH_CROSS_PRODUCT, make_float3(0,0,0));
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Bump with no height input folded to Normal input.
*/
-TEST(render_graph, constant_fold_bump)
+TEST_F(RenderGraph, constant_fold_bump)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Bump::Normal to socket Geometry1::Normal.");
@@ -1382,16 +1306,14 @@ TEST(render_graph, constant_fold_bump)
.add_connection("Geometry1::Normal", "Bump::Normal")
.output_color("Bump::Normal");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests: Bump with no inputs folded to Geometry::Normal.
*/
-TEST(render_graph, constant_fold_bump_no_input)
+TEST_F(RenderGraph, constant_fold_bump_no_input)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Bump::Normal to socket geometry::Normal.");
@@ -1399,7 +1321,7 @@ TEST(render_graph, constant_fold_bump_no_input)
.add_node(ShaderNodeBuilder<BumpNode>("Bump"))
.output_color("Bump::Normal");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
template<class T>
@@ -1416,10 +1338,8 @@ void init_test_curve(array<T> &buffer, T start, T end, int steps)
* Tests:
* - Folding of RGB Curves with all constant inputs.
*/
-TEST(render_graph, constant_fold_rgb_curves)
+TEST_F(RenderGraph, constant_fold_rgb_curves)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Curves::Color to constant (0.275, 0.5, 0.475).");
@@ -1435,17 +1355,15 @@ TEST(render_graph, constant_fold_rgb_curves)
.set("Color", make_float3(0.3f, 0.5f, 0.7f)))
.output_color("Curves::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of RGB Curves with zero Fac.
*/
-TEST(render_graph, constant_fold_rgb_curves_fac_0)
+TEST_F(RenderGraph, constant_fold_rgb_curves_fac_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Curves::Color to socket Attribute::Color.");
@@ -1462,7 +1380,7 @@ TEST(render_graph, constant_fold_rgb_curves_fac_0)
.add_connection("Attribute::Color", "Curves::Color")
.output_color("Curves::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
@@ -1470,10 +1388,8 @@ TEST(render_graph, constant_fold_rgb_curves_fac_0)
* Tests:
* - Folding of RGB Curves with zero Fac and all constant inputs.
*/
-TEST(render_graph, constant_fold_rgb_curves_fac_0_const)
+TEST_F(RenderGraph, constant_fold_rgb_curves_fac_0_const)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Curves::Color to constant (0.3, 0.5, 0.7).");
@@ -1489,17 +1405,15 @@ TEST(render_graph, constant_fold_rgb_curves_fac_0_const)
.set("Color", make_float3(0.3f, 0.5f, 0.7f)))
.output_color("Curves::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Vector Curves with all constant inputs.
*/
-TEST(render_graph, constant_fold_vector_curves)
+TEST_F(RenderGraph, constant_fold_vector_curves)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Curves::Vector to constant (0.275, 0.5, 0.475).");
@@ -1515,17 +1429,15 @@ TEST(render_graph, constant_fold_vector_curves)
.set("Vector", make_float3(0.3f, 0.5f, 0.7f)))
.output_color("Curves::Vector");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Vector Curves with zero Fac.
*/
-TEST(render_graph, constant_fold_vector_curves_fac_0)
+TEST_F(RenderGraph, constant_fold_vector_curves_fac_0)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Curves::Vector to socket Attribute::Vector.");
@@ -1542,17 +1454,15 @@ TEST(render_graph, constant_fold_vector_curves_fac_0)
.add_connection("Attribute::Vector", "Curves::Vector")
.output_color("Curves::Vector");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Color Ramp with all constant inputs.
*/
-TEST(render_graph, constant_fold_rgb_ramp)
+TEST_F(RenderGraph, constant_fold_rgb_ramp)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Ramp::Color to constant (0.14, 0.39, 0.64).");
CORRECT_INFO_MESSAGE(log, "Folding Ramp::Alpha to constant (0.89).");
@@ -1574,17 +1484,15 @@ TEST(render_graph, constant_fold_rgb_ramp)
.add_connection("Ramp::Alpha", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of Color Ramp with all constant inputs (interpolate false).
*/
-TEST(render_graph, constant_fold_rgb_ramp_flat)
+TEST_F(RenderGraph, constant_fold_rgb_ramp_flat)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Ramp::Color to constant (0.125, 0.375, 0.625).");
CORRECT_INFO_MESSAGE(log, "Folding Ramp::Alpha to constant (0.875).");
@@ -1606,17 +1514,15 @@ TEST(render_graph, constant_fold_rgb_ramp_flat)
.add_connection("Ramp::Alpha", "Mix::Color2")
.output_color("Mix::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of redundant conversion of float to color to float.
*/
-TEST(render_graph, constant_fold_convert_float_color_float)
+TEST_F(RenderGraph, constant_fold_convert_float_color_float)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding Invert::Color to socket convert_float_to_color::value_color.");
CORRECT_INFO_MESSAGE(log, "Folding convert_color_to_float::value_float to socket Attribute::Fac.");
@@ -1628,17 +1534,15 @@ TEST(render_graph, constant_fold_convert_float_color_float)
.add_connection("Attribute::Fac", "Invert::Color")
.output_value("Invert::Color");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - Folding of redundant conversion of color to vector to color.
*/
-TEST(render_graph, constant_fold_convert_color_vector_color)
+TEST_F(RenderGraph, constant_fold_convert_color_vector_color)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding VecAdd::Vector to socket convert_color_to_vector::value_vector.");
CORRECT_INFO_MESSAGE(log, "Folding convert_vector_to_color::value_color to socket Attribute::Color.");
@@ -1651,17 +1555,15 @@ TEST(render_graph, constant_fold_convert_color_vector_color)
.add_connection("Attribute::Color", "VecAdd::Vector1")
.output_color("VecAdd::Vector");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
/*
* Tests:
* - NOT folding conversion of color to float to color.
*/
-TEST(render_graph, constant_fold_convert_color_float_color)
+TEST_F(RenderGraph, constant_fold_convert_color_float_color)
{
- DEFINE_COMMON_VARIABLES(builder, log);
-
EXPECT_ANY_MESSAGE(log);
CORRECT_INFO_MESSAGE(log, "Folding MathAdd::Value to socket convert_color_to_float::value_float.");
INVALID_INFO_MESSAGE(log, "Folding convert_float_to_color::");
@@ -1674,7 +1576,7 @@ TEST(render_graph, constant_fold_convert_color_float_color)
.add_connection("Attribute::Color", "MathAdd::Value1")
.output_color("MathAdd::Value");
- graph.finalize(&scene);
+ graph.finalize(scene);
}
CCL_NAMESPACE_END
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index 64a5cad812a..bec2c7a1f45 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -341,9 +341,9 @@ enum {
/* spare tag, assumed dirty, use define in each function to name based on use */
// _BM_ELEM_TAG_ALT = (1 << 6), // UNUSED
/**
- * for low level internal API tagging,
- * since tools may want to tag verts and
- * not have functions clobber them */
+ * For low level internal API tagging,
+ * since tools may want to tag verts and not have functions clobber them.
+ * Leave cleared! */
BM_ELEM_INTERNAL_TAG = (1 << 7),
};
diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index c7ff93cf504..36b2f9cadf7 100644
--- a/source/blender/bmesh/intern/bmesh_core.c
+++ b/source/blender/bmesh/intern/bmesh_core.c
@@ -2090,25 +2090,33 @@ BMFace *bmesh_kernel_join_face_kill_edge(BMesh *bm, BMFace *f1, BMFace *f2, BMEd
}
/* validate no internal join */
- for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
- BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
- }
- for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
- BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
- }
+ {
+ bool is_dupe = false;
- for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
- if (l_iter != l_f1) {
- BM_elem_flag_enable(l_iter->v, BM_ELEM_INTERNAL_TAG);
+ /* TODO: skip clearing once this is ensured. */
+ for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
+ BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
}
- }
- for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
- if (l_iter != l_f2) {
- /* as soon as a duplicate is found, bail out */
- if (BM_elem_flag_test(l_iter->v, BM_ELEM_INTERNAL_TAG)) {
- return NULL;
+
+ for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
+ BM_elem_flag_set(l_iter->v, BM_ELEM_INTERNAL_TAG, l_iter != l_f1);
+ }
+ for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
+ if (l_iter != l_f2) {
+ /* as soon as a duplicate is found, bail out */
+ if (BM_elem_flag_test(l_iter->v, BM_ELEM_INTERNAL_TAG)) {
+ is_dupe = true;
+ break;
+ }
}
}
+ /* Cleanup tags. */
+ for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
+ BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
+ }
+ if (is_dupe) {
+ return NULL;
+ }
}
/* join the two loop */
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c
index b3b23933d2f..9d51b59825d 100644
--- a/source/blender/bmesh/intern/bmesh_edgeloop.c
+++ b/source/blender/bmesh/intern/bmesh_edgeloop.c
@@ -33,6 +33,7 @@
#include "BLI_listbase.h"
#include "BLI_mempool.h"
#include "BLI_utildefines_iter.h"
+#include "BLI_stack.h"
#include "bmesh.h"
@@ -141,28 +142,36 @@ int BM_mesh_edgeloops_find(
}
/* first flush edges to tags, and tag verts */
+ BLI_Stack *edge_stack = BLI_stack_new(sizeof(BMEdge *), __func__);
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+ BLI_assert(!BM_elem_flag_test(e, BM_ELEM_INTERNAL_TAG));
if (test_fn(e, user_data)) {
BM_elem_flag_enable(e, BM_ELEM_INTERNAL_TAG);
BM_elem_flag_enable(e->v1, BM_ELEM_INTERNAL_TAG);
BM_elem_flag_enable(e->v2, BM_ELEM_INTERNAL_TAG);
+ BLI_stack_push(edge_stack, (void *)&e);
}
else {
BM_elem_flag_disable(e, BM_ELEM_INTERNAL_TAG);
}
}
- BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+ const uint edges_len = BLI_stack_count(edge_stack);
+ BMEdge **edges = MEM_mallocN(sizeof(*edges) * edges_len, __func__);
+ BLI_stack_pop_n_reverse(edge_stack, edges, BLI_stack_count(edge_stack));
+ BLI_stack_free(edge_stack);
+
+ for (uint i = 0; i < edges_len; i += 1) {
+ e = edges[i];
if (BM_elem_flag_test(e, BM_ELEM_INTERNAL_TAG)) {
BMEdgeLoopStore *el_store = MEM_callocN(sizeof(BMEdgeLoopStore), __func__);
/* add both directions */
if (bm_loop_build(el_store, e->v1, e->v2, 1) &&
- bm_loop_build(el_store, e->v2, e->v1, -1) &&
- el_store->len > 1)
+ bm_loop_build(el_store, e->v2, e->v1, -1) &&
+ el_store->len > 1)
{
BLI_addtail(r_eloops, el_store);
- BM_elem_flag_disable(e, BM_ELEM_INTERNAL_TAG);
count++;
}
else {
@@ -170,6 +179,15 @@ int BM_mesh_edgeloops_find(
}
}
}
+
+ for (uint i = 0; i < edges_len; i += 1) {
+ e = edges[i];
+ BM_elem_flag_disable(e, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_disable(e->v1, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_disable(e->v2, BM_ELEM_INTERNAL_TAG);
+ }
+
+ MEM_freeN(edges);
return count;
}
@@ -267,6 +285,7 @@ bool BM_mesh_edgeloops_find_path(
{
BMIter iter;
BMEdge *e;
+ bool found = false;
BLI_assert(v_src != v_dst);
@@ -274,28 +293,43 @@ bool BM_mesh_edgeloops_find_path(
BMVert *v;
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BM_elem_index_set(v, 0);
+ BM_elem_flag_disable(v, BM_ELEM_INTERNAL_TAG);
}
}
bm->elem_index_dirty |= BM_VERT;
/* first flush edges to tags, and tag verts */
+ int edges_len;
+ BMEdge **edges;
+
if (test_fn) {
+ BLI_Stack *edge_stack = BLI_stack_new(sizeof(BMEdge *), __func__);
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (test_fn(e, user_data)) {
BM_elem_flag_enable(e, BM_ELEM_INTERNAL_TAG);
BM_elem_flag_enable(e->v1, BM_ELEM_INTERNAL_TAG);
BM_elem_flag_enable(e->v2, BM_ELEM_INTERNAL_TAG);
+ BLI_stack_push(edge_stack, (void *)&e);
}
else {
BM_elem_flag_disable(e, BM_ELEM_INTERNAL_TAG);
}
}
+ edges_len = BLI_stack_count(edge_stack);
+ edges = MEM_mallocN(sizeof(*edges) * edges_len, __func__);
+ BLI_stack_pop_n_reverse(edge_stack, edges, BLI_stack_count(edge_stack));
+ BLI_stack_free(edge_stack);
}
else {
- BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+ int i = 0;
+ edges_len = bm->totedge;
+ edges = MEM_mallocN(sizeof(*edges) * edges_len, __func__);
+
+ BM_ITER_MESH_INDEX (e, &iter, bm, BM_EDGES_OF_MESH, i) {
BM_elem_flag_enable(e, BM_ELEM_INTERNAL_TAG);
BM_elem_flag_enable(e->v1, BM_ELEM_INTERNAL_TAG);
BM_elem_flag_enable(e->v2, BM_ELEM_INTERNAL_TAG);
+ edges[i] = e;
}
}
@@ -354,11 +388,19 @@ bool BM_mesh_edgeloops_find_path(
BLI_addtail(r_eloops, el_store);
- return true;
+ found = true;
}
}
- return false;
+ for (uint i = 0; i < edges_len; i += 1) {
+ e = edges[i];
+ BM_elem_flag_disable(e, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_disable(e->v1, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_disable(e->v2, BM_ELEM_INTERNAL_TAG);
+ }
+ MEM_freeN(edges);
+
+ return found;
}
@@ -753,19 +795,29 @@ bool BM_edgeloop_overlap_check(struct BMEdgeLoopStore *el_store_a, struct BMEdge
{
LinkData *node;
+ /* A little more efficient if 'a' as smaller. */
+ if (el_store_a->len > el_store_b->len) {
+ SWAP(BMEdgeLoopStore *, el_store_a, el_store_b);
+ }
+
/* init */
for (node = el_store_a->verts.first; node; node = node->next) {
- BM_elem_flag_disable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_enable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
}
for (node = el_store_b->verts.first; node; node = node->next) {
- BM_elem_flag_enable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_disable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
}
- /* check 'a' */
+ /* Check 'a' (clear as we go). */
for (node = el_store_a->verts.first; node; node = node->next) {
- if (BM_elem_flag_test((BMVert *)node->data, BM_ELEM_INTERNAL_TAG)) {
+ if (!BM_elem_flag_test((BMVert *)node->data, BM_ELEM_INTERNAL_TAG)) {
+ /* Finish clearing 'a', leave tag clean. */
+ while ((node = node->next)) {
+ BM_elem_flag_disable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
+ }
return true;
}
+ BM_elem_flag_disable((BMVert *)node->data, BM_ELEM_INTERNAL_TAG);
}
return false;
}
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index 20ee31251e8..00f8eb6df40 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -957,7 +957,7 @@ static void bm_loop_walk_add(struct LoopWalkCtx *lwc, BMLoop *l)
{
const int i = BM_elem_index_get(l);
const float w = lwc->loop_weights[i];
- BM_elem_flag_enable(l, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_disable(l, BM_ELEM_INTERNAL_TAG);
lwc->data_array[lwc->data_len] = BM_ELEM_CD_GET_VOID_P(l, lwc->cd_layer_offset);
lwc->data_index_array[lwc->data_len] = i;
lwc->weight_array[lwc->data_len] = w;
@@ -976,7 +976,7 @@ static void bm_loop_walk_data(struct LoopWalkCtx *lwc, BMLoop *l_walk)
int i;
BLI_assert(CustomData_data_equals(lwc->type, lwc->data_ref, BM_ELEM_CD_GET_VOID_P(l_walk, lwc->cd_layer_offset)));
- BLI_assert(BM_elem_flag_test(l_walk, BM_ELEM_INTERNAL_TAG) == false);
+ BLI_assert(BM_elem_flag_test(l_walk, BM_ELEM_INTERNAL_TAG));
bm_loop_walk_add(lwc, l_walk);
@@ -988,7 +988,7 @@ static void bm_loop_walk_data(struct LoopWalkCtx *lwc, BMLoop *l_walk)
l_other = l_other->next;
}
BLI_assert(l_other->v == l_walk->v);
- if (!BM_elem_flag_test(l_other, BM_ELEM_INTERNAL_TAG)) {
+ if (BM_elem_flag_test(l_other, BM_ELEM_INTERNAL_TAG)) {
if (CustomData_data_equals(lwc->type, lwc->data_ref, BM_ELEM_CD_GET_VOID_P(l_other, lwc->cd_layer_offset))) {
bm_loop_walk_data(lwc, l_other);
}
@@ -1012,9 +1012,10 @@ LinkNode *BM_vert_loop_groups_data_layer_create(
lwc.loop_weights = loop_weights;
lwc.arena = arena;
+ /* Enable 'BM_ELEM_INTERNAL_TAG', leaving the flag clean on completion. */
loop_num = 0;
BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
- BM_elem_flag_disable(l, BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_enable(l, BM_ELEM_INTERNAL_TAG);
BM_elem_index_set(l, loop_num); /* set_dirty! */
loop_num++;
}
@@ -1026,7 +1027,7 @@ LinkNode *BM_vert_loop_groups_data_layer_create(
lwc.weight_array = BLI_memarena_alloc(lwc.arena, sizeof(float) * loop_num);
BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
- if (!BM_elem_flag_test(l, BM_ELEM_INTERNAL_TAG)) {
+ if (BM_elem_flag_test(l, BM_ELEM_INTERNAL_TAG)) {
struct LoopGroupCD *lf = BLI_memarena_alloc(lwc.arena, sizeof(*lf));
int len_prev = lwc.data_len;
diff --git a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
index 8a3cb329610..41775bdf2d0 100644
--- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
+++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
@@ -1236,6 +1236,8 @@ bool BM_face_split_edgenet_connect_islands(
BMLoop *l_iter, *l_first;
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
do {
+ BLI_assert(!BM_elem_flag_test(l_iter->v, VERT_NOT_IN_STACK));
+ BLI_assert(!BM_elem_flag_test(l_iter->e, EDGE_NOT_IN_STACK));
edge_arr[i++] = l_iter->e;
} while ((l_iter = l_iter->next) != l_first);
BLI_assert(i == edge_arr_len);
diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c
index 5bdc3927e16..1f944238999 100644
--- a/source/blender/bmesh/intern/bmesh_queries.c
+++ b/source/blender/bmesh/intern/bmesh_queries.c
@@ -2108,7 +2108,8 @@ bool BM_face_exists_multi(BMVert **varr, BMEdge **earr, int len)
if (tot_tag == 0) {
/* no faces use only boundary verts, quit early */
- return false;
+ ok = false;
+ goto finally;
}
/* 2) loop over non-boundary edges that use boundary verts,
@@ -2143,6 +2144,12 @@ bool BM_face_exists_multi(BMVert **varr, BMEdge **earr, int len)
}
}
+finally:
+ /* Cleanup */
+ for (i = 0; i < len; i++) {
+ BM_elem_flag_disable(varr[i], BM_ELEM_INTERNAL_TAG);
+ BM_elem_flag_disable(earr[i], BM_ELEM_INTERNAL_TAG);
+ }
return ok;
}
diff --git a/source/blender/bmesh/operators/bmo_split_edges.c b/source/blender/bmesh/operators/bmo_split_edges.c
index eb7946caff0..f67a9e38fcc 100644
--- a/source/blender/bmesh/operators/bmo_split_edges.c
+++ b/source/blender/bmesh/operators/bmo_split_edges.c
@@ -50,5 +50,5 @@ void bmo_split_edges_exec(BMesh *bm, BMOperator *op)
/* this is where everything happens */
BM_mesh_edgesplit(bm, use_verts, true, false);
- BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_INTERNAL_TAG);
+ BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_TAG);
}
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index 68982275c79..1683fbdbdb9 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -1085,6 +1085,8 @@ typedef struct tNearestVertInfo {
int dist; /* distance from mouse to vert */
eAnim_ChannelType ctype; /* type of animation channel this FCurve comes from */
+
+ float frame; /* frame that point was on when it matched (global time) */
} tNearestVertInfo;
/* Tags for the type of graph vert that we have */
@@ -1151,6 +1153,8 @@ static void nearest_fcurve_vert_store(
nvi->hpoint = hpoint;
nvi->dist = dist;
+ nvi->frame = bezt->vec[1][0]; /* currently in global time... */
+
nvi->sel = BEZT_ISSEL_ANY(bezt); // XXX... should this use the individual verts instead?
/* add to list of matches if appropriate... */
@@ -1435,10 +1439,7 @@ static void graphkeys_mselect_column(bAnimContext *ac, const int mval[2], short
/* get frame number on which elements should be selected */
// TODO: should we restrict to integer frames only?
- if (nvi->bezt)
- selx = nvi->bezt->vec[1][0];
- else if (nvi->fpt)
- selx = nvi->fpt->vec[0];
+ selx = nvi->frame;
/* if select mode is replace, deselect all keyframes first */
if (select_mode == SELECT_REPLACE) {
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c
index 8ab46240eed..629c3a3c7a3 100644
--- a/source/blender/python/bmesh/bmesh_py_types.c
+++ b/source/blender/python/bmesh/bmesh_py_types.c
@@ -3872,7 +3872,7 @@ void *BPy_BMElem_PySeq_As_Array_FAST(
BMesh *bm = (r_bm && *r_bm) ? *r_bm : NULL;
PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast);
const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast);
- Py_ssize_t i;
+ Py_ssize_t i, i_last_dirty = PY_SSIZE_T_MAX;
BPy_BMElem *item;
BMElem **alloc;
@@ -3921,6 +3921,7 @@ void *BPy_BMElem_PySeq_As_Array_FAST(
if (do_unique_check) {
BM_elem_flag_enable(item->ele, BM_ELEM_INTERNAL_TAG);
+ i_last_dirty = i;
}
}
@@ -3937,6 +3938,8 @@ void *BPy_BMElem_PySeq_As_Array_FAST(
}
if (ok == false) {
+ /* Cleared above. */
+ i_last_dirty = PY_SSIZE_T_MAX;
PyErr_Format(PyExc_ValueError,
"%s: found the same %.200s used multiple times",
error_prefix, BPy_BMElem_StringFromHType(htype));
@@ -3949,6 +3952,11 @@ void *BPy_BMElem_PySeq_As_Array_FAST(
return alloc;
err_cleanup:
+ if (do_unique_check && (i_last_dirty != PY_SSIZE_T_MAX)) {
+ for (i = 0; i <= i_last_dirty; i++) {
+ BM_elem_flag_disable(alloc[i], BM_ELEM_INTERNAL_TAG);
+ }
+ }
PyMem_FREE(alloc);
return NULL;