General progress and fixes, Houdini does not work however.

This commit is contained in:
Marcel Pi 2023-11-25 18:51:58 +01:00
parent 7b68258a3f
commit fb2d231c75
15 changed files with 439 additions and 453 deletions

View File

@ -267,7 +267,6 @@ if (BUILD_LIBCARLA_CLIENT)
${LIBCARLA_SOURCE_PATH}/carla/road/object/*.h
${LIBCARLA_SOURCE_PATH}/carla/road/signal/*.h
${LIBCARLA_SOURCE_PATH}/carla/rpc/*.h
${LIBCARLA_SOURCE_PATH}/carla/rss/*.h
${LIBCARLA_SOURCE_PATH}/carla/sensor/*.h
${LIBCARLA_SOURCE_PATH}/carla/sensor/data/*.h
${LIBCARLA_SOURCE_PATH}/carla/sensor/s11n/*.h
@ -279,6 +278,19 @@ if (BUILD_LIBCARLA_CLIENT)
${LIBCARLA_SOURCE_PATH}/carla/trafficmanager/*.h
)
if (ENABLE_LIBCARLA_CLIENT_RSS)
file (
GLOB
LIBCARLA_CLIENT_HEADERS_RSS
${LIBCARLA_SOURCE_PATH}/carla/rss/*.h
)
list (
APPEND
LIBCARLA_CLIENT_HEADERS
${LIBCARLA_CLIENT_HEADERS_RSS}
)
endif ()
file (
GLOB
LIBCARLA_CLIENT_HEADERS_THIRD_PARTY
@ -306,7 +318,6 @@ if (BUILD_LIBCARLA_CLIENT)
${LIBCARLA_SOURCE_PATH}/carla/road/object/*.cpp
${LIBCARLA_SOURCE_PATH}/carla/road/signal/*.cpp
${LIBCARLA_SOURCE_PATH}/carla/rpc/*.cpp
${LIBCARLA_SOURCE_PATH}/carla/rss/*.cpp
${LIBCARLA_SOURCE_PATH}/carla/sensor/*.cpp
${LIBCARLA_SOURCE_PATH}/carla/sensor/data/*.cpp
${LIBCARLA_SOURCE_PATH}/carla/sensor/s11n/*.cpp
@ -318,6 +329,19 @@ if (BUILD_LIBCARLA_CLIENT)
${LIBCARLA_SOURCE_PATH}/carla/trafficmanager/*.cpp
)
if (ENABLE_LIBCARLA_CLIENT_RSS)
file (
GLOB
LIBCARLA_CLIENT_SOURCES_RSS
${LIBCARLA_SOURCE_PATH}/carla/rss/*.cpp
)
list (
APPEND
LIBCARLA_CLIENT_SOURCES
${LIBCARLA_CLIENT_SOURCES_RSS}
)
endif ()
file (
GLOB
LIBCARLA_CLIENT_SOURCES_THIRD_PARTY

View File

@ -244,10 +244,12 @@ ARGV = SyncArgs()
SEQUENTIAL = ARGV.configure_sequential
ENABLE_OSM2ODR = ARGV.osm2odr or ARGV.python_api
ENABLE_OSM_WORLD_RENDERER = ARGV.osm_world_renderer
ENABLE_CARLA_UE = ARGV.carla_ue
ENABLE_PYTHON_API = ARGV.python_api
ENABLE_LIBCARLA_CLIENT = ARGV.libcarla_client
ENABLE_LIBCARLA_SERVER = ARGV.libcarla_server
ENABLE_LIBCARLA = any([
ENABLE_CARLA_UE,
ENABLE_PYTHON_API,
ENABLE_LIBCARLA_CLIENT,
ENABLE_LIBCARLA_SERVER,
@ -445,25 +447,17 @@ def LaunchSubprocessImmediate(
# Convenience classes for listing dependencies:
class Download:
def __init__(self, url : str):
self.url = url
class GitRepository:
def __init__(self, url : str, tag : str = None):
def __init__(self, url : str, tag : str = None, commit : str = None):
self.url = url
self.tag = tag
self.commit = commit
class Dependency:
def __init__(self, name : str, *sources):
self.name = name
self.sources = [ *sources ]
@ -472,6 +466,77 @@ class Dependency:
type(e) is GitRepository
for e in self.sources)
class DependencyUEPlugin(Dependency):
def __init__(self, name: str, *sources):
super().__init__(name, *sources)
DEFAULT_DEPENDENCIES = [
Dependency(
'boost',
Download(f'https://boostorg.jfrog.io/artifactory/main/release/{BOOST_VERSION_STRING}/source/boost_{BOOST_VERSION_MAJOR}_{BOOST_VERSION_MINOR}_{BOOST_VERSION_PATCH}.zip'),
Download(f'https://carla-releases.s3.eu-west-3.amazonaws.com/Backup/boost_{BOOST_VERSION_MAJOR}_{BOOST_VERSION_MINOR}_{BOOST_VERSION_PATCH}.zip')),
Dependency(
'eigen',
GitRepository('https://gitlab.com/libeigen/eigen.git', tag = '3.4.0')),
Dependency(
'libpng',
GitRepository('https://github.com/glennrp/libpng.git', tag = 'v1.6.40')),
Dependency(
'proj',
GitRepository('https://github.com/OSGeo/PROJ.git', tag = '9.3.0'),
Download('https://download.osgeo.org/proj/proj-9.3.0.tar.gz')),
Dependency(
'gtest',
GitRepository('https://github.com/google/googletest.git', tag = 'v1.14.0')),
Dependency(
'zlib',
GitRepository('https://github.com/madler/zlib.git'),
Download('https://zlib.net/current/zlib.tar.gz')),
Dependency(
'xercesc',
GitRepository('https://github.com/apache/xerces-c.git', tag = 'v3.2.4'),
Download('https://archive.apache.org/dist/xerces/c/3/sources/xerces-c-3.2.3.zip'),
Download('https://carla-releases.s3.eu-west-3.amazonaws.com/Backup/xerces-c-3.2.3.zip')),
Dependency(
'sqlite',
Download('https://www.sqlite.org/2021/sqlite-amalgamation-3340100.zip')),
Dependency(
'rpclib',
GitRepository('https://github.com/rpclib/rpclib.git', tag = 'v2.3.0')),
Dependency(
'recast',
GitRepository('https://github.com/carla-simulator/recastnavigation.git', tag = 'carla')),
]
CHRONO_DEPENDENCIES = [
Dependency(
'chrono',
GitRepository('https://github.com/projectchrono/chrono.git', tag = '8.0.0')),
]
OSM_WORLD_RENDERER_DEPENDENCIES = [
Dependency(
'libosmscout',
GitRepository('https://github.com/Framstag/libosmscout.git')),
Dependency(
'lunasvg',
GitRepository('https://github.com/sammycage/lunasvg.git')),
]
OSM2ODR_DEPENDENCIES = [
Dependency(
'sumo',
GitRepository('https://github.com/carla-simulator/sumo.git', tag = 'carla_osm2odr')),
]
CARLA_UE_DEPENDENCIES = [
DependencyUEPlugin(
'StreetMap',
GitRepository(
'https://github.com/carla-simulator/StreetMap.git',
tag = 'ue5.3')),
]
class Task:
@ -508,8 +573,7 @@ class Task:
cmd = Task.CreateCMakeConfigureDefaultCommandLine(source_path, build_path)
if install_path != None:
cmd.append('-DCMAKE_INSTALL_PREFIX=' + str(install_path))
cmd.extend([ *args ])
cmd.append(source_path)
cmd.extend([ *args, source_path ])
return Task.CreateSubprocessTask(name, in_edges, cmd)
def CreateCMakeBuildDefault(name : str, in_edges : list, build_path : Path, *args):
@ -638,102 +702,18 @@ class TaskGraph:
self.sequential = prior_sequential
self.Reset()
DEFAULT_DEPENDENCIES = [
Dependency(
'boost',
Download(f'https://boostorg.jfrog.io/artifactory/main/release/{BOOST_VERSION_STRING}/source/boost_{BOOST_VERSION_MAJOR}_{BOOST_VERSION_MINOR}_{BOOST_VERSION_PATCH}.zip'),
Download(f'https://carla-releases.s3.eu-west-3.amazonaws.com/Backup/boost_{BOOST_VERSION_MAJOR}_{BOOST_VERSION_MINOR}_{BOOST_VERSION_PATCH}.zip')),
Dependency(
'eigen',
GitRepository('https://gitlab.com/libeigen/eigen.git', tag = '3.4.0')),
Dependency(
'libpng',
GitRepository('https://github.com/glennrp/libpng.git', tag = 'v1.6.40')),
Dependency(
'proj',
GitRepository('https://github.com/OSGeo/PROJ.git', tag = '9.3.0'),
Download('https://download.osgeo.org/proj/proj-9.3.0.tar.gz')),
Dependency(
'gtest',
GitRepository('https://github.com/google/googletest.git', tag = 'v1.14.0')),
Dependency(
'zlib',
GitRepository('https://github.com/madler/zlib.git'),
Download('https://zlib.net/current/zlib.tar.gz')),
Dependency(
'xercesc',
GitRepository('https://github.com/apache/xerces-c.git', tag = 'v3.2.4'),
Download('https://archive.apache.org/dist/xerces/c/3/sources/xerces-c-3.2.3.zip'),
Download('https://carla-releases.s3.eu-west-3.amazonaws.com/Backup/xerces-c-3.2.3.zip')),
Dependency(
'sqlite',
Download('https://www.sqlite.org/2021/sqlite-amalgamation-3340100.zip')),
Dependency(
'rpclib',
GitRepository('https://github.com/rpclib/rpclib.git', tag = 'v2.3.0')),
Dependency(
'recast',
GitRepository('https://github.com/recastnavigation/recastnavigation.git', tag = 'v1.6.0')),
]
CHRONO_DEPENDENCIES = [
Dependency(
'chrono',
GitRepository('https://github.com/projectchrono/chrono.git', tag = '8.0.0')),
]
OSM_WORLD_RENDERER_DEPENDENCIES = [
Dependency(
'libosmscout',
GitRepository('https://github.com/Framstag/libosmscout.git')),
Dependency(
'lunasvg',
GitRepository('https://github.com/sammycage/lunasvg.git')),
]
OSM2ODR_DEPENDENCIES = [
Dependency(
'sumo',
GitRepository('https://github.com/carla-simulator/sumo.git', tag = 'carla_osm2odr')),
]
def UpdateGitRepository(path : Path, url : str, branch : str = None):
def UpdateGitRepository(path : Path, url : str, branch : str = None, commit : str = None):
if path.exists():
LaunchSubprocessImmediate([
'git',
'-C', str(path),
'pull'
])
LaunchSubprocessImmediate([ 'git', '-C', str(path), 'pull' ])
else:
cmd = [
'git',
'-C', str(path.parent),
'clone',
'--depth', '1', '--single-branch'
]
cmd = [ 'git', '-C', str(path.parent), 'clone', '--depth', '1', '--single-branch' ]
if branch != None:
cmd.append('-b')
cmd.append(branch)
cmd.append(url)
cmd.append(path.stem)
cmd.extend([ '-b', branch ])
cmd.extend([ url, path.stem ])
LaunchSubprocessImmediate(cmd)
if commit != None:
LaunchSubprocessImmediate([ 'git', '-C', str(path), 'fetch' ])
LaunchSubprocessImmediate([ 'git', '-C', str(path), 'checkout', commit ])
def DownloadDependency(name : str, path : Path, url : str):
# Download:
@ -771,12 +751,14 @@ def DownloadDependency(name : str, path : Path, url : str):
def UpdateDependency(dep : Dependency):
name = dep.name
download_path = DEPENDENCIES_PATH / f'{name}-source'
if type(dep) is DependencyUEPlugin: # Override download path if we're dealing with an Unreal Engine Plugin.
download_path = CARLA_UE_PLUGIN_ROOT_PATH / name
for source in dep.sources:
try:
if type(source) is GitRepository:
branch = source.tag
UpdateGitRepository(download_path, source.url, branch)
UpdateGitRepository(download_path, source.url, source.tag, source.commit)
elif type(source) is Download:
if download_path.exists():
Log(f'Dependency "{name}" already present. Delete "{download_path}" if you wish for it to be downloaded again.')
@ -788,101 +770,11 @@ def UpdateDependency(dep : Dependency):
Log(f'Failed to update dependency "{name}".')
assert False
def BuildLibCarlaMain(task_graph : TaskGraph):
task_graph.Add(Task.CreateCMakeConfigureDefault(
'configure-libcarla',
[],
WORKSPACE_PATH,
LIBCARLA_BUILD_PATH,
f'-DCARLA_DEPENDENCIES_PATH={DEPENDENCIES_PATH}',
f'-DBUILD_LIBCARLA_SERVER={"ON" if ARGV.libcarla_server else "OFF"}',
f'-DBUILD_LIBCARLA_CLIENT={"ON" if ARGV.libcarla_client else "OFF"}',
f'-DBUILD_OSM_WORLD_RENDERER={"ON" if ENABLE_OSM_WORLD_RENDERER else "OFF"}',
f'-DLIBCARLA_PYTORCH={"ON" if ARGV.pytorch else "OFF"}'))
task_graph.Add(Task.CreateCMakeBuildDefault(
'build-libcarla',
[ 'configure-libcarla' ],
LIBCARLA_BUILD_PATH))
task_graph.Add(Task.CreateCMakeInstallDefault(
'install-libcarla',
[ 'build-libcarla' ],
LIBCARLA_BUILD_PATH,
LIBCARLA_INSTALL_PATH))
def BuildPythonAPIMain():
content = ''
with open(PYTHON_API_PATH / 'setup.py.in', 'r') as file:
content = file.read()
content = content.format_map(globals())
if os.name == 'nt':
content = content.replace(os.sep, '\\\\')
with open(PYTHON_API_PATH / 'setup.py', 'w') as file:
file.write(content)
LaunchSubprocessImmediate([
sys.executable, 'setup.py', 'bdist_wheel', 'bdist_egg'
], working_directory = PYTHON_API_PATH)
def BuildPythonAPI(task_graph : TaskGraph):
task_graph.Add(Task('build-python-api', [ 'install-libcarla' ], BuildPythonAPIMain))
def SetupUnrealEngine(task_graph : TaskGraph):
pass
def BuildCarlaUEMain():
assert UNREAL_ENGINE_PATH.exists()
unreal_build_tool_args = []
if ENABLE_CARSIM:
unreal_build_tool_args.append('-carsim')
if ENABLE_CHRONO:
unreal_build_tool_args.append('-chrono')
if ENABLE_ROS2:
unreal_build_tool_args.append('-ros2')
if ENABLE_UNITY_BUILD:
unreal_build_tool_args.append('-unity-build')
if ENABLE_NVIDIA_OMNIVERSE:
unreal_build_tool_args.append('-nv-omniverse')
if os.name == 'nt':
LaunchSubprocessImmediate([
UNREAL_ENGINE_PATH / 'Engine' / 'Build' / 'BatchFiles' / 'Build.bat',
'CarlaUE4Editor',
'Win64',
'Development',
'-WaitMutex',
'-FromMsBuild',
CARLA_UE_PATH / 'CarlaUE4.uproject',
], log_name = 'build-carla-ue-editor')
LaunchSubprocessImmediate([
UNREAL_ENGINE_PATH / 'Engine' / 'Build' / 'BatchFiles' / 'Build.bat',
'CarlaUE4',
'Win64',
'Development',
'-WaitMutex',
'-FromMsBuild',
CARLA_UE_PATH / 'CarlaUE4.uproject',
], log_name = 'build-carla-ue')
else:
pass
def BuildCarlaUE(task_graph : TaskGraph):
if ENABLE_NVIDIA_OMNIVERSE:
task_graph.Add(Task('install-nv-omniverse', [], InstallNVIDIAOmniverse))
task_graph.Add(Task('build-carla-ue', [ 'build-python-api' ], BuildCarlaUEMain))
def InstallNVIDIAOmniverse():
filename = 'USDCarlaInterface'
header = f'{filename}.h'
source = f'{filename}.cpp'
omniverse_usd_path = NV_OMNIVERSE_PLUGIN_PATH / 'Source' / 'OmniverseUSD'
files = [
[ omniverse_usd_path / 'Public' / header, NV_OMNIVERSE_PATCH_PATH / header ],
[ omniverse_usd_path / 'Private' / source, NV_OMNIVERSE_PATCH_PATH / source ],
]
for src, dst in files:
shutil.copyfile(src, dst)
def UpdateDependencies(task_graph : TaskGraph):
DEPENDENCIES_PATH.mkdir(exist_ok = True)
unique_deps = set(DEFAULT_DEPENDENCIES)
if ENABLE_CARLA_UE:
unique_deps.update(CARLA_UE_DEPENDENCIES)
if ENABLE_OSM_WORLD_RENDERER:
unique_deps.update(OSM_WORLD_RENDERER_DEPENDENCIES)
if ENABLE_OSM2ODR:
@ -955,8 +847,7 @@ def BuildSQLite():
if C_COMPILER_CLI_TYPE == 'msvc':
cmd.append(f'/Fe{SQLITE_EXE_PATH}')
else:
cmd.append('-o')
cmd.append(SQLITE_EXE_PATH)
cmd.extend([ '-o', SQLITE_EXE_PATH ])
LaunchSubprocessImmediate(cmd, log_name = 'build-sqlite-exe')
if not SQLITE_LIB_PATH.exists():
if C_COMPILER_IS_CLANG:
@ -978,8 +869,7 @@ def BuildSQLite():
if C_ENABLE_MARCH_NATIVE:
cmd.append('-march=native')
cmd.extend(sqlite_sources)
cmd.append('/Fo:' if C_COMPILER_CLI_TYPE == 'msvc' else '-o')
cmd.append(SQLITE_LIB_PATH)
cmd.extend([ '/Fo:' if C_COMPILER_CLI_TYPE == 'msvc' else '-o', SQLITE_LIB_PATH ])
LaunchSubprocessImmediate(
cmd,
log_name = 'build-sqlite-lib')
@ -1001,10 +891,8 @@ def BuildSQLite():
'/MD',
'/EHsc',
])
cmd.append(e)
obj_path = SQLITE_BUILD_PATH / f'{e.name}{OBJ_EXT}'
cmd.append('/Fo:' if C_COMPILER_CLI_TYPE == 'msvc' else '-o')
cmd.append(obj_path)
cmd.extend([ e, '/Fo:' if C_COMPILER_CLI_TYPE == 'msvc' else '-o', obj_path ])
LaunchSubprocessImmediate(cmd, log_name = f'build-sqlite-{e.stem}')
objs.append(obj_path)
cmd = [
@ -1014,10 +902,8 @@ def BuildSQLite():
cmd.extend(objs)
LaunchSubprocessImmediate(cmd, log_name = 'build-sqlite-lib')
def FindXercesC():
return glob.glob(f'{XERCESC_INSTALL_PATH}/**/{LIB_PREFIX}xerces-c*{LIB_EXT}', recursive=True)[0]
def ConfigureSUMO():
xercesc_path = glob.glob(f'{XERCESC_INSTALL_PATH}/**/{LIB_PREFIX}xerces-c*{LIB_EXT}', recursive=True)[0]
cmd = Task.CreateCMakeConfigureDefaultCommandLine(
SUMO_SOURCE_PATH,
SUMO_BUILD_PATH)
@ -1029,7 +915,7 @@ def ConfigureSUMO():
f'-DPROJ_INCLUDE_DIR={PROJ_INSTALL_PATH}/include',
f'-DPROJ_LIBRARY={PROJ_INSTALL_PATH}/lib/{LIB_PREFIX}proj{LIB_EXT}',
f'-DXercesC_INCLUDE_DIR={XERCESC_INSTALL_PATH}/include',
f'-DXercesC_LIBRARY={FindXercesC()}',
f'-DXercesC_LIBRARY={xercesc_path}',
'-DSUMO_LIBRARIES=OFF',
# '-DPROFILING=OFF',
# '-DPPROF=OFF',
@ -1179,6 +1065,99 @@ def BuildDependencies(task_graph : TaskGraph):
task_graph.Add(Task.CreateCMakeInstallDefault('install-sumo', [], SUMO_BUILD_PATH, SUMO_INSTALL_PATH))
if ENABLE_CHRONO:
task_graph.Add(Task.CreateCMakeInstallDefault('install-chrono', [], CHRONO_BUILD_PATH, CHRONO_INSTALL_PATH))
task_graph.Execute()
def BuildLibCarlaMain(task_graph : TaskGraph):
task_graph.Add(Task.CreateCMakeConfigureDefault(
'configure-libcarla',
[],
WORKSPACE_PATH,
LIBCARLA_BUILD_PATH,
f'-DCARLA_DEPENDENCIES_PATH={DEPENDENCIES_PATH}',
f'-DBUILD_LIBCARLA_SERVER={"ON" if ARGV.libcarla_server else "OFF"}',
f'-DBUILD_LIBCARLA_CLIENT={"ON" if ARGV.libcarla_client else "OFF"}',
f'-DBUILD_OSM_WORLD_RENDERER={"ON" if ENABLE_OSM_WORLD_RENDERER else "OFF"}',
f'-DLIBCARLA_PYTORCH={"ON" if ARGV.pytorch else "OFF"}'))
task_graph.Add(Task.CreateCMakeBuildDefault(
'build-libcarla',
[ 'configure-libcarla' ],
LIBCARLA_BUILD_PATH))
task_graph.Add(Task.CreateCMakeInstallDefault(
'install-libcarla',
[ 'build-libcarla' ],
LIBCARLA_BUILD_PATH,
LIBCARLA_INSTALL_PATH))
def BuildPythonAPIMain():
content = ''
with open(PYTHON_API_PATH / 'setup.py.in', 'r') as file:
content = file.read()
content = content.format_map(globals())
if os.name == 'nt':
content = content.replace(os.sep, '\\\\')
with open(PYTHON_API_PATH / 'setup.py', 'w') as file:
file.write(content)
LaunchSubprocessImmediate([
sys.executable, 'setup.py', 'bdist_wheel', 'bdist_egg'
], working_directory = PYTHON_API_PATH)
def BuildPythonAPI(task_graph : TaskGraph):
task_graph.Add(Task('build-python-api', [ 'install-libcarla' ], BuildPythonAPIMain))
def SetupUnrealEngine(task_graph : TaskGraph):
pass
def BuildCarlaUEMain():
assert UNREAL_ENGINE_PATH.exists()
unreal_build_tool_args = []
if ENABLE_CARSIM:
unreal_build_tool_args.append('-carsim')
if ENABLE_CHRONO:
unreal_build_tool_args.append('-chrono')
if ENABLE_ROS2:
unreal_build_tool_args.append('-ros2')
if ENABLE_UNITY_BUILD:
unreal_build_tool_args.append('-unity-build')
if ENABLE_NVIDIA_OMNIVERSE:
unreal_build_tool_args.append('-nv-omniverse')
if os.name == 'nt':
LaunchSubprocessImmediate([
UNREAL_ENGINE_PATH / 'Engine' / 'Build' / 'BatchFiles' / 'Build.bat',
'CarlaUE4Editor',
'Win64',
'Development',
'-WaitMutex',
'-FromMsBuild',
CARLA_UE_PATH / 'CarlaUE4.uproject',
], log_name = 'build-carla-ue-editor')
LaunchSubprocessImmediate([
UNREAL_ENGINE_PATH / 'Engine' / 'Build' / 'BatchFiles' / 'Build.bat',
'CarlaUE4',
'Win64',
'Development',
'-WaitMutex',
'-FromMsBuild',
CARLA_UE_PATH / 'CarlaUE4.uproject',
], log_name = 'build-carla-ue')
else:
pass
def BuildCarlaUE(task_graph : TaskGraph):
if ENABLE_NVIDIA_OMNIVERSE:
task_graph.Add(Task('install-nv-omniverse', [], InstallNVIDIAOmniverse))
task_graph.Add(Task('build-carla-ue', [ 'build-python-api' ], BuildCarlaUEMain))
def InstallNVIDIAOmniverse():
filename = 'USDCarlaInterface'
header = f'{filename}.h'
source = f'{filename}.cpp'
omniverse_usd_path = NV_OMNIVERSE_PLUGIN_PATH / 'Source' / 'OmniverseUSD'
files = [
[ omniverse_usd_path / 'Public' / header, NV_OMNIVERSE_PATCH_PATH / header ],
[ omniverse_usd_path / 'Private' / source, NV_OMNIVERSE_PATCH_PATH / source ],
]
for src, dst in files:
shutil.copyfile(src, dst)
def Clean():
if not BUILD_PATH.exists():

