Skip to content

Commit a8f83a3

Browse files
authored
Merge pull request #103 from OSC/feature/vray-support
Feature/vray support
2 parents e6dce79 + 1450273 commit a8f83a3

29 files changed

+847
-161
lines changed

README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ for convenience. For more information see
162162

163163
## Additional Options
164164

165+
### Maya Additional Options
166+
165167
The default given is `-verb -b 1 -ai:lve 0`. Here's a breakdown of what those flags mean:
166168

167169
* `-verb` Print Mel commands before they are executed
@@ -177,6 +179,12 @@ of each other.
177179
To view all of the possible arguments see [this page](/docs/mds/ARNOLD.md) for the Arnold renderer. Flags for
178180
other renderers are not documented here, but could be if requested.
179181

182+
### VRay Additional Options
183+
184+
The default for VRay is `-verbose=3` which is the default log output level.
185+
186+
See [the VRAY help page](/docs/mds/VRAY.md) for all the available flags you can use here.
187+
180188
## Running Maya UI in a VDI
181189

182190
It's possible for users to run the AutoDesk Maya UI through a virtual deskop application in OpenOndemand (VDI).
@@ -214,12 +222,12 @@ OOD_FRAME_RENDERER_CLUSTER=owens
214222
# defaults to 28 which, on owens, is an entire node.
215223
OOD_FRAME_RENDERER_CORES=28
216224

