|
|
|
""" |
|
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) |
|
|
|
|
|
|
|
|
|
|