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.
- checksums.yaml +7 -0
- data/README.md +267 -0
- data/lib/pbrt.rb +26 -0
- data/lib/pbrt/builder.rb +184 -0
- data/lib/pbrt/builder/accelerator.rb +36 -0
- data/lib/pbrt/builder/area_light_source.rb +25 -0
- data/lib/pbrt/builder/camera.rb +67 -0
- data/lib/pbrt/builder/film.rb +29 -0
- data/lib/pbrt/builder/integrator.rb +82 -0
- data/lib/pbrt/builder/light_source.rb +81 -0
- data/lib/pbrt/builder/material.rb +266 -0
- data/lib/pbrt/builder/named_material.rb +24 -0
- data/lib/pbrt/builder/named_medium.rb +46 -0
- data/lib/pbrt/builder/pixel_filter.rb +64 -0
- data/lib/pbrt/builder/sampler.rb +60 -0
- data/lib/pbrt/builder/shape.rb +171 -0
- data/lib/pbrt/builder/texture.rb +167 -0
- data/lib/pbrt/parameter.rb +12 -0
- data/lib/pbrt/parameter_list.rb +45 -0
- data/lib/pbrt/signature.rb +39 -0
- data/lib/pbrt/spectrum.rb +29 -0
- data/lib/pbrt/statement.rb +11 -0
- data/lib/pbrt/statement/fixed_size.rb +28 -0
- data/lib/pbrt/statement/variadic.rb +15 -0
- data/lib/pbrt/texture.rb +63 -0
- data/lib/pbrt/values.rb +25 -0
- metadata +82 -0
@@ -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,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
|
data/lib/pbrt/texture.rb
ADDED
@@ -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
|
data/lib/pbrt/values.rb
ADDED
@@ -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: []
|