mock_asset_builder.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. """
  2. Copyright (c) Contributors to the Open 3D Engine Project.
  3. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. SPDX-License-Identifier: Apache-2.0 OR MIT
  5. """
  6. import azlmbr.asset
  7. import azlmbr.asset.builder
  8. import azlmbr.bus
  9. import azlmbr.math
  10. import os, traceback, binascii, sys
  11. jobKeyName = 'Mock Asset'
  12. def log_exception_traceback():
  13. exc_type, exc_value, exc_tb = sys.exc_info()
  14. data = traceback.format_exception(exc_type, exc_value, exc_tb)
  15. print(str(data))
  16. # creates a single job to compile for each platform
  17. def create_jobs(request):
  18. # create job descriptor for each platform
  19. jobDescriptorList = []
  20. for platformInfo in request.enabledPlatforms:
  21. jobDesc = azlmbr.asset.builder.JobDescriptor()
  22. jobDesc.jobKey = f'{jobKeyName}-{platformInfo.identifier}'
  23. jobDesc.set_platform_identifier(platformInfo.identifier)
  24. jobDescriptorList.append(jobDesc)
  25. response = azlmbr.asset.builder.CreateJobsResponse()
  26. response.result = azlmbr.asset.builder.CreateJobsResponse_ResultSuccess
  27. response.createJobOutputs = jobDescriptorList
  28. return response
  29. def on_create_jobs(args):
  30. try:
  31. request = args[0]
  32. return create_jobs(request)
  33. except:
  34. log_exception_traceback()
  35. # returning back a default CreateJobsResponse() records an asset error
  36. return azlmbr.asset.builder.CreateJobsResponse()
  37. def process_file(request):
  38. # prepare output folder
  39. basePath, _ = os.path.split(request.sourceFile)
  40. outputPath = os.path.join(request.tempDirPath, basePath)
  41. os.makedirs(outputPath, exist_ok=True)
  42. # write out a mock file
  43. basePath, sourceFile = os.path.split(request.sourceFile)
  44. mockFilename = os.path.splitext(sourceFile)[0] + '.mock_asset'
  45. mockFilename = os.path.join(basePath, mockFilename)
  46. mockFilename = mockFilename.replace('\\', '/')
  47. tempFilename = os.path.join(request.tempDirPath, mockFilename)
  48. # write out a tempFilename like a JSON
  49. fileOutput = open(tempFilename, "w")
  50. fileOutput.write('{}')
  51. fileOutput.close()
  52. print(f'Wrote mock asset file: {tempFilename}')
  53. # generate a product asset file entry
  54. subId = binascii.crc32(mockFilename.encode())
  55. mockAssetType = azlmbr.math.Uuid_CreateString('{9274AD17-3212-4651-9F3B-7DCCB080E467}')
  56. product = azlmbr.asset.builder.JobProduct(mockFilename, mockAssetType, subId)
  57. product.dependenciesHandled = True
  58. productOutputs = []
  59. productOutputs.append(product)
  60. # fill out response object
  61. response = azlmbr.asset.builder.ProcessJobResponse()
  62. response.outputProducts = productOutputs
  63. response.resultCode = azlmbr.asset.builder.ProcessJobResponse_Success
  64. response.dependenciesHandled = True
  65. return response
  66. # using the incoming 'request' find the type of job via 'jobKey' to determine what to do
  67. def on_process_job(args):
  68. try:
  69. request = args[0]
  70. if (request.jobDescription.jobKey.startswith(jobKeyName)):
  71. return process_file(request)
  72. except:
  73. log_exception_traceback()
  74. # returning back an empty ProcessJobResponse() will record an error
  75. return azlmbr.asset.builder.ProcessJobResponse()
  76. # register asset builder
  77. def register_asset_builder(busId):
  78. assetPattern = azlmbr.asset.builder.AssetBuilderPattern()
  79. assetPattern.pattern = '*.mock'
  80. assetPattern.type = azlmbr.asset.builder.AssetBuilderPattern_Wildcard
  81. builderDescriptor = azlmbr.asset.builder.AssetBuilderDesc()
  82. builderDescriptor.name = "Mock Builder"
  83. builderDescriptor.patterns = [assetPattern]
  84. builderDescriptor.busId = busId
  85. builderDescriptor.version = 1
  86. outcome = azlmbr.asset.builder.PythonAssetBuilderRequestBus(azlmbr.bus.Broadcast, 'RegisterAssetBuilder', builderDescriptor)
  87. if outcome.IsSuccess():
  88. # created the asset builder to hook into the notification bus
  89. handler = azlmbr.asset.builder.PythonBuilderNotificationBusHandler()
  90. handler.connect(busId)
  91. handler.add_callback('OnCreateJobsRequest', on_create_jobs)
  92. handler.add_callback('OnProcessJobRequest', on_process_job)
  93. return handler
  94. # create the asset builder handler
  95. busIdString = '{CF5C74C1-9ED4-5851-95B1-0B15090DBEC7}'
  96. busId = azlmbr.math.Uuid_CreateString(busIdString)
  97. handler = None
  98. try:
  99. handler = register_asset_builder(busId)
  100. except:
  101. handler = None
  102. log_exception_traceback()