kitou's picture
Upload 45 files
e26b925
raw
history blame
10.8 kB
#!/usr/bin/env python
"""
give a json element file, create pbrt scenes and objects. This should create the main element/element.pbrt,
element/geometry.pbrt and element/materials.pbrt. In addition, if the element has instanced primitives, then
for each primitive, a primitive subdirectory is created, along with a primitive.pbrt file and an archive_geometry
pbrt file for each archive referenced by that primitive description:
element/element.pbrt
element/element_geometry.pbrt
element/material.pbrt
element/objects.pbrt
element/primitive/primitive.pbrt
element/primitive/archive_geometry.pbrt
"""
import sys
import os
import argparse
import json
import pbrtutils as pu
ISLANDDIR = os.getcwd()
def parseArgs():
parser = argparse.ArgumentParser(
description="Takes an element and creates pbrt element version of the geometry and scene.")
parser.add_argument('element', metavar='ELEM', help="Element to load.")
parser.add_argument('--frameRange', type=str, default="1", help="Frame range to export, i.e. 1 or 1-3 or 1-5:2")
parser.add_argument('-o', '--outdir', default=ISLANDDIR, help="Where to write out the pbrt files(s).")
parser.add_argument('--skipObj', action='store_true', default=False, help="Skip Obj Conversion")
parser.add_argument('--skipCopies', action='store_true', default=False, help="Skip Instanced Copies Obj Generation")
parser.add_argument('--skipArchives', action='store_true', default=False, help="Skip Archive Conversion")
parser.add_argument('--skipMat', action='store_true', default=False, help="Skip Material Generation")
parser.add_argument('--skipPrims', action='store_true', default=False, help="Skip Primitive(s) PBRT Generation")
parser.add_argument('--skipMain', action='store_true', default=False, help="Skip Main PBRT Generation")
parser.add_argument('--prim', default="", help="Specific json primitive file to load, i.e. xgGrass")
return parser.parse_args()
def main():
args = parseArgs()
if args.element == "island":
# create the main island file.
pu.writeMainPbrtFile()
return
jsonFile = os.path.join("json", args.element, args.element + ".json")
with open(jsonFile, "r") as jf:
jsonDict = json.load(jf)
# pull data from dict
element = jsonDict["name"]
objFile = jsonDict["geomObjFile"]
matFile = jsonDict["matFile"] if "matFile" in jsonDict else ""
instancedPrimitives = jsonDict["instancedPrimitiveJsonFiles"] if "instancedPrimitiveJsonFiles" in jsonDict else {}
instancedCopies = jsonDict["instancedCopies"] if "instancedCopies" in jsonDict else {}
primDesc = args.prim
archiveFiles = {}
primitiveFiles = []
print "Preparing pbrt export for element: ", element
elementDir = os.path.join(args.outdir, "pbrt", element)
# make all the directories we're going to need
for outDir in [elementDir] + [os.path.join(args.outdir, "pbrt", element, x) for x in instancedPrimitives]:
if not os.path.exists(outDir):
os.makedirs(outDir)
# relative path and full path names of the output files for pbrt.
pbrtRelOutElement = os.path.join(element, element + ".pbrt")
pbrtRelOutGeometry = os.path.join(element, element + "_geometry.pbrt")
pbrtRelOutMaterials = os.path.join(element, "materials.pbrt")
pbrtOutElement = os.path.join(elementDir, element + ".pbrt")
pbrtOutGeometry = os.path.join(elementDir, element + "_geometry.pbrt")
pbrtOutMaterials = os.path.join(elementDir, "materials.pbrt")
##############################################
# Convert materials for the element --> element/materials.pbrt
# -- we convert these first because we need the information to insert it into the OBJs.
if not args.skipMat:
print "################################################# Converting Materials: "
pu.matToPbrt(element, matFile, pbrtOutMaterials)
##############################################
# Convert geometry -- main file--> element/element_geometry.pbrt (to be consistent w/ instances)
if not args.skipObj:
print "################################################# Converting main element OBJ file: "
print "Exporting: ", pbrtOutGeometry
pu.geomToPbrt(objFile, pbrtOutGeometry, matFile)
##############################################
# Convert geometry #2 -- instanced copies with their own geometry (isPalmRig special case code....)
if instancedCopies:
print "################################################# Converting Instanced copies OBJ files: "
for instance, icDict in instancedCopies.iteritems():
if "geomObjFile" in icDict:
pbrtOutInstGeometry = os.path.join(elementDir, instance + "_geometry.pbrt")
print "Exporting: ", pbrtOutInstGeometry
pu.geomToPbrt(icDict['geomObjFile'], pbrtOutInstGeometry , matFile)
##############################################
# convert geometry #3 - primitives json files and associated archives --> element/primitive/archive_geometry.pbrt
# note: we don't need to run this for instanced copies -- we're assuming they use the same primitives.
if not args.skipArchives or not instancedPrimitives:
print "################################################# Converting Instanced JSON files and OBJ archives: "
for primitiveName, ipDict in instancedPrimitives.iteritems():
# this file is the instance name and transforms of each archive, keyed by archive (obj)
if "archives" in ipDict:
print "Create geometry data for all archives associated with ", primitiveName
archiveFiles[primitiveName] = []
for archive in ipDict["archives"]:
# this is a list of all the archives referenced above.
base = os.path.basename(archive)[:-4]
pbrtOutArchiveGeometry = os.path.join(elementDir, primitiveName, base + "_geometry.pbrt")
if not os.path.exists(pbrtOutArchiveGeometry):
print "Exporting: ", pbrtOutArchiveGeometry
if ipDict["type"] == "archive":
pu.geomToPbrt(archive, pbrtOutArchiveGeometry, matFile)
else:
variantMatFile = os.path.join(args.outdir, "json", ipDict["element"],"materials.json" )
print "...Exporting variant with alternate material file: %s" % variantMatFile
pu.geomToPbrt(archive, pbrtOutArchiveGeometry, variantMatFile)
archiveFiles[primitiveName].append(pbrtOutArchiveGeometry)
else:
# If we skipped creating archives, re-build the list here here.
if instancedPrimitives:
for primitiveName, iDict in instancedPrimitives.iteritems():
archiveFiles[primitiveName] = [os.path.join(element, primitiveName, x)
for x in os.listdir(os.path.join(elementDir, primitiveName))
if x.endswith("geometry.pbrt")]
if not args.skipPrims:
##############################################
# Create primitives #1: element/primitive/instance_primitive.pbrt. This creates either
# an archive type or curve type of file. All created files are added to a list for later
# referencing in the main element pbrt file.
print "################################################# Creating Primitive reference files: "
for primitiveName, ipDict in instancedPrimitives.iteritems():
if primDesc and primDesc != primitiveName:
continue
# this file is the instance name and transforms of each archive, keyed by archive (obj)
print "Create main primitive file for:", primitiveName, "using", ipDict["jsonFile"]
primitiveFiles.append(pu.jsonPrimitiveToPbrt(ipDict["type"] if "type" in ipDict else "", element, primitiveName, ipDict))
#############################################
# Create primitve #3 -- for all 'element' archive types, create any included primitives associated with
# them, i.e. - isBayCedarA1_bonsaiA_xgBonsai
if "type" in ipDict and ipDict["type"] == "element":
sourceDict = pu.readJsonFile(os.path.join("json", ipDict["element"], ipDict["element"]+".json"))
for variant, vDict in sourceDict["variants"].iteritems():
if "instancedPrimitiveJsonFiles" not in vDict:
continue
for primitiveName, vipDict in vDict["instancedPrimitiveJsonFiles"].iteritems():
primitiveFiles.append(pu.jsonPrimitiveToPbrt(vipDict["type"], ipDict["element"], primitiveName, vipDict))
##############################################
# Create primitives #3 -- instanced copies with their own primitives (i,e, - isPalmRig3 w xgFronds3)
if instancedCopies:
print "################################################# Creating instanced copies primitives files: "
for instance, icDict in instancedCopies.iteritems():
if "instancedPrimitiveJsonFiles" in icDict:
for primitiveName, ipDict in icDict["instancedPrimitiveJsonFiles"].iteritems():
print "Create primitive file for:", primitiveName, "using", ipDict["jsonFile"]
primitiveFiles.append(pu.jsonPrimitiveToPbrt(ipDict["type"] if "type" in ipDict else "", element, primitiveName, ipDict))
else:
# If we skipped the conversion, build primitiveFiles list here.
for primitiveName in instancedPrimitives:
primitiveFiles += [os.path.join(element, primitiveName, x)
for x in os.listdir(os.path.join(elementDir, primitiveName))
if x.endswith(".pbrt") and
not x.endswith("geometry.pbrt")]
if not args.skipMain:
##############################################
# Create the main pbrt reference file with builds the hierarchy via includes and transform.
# --> element/element.pbrt
print "################################################# Creating main element reference: "
print "Exporting:", pbrtOutElement
pu.writeMainElement(pbrtOutElement, pbrtRelOutMaterials, pbrtRelOutGeometry, primitiveFiles,
sourceJsonFile=jsonFile)
if __name__ == "__main__":
if main():
sys.exit(0)
sys.exit(1)