123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- """
- Copyright (c) Contributors to the Open 3D Engine Project.
- For complete copyright and license terms please see the LICENSE at the root of this distribution.
- SPDX-License-Identifier: Apache-2.0 OR MIT
- """
- #
- # Simple example asset builder that processes *.foo files
- #
- import azlmbr.math
- import azlmbr.asset.builder
- import os, shutil
- # the UUID must be unique amongst all the asset builders in Python or otherwise
- busIdString = '{E4DB381B-61A0-4729-ACD9-4C8BDD2D2282}'
- busId = azlmbr.math.Uuid_CreateString(busIdString)
- assetTypeScript = azlmbr.math.Uuid_CreateString('{82557326-4AE3-416C-95D6-C70635AB7588}')
- handler = None
- jobKeyPrefix = 'Foo Job Key'
- targetAssetFolder = 'foo_scripts'
- # creates a single job to compile for a 'pc' platform
- def on_create_jobs(args):
- request = args[0] # azlmbr.asset.builder.CreateJobsRequest
- response = azlmbr.asset.builder.CreateJobsResponse()
- # note: if the asset builder is going to handle more than one file pattern it might need to check out
- # the request.sourceFile to figure out what jobs need to be created
- jobDescriptorList = []
- for platformInfo in request.enabledPlatforms:
- # for each enabled platform like 'pc' or 'ios'
- platformId = platformInfo.identifier
- # set up unique job key
- jobKey = '{} {}'.format(jobKeyPrefix, platformId)
- # create job descriptor
- jobDesc = azlmbr.asset.builder.JobDescriptor()
- jobDesc.jobKey = jobKey
- jobDesc.set_platform_identifier(platformId)
- jobDescriptorList.append(jobDesc)
- print ('created a job for {} with key {}'.format(platformId, jobKey))
- response.createJobOutputs = jobDescriptorList
- response.result = azlmbr.asset.builder.CreateJobsResponse_ResultSuccess
- return response
- def get_target_name(sourceFullpath):
- lua_file = os.path.basename(sourceFullpath)
- lua_file = os.path.splitext(lua_file)[0]
- lua_file = lua_file + '.lua'
- return lua_file
- def copy_foo_file(srcFile, dstFile):
- try:
- dir_name = os.path.dirname(dstFile)
- if (os.path.exists(dir_name) is False):
- os.makedirs(dir_name)
- shutil.copyfile(srcFile, dstFile)
- return True
- except:
- return False
- # using the incoming 'request' find the type of job via 'jobKey' to determine what to do
- def on_process_job(args):
- request = args[0] # azlmbr.asset.builder.ProcessJobRequest
- response = azlmbr.asset.builder.ProcessJobResponse()
- # note: if possible to loop through incoming data a 'yeild' can be used to cooperatively
- # thread the processing of the assets so that shutdown and cancel can be handled
- if (request.jobDescription.jobKey.startswith(jobKeyPrefix)):
- targetFile = os.path.join(targetAssetFolder, get_target_name(request.fullPath))
- dstFile = os.path.join(request.tempDirPath, targetFile)
- if (copy_foo_file(request.fullPath, dstFile)):
- response.outputProducts = [azlmbr.asset.builder.JobProduct(dstFile, assetTypeScript, 0)]
- response.resultCode = azlmbr.asset.builder.ProcessJobResponse_Success
- response.dependenciesHandled = True
- return response
- def on_shutdown(args):
- # note: user should attempt to close down any processing job if any running
- global handler
- if (handler is not None):
- handler.disconnect()
- handler = None
- def on_cancel_job(args):
- # note: user should attempt to close down any processing job if any running
- print('>>> FOO asset builder - on_cancel_job <<<')
- # register asset builder for source assets
- def register_asset_builder():
- assetPattern = azlmbr.asset.builder.AssetBuilderPattern()
- assetPattern.pattern = '*.foo'
- assetPattern.type = azlmbr.asset.builder.AssetBuilderPattern_Wildcard
- builderDescriptor = azlmbr.asset.builder.AssetBuilderDesc()
- builderDescriptor.name = "Foo Asset Builder"
- builderDescriptor.patterns = [assetPattern]
- builderDescriptor.busId = busId
- builderDescriptor.version = 0
- outcome = azlmbr.asset.builder.PythonAssetBuilderRequestBus(azlmbr.bus.Broadcast, 'RegisterAssetBuilder', builderDescriptor)
- if outcome.IsSuccess():
- # created the asset builder handler to hook into the notification bus
- jobHandler = azlmbr.asset.builder.PythonBuilderNotificationBusHandler()
- jobHandler.connect(busId)
- jobHandler.add_callback('OnCreateJobsRequest', on_create_jobs)
- jobHandler.add_callback('OnProcessJobRequest', on_process_job)
- jobHandler.add_callback('OnShutdown', on_shutdown)
- jobHandler.add_callback('OnCancel', on_cancel_job)
- return jobHandler
- # note: the handler has to be retained since Python retains the object ref count
- # on_shutdown will clear the 'handler' to disconnect from the notification bus
- handler = register_asset_builder()
|