Merge branch 'development' into Atom/mriegger/directionallightbias

Signed-off-by: mrieggeramzn <mriegger@amazon.com>
This commit is contained in:
mrieggeramzn
2021-10-15 12:46:58 -07:00
537 changed files with 11979 additions and 8622 deletions
-13
View File
@@ -1,18 +1,5 @@
<settings>
<r_PostProcessEffects value="1"/>
<r_HDREyeAdaptationSpeed value="100000000"/>
<r_MotionBlur value="0"/>
<e_ScreenShotQuality value="0"/>
<e_ViewDistRatio value="100000000"/>
<r_DisplayInfo value="0"/>
<e_StreamCgfPoolSize value="128" />
<e_ViewDistRatioVegetation value="100"/>
<e_Lods value="0"/>
<e_Vegetation value="0"/>
<e_TerrainOcclusionCulling value="0"/>
<e_OcclusionVolumes value="0"/>
<e_shadows value="0"/>
<e_portals value="3"/>
<e_fog value="0"/>
<r_hdrdebug value="0"/>
</settings>
-2
View File
@@ -7,8 +7,6 @@
<Tool Title="| Draw Helpers" Command="p_draw_helpers" EditorCmd="" ToggleVar="1"/>
<Tool Title="| AI Debug Draw" Command="ai_DebugDraw" EditorCmd="" ToggleVar="1"/>
<Tool Title="| Toggle Music" Command="s_MusicEnable" EditorCmd="" ToggleVar="1"/>
<Tool Title="| Toggle Sound" Command="s_SoundEnable" EditorCmd="" ToggleVar="1"/>
<Tool Title="| Toggle ForcefeedBack" Command="i_forcefeedback" EditorCmd="" ToggleVar="1"/>
<Tool Title="| Freeze Camera " Command="e_CameraFreeze" EditorCmd="" ToggleVar="1"/>
<Tool Title="| Log Verbosity 0" Command="log_Verbosity 0" EditorCmd="" ToggleVar="0"/>
<Tool Title="| SaveLevelStats" Command="savelevelstats" EditorCmd="" ToggleVar="0"/>
-11
View File
@@ -1,16 +1,5 @@
ConsoleHide
g_godMode=1
sys_warnings=0
con_showonload=1
i_forcefeedback=0
g_infiniteammo=1
e_ObjectLayersActivation=0
e_ObjectLayersActivationPhysics=0
g_flashrenderingduringloading=0
sys_maxfps=0
r_vsync=0
p_max_substeps=1
demo_file=autotest
demo_num_runs=0
demo_quit=1
demo_ai=1
-10
View File
@@ -1,15 +1,5 @@
ConsoleHide
g_godMode=1
g_infiniteammo=1
r_displayinfo=1
s_profiling=1
sys_maxfps=0
e_ObjectLayersActivation=0
e_ObjectLayersActivationPhysics=0
demo_file=autotest
demo_num_runs=2
demo_quit=1
demo_savestats=1
demo_profile=-1
demo
+1 -8
View File
@@ -1,12 +1,5 @@
ConsoleHide
g_godMode=1
g_infiniteammo=1
r_displayinfo=1
s_profiling=1
sys_maxfps=0
demo_file=playthru
demo_num_runs=2
demo_quit=1
demo_savestats=1
demo_profile=-1
demo
demo
@@ -11,113 +11,16 @@
; default of this CVarGroup
= 7
sys_spec_ObjectDetail=7
sys_spec_Shading=7
sys_spec_VolumetricEffects=7
sys_spec_Shadows=7
sys_spec_Texture=7
sys_spec_Physics=7
sys_spec_PostProcessing=7
sys_spec_Particles=7
sys_spec_Sound=7
sys_spec_Water=7
sys_spec_GameEffects=7
sys_spec_light=7
[1]
sys_spec_ObjectDetail=1
sys_spec_Shading=1
sys_spec_VolumetricEffects=1
sys_spec_Shadows=1
sys_spec_Texture=1
sys_spec_Physics=1
sys_spec_PostProcessing=1
sys_spec_Particles=1
sys_spec_Sound=1
sys_spec_Water=1
sys_spec_GameEffects=1
sys_spec_light=1
[2]
sys_spec_ObjectDetail=2
sys_spec_Shading=2
sys_spec_VolumetricEffects=2
sys_spec_Shadows=2
sys_spec_Texture=2
sys_spec_Physics=2
sys_spec_PostProcessing=2
sys_spec_Particles=2
sys_spec_Sound=2
sys_spec_Water=2
sys_spec_GameEffects=2
sys_spec_light=2
[3]
sys_spec_ObjectDetail=3
sys_spec_Shading=3
sys_spec_VolumetricEffects=3
sys_spec_Shadows=3
sys_spec_Texture=3
sys_spec_Physics=3
sys_spec_PostProcessing=3
sys_spec_Particles=3
sys_spec_Sound=3
sys_spec_Water=3
sys_spec_GameEffects=3
sys_spec_light=3
[4]
sys_spec_ObjectDetail=4
sys_spec_Shading=4
sys_spec_VolumetricEffects=4
sys_spec_Shadows=4
sys_spec_Texture=4
sys_spec_Physics=4
sys_spec_PostProcessing=4
sys_spec_Particles=4
sys_spec_Sound=4
sys_spec_Water=4
sys_spec_GameEffects=4
sys_spec_light=4
[5]
sys_spec_ObjectDetail=5
sys_spec_Shading=5
sys_spec_VolumetricEffects=5
sys_spec_Shadows=5
sys_spec_Texture=5
sys_spec_Physics=5
sys_spec_PostProcessing=5
sys_spec_Particles=5
sys_spec_Sound=5
sys_spec_Water=5
sys_spec_GameEffects=5
sys_spec_light=5
[6]
sys_spec_ObjectDetail=6
sys_spec_Shading=6
sys_spec_VolumetricEffects=6
sys_spec_Shadows=6
sys_spec_Texture=6
sys_spec_Physics=6
sys_spec_PostProcessing=6
sys_spec_Particles=6
sys_spec_Sound=6
sys_spec_Water=6
sys_spec_GameEffects=6
sys_spec_light=6
[8]
sys_spec_ObjectDetail=8
sys_spec_Shading=8
sys_spec_VolumetricEffects=8
sys_spec_Shadows=8
sys_spec_Texture=8
sys_spec_Physics=8
sys_spec_PostProcessing=8
sys_spec_Particles=8
sys_spec_Sound=8
sys_spec_Water=8
sys_spec_GameEffects=8
sys_spec_light=8
@@ -1,8 +0,0 @@
[default]
; default of this CVarGroup
= 7
mfx_Timeout = 0.01
@@ -1,160 +0,0 @@
[default]
; default of this CVarGroup
= 7
ca_AttachmentCullingRation=360
es_DebrisLifetimeScale=1
e_CoverageBufferReproj=6
e_DecalsAllowGameDecals=1
e_DecalsLifeTimeScale=2
e_DecalsOverlapping=1
e_Dissolve=2
e_LightQuality=3
e_LodMin=0
e_LodRatio=20
e_MaxViewDistSpecLerp=1
e_MergedMeshesInstanceDist=1.0
e_MergedMeshesPool=8192
e_ObjQuality=3
e_OcclusionCullingViewDistRatio=1
e_ProcVegetation=1
e_StatObjBufferRenderTasks=1
e_StreamCgf=0
e_TerrainLodRatio=1
e_TerrainOcclusionCullingMaxDist=200
e_Tessellation=0
e_VegetationMinSize=0
e_ViewDistMin=10
e_ViewDistRatio=100
e_ViewDistRatioCustom=100
e_ViewDistRatioDetail=100
e_ViewDistRatioLights=50
e_ViewDistRatioVegetation=100
r_DrawNearZRange=0.12
r_FlaresTessellationRatio=1
r_SilhouettePOM=0
r_usezpass=2
[1]
ca_AttachmentCullingRation=145
es_DebrisLifetimeScale=0.6
e_DecalsLifeTimeScale=1
e_Dissolve=0
e_LightQuality=1
e_LodRatio=10
e_MaxViewDistSpecLerp=0.5
e_ObjQuality=1
e_TerrainOcclusionCullingMaxDist=130
e_VegetationMinSize=0.5
e_ViewDistRatioCustom=60
e_ViewDistRatioDetail=25
e_ViewDistRatioLights=25
e_ViewDistRatioVegetation=21
r_FlaresTessellationRatio=0.25
r_usezpass=1
e_ProcVegetation=0
e_ViewDistRatio=50
[2]
ca_AttachmentCullingRation=145
es_DebrisLifetimeScale=0.6
e_DecalsLifeTimeScale=1
e_Dissolve=0
e_LightQuality=2
e_LodRatio=10
e_MaxViewDistSpecLerp=0.5
e_ObjQuality=2
e_TerrainOcclusionCullingMaxDist=130
e_VegetationMinSize=0.5
e_ViewDistRatioCustom=60
e_ViewDistRatioDetail=25
e_ViewDistRatioLights=25
e_ViewDistRatioVegetation=50
r_FlaresTessellationRatio=0.25
r_usezpass=1
e_ProcVegetation=1
e_ViewDistRatio=50
[3]
ca_AttachmentCullingRation=145
es_DebrisLifetimeScale=0.6
e_DecalsLifeTimeScale=1
e_Dissolve=0
e_LightQuality=3
e_LodRatio=10
e_MaxViewDistSpecLerp=0.5
e_ObjQuality=3
e_TerrainOcclusionCullingMaxDist=130
e_VegetationMinSize=0.5
e_ViewDistRatioCustom=60
e_ViewDistRatioDetail=25
e_ViewDistRatioLights=25
e_ViewDistRatioVegetation=50
r_FlaresTessellationRatio=0.25
r_usezpass=1
e_ProcVegetation=1
e_ViewDistRatio=75
[4]
ca_AttachmentCullingRation=145
es_DebrisLifetimeScale=0.6
e_DecalsLifeTimeScale=1
e_Dissolve=0
e_LightQuality=4
e_LodRatio=10
e_MaxViewDistSpecLerp=0.5
e_ObjQuality=4
e_TerrainOcclusionCullingMaxDist=130
e_VegetationMinSize=0.5
e_ViewDistRatioCustom=60
e_ViewDistRatioDetail=25
e_ViewDistRatioLights=25
e_ViewDistRatioVegetation=50
r_FlaresTessellationRatio=0.25
r_usezpass=1
e_ProcVegetation=1
e_ViewDistRatio=75
[5]
ca_AttachmentCullingRation=145
es_DebrisLifetimeScale=0.6
e_DecalsLifeTimeScale=1
e_LightQuality=1
e_LodRatio=10
e_MaxViewDistSpecLerp=0.5
e_ObjQuality=1
e_TerrainOcclusionCullingMaxDist=130
e_VegetationMinSize=0.5
e_ViewDistRatio=50
e_ViewDistRatioCustom=60
e_ViewDistRatioDetail=25
e_ViewDistRatioLights=25
e_ViewDistRatioVegetation=50
r_FlaresTessellationRatio=0.25
[6]
ca_AttachmentCullingRation=300
es_DebrisLifetimeScale=0.8
e_LightQuality=2
e_LodRatio=15
e_ObjQuality=2
e_ViewDistRatio=75
e_ViewDistRatioDetail=35
e_ViewDistRatioVegetation=75
[8]
ca_AttachmentCullingRation=400
e_LightQuality=4
e_LodRatio=40
e_MergedMeshesInstanceDist=2.0
e_MergedMeshesPool=16384
e_ObjQuality=4
e_TerrainLodRatio=0.5
e_Tessellation=1
e_ViewDistRatio=125
e_ViewDistRatioCustom=125
e_ViewDistRatioDetail=125
e_ViewDistRatioLights=75
e_ViewDistRatioVegetation=125
r_DrawNearZRange = 0.08
r_SilhouettePOM=1
@@ -1,94 +0,0 @@
[default]
; default of this CVarGroup
= 7
e_ParticlesGI=1
e_ParticlesPreload=0
e_ParticlesMaxScreenFill=128
e_ParticlesMinDrawPixels=1
e_ParticlesMotionBlur=0
e_ParticlesObjectCollisions=2
e_ParticlesQuality=3
e_ParticlesSortQuality=0
e_ParticlesPoolSize=16384
r_ParticlesHalfRes=0
r_ParticlesTessellation=1
r_ParticlesInstanceVertices=1
r_ParticlesGpuMaxEmitCount=10000
[1]
e_ParticlesGI=0
e_ParticlesPreload=1
e_ParticlesMaxScreenFill=16
e_ParticlesMinDrawPixels=2
e_ParticlesObjectCollisions=1
e_ParticlesQuality=2
e_ParticlesPoolSize=4096
r_ParticlesHalfRes=1
r_ParticlesTessellation=0
r_ParticlesInstanceVertices=0
r_ParticlesGpuMaxEmitCount=10
[2]
e_ParticlesGI=0
e_ParticlesPreload=1
e_ParticlesMaxScreenFill=16
e_ParticlesMinDrawPixels=2
e_ParticlesObjectCollisions=1
e_ParticlesQuality=2
e_ParticlesPoolSize=4096
r_ParticlesHalfRes=1
r_ParticlesTessellation=0
r_ParticlesInstanceVertices=0
r_ParticlesGpuMaxEmitCount=100
[3]
e_ParticlesGI=0
e_ParticlesPreload=1
e_ParticlesMaxScreenFill=16
e_ParticlesMinDrawPixels=2
e_ParticlesObjectCollisions=1
e_ParticlesQuality=2
e_ParticlesPoolSize=4096
r_ParticlesHalfRes=1
r_ParticlesTessellation=0
r_ParticlesInstanceVertices=0
r_ParticlesGpuMaxEmitCount=500
[4]
e_ParticlesGI=0
e_ParticlesPreload=1
e_ParticlesMaxScreenFill=16
e_ParticlesMinDrawPixels=2
e_ParticlesObjectCollisions=1
e_ParticlesQuality=2
e_ParticlesPoolSize=4096
r_ParticlesHalfRes=1
r_ParticlesTessellation=0
r_ParticlesInstanceVertices=0
r_ParticlesGpuMaxEmitCount=1000
[5]
e_ParticlesMaxScreenFill=32
e_ParticlesMinDrawPixels=1.5
e_ParticlesObjectCollisions=1
e_ParticlesQuality=1
r_ParticlesHalfRes=1
r_ParticlesTessellation=0
r_ParticlesGpuMaxEmitCount=3000
[6]
e_ParticlesMaxScreenFill=64
e_ParticlesObjectCollisions=1
e_ParticlesQuality=2
r_ParticlesGpuMaxEmitCount=5000
[8]
e_ParticlesMaxScreenFill=160
e_ParticlesMotionBlur=1
e_ParticlesQuality=4
r_ParticlesGpuMaxEmitCount=1048576
@@ -1,100 +0,0 @@
[default]
; default of this CVarGroup
= 7
es_MaxPhysDist=100
es_MaxPhysDistInvisible=25
e_CullVegActivation=50
e_FoliageWindActivationDist=25
e_PhysMinCellSize=4
e_PhysOceanCell=0.5
e_PhysProxyTriLimit=10000
g_breakage_mem_limit=0
g_breakage_particles_limit=160
g_no_secondary_breaking=0
g_tree_cut_reuse_dist=0
p_gravity_z=-13
p_max_entity_cells=300000
p_max_MC_iters=6000
p_max_object_splashes=3
p_max_substeps=5
p_max_substeps_large_group=5
p_num_bodies_large_group=100
p_splash_dist0=7
p_splash_dist1=30
p_splash_force0=10
p_splash_force1=100
p_splash_vel0=4.5
p_splash_vel1=10
v_vehicle_quality=4
[1]
es_MaxPhysDistInvisible=15
e_CullVegActivation=30
e_FoliageWindActivationDist=10
e_PhysMinCellSize=16
e_PhysOceanCell=1
g_breakage_mem_limit=2000
g_breakage_particles_limit=40
g_no_secondary_breaking=1
g_tree_cut_reuse_dist=1
p_max_entity_cells=75000
p_max_MC_iters=2000
p_max_substeps=2
[2]
es_MaxPhysDistInvisible=15
e_CullVegActivation=30
e_FoliageWindActivationDist=10
e_PhysMinCellSize=16
e_PhysOceanCell=1
g_breakage_mem_limit=2000
g_breakage_particles_limit=40
g_no_secondary_breaking=1
g_tree_cut_reuse_dist=1
p_max_entity_cells=75000
p_max_MC_iters=2000
p_max_substeps=2
[3]
es_MaxPhysDistInvisible=15
e_CullVegActivation=30
e_FoliageWindActivationDist=10
e_PhysMinCellSize=16
e_PhysOceanCell=1
g_breakage_mem_limit=2000
g_breakage_particles_limit=40
g_no_secondary_breaking=1
g_tree_cut_reuse_dist=1
p_max_entity_cells=75000
p_max_MC_iters=2000
p_max_substeps=2
[4]
es_MaxPhysDistInvisible=15
e_CullVegActivation=30
e_FoliageWindActivationDist=10
e_PhysMinCellSize=16
e_PhysOceanCell=1
g_breakage_mem_limit=2000
g_breakage_particles_limit=40
g_no_secondary_breaking=1
g_tree_cut_reuse_dist=1
p_max_entity_cells=75000
p_max_MC_iters=2000
p_max_substeps=2
[5]
es_MaxPhysDist=50
es_MaxPhysDistInvisible=15
e_CullVegActivation=30
e_FoliageWindActivationDist=10
e_PhysOceanCell=1
g_breakage_particles_limit=80
g_tree_cut_reuse_dist=0.35
p_max_MC_iters=4000
p_max_substeps=2
[6]
[8]
@@ -1,114 +0,0 @@
[default]
; default of this CVarGroup
= 7
r_PostProcessEffects=1
q_ShaderHDR=2
q_ShaderPostProcess=2
r_ChromaticAberration=0
r_ColorGradingChartsCache=0
r_DepthOfField=2
r_Flares=1
r_HDRBloomQuality=2
r_MotionBlur=2
r_MotionBlurMaxViewDist=100000
r_MotionBlurQuality=1
r_MotionBlurShutterSpeed=125
r_Rain=2
r_RainMaxViewDist_Deferred=150
r_Sharpening=0
r_Snow=2
r_SunShafts=2
r_TranspDepthFixup=1
r_ToneMapTechnique=0
r_ToneMapExposureType=0
r_HDRBloom=1
r_ColorGrading=1
r_ColorSpace=0
[1]
q_ShaderHDR=1
q_ShaderPostProcess=1
r_ColorGrading=0
r_DepthOfField=0
r_Flares=0
r_HDRBloom=0
r_HDRBloomQuality=0
r_MotionBlur=0
r_MotionBlurMaxViewDist=16
r_MotionBlurQuality=0
r_Rain=1
r_RainMaxViewDist_Deferred=40
r_Snow=1
r_SunShafts=0
r_TranspDepthFixup=0
r_ToneMapTechnique=3
r_ToneMapExposureType=1
r_ColorSpace=2
[2]
q_ShaderHDR=1
q_ShaderPostProcess=1
r_ColorGradingChartsCache=4
r_DepthOfField=1
r_Flares=0
r_HDRBloomQuality=0
r_MotionBlur=0
r_MotionBlurMaxViewDist=16
r_MotionBlurQuality=0
r_Rain=1
r_RainMaxViewDist_Deferred=40
r_Snow=1
r_SunShafts=1
r_TranspDepthFixup=0
[3]
q_ShaderHDR=1
q_ShaderPostProcess=2
r_ColorGradingChartsCache=4
r_DepthOfField=1
r_HDRBloomQuality=1
r_MotionBlur=0
r_MotionBlurMaxViewDist=16
r_MotionBlurQuality=0
r_Rain=1
r_RainMaxViewDist_Deferred=40
r_Snow=1
r_SunShafts=1
r_TranspDepthFixup=0
[4]
q_ShaderHDR=1
q_ShaderPostProcess=2
r_ColorGradingChartsCache=4
r_DepthOfField=1
r_HDRBloomQuality=1
r_MotionBlur=0
r_MotionBlurMaxViewDist=16
r_MotionBlurQuality=0
r_Rain=1
r_RainMaxViewDist_Deferred=40
r_Snow=1
r_SunShafts=1
r_TranspDepthFixup=0
[5]
q_ShaderHDR=1
q_ShaderPostProcess=1
r_ColorGradingChartsCache=4
r_MotionBlurMaxViewDist=16
r_MotionBlurQuality=0
r_RainMaxViewDist_Deferred=40
r_TranspDepthFixup=0
[6]
q_ShaderHDR=1
q_ShaderPostProcess=1
r_RainMaxViewDist_Deferred=100
[8]
q_ShaderHDR=3
q_ShaderPostProcess=3
r_MotionBlurQuality=2
@@ -1,98 +0,0 @@
[default]
; default of this CVarGroup
= 7
q_ShaderGeneral=2
q_ShaderMetal=2
q_ShaderGlass=2
q_ShaderVegetation=2
q_ShaderIce=2
q_ShaderTerrain=2
q_ShaderShadow=2
q_ShaderFX=2
q_ShaderSky=2
q_Renderer=2
[1]
q_ShaderGeneral=1
q_ShaderMetal=1
q_ShaderGlass=1
q_ShaderVegetation=1
q_ShaderIce=1
q_ShaderTerrain=1
q_ShaderShadow=1
q_ShaderFX=1
q_ShaderSky=1
q_Renderer=1
[2]
q_ShaderGeneral=1
q_ShaderMetal=1
q_ShaderGlass=1
q_ShaderVegetation=1
q_ShaderIce=1
q_ShaderTerrain=1
q_ShaderShadow=1
q_ShaderFX=1
q_ShaderSky=1
q_Renderer=1
[3]
q_ShaderGeneral=1
q_ShaderMetal=1
q_ShaderGlass=1
q_ShaderVegetation=1
q_ShaderIce=1
q_ShaderTerrain=1
q_ShaderShadow=1
q_ShaderFX=1
q_ShaderSky=1
q_Renderer=2
[4]
q_ShaderGeneral=1
q_ShaderMetal=1
q_ShaderGlass=1
q_ShaderVegetation=1
q_ShaderIce=1
q_ShaderTerrain=1
q_ShaderShadow=1
q_ShaderFX=1
q_ShaderSky=1
q_Renderer=2
[5]
q_ShaderGeneral=1
q_ShaderMetal=1
q_ShaderGlass=1
q_ShaderVegetation=1
q_ShaderIce=1
q_ShaderTerrain=1
q_ShaderShadow=1
q_ShaderFX=1
q_ShaderSky=1
q_Renderer=1
[6]
q_ShaderGeneral=1
q_ShaderMetal=1
q_ShaderGlass=1
q_ShaderVegetation=1
q_ShaderIce=1
q_ShaderTerrain=1
q_ShaderShadow=1
q_ShaderFX=1
q_ShaderSky=1
q_Renderer=1
[8]
q_ShaderGeneral=3
q_ShaderMetal=3
q_ShaderGlass=3
q_ShaderVegetation=3
q_ShaderIce=3
q_ShaderTerrain=3
q_ShaderShadow=3
q_ShaderFX=3
q_ShaderSky=3
q_Renderer=3
@@ -1,120 +0,0 @@
[default]
; default of this CVarGroup
= 7
e_CacheNearestCubePicking=1
e_DynamicLightsMaxEntityLights=16
e_GI=1
e_LightVolumes=1
e_SkyUpdateRate=1
e_TerrainAo=0
e_VegetationUseTerrainColor=1
r_DeferredShadingDepthBoundsTest=1
r_DeferredShadingTiled=2
r_DeferredShadingTiledHairQuality=1
r_deferredShadingFilterGBuffer=0
r_DeferredShadingSSS=1
r_AntialiasingMode=3
r_DetailDistance=8
r_EnvTexUpdateInterval=0.05
r_Refraction=1
r_RefractionPartialResolves=2
r_ssdo=1
r_ssdoHalfRes=2
r_ssdoColorBleeding=1
r_SSReflections=1
r_SSReflHalfRes=1
r_VisAreaClipLightsPerPixel=1
sys_spec_Quality=7
[1]
e_DynamicLightsMaxEntityLights=2
e_GI=0
e_SkyUpdateRate=0.5
e_VegetationUseTerrainColor=0
r_DeferredShadingTiled=0
r_DeferredShadingTiledHairQuality=0
r_DeferredShadingSSS=0
r_AntialiasingMode=0
r_DetailDistance=4
r_EnvTexUpdateInterval=0.075
r_Refraction=0
r_RefractionPartialResolves=0
r_ssdo=0
r_ssdoHalfRes=1
r_ssdoColorBleeding=0
r_SSReflections=0
sys_spec_Quality=1
[2]
e_DynamicLightsMaxEntityLights=2
e_GI=0
e_SkyUpdateRate=0.5
e_VegetationUseTerrainColor=0
r_DeferredShadingTiled=0
r_DeferredShadingTiledHairQuality=0
r_DeferredShadingSSS=0
r_AntialiasingMode=0
r_DetailDistance=4
r_EnvTexUpdateInterval=0.075
r_RefractionPartialResolves=0
r_ssdo=0
r_ssdoHalfRes=1
r_ssdoColorBleeding=0
r_SSReflections=0
sys_spec_Quality=2
[3]
e_DynamicLightsMaxEntityLights=2
e_GI=0
e_SkyUpdateRate=0.5
e_VegetationUseTerrainColor=0
r_DeferredShadingTiled=0
r_DeferredShadingTiledHairQuality=0
r_DeferredShadingSSS=0
r_AntialiasingMode=0
r_DetailDistance=4
r_EnvTexUpdateInterval=0.075
r_RefractionPartialResolves=0
r_ssdo=0
r_ssdoColorBleeding=0
r_SSReflections=0
sys_spec_Quality=3
[4]
e_DynamicLightsMaxEntityLights=2
e_GI=0
e_SkyUpdateRate=0.5
e_VegetationUseTerrainColor=0
r_DeferredShadingTiled=0
r_DeferredShadingTiledHairQuality=0
r_DeferredShadingSSS=0
r_AntialiasingMode=0
r_DetailDistance=4
r_EnvTexUpdateInterval=0.075
r_RefractionPartialResolves=0
r_ssdo=1
r_ssdoHalfRes=1
r_ssdoColorBleeding=0
r_SSReflections=0
sys_spec_Quality=4
[5]
e_DynamicLightsMaxEntityLights=7
e_GI=0
e_SkyUpdateRate=0.5
r_DetailDistance=4
r_EnvTexUpdateInterval=0.075
r_SSReflections=0
r_DeferredShadingTiledHairQuality=0
r_DeferredShadingSSS=0
sys_spec_Quality=5
[6]
e_DynamicLightsMaxEntityLights=11
sys_spec_Quality=6
[8]
r_DeferredShadingTiledHairQuality=2
r_SSReflHalfRes=0
sys_spec_Quality=8
@@ -1,116 +0,0 @@
[default]
; default of this CVarGroup
= 7
e_GsmLodsNum=5
e_GsmRange=3
e_ParticlesShadows=1
e_Shadows=1
e_ShadowsBlendCascades=1
e_ShadowsClouds=1
e_ShadowsCastViewDistRatio=1
e_ShadowsLodBiasFixed=0
e_ShadowsMaxTexRes=1024
e_ShadowsOnAlphaBlend=0
e_ShadowsPoolSize=4096
e_ShadowsResScale=4
e_ShadowsTessellateCascades=1
e_ShadowsTessellateDLights=0
e_ShadowsUpdateViewDistRatio=256
r_DrawNearShadows=1
r_FogShadows=2
r_FogShadowsWater=0
r_ShadowJittering=2.5
r_ShadowPoolMaxFrames=30
r_ShadowPoolMaxTimeslicedUpdatesPerFrame=100
r_ShadowsPCFiltering=1
r_ShadowsCache=4
r_ShadowsCacheFormat=1
r_ShadowsCacheResolutions=6324,4214
r_ShadowsUseClipVolume=1
e_ObjShadowCastSpec=3
[1]
e_GsmLodsNum=3
e_ParticlesShadows=0
e_ShadowsBlendCascades=0
e_ShadowsCastViewDistRatio=0.8
e_ShadowsLodBiasFixed=1
e_ShadowsMaxTexRes=512
r_DrawNearShadows=0
r_FogShadows=0
r_ShadowJittering=0
r_ShadowsCacheFormat=0
r_ShadowsCacheResolutions=3162,2107
e_ObjShadowCastSpec=1
e_ShadowsPoolSize=1024
[2]
e_GsmLodsNum=4
e_ParticlesShadows=0
e_ShadowsBlendCascades=0
e_ShadowsCastViewDistRatio=0.8
e_ShadowsLodBiasFixed=1
e_ShadowsMaxTexRes=512
r_DrawNearShadows=0
r_FogShadows=0
r_ShadowJittering=0
r_ShadowsCacheFormat=0
r_ShadowsCacheResolutions=3162,2107
e_ObjShadowCastSpec=1
e_ShadowsPoolSize=1024
[3]
e_GsmLodsNum=4
e_ParticlesShadows=0
e_ShadowsBlendCascades=0
e_ShadowsCastViewDistRatio=0.8
e_ShadowsLodBiasFixed=1
e_ShadowsMaxTexRes=512
r_DrawNearShadows=0
r_FogShadows=0
r_ShadowJittering=0
r_ShadowsCacheFormat=0
r_ShadowsCacheResolutions=3162,2107
e_ObjShadowCastSpec=1
e_ShadowsPoolSize=1024
[4]
e_GsmLodsNum=4
e_ParticlesShadows=0
e_ShadowsBlendCascades=0
e_ShadowsCastViewDistRatio=0.8
e_ShadowsLodBiasFixed=1
e_ShadowsMaxTexRes=512
r_DrawNearShadows=0
r_FogShadows=0
r_ShadowJittering=0
r_ShadowsCacheFormat=0
r_ShadowsCacheResolutions=3162,2107
e_ObjShadowCastSpec=1
e_ShadowsPoolSize=1024
[5]
e_GsmLodsNum=4
e_ParticlesShadows=0
e_ShadowsBlendCascades=0
e_ShadowsCastViewDistRatio=0.8
e_ShadowsLodBiasFixed=1
e_ShadowsMaxTexRes=512
r_FogShadows=0
r_ShadowJittering=1
e_ObjShadowCastSpec=1
r_ShadowsCacheResolutions=3162,2107
[6]
r_ShadowJittering=1
e_ObjShadowCastSpec=2
[8]
r_FogShadows=1
r_FogShadowsWater=1
r_ShadowPoolMaxFrames=0
r_ShadowPoolMaxTimeslicedUpdatesPerFrame=100
e_ObjShadowCastSpec=4
r_ShadowsCache=5
r_ShadowsCacheResolutions=4214
@@ -1,17 +0,0 @@
[default]
; default of this CVarGroup
= 7
[1]
[2]
[3]
[4]
[5]
[6]
[8]
@@ -1,94 +0,0 @@
[default]
; default of this CVarGroup
= 7
e_TerrainTextureStreamingPoolItemsNum=64
r_DynTexAtlasCloudsMaxSize=32
r_DynTexAtlasSpritesMaxSize=32
r_DynTexMaxSize=80
r_EnvCMResolution=2
r_EnvTexResolution=3
r_ImposterRatio=1
r_TexAtlasSize=2048
r_TexMaxAnisotropy=4
r_TexMinAnisotropy=4
r_TexNoAnisoAlphaTest=0
[1]
e_TerrainTextureStreamingPoolItemsNum=16
r_DynTexAtlasCloudsMaxSize=8
r_DynTexAtlasSpritesMaxSize=8
r_DynTexMaxSize=20
r_EnvCMResolution=0
r_EnvTexResolution=1
r_ImposterRatio=2
r_TexAtlasSize=512
r_TexMaxAnisotropy=2
r_TexMinAnisotropy=2
r_TexNoAnisoAlphaTest=1
[2]
e_TerrainTextureStreamingPoolItemsNum=16
r_DynTexAtlasCloudsMaxSize=8
r_DynTexAtlasSpritesMaxSize=8
r_DynTexMaxSize=20
r_EnvCMResolution=0
r_EnvTexResolution=1
r_ImposterRatio=2
r_TexAtlasSize=512
r_TexMaxAnisotropy=2
r_TexMinAnisotropy=2
r_TexNoAnisoAlphaTest=1
[3]
e_TerrainTextureStreamingPoolItemsNum=16
r_DynTexAtlasCloudsMaxSize=8
r_DynTexAtlasSpritesMaxSize=8
r_DynTexMaxSize=20
r_EnvCMResolution=0
r_EnvTexResolution=1
r_ImposterRatio=2
r_TexAtlasSize=512
r_TexMaxAnisotropy=2
r_TexMinAnisotropy=2
r_TexNoAnisoAlphaTest=1
[4]
e_TerrainTextureStreamingPoolItemsNum=16
r_DynTexAtlasCloudsMaxSize=8
r_DynTexAtlasSpritesMaxSize=8
r_DynTexMaxSize=20
r_EnvCMResolution=0
r_EnvTexResolution=1
r_ImposterRatio=2
r_TexAtlasSize=512
r_TexMaxAnisotropy=2
r_TexMinAnisotropy=2
r_TexNoAnisoAlphaTest=1
[5]
r_DynTexAtlasCloudsMaxSize=24
r_DynTexAtlasSpritesMaxSize=16
r_DynTexMaxSize=50
r_EnvCMResolution=0
r_EnvTexResolution=1
r_ImposterRatio=2
r_TexAtlasSize=512
r_TexMaxAnisotropy=2
r_TexMinAnisotropy=2
r_TexNoAnisoAlphaTest=1
[6]
r_DynTexAtlasCloudsMaxSize=24
r_DynTexAtlasSpritesMaxSize=16
r_DynTexMaxSize=60
r_EnvCMResolution=1
r_EnvTexResolution=2
r_ImposterRatio=1.5
r_TexMaxAnisotropy=8
r_TexMinAnisotropy=8
r_TexNoAnisoAlphaTest=1
[8]
r_TexMaxAnisotropy=16
r_TexMinAnisotropy=16
@@ -1,52 +0,0 @@
[default]
; dummy default for this CVarGroup (will be auto initialized during streaming system init or overridden by user via system.cfg)
= 0
; VRAM 1.0 GB
r_TexturesStreaming=1
r_TexturesStreamingMipBias=0
r_TexturesstreamingMinUsableMips=8
r_TexturesStreamingSkipMips=2
r_TexturesStreamPoolSize=256
[1]
; VRAM 1.0 GB
r_TexturesStreaming=0
r_TexturesStreamingSkipMips=0
r_TexturesStreamPoolSize=384
[2]
; VRAM 1.0 GB
r_TexturesStreaming=0
r_TexturesStreamingSkipMips=0
r_TexturesStreamPoolSize=384
[3]
; VRAM 1.0 GB
r_TexturesStreaming=0
r_TexturesStreamingSkipMips=0
r_TexturesStreamPoolSize=384
[4]
; VRAM 1.0 GB
r_TexturesStreaming=0
r_TexturesStreamingSkipMips=0
r_TexturesStreamPoolSize=384
[5]
; VRAM 1.0 GB
[6]
; VRAM 1.5 GB
r_TexturesStreamingSkipMips=1
r_TexturesStreamPoolSize=512
[7]
; VRAM 2.0 GB
r_TexturesStreamingSkipMips=0
r_TexturesStreamPoolSize=640
[8]
; VRAM 3.0 GB
r_TexturesStreamingSkipMips=0
r_TexturesStreamPoolSize=1536
@@ -1,26 +0,0 @@
[default]
; default of this CVarGroup
= 7
e_Clouds=1
r_Beams=1
[1]
r_Beams=0
[2]
r_Beams=0
[3]
r_Beams=0
[4]
r_Beams=0
[5]
r_Beams=0
[6]
r_Beams=0
[8]
@@ -1,81 +0,0 @@
[default]
; default of this CVarGroup
= 7
e_WaterOceanFFT=1
e_WaterTessellationAmount=10
e_WaterTessellationSwathWidth=10
q_ShaderWater=2
r_WaterCaustics=1
r_WaterReflections=1
r_WaterReflectionsQuality=4
r_WaterReflectionsMinVisiblePixelsUpdate=0.05
r_WaterTessellationHW=0
r_WaterUpdateDistance=0.2
r_WaterUpdateFactor=0.0
r_WaterVolumeCaustics=0
r_WaterVolumeCausticsDensity=256
r_WaterVolumeCausticsMaxDist=35
r_WaterVolumeCausticsRes=1024
r_WaterVolumeCausticsSnapFactor=1
[1]
e_WaterTessellationAmount=20
q_ShaderWater=1
r_WaterReflectionsQuality=0
r_WaterUpdateDistance=1
r_WaterUpdateFactor=0.1
r_WaterVolumeCausticsDensity=64
r_WaterVolumeCausticsMaxDist=20
r_WaterVolumeCausticsRes=384
[2]
e_WaterTessellationAmount=20
q_ShaderWater=1
r_WaterReflectionsQuality=0
r_WaterUpdateDistance=1
r_WaterUpdateFactor=0.1
r_WaterVolumeCausticsDensity=64
r_WaterVolumeCausticsMaxDist=20
r_WaterVolumeCausticsRes=384
[3]
e_WaterTessellationAmount=20
q_ShaderWater=1
r_WaterReflectionsQuality=0
r_WaterUpdateDistance=1
r_WaterUpdateFactor=0.05
r_WaterVolumeCausticsDensity=64
r_WaterVolumeCausticsMaxDist=20
r_WaterVolumeCausticsRes=384
[4]
e_WaterTessellationAmount=20
q_ShaderWater=1
r_WaterReflectionsQuality=4
r_WaterUpdateDistance=1
r_WaterUpdateFactor=0.01
r_WaterVolumeCausticsDensity=64
r_WaterVolumeCausticsMaxDist=20
r_WaterVolumeCausticsRes=384
[5]
e_WaterTessellationAmount=20
q_ShaderWater=1
r_WaterUpdateDistance=1
r_WaterUpdateFactor=0.1
r_WaterVolumeCausticsDensity=64
r_WaterVolumeCausticsMaxDist=20
r_WaterVolumeCausticsRes=384
[6]
r_WaterUpdateDistance=1
r_WaterUpdateFactor=0.05
r_WaterVolumeCausticsDensity=128
r_WaterVolumeCausticsMaxDist=25
r_WaterVolumeCausticsRes=512
[8]
e_WaterTessellationAmount=85
r_WaterTessellationHW=1
r_WaterVolumeCaustics=1
-3
View File
@@ -1,4 +1 @@
ai_DebugDraw = 1
ai_DebugDrawNavigation = 1
ai_DrawPath all
ai_debugMNMAgentType MediumSizedCharacters
+1 -13
View File
@@ -1,7 +1,6 @@
; Setup useful cvars for artists profiling GPU cost
; Once in level (e.g. map c3mp_rooftop_gardens from the frontend/cmdline), in the console:
; exec artprof.cfg
; Be sure also to set r_shadersAsyncActivation=0 in your user.cfg (or copy artprof_user.cfg -> user.cfg)
; used to allow loading of loose shaders
sys_pakPriority=0
@@ -9,19 +8,8 @@ sys_pakPriority=0
; because it's annoying and not relevant for artists
sys_pakLogInvalidFileAccess=0
; disable fog volumes and particles as they can be misleading with r_measureOverdraw 4
e_fogVolumes=0
e_particles=0
; for convenience
g_infiniteSuitEnergy=1
g_infiniteAmmo=1
g_timelimit=0
bind o "r_measureOverdraw 0"
bind p "r_measureOverdraw 4"
bind k "r_artProfile 0"
bind l "r_artProfile 1"
; loading into an MP level with the map command stops you looking up and down unless you have a weapon
i_giveitem scar
-3
View File
@@ -1,6 +1,3 @@
; disable async shader activation as it crashes when r_shadersAllowCompilation=1
r_shadersAsyncActivation=0
; enable shader compiliation for r_measureOverdraw 4
r_shadersAllowCompilation=1
-10
View File
@@ -1,13 +1,3 @@
demo_restart_level = 2
g_godMode=1
g_infiniteammo=1
r_displayinfo=1
demo_file = autotest
demo_ai = 1
demo_num_runs = 4
demo_quit = 1
hud_startPaused=0
sys_maxfps=0
e_ObjectLayersActivation=0
sys_flash = 0
r_vsync = 0
+1 -11
View File
@@ -1,13 +1,3 @@
demo_restart_level = 1
g_godMode = 1
g_infiniteammo = 1
r_displayinfo = 2
demo_file = timedemo_short
demo_ai = 0
demo_num_runs = 2
demo_quit = 1
-- hud_startPaused = 0
sys_maxfps = -1
-- e_ObjectLayersActivation = 0
-- sys_flash = 0
r_vsync = 0
r_vsync = 0
-6
View File
@@ -1,6 +0,0 @@
r_ColorGradingChartsCache = 0
r_waterupdateFactor = 0
r_PostProcessHUD3DCache = 0
e_gsmcache = 0
r_ConditionalRendering = 0
e_gicache = 0
-77
View File
@@ -1,77 +0,0 @@
ag_turnSpeedParamScale=0.0
aim_assistFalloffDistance=200
aim_assistInputForFullFollow_Ironsight=0.20
aim_assistMaxDistance=255
aim_assistMaxDistance_ironsight=255
aim_assistMinTurnScale=0.5
aim_assistMinTurnScale_ironsight=0.5
aim_assistSlowDisableDistance=255
aim_assistSlowFalloffStartDistance=200
aim_assistSlowThresholdOuter=2.5
aim_assiststrength=0.7
aim_assiststrength_ironsight=0.75
br_breakmaxworldsize=511
cl_sensitivityControllerMP=0.6
cl_shallowWaterSpeedMulPlayer=1.0
controller_multiplier_x=3
controller_multiplier_z=4
g_actorViewDistRatio=255
-- This forces broken trees to have spherical inertia, which makes them harder to rotate around their vertical axis.
g_breakageMinAxisInertia=1.0
g_glassAutoShatterMinArea=0.5
g_distanceForceNoIk=35
g_fpDbaManagementEnable=0
g_godMode=0
g_highlightingMaxDistanceToHighlightSquared=625
g_hitDeathReactions_streaming=2
g_mp_as_DefendersMaxHealth=150
g_multiplayerDefault=1
-- Overriden in GameSDK\Difficulty\*.cfg
g_playerLowHealthThreshold=20
g_playerMidHealthThreshold=60
g_spawn_vistable_numLineTestsPerFrame=3
g_telemetryConfig="MP"
g_telemetrySampleRateBandwidth=3
g_telemetrySampleRateMemory=2
g_telemetrySampleRatePerformance=1
g_VTOLInsideBoundsScaleX=0.6
g_VTOLInsideBoundsScaleY=1
net_breakage_sync_entities=0
net_enable_tfrc=0
net_log=1
-- Make consoles match the PC gravity
p_gravity_z="-13"
-- Sanity check for physics RepositionEntity
p_max_entity_cells=10000
pl_impulseEnabled=1
pl_jump_maxTimerValue=0.0
pl_jump_quickPressThresh=0.12
pl_melee.angle_limit_from_behind=70
pl_melee.impulses_enable=1
pl_melee.melee_snap_angle_limit=45
pl_melee.melee_snap_end_position_range=1.5
pl_melee.melee_snap_move_speed_multiplier=10
pl_melee.melee_snap_target_select_range=3.5
pl_melee.mp_knockback_strength_hor=2
pl_melee.mp_melee_system=1
pl_melee.mp_victim_screenfx_blendout_duration=0.25
pl_melee.mp_victim_screenfx_duration=0.1
pl_nanovision_timetodrain=8
pl_nanovision_timetorecharge=16
pl_pickAndThrow.chargedThrowAutoAimConeSize=10
pl_pickAndThrow.complexMelee_snap_angle_limit=25
pl_sliding_control_mp.deceleration_speed=4
pl_sliding_control_mp.max_downhill_acceleration=15
pl_sliding_control_mp.min_speed=4
pl_sliding_control_mp.min_speed_threshold=5
pl_stealthKill_aimVsSpineLerp=0.65
pl_stealthKill_useExtendedRange=1
p_splash_vel0=0.5
sv_bandwidth=2147483647
@@ -1,29 +0,0 @@
e_GI=0
r_DeferredShadingIndexedAmbient=0
e_ParticlesObjectCollisions=0
g_distanceForceNoLegRaycasts=0.00001
g_telemetryDisplaySessionId=1
g_breakageNoDebrisCollisions=1
; Breakage throttling
; These are explained in ActionGame.cpp
;
g_glassAutoShatterOnExplosions=1
g_glassNoDecals=1
g_glassMaxPanesToBreakPerFrame=2
g_breakageTreeMax=100
g_breakageTreeInc=101
g_breakageTreeDec=25
g_breakageTreeIncGlass=51
sys_PakInMemoryPakSizeLimit=25
r_TexturesStreamPoolSecondarySize=35
r_MotionBlur=1
e_CoverageBufferReproj=2
osm_enabled = 1
g_waterHitOnly = 1
p_max_object_splashes=1
-60
View File
@@ -1,63 +1,3 @@
-- added this lines for proper 360 deg panorama renderings
e_ScreenShotFileFormat = jpg
demo_fixed_timestep = 60
s_SoundEnable = 0
r_DisplayInfo = 0
e_PanoramaScreenShotHeight = 720
e_PanoramaScreenShotWidth = 10053
c_shakeMult = 0
demo_ai = 1
r_MotionBlur = 0
-- enables full water reflection
-- e_DebugMask = 2 -- e_DebugMask not allowed here
-- set weapong lighting effect to 0 to prevent flickering bug because of too much dynamic lights in the scene
sys_spec = 2
r_WaterRefractions = 1
r_WaterReflections = 1
r_WaterUpdateFactor = 0.01
r_WaterReflections_ForceParticles = 0
r_EnvCMResolution = 2
r_EnvTexResolution = 3
r_EnvTexUpdateInterval = 0.05
e_Decals = 1
e_DecalsLifeTimeScale = 2
ca_EnableDecals = 1
e_LodRatio = 10
e_ViewDistRatio = 55
e_Lods = 1
e_VegetationMinSize = 0
r_CloudsUpdateAlways = 0
e_DynamicLightsMaxEntityLights = 3
r_DepthOfField = 1
--r_MotionBlur = 1
r_Flares = 1
r_checkSunVis = 1
r_Coronas = 1
r_CoronaFade = 0.1625
r_UseEdgeAA = 1
e_Clouds = 1
r_TexResolution = 0
r_TexBumpResolution = 0
r_DetailTextures = 1
r_DetailNumLayers = 1
r_DetailDistance = 8
e_ParticlesLod = 0.9
r_ShadowBlur = 3
e_ShadowsMaxTexRes = 1024
r_ShadowJittering = 1
e_Shadows = 1
e_VegetationBending = 1
ai_UpdateAllAlways = 1
r_refraction = 1
r_sunshafts = 1
r_ImposterRatio = 1
-15
View File
@@ -1,15 +0,0 @@
ai_CompatibilityMode=crysis2
ai_BurstWhileMovingDestinationRange=9999.0
g_telemetryConfig=SP
net_inactivitytimeout=3600
net_inactivitytimeoutDevmode=3600
pl_movement.nonCombat_heavy_weapon_speed_scale=1.0
-- BLM - Don't override game rules. The template project only has DummyRules.
-- Furthermore, multiplayer.cfg doesn't set sv_gamerules, so the inconsistency
-- is likely to create bugs.
--sv_gamerules=SinglePlayer
ca_StreamCHR=1
-24
View File
@@ -1,24 +0,0 @@
r_UseZPass = 1
r_GeomInstancing = 1
e_Fog = 1
e_Clouds = 1
e_Decals = 1
e_TerrainDetailMaterials = 1
e_Dissolve = 1
e_TerrainAo = 1
r_WaterReflections = 1
e_Shadows = 1
e_VegetationBending = 1
r_PostProcessEffects = 1
r_Flares = 1
r_Beams = 1
r_Glow = 1
r_DetailTextures = 1
r_refraction = 1
r_sunshafts = 1
-24
View File
@@ -1,24 +0,0 @@
r_UseZPass = 0
r_GeomInstancing = 0
e_Fog = 0
e_Clouds = 0
e_Decals = 0
e_TerrainDetailMaterials = 0
e_Dissolve = 0
e_TerrainAo = 0
r_WaterReflections = 0
e_Shadows = 0
e_VegetationBending = 0
r_PostProcessEffects = 0
r_Flares = 0
r_Beams = 0
r_Glow = 0
r_DetailTextures = 0
r_refraction = 0
r_sunshafts = 0
@@ -1,76 +1,8 @@
sys_spec_Full=2
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=0
-- Disable gmem for this device because it causes a crash
r_EnableGMEMPath=0
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
sys_job_system_max_worker=2
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
-- This allows the generation of reflections for the ocean water. Without it, the water looks really dark.
e_recursion=1
e_CheckOcclusion=1
r_Fur=0
az_Asset_EnableAsyncMeshLoading=0
------------------------
-- Misc. memory buffers
------------------------
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=33554432
ca_StreamCHR=1
------------------------
-- sys_spec_objectdetail
------------------------
e_Dissolve=2
e_LodRatio=5
e_ViewDistRatioDetail=19
e_ViewDistRatioVegetation=21
------------------------
-- sys_spec_postprocessing
------------------------
r_HDRBloom=0
r_SunShafts=0
r_ToneMapTechnique=3
r_ToneMapExposureType=1
r_ColorSpace=2
------------------------
-- sys_spec_shading
------------------------
r_VisAreaClipLightsPerPixel=0
------------------------
-- sys_spec_textureresolution
------------------------
r_TexturesstreamingMinUsableMips=7
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
@@ -1,65 +1,7 @@
sys_spec_Full=3
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=0
-- Enable framebufferfetch(256bpp) or pls if applicable
r_EnableGMEMPath=2
-- Skip the native upscale as a second upscale already occurs
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
sys_job_system_max_worker=2
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
e_CheckOcclusion=1
r_Fur=0
az_Asset_EnableAsyncMeshLoading=0
------------------------
-- Misc. memory buffers
------------------------
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=33554432
ca_StreamCHR=1
------------------------
-- sys_spec_objectdetail
------------------------
e_Dissolve=2
e_LodRatio=5
e_ViewDistRatioDetail=19
------------------------
-- sys_spec_shading
------------------------
r_VisAreaClipLightsPerPixel=0
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
r_ClearGMEMGBuffer=1
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
@@ -1,61 +1,8 @@
sys_spec_Full=3
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=0
-- Disabling gmem for this configuration
r_EnableGMEMPath=0
-- Skip the native upscale as a second upscale already occurs
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
sys_job_system_max_worker=2
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
e_CheckOcclusion=1
r_Fur=0
az_Asset_EnableAsyncMeshLoading=0
------------------------
-- Misc. memory buffers
------------------------
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=33554432
ca_StreamCHR=1
------------------------
-- sys_spec_objectdetail
------------------------
e_Dissolve=2
e_LodRatio=5
e_ViewDistRatioDetail=19
------------------------
-- sys_spec_shading
------------------------
r_VisAreaClipLightsPerPixel=0
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
-69
View File
@@ -1,76 +1,7 @@
sys_spec_Full=1
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=0
-- Enable framebufferfetch(256bpp) or pls if applicable
r_EnableGMEMPath=1
-- Skip the native upscale as a second upscale already occurs
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
sys_job_system_max_worker=2
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
-- This allows the generation of reflections for the ocean water. Without it, the water looks really dark.
e_recursion=0
e_CheckOcclusion=1
r_Fur=0
-- Water occlusion queries crash in some OpenGL ES 3.0 devices
e_HwOcclusionCullingWater = 0
az_Asset_EnableAsyncMeshLoading=0
------------------------
-- Misc. memory buffers
------------------------
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=33554432
ca_StreamCHR=1
------------------------
-- sys_spec_objectdetail
------------------------
e_Dissolve=2
e_LodRatio=5
e_ViewDistRatioDetail=19
------------------------
-- sys_spec_shading
------------------------
r_VisAreaClipLightsPerPixel=0
------------------------
-- sys_spec_textureresolution
------------------------
r_TexturesstreamingMinUsableMips=6
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
r_ClearGMEMGBuffer=1
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
@@ -1,81 +1,7 @@
sys_spec_Full=2
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=0
-- Enable framebufferfetch(256bpp) or pls if applicable
r_EnableGMEMPath=1
-- Skip the native upscale as a second upscale already occurs
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
sys_job_system_max_worker=2
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
-- This allows the generation of reflections for the ocean water. Without it, the water looks really dark.
e_recursion=1
e_CheckOcclusion=1
r_Fur=0
az_Asset_EnableAsyncMeshLoading=0
------------------------
-- Misc. memory buffers
------------------------
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=33554432
ca_StreamCHR=1
------------------------
-- sys_spec_objectdetail
------------------------
e_Dissolve=2
e_LodRatio=5
e_ViewDistRatioDetail=19
e_ViewDistRatioVegetation=21
------------------------
-- sys_spec_postprocessing
------------------------
r_HDRBloom=0
r_SunShafts=0
r_ToneMapExposureType=1
r_ColorSpace=2
------------------------
-- sys_spec_shading
------------------------
r_VisAreaClipLightsPerPixel=0
------------------------
-- sys_spec_textureresolution
------------------------
r_TexturesstreamingMinUsableMips=7
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
r_ClearGMEMGBuffer=1
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
@@ -1,60 +1,5 @@
sys_spec_Full=4
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=0
-- Enable framebufferfetch(256bpp) or pls if applicable
r_EnableGMEMPath=1
-- Skip the native upscale as a second upscale already occurs
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
sys_job_system_max_worker=2
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
e_CheckOcclusion=1
r_Fur=0
az_Asset_EnableAsyncMeshLoading=0
------------------------
-- Misc. memory buffers
------------------------
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=33554432
ca_StreamCHR=1
------------------------
-- sys_spec_objectdetail
------------------------
e_Dissolve=2
e_LodRatio=5
e_ViewDistRatioDetail=19
------------------------
-- sys_spec_shading
------------------------
r_VisAreaClipLightsPerPixel=0
r_ClearGMEMGBuffer=1
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
-90
View File
@@ -1,100 +1,10 @@
sys_spec_Full=3
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=1
-- Enable framebufferfetch or pls if applicable
r_EnableGMEMPath=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
------------------------
-- Job System
------------------------
sys_job_system_enable=0
sys_job_system_max_worker=1
------------------------
-- Streaming
------------------------
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
------------------------
-- General Rendering
------------------------
r_Flush=0
-- Enabling this will clear the GMEM buffer before the z-pass
r_ClearGMEMGBuffer=2
r_Fur=0
------------------------
-- VisArea / Portals
------------------------
e_PortalsBlend=0
r_GMEMVisAreasBlendWeight=0.5
------------------------
-- Misc. memory buffers
------------------------
e_AutoPrecacheCgf=2
e_AutoPrecacheTerrainAndProcVeget=1
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=2048
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=32
ca_StreamCHR=1
------------------------
-- sys_spec_water
------------------------
e_WaterOcean=2
e_WaterVolumes=2
e_WaterOceanBottom=0
------------------------
-- batching
------------------------
r_Batching = 1
r_BatchType = 0
------------------------
-- geom instancing
------------------------
r_GeomInstancing=1
r_GeomInstancingThreshold=5
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
------------------------
-- Geometry Cache
------------------------
e_GeomCaches=0
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
-93
View File
@@ -1,103 +1,10 @@
sys_spec_Full=1
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=1
-- Enable framebufferfetch or pls if applicable
r_EnableGMEMPath=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
------------------------
-- Job System
------------------------
sys_job_system_enable=0
sys_job_system_max_worker=1
------------------------
-- Streaming
------------------------
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
------------------------
-- General Rendering
------------------------
r_Flush=0
-- Enabling this will clear the GMEM buffer before the z-pass
r_ClearGMEMGBuffer=2
r_Fur=0
------------------------
-- VisArea / Portals
------------------------
e_PortalsBlend=0
r_GMEMVisAreasBlendWeight=0.5
------------------------
-- Misc. memory buffers
------------------------
e_AutoPrecacheCgf=2
e_AutoPrecacheTerrainAndProcVeget=1
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=32
ca_StreamCHR=1
------------------------
-- sys_spec_water
------------------------
e_WaterOcean=2
e_WaterVolumes=2
e_WaterOceanBottom=0
------------------------
-- batching
------------------------
r_Batching = 1
r_BatchType = 0
------------------------
-- geom instancing
------------------------
r_GeomInstancing=1
r_GeomInstancingThreshold=5
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
------------------------
-- Geometry Cache
------------------------
e_GeomCaches=0
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
-91
View File
@@ -1,101 +1,10 @@
sys_spec_Full=2
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=1
-- Enable framebufferfetch or pls if applicable
r_EnableGMEMPath=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
------------------------
-- Job System
------------------------
sys_job_system_enable=0
sys_job_system_max_worker=1
------------------------
-- Streaming
------------------------
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
------------------------
-- General Rendering
------------------------
r_Flush=0
-- Enabling this will clear the GMEM buffer before the z-pass
r_ClearGMEMGBuffer=2
r_Fur=0
------------------------
-- VisArea / Portals
------------------------
e_PortalsBlend=0
r_GMEMVisAreasBlendWeight=0.5
------------------------
-- Misc. memory buffers
------------------------
e_AutoPrecacheCgf=2
e_AutoPrecacheTerrainAndProcVeget=1
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=1024
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=32
ca_StreamCHR=1
------------------------
-- sys_spec_water
------------------------
e_WaterOcean=2
e_WaterVolumes=2
e_WaterOceanBottom=0
------------------------
-- batching
------------------------
r_Batching = 1
r_BatchType = 0
------------------------
-- geom instancing
------------------------
r_GeomInstancing=1
r_GeomInstancingThreshold=5
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
------------------------
-- Geometry Cache
------------------------
e_GeomCaches=0
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
@@ -1,102 +1,10 @@
sys_spec_Full=4
-- Cap frame rate at 30fps
sys_maxfps=30
r_vsync=1
-- Enable framebufferfetch or pls if applicable
r_EnableGMEMPath=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
------------------------
-- Job System
------------------------
sys_job_system_enable=0
sys_job_system_max_worker=1
------------------------
-- Streaming
------------------------
sys_streaming_in_blocks=1
sys_streaming_memory_budget=512
------------------------
-- General Rendering
------------------------
r_Flush=0
-- Enabling this will clear the GMEM buffer before the z-pass
r_ClearGMEMGBuffer=2
r_Fur=0
------------------------
-- VisArea / Portals
------------------------
e_PortalsBlend=0
r_GMEMVisAreasBlendWeight=0.5
------------------------
-- Misc. memory buffers
------------------------
e_AutoPrecacheCgf=2
e_AutoPrecacheTerrainAndProcVeget=1
e_GeomCacheBufferSize=0
e_CheckOcclusionQueueSize=512
e_CheckOcclusionOutputQueueSize=2048
------------------------
-- Animation
------------------------
ca_MemoryDefragPoolSize=32
ca_StreamCHR=1
------------------------
-- sys_spec_water
------------------------
e_WaterOcean=2
e_WaterVolumes=2
e_WaterOceanBottom=0
------------------------
-- batching
------------------------
r_Batching = 1
r_BatchType = 0
------------------------
-- geom instancing
------------------------
r_GeomInstancing=1
r_GeomInstancingThreshold=5
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
------------------------
-- Geometry Cache
------------------------
e_GeomCaches=0
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
-- Sort ligths since we have limited space in the shadowmap pool texture
r_DeferredShadingSortLights = 3
--Use an optimized pixel format for the lighting rendertargets during the lighting pass.
r_DeferredShadingLBuffersFmt = 2
@@ -1,38 +0,0 @@
sys_spec_Full=7
r_ShadersMETAL=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
------------------------
-- sys_spec_postprocessing
------------------------
r_SunShafts=1
------------------------
-- sys_spec_shading
------------------------
r_DeferredShadingTiled=0
r_RefractionPartialResolves=0
e_GI = 0
r_Fur=2
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
@@ -1,37 +0,0 @@
sys_spec_Full=5
r_ShadersMETAL=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
------------------------
-- sys_spec_postprocessing
------------------------
r_SunShafts=1
------------------------
-- sys_spec_shading
------------------------
r_DeferredShadingTiled=0
r_RefractionPartialResolves=0
e_GI=0
r_Fur=2
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
@@ -1,37 +0,0 @@
sys_spec_Full=6
r_ShadersMETAL=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
------------------------
-- sys_spec_postprocessing
------------------------
r_SunShafts=1
------------------------
-- sys_spec_shading
------------------------
r_DeferredShadingTiled=0
r_RefractionPartialResolves=0
e_GI = 0
r_Fur=2
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
@@ -1,37 +0,0 @@
sys_spec_Full=8
r_ShadersMETAL=1
-- Default of 3 allocates all shaders (potentially >150 MB)
-- 1 is most memory efficient but definitely causes hitches when converting HLSL
-- shaders. Recommend 1 during dev, and 3 with optimized caches for release.
r_ShadersPreactivate=1
-- Skip the native upscale as a second upscale occurs on Metal Present
r_SkipNativeUpscale=1
------------------------
-- sys_spec_postprocessing
------------------------
r_SunShafts=1
------------------------
-- sys_spec_shading
------------------------
r_DeferredShadingTiled=0
r_RefractionPartialResolves=0
e_GI = 0
r_Fur=2
------------------------
-- Upscaling
------------------------
--0 point, 1 bilinear, 2 bicubic, 3 lanczos
r_UpscalingQuality=1
-- Due to performance issues with incremental cached shadow map updates, enable this to prevent us from culling every object in the world vs each cached shadow map each frame.
-- If no objects are present in the level this will eliminate the need to clear the massive cached textures each frame.
-- Set to 2 to allow distance-based updates along with script-based updates for the cached shadow maps
e_ShadowsCacheRequireManualUpdate = 2
-1
View File
@@ -1 +0,0 @@
sys_spec_Full = 7
-1
View File
@@ -1 +0,0 @@
sys_spec_Full = 5
-1
View File
@@ -1 +0,0 @@
sys_spec_Full = 6
@@ -1 +0,0 @@
sys_spec_Full = 8
-9
View File
@@ -1,12 +1,3 @@
profile=-1
profile_allthreads=1
i_forcefeedback=0
g_godmode=1
log_verbosity=-1
sys_pakLogInvalidFileAccess=1
e_StatoscopeDataGroups=fgmrtudlipny
e_StatoscopeFilenameUseBuildInfo=0
e_StatoscopeFilenameUseMap=1
e_StatoscopeMinFuncLengthMs=0.1
e_StatoscopeMaxNumFuncsPerFrame=60
e_StatoscopeScreenshotCapturePeriod=5
-26
View File
@@ -3,39 +3,13 @@
-----------------------------------------------
r_width = 960
r_height = 1080
r_backbufferWidth = 1920
r_backbufferHeight = 1080
-------------------------------------------
-- Set the system Spec (Medium)
-------------------------------------------
sys_spec = 2
-------------------------------------------
-- HMD related
-------------------------------------------
r_overrideDXGIoutput = 0
r_stereodevice = 100
r_stereomode = 1
r_stereooutput = 7
r_minimizeLatency = 1
hmd_low_persistence = 1
r_stereoScaleCoefficient = 1
-------------------------------------------
-- Set some video optimisations
-------------------------------------------
r_vsync = 0
r_MotionBlur = 0
r_ssdoHalfRes = 3
r_Refraction = 0
r_DeferredShadingTiled = 0
r_CBufferUseNativeDepth = 0
-------------------------------------------
-- Hide the hud
-------------------------------------------
--hud_hide = 1
-152
View File
@@ -48,22 +48,6 @@
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/perfhud_pc.xml" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{6C3531BB-4A37-515B-86F6-4FC3A9ABEF9F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/sketch_off.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{EA424FC8-20C9-51D3-A4DD-08DA8B7F7FB3}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/sketch_on.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{34B60E74-28FA-57C4-9A2E-77515A083AC5}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
@@ -432,110 +416,6 @@
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_full.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{8A877B20-8B7D-5F61-93C9-FD02CB856165}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_gameeffects.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{5D7C3B35-E171-5A4B-8C36-1D22B3F7636F}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_objectdetail.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{8EAED4CA-6E4B-5F11-94E9-F4FB39E966C4}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_particles.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{437E9B76-BFC3-57AB-9993-9C249EEAEF97}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_physics.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{35B8614B-F080-5BE4-AD78-23F24E104C72}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_postprocessing.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{9CC310DD-0D00-555D-99A7-D339DF0E2A73}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_quality.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{2BD0EFEF-9DA5-5F48-B579-C500CA0D42AB}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_shading.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{979A2D8D-79B9-57E8-9250-A981538FA893}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_shadows.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{90964883-E22A-5D57-86FC-86571AD213BE}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_sound.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{89BEF8A4-AA05-5339-B4DE-C475541FD532}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_texture.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{15CBF6A7-1107-55A9-A173-2F7AD1329589}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_textureresolution.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{4CD3711E-09EE-5F91-8688-FB523F350C43}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_volumetriceffects.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{F316DFFF-ABA2-5145-A637-2BBA2C86E7A0}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/cvargroups/sys_spec_water.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{FD38C182-1AFC-514C-99E5-BB1AB60C4A31}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
@@ -616,38 +496,6 @@
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/spec/ios_veryhigh.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{B9622C57-85C2-5C68-AFB8-35AA0D65FEC7}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/spec/osx_metal_high.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{E79532D9-BE8F-5969-B672-A2E8030578B9}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/spec/osx_metal_low.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{4B05219C-0D19-5A04-B029-8417CE06A243}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/spec/osx_metal_medium.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{C0F09A4E-A77A-5FFF-B1ED-DDB37DED623C}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
<Class name="unsigned int" field="subId" value="0" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
</Class>
<Class name="unsigned int" field="platformFlags" value="255" type="{43DA906B-7DEF-4CA8-9790-854106D3F983}"/>
<Class name="AZStd::string" field="pathHint" value="config/spec/osx_metal_veryhigh.cfg" type="{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9}"/>
</Class>
<Class name="SeedInfo" field="element" version="2" type="{FACC3682-2ACA-4AA4-B85A-07AD276D18A0}">
<Class name="AssetId" field="assetId" version="1" type="{652ED536-3402-439B-AEBE-4A5DBC554085}">
<Class name="AZ::Uuid" field="guid" value="{B632E8B1-884A-5A65-BC01-D85F0FED1266}" type="{E152C105-A133-4D03-BBF8-3D4B2FBA3E2A}"/>
@@ -74,6 +74,7 @@ def update_manifest(scene):
source_filename_only = os.path.basename(clean_filename)
created_entities = []
previous_entity_id = azlmbr.entity.InvalidEntityId
# Loop every mesh node in the scene
for activeMeshIndex in range(len(mesh_name_list)):
@@ -102,14 +103,33 @@ def update_manifest(scene):
# The MeshGroup we created will be output as a product in the asset's path named mesh_group_name.azmodel
# The assetHint will be converted to an AssetId later during prefab loading
json_update = json.dumps({
"Controller": { "Configuration": { "ModelAsset": {
"assetHint": os.path.join(source_relative_path, mesh_group_name) + ".azmodel" }}}
});
"Controller": { "Configuration": { "ModelAsset": {
"assetHint": os.path.join(source_relative_path, mesh_group_name) + ".azmodel" }}}
});
# Apply the JSON above to the component we created
result = azlmbr.entity.EntityUtilityBus(azlmbr.bus.Broadcast, "UpdateComponentForEntity", entity_id, editor_mesh_component, json_update)
if not result:
raise RuntimeError("UpdateComponentForEntity failed")
raise RuntimeError("UpdateComponentForEntity failed for Mesh component")
# Get the transform component
transform_component = azlmbr.entity.EntityUtilityBus(azlmbr.bus.Broadcast, "GetOrAddComponentByTypeName", entity_id, "27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0")
# Set this entity to be a child of the last entity we created
# This is just an example of how to do parenting and isn't necessarily useful to parent everything like this
if previous_entity_id is not None:
transform_json = json.dumps({
"Parent Entity" : previous_entity_id.to_json()
});
# Apply the JSON update
result = azlmbr.entity.EntityUtilityBus(azlmbr.bus.Broadcast, "UpdateComponentForEntity", entity_id, transform_component, transform_json)
if not result:
raise RuntimeError("UpdateComponentForEntity failed for Transform component")
# Update the last entity id for next time
previous_entity_id = entity_id
# Keep track of the entity we set up, we'll add them all to the prefab we're creating later
created_entities.append(entity_id)
@@ -147,6 +167,8 @@ def on_update_manifest(args):
except RuntimeError as err:
print (f'ERROR - {err}')
log_exception_traceback()
except:
log_exception_traceback()
global sceneJobHandler
sceneJobHandler = None
@@ -23,20 +23,20 @@ TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "tests")
class TestAtomEditorComponentsMain(object):
"""Holds tests for Atom components."""
@pytest.mark.test_case_id("C32078118") # Decal
@pytest.mark.test_case_id("C32078119") # DepthOfField
@pytest.mark.test_case_id("C32078120") # Directional Light
@pytest.mark.test_case_id("C32078121") # Exposure Control
@pytest.mark.test_case_id("C32078115") # Global Skylight (IBL)
@pytest.mark.test_case_id("C32078125") # Physical Sky
@pytest.mark.test_case_id("C32078127") # PostFX Layer
@pytest.mark.test_case_id("C32078131") # PostFX Radius Weight Modifier
@pytest.mark.test_case_id("C32078117") # Light
@pytest.mark.test_case_id("C36525660") # Display Mapper
def test_AtomEditorComponents_AddedToEntity(self, request, editor, level, workspace, project, launcher_platform):
"""
Please review the hydra script run by this test for more specific test info.
Tests the following Atom components and verifies all "expected_lines" appear in Editor.log:
1. Display Mapper
2. Light
3. PostFX Radius Weight Modifier
4. PostFX Layer
5. Physical Sky
6. Global Skylight (IBL)
7. Exposure Control
8. Directional Light
9. DepthOfField
10. Decal
Tests the Atom components & verifies all "expected_lines" appear in Editor.log
"""
cfg_args = [level]
@@ -69,6 +69,18 @@ class TestAtomEditorComponentsMain(object):
"DepthOfField_test: Entity deleted: True",
"DepthOfField_test: UNDO entity deletion works: True",
"DepthOfField_test: REDO entity deletion works: True",
# Directional Light Component
"Directional Light Entity successfully created",
"Directional Light_test: Component added to the entity: True",
"Directional Light_test: Component removed after UNDO: True",
"Directional Light_test: Component added after REDO: True",
"Directional Light_test: Entered game mode: True",
"Directional Light_test: Exit game mode: True",
"Directional Light_test: Entity is hidden: True",
"Directional Light_test: Entity is shown: True",
"Directional Light_test: Entity deleted: True",
"Directional Light_test: UNDO entity deletion works: True",
"Directional Light_test: REDO entity deletion works: True",
# Exposure Control Component
"Exposure Control Entity successfully created",
"Exposure Control_test: Component added to the entity: True",
@@ -180,6 +192,7 @@ class TestAtomEditorComponentsMain(object):
cfg_args=cfg_args,
)
@pytest.mark.test_case_id("C34525095")
def test_AtomEditorComponents_LightComponent(
self, request, editor, workspace, project, launcher_platform, level):
"""
@@ -266,6 +279,15 @@ class TestMaterialEditorBasicTests(object):
request.addfinalizer(teardown)
@pytest.mark.parametrize("exe_file_name", ["MaterialEditor"])
@pytest.mark.test_case_id("C34448113") # Creating a New Asset.
@pytest.mark.test_case_id("C34448114") # Opening an Existing Asset.
@pytest.mark.test_case_id("C34448115") # Closing Selected Material.
@pytest.mark.test_case_id("C34448116") # Closing All Materials.
@pytest.mark.test_case_id("C34448117") # Closing all but Selected Material.
@pytest.mark.test_case_id("C34448118") # Saving Material.
@pytest.mark.test_case_id("C34448119") # Saving as a New Material.
@pytest.mark.test_case_id("C34448120") # Saving as a Child Material.
@pytest.mark.test_case_id("C34448121") # Saving all Open Materials.
def test_MaterialEditorBasicTests(
self, request, workspace, project, launcher_platform, generic_launcher, exe_file_name):
@@ -73,6 +73,7 @@ def create_screenshots_archive(screenshot_path):
class TestAllComponentsIndepthTests(object):
@pytest.mark.parametrize("screenshot_name", ["AtomBasicLevelSetup.ppm"])
@pytest.mark.test_case_id("C34603773")
def test_BasicLevelSetup_SetsUpLevel(
self, request, editor, workspace, project, launcher_platform, level, screenshot_name):
"""
@@ -115,6 +116,7 @@ class TestAllComponentsIndepthTests(object):
create_screenshots_archive(screenshot_directory)
@pytest.mark.test_case_id("C34525095")
def test_LightComponent_ScreenshotMatchesGoldenImage(
self, request, editor, workspace, project, launcher_platform, level):
"""
@@ -146,7 +148,7 @@ class TestAllComponentsIndepthTests(object):
golden_image_path = os.path.join(golden_images_directory(), golden_image)
golden_images.append(golden_image_path)
expected_lines = ["Light component tests completed."]
expected_lines = ["spot_light Controller|Configuration|Shadows|Shadowmap size: SUCCESS"]
unexpected_lines = [
"Trace::Assert",
"Trace::Error",
@@ -225,6 +227,8 @@ class TestMaterialEditor(object):
pytest.param("-rhi=Vulkan", ["Registering vulkan RHI"])
])
@pytest.mark.parametrize("exe_file_name", ["MaterialEditor"])
@pytest.mark.test_case_id("C30973986") # Material Editor Launching in Dx12
@pytest.mark.test_case_id("C30973987") # Material Editor Launching in Vulkan
def test_MaterialEditorLaunch_AllRHIOptionsSucceed(
self, request, workspace, project, launcher_platform, generic_launcher, exe_file_name, cfg_args,
expected_lines):
@@ -23,6 +23,7 @@ class TestAutomation(EditorTestSuite):
# Remove -autotest_mode from global_extra_cmdline_args since we need rendering for these tests.
global_extra_cmdline_args = ["-BatchMode"] # Default is ["-BatchMode", "-autotest_mode"]
@pytest.mark.test_case_id("C34603773")
class AtomGPU_BasicLevelSetup_SetsUpLevel(EditorSharedTest):
use_null_renderer = False # Default is True
screenshot_name = "AtomBasicLevelSetup.ppm"
@@ -67,5 +67,13 @@ class TestAutomation(EditorTestSuite):
class AtomEditorComponents_PostFXLayerAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_PostFXLayerAdded as test_module
@pytest.mark.test_case_id("C36525665")
class AtomEditorComponents_PostFXShapeWeightModifierAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_PostFxShapeWeightModifierAdded as test_module
@pytest.mark.test_case_id("C36525664")
class AtomEditorComponents_PostFXGradientWeightModifierAdded(EditorSharedTest):
from Atom.tests import hydra_AtomEditorComponents_PostFXGradientWeightModifierAdded as test_module
class ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges(EditorSharedTest):
from Atom.tests import hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges as test_module
@@ -30,6 +30,7 @@ class TestAtomEditorComponentsSandbox(object):
class TestAtomEditorComponentsMain(object):
"""Holds tests for Atom components."""
@pytest.mark.test_case_id("C32078128")
def test_AtomEditorComponents_ReflectionProbeAddedToEntity(
self, request, editor, level, workspace, project, launcher_platform):
"""
@@ -113,7 +113,6 @@ def create_basic_atom_level(level_name):
general.close_pane("Error Log")
general.idle_wait(1.0)
general.run_console("r_displayInfo=0")
general.run_console("r_antialiasingmode=0")
general.idle_wait(1.0)
# Delete all existing entities & create default_level entity
@@ -0,0 +1,179 @@
"""
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
"""
class Tests:
creation_undo = (
"UNDO Entity creation success",
"UNDO Entity creation failed")
creation_redo = (
"REDO Entity creation success",
"REDO Entity creation failed")
postfx_gradient_weight_creation = (
"PostFX Gradient Weight Modifier Entity successfully created",
"PostFX Gradient Weight Modifier Entity failed to be created")
postfx_gradient_weight_component = (
"Entity has a PostFX Gradient Weight Modifier component",
"Entity failed to find PostFX Gradient Weight Modifier component")
postfx_gradient_weight_disabled = (
"PostFX Gradient Weight Modifier component disabled",
"PostFX Gradient Weight Modifier component was not disabled.")
postfx_layer_component = (
"Entity has a PostFX Layer component",
"Entity did not have an PostFX Layer component")
postfx_gradient_weight_enabled = (
"PostFX Gradient Weight Modifier component enabled",
"PostFX Gradient Weight Modifier component was not enabled.")
enter_game_mode = (
"Entered game mode",
"Failed to enter game mode")
exit_game_mode = (
"Exited game mode",
"Couldn't exit game mode")
is_visible = (
"Entity is visible",
"Entity was not visible")
is_hidden = (
"Entity is hidden",
"Entity was not hidden")
entity_deleted = (
"Entity deleted",
"Entity was not deleted")
deletion_undo = (
"UNDO deletion success",
"UNDO deletion failed")
deletion_redo = (
"REDO deletion success",
"REDO deletion failed")
def AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity():
"""
Summary:
Tests the PostFX Gradient Weight Modifier component can be added to an entity and has the expected functionality.
Test setup:
- Wait for Editor idle loop.
- Open the "Base" level.
Expected Behavior:
The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components.
Creation and deletion undo/redo should also work.
Test Steps:
1) Create a PostFX Gradient Weight Modifier entity with no components.
2) Add a PostFX Gradient Weight Modifier component to PostFX Gradient Weight Modifier entity.
3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition.
5) Verify PostFX Gradient Weight Modifier component not enabled.
6) Add PostFX Layer component since it is required by the PostFX Gradient Weight Modifier component.
7) Verify PostFX Gradient Weight Modifier component is enabled.
8) Enter/Exit game mode.
9) Test IsHidden.
10) Test IsVisible.
11) Delete PostFX Gradient Weight Modifier entity.
12) UNDO deletion.
13) REDO deletion.
14) Look for errors.
:return: None
"""
import azlmbr.legacy.general as general
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report, Tracer, TestHelper
with Tracer() as error_tracer:
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
TestHelper.open_level("", "Base")
# Test steps begin.
# 1. Create a PostFX Gradient Weight Modifier entity with no components.
postfx_gradient_weight_name = "PostFX Gradient Weight Modifier"
postfx_gradient_weight_entity = EditorEntity.create_editor_entity(postfx_gradient_weight_name)
Report.critical_result(Tests.postfx_gradient_weight_creation, postfx_gradient_weight_entity.exists())
# 2. Add a PostFX Gradient Weight Modifier component to PostFX Gradient Weight Modifier entity.
postfx_gradient_weight_component = postfx_gradient_weight_entity.add_component(postfx_gradient_weight_name)
Report.critical_result(
Tests.postfx_gradient_weight_component,
postfx_gradient_weight_entity.has_component(postfx_gradient_weight_name))
# 3. UNDO the entity creation and component addition.
# -> UNDO component addition.
general.undo()
# -> UNDO naming entity.
general.undo()
# -> UNDO selecting entity.
general.undo()
# -> UNDO entity creation.
general.undo()
general.idle_wait_frames(1)
Report.result(Tests.creation_undo, not postfx_gradient_weight_entity.exists())
# 4. REDO the entity creation and component addition.
# -> REDO entity creation.
general.redo()
# -> REDO selecting entity.
general.redo()
# -> REDO naming entity.
general.redo()
# -> REDO component addition.
general.redo()
general.idle_wait_frames(1)
Report.result(Tests.creation_redo, postfx_gradient_weight_entity.exists())
# 5. Verify PostFX Gradient Weight Modifier component not enabled.
Report.result(Tests.postfx_gradient_weight_disabled, not postfx_gradient_weight_component.is_enabled())
# 6. Add PostFX Layer component since it is required by the PostFX Gradient Weight Modifier component.
postfx_layer_name = "PostFX Layer"
postfx_gradient_weight_entity.add_component(postfx_layer_name)
Report.result(Tests.postfx_layer_component, postfx_gradient_weight_entity.has_component(postfx_layer_name))
# 7. Verify PostFX Gradient Weight Modifier component is enabled.
Report.result(Tests.postfx_gradient_weight_enabled, postfx_gradient_weight_component.is_enabled())
# 8. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode)
# 9. Test IsHidden.
postfx_gradient_weight_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, postfx_gradient_weight_entity.is_hidden() is True)
# 10. Test IsVisible.
postfx_gradient_weight_entity.set_visibility_state(True)
general.idle_wait_frames(1)
Report.result(Tests.is_visible, postfx_gradient_weight_entity.is_visible() is True)
# 11. Delete PostFX Gradient Weight Modifier entity.
postfx_gradient_weight_entity.delete()
Report.result(Tests.entity_deleted, not postfx_gradient_weight_entity.exists())
# 12. UNDO deletion.
general.undo()
Report.result(Tests.deletion_undo, postfx_gradient_weight_entity.exists())
# 13. REDO deletion.
general.redo()
Report.result(Tests.deletion_redo, not postfx_gradient_weight_entity.exists())
# 14. Look for errors or asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
for assert_info in error_tracer.asserts:
Report.info(f"Assert: {assert_info.filename} {assert_info.function} | {assert_info.message}")
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(AtomEditorComponents_PostFXGradientWeightModifier_AddedToEntity)
@@ -0,0 +1,207 @@
"""
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
"""
class Tests:
creation_undo = (
"UNDO Entity creation success",
"UNDO Entity creation failed")
creation_redo = (
"REDO Entity creation success",
"REDO Entity creation failed")
postfx_shape_weight_creation = (
"PostFx Shape Weight Modifier Entity successfully created",
"PostFx Shape Weight Modifier Entity failed to be created")
postfx_shape_weight_component = (
"Entity has a PostFx Shape Weight Modifier component",
"Entity failed to find PostFx Shape Weight Modifier component")
postfx_shape_weight_disabled = (
"PostFx Shape Weight Modifier component disabled",
"PostFx Shape Weight Modifier component was not disabled.")
postfx_layer_component = (
"Entity has a PostFX Layer component",
"Entity did not have an PostFX Layer component")
tube_shape_component = (
"Entity has a Tube Shape component",
"Entity did not have a Tube Shape component")
postfx_shape_weight_enabled = (
"PostFx Shape Weight Modifier component enabled",
"PostFx Shape Weight Modifier component was not enabled.")
enter_game_mode = (
"Entered game mode",
"Failed to enter game mode")
exit_game_mode = (
"Exited game mode",
"Couldn't exit game mode")
is_visible = (
"Entity is visible",
"Entity was not visible")
is_hidden = (
"Entity is hidden",
"Entity was not hidden")
entity_deleted = (
"Entity deleted",
"Entity was not deleted")
deletion_undo = (
"UNDO deletion success",
"UNDO deletion failed")
deletion_redo = (
"REDO deletion success",
"REDO deletion failed")
def AtomEditorComponents_postfx_shape_weight_AddedToEntity():
"""
Summary:
Tests the PostFx Shape Weight Modifier component can be added to an entity and has the expected functionality.
Test setup:
- Wait for Editor idle loop.
- Open the "Base" level.
Expected Behavior:
The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components.
Creation and deletion undo/redo should also work.
Test Steps:
1) Create a PostFx Shape Weight Modifier entity with no components.
2) Add a PostFx Shape Weight Modifier component to PostFx Shape Weight Modifier entity.
3) UNDO the entity creation and component addition.
4) REDO the entity creation and component addition.
5) Verify PostFx Shape Weight Modifier component not enabled.
6) Add PostFX Layer component since it is required by the PostFx Shape Weight Modifier component.
7) Verify PostFx Shape Weight Modifier component is NOT enabled since it also requires a shape.
8) Add a required shape looping over a list and checking if it enables PostFX Shape Weight Modifier.
9) Undo to remove each added shape and verify PostFX Shape Weight Modifier is not enabled.
10) Verify PostFx Shape Weight Modifier component is enabled by adding Spline and Tube Shape component.
11) Enter/Exit game mode.
12) Test IsHidden.
13) Test IsVisible.
14) Delete PostFx Shape Weight Modifier entity.
15) UNDO deletion.
16) REDO deletion.
17) Look for errors.
:return: None
"""
import azlmbr.legacy.general as general
from editor_python_test_tools.editor_entity_utils import EditorEntity
from editor_python_test_tools.utils import Report, Tracer, TestHelper
with Tracer() as error_tracer:
# Test setup begins.
# Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level.
TestHelper.init_idle()
TestHelper.open_level("", "Base")
# Test steps begin.
# 1. Create a PostFx Shape Weight Modifier entity with no components.
postfx_shape_weight_name = "PostFX Shape Weight Modifier"
postfx_shape_weight_entity = EditorEntity.create_editor_entity(postfx_shape_weight_name)
Report.critical_result(Tests.postfx_shape_weight_creation, postfx_shape_weight_entity.exists())
# 2. Add a PostFx Shape Weight Modifier component to PostFx Shape Weight Modifier entity.
postfx_shape_weight_component = postfx_shape_weight_entity.add_component(postfx_shape_weight_name)
Report.critical_result(
Tests.postfx_shape_weight_component,
postfx_shape_weight_entity.has_component(postfx_shape_weight_name))
# 3. UNDO the entity creation and component addition.
# -> UNDO component addition.
general.undo()
# -> UNDO naming entity.
general.undo()
# -> UNDO selecting entity.
general.undo()
# -> UNDO entity creation.
general.undo()
general.idle_wait_frames(1)
Report.result(Tests.creation_undo, not postfx_shape_weight_entity.exists())
# 4. REDO the entity creation and component addition.
# -> REDO entity creation.
general.redo()
# -> REDO selecting entity.
general.redo()
# -> REDO naming entity.
general.redo()
# -> REDO component addition.
general.redo()
general.idle_wait_frames(1)
Report.result(Tests.creation_redo, postfx_shape_weight_entity.exists())
# 5. Verify PostFx Shape Weight Modifier component not enabled.
Report.result(Tests.postfx_shape_weight_disabled, not postfx_shape_weight_component.is_enabled())
# 6. Add PostFX Layer component since it is required by the PostFx Shape Weight Modifier component.
postfx_layer_name = "PostFX Layer"
postfx_shape_weight_entity.add_component(postfx_layer_name)
Report.result(Tests.postfx_layer_component, postfx_shape_weight_entity.has_component(postfx_layer_name))
# 7. Verify PostFx Shape Weight Modifier component is NOT enabled since it also requires a shape.
Report.result(Tests.postfx_shape_weight_disabled, not postfx_shape_weight_component.is_enabled())
# 8. Add a required shape looping over a list and checking if it enables PostFX Shape Weight Modifier.
for shape in ['Axis Aligned Box Shape', 'Box Shape', 'Capsule Shape', 'Compound Shape', 'Cylinder Shape',
'Disk Shape', 'Polygon Prism Shape', 'Quad Shape', 'Sphere Shape', 'Vegetation Reference Shape']:
postfx_shape_weight_entity.add_component(shape)
test_shape = (
f"Entity has a {shape} component",
f"Entity did not have a {shape} component")
Report.result(test_shape, postfx_shape_weight_entity.has_component(shape))
# Check if required shape allows PostFX Shape Weight Modifier to be enabled
Report.result(Tests.postfx_shape_weight_enabled, postfx_shape_weight_component.is_enabled())
# 9. Undo to remove each added shape and verify PostFX Shape Weight Modifier is not enabled.
general.undo()
TestHelper.wait_for_condition(lambda: not postfx_shape_weight_entity.has_component(shape), 1.0)
Report.result(Tests.postfx_shape_weight_disabled, not postfx_shape_weight_component.is_enabled())
# 10. Verify PostFx Shape Weight Modifier component is enabled by adding Spline and Tube Shape component.
postfx_shape_weight_entity.add_components(['Spline', 'Tube Shape'])
Report.result(Tests.tube_shape_component, postfx_shape_weight_entity.has_component('Tube Shape'))
Report.result(Tests.postfx_shape_weight_enabled, postfx_shape_weight_component.is_enabled())
# 11. Enter/Exit game mode.
TestHelper.enter_game_mode(Tests.enter_game_mode)
general.idle_wait_frames(1)
TestHelper.exit_game_mode(Tests.exit_game_mode)
# 12. Test IsHidden.
postfx_shape_weight_entity.set_visibility_state(False)
Report.result(Tests.is_hidden, postfx_shape_weight_entity.is_hidden() is True)
# 13. Test IsVisible.
postfx_shape_weight_entity.set_visibility_state(True)
general.idle_wait_frames(1)
Report.result(Tests.is_visible, postfx_shape_weight_entity.is_visible() is True)
# 14. Delete PostFx Shape Weight Modifier entity.
postfx_shape_weight_entity.delete()
Report.result(Tests.entity_deleted, not postfx_shape_weight_entity.exists())
# 15. UNDO deletion.
general.undo()
Report.result(Tests.deletion_undo, postfx_shape_weight_entity.exists())
# 16. REDO deletion.
general.redo()
Report.result(Tests.deletion_redo, not postfx_shape_weight_entity.exists())
# 17. Look for errors or asserts.
TestHelper.wait_for_condition(lambda: error_tracer.has_errors or error_tracer.has_asserts, 1.0)
for error_info in error_tracer.errors:
Report.info(f"Error: {error_info.filename} {error_info.function} | {error_info.message}")
for assert_info in error_tracer.asserts:
Report.info(f"Assert: {assert_info.filename} {assert_info.function} | {assert_info.message}")
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(AtomEditorComponents_postfx_shape_weight_AddedToEntity)
@@ -66,7 +66,6 @@ def run():
general.close_pane("Error Log")
general.idle_wait(1.0)
general.run_console("r_displayInfo=0")
general.run_console("r_antialiasingmode=0")
general.idle_wait(1.0)
return True
@@ -82,7 +82,6 @@ def run():
general.close_pane("Error Log")
general.idle_wait(1.0)
general.run_console("r_displayInfo=0")
general.run_console("r_antialiasingmode=0")
general.idle_wait(1.0)
return True
@@ -149,7 +149,6 @@ class TestHelper:
general.idle_wait(1.0)
general.idle_wait(1.0)
general.run_console("r_displayInfo=0")
general.run_console("r_antialiasingmode=0")
general.idle_wait(1.0)
@@ -52,9 +52,6 @@ def Joints_BallLeadFollowerCollide():
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
import azlmbr.legacy.general as general
import azlmbr.bus
from JointsHelper import JointEntityCollisionAware
# Helper Entity class - self.collided flag is set when instance receives collision event.
@@ -75,17 +72,12 @@ def Joints_BallLeadFollowerCollide():
lead = Entity("lead")
follower = Entity("follower")
# 4) Wait for several seconds
general.idle_wait(2.0) # wait for lead and follower to move
# 4) Wait for collision between lead and follower or timeout
Report.critical_result(Tests.check_collision_happened, helper.wait_for_condition(lambda: lead.collided and follower.collided, 10.0))
# 5) Check to see if lead and follower behaved as expected
Report.critical_result(Tests.check_collision_happened, lead.collided and follower.collided)
# 6) Exit Game Mode
# 5) Exit Game Mode
helper.exit_game_mode(Tests.exit_game_mode)
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(Joints_BallLeadFollowerCollide)
@@ -52,11 +52,13 @@ def Joints_HingeNoLimitsConstrained():
"""
import os
import sys
import math
from editor_python_test_tools.utils import Report
from editor_python_test_tools.utils import TestHelper as helper
import azlmbr.legacy.general as general
import azlmbr.bus
import azlmbr.math as azmath
import JointsHelper
from JointsHelper import JointEntity
@@ -84,28 +86,65 @@ def Joints_HingeNoLimitsConstrained():
Report.info_vector3(lead.position, "lead initial position:")
Report.info_vector3(follower.position, "follower initial position:")
leadInitialPosition = lead.position
followerInitialPosition = follower.position
# 4) Wait for several seconds
general.idle_wait(4.0) # wait for lead and follower to move
# 4) Wait for the follower to move above and over the lead or Timeout
normalizedStartPos = JointsHelper.getRelativeVector(lead.position, follower.position)
normalizedStartPos = normalizedStartPos.GetNormalizedSafe()
class WaitCondition:
ANGLE_CHECKPOINT_1 = math.radians(90)
ANGLE_CHECKPOINT_2 = math.radians(200)
angleAchieved = 0.0
followerMovedAbove90Deg = False #this is expected to be true to pass the test
followerMovedAbove200Deg = False #this is expected to be true to pass the test
jointNormal = azmath.Vector3(0.0, -1.0, 0.0) # the joint rotates around the y axis
def checkConditionMet(self):
#calculate the current follower-lead vector
normalVec = JointsHelper.getRelativeVector(lead.position, follower.position)
normalVec = normalVec.GetNormalizedSafe()
#triple product and get the angle
tripleProduct = normalizedStartPos.dot(normalVec.cross(self.jointNormal))
currentAngle = math.acos(normalizedStartPos.Dot(normalVec))
if tripleProduct < 0:
currentAngle = (2*math.pi) - currentAngle
#if the angle is now less then last time, it is no longer rising, so end the test.
if currentAngle < self.angleAchieved:
return True
#once we're passed the final check point, end the test
if currentAngle > self.ANGLE_CHECKPOINT_2:
self.followerMovedAbove200Deg = True
return True
self.angleAchieved = currentAngle
self.followerMovedAbove90Deg = currentAngle > self.ANGLE_CHECKPOINT_1
return False
def isFollowerPositionCorrect(self):
return self.followerMovedAbove90Deg and self.followerMovedAbove200Deg
waitCondition = WaitCondition()
MAX_WAIT_TIME = 10.0 #seconds
conditionMet = helper.wait_for_condition(lambda: waitCondition.checkConditionMet(), MAX_WAIT_TIME)
# 5) Check to see if lead and follower behaved as expected
Report.info_vector3(lead.position, "lead position after 1 second:")
Report.info_vector3(follower.position, "follower position after 1 second:")
Report.info_vector3(lead.position, "lead position after test run:")
Report.info_vector3(follower.position, "follower position after test run:")
leadPositionDelta = lead.position.Subtract(leadInitialPosition)
leadRemainedStill = JointsHelper.vector3SmallerThanScalar(leadPositionDelta, FLOAT_EPSILON)
Report.critical_result(Tests.check_lead_position, leadRemainedStill)
followerSwingedOverLead = (follower.position.x < leadInitialPosition.x and
follower.position.z > leadInitialPosition.z)
Report.critical_result(Tests.check_follower_position, followerSwingedOverLead)
Report.critical_result(Tests.check_follower_position, conditionMet and waitCondition.isFollowerPositionCorrect())
# 6) Exit Game Mode
helper.exit_game_mode(Tests.exit_game_mode)
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(Joints_HingeNoLimitsConstrained)
@@ -187,7 +187,3 @@ def prepare_for_screenshot_compare(remote_console_instance):
"""
wait_for(lambda: _retry_command(remote_console_instance, 'r_displayinfo 0',
'$3r_DisplayInfo = $60 $5[DUMPTODISK, RESTRICTEDMODE]$4'))
wait_for(lambda: _retry_command(remote_console_instance, 'r_antialiasingmode 0',
'$3r_AntialiasingMode = $60 $5[]$4'))
wait_for(lambda: _retry_command(remote_console_instance, 'e_WaterOcean 0',
'$3e_WaterOcean = $60 $5[]$4'))
@@ -0,0 +1,101 @@
"""
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
"""
class Tests:
load_level = (
"Level loaded successfully",
"Failed to load the level"
)
create_entity = (
"Parent entity created successfully",
"Failed to create a parent entity"
)
set_entity_name = (
"Entity name set successfully",
"Failed to set entity name"
)
delete_entity = (
"Parent Entity deleted successfully",
"Failed to delete parent entity"
)
create_child_entity = (
"Child entity created successfully",
"Failed to create a child entity"
)
delete_child_entity = (
"Child entity deleted successfully",
"Failed to delete child entity"
)
add_mesh_component = (
"Mesh component added successfully",
"Failed to add mesh component"
)
found_component_typeId = (
"Found component typeId",
"Unable to find component TypeId"
)
remove_mesh_component = (
"Mesh component removed successfully",
"Failed to remove mesh component"
)
def BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD():
"""
Performing basic test in editor
01. Load exiting level
02. create parent entity and set name
03. create child entity and set a name
04. delete child entity
05. add mesh component to parent entity
06. delete parent entity
"""
from editor_python_test_tools.utils import Report
from editor_python_test_tools.editor_entity_utils import EditorEntity
import azlmbr.bus as bus
import azlmbr.editor as editor
import azlmbr.entity as entity
import azlmbr.legacy.general as general
import azlmbr.object
# 01. load an existing level
test_level = 'Simple'
general.open_level_no_prompt(test_level)
Report.result(Tests.load_level, general.get_current_level_name() == test_level)
# 02. create parent entity and set name
# Delete any exiting entity and Create a new Entity at the root level
search_filter = azlmbr.entity.SearchFilter()
all_entities = entity.SearchBus(azlmbr.bus.Broadcast, "SearchEntities", search_filter)
editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntities", all_entities)
parent_entity = EditorEntity.create_editor_entity("Parent_1")
Report.result(Tests.create_entity, parent_entity.exists())
# 03. Create child Entity to above created parent entity and set a name
child_1_entity = EditorEntity.create_editor_entity("Child_1", parent_entity.id )
Report.result(Tests.create_child_entity, child_1_entity.exists())
# 04. delete_Child_entity
child_1_entity.delete()
Report.result(Tests.delete_child_entity, not child_1_entity.exists())
# 05. add mesh component to parent entity
parent_entity.add_component("Mesh")
Report.result(Tests.add_mesh_component, parent_entity.has_component("Mesh"))
# 06. delete parent entity
parent_entity.delete()
Report.result(Tests.delete_entity, not parent_entity.exists())
if __name__ == "__main__":
from editor_python_test_tools.utils import Report
Report.start_test(BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD)
@@ -73,3 +73,7 @@ class TestAutomationAutoTestMode(EditorTestSuite):
@pytest.mark.skip(reason="Times out due to dialogs failing to dismiss: LYN-4208")
class test_Menus_FileMenuOptions_Work(EditorSharedTest):
from .EditorScripts import Menus_FileMenuOptions as test_module
class test_BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD(EditorSharedTest):
from .EditorScripts import BasicEditorWorkflows_ExistingLevel_EntityComponentCRUD as test_module
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:817bd8dd22e185136418b60fba5b3552993687515d3d5ae96791f2c3be907b92
size 7233
oid sha256:60276c07b45a734e4f71d695278167ea61e884f8b513906168c9642078ad5954
size 6045
@@ -0,0 +1,13 @@
{
"description": "",
"materialType": "Materials/Types/Skin.materialtype",
"parentMaterial": "",
"propertyLayoutVersion": 3,
"properties": {
"wrinkleLayers": {
"count": 3,
"enable": true,
"showBlendValues": true
}
}
}
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:53e17ec8155911c8b42e85436130f600bd6dddd8931a8ccb1b2f8a9f8674cc85
size 45104
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0da56a05daa0ec1c476cfe25ca6d3b65267c98886cf33408f6e852fb325a8e2c
size 198084
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e3537fbe9205731a242251c525a67bbb5f3b8f5307537f1dc0c318b5b885ce52
size 198112
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bd794d5dd4b749c3275bfab79b9b5ae3f8e007d3e6741c0566c9c2d3931123bf
size 198112
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:45ded862987a64061deffd8e4c9aa1dff4eec3bcff5f7b505679f1959e8ae137
size 51440
+1 -1
View File
@@ -102,7 +102,7 @@ ly_add_target(
3rdParty::Qt::Gui
3rdParty::Qt::Widgets
3rdParty::Qt::Concurrent
3rdParty::tiff
3rdParty::TIFF
3rdParty::squish-ccr
3rdParty::AWSNativeSDK::STS
Legacy::CryCommon
+10
View File
@@ -57,6 +57,7 @@ AZ_POP_DISABLE_WARNING
#include <AzFramework/StringFunc/StringFunc.h>
#include <AzFramework/Terrain/TerrainDataRequestBus.h>
#include <AzFramework/ProjectManager/ProjectManager.h>
#include <AzFramework/Spawnable/RootSpawnableInterface.h>
// AzToolsFramework
#include <AzToolsFramework/Component/EditorComponentAPIBus.h>
@@ -3021,6 +3022,15 @@ CCryEditApp::ECreateLevelResult CCryEditApp::CreateLevel(const QString& levelNam
bool bIsDocModified = GetIEditor()->GetDocument()->IsModified();
OnSwitchPhysics();
GetIEditor()->GetDocument()->SetModifiedFlag(bIsDocModified);
if (usePrefabSystemForLevels)
{
auto* rootSpawnableInterface = AzFramework::RootSpawnableInterface::Get();
if (rootSpawnableInterface)
{
rootSpawnableInterface->ProcessSpawnableQueue();
}
}
}
const QScopedValueRollback<bool> rollback(m_creatingNewLevel);
+2 -2
View File
@@ -1273,7 +1273,7 @@ bool CCryEditDoc::SaveLevel(const QString& filename)
if (savedEntities)
{
AZ_PROFILE_SCOPE(AzToolsFramework, "CCryEditDoc::SaveLevel Updated PakFile levelEntities.editor_xml");
pakFile.UpdateFile("LevelEntities.editor_xml", entitySaveBuffer.begin(), static_cast<int>(entitySaveBuffer.size()));
pakFile.UpdateFile("levelentities.editor_xml", entitySaveBuffer.begin(), static_cast<int>(entitySaveBuffer.size()));
// Save XML archive to pak file.
bool bSaved = xmlAr.SaveToPak(Path::GetPath(tempSaveFile), pakFile);
@@ -1501,7 +1501,7 @@ bool CCryEditDoc::LoadEntitiesFromLevel(const QString& levelPakFile)
bool pakOpened = pakSystem->OpenPack(levelPakFile.toUtf8().data());
if (pakOpened)
{
const QString entityFilename = Path::GetPath(levelPakFile) + "LevelEntities.editor_xml";
const QString entityFilename = Path::GetPath(levelPakFile) + "levelentities.editor_xml";
CCryFile entitiesFile;
if (entitiesFile.Open(entityFilename.toUtf8().data(), "rt"))
+3
View File
@@ -264,6 +264,9 @@ void EditorPreferencesDialog::SetFilter(const QString& filter)
else if (m_currentPageItem)
{
m_currentPageItem->UpdateEditorFilter(ui->propertyEditor, m_filter);
// Refresh the Stylesheet - when using search functionality.
AzQtComponents::StyleManager::repolishStyleSheet(this);
}
}
+12 -10
View File
@@ -14,6 +14,7 @@
// Editor
#include "Settings.h"
#include "EditorViewportSettings.h"
@@ -43,17 +44,16 @@ void CEditorPreferencesPage_Files::Reflect(AZ::SerializeContext& serialize)
->Field("MaxCount", &AutoBackup::m_maxCount)
->Field("RemindTime", &AutoBackup::m_remindTime);
serialize.Class<AssetBrowserSearch>()
serialize.Class<AssetBrowserSettings>()
->Version(1)
->Field("Max number of items displayed", &AssetBrowserSearch::m_maxNumberOfItemsShownInSearch);
->Field("MaxEntriesShownCount", &AssetBrowserSettings::m_maxNumberOfItemsShownInSearch);
serialize.Class<CEditorPreferencesPage_Files>()
->Version(1)
->Field("Files", &CEditorPreferencesPage_Files::m_files)
->Field("Editors", &CEditorPreferencesPage_Files::m_editors)
->Field("AutoBackup", &CEditorPreferencesPage_Files::m_autoBackup)
->Field("AssetBrowserSearch", &CEditorPreferencesPage_Files::m_assetBrowserSearch);
->Field("AssetBrowserSettings", &CEditorPreferencesPage_Files::m_assetBrowserSettings);
AZ::EditContext* editContext = serialize.GetEditContext();
if (editContext)
@@ -85,9 +85,10 @@ void CEditorPreferencesPage_Files::Reflect(AZ::SerializeContext& serialize)
->Attribute(AZ::Edit::Attributes::Max, 100)
->DataElement(AZ::Edit::UIHandlers::SpinBox, &AutoBackup::m_remindTime, "Remind Time", "Auto Remind Every (Minutes)");
editContext->Class<AssetBrowserSearch>("Asset Browser Search View", "Asset Browser Search View")
->DataElement(AZ::Edit::UIHandlers::SpinBox, &AssetBrowserSearch::m_maxNumberOfItemsShownInSearch, "Maximum number of displayed items",
"Maximum number of displayed items displayed in the Search View")
editContext->Class<AssetBrowserSettings>("Asset Browser Settings", "Asset Browser Settings")
->DataElement(
AZ::Edit::UIHandlers::SpinBox, &AssetBrowserSettings::m_maxNumberOfItemsShownInSearch, "Maximum number of displayed items",
"Maximum number of items to display in the Search View.")
->Attribute(AZ::Edit::Attributes::Min, 50)
->Attribute(AZ::Edit::Attributes::Max, 5000);
@@ -97,7 +98,7 @@ void CEditorPreferencesPage_Files::Reflect(AZ::SerializeContext& serialize)
->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_Files::m_files, "Files", "File Preferences")
->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_Files::m_editors, "External Editors", "External Editors")
->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_Files::m_autoBackup, "Auto Backup", "Auto Backup")
->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_Files::m_assetBrowserSearch, "Asset Browser Search", "Asset Browser Search");
->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_Files::m_assetBrowserSettings, "Asset Browser Settings","Asset Browser Settings");
}
}
@@ -117,6 +118,7 @@ QIcon& CEditorPreferencesPage_Files::GetIcon()
void CEditorPreferencesPage_Files::OnApply()
{
using namespace AzToolsFramework::SliceUtilities;
auto sliceSettings = AZ::UserSettings::CreateFind<SliceUserSettings>(AZ_CRC("SliceUserSettings", 0x055b32eb), AZ::UserSettings::CT_LOCAL);
sliceSettings->m_autoNumber = m_files.m_autoNumberSlices;
sliceSettings->m_saveLocation = m_files.m_saveLocation;
@@ -137,7 +139,7 @@ void CEditorPreferencesPage_Files::OnApply()
gSettings.autoBackupMaxCount = m_autoBackup.m_maxCount;
gSettings.autoRemindTime = m_autoBackup.m_remindTime;
gSettings.maxNumberOfItemsShownInSearch = m_assetBrowserSearch.m_maxNumberOfItemsShownInSearch;
SandboxEditor::SetMaxItemsShownInAssetBrowserSearch(m_assetBrowserSettings.m_maxNumberOfItemsShownInSearch);
}
void CEditorPreferencesPage_Files::InitializeSettings()
@@ -163,5 +165,5 @@ void CEditorPreferencesPage_Files::InitializeSettings()
m_autoBackup.m_maxCount = gSettings.autoBackupMaxCount;
m_autoBackup.m_remindTime = gSettings.autoRemindTime;
m_assetBrowserSearch.m_maxNumberOfItemsShownInSearch = gSettings.maxNumberOfItemsShownInSearch;
m_assetBrowserSettings.m_maxNumberOfItemsShownInSearch = SandboxEditor::MaxItemsShownInAssetBrowserSearch();
}
+4 -7
View File
@@ -69,18 +69,15 @@ private:
int m_remindTime;
};
struct AssetBrowserSearch
struct AssetBrowserSettings
{
AZ_TYPE_INFO(AssetBrowserSearch, "{9FBFCD24-9452-49DF-99F4-2711443CEAAE}")
int m_maxNumberOfItemsShownInSearch;
AZ_TYPE_INFO(AssetBrowserSettings, "{5F407EC4-BBD1-4A87-92DB-D938D7127BB0}")
AZ::u64 m_maxNumberOfItemsShownInSearch;
};
Files m_files;
ExternalEditors m_editors;
AutoBackup m_autoBackup;
AssetBrowserSearch m_assetBrowserSearch;
AssetBrowserSettings m_assetBrowserSettings;
QIcon m_icon;
};
+11
View File
@@ -15,6 +15,7 @@
namespace SandboxEditor
{
constexpr AZStd::string_view AssetBrowserMaxItemsShownInSearchSetting = "/Amazon/Preferences/Editor/AssetBrowser/MaxItemsShowInSearch";
constexpr AZStd::string_view GridSnappingSetting = "/Amazon/Preferences/Editor/GridSnapping";
constexpr AZStd::string_view GridSizeSetting = "/Amazon/Preferences/Editor/GridSize";
constexpr AZStd::string_view AngleSnappingSetting = "/Amazon/Preferences/Editor/AngleSnapping";
@@ -110,6 +111,16 @@ namespace SandboxEditor
return AZStd::make_unique<EditorViewportSettingsCallbacksImpl>();
}
AZ::u64 MaxItemsShownInAssetBrowserSearch()
{
return GetRegistry(AssetBrowserMaxItemsShownInSearchSetting, aznumeric_cast<AZ::u64>(50));
}
void SetMaxItemsShownInAssetBrowserSearch(const AZ::u64 numberOfItemsShown)
{
SetRegistry(AssetBrowserMaxItemsShownInSearchSetting, numberOfItemsShown);
}
bool GridSnappingEnabled()
{
return GetRegistry(GridSnappingSetting, false);
+3
View File
@@ -32,6 +32,9 @@ namespace SandboxEditor
//! event will fire when a value in the settings registry (editorpreferences.setreg) is modified.
SANDBOX_API AZStd::unique_ptr<EditorViewportSettingsCallbacks> CreateEditorViewportSettingsCallbacks();
SANDBOX_API AZ::u64 MaxItemsShownInAssetBrowserSearch();
SANDBOX_API void SetMaxItemsShownInAssetBrowserSearch(AZ::u64 numberOfItemsShown);
SANDBOX_API bool GridSnappingEnabled();
SANDBOX_API void SetGridSnapping(bool enabled);
-35
View File
@@ -108,15 +108,11 @@ CObjectManager::CObjectManager()
m_objectsByName.reserve(1024);
LoadRegistry();
AzToolsFramework::ViewportEditorModeNotificationsBus::Handler::BusConnect(AzToolsFramework::GetEntityContextId());
}
//////////////////////////////////////////////////////////////////////////
CObjectManager::~CObjectManager()
{
AzToolsFramework::ViewportEditorModeNotificationsBus::Handler::BusDisconnect();
m_bExiting = true;
SaveRegistry();
DeleteAllObjects();
@@ -2307,37 +2303,6 @@ void CObjectManager::SelectObjectInRect(CBaseObject* pObj, CViewport* view, HitC
}
}
void CObjectManager::OnEditorModeActivated(
[[maybe_unused]] const AzToolsFramework::ViewportEditorModesInterface& editorModeState, AzToolsFramework::ViewportEditorMode mode)
{
if (mode == AzToolsFramework::ViewportEditorMode::Component)
{
// hide current gizmo for entity (translate/rotate/scale)
IGizmoManager* gizmoManager = GetGizmoManager();
const size_t gizmoCount = static_cast<size_t>(gizmoManager->GetGizmoCount());
for (size_t i = 0; i < gizmoCount; ++i)
{
gizmoManager->RemoveGizmo(gizmoManager->GetGizmoByIndex(static_cast<int>(i)));
}
}
}
void CObjectManager::OnEditorModeDeactivated(
[[maybe_unused]] const AzToolsFramework::ViewportEditorModesInterface& editorModeState, AzToolsFramework::ViewportEditorMode mode)
{
if (mode == AzToolsFramework::ViewportEditorMode::Component)
{
// show translate/rotate/scale gizmo again
if (IGizmoManager* gizmoManager = GetGizmoManager())
{
if (CBaseObject* selectedObject = GetIEditor()->GetSelectedObject())
{
gizmoManager->AddGizmo(new CAxisGizmo(selectedObject));
}
}
}
}
//////////////////////////////////////////////////////////////////////////
namespace
{
-8
View File
@@ -20,7 +20,6 @@
#include "ObjectManagerEventBus.h"
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzToolsFramework/API/ViewportEditorModeTrackerNotificationBus.h>
#include <AzCore/EBus/EBus.h>
#include <AzCore/Component/Component.h>
#include <Include/SandboxAPI.h>
@@ -59,7 +58,6 @@ public:
*/
class CObjectManager
: public IObjectManager
, private AzToolsFramework::ViewportEditorModeNotificationsBus::Handler
{
public:
//! Selection functor callback.
@@ -330,12 +328,6 @@ private:
void FindDisplayableObjects(DisplayContext& dc, bool bDisplay);
// ViewportEditorModeNotificationsBus overrides ...
void OnEditorModeActivated(
const AzToolsFramework::ViewportEditorModesInterface& editorModeState, AzToolsFramework::ViewportEditorMode mode) override;
void OnEditorModeDeactivated(
const AzToolsFramework::ViewportEditorModesInterface& editorModeState, AzToolsFramework::ViewportEditorMode mode) override;
private:
typedef std::map<GUID, CBaseObjectPtr, guid_less_predicate> Objects;
Objects m_objects;
+3 -4
View File
@@ -10,6 +10,7 @@
#include "EditorDefs.h"
#include "Settings.h"
#include "EditorViewportSettings.h"
// Qt
#include <QGuiApplication>
@@ -487,7 +488,6 @@ void SEditorSettings::Save()
SaveValue("Settings", "AutoBackupTime", autoBackupTime);
SaveValue("Settings", "AutoBackupMaxCount", autoBackupMaxCount);
SaveValue("Settings", "AutoRemindTime", autoRemindTime);
SaveValue("Settings", "MaxDisplayedItemsNumInSearch", maxNumberOfItemsShownInSearch);
SaveValue("Settings", "CameraMoveSpeed", cameraMoveSpeed);
SaveValue("Settings", "CameraRotateSpeed", cameraRotateSpeed);
SaveValue("Settings", "StylusMode", stylusMode);
@@ -682,7 +682,6 @@ void SEditorSettings::Load()
LoadValue("Settings", "AutoBackupTime", autoBackupTime);
LoadValue("Settings", "AutoBackupMaxCount", autoBackupMaxCount);
LoadValue("Settings", "AutoRemindTime", autoRemindTime);
LoadValue("Settings", "MaxDisplayedItemsNumInSearch", maxNumberOfItemsShownInSearch);
LoadValue("Settings", "CameraMoveSpeed", cameraMoveSpeed);
LoadValue("Settings", "CameraRotateSpeed", cameraRotateSpeed);
LoadValue("Settings", "StylusMode", stylusMode);
@@ -1174,7 +1173,7 @@ AzToolsFramework::ConsoleColorTheme SEditorSettings::GetConsoleColorTheme() cons
return consoleBackgroundColorTheme;
}
int SEditorSettings::GetMaxNumberOfItemsShownInSearchView() const
AZ::u64 SEditorSettings::GetMaxNumberOfItemsShownInSearchView() const
{
return SEditorSettings::maxNumberOfItemsShownInSearch;
return SandboxEditor::MaxItemsShownInAssetBrowserSearch();
}
+1 -9
View File
@@ -279,7 +279,7 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
SettingOutcome GetValue(const AZStd::string_view path) override;
SettingOutcome SetValue(const AZStd::string_view path, const AZStd::any& value) override;
AzToolsFramework::ConsoleColorTheme GetConsoleColorTheme() const override;
int GetMaxNumberOfItemsShownInSearchView() const override;
AZ::u64 GetMaxNumberOfItemsShownInSearchView() const override;
void ConvertPath(const AZStd::string_view sourcePath, AZStd::string& category, AZStd::string& attribute);
@@ -353,14 +353,6 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
int autoRemindTime;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Asset Browser Search View.
//////////////////////////////////////////////////////////////////////////
//! Current maximum number of items that can be displayed in the AssetBrowser Search View.
int maxNumberOfItemsShownInSearch;
//////////////////////////////////////////////////////////////////////////
//! If true preview windows is displayed when browsing geometries.
bool bPreviewGeometryWindow;
+2 -2
View File
@@ -1195,7 +1195,7 @@ bool CFileUtil::IsFileExclusivelyAccessable(const QString& strFilePath)
//////////////////////////////////////////////////////////////////////////
bool CFileUtil::CreatePath(const QString& strPath)
{
#if defined(AZ_PLATFORM_MAC)
#if !AZ_TRAIT_OS_USE_WINDOWS_FILE_PATHS
bool pathCreated = true;
QString cleanPath = QDir::cleanPath(strPath);
@@ -1252,7 +1252,7 @@ bool CFileUtil::CreatePath(const QString& strPath)
}
return true;
#endif
#endif // !AZ_TRAIT_OS_USE_WINDOWS_FILE_PATHS
}
//////////////////////////////////////////////////////////////////////////
+2 -2
View File
@@ -119,7 +119,7 @@ bool CXmlArchive::SaveToPak([[maybe_unused]] const QString& levelPath, CPakFile&
_smart_ptr<IXmlStringData> pXmlStrData = root->getXMLData(5000000);
// Save xml file.
QString xmlFilename = "Level.editor_xml";
QString xmlFilename = "level.editor_xml";
pakFile.UpdateFile(xmlFilename.toUtf8().data(), (void*)pXmlStrData->GetString(), static_cast<int>(pXmlStrData->GetStringLength()));
if (pakFile.GetArchive())
@@ -134,7 +134,7 @@ bool CXmlArchive::SaveToPak([[maybe_unused]] const QString& levelPath, CPakFile&
//////////////////////////////////////////////////////////////////////////
bool CXmlArchive::LoadFromPak(const QString& levelPath, CPakFile& pakFile)
{
QString xmlFilename = QDir(levelPath).absoluteFilePath("Level.editor_xml");
QString xmlFilename = QDir(levelPath).absoluteFilePath("level.editor_xml");
root = XmlHelpers::LoadXmlFromFile(xmlFilename.toUtf8().data());
if (!root)
{
@@ -225,8 +225,16 @@ namespace AZ
ConsoleCommandContainer commandSubset;
for (ConsoleFunctorBase* curr = m_head; curr != nullptr; curr = curr->m_next)
for (const auto& functor : m_commands)
{
if (functor.second.empty())
{
continue;
}
// Filter functors registered with the same name
const ConsoleFunctorBase* curr = functor.second.front();
if ((curr->GetFlags() & ConsoleFunctorFlags::IsInvisible) == ConsoleFunctorFlags::IsInvisible)
{
// Filter functors marked as invisible
@@ -236,7 +244,12 @@ namespace AZ
if (StringFunc::StartsWith(curr->m_name, command, false))
{
AZLOG_INFO("- %s : %s\n", curr->m_name, curr->m_desc);
commandSubset.push_back(curr->m_name);
if (commandSubset.size() < MaxConsoleCommandPlusArgsLength)
{
commandSubset.push_back(curr->m_name);
}
if (matches)
{
matches->push_back(curr->m_name);
@@ -271,7 +284,10 @@ namespace AZ
{
for (auto& curr : m_commands)
{
visitor(curr.second.front());
if (!curr.second.empty())
{
visitor(curr.second.front());
}
}
}
@@ -336,6 +352,11 @@ namespace AZ
{
iter->second.erase(iter2);
}
if (iter->second.empty())
{
m_commands.erase(iter);
}
}
functor->Unlink(m_head);
functor->m_console = nullptr;
@@ -40,6 +40,12 @@ namespace AZ
static unsigned int Record(StackFrame* frames, unsigned int maxNumOfFrames, unsigned int suppressCount = 0, void* nativeThread = 0);
};
class StackConverter
{
public:
static unsigned int FromNative(StackFrame* frames, unsigned int maxNumOfFrames, void* nativeContext);
};
class SymbolStorage
{
public:
+10 -6
View File
@@ -31,6 +31,8 @@ namespace AZ
{
namespace Debug
{
struct StackFrame;
namespace Platform
{
#if defined(AZ_ENABLE_DEBUG_TOOLS)
@@ -551,17 +553,19 @@ namespace AZ
{
StackFrame frames[25];
// Without StackFrame explicit alignment frames array is aligned to 4 bytes
// which causes the stack tracing to fail.
//size_t bla = AZStd::alignment_of<StackFrame>::value;
//printf("Alignment value %d address 0x%08x : 0x%08x\n",bla,frames);
SymbolStorage::StackLine lines[AZ_ARRAY_SIZE(frames)];
unsigned int numFrames = 0;
if (!nativeContext)
{
suppressCount += 1; /// If we don't provide a context we will capture in the RecordFunction, so skip us (Trace::PrinCallstack).
suppressCount += 1; /// If we don't provide a context we will capture in the RecordFunction, so skip us (Trace::PrintCallstack).
numFrames = StackRecorder::Record(frames, AZ_ARRAY_SIZE(frames), suppressCount);
}
unsigned int numFrames = StackRecorder::Record(frames, AZ_ARRAY_SIZE(frames), suppressCount, nativeContext);
else
{
numFrames = StackConverter::FromNative(frames, AZ_ARRAY_SIZE(frames), nativeContext);
}
if (numFrames)
{
SymbolStorage::DecodeFrames(frames, numFrames, lines);
+4 -2
View File
@@ -77,9 +77,11 @@ namespace AZ
public:
/**
* Allocator used by the EBus.
* The default setting is AZStd::allocator, which uses AZ::SystemAllocator.
* The default setting is Internal EBusEnvironmentAllocator
* EBus code stores their Context instances in static memory
* Therfore the configured allocator must last as long as the EBus in a module
*/
using AllocatorType = AZStd::allocator;
using AllocatorType = AZ::Internal::EBusEnvironmentAllocator;
/**
* Defines how many handlers can connect to an address on the EBus
@@ -15,7 +15,7 @@ using namespace Intersect;
// IntersectSegmentTriangleCCW
// [10/21/2009]
//=========================================================================
int Intersect::IntersectSegmentTriangleCCW(
bool Intersect::IntersectSegmentTriangleCCW(
const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c,
/*float &u, float &v, float &w,*/ Vector3& normal, float& t)
{
@@ -34,7 +34,7 @@ int Intersect::IntersectSegmentTriangleCCW(
float d = qp.Dot(normal);
if (d <= 0.0f)
{
return 0;
return false;
}
// Compute intersection t value of pq with plane of triangle. A ray
@@ -46,7 +46,7 @@ int Intersect::IntersectSegmentTriangleCCW(
// range segment check t[0,1] (it this case [0,d])
if (t < 0.0f || t > d)
{
return 0;
return false;
}
// Compute barycentric coordinate components and test if within bounds
@@ -54,12 +54,12 @@ int Intersect::IntersectSegmentTriangleCCW(
v = ac.Dot(e);
if (v < 0.0f || v > d)
{
return 0;
return false;
}
w = -ab.Dot(e);
if (w < 0.0f || v + w > d)
{
return 0;
return false;
}
// Segment/ray intersects triangle. Perform delayed division and
@@ -72,14 +72,14 @@ int Intersect::IntersectSegmentTriangleCCW(
normal.Normalize();
return 1;
return true;
}
//=========================================================================
// IntersectSegmentTriangle
// [10/21/2009]
//=========================================================================
int
bool
Intersect::IntersectSegmentTriangle(
const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c,
/*float &u, float &v, float &w,*/ Vector3& normal, float& t)
@@ -111,7 +111,7 @@ Intersect::IntersectSegmentTriangle(
// so either have a parallel ray or our normal is flipped
if (d >= -Constants::FloatEpsilon)
{
return 0; // parallel
return false; // parallel
}
d = -d;
e = ap.Cross(qp);
@@ -125,19 +125,19 @@ Intersect::IntersectSegmentTriangle(
// range segment check t[0,1] (it this case [0,d])
if (t < 0.0f || t > d)
{
return 0;
return false;
}
// Compute barycentric coordinate components and test if within bounds
v = ac.Dot(e);
if (v < 0.0f || v > d)
{
return 0;
return false;
}
w = -ab.Dot(e);
if (w < 0.0f || v + w > d)
{
return 0;
return false;
}
// Segment/ray intersects the triangle. Perform delayed division and
@@ -150,14 +150,14 @@ Intersect::IntersectSegmentTriangle(
normal.Normalize();
return 1;
return true;
}
//=========================================================================
// TestSegmentAABBOrigin
// [10/21/2009]
//=========================================================================
int
bool
AZ::Intersect::TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& halfVector, const Vector3& aabbExtends)
{
const Vector3 EPSILON(0.001f); // \todo this is slow load move to a const
@@ -168,7 +168,7 @@ AZ::Intersect::TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& hal
// Try world coordinate axes as separating axes
if (!absMidpoint.IsLessEqualThan(absHalfMidpoint))
{
return 0;
return false;
}
// Add in an epsilon term to counteract arithmetic errors when segment is
@@ -188,11 +188,11 @@ AZ::Intersect::TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& hal
Vector3 ead(ey * adz + ez * ady, ex * adz + ez * adx, ex * ady + ey * adx);
if (!absMDCross.IsLessEqualThan(ead))
{
return 0;
return false;
}
// No separating axis found; segment must be overlapping AABB
return 1;
return true;
}
@@ -200,7 +200,7 @@ AZ::Intersect::TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& hal
// IntersectRayAABB
// [10/21/2009]
//=========================================================================
int
RayAABBIsectTypes
AZ::Intersect::IntersectRayAABB(
const Vector3& rayStart, const Vector3& dir, const Vector3& dirRCP, const Aabb& aabb,
float& tStart, float& tEnd, Vector3& startNormal /*, Vector3& inter*/)
@@ -356,7 +356,7 @@ AZ::Intersect::IntersectRayAABB(
// IntersectRayAABB2
// [2/18/2011]
//=========================================================================
int
RayAABBIsectTypes
AZ::Intersect::IntersectRayAABB2(const Vector3& rayStart, const Vector3& dirRCP, const Aabb& aabb, float& start, float& end)
{
float tmin, tmax, tymin, tymax, tzmin, tzmax;
@@ -408,7 +408,7 @@ AZ::Intersect::IntersectRayAABB2(const Vector3& rayStart, const Vector3& dirRCP,
return ISECT_RAY_AABB_ISECT;
}
int AZ::Intersect::IntersectRayDisk(
bool AZ::Intersect::IntersectRayDisk(
const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& diskCenter, const float diskRadius, const Vector3& diskNormal, float& t)
{
// First intersect with the plane of the disk
@@ -421,10 +421,10 @@ int AZ::Intersect::IntersectRayDisk(
if (pointOnPlane.GetDistance(diskCenter) < diskRadius)
{
t = planeIntersectionDistance;
return 1;
return true;
}
}
return 0;
return false;
}
// Reference: Real-Time Collision Detection - 5.3.7 Intersecting Ray or Segment Against Cylinder, and the book's errata.
@@ -1012,7 +1012,7 @@ int AZ::Intersect::IntersectRayQuad(
}
// reference: Real-Time Collision Detection, 5.3.3 Intersecting Ray or Segment Against Box
int AZ::Intersect::IntersectRayBox(
bool AZ::Intersect::IntersectRayBox(
const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& boxCenter, const Vector3& boxAxis1,
const Vector3& boxAxis2, const Vector3& boxAxis3, float boxHalfExtent1, float boxHalfExtent2, float boxHalfExtent3, float& t)
{
@@ -1044,7 +1044,7 @@ int AZ::Intersect::IntersectRayBox(
// If the ray is parallel to the slab and the ray origin is outside, return no intersection.
if (tp < 0.0f || tn < 0.0f)
{
return 0;
return false;
}
}
else
@@ -1065,7 +1065,7 @@ int AZ::Intersect::IntersectRayBox(
tmax = AZ::GetMin(tmax, t2);
if (tmin > tmax)
{
return 0;
return false;
}
}
@@ -1085,7 +1085,7 @@ int AZ::Intersect::IntersectRayBox(
// If the ray is parallel to the slab and the ray origin is outside, return no intersection.
if (tp < 0.0f || tn < 0.0f)
{
return 0;
return false;
}
}
else
@@ -1106,7 +1106,7 @@ int AZ::Intersect::IntersectRayBox(
tmax = AZ::GetMin(tmax, t2);
if (tmin > tmax)
{
return 0;
return false;
}
}
@@ -1126,7 +1126,7 @@ int AZ::Intersect::IntersectRayBox(
// If the ray is parallel to the slab and the ray origin is outside, return no intersection.
if (tp < 0.0f || tn < 0.0f)
{
return 0;
return false;
}
}
else
@@ -1147,15 +1147,15 @@ int AZ::Intersect::IntersectRayBox(
tmax = AZ::GetMin(tmax, t2);
if (tmin > tmax)
{
return 0;
return false;
}
}
t = (isRayOriginInsideBox ? tmax : tmin);
return 1;
return true;
}
int AZ::Intersect::IntersectRayObb(const Vector3& rayOrigin, const Vector3& rayDir, const Obb& obb, float& t)
bool AZ::Intersect::IntersectRayObb(const Vector3& rayOrigin, const Vector3& rayDir, const Obb& obb, float& t)
{
return AZ::Intersect::IntersectRayBox(rayOrigin, rayDir, obb.GetPosition(),
obb.GetAxisX(), obb.GetAxisY(), obb.GetAxisZ(),
@@ -1166,7 +1166,7 @@ int AZ::Intersect::IntersectRayObb(const Vector3& rayOrigin, const Vector3& rayD
// IntersectSegmentCylinder
// [10/21/2009]
//=========================================================================
int
CylinderIsectTypes
AZ::Intersect::IntersectSegmentCylinder(
const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t)
{
@@ -1225,7 +1225,7 @@ AZ::Intersect::IntersectSegmentCylinder(
return RR_ISECT_RAY_CYL_NONE; // No real roots; no intersection
}
t = (-b - Sqrt(discr)) / a;
int result = RR_ISECT_RAY_CYL_PQ; // default along the PQ segment
CylinderIsectTypes result = RR_ISECT_RAY_CYL_PQ; // default along the PQ segment
if (md + t * nd < 0.0f)
{
@@ -1294,7 +1294,7 @@ AZ::Intersect::IntersectSegmentCylinder(
// IntersectSegmentCapsule
// [10/21/2009]
//=========================================================================
int
CapsuleIsectTypes
AZ::Intersect::IntersectSegmentCapsule(const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t)
{
int result = IntersectSegmentCylinder(sa, dir, p, q, r, t);
@@ -1361,13 +1361,13 @@ AZ::Intersect::IntersectSegmentCapsule(const Vector3& sa, const Vector3& dir, co
// IntersectSegmentPolyhedron
// [10/21/2009]
//=========================================================================
int
bool
AZ::Intersect::IntersectSegmentPolyhedron(
const Vector3& sa, const Vector3& sBA, const Plane p[], int numPlanes,
const Vector3& sa, const Vector3& dir, const Plane p[], int numPlanes,
float& tfirst, float& tlast, int& iFirstPlane, int& iLastPlane)
{
// Compute direction vector for the segment
Vector3 d = /*b - a*/ sBA;
Vector3 d = /*b - a*/ dir;
// Set initial interval to being the whole segment. For a ray, tlast should be
// set to +RR_FLT_MAX. For a line, additionally tfirst should be set to -RR_FLT_MAX
tfirst = 0.0f;
@@ -1388,7 +1388,7 @@ AZ::Intersect::IntersectSegmentPolyhedron(
// If so, return "no intersection" if segment lies outside plane
if (dist < 0.0f)
{
return 0;
return false;
}
}
else
@@ -1417,7 +1417,7 @@ AZ::Intersect::IntersectSegmentPolyhedron(
// Exit with "no intersection" if intersection becomes empty
if (tfirst > tlast)
{
return 0;
return false;
}
}
}
@@ -1425,11 +1425,11 @@ AZ::Intersect::IntersectSegmentPolyhedron(
//DBG_Assert(iFirstPlane!=-1&&iLastPlane!=-1,("We have some bad border case to have only one plane, fix this function!"));
if (iFirstPlane == -1 && iLastPlane == -1)
{
return 0;
return false;
}
// A nonzero logical intersection, so the segment intersects the polyhedron
return 1;
return true;
}
//=========================================================================
@@ -1442,7 +1442,7 @@ AZ::Intersect::ClosestSegmentSegment(
const Vector3& segment2Start, const Vector3& segment2End,
float& segment1Proportion, float& segment2Proportion,
Vector3& closestPointSegment1, Vector3& closestPointSegment2,
float epsilon /*= 1e-4f*/ )
float epsilon)
{
const Vector3 segment1 = segment1End - segment1Start;
const Vector3 segment2 = segment2End - segment2Start;
@@ -5,363 +5,398 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#ifndef AZCORE_MATH_SEGMENT_INTERSECTION_H
#define AZCORE_MATH_SEGMENT_INTERSECTION_H
#pragma once
#include <AzCore/Math/Vector3.h>
#include <AzCore/Math/Aabb.h>
#include <AzCore/Math/Obb.h>
#include <AzCore/Math/Plane.h>
/// \file isect_segment.h
#include <AzCore/Math/Vector3.h>
namespace AZ
{
namespace Intersect
{
//! LineToPointDistanceTime computes the time of the shortest distance from point 'p' to segment (s1,s2).
//! To calculate the point of intersection:
//! P = s1 + u (s2 - s1)
//! @param s1 segment start point
//! @param s2 segment end point
//! @param p point to find the closest time to.
//! @return time (on the segment) for the shortest distance from 'p' to (s1,s2) [0.0f (s1),1.0f (s2)]
inline float LineToPointDistanceTime(const Vector3& s1, const Vector3& s21, const Vector3& p)
{
// so u = (p.x - s1.x)*(s2.x - s1.x) + (p.y - s1.y)*(s2.y - s1.y) + (p.z-s1.z)*(s2.z-s1.z) / |s2-s1|^2
return s21.Dot(p - s1) / s21.Dot(s21);
}
//! To calculate the point of intersection: P = s1 + u (s2 - s1)
//! @param s1 Segment start point.
//! @param s2 Segment end point.
//! @param p Point to find the closest time to.
//! @return Time (on the segment) for the shortest distance from 'p' to (s1,s2) [0.0f (s1),1.0f (s2)]
float LineToPointDistanceTime(const Vector3& s1, const Vector3& s21, const Vector3& p);
//! LineToPointDistance computes the closest point to 'p' from a segment (s1,s2).
//! @param s1 segment start point
//! @param s2 segment end point
//! @param p point to find the closest time to.
//! @param u time (on the segment) for the shortest distance from 'p' to (s1,s2) [0.0f (s1),1.0f (s2)]
//! @return the closest point
inline Vector3 LineToPointDistance(const Vector3& s1, const Vector3& s2, const Vector3& p, float& u)
{
const Vector3 s21 = s2 - s1;
// we assume seg1 and seg2 are NOT coincident
AZ_MATH_ASSERT(!s21.IsClose(Vector3(0.0f), 1e-4f), "OK we agreed that we will pass valid segments! (s1 != s2)");
u = LineToPointDistanceTime(s1, s21, p);
return s1 + u * s21;
}
//! @param s1 Segment start point
//! @param s2 Segment end point
//! @param p Point to find the closest time to.
//! @param u Time (on the segment) for the shortest distance from 'p' to (s1,s2) [0.0f (s1),1.0f (s2)]
//! @return The closest point
Vector3 LineToPointDistance(const Vector3& s1, const Vector3& s2, const Vector3& p, float& u);
//! Given segment pq and triangle abc (CCW), returns whether segment intersects
//! triangle and if so, also returns the barycentric coordinates (u,v,w)
//! of the intersection point.
//! @param p segment start point
//! @param q segment end point
//! @param a triangle point 1
//! @param b triangle point 2
//! @param c triangle point 3
//! @param normal at the intersection point.
//! @param t time of intersection along the segment [0.0 (p), 1.0 (q)]
//! @return 1 if the segment intersects the triangle otherwise 0
int IntersectSegmentTriangleCCW(
const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c,
/*float &u, float &v, float &w,*/ Vector3& normal, float& t);
//! @param p Segment start point.
//! @param q Segment end point.
//! @param a Triangle point 1.
//! @param b Triangle point 2.
//! @param c Triangle point 3.
//! @param normal At the intersection point.
//! @param t Time of intersection along the segment [0.0 (p), 1.0 (q)].
//! @return true if the segments intersects the triangle otherwise false.
bool IntersectSegmentTriangleCCW(
const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c, Vector3& normal, float& t);
//! Same as \ref IntersectSegmentTriangleCCW without respecting the triangle (a,b,c) vertex order (double sided).
int IntersectSegmentTriangle(
const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c,
/*float &u, float &v, float &w,*/ Vector3& normal, float& t);
//! @param p Segment start point.
//! @param q Segment end point.
//! @param a Triangle point 1.
//! @param b Triangle point 2.
//! @param c Triangle point 3.
//! @param normal At the intersection point.
//! @param t Time of intersection along the segment [0.0 (p), 1.0 (q)].
//! @return True if the segments intersects the triangle otherwise false.
bool IntersectSegmentTriangle(
const Vector3& p, const Vector3& q, const Vector3& a, const Vector3& b, const Vector3& c, Vector3& normal, float& t);
//! Ray aabb intersection result types.
enum RayAABBIsectTypes
enum RayAABBIsectTypes : AZ::s32
{
ISECT_RAY_AABB_NONE = 0, ///< no intersection
ISECT_RAY_AABB_SA_INSIDE, ///< the ray starts inside the aabb
ISECT_RAY_AABB_ISECT, ///< intersects along the PQ segment
ISECT_RAY_AABB_NONE = 0, ///< no intersection
ISECT_RAY_AABB_SA_INSIDE, ///< the ray starts inside the aabb
ISECT_RAY_AABB_ISECT, ///< intersects along the PQ segment
};
//! Intersect ray R(t) = rayStart + t*d against AABB a. When intersecting,
//! return intersection distance tmin and point q of intersection.
//! @param rayStart ray starting point
//! @param dir ray direction and length (dir = rayEnd - rayStart)
//! @param dirRCP 1/dir (reciprocal direction - we cache this result very often so we don't need to compute it multiple times, otherwise just use dir.GetReciprocal())
//! @param rayStart Ray starting point
//! @param dir Ray direction and length (dir = rayEnd - rayStart)
//! @param dirRCP 1/dir (reciprocal direction - we cache this result very often so we don't need to compute it multiple times,
//! otherwise just use dir.GetReciprocal())
//! @param aabb Axis aligned bounding box to intersect against
//! @param tStart time on ray of the first intersection [0,1] or 0 if the ray starts inside the aabb - check the return value
//! @param tEnd time of the of the second intersection [0,1] (it can be > 1 if intersects after the rayEnd)
//! @param startNormal normal at the start point.
//! @param tStart Time on ray of the first intersection [0,1] or 0 if the ray starts inside the aabb - check the return value
//! @param tEnd Time of the of the second intersection [0,1] (it can be > 1 if intersects after the rayEnd)
//! @param startNormal Normal at the start point.
//! @return \ref RayAABBIsectTypes
int IntersectRayAABB(
const Vector3& rayStart, const Vector3& dir, const Vector3& dirRCP, const Aabb& aabb,
float& tStart, float& tEnd, Vector3& startNormal /*, Vector3& inter*/);
RayAABBIsectTypes IntersectRayAABB(
const Vector3& rayStart,
const Vector3& dir,
const Vector3& dirRCP,
const Aabb& aabb,
float& tStart,
float& tEnd,
Vector3& startNormal);
//! Intersect ray against AABB.
//! @param rayStart ray starting point.
//! @param dir ray reciprocal direction.
//! @param rayStart Ray starting point.
//! @param dir Ray reciprocal direction.
//! @param aabb Axis aligned bounding box to intersect against.
//! @param start length on ray of the first intersection.
//! @param end length of the of the second intersection.
//! @return \ref RayAABBIsectTypes In this faster version than IntersectRayAABB we return only ISECT_RAY_AABB_NONE and ISECT_RAY_AABB_ISECT.
//! You can check yourself for that case.
int IntersectRayAABB2(
const Vector3& rayStart, const Vector3& dirRCP, const Aabb& aabb,
float& start, float& end);
//! @param start Length on ray of the first intersection.
//! @param end Length of the of the second intersection.
//! @return \ref RayAABBIsectTypes In this faster version than IntersectRayAABB we return only ISECT_RAY_AABB_NONE and
//! ISECT_RAY_AABB_ISECT. You can check yourself for that case.
RayAABBIsectTypes IntersectRayAABB2(const Vector3& rayStart, const Vector3& dirRCP, const Aabb& aabb, float& start, float& end);
//! Clip a ray to an aabb. return true if ray was clipped. The ray
//! can be inside so don't use the result if the ray intersect the box.
inline int ClipRayWithAabb(
const Aabb& aabb, Vector3& rayStart, Vector3& rayEnd, float& tClipStart, float& tClipEnd)
{
Vector3 startNormal;
float tStart, tEnd;
Vector3 dirLen = rayEnd - rayStart;
if (IntersectRayAABB(rayStart, dirLen, dirLen.GetReciprocal(), aabb, tStart, tEnd, startNormal) != ISECT_RAY_AABB_NONE)
{
// clip the ray with the box
if (tStart > 0.0f)
{
rayStart = rayStart + tStart * dirLen;
tClipStart = tStart;
}
if (tEnd < 1.0f)
{
rayEnd = rayStart + tEnd * dirLen;
tClipEnd = tEnd;
}
return 1;
}
return 0;
}
//! @param aabb Bounds to test against.
//! @param rayStart The start of the ray.
//! @param rayEnd The end of the ray.
//! @param[out] tClipStart The proportion where the ray enters the \ref Aabb.
//! @param[out] tClipEnd The proportion where the ray exits the \ref Aabb.
//! @return True if the ray was clipped, otherwise false.
bool ClipRayWithAabb(const Aabb& aabb, Vector3& rayStart, Vector3& rayEnd, float& tClipStart, float& tClipEnd);
//! Test segment and aabb where the segment is defined by midpoint
//! midPoint = (p1-p0) * 0.5f and half vector halfVector = p1 - midPoint.
//! the aabb is at the origin and defined by half extents only.
//! @return 1 if the intersect, otherwise 0.
int TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& halfVector, const Vector3& aabbExtends);
//! @param midPoint Midpoint of a line segment.
//! @param halfVector Half vector of an aabb.
//! @param aabbExtends The extends of a bounded box.
//! @return True if the segment and AABB intersect, otherwise false
bool TestSegmentAABBOrigin(const Vector3& midPoint, const Vector3& halfVector, const Vector3& aabbExtends);
//! Test if segment specified by points p0 and p1 intersects AABB. \ref TestSegmentAABBOrigin
//! @return 1 if the segment and AABB intersect, otherwise 0.
inline int TestSegmentAABB(const Vector3& p0, const Vector3& p1, const Aabb& aabb)
{
Vector3 e = aabb.GetExtents();
Vector3 d = p1 - p0;
Vector3 m = p0 + p1 - aabb.GetMin() - aabb.GetMax();
return TestSegmentAABBOrigin(m, d, e);
}
//! Test if segment specified by points p0 and p1 intersects AABB. \ref TestSegmentAABBOrigin.
//! @param p0 Segment start point.
//! @param p1 Segment end point.
//! @param aabb Bounded box to test against.
//! @return True if the segment and AABB intersect, otherwise false.
bool TestSegmentAABB(const Vector3& p0, const Vector3& p1, const Aabb& aabb);
//! Ray sphere intersection result types.
enum SphereIsectTypes
enum SphereIsectTypes : AZ::s32
{
ISECT_RAY_SPHERE_SA_INSIDE = -1, // the ray starts inside the cylinder
ISECT_RAY_SPHERE_NONE, // no intersection
ISECT_RAY_SPHERE_ISECT, // along the PQ segment
ISECT_RAY_SPHERE_SA_INSIDE = -1, //!< The ray starts inside the cylinder
ISECT_RAY_SPHERE_NONE, //!< No intersection
ISECT_RAY_SPHERE_ISECT, //!< Along the PQ segment
};
//! IntersectRaySphereOrigin
//! return time t>=0 but not limited, so if you check a segment make sure
//! t <= segmentLen
//! @param rayStart ray start point
//! t <= segmentLen.
//! @param rayStart ray start point.
//! @param rayDirNormalized ray direction normalized.
//! @param shereRadius sphere radius
//! @param shereRadius Radius of sphere at origin.
//! @param time of closest intersection [0,+INF] in relation to the normalized direction.
//! @return \ref SphereIsectTypes
AZ_INLINE int IntersectRaySphereOrigin(
const Vector3& rayStart, const Vector3& rayDirNormalized,
const float sphereRadius, float& t)
{
Vector3 m = rayStart;
float b = m.Dot(rayDirNormalized);
float c = m.Dot(m) - sphereRadius * sphereRadius;
// Exit if r's origin outside s (c > 0)and r pointing away from s (b > 0)
if (c > 0.0f && b > 0.0f)
{
return ISECT_RAY_SPHERE_NONE;
}
float discr = b * b - c;
// A negative discriminant corresponds to ray missing sphere
if (discr < 0.0f)
{
return ISECT_RAY_SPHERE_NONE;
}
// Ray now found to intersect sphere, compute smallest t value of intersection
t = -b - Sqrt(discr);
// If t is negative, ray started inside sphere so clamp t to zero
if (t < 0.0f)
{
// t = 0.0f;
return ISECT_RAY_SPHERE_SA_INSIDE; // no hit if inside
}
//q = p + t * d;
return ISECT_RAY_SPHERE_ISECT;
}
//! @return \ref SphereIsectTypes.
SphereIsectTypes IntersectRaySphereOrigin(
const Vector3& rayStart, const Vector3& rayDirNormalized, const float sphereRadius, float& t);
//! Intersect ray (rayStart,rayDirNormalized) and sphere (sphereCenter,sphereRadius) \ref IntersectRaySphereOrigin
inline int IntersectRaySphere(
const Vector3& rayStart, const Vector3& rayDirNormalized, const Vector3& sphereCenter, const float sphereRadius, float& t)
{
return IntersectRaySphereOrigin(rayStart - sphereCenter, rayDirNormalized, sphereRadius, t);
}
//! @param rayStart The start of the ray.
//! @param rayDirNormalized The direction of the ray normalized.
//! @param sphereCenter The center of the sphere.
//! @param sphereRadius Radius of the sphere.
//! @param[out] t Coefficient in the ray's explicit equation from which an
//! intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @return SphereIsectTypes
SphereIsectTypes IntersectRaySphere(
const Vector3& rayStart, const Vector3& rayDirNormalized, const Vector3& sphereCenter, const float sphereRadius, float& t);
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param diskCenter Center point of the disk
//! @param diskRadius Radius of the disk
//! @param diskNormal A normal perpendicular to the disk
//! @param[out] t If returning 1 (indicating a hit), this contains distance from rayOrigin along the normalized rayDir that the hit occured at.
//! @return The number of intersecting points.
int IntersectRayDisk(
const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& diskCenter, const float diskRadius, const AZ::Vector3& diskNormal, float& t);
//! Intersect ray (rayStarty, rayDirNormalized) and disk (center, radius, normal)
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param diskCenter Center point of the disk.
//! @param diskRadius Radius of the disk.
//! @param diskNormal A normal perpendicular to the disk.
//! @param[out] t If returning 1 (indicating a hit), this contains distance from rayOrigin along the normalized rayDir
//! that the hit occured at.
//! @return False if not interesecting and true if intersecting
bool IntersectRayDisk(
const Vector3& rayOrigin,
const Vector3& rayDir,
const Vector3& diskCenter,
const float diskRadius,
const AZ::Vector3& diskNormal,
float& t);
//! If there is only one intersecting point, the coefficient is stored in \ref t1.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param cylinderEnd1 The center of the circle on one end of the cylinder.
//! @param cylinderDir The direction pointing from \ref cylinderEnd1 to the other end of the cylinder. It has to be unit length.
//! @param cylinderHeight The distance between two centers of the circles on two ends of the cylinder respectively.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param cylinderEnd1 The center of the circle on one end of the cylinder.
//! @param cylinderDir The direction pointing from \ref cylinderEnd1 to the other end of the cylinder. It has to be unit length.
//! @param cylinderHeight The distance between two centers of the circles on two ends of the cylinder respectively.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
int IntersectRayCappedCylinder(
const Vector3& rayOrigin, const Vector3& rayDir,
const Vector3& cylinderEnd1, const Vector3& cylinderDir, float cylinderHeight, float cylinderRadius,
float& t1, float& t2);
const Vector3& rayOrigin,
const Vector3& rayDir,
const Vector3& cylinderEnd1,
const Vector3& cylinderDir,
float cylinderHeight,
float cylinderRadius,
float& t1,
float& t2);
//! If there is only one intersecting point, the coefficient is stored in \ref t1.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param coneApex The apex of the cone.
//! @param coneDir The unit-length direction from the apex to the base.
//! @param coneHeight The height of the cone, from the apex to the base.
//! @param coneBaseRadius The radius of the cone base circle.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
//! @param rayOrigin The origin of the ray to test.
//! @param rayDir The direction of the ray to test. It has to be unit length.
//! @param coneApex The apex of the cone.
//! @param coneDir The unit-length direction from the apex to the base.
//! @param coneHeight The height of the cone, from the apex to the base.
//! @param coneBaseRadius The radius of the cone base circle.
//! @param[out] t1 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t1 * rayDir".
//! @param[out] t2 A possible coefficient in the ray's explicit equation from which an intersecting point is calculated as "rayOrigin + t2 * rayDir".
//! @return The number of intersecting points.
int IntersectRayCone(
const Vector3& rayOrigin, const Vector3& rayDir,
const Vector3& coneApex, const Vector3& coneDir, float coneHeight, float coneBaseRadius,
float& t1, float& t2);
const Vector3& rayOrigin,
const Vector3& rayDir,
const Vector3& coneApex,
const Vector3& coneDir,
float coneHeight,
float coneBaseRadius,
float& t1,
float& t2);
//! Test intersection between a ray and a plane in 3D.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param planePos A point on the plane to test intersection with.
//! @param planeNormal The normal of the plane to test intersection with.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return The number of intersection point.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param planePos A point on the plane to test intersection with.
//! @param planeNormal The normal of the plane to test intersection with.
//! @param[out] t The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return The number of intersection point.
int IntersectRayPlane(
const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& planePos,
const Vector3& planeNormal, float& t);
const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& planePos, const Vector3& planeNormal, float& t);
//! Test intersection between a ray and a two-sided quadrilateral defined by four points in 3D.
//! The four points that define the quadrilateral could be passed in with either counter clock-wise
//! The four points that define the quadrilateral could be passed in with either counter clock-wise
//! winding or clock-wise winding.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param vertexA One of the four points that define the quadrilateral.
//! @param vertexB One of the four points that define the quadrilateral.
//! @param vertexC One of the four points that define the quadrilateral.
//! @param vertexD One of the four points that define the quadrilateral.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return The number of intersection point.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param vertexA One of the four points that define the quadrilateral.
//! @param vertexB One of the four points that define the quadrilateral.
//! @param vertexC One of the four points that define the quadrilateral.
//! @param vertexD One of the four points that define the quadrilateral.
//! @param[out] t The coefficient in the ray's explicit equation from which the
//! intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return The number of intersection point.
int IntersectRayQuad(
const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& vertexA,
const Vector3& vertexB, const Vector3& vertexC, const Vector3& vertexD, float& t);
const Vector3& rayOrigin,
const Vector3& rayDir,
const Vector3& vertexA,
const Vector3& vertexB,
const Vector3& vertexC,
const Vector3& vertexD,
float& t);
//! Test intersection between a ray and an oriented box in 3D.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param boxCenter The position of the center of the box.
//! @param boxAxis1 An axis along one dimension of the oriented box.
//! @param boxAxis2 An axis along one dimension of the oriented box.
//! @param boxAxis3 An axis along one dimension of the oriented box.
//! @param boxHalfExtent1 The half extent of the box on the dimension of \ref boxAxis1.
//! @param boxHalfExtent2 The half extent of the box on the dimension of \ref boxAxis2.
//! @param boxHalfExtent3 The half extent of the box on the dimension of \ref boxAxis3.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return 1 if there is an intersection, 0 otherwise.
int IntersectRayBox(
const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& boxCenter, const Vector3& boxAxis1,
const Vector3& boxAxis2, const Vector3& boxAxis3, float boxHalfExtent1, float boxHalfExtent2, float boxHalfExtent3,
//! Test intersection between a ray and an oriented box in 3D.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param boxCenter The position of the center of the box.
//! @param boxAxis1 An axis along one dimension of the oriented box.
//! @param boxAxis2 An axis along one dimension of the oriented box.
//! @param boxAxis3 An axis along one dimension of the oriented box.
//! @param boxHalfExtent1 The half extent of the box on the dimension of \ref boxAxis1.
//! @param boxHalfExtent2 The half extent of the box on the dimension of \ref boxAxis2.
//! @param boxHalfExtent3 The half extent of the box on the dimension of \ref boxAxis3.
//! @param[out] t The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return true if there is an intersection, false otherwise.
bool IntersectRayBox(
const Vector3& rayOrigin,
const Vector3& rayDir,
const Vector3& boxCenter,
const Vector3& boxAxis1,
const Vector3& boxAxis2,
const Vector3& boxAxis3,
float boxHalfExtent1,
float boxHalfExtent2,
float boxHalfExtent3,
float& t);
//! Test intersection between a ray and an OBB.
//! @param rayOrigin The origin of the ray to test intersection with.
//! @param rayDir The direction of the ray to test intersection with.
//! @param obb The OBB to test for intersection with the ray.
//! @param t[out] The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return 1 if there is an intersection, 0 otherwise.
int IntersectRayObb(const Vector3& rayOrigin, const Vector3& rayDir, const Obb& obb, float& t);
//! @param[out] t The coefficient in the ray's explicit equation from which the intersecting point is calculated as "rayOrigin + t * rayDirection".
//! @return True if there is an intersection, false otherwise.
bool IntersectRayObb(const Vector3& rayOrigin, const Vector3& rayDir, const Obb& obb, float& t);
//! Ray cylinder intersection types.
enum CylinderIsectTypes
enum CylinderIsectTypes : AZ::s32
{
RR_ISECT_RAY_CYL_SA_INSIDE = -1, // the ray starts inside the cylinder
RR_ISECT_RAY_CYL_NONE, // no intersection
RR_ISECT_RAY_CYL_PQ, // along the PQ segment
RR_ISECT_RAY_CYL_P_SIDE, // on the P side
RR_ISECT_RAY_CYL_Q_SIDE, // on the Q side
RR_ISECT_RAY_CYL_SA_INSIDE = -1, //!< the ray starts inside the cylinder
RR_ISECT_RAY_CYL_NONE, //!< no intersection
RR_ISECT_RAY_CYL_PQ, //!< along the PQ segment
RR_ISECT_RAY_CYL_P_SIDE, //!< on the P side
RR_ISECT_RAY_CYL_Q_SIDE, //!< on the Q side
};
//! Reference: Real-Time Collision Detection - 5.3.7 Intersecting Ray or Segment Against Cylinder
//! Intersect segment S(t)=sa+t(dir), 0<=t<=1 against cylinder specified by p, q and r.
int IntersectSegmentCylinder(
const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q,
const float r, float& t);
//! @param sa The initial point.
//! @param dir Magnitude and direction for sa.
//! @param p Center point of side 1 cylinder.
//! @param q Center point of side 2 cylinder.
//! @param r Radius of cylinder.
//! @param[out] t Proporition along line segment.
//! @return CylinderIsectTypes
CylinderIsectTypes IntersectSegmentCylinder(
const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t);
//! Capsule ray intersect types.
enum CapsuleIsectTypes
{
ISECT_RAY_CAPSULE_SA_INSIDE = -1, // the ray starts inside the cylinder
ISECT_RAY_CAPSULE_NONE, // no intersection
ISECT_RAY_CAPSULE_PQ, // along the PQ segment
ISECT_RAY_CAPSULE_P_SIDE, // on the P side
ISECT_RAY_CAPSULE_Q_SIDE, // on the Q side
ISECT_RAY_CAPSULE_SA_INSIDE = -1, //!< The ray starts inside the cylinder
ISECT_RAY_CAPSULE_NONE, //!< No intersection
ISECT_RAY_CAPSULE_PQ, //!< Along the PQ segment
ISECT_RAY_CAPSULE_P_SIDE, //!< On the P side
ISECT_RAY_CAPSULE_Q_SIDE, //!< On the Q side
};
//! This is a quick implementation of segment capsule based on segment cylinder \ref IntersectSegmentCylinder
//! segment sphere intersection. We can optimize it a lot once we fix the ray
//! cylinder intersection.
int IntersectSegmentCapsule(
const Vector3& sa, const Vector3& dir, const Vector3& p,
const Vector3& q, const float r, float& t);
//! @param sa The beginning of the line segment.
//! @param dir The direction and length of the segment.
//! @param p Center point of side 1 capsule.
//! @param q Center point of side 1 capsule.
//! @param r The radius of the capsule.
//! @param[out] t Proporition along line segment.
//! @return CapsuleIsectTypes
CapsuleIsectTypes IntersectSegmentCapsule(
const Vector3& sa, const Vector3& dir, const Vector3& p, const Vector3& q, const float r, float& t);
//! Intersect segment S(t)=A+t(B-A), 0<=t<=1 against convex polyhedron specified
//! by the n halfspaces defined by the planes p[]. On exit tfirst and tlast
//! define the intersection, if any.
int IntersectSegmentPolyhedron(
const Vector3& sa, const Vector3& sBA, const Plane p[], int numPlanes,
float& tfirst, float& tlast, int& iFirstPlane, int& iLastPlane);
//! @param sa The beggining of the line segment.
//! @param dir The direction and length of the segment.
//! @param p Planes that compose a convex ponvex polyhedron.
//! @param numPlanes number of planes.
//! @param[out] tfirst Proportion along the line segment where the line enters.
//! @param[out] tlast Proportion along the line segment where the line exits.
//! @param[out] iFirstPlane The plane where the line enters.
//! @param[out] iLastPlane The plane where the line exits.
//! @return True if intersects else false.
bool IntersectSegmentPolyhedron(
const Vector3& sa,
const Vector3& dir,
const Plane p[],
int numPlanes,
float& tfirst,
float& tlast,
int& iFirstPlane,
int& iLastPlane);
//! Calculate the line segment closestPointSegment1<->closestPointSegment2 that is the shortest route between
//! two segments segment1Start<->segment1End and segment2Start<->segment2End. Also calculate the values of segment1Proportion and segment2Proportion where
//! closestPointSegment1 = segment1Start + (segment1Proportion * (segment1End - segment1Start))
//! two segments segment1Start<->segment1End and segment2Start<->segment2End. Also calculate the values of segment1Proportion and
//! segment2Proportion where closestPointSegment1 = segment1Start + (segment1Proportion * (segment1End - segment1Start))
//! closestPointSegment2 = segment2Start + (segment2Proportion * (segment2End - segment2Start))
//! If segments are parallel returns a solution.
//! @param segment1Start Start of segment 1.
//! @param segment1End End of segment 1.
//! @param segment2Start Start of segment 2.
//! @param segment2End End of segment 2.
//! @param[out] segment1Proportion The proporition along segment 1 [0..1]
//! @param[out] segment2Proportion The proporition along segment 2 [0..1]
//! @param[out] closestPointSegment1 Closest point on segment 1.
//! @param[out] closestPointSegment2 Closest point on segment 2.
//! @param epsilon The minimum square distance where a line segment can be treated as a single point.
void ClosestSegmentSegment(
const Vector3& segment1Start, const Vector3& segment1End,
const Vector3& segment2Start, const Vector3& segment2End,
float& segment1Proportion, float& segment2Proportion,
Vector3& closestPointSegment1, Vector3& closestPointSegment2,
const Vector3& segment1Start,
const Vector3& segment1End,
const Vector3& segment2Start,
const Vector3& segment2End,
float& segment1Proportion,
float& segment2Proportion,
Vector3& closestPointSegment1,
Vector3& closestPointSegment2,
float epsilon = 1e-4f);
//! Calculate the line segment closestPointSegment1<->closestPointSegment2 that is the shortest route between
//! two segments segment1Start<->segment1End and segment2Start<->segment2End.
//! If segments are parallel returns a solution.
//! @param segment1Start Start of segment 1.
//! @param segment1End End of segment 1.
//! @param segment2Start Start of segment 2.
//! @param segment2End End of segment 2.
//! @param[out] closestPointSegment1 Closest point on segment 1.
//! @param[out] closestPointSegment2 Closest point on segment 2.
//! @param epsilon The minimum square distance where a line segment can be treated as a single point.
void ClosestSegmentSegment(
const Vector3& segment1Start, const Vector3& segment1End,
const Vector3& segment2Start, const Vector3& segment2End,
Vector3& closestPointSegment1, Vector3& closestPointSegment2,
const Vector3& segment1Start,
const Vector3& segment1End,
const Vector3& segment2Start,
const Vector3& segment2End,
Vector3& closestPointSegment1,
Vector3& closestPointSegment2,
float epsilon = 1e-4f);
//! Calculate the point (closestPointOnSegment) that is the closest point on
//! segment segmentStart/segmentEnd to point. Also calculate the value of proportion where
//! closestPointOnSegment = segmentStart + (proportion * (segmentEnd - segmentStart))
//! @param point The point to test
//! @param segmentStart The start of the segment
//! @param segmentEnd The end of the segment
//! @param[out] proportion The proportion of the segment L(t) = (end - start) * t
//! @param[out] closestPointOnSegment The point along the line segment
void ClosestPointSegment(
const Vector3& point, const Vector3& segmentStart, const Vector3& segmentEnd,
float& proportion, Vector3& closestPointOnSegment);
}
}
const Vector3& point,
const Vector3& segmentStart,
const Vector3& segmentEnd,
float& proportion,
Vector3& closestPointOnSegment);
} // namespace Intersect
} // namespace AZ
#endif // AZCORE_MATH_SEGMENT_INTERSECTION_H
#pragma once
#include <AzCore/Math/IntersectSegment.inl>
@@ -0,0 +1,101 @@
/*
* 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
*
*/
namespace AZ
{
namespace Intersect
{
AZ_MATH_INLINE bool ClipRayWithAabb(const Aabb& aabb, Vector3& rayStart, Vector3& rayEnd, float& tClipStart, float& tClipEnd)
{
Vector3 startNormal;
float tStart, tEnd;
Vector3 dirLen = rayEnd - rayStart;
if (IntersectRayAABB(rayStart, dirLen, dirLen.GetReciprocal(), aabb, tStart, tEnd, startNormal) != ISECT_RAY_AABB_NONE)
{
// clip the ray with the box
if (tStart > 0.0f)
{
rayStart = rayStart + tStart * dirLen;
tClipStart = tStart;
}
if (tEnd < 1.0f)
{
rayEnd = rayStart + tEnd * dirLen;
tClipEnd = tEnd;
}
return true;
}
return false;
}
AZ_MATH_INLINE SphereIsectTypes
IntersectRaySphereOrigin(const Vector3& rayStart, const Vector3& rayDirNormalized, const float sphereRadius, float& t)
{
Vector3 m = rayStart;
float b = m.Dot(rayDirNormalized);
float c = m.Dot(m) - sphereRadius * sphereRadius;
// Exit if r's origin outside s (c > 0)and r pointing away from s (b > 0)
if (c > 0.0f && b > 0.0f)
{
return ISECT_RAY_SPHERE_NONE;
}
float discr = b * b - c;
// A negative discriminant corresponds to ray missing sphere
if (discr < 0.0f)
{
return ISECT_RAY_SPHERE_NONE;
}
// Ray now found to intersect sphere, compute smallest t value of intersection
t = -b - Sqrt(discr);
// If t is negative, ray started inside sphere so clamp t to zero
if (t < 0.0f)
{
// t = 0.0f;
return ISECT_RAY_SPHERE_SA_INSIDE; // no hit if inside
}
// q = p + t * d;
return ISECT_RAY_SPHERE_ISECT;
}
AZ_MATH_INLINE SphereIsectTypes IntersectRaySphere(const Vector3& rayStart, const Vector3& rayDirNormalized, const Vector3& sphereCenter, const float sphereRadius, float& t)
{
return IntersectRaySphereOrigin(rayStart - sphereCenter, rayDirNormalized, sphereRadius, t);
}
AZ_MATH_INLINE Vector3 LineToPointDistance(const Vector3& s1, const Vector3& s2, const Vector3& p, float& u)
{
const Vector3 s21 = s2 - s1;
// we assume seg1 and seg2 are NOT coincident
AZ_MATH_ASSERT(!s21.IsClose(Vector3(0.0f), 1e-4f), "OK we agreed that we will pass valid segments! (s1 != s2)");
u = LineToPointDistanceTime(s1, s21, p);
return s1 + u * s21;
}
AZ_MATH_INLINE float LineToPointDistanceTime(const Vector3& s1, const Vector3& s21, const Vector3& p)
{
// so u = (p.x - s1.x)*(s2.x - s1.x) + (p.y - s1.y)*(s2.y - s1.y) + (p.z-s1.z)*(s2.z-s1.z) / |s2-s1|^2
return s21.Dot(p - s1) / s21.Dot(s21);
}
AZ_MATH_INLINE bool TestSegmentAABB(const Vector3& p0, const Vector3& p1, const Aabb& aabb)
{
Vector3 e = aabb.GetExtents();
Vector3 d = p1 - p0;
Vector3 m = p0 + p1 - aabb.GetMin() - aabb.GetMax();
return TestSegmentAABBOrigin(m, d, e);
}
} // namespace Intersect
} // namespace AZ
@@ -34,7 +34,9 @@ namespace AZ
friend IAllocator;
friend class AllocatorBase;
friend class Debug::AllocationRecords;
friend class AZ::Internal::EnvironmentVariableHolder<AllocatorManager>;
template<typename T, typename... Args> friend constexpr auto AZStd::construct_at(T*, Args&&... args)
->AZStd::enable_if_t<AZStd::is_void_v<AZStd::void_t<decltype(new (AZStd::declval<void*>()) T(AZStd::forward<Args>(args)...))>>, T*>;
template<typename T> constexpr friend void AZStd::destroy_at(T*);
public:
typedef AZStd::function<void (IAllocator* allocator, size_t /*byteSize*/, size_t /*alignment*/, int/* flags*/, const char* /*name*/, const char* /*fileName*/, int lineNum /*=0*/)> OutOfMemoryCBType;
@@ -251,16 +251,15 @@ namespace AZ
class EnvironmentVariableHolder
: public EnvironmentVariableHolderBase
{
void ConstructImpl(const AZStd::true_type& /* AZStd::has_trivial_constructor<T> */)
{
memset(&m_value, 0, sizeof(T));
}
template<class... Args>
void ConstructImpl(const AZStd::false_type& /* AZStd::has_trivial_constructor<T> */, Args&&... args)
void ConstructImpl(Args&&... args)
{
// Construction of non-trivial types is left up to the type's constructor.
new(&m_value) T(AZStd::forward<Args>(args)...);
// Use std::launder to ensure that the compiler treats the T* reinterpret_cast as a new object
#if __cpp_lib_launder
AZStd::construct_at(std::launder(reinterpret_cast<T*>(&m_value)), AZStd::forward<Args>(args)...);
#else
AZStd::construct_at(reinterpret_cast<T*>(&m_value), AZStd::forward<Args>(args)...);
#endif
}
static void DestructDispatchNoLock(EnvironmentVariableHolderBase *base, DestroyTarget selfDestruct)
{
@@ -274,10 +273,12 @@ namespace AZ
AZ_Assert(self->m_isConstructed, "Variable is not constructed. Please check your logic and guard if needed!");
self->m_isConstructed = false;
self->m_moduleOwner = nullptr;
if constexpr(!AZStd::is_trivially_destructible_v<T>)
{
reinterpret_cast<T*>(&self->m_value)->~T();
}
// Use std::launder to ensure that the compiler treats the T* reinterpret_cast as a new object
#if __cpp_lib_launder
AZStd::destroy_at(std::launder(reinterpret_cast<T*>(&self->m_value)));
#else
AZStd::destroy_at(reinterpret_cast<T*>(&self->m_value));
#endif
}
public:
EnvironmentVariableHolder(u32 guid, bool isOwnershipTransfer, Environment::AllocatorInterface* allocator)
@@ -303,24 +304,13 @@ namespace AZ
UnregisterAndDestroy(DestructDispatchNoLock, moduleRelease);
}
void Construct()
{
AZStd::lock_guard<AZStd::spin_mutex> lock(m_mutex);
if (!m_isConstructed)
{
ConstructImpl(AZStd::is_trivially_constructible<T>{});
m_isConstructed = true;
m_moduleOwner = Environment::GetModuleId();
}
}
template <class... Args>
void Construct(Args&&... args)
{
AZStd::lock_guard<AZStd::spin_mutex> lock(m_mutex);
if (!m_isConstructed)
{
ConstructImpl(typename AZStd::false_type(), AZStd::forward<Args>(args)...);
ConstructImpl(AZStd::forward<Args>(args)...);
m_isConstructed = true;
m_moduleOwner = Environment::GetModuleId();
}
@@ -333,7 +323,7 @@ namespace AZ
}
// variable storage
typename AZStd::aligned_storage<sizeof(T), AZStd::alignment_of<T>::value>::type m_value;
AZStd::aligned_storage_for_t<T> m_value;
static int s_moduleUseCount;
};
@@ -468,6 +458,11 @@ namespace AZ
Get() = value;
}
void Set(T&& value)
{
Get() = AZStd::move(value);
}
explicit operator bool() const
{
return IsValid();
@@ -42,7 +42,10 @@ namespace AZ
AZ_Assert(m_useCount > 0, "m_useCount is already 0!");
if (m_useCount.fetch_sub(1) == 1)
{
AZ::NameDictionary::Instance().TryReleaseName(hash);
if (AZ::NameDictionary::IsReady())
{
AZ::NameDictionary::Instance().TryReleaseName(hash);
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More