[Bf-blender-cvs] [c8b831d] cycles_point_density: Cycles: Point density texture experiment

Sergey Sharybin noreply at git.blender.org
Tue Mar 31 16:57:33 CEST 2015


Commit: c8b831d742b064c44f7a4c1a208b57dae06fa0a9
Author: Sergey Sharybin
Date:   Sat Mar 28 23:50:36 2015 +0500
Branches: cycles_point_density
https://developer.blender.org/rBc8b831d742b064c44f7a4c1a208b57dae06fa0a9

Cycles: Point density texture experiment

This commit implements point density texture for Cycles shading nodes.

It's done via creating voxel texture at shader compilation time, Not
totally memory efficient, but avoids adding sampling code to kernel
(which keeps render time as low as possible), In the future this will
be compensated by using OpenVDB for more efficient storage of sparse
volume data.

Sampling of the voxel texture is happening at blender side and the
same code is used as for Blender Internal's renderer.

This texture is controlled by only object, particle system and radius.
Linear falloff is used and there's no turbulence. This is because
falloff is expected to happen using Curve Mapping node. Turbulence
will be done as a distortion on the input coordinate. It's already
possible to fake it using nose textures and in the future we can add
more proper turbulence distortion node, which then could also be used
for 2D texture mapping.

OSL is not currently supported. There's no actual stoppers for support
it, but so far it's not really a priority at this point.

Reviewers: campbellbarton, juicyfruit, brecht

Subscribers: campbellbarton, dingto, eyecandy

Differential Revision: https://developer.blender.org/D1208

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

M	intern/cycles/blender/CMakeLists.txt
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_shader.cpp
A	intern/cycles/blender/blender_texture.cpp
A	intern/cycles/blender/blender_texture.h
M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/svm/svm.h
M	intern/cycles/kernel/svm/svm_types.h
A	intern/cycles/kernel/svm/svm_voxel.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/BKE_texture.h
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenkernel/intern/particle_system.c
M	source/blender/blenkernel/intern/texture.c
M	source/blender/editors/space_node/drawnode.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_shader.h
M	source/blender/nodes/NOD_static_types.h
A	source/blender/nodes/shader/nodes/node_shader_tex_pointdensity.c
M	source/blender/render/extern/include/RE_render_ext.h
M	source/blender/render/intern/source/pointdensity.c

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

diff --git a/intern/cycles/blender/CMakeLists.txt b/intern/cycles/blender/CMakeLists.txt
index fff9ed2..c6a2b91 100644
--- a/intern/cycles/blender/CMakeLists.txt
+++ b/intern/cycles/blender/CMakeLists.txt
@@ -31,10 +31,12 @@ set(SRC
 	blender_session.cpp
 	blender_shader.cpp
 	blender_sync.cpp
+	blender_texture.cpp
 
 	CCL_api.h
 	blender_sync.h
 	blender_session.h
+	blender_texture.h
 	blender_util.h
 )
 
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 956d8b9..9b97429 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -1126,7 +1126,8 @@ class CyclesTexture_PT_mapping(CyclesButtonsPanel, Panel):
     @classmethod
     def poll(cls, context):
         node = context.texture_node
-        return node and CyclesButtonsPanel.poll(context)
+        # TODO(sergey): perform a faster/nicer check?
+        return node and hasattr(node, 'texture_mapping') and CyclesButtonsPanel.poll(context)
 
     def draw(self, context):
         layout = self.layout
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 4f428bb..e57ffa4 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -981,6 +981,18 @@ void BlenderSession::builtin_image_info(const string &builtin_name, void *builti
 
 		is_float = true;
 	}
+	else {
+		/* TODO(sergey): Check we're indeed in shader node tree. */
+		PointerRNA ptr;
+		RNA_pointer_create(NULL, &RNA_Node, builtin_data, &ptr);
+		BL::Node b_node(ptr);
+		if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
+			BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
+			channels = 1;
+			width = height = depth = b_point_density_node.resolution();
+			is_float = true;
+		}
+	}
 }
 
 bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels)
@@ -1120,6 +1132,17 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
 
 		fprintf(stderr, "Cycles error: unexpected smoke volume resolution, skipping\n");
 	}
+	else {
+		/* TODO(sergey): Check we're indeed in shader node tree. */
+		PointerRNA ptr;
+		RNA_pointer_create(NULL, &RNA_Node, builtin_data, &ptr);
+		BL::Node b_node(ptr);
+		if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
+			BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
+			int length;
+			b_point_density_node.calc_point_density(b_scene, &length, &pixels);
+		}
+	}
 
 	return false;
 }
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index dda0661..ab20999 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -22,6 +22,7 @@
 #include "scene.h"
 #include "shader.h"
 
+#include "blender_texture.h"
 #include "blender_sync.h"
 #include "blender_util.h"
 
@@ -728,6 +729,32 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
 		uvm->from_dupli = b_uvmap_node.from_dupli();
 		node = uvm;
 	}
