Class: Rubytracer::PointLight

Inherits:
Object
  • Object
show all
Defined in:
lib/rubytracer/lights/point.rb

Instance Method Summary collapse

Constructor Details

#initialize(value, point) ⇒ PointLight

Returns a new instance of PointLight.



5
6
7
8
# File 'lib/rubytracer/lights/point.rb', line 5

def initialize(value, point)
  @value = value
  @point = point
end

Instance Method Details

#check_shadow(point, direction, distance, scene) ⇒ Object



10
11
12
13
14
15
# File 'lib/rubytracer/lights/point.rb', line 10

def check_shadow(point, direction, distance, scene)
  ray = Geom3d::Ray.new(point + direction * 0.00001, direction)
  obj, alpha = scene.intersect(ray)
  pos = ray.pos(alpha)
  alpha < distance
end

#diffuse(normal, point, scene) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/rubytracer/lights/point.rb', line 34

def diffuse(normal, point, scene)
  vector = @point - point
  dir = vector.unit
  dis = vector.length

  if check_shadow(point, dir, dis, scene)
    Colour.new(0,0,0)
  else
    @value * distance_loss(dis) * [0, dir.dot(normal)].max
  end
end

#distance_loss(distance) ⇒ Object



17
18
19
# File 'lib/rubytracer/lights/point.rb', line 17

def distance_loss(distance)
  ([0, 8 - distance].max / 8) ** 3
end

#specular(normal, view_vector, point, scene) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/rubytracer/lights/point.rb', line 21

def specular(normal, view_vector, point, scene)
  vector = @point - point
  dir = vector.unit
  dis = vector.length

  if check_shadow(point, dir, dis, scene)
    Colour.new(0,0,0)
  else
    d = (2 * view_vector.dot(normal) * normal - view_vector).unit
    @value * distance_loss(dis) * [0, d.dot(dir)].max
  end
end