View File

@ -13,12 +13,12 @@
#include "carla/geom/Transform.h"
#include "carla/nav/WalkerManager.h"
#include "carla/rpc/ActorId.h"
#include <recastnavigation/Recast.h>
#include <recastnavigation/DetourCrowd.h>
#include <recastnavigation/DetourNavMesh.h>
#include <recastnavigation/DetourNavMeshBuilder.h>
#include <recastnavigation/DetourNavMeshQuery.h>
#include <recastnavigation/DetourCommon.h>
#include <recast/Recast.h>
#include <recast/DetourCrowd.h>
#include <recast/DetourNavMesh.h>
#include <recast/DetourNavMeshBuilder.h>
#include <recast/DetourNavMeshQuery.h>
#include <recast/DetourCommon.h>
namespace carla {
namespace nav {

View File

@ -95,7 +95,7 @@ link_flags = [
sorted(glob.glob(str(Path('{BOOST_INSTALL_PATH}') / 'lib' / 'libboost_python*{LIB_EXT}'), recursive = True))[0],
sorted(glob.glob(str(Path('{BOOST_INSTALL_PATH}') / 'lib' / 'libboost_filesystem*{LIB_EXT}'), recursive = True))[0],
sorted(glob.glob(str(Path('{RPCLIB_INSTALL_PATH}') / 'lib' / 'rpc{LIB_EXT}'), recursive = True))[0],
sorted(glob.glob(str(Path('{LIBCARLA_BUILD_PATH}') / 'libcarla-client{LIB_EXT}'), recursive = True))[0],
sorted(glob.glob(str(Path('{LIBCARLA_BUILD_PATH}') / '*carla-client{LIB_EXT}'), recursive = True))[0],
sorted(glob.glob(str(Path('{LIBPNG_INSTALL_PATH}') / 'lib' / 'libpng*{LIB_EXT}'), recursive = True))[0],
sorted(glob.glob(str(Path('{ZLIB_INSTALL_PATH}') / 'lib' / 'zlib{LIB_EXT}'), recursive = True))[0],
sorted(glob.glob(str(Path('{RECAST_INSTALL_PATH}') / 'lib' / 'Recast{LIB_EXT}'), recursive = True))[0],

View File

@ -1,39 +1,35 @@
{
"FileVersion": 3,
"Version": 1,
"VersionName": "0.9.15",
"FriendlyName": "CARLA",
"Description": "Open-source simulator for autonomous driving research.",
"Category": "Science",
"CreatedBy": "Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB)",
"CreatedByURL": "http://carla.org",
"DocsURL": "http://carla.readthedocs.io",
"MarketplaceURL": "",
"SupportURL": "https://github.com/carla-simulator/carla/issues",
"CanContainContent": true,
"IsBetaVersion": true,
"Installed": true,
"Modules":
[
{
"Name": "Carla",
"Type": "Runtime",
"LoadingPhase": "PreDefault",
"AdditionalDependencies":
[
"Engine"
]
}
],
"Plugins":
[
{
"Name": "ChaosVehicles",
"Enabled": true
},
{
"Name": "ProceduralMeshComponent",
"Enabled": true
}
]
"FileVersion": 3,
"Version": 1,
"VersionName": "0.9.15",
"FriendlyName": "CARLA",
"Description": "Open-source simulator for autonomous driving research.",
"Category": "Science",
"CreatedBy": "Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB)",
"CreatedByURL": "http://carla.org",
"DocsURL": "http://carla.readthedocs.io",
"MarketplaceURL": "",
"SupportURL": "https://github.com/carla-simulator/carla/issues",
"CanContainContent": true,
"IsBetaVersion": true,
"Installed": true,
"Modules":
[
{
"Name": "Carla",
"Type": "Runtime",
"LoadingPhase": "PreDefault",
"AdditionalDependencies":
[
"Engine"
]
}
],
"Plugins":
[
{
"Name": "ProceduralMeshComponent",
"Enabled": true
}
]
}

View File

@ -30,45 +30,35 @@ public class Carla :
public static string FindLibrary(string SearchPath, params string[] Patterns)
{
foreach (var Pattern in Patterns)
{
var Candidates = Directory.GetFiles(SearchPath, Pattern);
if (Candidates.Length == 0)
continue;
Array.Sort(Candidates);
return Candidates[0];
}
return null;
}
public Carla(ReadOnlyTargetRules Target) :
base(Target)
{
var DirectoryInfo = new DirectoryInfo(ModuleDirectory);
for (int i = 0; i != 6; ++i)
DirectoryInfo = DirectoryInfo.Parent;
var WorkspacePath = DirectoryInfo.ToString();
Debug.Assert(Directory.Exists(WorkspacePath));
bool IsWindows = Target.Platform == UnrealTargetPlatform.Win64;
var DirectoryInfo = new DirectoryInfo(ModuleDirectory);
for (int i = 0; i != 6; ++i)
DirectoryInfo = DirectoryInfo.Parent;
var WorkspacePath = DirectoryInfo.ToString();
Debug.Assert(WorkspacePath != null && !Directory.Exists(WorkspacePath));
if (CarlaInstallPath == null)
{
Console.WriteLine("-carla-install-path was not specified, inferring...");
CarlaInstallPath = Path.Combine(WorkspacePath, "Install", "libcarla");
Debug.Assert(Directory.Exists(CarlaInstallPath), "Could not infer CARLA install directory.");
}
if (CarlaDependenciesPath == null)
{
Console.WriteLine("-carla-dependencies-path was not specified, inferring...");
CarlaDependenciesPath = Path.Combine(WorkspacePath, "Build", "Dependencies");
Debug.Assert(Directory.Exists(CarlaDependenciesPath), "Could not infer CARLA dependencies directory.");
Console.WriteLine("\"-carla-install-path\" was not specified, inferring...");
CarlaInstallPath = Path.Combine(WorkspacePath, "Install", "libcarla");
if (!Directory.Exists(CarlaInstallPath))
throw new DirectoryNotFoundException("Could not infer CARLA install directory.");
Console.WriteLine("Using \"" + CarlaInstallPath + "\" as the CARLA install path.");
}
bool IsWindows = Target.Platform == UnrealTargetPlatform.Win64;
if (CarlaDependenciesPath == null)
{
Console.WriteLine("\"-carla-dependencies-path\" was not specified, inferring...");
CarlaDependenciesPath = Path.Combine(WorkspacePath, "Build", "Dependencies");
if (!Directory.Exists(CarlaDependenciesPath))
throw new DirectoryNotFoundException("Could not infer CARLA dependencies directory.");
Console.WriteLine("Using \"" + CarlaDependenciesPath + "\" as the CARLA depenencies install path.");
}
bEnableExceptions = bEnableExceptions || IsWindows;
bEnableExceptions = bEnableExceptions || IsWindows;
PrivatePCHHeaderFile = "Carla.h";
if (EnableCarSim)
@ -133,7 +123,6 @@ public class Carla :
"Landscape",
"Chaos",
"ChaosVehicles",
"ChaosVehicleLib",
"Slate",
"SlateCore",
"PhysicsCore"
@ -150,77 +139,70 @@ public class Carla :
var LibraryPrefix = IsWindows ? "" : "lib";
var LibrarySuffix = IsWindows ? ".lib" : ".a";
Func<string, string> GetLibraryName = name =>
var LibCarlaInstallPath = CarlaInstallPath;
var DependenciesInstallPath = CarlaDependenciesPath;
Func<string, string> GetLibraryName = name =>
{
return LibraryPrefix + name + LibrarySuffix;
};
var LibCarlaInstallPath = CarlaInstallPath;
var DependenciesInstallPath = CarlaDependenciesPath;
Func<string, string, string[]> FindLibraries = (name, pattern) =>
{
var InstallPath = Path.Combine(DependenciesInstallPath, name + "-install");
var LibPath = Path.Combine(InstallPath, "lib");
var Candidates = Directory.GetFiles(LibPath, GetLibraryName(pattern));
Array.Sort(Candidates);
return Candidates;
};
// LibCarla
var LibCarlaIncludePath = Path.Combine(LibCarlaInstallPath, "include");
var LibCarlaLibPath = Path.Combine(LibCarlaInstallPath, "lib");
var LibCarlaServerPath = Path.Combine(LibCarlaLibPath, GetLibraryName("carla-server"));
var LibCarlaClientPath = Path.Combine(LibCarlaLibPath, GetLibraryName("carla-client"));
// Boost
var BoostInstallPath = Path.Combine(DependenciesInstallPath, "boost-install");
var BoostLibPath = Path.Combine(BoostInstallPath, "lib");
var BoostLibraryPatterns = new string[]
{
GetLibraryName("*boost_asio*"),
GetLibraryName("*boost_python*"),
};
var BoostLibraries =
var BoostLibraries =
from Pattern in BoostLibraryPatterns
select FindLibrary(BoostLibPath, Pattern);
// Chrono
var ChronoInstallPath = Path.Combine(DependenciesInstallPath, "chrono-install");
var ChronoLibPath = Path.Combine(ChronoInstallPath, "lib");
var ChronoLibraryNames = new string[]
{
"ChronoEngine",
"ChronoEngine_vehicle",
"ChronoModels_vehicle",
"ChronoModels_robot",
};
var ChronoLibraries =
from Name in ChronoLibraryNames
select FindLibrary(Name);
// SQLite
var SQLiteBuildPath = Path.Combine(DependenciesInstallPath, "sqlite-build");
var SQLiteLibrary = FindLibrary(SQLiteBuildPath, GetLibraryName("sqlite*"));
// RPCLib
var RPCLibInstallPath = Path.Combine(DependenciesInstallPath, "rpclib-install");
var RPCLibPath = Path.Combine(RPCLibInstallPath, "lib");
var RPCLibraryPath = FindLibrary(RPCLibPath, "rpc");
// Xerces-C
var XercesCInstallPath = Path.Combine(DependenciesInstallPath, "xercesc-install");
var XercesCLibPath = Path.Combine(XercesCInstallPath, "lib");
var XercesCLibrary = FindLibrary(XercesCLibPath, "xercesc*");
// Proj
var ProjInstallPath = Path.Combine(DependenciesInstallPath, "proj-install");
var ProjLibPath = Path.Combine(ProjInstallPath, "lib");
var ProjLibrary = FindLibrary(ProjLibPath, "proj*");
// SUMO (OSM2ODR)
var SUMOInstallPath = Path.Combine(DependenciesInstallPath, "sumo-install");
var SUMOLibPath = Path.Combine(SUMOInstallPath, "lib");
var SUMOLibrary = FindLibrary(SUMOLibPath, "sumo*");
// ZLib
var ZLibInstallPath = Path.Combine(DependenciesInstallPath, "zlib-install");
var ZLibLibPath = Path.Combine(ZLibInstallPath, "lib");
var ZLibLibrary = FindLibrary(ZLibLibPath, "zlib*");
from Candidate in FindLibraries("boost", Pattern)
select Candidate;
PublicAdditionalLibraries.AddRange(BoostLibraries);
PublicAdditionalLibraries.AddRange(ChronoLibraries);
var SQLiteBuildPath = Path.Combine(DependenciesInstallPath, "sqlite-build");
var SQLiteLibrary = Directory.GetFiles(SQLiteBuildPath, GetLibraryName("sqlite*"))[0];
PublicAdditionalLibraries.AddRange(BoostLibraries);
PublicAdditionalLibraries.AddRange(new string[]
{
SQLiteLibrary,
RPCLibraryPath,
XercesCLibrary,
ProjLibrary,
SUMOLibrary,
ZLibLibrary,
});
{
SQLiteLibrary,
FindLibraries("rpclib", "rpc")[0],
FindLibraries("xercesc", "xerces-c*")[0],
FindLibraries("proj", "proj")[0],
FindLibraries("sumo", "*osm2odr")[0],
FindLibraries("zlib", "zlib*")[0],
});
if (EnableChrono)
{
// Chrono
var ChronoInstallPath = Path.Combine(DependenciesInstallPath, "chrono-install");
var ChronoLibPath = Path.Combine(ChronoInstallPath, "lib");
var ChronoLibraryNames = new string[]
{
"ChronoEngine",
"ChronoEngine_vehicle",
"ChronoModels_vehicle",
"ChronoModels_robot",
};
var ChronoLibraries =
from Name in ChronoLibraryNames
select FindLibraries(ChronoLibPath, GetLibraryName(Name))[0];
PublicAdditionalLibraries.AddRange(ChronoLibraries);
}
PublicIncludePaths.Add(LibCarlaIncludePath);
@ -228,6 +210,7 @@ public class Carla :
PublicDefinitions.Add("BOOST_DISABLE_ABI_HEADERS");
PublicDefinitions.Add("BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY");
if (!bEnableExceptions)
{
PublicDefinitions.Add("ASIO_NO_EXCEPTIONS");

View File

@ -36,8 +36,12 @@
#include <utility>
#include "carla/rpc/VehicleFailureState.h"
#include "WheeledVehiclePawn.h"
#include "CarlaWheeledVehicle.generated.h"
class UBoxComponent;
UENUM()
@ -69,7 +73,7 @@ enum class EVehicleDoor : uint8 {
/// Base class for CARLA wheeled vehicles.
UCLASS()
class CARLA_API ACarlaWheeledVehicle : public AWheeledVehicle
class CARLA_API ACarlaWheeledVehicle : public AWheeledVehiclePawn
{
GENERATED_BODY()

View File

@ -112,7 +112,7 @@ struct FVehicleNWTransmissionData
};
UCLASS(ClassGroup = (Physics), meta = (BlueprintSpawnableComponent), hidecategories = (PlanarMovement, "Components|Movement|Planar", Activation, "Components|Activation"))
class CARLA_API UWheeledVehicleMovementComponentNW : public UWheeledVehicleMovementComponent
class CARLA_API UWheeledVehicleMovementComponentNW : public UChaosWheeledVehicleMovementComponent
{
GENERATED_UCLASS_BODY()

View File

@ -1,46 +1,44 @@
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "CarlaTools",
"Description": "This plugin provides engine tools for Carla",
"Category": "Other",
"CreatedBy": "Carla Team",
"CreatedByURL": "http://carla.org",
"DocsURL": "http://carla.readthedocs.io",
"MarketplaceURL": "",
"SupportURL": "https://github.com/carla-simulator/carla/issues",
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": true,
"Installed": true,
"Modules": [
{
"Name": "CarlaTools",
"Type": "Editor",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "Carla",
"Enabled": true
},
{
"Name": "EditorScriptingUtilities",
"Enabled": true
},
{
"Name": "ChaosVehicles",
"Enabled": true
},
{
"Name": "ProceduralMeshComponent",
"Enabled": true
},
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "CarlaTools",
"Description": "This plugin provides engine tools for Carla",
"Category": "Other",
"CreatedBy": "Carla Team",
"CreatedByURL": "http://carla.org",
"DocsURL": "http://carla.readthedocs.io",
"MarketplaceURL": "",
"SupportURL": "https://github.com/carla-simulator/carla/issues",
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": true,
"Installed": true,
"Modules":
[
{
"Name": "StreetMap",
"Enabled": true
}
]
"Name": "CarlaTools",
"Type": "Editor",
"LoadingPhase": "Default"
}
],
"Plugins":
[
{
"Name": "Carla",
"Enabled": true
},
{
"Name": "EditorScriptingUtilities",
"Enabled": true
},
{
"Name": "ProceduralMeshComponent",
"Enabled": true
},
{
"Name": "StreetMap",
"Enabled": true
}
]
}

View File

@ -34,7 +34,22 @@ public class CarlaTools :
Array.Sort(Candidates);
return Candidates[0];
}
return null;
string message = "Warning: Could not find any matches in \"";
message += SearchPath;
message += "\" for";
foreach (var Pattern in Patterns)
{
message += " \"";
message += Pattern;
message += "\",";
}
if (Patterns.Length != 0)
message.Remove(message.Length - 1, 1);
message += '.';
Console.WriteLine(message);
return "";
}
public CarlaTools(ReadOnlyTargetRules Target) :
@ -45,20 +60,24 @@ public class CarlaTools :
for (int i = 0; i != 6; ++i)
DirectoryInfo = DirectoryInfo.Parent;
var WorkspacePath = DirectoryInfo.ToString();
Debug.Assert(Directory.Exists(WorkspacePath));
Debug.Assert(WorkspacePath != null && !Directory.Exists(WorkspacePath));
if (CarlaInstallPath == null)
{
Console.WriteLine("-carla-install-path was not specified, inferring...");
Console.WriteLine("\"-carla-install-path\" was not specified, inferring...");
CarlaInstallPath = Path.Combine(WorkspacePath, "Install", "libcarla");
Debug.Assert(Directory.Exists(CarlaInstallPath), "Could not infer CARLA install directory.");
if (!Directory.Exists(CarlaInstallPath))
throw new DirectoryNotFoundException("Could not infer CARLA install directory.");
Console.WriteLine("Using \"" + CarlaInstallPath + "\" as the CARLA install path.");
}
if (CarlaDependenciesPath == null)
{
Console.WriteLine("-carla-dependencies-path was not specified, inferring...");
Console.WriteLine("\"-carla-dependencies-path\" was not specified, inferring...");
CarlaDependenciesPath = Path.Combine(WorkspacePath, "Build", "Dependencies");
Debug.Assert(Directory.Exists(CarlaDependenciesPath), "Could not infer CARLA dependencies directory.");
if (!Directory.Exists(CarlaDependenciesPath))
throw new DirectoryNotFoundException("Could not infer CARLA dependencies directory.");
Console.WriteLine("Using \"" + CarlaDependenciesPath + "\" as the CARLA depenencies install path.");
}
bEnableExceptions = bEnableExceptions || IsWindows;
@ -130,21 +149,29 @@ public class CarlaTools :
var LibraryPrefix = IsWindows ? "" : "lib";
var LibrarySuffix = IsWindows ? ".lib" : ".a";
var LibCarlaInstallPath = CarlaInstallPath;
var DependenciesInstallPath = CarlaDependenciesPath;
Func<string, string> GetLibraryName = name =>
{
return LibraryPrefix + name + LibrarySuffix;
};
var LibCarlaInstallPath = CarlaInstallPath;
var DependenciesInstallPath = CarlaDependenciesPath;
Func<string, string, string[]> FindLibraries = (name, pattern) =>
{
var InstallPath = Path.Combine(DependenciesInstallPath, name + "-install");
var LibPath = Path.Combine(InstallPath, "lib");
var Candidates = Directory.GetFiles(LibPath, GetLibraryName(pattern));
Array.Sort(Candidates);
return Candidates;
};
// LibCarla
var LibCarlaIncludePath = Path.Combine(LibCarlaInstallPath, "include");
var LibCarlaLibPath = Path.Combine(LibCarlaInstallPath, "lib");
var LibCarlaServerPath = Path.Combine(LibCarlaLibPath, GetLibraryName("carla-server"));
var LibCarlaClientPath = Path.Combine(LibCarlaLibPath, GetLibraryName("carla-client"));
// Boost
var BoostInstallPath = Path.Combine(DependenciesInstallPath, "boost-install");
var BoostLibPath = Path.Combine(BoostInstallPath, "lib");
var BoostLibraryPatterns = new string[]
{
GetLibraryName("*boost_asio*"),
@ -152,59 +179,39 @@ public class CarlaTools :
};
var BoostLibraries =
from Pattern in BoostLibraryPatterns
select FindLibrary(BoostLibPath, Pattern);
// Chrono
var ChronoInstallPath = Path.Combine(DependenciesInstallPath, "chrono-install");
var ChronoLibPath = Path.Combine(ChronoInstallPath, "lib");
var ChronoLibraryNames = new string[]
{
"ChronoEngine",
"ChronoEngine_vehicle",
"ChronoModels_vehicle",
"ChronoModels_robot",
};
var ChronoLibraries =
from Name in ChronoLibraryNames
select FindLibrary(Name);
// SQLite
from Candidate in FindLibraries("boost", Pattern)
select Candidate;
var SQLiteBuildPath = Path.Combine(DependenciesInstallPath, "sqlite-build");
var SQLiteLibrary = FindLibrary(SQLiteBuildPath, GetLibraryName("sqlite*"));
// RPCLib
var RPCLibInstallPath = Path.Combine(DependenciesInstallPath, "rpclib-install");
var RPCLibPath = Path.Combine(RPCLibInstallPath, "lib");
var RPCLibraryPath = FindLibrary(RPCLibPath, "rpc");
// Xerces-C
var XercesCInstallPath = Path.Combine(DependenciesInstallPath, "xercesc-install");
var XercesCLibPath = Path.Combine(XercesCInstallPath, "lib");
var XercesCLibrary = FindLibrary(XercesCLibPath, "xercesc*");
// Proj
var ProjInstallPath = Path.Combine(DependenciesInstallPath, "proj-install");
var ProjLibPath = Path.Combine(ProjInstallPath, "lib");
var ProjLibrary = FindLibrary(ProjLibPath, "proj*");
// SUMO (OSM2ODR)
var SUMOInstallPath = Path.Combine(DependenciesInstallPath, "sumo-install");
var SUMOLibPath = Path.Combine(SUMOInstallPath, "lib");
var SUMOLibrary = FindLibrary(SUMOLibPath, "sumo*");
// ZLib
var ZLibInstallPath = Path.Combine(DependenciesInstallPath, "zlib-install");
var ZLibLibPath = Path.Combine(ZLibInstallPath, "lib");
var ZLibLibrary = FindLibrary(ZLibLibPath, "zlib*");
var SQLiteLibrary = Directory.GetFiles(SQLiteBuildPath, GetLibraryName("sqlite*"))[0];
PublicAdditionalLibraries.Add(LibCarlaServerPath);
PublicAdditionalLibraries.Add(LibCarlaClientPath);
PublicAdditionalLibraries.Add(RPCLibraryPath);
PublicAdditionalLibraries.AddRange(BoostLibraries);
PublicIncludePaths.Add(LibCarlaIncludePath);
PublicAdditionalLibraries.AddRange(BoostLibraries);
PublicAdditionalLibraries.AddRange(new string[]
{
SQLiteLibrary,
FindLibraries("rpclib", "rpc")[0],
FindLibraries("xercesc", "xerces-c*")[0],
FindLibraries("proj", "proj")[0],
FindLibraries("sumo", "*osm2odr")[0],
FindLibraries("zlib", "zlib*")[0],
});
PublicDefinitions.Add("BOOST_DISABLE_ABI_HEADERS");
PublicIncludePaths.Add(LibCarlaIncludePath);
PrivateIncludePaths.Add(LibCarlaIncludePath);
PublicDefinitions.Add("BOOST_DISABLE_ABI_HEADERS");
PublicDefinitions.Add("BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY");
if (!bEnableExceptions)
{
PublicDefinitions.Add("ASIO_NO_EXCEPTIONS");
PublicDefinitions.Add("BOOST_NO_EXCEPTIONS");
PublicDefinitions.Add("PUGIXML_NO_EXCEPTIONS");
PublicDefinitions.Add("LIBCARLA_NO_EXCEPTIONS");
PublicDefinitions.Add("PUGIXML_NO_EXCEPTIONS");
}
if (EnableHoudini)
PublicDefinitions.Add("CARLA_HOUDINI_ENABLED");
}
}

