[Bf-blender-cvs] [d555172] openvdb: Wrap volume sampling call in a macro.

Kévin Dietrich noreply at git.blender.org
Fri Jun 5 14:08:00 CEST 2015


Commit: d5551729bf65b57b19ec447adc236fe8fb2013db
Author: Kévin Dietrich
Date:   Tue May 26 03:38:44 2015 +0200
Branches: openvdb
https://developer.blender.org/rBd5551729bf65b57b19ec447adc236fe8fb2013db

Wrap volume sampling call in a macro.

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

M	intern/cycles/kernel/kernel_compat_cpu.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/svm/svm_openvdb.h
M	intern/cycles/render/openvdb.cpp
M	intern/cycles/util/util_openvdb.h

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

diff --git a/intern/cycles/kernel/kernel_compat_cpu.h b/intern/cycles/kernel/kernel_compat_cpu.h
index 6da0021..acbfd67 100644
--- a/intern/cycles/kernel/kernel_compat_cpu.h
+++ b/intern/cycles/kernel/kernel_compat_cpu.h
@@ -417,6 +417,8 @@ typedef texture_image<uchar4> texture_image_uchar4;
 #define kernel_tex_image_interp(tex, x, y) ((tex < MAX_FLOAT_IMAGES) ? kg->texture_float_images[tex].interp(x, y) : kg->texture_byte_images[tex - MAX_FLOAT_IMAGES].interp(x, y))
 #define kernel_tex_image_interp_3d(tex, x, y, z) ((tex < MAX_FLOAT_IMAGES) ? kg->texture_float_images[tex].interp_3d(x, y, z) : kg->texture_byte_images[tex - MAX_FLOAT_IMAGES].interp_3d(x, y, z))
 #define kernel_tex_image_interp_3d_ex(tex, x, y, z, interpolation) ((tex < MAX_FLOAT_IMAGES) ? kg->texture_float_images[tex].interp_3d_ex(x, y, z, interpolation) : kg->texture_byte_images[tex - MAX_FLOAT_IMAGES].interp_3d_ex(x, y, z, interpolation))
