Skip to content

Commit

Permalink
Add surface reflectivity to fallback scanner
Browse files Browse the repository at this point in the history
  • Loading branch information
mgschwan committed Apr 8, 2018
1 parent 7d5a95e commit bf21145
Showing 1 changed file with 52 additions and 22 deletions.
74 changes: 52 additions & 22 deletions release/scripts/addons/blensor/scan_interface_pure.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,19 @@

machineEpsilon = np.finfo(float).eps


# Calculate the minimum reflectivty that will cause a laser return
def blensor_calculate_reflectivity_limit(dist,
reflectivity_distance,
reflectivity_limit,
reflectivity_slope):
min_reflectivity = -1.0
if dist >= reflectivity_distance:
min_reflectivity = reflectivity_limit + reflectivity_slope * (dist-reflectivity_distance)

return min_reflectivity


"""Raycast scene with individual rays
Return per hit:
distance,
Expand Down Expand Up @@ -38,6 +51,9 @@ def scan(numberOfRays, max_distance, elementsPerRay, keep_render_setup, do_shadi

# Step 3: Raycast rays
scanner = bpy.context.scene.camera
reflectivity_distance = scanner.ref_dist
reflectivity_limit = scanner.ref_limit
reflectivity_slope = scanner.ref_slope

origin = Vector([0.0,0.0,0.0])
direction = Vector([0.0,0.0,0.0])
Expand All @@ -62,23 +78,41 @@ def scan(numberOfRays, max_distance, elementsPerRay, keep_render_setup, do_shadi

(hit_loc, hit_normal, hit_idx, hit_distance) = scene_bvh.ray_cast(origin,direction,max_distance)

valid_return = False
if hit_loc:
returns_buffer[idx*ELEMENTS_PER_RETURN] = hit_distance
returns_buffer[idx*ELEMENTS_PER_RETURN+1] = hit_loc.x
returns_buffer[idx*ELEMENTS_PER_RETURN+2] = hit_loc.y
returns_buffer[idx*ELEMENTS_PER_RETURN+3] = hit_loc.z

obj = obj_array[hit_idx]
name = obj.name
returns_buffer[idx*ELEMENTS_PER_RETURN+4] = ord(name[0]) + (ord(name[1])<<8) + (ord(name[2])<<16) + (ord(name[3])<<24)

returns_buffer[idx*ELEMENTS_PER_RETURN+5] = 1.0
returns_buffer[idx*ELEMENTS_PER_RETURN+6] = 1.0
returns_buffer[idx*ELEMENTS_PER_RETURN+7] = 1.0

hit_indices[idx] = hit_idx

else:
mat = mat_array[hit_idx]

diffuse_intensity = 1.0
if mat:
diffuse_intensity = mat.diffuse_intensity

#Calculate the required diffuse reflectivity of the material to create a return
ref_limit = blensor_calculate_reflectivity_limit(hit_distance, reflectivity_distance, reflectivity_limit, reflectivity_slope)

if diffuse_intensity > ref_limit:
valid_return = True
if mat:
color = mat.diffuse_color
returns_buffer[idx*ELEMENTS_PER_RETURN+5] = color.r
returns_buffer[idx*ELEMENTS_PER_RETURN+6] = color.g
returns_buffer[idx*ELEMENTS_PER_RETURN+7] = color.b
else:
returns_buffer[idx*ELEMENTS_PER_RETURN+5] = 1.0
returns_buffer[idx*ELEMENTS_PER_RETURN+6] = 1.0
returns_buffer[idx*ELEMENTS_PER_RETURN+7] = 1.0

returns_buffer[idx*ELEMENTS_PER_RETURN] = hit_distance
returns_buffer[idx*ELEMENTS_PER_RETURN+1] = hit_loc.x
returns_buffer[idx*ELEMENTS_PER_RETURN+2] = hit_loc.y
returns_buffer[idx*ELEMENTS_PER_RETURN+3] = hit_loc.z

obj = obj_array[hit_idx]
name = obj.name
returns_buffer[idx*ELEMENTS_PER_RETURN+4] = ord(name[0]) + (ord(name[1])<<8) + (ord(name[2])<<16) + (ord(name[3])<<24)

hit_indices[idx] = hit_idx

if not valid_return:
for r in range(ELEMENTS_PER_RETURN):
returns_buffer[idx*ELEMENTS_PER_RETURN+r] = 0.0

Expand All @@ -87,12 +121,8 @@ def scan(numberOfRays, max_distance, elementsPerRay, keep_render_setup, do_shadi
if do_shading:
for idx,mat_idx in enumerate(hit_indices):
if mat_idx >= 0:
color = mat_array[mat_idx].diffuse_color
returns_buffer[idx*ELEMENTS_PER_RETURN+5] = color.r
returns_buffer[idx*ELEMENTS_PER_RETURN+6] = color.g
returns_buffer[idx*ELEMENTS_PER_RETURN+7] = color.b


#shade hit point
pass


def scene_to_mesh():
Expand Down

0 comments on commit bf21145

Please sign in to comment.