View File

@ -4,6 +4,7 @@
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#ifdef CARLA_HOUDINI_ENABLED
#include "HoudiniImportNodeWrapper.h"
#include "HoudiniAsset.h"
@ -83,3 +84,4 @@ void UHoudiniImportNodeWrapper::HandleFailed(
}
RemoveFromRoot();
}
#endif

View File

@ -5,12 +5,10 @@
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#ifdef CARLA_HOUDINI_ENABLED
#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "HoudiniPublicAPIProcessHDANode.h"
#include "HoudiniImportNodeWrapper.generated.h"
// Delegate type for output pins on the node.
@ -63,3 +61,4 @@ private:
UHoudiniPublicAPIProcessHDANode* HDANode;
};
#endif

View File

@ -16,13 +16,13 @@ struct FWheelTemplates
{
GENERATED_BODY()
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="USD Wheel")
TSubclassOf<UVehicleWheel> WheelFR;
TSubclassOf<UChaosVehicleWheel> WheelFR;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="USD Wheel")
TSubclassOf<UVehicleWheel> WheelFL;
TSubclassOf<UChaosVehicleWheel> WheelFL;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="USD Wheel")
TSubclassOf<UVehicleWheel> WheelRR;
TSubclassOf<UChaosVehicleWheel> WheelRR;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="USD Wheel")
TSubclassOf<UVehicleWheel> WheelRL;
TSubclassOf<UChaosVehicleWheel> WheelRL;
};
USTRUCT(BlueprintType)

View File

@ -1,13 +1,10 @@
// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
using System.Collections.Generic;
using System;
using System.IO;
using EpicGames.Core;
public class CarlaUE4Target :
TargetRules
public class CarlaUE4Target : TargetRules
{
[CommandLine("-unity-build")]
bool EnableUnityBuild = false;

View File

@ -1,13 +1,10 @@
// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
using System.Collections.Generic;
using System;
using System.IO;
using EpicGames.Core;
public class CarlaUE4EditorTarget :
TargetRules
public class CarlaUE4EditorTarget : TargetRules
{
[CommandLine("-unity-build")]
bool EnableUnityBuild = false;