[Bf-blender-cvs] [807e7fd] openvdb: Try to set intersection information correctly.

Kévin Dietrich noreply at git.blender.org
Sun Nov 13 21:44:13 CET 2016


Commit: 807e7fdc1107e7edd06c2daac078c279470d7c66
Author: Kévin Dietrich
Date:   Sun Feb 28 08:08:15 2016 +0100
Branches: openvdb
https://developer.blender.org/rB807e7fdc1107e7edd06c2daac078c279470d7c66

Try to set intersection information correctly.

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

M	intern/cycles/kernel/geom/geom_bvh_volume.h
M	intern/cycles/kernel/geom/geom_bvh_volume_all.h
M	intern/cycles/kernel/geom/geom_qbvh_volume.h
M	intern/cycles/kernel/geom/geom_qbvh_volume_all.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/kernel_volume.h
M	intern/cycles/util/util_volume.h

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

diff --git a/intern/cycles/kernel/geom/geom_bvh_volume.h b/intern/cycles/kernel/geom/geom_bvh_volume.h
index 3344098..20dea01 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume.h
@@ -93,9 +93,14 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
 	int num_volumes = kernel_data.tables.num_volumes;
 
 	for(int i = 0; i < num_volumes; i++) {
-		if(kg->float_volumes[i]->intersect(ray, isect)) {
+		float t;
+
+		if(kg->float_volumes[i]->intersect(ray, &t)) {
 			isect->type = PRIMITIVE_VOLUME;
-			kernel_data.tables.density_index = i;
+			isect->prim = i;
+			isect->t = t;
+			isect->u = 1.0f;
+			isect->v = 1.0f;
 			return true;
 		}
 	}
diff --git a/intern/cycles/kernel/geom/geom_bvh_volume_all.h b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
index 65855f5..5d8379c 100644
--- a/intern/cycles/kernel/geom/geom_bvh_volume_all.h
+++ b/intern/cycles/kernel/geom/geom_bvh_volume_all.h
@@ -94,9 +94,14 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
 	int num_volumes = kernel_data.tables.num_volumes;
 
 	for(int i = 0; i < num_volumes; i++) {
-		if(kg->float_volumes[i]->intersect(ray, isect_array)) {
+		float t;
+
+		if(kg->float_volumes[i]->intersect(ray, &t)) {
 			isect_array->type = PRIMITIVE_VOLUME;
-			kernel_data.tables.density_index = i;
+			isect_array->prim = i;
+			isect_array->t = t;
+			isect_array->u = 1.0f;
+			isect_array->v = 1.0f;
 			isect_array++;
 			num_hits++;
 
diff --git a/intern/cycles/kernel/geom/geom_qbvh_volume.h b/intern/cycles/kernel/geom/geom_qbvh_volume.h
index 06926d4..171b326 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_volume.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_volume.h
@@ -95,9 +95,14 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 	int num_volumes = kernel_data.tables.num_volumes;
 
 	for(int i = 0; i < num_volumes; i++) {
-		if(kg->float_volumes[i]->intersect(ray, isect)) {
+		float t;
+
+		if(kg->float_volumes[i]->intersect(ray, &t)) {
 			isect->type = PRIMITIVE_VOLUME;
-			kernel_data.tables.density_index = i;
+			isect->prim = i;
+			isect->t = t;
+			isect->u = 1.0f;
+			isect->v = 1.0f;
 			return true;
 		}
 	}
diff --git a/intern/cycles/kernel/geom/geom_qbvh_volume_all.h b/intern/cycles/kernel/geom/geom_qbvh_volume_all.h
index 4c03786..6daf974 100644
--- a/intern/cycles/kernel/geom/geom_qbvh_volume_all.h
+++ b/intern/cycles/kernel/geom/geom_qbvh_volume_all.h
@@ -99,9 +99,14 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
 	int num_volumes = kernel_data.tables.num_volumes;
 
 	for(int i = 0; i < num_volumes; i++) {
-		if(kg->float_volumes[i]->intersect(ray, isect_array)) {
+		float t;
+
+		if(kg->float_volumes[i]->intersect(ray, &t)) {
 			isect_array->type = PRIMITIVE_VOLUME;
-			kernel_data.tables.density_index = i;
+			isect_array->prim = i;
+			isect_array->t = t;
+			isect_array->u = 1.0f;
+			isect_array->v = 1.0f;
 			isect_array++;
 			num_hits++;
 
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index 93ce228..a575dba 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -66,7 +66,13 @@ ccl_device_noinline void shader_setup_from_ray(KernelGlobals *kg,
 	ccl_fetch(sd, time) = ray->time;
 #endif
 
-	ccl_fetch(sd, prim) = kernel_tex_fetch(__prim_index, isect->prim);
+	if(ccl_fetch(sd, type) & PRIMITIVE_VOLUME) {
+		ccl_fetch(sd, prim) = isect->prim;
+	}
+	else {
+		ccl_fetch(sd, prim) = kernel_tex_fetch(__prim_index, isect->prim);
+	}
+
 	ccl_fetch(sd, ray_length) = isect->t;
 
 #ifdef __UV__
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 67db8a9..30fce06 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -828,6 +828,7 @@ typedef ccl_addr_space struct ShaderData {
 typedef struct VolumeStack {
 	int object;
 	int shader;
+	int volume;
 } VolumeStack;
 #endif
 
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index 054ccf6..ab9328a 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -1296,6 +1296,7 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
 			if(is_enclosed == false) {
 				stack[stack_index].object = sd.object;
 				stack[stack_index].shader = sd.shader;
+				stack[stack_index].volume = sd.prim;
 				++stack_index;
 			}
 		}
diff --git a/intern/cycles/util/util_volume.h b/intern/cycles/util/util_volume.h
index 5831324..54701c5 100644
--- a/intern/cycles/util/util_volume.h
+++ b/intern/cycles/util/util_volume.h
@@ -35,7 +35,7 @@ class float_volume {
 public:
 	virtual ~float_volume() {}
 	virtual float sample(float x, float y, float z, int sampling) = 0;
-	virtual bool intersect(const Ray *ray, Intersection *isect) = 0;
+	virtual bool intersect(const Ray *ray, float *isect_t) = 0;
 	virtual bool march(float *t0, float *t1) = 0;
 	virtual bool has_uniform_voxels() = 0;
 };
@@ -44,7 +44,7 @@ class float3_volume {
 public:
 	virtual ~float3_volume() {}
 	virtual float3 sample(float x, float y, float z, int sampling) = 0;
-	virtual bool intersect(const Ray *ray, Intersection *isect) = 0;
+	virtual bool intersect(const Ray *ray, float *isect_t) = 0;
 	virtual bool march(float *t0, float *t1) = 0;
 	virtual bool has_uniform_voxels() = 0;
 };
@@ -156,7 +156,7 @@ public:
 		}
 	}
 
-	ccl_always_inline bool intersect(const Ray *ray, Intersection *isect)
+	ccl_always_inline bool intersect(const Ray *ray, float *isect_t)
 	{
 		pthread_t thread = pthread_self();
 		isect_map::iterator iter = isectors.find(thread);
@@ -170,15 +170,8 @@ public:
 		vdb_ray_t vdb_ray(P, D, 1e-5f, ray->t);
 
 		if(vdb_isect->setWorldRay(vdb_ray)) {
-			// TODO
-//			isect->t = (float)vdb_ray.t1(); // (kevin) is this correct?
-//			isect->u = isect->v = 1.0f;
-//			isect->type = ;
-//			isect->shad = shader;
-//			isect->norm = ;
-//			isect->prim = 0;
-//			isect->object = 0;
-
+			// TODO(kevin): is this correct?
+			*isect_t = static_cast<float>(vdb_ray.t1());
 			return true;
 		}
 
@@ -307,7 +300,7 @@ public:
 			return sample_ex(x, y, z, sampling);
 	}
 
-	ccl_always_inline bool intersect(const Ray *ray, Intersection */*isect*/)
+	ccl_always_inline bool intersect(const Ray *ray, float *isect_t)
 	{
 		pthread_t thread = pthread_self();
 		isect_map::iterator iter = isectors.find(thread);
@@ -321,15 +314,8 @@ public:
 		vdb_ray_t vdb_ray(P, D, 1e-5f, ray->t);
 
 		if(vdb_isect->setWorldRay(vdb_ray)) {
-			// TODO
-//			isect->t = vdb_ray.t1(); // (kevin) is this correct?
-//			isect->u = isect->v = 1.0f;
-//			isect->type = ;
-//			isect->shad = shader;
-//			isect->norm = ;
-//			isect->prim = 0;
-//			isect->object = 0;
-
+			// TODO(kevin): is this correct?
+			*isect_t = static_cast<float>(vdb_ray.t1());
 			return true;
 		}




More information about the Bf-blender-cvs mailing list