/
create_asset.py
121 lines (98 loc) · 4.44 KB
/
create_asset.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/pxrpythonsubst
#
# Copyright 2016 Pixar
#
# Licensed under the Apache License, Version 2.0 (the "Apache License")
# with the following modification; you may not use this file except in
# compliance with the Apache License and the following modification to it:
# Section 6. Trademarks. is deleted and replaced with:
#
# 6. Trademarks. This License does not grant permission to use the trade
# names, trademarks, service marks, or product names of the Licensor
# and its affiliates, except as required to comply with Section 4(c) of
# the License and to reproduce the content of the NOTICE file.
#
# You may obtain a copy of the Apache License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the Apache License with the above modification is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the Apache License for the specific
# language governing permissions and limitations under the Apache License.
#
'''
Creates an asset file that consists of a top level layer and sublayers for
shading and geometry.
'''
from __future__ import print_function
import os
from pxr import Kind, Sdf, Usd, UsdGeom
def main():
import optparse
descr = __doc__.strip()
usage = 'usage: %prog [options] asset'
parser = optparse.OptionParser(description=descr, usage=usage)
parser.add_option('-k', '--kind', default=Kind.Tokens.component,
help="sets asset's model kind")
parser.add_option('-o', '--outputDir',
help='directory to create assets. if none specified, will use modelName.')
parser.add_option('-s', '--shadingVariantLayer',
help='add <asset>.shadingVariants.usda to model references.', default=False,
action='store_true')
parser.add_option('-f', '--force', default=False, action='store_true',
help='if False, this will error if [outputDir] exists')
options, args = parser.parse_args()
if len(args) != 1:
parser.error("No asset specified")
asset = args[0]
force = options.force
outputDir = options.outputDir
if not outputDir:
outputDir = asset
if os.path.exists(outputDir):
if not force:
parser.error('outputDir "%s" exists. Use -f to override' % outputDir)
else:
os.makedirs(outputDir)
_CreateAsset(asset, outputDir, options.kind, options.shadingVariantLayer)
def _CreateAsset(assetName, assetDir, assetKind, addShadingVariantLayer):
assetFilePath = os.path.join(assetDir, '%s.usd' % assetName)
print("Creating asset at %s" % assetFilePath)
# Make the layer ascii - good for readability, plus the file is small
rootLayer = Sdf.Layer.CreateNew(assetFilePath, args = {'format':'usda'})
assetStage = Usd.Stage.Open(rootLayer)
# Define a prim for the asset and make it the default for the stage.
assetPrim = UsdGeom.Xform.Define(assetStage, '/%s' % assetName).GetPrim()
assetStage.SetDefaultPrim(assetPrim)
# Lets viewing applications know how to orient a free camera properly
UsdGeom.SetStageUpAxis(assetStage, UsdGeom.Tokens.y)
# Usually we will "loft up" the kind authored into the exported geometry
# layer rather than re-stamping here; we'll leave that for a later
# tutorial, and just be explicit here.
model = Usd.ModelAPI(assetPrim)
if assetKind:
model.SetKind(assetKind)
model.SetAssetName(assetName)
model.SetAssetIdentifier('%s/%s.usd' % (assetName, assetName))
refs = []
if addShadingVariantLayer:
# if we're going to add it, then shading is stronger than geom and needs
# to be added first
refs.append('./%s.shadingVariants.usda' % assetName)
refs.append('./%s.maya.usd' % assetName)
_CreateAndReferenceLayers(assetPrim, assetDir, refs)
assetStage.GetRootLayer().Save()
def _CreateAndReferenceLayers(assetPrim, assetDir, refs):
from pxr import Usd
for refLayerPath in refs:
referencedStage = Usd.Stage.CreateNew(os.path.join(assetDir, refLayerPath))
referencedAssetPrim = referencedStage.DefinePrim(assetPrim.GetPath())
referencedStage.SetDefaultPrim(referencedAssetPrim)
referencedStage.GetRootLayer().Save()
assetPrim.GetReferences().AddReference(refLayerPath)
# If you want to print things out, you can do:
#print(rootLayer.ExportToString())
if __name__ == '__main__':
main()