@@ -77,7 +77,8 @@ void LightPathStream::clear()
7777void LightPathStream::begin_path (
7878 const PixelContext& pixel_context,
7979 const Camera* camera,
80- const Vector3d& camera_vertex_position)
80+ const Vector3d& camera_vertex_position,
81+ const Vector3d& camera_vertex_normal)
8182{
8283 assert (m_events.empty ());
8384 assert (m_hit_reflector_data.empty ());
@@ -90,6 +91,7 @@ void LightPathStream::begin_path(
9091
9192 m_camera = camera;
9293 m_camera_vertex_position = Vector3f (camera_vertex_position);
94+ m_camera_vertex_normal = Vector3f (camera_vertex_normal);
9395 m_pixel_coords = pixel_context.get_pixel_coords ();
9496 m_sample_position = Vector2f (pixel_context.get_sample_position ());
9597}
@@ -107,6 +109,7 @@ void LightPathStream::hit_reflector(const PathVertex& vertex)
107109 HitReflectorData data;
108110 data.m_object_instance = &vertex.m_shading_point ->get_object_instance ();
109111 data.m_vertex_position = Vector3f (vertex.get_point ());
112+ data.m_surface_normal = Vector3f (vertex.get_geometric_normal ());
110113 data.m_path_throughput = vertex.m_throughput .to_rgb (g_std_lighting_conditions);
111114 m_hit_reflector_data.push_back (data);
112115}
@@ -126,6 +129,7 @@ void LightPathStream::hit_emitter(
126129 HitEmitterData data;
127130 data.m_object_instance = &vertex.m_shading_point ->get_object_instance ();
128131 data.m_vertex_position = Vector3f (vertex.get_point ());
132+ data.m_surface_normal = Vector3f (vertex.get_geometric_normal ());
129133 data.m_path_throughput = vertex.m_throughput .to_rgb (g_std_lighting_conditions);
130134 data.m_emitted_radiance = emitted_radiance.to_rgb (g_std_lighting_conditions);
131135 m_hit_emitter_data.push_back (data);
@@ -134,6 +138,7 @@ void LightPathStream::hit_emitter(
134138void LightPathStream::sampled_emitting_shape (
135139 const EmittingShape& shape,
136140 const Vector3d& emission_position,
141+ const Vector3d& emission_normal,
137142 const Spectrum& material_value,
138143 const Spectrum& emitted_radiance)
139144{
@@ -147,6 +152,7 @@ void LightPathStream::sampled_emitting_shape(
147152 shape.get_assembly_instance ()->get_assembly ().object_instances ().get_by_index (
148153 shape.get_object_instance_index ());
149154 data.m_vertex_position = Vector3f (emission_position);
155+ data.m_surface_normal = Vector3f (emission_normal);
150156 data.m_material_value = material_value.to_rgb (g_std_lighting_conditions);
151157 data.m_emitted_radiance = emitted_radiance.to_rgb (g_std_lighting_conditions);
152158 m_sampled_emitter_data.push_back (data);
@@ -155,6 +161,7 @@ void LightPathStream::sampled_emitting_shape(
155161void LightPathStream::sampled_non_physical_light (
156162 const Light& light,
157163 const Vector3d& emission_position,
164+ const Vector3d& emission_normal,
158165 const Spectrum& material_value,
159166 const Spectrum& emitted_radiance)
160167{
@@ -166,6 +173,7 @@ void LightPathStream::sampled_non_physical_light(
166173 SampledEmitterData data;
167174 data.m_entity = &light;
168175 data.m_vertex_position = Vector3f (emission_position);
176+ data.m_surface_normal = Vector3f (emission_normal);
169177 data.m_material_value = material_value.to_rgb (g_std_lighting_conditions);
170178 data.m_emitted_radiance = emitted_radiance.to_rgb (g_std_lighting_conditions);
171179 m_sampled_emitter_data.push_back (data);
@@ -244,6 +252,7 @@ void LightPathStream::create_path_from_hit_emitter(const size_t emitter_event_in
244252 StoredPathVertex emitter_vertex;
245253 emitter_vertex.m_entity = hit_emitter_data.m_object_instance ;
246254 emitter_vertex.m_position = hit_emitter_data.m_vertex_position ;
255+ emitter_vertex.m_surface_normal = hit_emitter_data.m_surface_normal ;
247256 emitter_vertex.m_radiance = hit_emitter_data.m_emitted_radiance ;
248257 m_vertices.push_back (emitter_vertex);
249258
@@ -264,6 +273,7 @@ void LightPathStream::create_path_from_hit_emitter(const size_t emitter_event_in
264273 StoredPathVertex reflector_vertex;
265274 reflector_vertex.m_entity = event_data.m_object_instance ;
266275 reflector_vertex.m_position = event_data.m_vertex_position ;
276+ reflector_vertex.m_surface_normal = event_data.m_surface_normal ;
267277 reflector_vertex.m_radiance = current_radiance;
268278 m_vertices.push_back (reflector_vertex);
269279
@@ -288,6 +298,7 @@ void LightPathStream::create_path_from_hit_emitter(const size_t emitter_event_in
288298 StoredPathVertex camera_vertex;
289299 camera_vertex.m_entity = m_camera;
290300 camera_vertex.m_position = m_camera_vertex_position;
301+ camera_vertex.m_surface_normal = m_camera_vertex_normal;
291302 camera_vertex.m_radiance = current_radiance;
292303 m_vertices.push_back (camera_vertex);
293304
@@ -319,6 +330,7 @@ void LightPathStream::create_path_from_sampled_emitter(const size_t emitter_even
319330 StoredPathVertex emitter_vertex;
320331 emitter_vertex.m_entity = sampled_emitter_data.m_entity ;
321332 emitter_vertex.m_position = sampled_emitter_data.m_vertex_position ;
333+ emitter_vertex.m_surface_normal = sampled_emitter_data.m_surface_normal ;
322334 emitter_vertex.m_radiance = sampled_emitter_data.m_emitted_radiance ;
323335 m_vertices.push_back (emitter_vertex);
324336
@@ -339,6 +351,7 @@ void LightPathStream::create_path_from_sampled_emitter(const size_t emitter_even
339351 StoredPathVertex reflector_vertex;
340352 reflector_vertex.m_entity = event_data.m_object_instance ;
341353 reflector_vertex.m_position = event_data.m_vertex_position ;
354+ reflector_vertex.m_surface_normal = event_data.m_surface_normal ;
342355 reflector_vertex.m_radiance = current_radiance;
343356 m_vertices.push_back (reflector_vertex);
344357
@@ -363,6 +376,7 @@ void LightPathStream::create_path_from_sampled_emitter(const size_t emitter_even
363376 StoredPathVertex camera_vertex;
364377 camera_vertex.m_entity = m_camera;
365378 camera_vertex.m_position = m_camera_vertex_position;
379+ camera_vertex.m_surface_normal = m_camera_vertex_normal;
366380 camera_vertex.m_radiance = current_radiance;
367381 m_vertices.push_back (camera_vertex);
368382
@@ -394,6 +408,7 @@ void LightPathStream::create_path_from_sampled_environment(const size_t env_even
394408 StoredPathVertex emitter_vertex;
395409 emitter_vertex.m_entity = sampled_env_data.m_environment_edf ;
396410 emitter_vertex.m_position = last_reflector_data.m_vertex_position + m_scene_diameter * sampled_env_data.m_emission_direction ;
411+ emitter_vertex.m_surface_normal = -sampled_env_data.m_emission_direction ;
397412 emitter_vertex.m_radiance = sampled_env_data.m_emitted_radiance ;
398413 m_vertices.push_back (emitter_vertex);
399414
@@ -414,6 +429,7 @@ void LightPathStream::create_path_from_sampled_environment(const size_t env_even
414429 StoredPathVertex reflector_vertex;
415430 reflector_vertex.m_entity = event_data.m_object_instance ;
416431 reflector_vertex.m_position = event_data.m_vertex_position ;
432+ reflector_vertex.m_surface_normal = event_data.m_surface_normal ;
417433 reflector_vertex.m_radiance = current_radiance;
418434 m_vertices.push_back (reflector_vertex);
419435
@@ -438,6 +454,7 @@ void LightPathStream::create_path_from_sampled_environment(const size_t env_even
438454 StoredPathVertex camera_vertex;
439455 camera_vertex.m_entity = m_camera;
440456 camera_vertex.m_position = m_camera_vertex_position;
457+ camera_vertex.m_surface_normal = m_camera_vertex_normal;
441458 camera_vertex.m_radiance = current_radiance;
442459 m_vertices.push_back (camera_vertex);
443460
0 commit comments