+#define kernel_tex_voxel_float(tex, x, y, z, sampling) (kg->float_volumes[tex]->sample(x, y, z, sampling))
+#define kernel_tex_voxel_float3(tex, x, y, z, sampling) (kg->float3_volumes[tex]->sample(x, y, z, sampling))
 
 #define kernel_data (kg->__data)
 
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index d2a37fa..794cc86 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -977,7 +977,8 @@ typedef struct KernelCurves {
 
 typedef struct KernelTables {
 	int beckmann_offset;
-	int pad1, pad2, pad3;
+	int num_volumes;
+	int pad1, pad2;
 } KernelTables;
 
 typedef struct KernelData {
diff --git a/intern/cycles/kernel/svm/svm_openvdb.h b/intern/cycles/kernel/svm/svm_openvdb.h
index c711f6c..8820dae 100644
--- a/intern/cycles/kernel/svm/svm_openvdb.h
+++ b/intern/cycles/kernel/svm/svm_openvdb.h
@@ -34,14 +34,14 @@ ccl_device void svm_node_openvdb(KernelGlobals *kg, ShaderData *sd, float *stack
 	co = transform_point(&tfm, co);
 
 	if(type == NODE_VDB_FLOAT) {
-		float out = kg->float_volumes[slot]->sample(sampling, co);
+		float out = kernel_tex_voxel_float(slot, co.x, co.y, co.z, sampling);
 
 		if(stack_valid(out_offset)) {
 			stack_store_float(stack, out_offset, out);
 		}
 	}
 	else if(type == NODE_VDB_FLOAT3) {
-		float3 out = kg->float3_volumes[slot]->sample(sampling, co);
+		float3 out = kernel_tex_voxel_float3(slot, co.x, co.y, co.z, sampling);
 
 		if(stack_valid(out_offset)) {
 			stack_store_float3(stack, out_offset, out);
diff --git a/intern/cycles/render/openvdb.cpp b/intern/cycles/render/openvdb.cpp
index 1381c6c..618c585 100644
--- a/intern/cycles/render/openvdb.cpp
+++ b/intern/cycles/render/openvdb.cpp
@@ -223,6 +223,8 @@ void VolumeManager::device_update(Device *device, DeviceScene *dscene, Scene *sc
 		return;
 	}
 
+	dscene->data.tables.num_volumes = float_volumes.size() + float3_volumes.size();
+
 	VLOG(1) << "Volume samplers allocate: __float_volume, " << float_volumes.size() * sizeof(float_volume) << " bytes";
 	VLOG(1) << "Volume samplers allocate: __float3_volume, " << float3_volumes.size() * sizeof(float3_volume) << " bytes";
 
diff --git a/intern/cycles/util/util_openvdb.h b/intern/cycles/util/util_openvdb.h
index e24e18b..2bbadfc 100644
--- a/intern/cycles/util/util_openvdb.h
+++ b/intern/cycles/util/util_openvdb.h
@@ -19,7 +19,7 @@ enum {
 class float_volume {
 public:
 	virtual ~float_volume() {}
-	virtual float sample(int sampling, float3 co) = 0;
+	virtual float sample(float x, float y, float z, int sampling) = 0;
 	virtual bool intersect(const Ray *ray, Intersection *isect) = 0;
 	virtual bool march(float *t0, float *t1) = 0;
 };
@@ -27,7 +27,7 @@ public:
 class float3_volume {
 public:
 	virtual ~float3_volume() {}
-	virtual float3 sample(int sampling, float3 co) = 0;
+	virtual float3 sample(float x, float y, float z, int sampling) = 0;
 	virtual bool intersect(const Ray *ray, Intersection *isect) = 0;
 	virtual bool march(float *t0, float *t1) = 0;
 };
@@ -67,7 +67,7 @@ class vdb_float_volume : public float_volume {
 
 	/* Main intersector, its purpose is to initialize the voxels' bounding box
 	 * so the ones for the various threads do not do this, rather they are
-	 * generated from of copy of it */
+	 * generated from a copy of it */
 	isector_t *main_isector;
 
 	bool uniform_voxels;
@@ -117,7 +117,7 @@ public:
 		}
 	}
 
-	ccl_always_inline float sample(int sampling, float3 co)
+	ccl_always_inline float sample(float x, float y, float z, int sampling)
 	{
 		pthread_t thread = pthread_self();
 
@@ -135,7 +135,7 @@ public:
 				sampler = iter->second;
 			}
 
-			return sampler->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
+			return sampler->wsSample(openvdb::Vec3d(x, y, z));
 		}
 		else {
 			box_map::iterator iter = box_samplers.find(thread);
@@ -151,7 +151,7 @@ public:
 				sampler = iter->second;
 			}
 
-			return sampler->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
+			return sampler->wsSample(openvdb::Vec3d(x, y, z));
 		}
 	}
 
@@ -182,7 +182,7 @@ public:
 
 		if(vdb_isect->setWorldRay(vdb_ray)) {
 			// TODO
-//			isect->t = t;
+//			isect->t = vdb_ray.t1(); // (kevin) is this correct?
 //			isect->u = isect->v = 1.0f;
 //			isect->type = ;
 //			isect->shad = shader;
@@ -252,7 +252,7 @@ class vdb_float3_volume : public float3_volume {
 
 	/* Main intersector, its purpose is to initialize the voxels' bounding box
 	 * so the ones for the various threads do not do this, rather they are
-	 * generated from of copy of it. */
+	 * generated from a copy of it. */
 	isector_t *main_isector;
 
 	bool uniform_voxels;
@@ -302,7 +302,7 @@ public:
 		}
 	}
 
-	ccl_always_inline float3 sample(int sampling, float3 co)
+	ccl_always_inline float3 sample(float x, float y, float z, int sampling)
 	{
 		openvdb::Vec3s r;
 		pthread_t thread = pthread_self();
@@ -321,7 +321,7 @@ public:
 				sampler = iter->second;
 			}
 
-			r = sampler->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
+			r = sampler->wsSample(openvdb::Vec3d(x, y, z));
 		}
 		else {
 			box_map::iterator iter = box_samplers.find(thread);
@@ -337,7 +337,7 @@ public:
 				sampler = iter->second;
 			}
 
-			r = sampler->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
+			r = sampler->wsSample(openvdb::Vec3d(x, y, z));
 		}
 
 		return make_float3(r.x(), r.y(), r.z());
@@ -370,7 +370,7 @@ public:
 
 		if(vdb_isect->setWorldRay(vdb_ray)) {
 			// TODO
-//			isect->t = t;
+//			isect->t = vdb_ray.t1(); // (kevin) is this correct?
 //			isect->u = isect->v = 1.0f;
 //			isect->type = ;
 //			isect->shad = shader;




More information about the Bf-blender-cvs mailing list