[Bf-blender-cvs] [82bcfb9b342] experimental-build: Cycles experimental build v5, fixed version

Lukas Stockner noreply at git.blender.org
Tue Mar 28 16:41:03 CEST 2017


Commit: 82bcfb9b342ae261c1331fd4658229bc00f8531b
Author: Lukas Stockner
Date:   Tue Mar 28 05:08:57 2017 +0200
Branches: experimental-build
https://developer.blender.org/rB82bcfb9b342ae261c1331fd4658229bc00f8531b

Cycles experimental build v5, fixed version

THe first version had wrong blenderplayer stubs.

Includes:
- Denoising (temp-cycles-denoising branch)
- IES lights (D1543)
- Dithered Sobol Sampling (D2149)
- Microjittering
- Storing the current viewport render as a render result
- UDIM support (D2575)
- AOVs (D2443, D2444)
- Disney/Principled BSDF (D2313)
- Normal/Bump map correction to avoid black spots (D2574)
- Color management tweaks to ensure correct renders with non-Rec.709 primaries

===================================================================

M	build_files/cmake/macros.cmake
M	intern/cycles/CMakeLists.txt
M	intern/cycles/app/CMakeLists.txt
A	intern/cycles/app/cycles_dithering.cpp
M	intern/cycles/blender/CMakeLists.txt
M	intern/cycles/blender/addon/__init__.py
M	intern/cycles/blender/addon/engine.py
M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_curves.cpp
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_object.cpp
M	intern/cycles/blender/blender_python.cpp
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/blender/blender_sync.h
M	intern/cycles/blender/blender_util.h
M	intern/cycles/device/CMakeLists.txt
M	intern/cycles/device/device.h
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_cuda.cpp
A	intern/cycles/device/device_denoising.cpp
A	intern/cycles/device/device_denoising.h
M	intern/cycles/device/device_memory.h
M	intern/cycles/device/device_multi.cpp
M	intern/cycles/device/device_split_kernel.cpp
M	intern/cycles/device/device_split_kernel.h
M	intern/cycles/device/device_task.cpp
M	intern/cycles/device/device_task.h
M	intern/cycles/device/opencl/opencl.h
M	intern/cycles/device/opencl/opencl_base.cpp
M	intern/cycles/device/opencl/opencl_mega.cpp
M	intern/cycles/device/opencl/opencl_split.cpp
M	intern/cycles/device/opencl/opencl_util.cpp
A	intern/cycles/filter/CMakeLists.txt
A	intern/cycles/filter/filter.h
A	intern/cycles/filter/filter_compat_cpu.h
A	intern/cycles/filter/filter_compat_cuda.h
A	intern/cycles/filter/filter_compat_opencl.h
A	intern/cycles/filter/filter_defines.h
A	intern/cycles/filter/filter_features.h
A	intern/cycles/filter/filter_features_sse.h
A	intern/cycles/filter/filter_kernel.h
A	intern/cycles/filter/filter_nlm_cpu.h
A	intern/cycles/filter/filter_nlm_gpu.h
A	intern/cycles/filter/filter_prefilter.h
A	intern/cycles/filter/filter_reconstruction.h
A	intern/cycles/filter/filter_transform.h
A	intern/cycles/filter/filter_transform_gpu.h
A	intern/cycles/filter/filter_transform_sse.h
A	intern/cycles/filter/kernels/cpu/filter.cpp
A	intern/cycles/filter/kernels/cpu/filter_avx.cpp
A	intern/cycles/filter/kernels/cpu/filter_avx2.cpp
A	intern/cycles/filter/kernels/cpu/filter_cpu.h
A	intern/cycles/filter/kernels/cpu/filter_cpu_impl.h
A	intern/cycles/filter/kernels/cpu/filter_sse2.cpp
A	intern/cycles/filter/kernels/cpu/filter_sse3.cpp
A	intern/cycles/filter/kernels/cpu/filter_sse41.cpp
A	intern/cycles/filter/kernels/cuda/filter.cu
A	intern/cycles/filter/kernels/cuda/kernel_config.h
A	intern/cycles/filter/kernels/opencl/filter.cl
M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/closure/bsdf.h
M	intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h
M	intern/cycles/kernel/closure/bsdf_diffuse.h
M	intern/cycles/kernel/closure/bsdf_diffuse_ramp.h
M	intern/cycles/kernel/closure/bsdf_microfacet.h
M	intern/cycles/kernel/closure/bsdf_microfacet_multi.h
M	intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h
M	intern/cycles/kernel/closure/bsdf_oren_nayar.h
M	intern/cycles/kernel/closure/bsdf_phong_ramp.h
A	intern/cycles/kernel/closure/bsdf_principled_diffuse.h
A	intern/cycles/kernel/closure/bsdf_principled_sheen.h
M	intern/cycles/kernel/closure/bsdf_toon.h
M	intern/cycles/kernel/closure/bsdf_util.h
M	intern/cycles/kernel/closure/bssrdf.h
M	intern/cycles/kernel/geom/geom_triangle.h
M	intern/cycles/kernel/kernel.h
M	intern/cycles/kernel/kernel_accumulate.h
M	intern/cycles/kernel/kernel_bake.h
A	intern/cycles/kernel/kernel_color.h
M	intern/cycles/kernel/kernel_compat_cpu.h
M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_film.h
M	intern/cycles/kernel/kernel_light.h
M	intern/cycles/kernel/kernel_montecarlo.h
M	intern/cycles/kernel/kernel_passes.h
A	intern/cycles/kernel/kernel_passes_write.h
M	intern/cycles/kernel/kernel_path.h
M	intern/cycles/kernel/kernel_path_branched.h
M	intern/cycles/kernel/kernel_path_state.h
M	intern/cycles/kernel/kernel_path_surface.h
M	intern/cycles/kernel/kernel_path_volume.h
M	intern/cycles/kernel/kernel_projection.h
M	intern/cycles/kernel/kernel_random.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_shadow.h
M	intern/cycles/kernel/kernel_subsurface.h
M	intern/cycles/kernel/kernel_textures.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/kernels/cpu/kernel_avx.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_avx2.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_cpu.h
M	intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
M	intern/cycles/kernel/kernels/cpu/kernel_split_avx.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_split_avx2.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_split_sse2.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_split_sse3.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_split_sse41.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_sse2.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_sse3.cpp
M	intern/cycles/kernel/kernels/cpu/kernel_sse41.cpp
M	intern/cycles/kernel/osl/osl_bssrdf.cpp
M	intern/cycles/kernel/osl/osl_closures.cpp
M	intern/cycles/kernel/osl/osl_closures.h
M	intern/cycles/kernel/osl/osl_services.cpp
M	intern/cycles/kernel/shaders/CMakeLists.txt
A	intern/cycles/kernel/shaders/node_ies_light.osl
A	intern/cycles/kernel/shaders/node_principled_bsdf.osl
A	intern/cycles/kernel/shaders/node_udim_texture.osl
M	intern/cycles/kernel/shaders/stdosl.h
M	intern/cycles/kernel/split/kernel_buffer_update.h
M	intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h
M	intern/cycles/kernel/split/kernel_indirect_background.h
M	intern/cycles/kernel/split/kernel_next_iteration_setup.h
M	intern/cycles/kernel/split/kernel_shader_eval.h
M	intern/cycles/kernel/split/kernel_split_common.h
M	intern/cycles/kernel/svm/svm.h
A	intern/cycles/kernel/svm/svm_aov.h
M	intern/cycles/kernel/svm/svm_blackbody.h
M	intern/cycles/kernel/svm/svm_closure.h
M	intern/cycles/kernel/svm/svm_convert.h
M	intern/cycles/kernel/svm/svm_displace.h
M	intern/cycles/kernel/svm/svm_geometry.h
A	intern/cycles/kernel/svm/svm_ies.h
M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/kernel/svm/svm_sky.h
M	intern/cycles/kernel/svm/svm_tex_coord.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/kernel/svm/svm_wavelength.h
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/buffers.h
M	intern/cycles/render/constant_fold.cpp
M	intern/cycles/render/constant_fold.h
M	intern/cycles/render/film.cpp
M	intern/cycles/render/film.h
M	intern/cycles/render/graph.cpp
M	intern/cycles/render/graph.h
M	intern/cycles/render/image.cpp
M	intern/cycles/render/image.h
M	intern/cycles/render/integrator.cpp
M	intern/cycles/render/integrator.h
M	intern/cycles/render/light.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	intern/cycles/render/osl.cpp
M	intern/cycles/render/osl.h
M	intern/cycles/render/scene.cpp
M	intern/cycles/render/scene.h
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h
M	intern/cycles/render/shader.cpp
M	intern/cycles/render/shader.h
M	intern/cycles/render/sobol.cpp
M	intern/cycles/render/sobol.h
M	intern/cycles/render/svm.cpp
M	intern/cycles/render/svm.h
M	intern/cycles/render/tile.cpp
M	intern/cycles/render/tile.h
M	intern/cycles/test/CMakeLists.txt
M	intern/cycles/util/CMakeLists.txt
M	intern/cycles/util/util_color.h
A	intern/cycles/util/util_cuda.h
M	intern/cycles/util/util_guarded_allocator.h
M	intern/cycles/util/util_math.h
A	intern/cycles/util/util_math_matrix.h
M	intern/cycles/util/util_simd.h
M	intern/cycles/util/util_texture.h
M	intern/cycles/util/util_transform.h
M	intern/cycles/util/util_types.h
M	intern/opencolorio/fallback_impl.cc
M	intern/opencolorio/gpu_shader_display_transform.glsl
M	intern/opencolorio/ocio_capi.cc
M	intern/opencolorio/ocio_capi.h
M	intern/opencolorio/ocio_impl.h
M	intern/opencolorio/ocio_impl_glsl.cc
M	release/datafiles/colormanagement/config.ocio
A	release/datafiles/colormanagement/luts/rgb_to_bgr.spimtx
M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_blender_version.h
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/colortools.c
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_270.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/compositor/CMakeLists.txt
M	source/blender/compositor/intern/COM_NodeGraph.cpp
M	source/blender/compositor/nodes/COM_ImageNode.cpp
M	source/blender/compositor/nodes/COM_RenderLayersNode.cpp
M	source/blender/compositor/nodes/COM_RenderLayersNode.h
M	source/blender/compositor/operations/COM_RenderLayersProg.cpp
M	source/blender/compositor/operations/COM_RenderLayersProg.h
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/render/render_intern.h
M	source/blender/editors/render/render_internal.c
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/render/render_ops.c
M	source/blender/editors/render/render_preview.c
M	source/blender/editors/render/render_view.c
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_node/drawnode.c
M	source/blender/editors/space_node/node_edit.c
M	source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/imbuf/IMB_colormanagement.h
M	source/blender/imbuf/intern/colormanagement.c
M	source/blender/makesdna/DNA_color_types.h
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/CMakeLists.txt
M	source/blender/makesrna/intern/rna_color.c
M	source/blender/makesrna/intern/rna_context.c
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_composite.h
M	source/blender/nodes/NOD_shader.h
M	source/blender/nodes/NOD_static_types.h
M	source/blender/nodes/composite/node_composite_tree.c
M	source/blender/nodes/composite/nodes/node_composite_image.c
A	source/blender/nodes/shader/nodes/node_shader_aov_output.c
A	source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
A	source/blender/nodes/shader/nodes/node_shader_ies_light.c
M	source/blender/nodes/shader/nodes/node_shader_tex_image.c
M	source/blender/render/CMakeLists.txt
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/include/render_result.h
M	source/blender/render/intern/source/envmap.c
M	source/blender/render/intern/source/external_engine.c
M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/render_result.c
M	source/blender/render/intern/source/rendercore.c
M	source/blender/render/intern/source/zbuf.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================

diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index f9992ee92b9..e70f155668c 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -536,6 +536,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
 			cycles_bvh
 			cycles_device
 			cycles_kernel
+			cycles_filter
 			cycles_util
 			cycles_subd)
 		if(WITH_CYCLES_OSL)
@@ -651,6 +652,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
 		cycles_bvh
 		cycles_device
 		cycles_kernel
+		cycles_filter
 		cycles_util
 		cycles_subd
 		bf_intern_opencolorio
diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index 31fa15a2042..9d9c86f383d 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -245,6 +245,7 @@ endif()
 add_subdirectory(bvh)
 add_subdirectory(device)
 add_subdirectory(doc)
+add_subdirectory(filter)
 add_subdirectory(graph)
 add_subdirectory(kernel)
 add_subdirectory(render)
diff --git a/intern/cycles/app/CMakeLists.txt b/intern/cycles/app/CMakeLists.txt
index 8cd499b7ca6..88b46038eb2 100644
--- a/intern/cycles/app/CMakeLists.txt
+++ b/intern/cycles/app/CMakeLists.txt
@@ -18,6 +18,7 @@ set(INC_SYS
 set(LIBRARIES
 	cycles_device
 	cycles_kernel
+	cycles_filter
 	cycles_render
 	cycles_bvh
 	cycles_subd
diff --git a/intern/cycles/app/cycles_dithering.cpp b/intern/cycles/app/cycles_dithering.cpp
new file mode 100644
index 00000000000..e1ccef55410
--- /dev/null
+++ b/intern/cycles/app/cycles_dithering.cpp
@@ -0,0 +1,308 @@
+/*
+ * Copyright 2016 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* This code implements a matrix optimization based on simulated annealing
+ * that minimizes the energy function described in the paper "Blue-noise Dithered Sampling".
+ *
+ * Dimensionality and Size of the matrix are hardcoded as #defines below.
+ * It includes both a easily readable scalar implementation as well as a SSE4.1-optimized code path (which only supports DIM=2 currently).
+ *
+ * For full speed, compile with: g++ -o cycles_dithering cycles_dithering.cpp -O3 -march=native --std=c++11
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <math.h>
+#include <random>
+
+std::mt19937 rng(time(0));
+
+float *mat;
+float starting_temp;
+uint64_t num_iter;
+
+/* Note: SSE code paths are hardcoded for DIM = 2. */
+#define DIM 2
+
+/* Note: The random swapping code is only designed for SIZE=2048 or less. */
+#define SIZE 128
+#define SIZEMASK 0x7f
+#define SIZEBITS 7
+
+#define MAT(x, y, d) mat[(((y)<<SIZEBITS)+(x)) + ((d)<<(SIZEBITS*2))]
+
+#if (DIM == 2) && __SSE4_1__
+#define USE_SSE_CODE
+#endif
+
+/* To speed up the process, only nearby pixels are considered.
+ * For pixels that are further away, the weight is nearly zero anyways. */
+#define WINDOW 10
+
+
+#define WRAP(x) ((x) & SIZEMASK)
+
+/* Fairly rough approximation of the exponential function. */
+inline float approx_exp(float x)
+{
+	x = (1.0f + x * (1.0f / 256.0f));
+	x *= x;
+	x *= x;
+	x *= x;
+	x *= x;
+	x *= x;
+	x *= x;
+	x *= x;
+	x *= x;
+	return x;
+}
+
+/* Decent approximation of the square root function. */
+inline float approx_sqrt(float x)
+{
+#ifdef __SSE__
+	return _mm_cvtss_f32(_mm_mul_ss(_mm_rsqrt_ss(_mm_set_ss(x)), _mm_set_ss(x)));
+#else
+	return sqrtf(x);
+#endif
+}
+
+
+inline float energy_pq(int px, int py, int qx, int qy)
+{
+	if(px == qx && py == qy) return 0.0f;
+	int dx = px-qx;
+	int dy = py-qy;
+	qx = WRAP(qx);
+	qy = WRAP(qy);
+	float dist = -(dx*dx+dy*dy)*(1.0f/4.41f);
+	float d_p = 0.0f;
+	for(int d = 0; d < DIM; d++) {
+		float d_c = MAT(px, py, d) - MAT(qx, qy, d);
+		d_p += d_c*d_c;
+	}
+	if(DIM == 2)
+		d_p = approx_sqrt(d_p);
+	else
+		d_p = powf(d_p, DIM * 0.25f);
+	return approx_exp(dist - d_p);
+}
+
+/* Returns all the energy in that specific pixel, by looping over the window around the pixel. */
+float pixel_energy_scalar(int x, int y)
+{
+	float energy = 0.0f;
+	for(int dy = -WINDOW; dy <= WINDOW; dy++) {
+		for(int dx = -WINDOW; dx <= WINDOW; dx++) {
+			energy += energy_pq(x, y, x+dx, y+dy);
+		}
+	}
+	return energy;
+}
+
+#ifdef USE_SSE_CODE
+inline __m128 approx_exp_sse(__m128 x)
+{
+	x = _mm_add_ps(_mm_set1_ps(1.0f), _mm_mul_ps(x, _mm_set1_ps(1.0f / 256.0f)));
+	x = _mm_mul_ps(x, x);
+	x = _mm_mul_ps(x, x);
+	x = _mm_mul_ps(x, x);
+	x = _mm_mul_ps(x, x);
+	x = _mm_mul_ps(x, x);
+	x = _mm_mul_ps(x, x);
+	x = _mm_mul_ps(x, x);
+	x = _mm_mul_ps(x, x);
+	return x;
+}
+
+inline __m128 approx_sqrt_sse(__m128 x)
+{
+	return _mm_mul_ps(_mm_rsqrt_ps(x), x);
+}
+
+inline __m128 energy_pq_sse(__m128 *center, float *row, __m128 dx4, __m128 dy4)
+{
+	__m128 dist = _mm_mul_ps(_mm_add_ps(_mm_mul_ps(dx4, dx4), _mm_mul_ps(dy4, dy4)), _mm_set1_ps(-1.0f / 4.41f));
+	__m128 d1 = _mm_sub_ps(center[0], _mm_loadu_ps(row)), d2 = _mm_sub_ps(center[1], _mm_loadu_ps(row + SIZE*SIZE));
+	__m128 dist2 = _mm_add_ps(_mm_mul_ps(d1, d1), _mm_mul_ps(d2, d2));
+	return approx_exp_sse(_mm_sub_ps(dist, approx_sqrt_sse(dist2)));
+}
+
+/* Same as above, but processes 4 pixels at a time. */
+float pixel_energy_sse(int x, int y)
+{
+	__m128 energy = _mm_setzero_ps();
+	__m128 center_pixel[2] = {_mm_set1_ps(MAT(x, y, 0)), _mm_set1_ps(MAT(x, y, 1))};
+	for(int dy = -WINDOW; dy <= WINDOW; dy++) {
+		int wy = WRAP(y+dy);
+		__m128 dy4 = _mm_set1_ps(dy);
+		for(int dx = -WINDOW; dx <= WINDOW; dx += 4) {
+			__m128 dx4 = _mm_add_ps(_mm_set1_ps(dx), _mm_set_ps(3.0f, 2.0f, 1.0f, 0.0f));
+			__m128 active = _mm_cmple_ps(dx4, _mm_set1_ps(WINDOW));
+			if(dy == 0) active = _mm_and_ps(active, _mm_cmpneq_ps(dx4, _mm_setzero_ps()));
+			energy = _mm_add_ps(energy, _mm_blendv_ps(_mm_setzero_ps(), energy_pq_sse(center_pixel, &MAT(x+dx, wy, 0), dx4, dy4), active));
+		}
+	}
+	energy = _mm_hadd_ps(energy, energy);
+	return _mm_cvtss_f32(_mm_hadd_ps(energy, energy));
+}
+
+inline float pixel_energy(int x, int y)
+{
+	/* The SSE code doesn't account for wrapping around the x axis. */
+	if(x < WINDOW || (x + WINDOW) >= SIZE)
+		return pixel_energy_scalar(x, y);
+	else
+		return pixel_energy_sse(x, y);
+}
+
+#else
+#define pixel_energy(x, y) pixel_energy_scalar(x, y)
+#endif
+
+int main(int argc, char** argv)
+{
+	if(argc < 4) {
+		fprintf(stderr, "Usage: %s <starting_temp> <num_iterations> <output_name> [initial_matrix.dat]\n", argv[0]);
+		fprintf(stderr, "<starting_temp>: Temperature parameter for the simulated annealing process. Values around 0.01 seem to give the best results.\n");
+		fprintf(stderr, "                 Note that this implementation uses the following temperature profile: <starting_temp> * (1 - progress)^2\n");
+		fprintf(stderr, "<num_iterations>: Number of iterations to run.\n");
+		fprintf(stderr, "<output_name>: Name without file ending of the output files - the tool will save <output_name>.dat and <output_name>.c\n");
+		fprintf(stderr, "[initial_matrix.mat]: Optional existing matrix that will be used to initialize the process - if not given, a random matrix will be used.\n");
+		return -1;
+	}
+	starting_temp = atof(argv[1]);
+	num_iter = atoll(argv[2]);
+
+	mat = new float[SIZE*SIZE*DIM];
+
+	bool matrix_initialized = false;
+	if(argc == 5) {
+		FILE *f = fopen(argv[4], "rb");
+		if(f) {
+			int floats = fread(mat, sizeof(float), SIZE*SIZE*DIM, f);
+			if(floats == SIZE*SIZE*DIM)
+				matrix_initialized = true;
+			fclose(f);
+		}
+	}
+	if(!matrix_initialized) {
+		/* Initialize matrix with random values. */
+		for(int i = 0; i < SIZE*SIZE*DIM; i++)
+			mat[i] = rng() / ((float) 0xffffffff);
+	}
+
+	float total_energy = 0.0f;
+	for(int y = 0; y < SIZE; y++) {
+		for(int x = 0; x < SIZE; x++) {
+			total_energy += pixel_energy(x, y);
+		}
+	}
+	printf("Total Energy: %f\n", total_energy);
+	fflush(stdout);
+
+	float energy = 0.0;
+	for(uint64_t i = 0; i < num_iter; i++) {
+		int32_t randval = rng();
+ 		/* Pick pixel pair to swap. */
+		int sx = randval & SIZEMASK;
+		int sy = (randval >> 12) & SIZEMASK;
+		int ox = WRAP(sx + ((randval >> 24) % 5) - 2);
+		int oy = WRAP(sy + ((randval >> 28) % 5) - 2);
+
+		/* Subtract energy contributed by the two pixels to be swapped. */
+		float d_energy = -pixel_energy(sx, sy) - pixel_energy(ox, oy);
+		/* Swap the pixels. */
+		for(int d = 0; d < DIM; d++) {
+			float temp = MAT(sx, sy, d);
+			MAT(sx, sy, d) = MAT(ox, oy, d);
+			MAT(ox, oy, d) = temp;
+		}
+		/* Add energy contributed by the two pixels that were swapped. */
+		d_energy += pixel_energy(sx, sy) + pixel_energy(ox, oy);
+
+		/* Accept the swap or not? */
+		float i_f = (1.0f - i/((float) num_iter));
+		float temperature = i_f*i_f*starting_temp;
+		if(d_energy >= 0.0 && (rng() / ((float) 0xffffffff)) >= expf(-d_energy / temperature)) {
+			/* Not accepted => Undo swap. */
+			for(int d = 0; d < DIM; d++) {
+				float temp = MAT(sx, sy, d);
+				MAT(sx, sy, d) = MAT(ox, oy, d);
+				MAT(ox, oy, d) = temp;
+			}
+		}
+		else energy += 2.0*d_energy;
+
+		if((i % 1000) == 0) {
+			printf("%f %lu\n", energy, i);
+			fflush(stdout);
+		}
+	}
+
+	/* Calculate final energy */
+	total_energy = 0.0f;
+	for(int y = 0; y < SIZE; y++) {
+		for(int x = 0; x < SIZE; x++) {
+			total_energy += pixel_energy(x, y);
+		}
+	}
+	printf("Total Energy: %f\n", total_energy);
+	fflush(stdout);
+
+	/* Debug output.
+	 * These files can be visualized in Octave/Matlab with "imshow(fftshift(abs(fft2(dlmread("<file>.dat")))) .* 0.01)". */
+#if 0
+	for(int d = 0; d < DIM; d++) {
+		char filename[1024];
+		sprintf(filename, "%s_%d**2_dim%d.dat", argv[3], SIZE, d);
+		FILE* f = fopen(filename, "w");
+		for(int y = 0; y < SIZE; y++) {
+			for(int x = 0; x < SIZE; x++) {
+				fprintf(f, "%f ", MAT(x, y, d));
+			}
+			fprintf(f, "\n");
+		}
+		fclose(f);
+	}
+#endif
+	char filename[1024];
+	sprintf(filename, "%s.mat", ar

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list