217-
# The job script that will be templated and submitted. The template language is
225+
# The maya job script that will be templated and submitted. The template language is
218226
# Ruby's ERB. All the variables in the default script will be available to any
219227
# new script file.
220228
#
221229
# defaults to the script template included with this source (relative directory)
222-
OOD_FRAME_RENDERER_SCRIPT='jobs/video_jobs/maya_submit.sh.erb'
230+
OOD_FRAME_RENDERER_MAYA_SCRIPT='jobs/video_jobs/maya_submit.sh.erb'
223231
```
224232

225233
## Developer Guide

app/controllers/projects_controller.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@ def show
1515
end
1616

1717
def create
18-
@project = Project.new(project_params)
19-
@project.save
20-
redirect_to @project
18+
@project = ProjectFactory.new_project(project_params)
19+
if @project.save
20+
redirect_to @project
21+
else
22+
# TODO: show these errors in the webpage.
23+
Rails.logger.info("could not save project becuase #{@project.errors.full_messages}")
24+
end
2125
end
2226

2327
def edit
@@ -43,6 +47,6 @@ def destroy
4347
def project_params
4448
params
4549
.require(:project)
46-
.permit(:name, :description, :directory)
50+
.permit(:name, :description, :directory, :project_type)
4751
end
4852
end

app/controllers/scripts_controller.rb

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ class ScriptsController < ApplicationController
22

33
def new
44
@project = Project.find(params[:project_id])
5-
init_script
5+
@script = default_script
66
end
77

88
def create
99
@project = Project.find(params[:project_id])
10-
@script = @project.scripts.build(script_params)
10+
11+
if ProjectFactory.vray_project?(@project)
12+
@script = @project.scripts.build(script_params.merge({ type: 'VRayScript' }))
13+
else
14+
@script = @project.scripts.build(script_params.merge({ type: 'MayaScript' }))
15+
end
1116

1217
if @script.save
1318
redirect_to project_path(@project), notice: 'Job settings successfully created.'
@@ -54,7 +59,7 @@ def submit
5459
redirect_to @project, alert: @script.errors[:name].first
5560
end
5661
end
57-
62+
5863
def show
5964
@project = Project.find(params[:project_id])
6065
@script = Script.find(params[:id])
@@ -108,24 +113,22 @@ def get_jobs(params)
108113
@jobs = @script.jobs.where(script_id: params[:script_id])
109114
end
110115

111-
def init_script
112-
@script = @project.scripts.build(
113-
file: @project.directory,
114-
extra: '-verb -b 1 -ai:lve 0',
116+
def default_script
117+
@project.scripts.build(
115118
email: true,
116119
walltime: 1,
117-
cluster: Script.default_cluster,
118-
skip_existing: true
120+
skip_existing: true,
121+
extra: @project.default_script_extra,
122+
type: @project.script_type
119123
)
120-
121124
end
122125

123126
def script_params
124127
params
125128
.require(:script)
126129
.permit(
127130
:name, :frames, :camera, :file, :accounting_id, :cluster, :nodes,
128-
:renderer, :extra, :walltime, :email, :skip_existing
131+
:renderer, :extra, :walltime, :email, :skip_existing, :version
129132
)
130133
end
131134

app/helpers/scripts_helper.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
1+
# frozen_string_literal: true
2+
13
module ScriptsHelper
24
def normalize_css_str(str)
35
str.to_s.sub(' ', '-')
46
end
7+
8+
def version_label(project)
9+
if ProjectFactory.maya_project?(project)
10+
'Maya'
11+
elsif ProjectFactory.vray_project?(project)
12+
'VRay'
13+
else
14+
'Maya'
15+
end
16+
end
517
end

app/models/maya_project.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
# Project subclass for Maya Projects
4+
class MayaProject < Project
5+
def self.model_name
6+
Project.model_name
7+
end
8+
9+
def scenes
10+
Dir.glob("#{directory}/scenes/**/**.m[ab]")
11+
end
12+
13+
def script_type
14+
'MayaScript'
15+
end
16+
17+
def default_script_extra
18+
'-verb -b 1 -ai:lve 0'
19+
end
20+
end

app/models/maya_script.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
# Script subclass for Maya rendering
4+
class MayaScript < Script
5+
def self.model_name
6+
Script.model_name
7+
end
8+
9+
def script_template
10+
Configuration.maya_script_template
11+
end
12+
13+
def renderers
14+
[
15+
'arnold', 'default', 'file', 'hw2', 'hw',
16+
'interBatch', 'sw', 'turtle', 'turtlebake', 'vr'
17+
].freeze
18+
end
19+
20+
def cores
21+
Configuration.cores
22+
end
23+
24+
def cluster
25+
Configuration.submit_cluster
26+
end
27+
28+
def available_versions
29+
['2020', '2022']
30+
end
31+
32+
def job_name
33+
'maya-render'
34+
end
35+
end

app/models/project.rb

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
# frozen_string_literal: true
2+
3+
# Project class is meant to be subclassed for specific functionality
14
class Project < ApplicationRecord
25
validates :name, presence: true, length: { minimum: 5 }, uniqueness: true
3-
validates :directory, presence: true
6+
validates :directory, presence: true
47
validate :directory_must_be_valid
58
validates_uniqueness_of :name
69
has_many :scripts
@@ -10,28 +13,20 @@ class Project < ApplicationRecord
1013
# don't remove attributes from this list going forward! only deprecate
1114
store :project_attrs, coder: JSON, accessors: %i[]
1215

13-
class << self
14-
def maya_top_level_dir
15-
dir = "#{Dir.home}/maya/projects/."
16-
FileUtils.mkdir_p dir unless Dir.exist? dir
17-
dir
18-
end
19-
end
16+
# we use `project_type` to allow for the form to set this attr and use _it_
17+
# to determine the `type` which will instantiate subclasses.
18+
attr_accessor :project_type
2019

21-
22-
def directory_must_be_valid
23-
unless Dir.exist? directory
24-
errors.add(:directory, "the directory must be valid")
25-
end
26-
end
20+
self.inheritance_column = :type
2721

28-
def initialize(params = {})
29-
super
30-
write_attribute(:directory, params.to_h[:directory] ||= Project.maya_top_level_dir)
22+
def directory_must_be_valid
23+
errors.add(:directory, 'the directory must be valid') unless Dir.exist? directory
3124
end
3225

33-
def scenes
34-
Dir.glob(directory + '/scenes/**/**.m[ab]')
26+
# subclasses should override this. It's kind of an awkward place to put this
27+
# knowledge of where the default Script.extra should be, but a script is tied
28+
# to a project so, it's the best place for now.
29+
def default_script_extra
30+
''
3531
end
36-
3732
end

app/models/project_factory.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
3+
# ProjectFactory creates subclasses of Project
4+
class ProjectFactory
5+
def self.new_project(params)
6+
case params[:project_type].to_s.downcase
7+
when 'maya'
8+
MayaProject.new(params.except(:project_type))
9+
when 'vray'
10+
VRayProject.new(params.except(:project_type))
11+
else
12+
MayaProject.new(params.except(:project_type))
13+
end
14+
end
15+
16+
def self.maya_project?(project)
17+
project.is_a?(MayaProject)
18+
end
19+
20+
def self.vray_project?(project)
21+
project.is_a?(VRayProject)
22+
end
23+
end

app/models/script.rb

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class Script < ApplicationRecord
44
belongs_to :project
55
has_many :jobs, dependent: :destroy
66
validates :frames, presence: true, format: { with: /\d+\-\d+/ }
7+
self.inheritance_column = :type
78

89
# add accessors: [ :attr1, :attr2 ] etc. when you want to add getters and
910
# setters to add new attributes stored in the JSON store
@@ -17,10 +18,6 @@ def never_submitted_status
1718
'not submitted'
1819
end
1920

20-
def default_cluster
21-
Configuration.submit_cluster
22-
end
23-
2421
def batch_jobs_dir
2522
'batch_jobs'
2623
end
@@ -60,7 +57,33 @@ def latest_id
6057
end
6158

6259
def cores
63-
Configuration.cores
60+
raise 'Subclasses need to define `cores`'
61+
end
62+
63+
def cluster
64+
raise 'Subclasses need to define `cluster`'
65+
end
66+
67+
def script_template
68+
raise 'Subclasses need to define `script_template`'
69+
end
70+
71+
def renderers
72+
raise 'Subclasses need to define `renderers`'
73+
end
74+
75+
def job_name
76+
raise 'Subclasses need to define `job_name`'
77+
end
78+
79+
def available_versions
80+
raise 'Subclasses need to define `versions_available`'
81+
end
82+
83+
# shell scripts files need to use this method so that we keep backward compatability
84+
# with jobs that never set versions.
85+
def module_version
86+
version.to_s.present? ? version : available_versions.first
6487
end
6588

6689
def task_start_frames
@@ -106,10 +129,6 @@ def job_sub_dir
106129
@job_sub_dir ||= Time.now.to_i.to_s
107130
end
108131

109-
def script_template
110-
Configuration.script_template
111-
end
112-
113132
def base_output_dir
114133
Pathname.new(project_dir).join('batch_jobs').tap { |p| p.mkpath unless p.exist? }
115134
end
@@ -127,7 +146,7 @@ def new_job
127146
end
128147

129148
def templated_content
130-
erb = ERB.new(File.read(script_template))
149+
erb = ERB.new(File.read(script_template), nil, '-')
131150
erb.filename = script_template.to_s
132151
erb.result(binding)
133152
end
@@ -138,7 +157,7 @@ def job_array_request
138157

139158
def job_opts
140159
{
141-
job_name: 'maya-render',
160+
job_name: job_name,
142161
email_on_terminated: email,
143162
job_array_request: job_array_request,
144163
workdir: job_dir,

app/models/v_ray_project.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
# Project subclass for Vray Projects
4+
class VRayProject < Project
5+
def self.model_name
6+
Project.model_name
7+
end
8+
9+
def scenes
10+
Dir.glob("#{directory}/scenes/**/**.vrscene")
11+
end
12+
13+
def script_type
14+
'VRayScript'
15+
end
16+
17+
def default_script_extra
18+
'-verboseLevel=3'
19+
end
20+
end

0 commit comments

Comments
 (0)