pbrt 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: []