Sha256: 5eb39f0215361a7dddd244e4125b2b461b6c8ed302d5154f518e28dbc88d2a9d

Contents?: true

Size: 1.07 KB

Versions: 1

Compression:

Stored size: 1.07 KB

Contents

require 'geom3d'

module Rubytracer
  class PointLight
    def initialize(value, point)
      @value = value
      @point = point
    end

    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

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

    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

    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
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rubytracer-0.1.0 lib/rubytracer/lights/point.rb