class IMICFPS class Light DIRECTIONAL = 0 POINT = 1 attr_reader :light_id attr_accessor :type, :ambient, :diffuse, :specular, :position, :intensity def initialize( id:, type: Light::POINT, ambient: Vector.new(0.5, 0.5, 0.5, 1), diffuse: Vector.new(1, 0.5, 0, 1), specular: Vector.new(0.2, 0.2, 0.2, 1), position: Vector.new(0, 0, 0, 0), intensity: 1 ) @light_id = id @type = type @ambient = ambient @diffuse = diffuse @specular = specular @position = position @intensity = intensity end def draw glLightfv(@light_id, GL_AMBIENT, convert(@ambient).pack("f*")) glLightfv(@light_id, GL_DIFFUSE, convert(@diffuse, true).pack("f*")) glLightfv(@light_id, GL_SPECULAR, convert(@specular, true).pack("f*")) glLightfv(@light_id, GL_POSITION, convert(@position).pack("f*")) glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1) glEnable(GL_LIGHTING) glEnable(@light_id) end def convert(struct, apply_intensity = false) if apply_intensity return struct.to_a.compact.map{ |i| i * @intensity } else return struct.to_a.compact end end end end