[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