+	else if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
+		BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
+		PointDensityTextureNode *point_density = new PointDensityTextureNode();
+		point_density->filename = b_point_density_node.name();;
+		point_density->space =
+		        PointDensityTextureNode::space_enum[(int)b_point_density_node.space()];
+		point_density->interpolation =
+		        (InterpolationType)b_point_density_node.interpolation();
+		point_density->builtin_data = b_point_density_node.ptr.data;
+
+		/* Transformation form world space to texture space. */
+		float3 loc, size;
+		BL::Object b_ob(b_point_density_node.object());
+		point_density_texture_space(b_point_density_node, loc, size);
+		point_density->tfm =
+		        transform_translate(-loc) * transform_scale(size) *
+		        transform_inverse(get_transform(b_ob.matrix_world()));
+
+		/* TODO(sergey): Use more proper update flag. */
+		if(true) {
+			scene->image_manager->tag_reload_image(point_density->filename,
+			                                       point_density->builtin_data,
+			                                       point_density->interpolation);
+		}
+		node = point_density;
+	}
 
 	if(node)
 		graph->add(node);
diff --git a/intern/cycles/blender/blender_texture.cpp b/intern/cycles/blender/blender_texture.cpp
new file mode 100644
index 0000000..0598d26
--- /dev/null
+++ b/intern/cycles/blender/blender_texture.cpp
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2011-2015 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.
+ */
+
+#include "blender_texture.h"
+
+CCL_NAMESPACE_BEGIN
+
+namespace {
+
+/* Point density helpers. */
+
+static void density_texture_space_invert(float3& loc,
+                                         float3& size)
+{
+	if(size.x != 0.0f) size.x = 0.5f/size.x;
+	if(size.y != 0.0f) size.y = 0.5f/size.y;
+	if(size.z != 0.0f) size.z = 0.5f/size.z;
+
+	loc = loc*size - make_float3(0.5f, 0.5f, 0.5f);
+}
+
+static void density_object_texture_space(BL::Object b_ob,
+                                         float radius,
+                                         float3& loc,
+                                         float3& size)
+{
+	if(b_ob.type() == BL::Object::type_MESH) {
+		BL::Mesh b_mesh(b_ob.data());
+		loc = get_float3(b_mesh.texspace_location());
+		size = get_float3(b_mesh.texspace_size());
+	}
+	else {
+		/* TODO(sergey): Not supported currently. */
+	}
+	/* Adjust texture space to include density points on the boundaries. */
+	size = size + make_float3(radius, radius, radius);
+	density_texture_space_invert(loc, size);
+}
+
+static void density_particle_system_texture_space(
+        BL::ParticleSystem b_particle_system,
+        float radius,
+        float3& loc,
+        float3& size)
+{
+	if(b_particle_system.settings().type() == BL::ParticleSettings::type_HAIR) {
+		/* TODO(sergey): Not supported currently. */
+		return;
+	}
+	float3 min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX),
+	       max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
+	float3 particle_size = make_float3(radius, radius, radius);
+	for(int i = 0; i < b_particle_system.particles.length(); ++i) {
+		BL::Particle particle = b_particle_system.particles[i];
+		float3 location = get_float3(particle.location());
+		min = ccl::min(min, location - particle_size);
+		max = ccl::max(max, location + particle_size);
+	}
+	/* Calculate texture space from the particle bounds.  */
+	loc = (min + max) * 0.5f;
+	size = (max - min) * 0.5f;
+	density_texture_space_invert(loc, size);
+}
+
+}  /* namespace */
+
+void point_density_texture_space(BL::ShaderNodeTexPointDensity b_point_density_node,
+                                 float3& loc,
+                                 float3& size)
+{
+	/* Fallback values. */
+	loc = make_float3(0.0f, 0.0f, 0.0f);
+	size = make_float3(0.0f, 0.0f, 0.0f);
+	BL::Object b_ob(b_point_density_node.object());
+	if(!b_ob) {
+		return;
+	}
+	if(b_point_density_node.point_source() ==
+	   BL::ShaderNodeTexPointDensity::point_source_PARTICLE_SYSTEM)
+	{
+		BL::ParticleSystem b_particle_system(
+		        b_point_density_node.particle_system());
+		if(b_particle_system) {
+			density_particle_system_texture_space(b_particle_system,
+			                                      b_point_density_node.radius(),
+			                                      loc,
+			                                      size);
+		}
+	}
+	else {
+		density_object_texture_space(b_ob,
+		                             b_point_density_node.radius(),
+		                             loc,
+		                             size);
+	}
+}
+
+CCL_NAMESPACE_END
diff --git a/intern/cycles/blender/blender_texture.h b/intern/cycles/blender/blender_texture.h
new file mode 100644
index 0000000..74fbca0
--- /dev/null
+++ b/intern/cycles/blender/blender_texture.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2011-2015 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.
+ */
+
+#ifndef __BLENDER_TEXTURE_H__
+#define __BLENDER_TEXTURE_H__
+
+#include <stdlib.h>
+#include "blender_sync.h"
+
+CCL_NAMESPACE_BEGIN
+
+void point_density_texture_space(BL::ShaderNodeTexPointDensity b_point_density_node,
+                                 float3& loc,
+                                 float3& size);
+
+CCL_NAMESPACE_END
+
+#endif  /* __BLENDER_TEXTURE_H__ */
diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt
index fd69023..3593c96 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -108,6 +108,7 @@ set(SRC_SVM_HEADERS
 	svm/svm_value.h
 	svm/svm_vector_transform.h
 	svm/svm_voronoi.h
+	svm/svm_voxel.h
 	svm/svm_wave.h
 )
 
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index dd9173d..a67b09d 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -178,6 +178,7 @@ CCL_NAMESPACE_END
 #include "svm_checker.h"
 #include "svm_brick.h"
 #include "svm_vector_transform.h"
+#include "svm_voxel.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -425,7 +426,10 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, Shade
 				break;
 			case NODE_NORMAL_MAP:


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list