pbrt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ module PBRT
2
+ class Parameter
3
+ def initialize(type, name)
4
+ @type = type
5
+ @name = name
6
+ end
7
+
8
+ def to_s
9
+ %("#@type #@name")
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,45 @@
1
+ module PBRT
2
+ class ParameterList
3
+ def self.from(params, type_signature)
4
+ allow_shapes_to_override_materials!(params, type_signature)
5
+
6
+ Signature.new(type_signature).check(params)
7
+
8
+ pairs = params.map do |name, value|
9
+ type = type_signature[name]
10
+
11
+ type, value = Texture.unpack(type, value)
12
+
13
+ if type == :spectrum || value.is_a?(Spectrum)
14
+ type, value = Spectrum.unpack(value)
15
+ end
16
+
17
+ [Parameter.new(type, name), Values.new(value)]
18
+ end
19
+
20
+ new(pairs.to_h)
21
+ end
22
+
23
+ def initialize(name_value_pairs)
24
+ @name_value_pairs = name_value_pairs
25
+ end
26
+
27
+ def to_s
28
+ @name_value_pairs.map do |parameter, values|
29
+ [parameter.to_s, "[#{values}]"].join(" ")
30
+ end.join(" ")
31
+ end
32
+
33
+ def self.allow_shapes_to_override_materials!(params, type_signature)
34
+ return unless type_signature[:allow_material_overrides]
35
+ type_signature.delete(:allow_material_overrides)
36
+
37
+ surplus = params.keys - type_signature.keys
38
+
39
+ surplus.each do |key|
40
+ type = Builder::Material::ALL_PARAMS[key]
41
+ type_signature[key] = type if type
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,39 @@
1
+ module PBRT
2
+ class Signature
3
+ TYPES = %i(
4
+ integer float point2 vector2 point3
5
+ vector3 normal3 spectrum bool string
6
+ texture float_texture spectrum_texture
7
+ )
8
+
9
+ def initialize(names_and_types)
10
+ @names_and_types = names_and_types
11
+
12
+ check_for_known_types
13
+ end
14
+
15
+ def check(params)
16
+ check_for_surplus(params)
17
+ end
18
+
19
+ private
20
+
21
+ def check_for_known_types
22
+ unknown = @names_and_types.values - TYPES
23
+
24
+ if unknown.any?
25
+ raise ArgumentError, "unknown types: #{unknown.join(", ")}"
26
+ end
27
+ end
28
+
29
+ def check_for_surplus(params)
30
+ surplus = params.keys - @names_and_types.keys
31
+
32
+ if surplus.size == 1
33
+ raise ArgumentError, "(unknown keyword: #{surplus.first})"
34
+ elsif surplus.size > 1
35
+ raise ArgumentError, "(unknown keywords: #{surplus.join(", ")})"
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,29 @@
1
+ module PBRT
2
+ class Spectrum
3
+ attr_reader :type, :args
4
+
5
+ def initialize(type, *args)
6
+ @type = type
7
+ @args = args
8
+ end
9
+
10
+ def self.unpack(value)
11
+ check_value_is_a_spectrum(value)
12
+
13
+ [value.type, value.args]
14
+ end
15
+
16
+ def self.check_value_is_a_spectrum(value)
17
+ return if value.is_a?(self)
18
+
19
+ message = "Please specify the spectrum representation for #{value.inspect}.\n"
20
+ message += "You can do this by wrapping the value: rgb(#{value.inspect})\n"
21
+ message += "Valid representations are: rgb, xyz, sampled and blackbody"
22
+
23
+ raise AmbiguousSpectrumError, message
24
+ end
25
+ end
26
+
27
+ class AmbiguousSpectrumError < StandardError
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ module PBRT
2
+ class Statement
3
+ def self.fixed_size(*args)
4
+ FixedSize.new(*args)
5
+ end
6
+
7
+ def self.variadic(*args)
8
+ Variadic.new(*args)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ module PBRT
2
+ class Statement
3
+ class FixedSize
4
+ def initialize(directive, expected, *args)
5
+ @directive = directive
6
+ @expected = expected
7
+ @values = Values.new(*args)
8
+
9
+ check_size
10
+ end
11
+
12
+ def to_s
13
+ @values.size.zero? ? @directive : "#@directive #@values"
14
+ end
15
+
16
+ private
17
+
18
+ def check_size
19
+ return if @expected == @values.size
20
+
21
+ message = "wrong number of arguments to #@directive "
22
+ message += "(given #{@values.size}, expected #@expected)"
23
+
24
+ raise ArgumentError, message
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ module PBRT
2
+ class Statement
3
+ class Variadic
4
+ def initialize(directive, kind, parameter_list)
5
+ @directive = directive
6
+ @kind = kind
7
+ @parameter_list = parameter_list
8
+ end
9
+
10
+ def to_s
11
+ %(#@directive "#@kind" #@parameter_list).strip
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,63 @@
1
+ # This class does double duty as both a means of wrapping parameter
2
+ # values to disambiguate them from floats/spectrums, but it's also
3
+ # the interface for the builder to write Texture directives.
4
+
5
+ module PBRT
6
+ class Texture
7
+ attr_reader :args
8
+
9
+ def initialize(builder, *args)
10
+ @builder = builder
11
+ @args = args
12
+ end
13
+
14
+ # If these three methods are called, it means the user is trying
15
+ # to write a Texture directive, so delegate to that builder.
16
+ def spectrum
17
+ PBRT::Builder::Texture.new(@builder, args.first, "spectrum")
18
+ end
19
+
20
+ def color
21
+ PBRT::Builder::Texture.new(@builder, args.first, "color")
22
+ end
23
+
24
+ def float
25
+ PBRT::Builder::Texture.new(@builder, args.first, "float")
26
+ end
27
+
28
+ def self.unpack(type, value)
29
+ return [type, value] unless type.to_s.include?("texture")
30
+ return [:texture, value.args] if value.is_a?(self)
31
+
32
+ if type == :float_texture
33
+ return string?(value) ? [:texture, value] : [:float, value]
34
+ end
35
+
36
+ if type == :spectrum_texture && !string?(value)
37
+ return [:spectrum, value]
38
+ end
39
+
40
+ if type == :texture && !string?(value)
41
+ return [:float, value]
42
+ end
43
+
44
+ raise_ambiguous_error(value)
45
+ end
46
+
47
+ def self.raise_ambiguous_error(value)
48
+ message = "Please specify whether #{value.inspect} is a spectrum or texture.\n"
49
+ message += "If it's a texture, wrap it with: texture(#{value.inspect})\n"
50
+ message += "If it's a spectrum, wrap it with its representation: sampled(#{value.inspect})\n"
51
+ message += "Valid representations are: rgb, xyz, sampled and blackbody"
52
+
53
+ raise AmbiguousArgumentError, message
54
+ end
55
+
56
+ def self.string?(*value)
57
+ value.flatten.first.is_a?(String)
58
+ end
59
+ end
60
+
61
+ class AmbiguousArgumentError < StandardError
62
+ end
63
+ end
@@ -0,0 +1,25 @@
1
+ module PBRT
2
+ class Values
3
+ def initialize(*inner)
4
+ @inner = inner.flatten
5
+ end
6
+
7
+ def to_s
8
+ @inner.map { |v| format(v) }.join(" ")
9
+ end
10
+
11
+ def size
12
+ @inner.size
13
+ end
14
+
15
+ private
16
+
17
+ def format(value)
18
+ return '"true"' if value.is_a?(TrueClass)
19
+ return '"false"' if value.is_a?(FalseClass)
20
+ return %("#{value}") if value.is_a?(String)
21
+
22
+ value
23
+ end
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pbrt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Patuzzo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 3.8.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 3.8.0
27
+ description: A Ruby gem to generate scene description files for the third edition
28
+ of Physically Based Rendering.
29
+ email: chris@patuzzo.co.uk
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - README.md
35
+ - lib/pbrt.rb
36
+ - lib/pbrt/builder.rb
37
+ - lib/pbrt/builder/accelerator.rb
38
+ - lib/pbrt/builder/area_light_source.rb
39
+ - lib/pbrt/builder/camera.rb
40
+ - lib/pbrt/builder/film.rb
41
+ - lib/pbrt/builder/integrator.rb
42
+ - lib/pbrt/builder/light_source.rb
43
+ - lib/pbrt/builder/material.rb
44
+ - lib/pbrt/builder/named_material.rb
45
+ - lib/pbrt/builder/named_medium.rb
46
+ - lib/pbrt/builder/pixel_filter.rb
47
+ - lib/pbrt/builder/sampler.rb
48
+ - lib/pbrt/builder/shape.rb
49
+ - lib/pbrt/builder/texture.rb
50
+ - lib/pbrt/parameter.rb
51
+ - lib/pbrt/parameter_list.rb
52
+ - lib/pbrt/signature.rb
53
+ - lib/pbrt/spectrum.rb
54
+ - lib/pbrt/statement.rb
55
+ - lib/pbrt/statement/fixed_size.rb
56
+ - lib/pbrt/statement/variadic.rb
57
+ - lib/pbrt/texture.rb
58
+ - lib/pbrt/values.rb
59
+ homepage: https://github.com/tuzz/pbrt
60
+ licenses:
61
+ - MIT
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubygems_version: 3.0.1
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: PBRT
82
+ test_files: []