diff --git a/Assets/Parts/car.blend b/Assets/Parts/car.blend new file mode 100644 index 0000000..1ff572a Binary files /dev/null and b/Assets/Parts/car.blend differ diff --git a/Assets/Parts/car.fbx b/Assets/Parts/car.fbx new file mode 100644 index 0000000..a5d2537 Binary files /dev/null and b/Assets/Parts/car.fbx differ diff --git a/Assets/Parts/engine.fbx b/Assets/Parts/engine.fbx index df429c9..90a5701 100644 Binary files a/Assets/Parts/engine.fbx and b/Assets/Parts/engine.fbx differ diff --git a/Assets/Parts/engine2.blend b/Assets/Parts/engine2.blend index 063ca73..547ff37 100644 Binary files a/Assets/Parts/engine2.blend and b/Assets/Parts/engine2.blend differ diff --git a/Assets/Parts/engine2.fbx b/Assets/Parts/engine2.fbx new file mode 100644 index 0000000..9c16c6f Binary files /dev/null and b/Assets/Parts/engine2.fbx differ diff --git a/Assets/Parts/engine_base.fbx b/Assets/Parts/engine_base.fbx new file mode 100644 index 0000000..bfc4d84 Binary files /dev/null and b/Assets/Parts/engine_base.fbx differ diff --git a/Assets/Parts/hex.blend b/Assets/Parts/hex.blend new file mode 100644 index 0000000..17097e3 Binary files /dev/null and b/Assets/Parts/hex.blend differ diff --git a/Assets/Parts/hex.fbx b/Assets/Parts/hex.fbx new file mode 100644 index 0000000..2b308a1 Binary files /dev/null and b/Assets/Parts/hex.fbx differ diff --git a/Assets/Parts/tire.blend b/Assets/Parts/tire.blend new file mode 100644 index 0000000..43ffda4 Binary files /dev/null and b/Assets/Parts/tire.blend differ diff --git a/Assets/Parts/tire.fbx b/Assets/Parts/tire.fbx new file mode 100644 index 0000000..9f10275 Binary files /dev/null and b/Assets/Parts/tire.fbx differ diff --git a/Assets/cursor.png b/Assets/cursor.png new file mode 100644 index 0000000..8eb2c49 Binary files /dev/null and b/Assets/cursor.png differ diff --git a/Assets/cursor.svg b/Assets/cursor.svg new file mode 100644 index 0000000..9b4310a --- /dev/null +++ b/Assets/cursor.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini index 1f78c58..55b4f79 100644 --- a/Config/DefaultEditor.ini +++ b/Config/DefaultEditor.ini @@ -1,4 +1,7 @@ [/Script/AdvancedPreviewScene.SharedProfiles] ++Profiles=(ProfileName="Epic Headquarters",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,bShowGrid=False,EnvironmentColor=(R=0.200000,G=0.200000,B=0.200000,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",bPostProcessingEnabled=True,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainTexelSize=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-10.000000,AutoExposureMaxBrightness=20.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainTexelSize=1.000000,FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=True,bShowMeshEdges=False) ++Profiles=(ProfileName="Grey Wireframe",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=False,bShowFloor=False,bShowGrid=True,EnvironmentColor=(R=0.039216,G=0.039216,B=0.039216,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",bPostProcessingEnabled=False,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainTexelSize=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-10.000000,AutoExposureMaxBrightness=20.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainTexelSize=1.000000,FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=False,bShowMeshEdges=True) ++Profiles=(ProfileName="Grey Ambient",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=4.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=2.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,bShowGrid=True,EnvironmentColor=(R=0.200000,G=0.200000,B=0.200000,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/T_GreyAmbient",bPostProcessingEnabled=False,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=False,bOverride_AutoExposureMaxBrightness=False,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainTexelSize=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-10.000000,AutoExposureMaxBrightness=20.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainTexelSize=1.000000,FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=False,bShowMeshEdges=False) [/Script/UnrealEd.EditorProjectAppearanceSettings] bDisplayUnits=True diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index af7ead6..687f541 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -53,6 +53,9 @@ r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 r.Nanite.ProjectEnabled=True r.CustomDepth=3 r.CustomDepthTemporalAAJitter=False +r.AntiAliasingMethod=0 +r.ForwardShading=False +r.DefaultFeature.MotionBlur=False [/Script/LinuxTargetPlatform.LinuxTargetSettings] -TargetedRHIs=SF_VULKAN_SM5 @@ -68,9 +71,21 @@ AppliedDefaultGraphicsPerformance=Maximum CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet' [/Script/Engine.UserInterfaceSettings] +RenderFocusRule=NavigationOnly +HardwareCursors=() +SoftwareCursors=((Default, "/Game/Common/UI/WBP_Cursor.WBP_Cursor_C")) +ApplicationScale=1.000000 +UIScaleRule=ShortestSide +CustomScalingRuleClass=None +UIScaleCurve=(EditorCurveData=(Keys=((Time=480.000000,Value=0.444000),(Time=720.000000,Value=0.666000),(Time=1080.000000,Value=1.000000),(Time=8640.000000,Value=8.000000)),DefaultValue=340282346638528859811704183484516925440.000000,PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant),ExternalCurve=None) +bAllowHighDPIInGameMode=False +DesignScreenSize=(X=1920,Y=1080) +bLoadWidgetsOnDedicatedServer=True bAuthorizeAutomaticWidgetVariableCreation=False +CustomFontDPI=96 FontDPIPreset=Standard -FontDPI=72 +bUseCustomFontDPI=False +bEnableDistanceFieldFontRasterization=False [/Script/Engine.Engine] +ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/DeltaV") @@ -94,9 +109,9 @@ ManualIPAddress= [/Script/Engine.PhysicsSettings] MaxPhysicsDeltaTime=0.016667 -DefaultGravityZ=0.000000 SolverOptions=(PositionIterations=8,VelocityIterations=2,ProjectionIterations=1,CollisionMarginFraction=0.000000,CollisionMarginMax=10.000000,CollisionCullDistance=3.000000,CollisionMaxPushOutVelocity=1000.000000,CollisionInitialOverlapDepenetrationVelocity=-1.000000,ClusterConnectionFactor=1.000000,ClusterUnionConnectionType=DelaunayTriangulation,bGenerateCollisionData=False,CollisionFilterSettings=(FilterEnabled=False,MinMass=0.000000,MinSpeed=0.000000,MinImpulse=0.000000),bGenerateBreakData=False,BreakingFilterSettings=(FilterEnabled=False,MinMass=0.000000,MinSpeed=0.000000,MinVolume=0.000000),bGenerateTrailingData=False,TrailingFilterSettings=(FilterEnabled=False,MinMass=0.000000,MinSpeed=0.000000,MinVolume=0.000000)) -PhysicsPrediction=(bEnablePhysicsPrediction=True,bEnablePhysicsResimulation=True,ResimulationErrorThreshold=10.000000,MaxSupportedLatencyPrediction=1000.000000) +PhysicsPrediction=(bEnablePhysicsPrediction=True,bEnablePhysicsHistoryCapture=True,MaxSupportedLatencyPrediction=1000.000000,ResimulationSettings=(bEnableResimulationErrorPositionThreshold=True,ResimulationErrorPositionThreshold=10.000000,bEnableResimulationErrorRotationThreshold=True,ResimulationErrorRotationThreshold=4.000000,bEnableResimulationErrorLinearVelocityThreshold=False,ResimulationErrorLinearVelocityThreshold=5.000000,bEnableResimulationErrorAngularVelocityThreshold=False,ResimulationErrorAngularVelocityThreshold=2.000000),PhysicsReplicationLODSettings=(bEnablePhysicsReplicationLOD=False,MinimumBaseDistance=200.000000,BaseDistanceRadiusMultiplier=0.750000,BaseDistancesForResimulationMode=0.250000,BaseDistancesForFullPrediction=0.800000,TimeOverDistance=0.150000)) +DefaultGravityZ=0.000000 [/Script/Engine.CollisionProfile] -Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False) diff --git a/Content/Common/UI/WBP_Cursor.uasset b/Content/Common/UI/WBP_Cursor.uasset new file mode 100644 index 0000000..7deeef9 Binary files /dev/null and b/Content/Common/UI/WBP_Cursor.uasset differ diff --git a/Content/Common/UI/WBP_MainMenu.uasset b/Content/Common/UI/WBP_MainMenu.uasset index a4a3990..a52d434 100644 Binary files a/Content/Common/UI/WBP_MainMenu.uasset and b/Content/Common/UI/WBP_MainMenu.uasset differ diff --git a/Content/Construction/Construction.umap b/Content/Construction/Construction.umap index ba48bf7..8270836 100644 Binary files a/Content/Construction/Construction.umap and b/Content/Construction/Construction.umap differ diff --git a/Content/Construction/Construction_BuiltData.uasset b/Content/Construction/Construction_BuiltData.uasset new file mode 100644 index 0000000..662c747 Binary files /dev/null and b/Content/Construction/Construction_BuiltData.uasset differ diff --git a/Content/Construction/Default.uasset b/Content/Construction/Default.uasset deleted file mode 100644 index 5c2c9c0..0000000 Binary files a/Content/Construction/Default.uasset and /dev/null differ diff --git a/Content/Construction/DisableMove.uasset b/Content/Construction/DisableMove.uasset new file mode 100644 index 0000000..d5c539f Binary files /dev/null and b/Content/Construction/DisableMove.uasset differ diff --git a/Content/Construction/EnableLook.uasset b/Content/Construction/EnableLook.uasset new file mode 100644 index 0000000..483371c Binary files /dev/null and b/Content/Construction/EnableLook.uasset differ diff --git a/Content/Construction/Move.uasset b/Content/Construction/Move.uasset deleted file mode 100644 index adb4a8f..0000000 Binary files a/Content/Construction/Move.uasset and /dev/null differ diff --git a/Content/Construction/UI/WBP_PartItem.uasset b/Content/Construction/UI/WBP_PartItem.uasset index aec0431..c8631c0 100644 Binary files a/Content/Construction/UI/WBP_PartItem.uasset and b/Content/Construction/UI/WBP_PartItem.uasset differ diff --git a/Content/Crafts/car.json b/Content/Crafts/car.json new file mode 100644 index 0000000..1f7a762 --- /dev/null +++ b/Content/Crafts/car.json @@ -0,0 +1,100 @@ +{ + "name": "car", + "location": [ 0, 0, 0 ], + "rotation": [ 0, 0, 0, 1 ], + "structure": { + "cockpit": { + "cockpit-2": { + "cockpit-3": { + + } + }, + "thruster": { + }, + "tire_fl": { + }, + "tire_fr": { + }, + "tire_rl": { + }, + "tire_rr": { + } + } + }, + "parts": { + "cockpit": { + "type": "cockpit", + "location": [ 0, 0, 0 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1, + "attached_with": 1 + }, + "cockpit-2": { + "type": "cockpit", + "location": [ 300, 0, 0 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 0.2, 0.2, 0.2 ], + "attached_at": 1, + "attached_with": 1 + }, + "cockpit-3": { + "type": "cockpit", + "location": [ 0, 0, 100 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 0.2, 0.2, 0.2 ], + "attached_at": 1, + "attached_with": 1 + }, + "thruster": { + "type": "engine", + "location": [ -150, 0, 0 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1, + "thruster": { + + } + }, + "tire_fl": { + "type": "tire", + "location": [ 200, -150, -50 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1, + "wheel": { + "max_steering": 30 + } + }, + "tire_fr": { + "type": "tire", + "location": [ 200, 150, -50 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1, + "wheel": { + "max_steering": 30 + } + }, + "tire_rl": { + "type": "tire", + "location": [ -200, -150, -50 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1, + "wheel": { + "max_steering": 0 + } + }, + "tire_rr": { + "type": "tire", + "location": [ -200, 150, -50 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1, + "wheel": { + "max_steering": 0 + } + } + } + } \ No newline at end of file diff --git a/Content/Crafts/saved.json b/Content/Crafts/saved.json new file mode 100644 index 0000000..0db92c7 --- /dev/null +++ b/Content/Crafts/saved.json @@ -0,0 +1,109 @@ +{ + "location": [ 15.37790262797977, -0.40910575587439801, -576.22819966409361 ], + "rotation": [ 0.00017248665745414119, -0.031961138871420623, 0.00028825597458676899, 0.99948905584748038 ], + "structure": + { + "cockpit": + { + "cockpit-2": + { + "cockpit-3": + { + } + }, + "thruster": + { + }, + "tire_fl": + { + }, + "tire_fr": + { + }, + "tire_rl": + { + }, + "tire_rr": + { + } + } + }, + "parts": + { + "cockpit": + { + "type": "cockpit", + "location": [ 0, 0, 0 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ] + }, + "cockpit-2": + { + "type": "cockpit", + "location": [ 300, 0, 0 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 0.20000000000000001, 0.20000000000000001, 0.20000000000000001 ] + }, + "cockpit-3": + { + "type": "cockpit", + "location": [ 0, 0, 100 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 0.20000000000000001, 0.20000000000000001, 0.20000000000000001 ] + }, + "thruster": + { + "type": "engine", + "location": [ -150, 0, 0 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ], + "thruster": + { + } + }, + "tire_fl": + { + "type": "tire", + "location": [ 200, -150, -50 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ], + "wheel": + { + "max_steering": 30 + } + }, + "tire_fr": + { + "type": "tire", + "location": [ 200, 150, -50 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ], + "wheel": + { + "max_steering": 30 + } + }, + "tire_rl": + { + "type": "tire", + "location": [ -200, -150, -50 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ], + "wheel": + { + "max_steering": 0 + } + }, + "tire_rr": + { + "type": "tire", + "location": [ -200, 150, -50 ], + "rotation": [ 0, 0, 0 ], + "scale": [ 1, 1, 1 ], + "wheel": + { + "max_steering": 0 + } + } + } +} \ No newline at end of file diff --git a/Content/Inputs/IA_EnableMove.uasset b/Content/Inputs/IA_EnableMove.uasset new file mode 100644 index 0000000..3f9d85c Binary files /dev/null and b/Content/Inputs/IA_EnableMove.uasset differ diff --git a/Content/Inputs/IA_Look.uasset b/Content/Inputs/IA_Look.uasset new file mode 100644 index 0000000..ea89bc4 Binary files /dev/null and b/Content/Inputs/IA_Look.uasset differ diff --git a/Content/Inputs/IA_Move.uasset b/Content/Inputs/IA_Move.uasset new file mode 100644 index 0000000..0f5aae4 Binary files /dev/null and b/Content/Inputs/IA_Move.uasset differ diff --git a/Content/Inputs/IA_Pause.uasset b/Content/Inputs/IA_Pause.uasset new file mode 100644 index 0000000..5e2d369 Binary files /dev/null and b/Content/Inputs/IA_Pause.uasset differ diff --git a/Content/Inputs/IA_Pitch.uasset b/Content/Inputs/IA_Pitch.uasset new file mode 100644 index 0000000..d09b462 Binary files /dev/null and b/Content/Inputs/IA_Pitch.uasset differ diff --git a/Content/Inputs/IA_Roll.uasset b/Content/Inputs/IA_Roll.uasset new file mode 100644 index 0000000..4f6d858 Binary files /dev/null and b/Content/Inputs/IA_Roll.uasset differ diff --git a/Content/Inputs/IA_Stage.uasset b/Content/Inputs/IA_Stage.uasset new file mode 100644 index 0000000..4308190 Binary files /dev/null and b/Content/Inputs/IA_Stage.uasset differ diff --git a/Content/Inputs/IA_Steering.uasset b/Content/Inputs/IA_Steering.uasset new file mode 100644 index 0000000..f481dae Binary files /dev/null and b/Content/Inputs/IA_Steering.uasset differ diff --git a/Content/Inputs/IA_SwitchToDrive.uasset b/Content/Inputs/IA_SwitchToDrive.uasset new file mode 100644 index 0000000..7542a3b Binary files /dev/null and b/Content/Inputs/IA_SwitchToDrive.uasset differ diff --git a/Content/Inputs/IA_Throttle.uasset b/Content/Inputs/IA_Throttle.uasset new file mode 100644 index 0000000..bcb8ac9 Binary files /dev/null and b/Content/Inputs/IA_Throttle.uasset differ diff --git a/Content/Inputs/IA_Thrust.uasset b/Content/Inputs/IA_Thrust.uasset new file mode 100644 index 0000000..c282b04 Binary files /dev/null and b/Content/Inputs/IA_Thrust.uasset differ diff --git a/Content/Inputs/IA_Yaw.uasset b/Content/Inputs/IA_Yaw.uasset new file mode 100644 index 0000000..8c9b88a Binary files /dev/null and b/Content/Inputs/IA_Yaw.uasset differ diff --git a/Content/Inputs/IMC_Common.uasset b/Content/Inputs/IMC_Common.uasset new file mode 100644 index 0000000..8bafdd2 Binary files /dev/null and b/Content/Inputs/IMC_Common.uasset differ diff --git a/Content/Inputs/IMC_Construction.uasset b/Content/Inputs/IMC_Construction.uasset new file mode 100644 index 0000000..3acf5f5 Binary files /dev/null and b/Content/Inputs/IMC_Construction.uasset differ diff --git a/Content/Inputs/IMC_Simulation.uasset b/Content/Inputs/IMC_Simulation.uasset new file mode 100644 index 0000000..d0735c2 Binary files /dev/null and b/Content/Inputs/IMC_Simulation.uasset differ diff --git a/Content/MainLevel.umap b/Content/MainLevel.umap index 5b0a246..69ec04f 100644 Binary files a/Content/MainLevel.umap and b/Content/MainLevel.umap differ diff --git a/Content/Materials/WhiteDS.uasset b/Content/Materials/WhiteDS.uasset index 753af74..8126870 100644 Binary files a/Content/Materials/WhiteDS.uasset and b/Content/Materials/WhiteDS.uasset differ diff --git a/Content/Materials/cursor.uasset b/Content/Materials/cursor.uasset new file mode 100644 index 0000000..66bd0bf Binary files /dev/null and b/Content/Materials/cursor.uasset differ diff --git a/Content/Parts/adapter.json b/Content/Parts/adapter.json index 30e5fc9..2c4429b 100644 --- a/Content/Parts/adapter.json +++ b/Content/Parts/adapter.json @@ -1,6 +1,6 @@ { "name": "adapter", - "mesh": "/Game/Shapes/adapter", + "mesh": "/Game/Shapes/GC/GC_adapter", "type": "static", "attachment": [ { @@ -42,7 +42,7 @@ "adapter": { "type": "adapter", "location": [0, 0, 0], - "rotation": [0, 0, 0], + "rotation": [0, 0, 0, 1], "scale": [1, 1, 1], "attached_at": 1, "attach_location": [0, 0, 0] diff --git a/Content/Parts/cockpit.json b/Content/Parts/cockpit.json index d876e88..6c1e9c1 100644 --- a/Content/Parts/cockpit.json +++ b/Content/Parts/cockpit.json @@ -1,7 +1,7 @@ { "name": "cockpit", - "mesh": "/Game/Shapes/cockpit", - "type": "static", + "mesh": "/Game/Shapes/GC/GC_cockpit", + "type": "geometry_collection", "attachment": [ { "location": [-100, 0, 0] diff --git a/Content/Parts/engine.json b/Content/Parts/engine.json index 12b5fb5..b3133ea 100644 --- a/Content/Parts/engine.json +++ b/Content/Parts/engine.json @@ -1,7 +1,7 @@ { "name": "cylinder", - "mesh": "/Game/Shapes/engine_2", - "type": "static", + "mesh": "/Game/Shapes/GC/GC_engine", + "type": "geometry_collection", "attachment": [ { "location": [50, 0, 0] diff --git a/Content/Parts/hex.json b/Content/Parts/hex.json new file mode 100644 index 0000000..6052221 --- /dev/null +++ b/Content/Parts/hex.json @@ -0,0 +1,50 @@ +{ + "name": "part", + "mesh": "/Game/Shapes/GC/GC_hex", + "type": "geometry_collection", + "attachment": [ + { + "location": [0, 0, 0] + } + ], + "fields": [ + { + "name": "width", + "type": "int", + "min": 1, + "max": 10, + "edit": "slider", + "slider_min": 1, + "slider_max": 4 + }, + { + "name": "height", + "type": "int", + "min": 1, + "max": 10, + "edit": "slider", + "slider_min": 1, + "slider_max": 4 + } + ], + "craft": { + "name": "part", + "location": [0, 0, 0], + "rotation": [0, 0, 0], + "structure": { + "part": {} + }, + "parts": { + "part": { + "type": "hex", + "location": [0, 0, 0], + "rotation": [0, 0, 0], + "scale": [1, 1, 1], + "attached_at": 1, + "attach_location": [0, 0, 0] + } + }, + "stages": [] + } + } + \ No newline at end of file diff --git a/Content/Parts/tire.json b/Content/Parts/tire.json new file mode 100644 index 0000000..a4729b2 --- /dev/null +++ b/Content/Parts/tire.json @@ -0,0 +1,59 @@ +{ + "name": "tire", + "mesh": "/Game/Shapes/GC/GC_tire", + "type": "geometry_collection", + "attachment": [ + { + "location": [0, 0, 0] + } + ], + "fields": [ + { + "name": "width", + "type": "int", + "min": 1, + "max": 10, + "edit": "slider", + "slider_min": 1, + "slider_max": 4 + }, + { + "name": "height", + "type": "int", + "min": 1, + "max": 10, + "edit": "slider", + "slider_min": 1, + "slider_max": 4 + } + ], + "craft": { + "name": "part", + "location": [0, 0, 0], + "rotation": [0, 0, 0], + "structure": { + "part": {} + }, + "parts": { + "part": { + "type": "part", + "location": [0, 0, 0], + "rotation": [0, 0, 0], + "scale": [1, 1, 1], + "attached_at": 1, + "attach_location": [0, 0, 0], + + "wheel": { + "offset": [0, 0, 0], + "mesh": "/Game/Shapes/GC/GC_tire" + }, + "aero": { + "lift": 1, + "drag": 1 + } + } + }, + "stages": [] + } + } + \ No newline at end of file diff --git a/Content/Shapes/Decoupler.uasset b/Content/Shapes/Decoupler.uasset index b7d412a..95e0d4a 100644 Binary files a/Content/Shapes/Decoupler.uasset and b/Content/Shapes/Decoupler.uasset differ diff --git a/Content/Shapes/GC/GC_Shape_Sphere.uasset b/Content/Shapes/GC/GC_Shape_Sphere.uasset new file mode 100644 index 0000000..f26a8f7 Binary files /dev/null and b/Content/Shapes/GC/GC_Shape_Sphere.uasset differ diff --git a/Content/Shapes/GC/GC_adapter.uasset b/Content/Shapes/GC/GC_adapter.uasset new file mode 100644 index 0000000..5c860d9 Binary files /dev/null and b/Content/Shapes/GC/GC_adapter.uasset differ diff --git a/Content/Shapes/GC/GC_cockpit.uasset b/Content/Shapes/GC/GC_cockpit.uasset new file mode 100644 index 0000000..ce5067d Binary files /dev/null and b/Content/Shapes/GC/GC_cockpit.uasset differ diff --git a/Content/Shapes/GC/GC_engine.uasset b/Content/Shapes/GC/GC_engine.uasset new file mode 100644 index 0000000..d7c0c6c Binary files /dev/null and b/Content/Shapes/GC/GC_engine.uasset differ diff --git a/Content/Shapes/GC/GC_hex.uasset b/Content/Shapes/GC/GC_hex.uasset new file mode 100644 index 0000000..ae72df6 Binary files /dev/null and b/Content/Shapes/GC/GC_hex.uasset differ diff --git a/Content/Shapes/GC/GC_tire.uasset b/Content/Shapes/GC/GC_tire.uasset new file mode 100644 index 0000000..fbeb1fc Binary files /dev/null and b/Content/Shapes/GC/GC_tire.uasset differ diff --git a/Content/Shapes/Material_002.uasset b/Content/Shapes/Material_002.uasset new file mode 100644 index 0000000..5a15e15 Binary files /dev/null and b/Content/Shapes/Material_002.uasset differ diff --git a/Content/Shapes/Shape_Cone.uasset b/Content/Shapes/Shape_Cone.uasset index 8fa551e..1cb6309 100644 Binary files a/Content/Shapes/Shape_Cone.uasset and b/Content/Shapes/Shape_Cone.uasset differ diff --git a/Content/Shapes/Shape_Engine.uasset b/Content/Shapes/Shape_Engine.uasset deleted file mode 100644 index 6496748..0000000 Binary files a/Content/Shapes/Shape_Engine.uasset and /dev/null differ diff --git a/Content/Shapes/adapter.uasset b/Content/Shapes/adapter.uasset index e5974f2..a597a9c 100644 Binary files a/Content/Shapes/adapter.uasset and b/Content/Shapes/adapter.uasset differ diff --git a/Content/Shapes/cockpit.uasset b/Content/Shapes/cockpit.uasset index dffeec8..423bded 100644 Binary files a/Content/Shapes/cockpit.uasset and b/Content/Shapes/cockpit.uasset differ diff --git a/Content/Shapes/cockpit_cockpit/GC_cockpit.uasset b/Content/Shapes/cockpit_cockpit/GC_cockpit.uasset new file mode 100644 index 0000000..3fe41a0 Binary files /dev/null and b/Content/Shapes/cockpit_cockpit/GC_cockpit.uasset differ diff --git a/Content/Shapes/cylinder.uasset b/Content/Shapes/cylinder.uasset index 860a66d..916acc7 100644 Binary files a/Content/Shapes/cylinder.uasset and b/Content/Shapes/cylinder.uasset differ diff --git a/Content/Shapes/engine.uasset b/Content/Shapes/engine.uasset new file mode 100644 index 0000000..c5f77e4 Binary files /dev/null and b/Content/Shapes/engine.uasset differ diff --git a/Content/Shapes/engine_2.uasset b/Content/Shapes/engine_2.uasset deleted file mode 100644 index b24f94e..0000000 Binary files a/Content/Shapes/engine_2.uasset and /dev/null differ diff --git a/Content/Shapes/engine_engine/GC_engine.uasset b/Content/Shapes/engine_engine/GC_engine.uasset new file mode 100644 index 0000000..05c58aa Binary files /dev/null and b/Content/Shapes/engine_engine/GC_engine.uasset differ diff --git a/Content/Shapes/hex.uasset b/Content/Shapes/hex.uasset new file mode 100644 index 0000000..6d6d88e Binary files /dev/null and b/Content/Shapes/hex.uasset differ diff --git a/Content/Shapes/leg.uasset b/Content/Shapes/leg.uasset index c20d746..48e04ae 100644 Binary files a/Content/Shapes/leg.uasset and b/Content/Shapes/leg.uasset differ diff --git a/Content/Shapes/tire.uasset b/Content/Shapes/tire.uasset new file mode 100644 index 0000000..5d8e429 Binary files /dev/null and b/Content/Shapes/tire.uasset differ diff --git a/Content/Shapes/tire_tire/GC_tire.uasset b/Content/Shapes/tire_tire/GC_tire.uasset new file mode 100644 index 0000000..86d3032 Binary files /dev/null and b/Content/Shapes/tire_tire/GC_tire.uasset differ diff --git a/Content/Shapes/wheel.uasset b/Content/Shapes/wheel.uasset deleted file mode 100644 index b2458c7..0000000 Binary files a/Content/Shapes/wheel.uasset and /dev/null differ diff --git a/Content/Shapes/wheel_PhysicsAsset.uasset b/Content/Shapes/wheel_PhysicsAsset.uasset deleted file mode 100644 index 099e327..0000000 Binary files a/Content/Shapes/wheel_PhysicsAsset.uasset and /dev/null differ diff --git a/Content/Shapes/wheel_Skeleton.uasset b/Content/Shapes/wheel_Skeleton.uasset deleted file mode 100644 index 3a221db..0000000 Binary files a/Content/Shapes/wheel_Skeleton.uasset and /dev/null differ diff --git a/Content/Shapes/wing.uasset b/Content/Shapes/wing.uasset index 2f7e97e..5c5c908 100644 Binary files a/Content/Shapes/wing.uasset and b/Content/Shapes/wing.uasset differ diff --git a/Content/Simulation/Simulation.umap b/Content/Simulation/Simulation.umap index 738ac78..ea4092a 100644 Binary files a/Content/Simulation/Simulation.umap and b/Content/Simulation/Simulation.umap differ diff --git a/DeltaV.uproject b/DeltaV.uproject index c0d2cf8..76d78b1 100644 --- a/DeltaV.uproject +++ b/DeltaV.uproject @@ -1,6 +1,6 @@ { "FileVersion": 3, - "EngineAssociation": "5.4", + "EngineAssociation": "5.6", "Category": "", "Description": "", "Modules": [ @@ -14,7 +14,9 @@ "SlateCore", "UMG", "GeometryFramework", - "CoreUObject" + "CoreUObject", + "ChaosModularVehicleEngine", + "EnhancedInput" ] } ], @@ -37,6 +39,18 @@ { "Name": "GeometryScripting", "Enabled": true + }, + { + "Name": "SkeletalMeshModelingTools", + "Enabled": true + }, + { + "Name": "ChaosModularVehicle", + "Enabled": true + }, + { + "Name": "ChaosModularVehicleExamples", + "Enabled": true } ] } \ No newline at end of file diff --git a/README.md b/README.md index 156402f..317135f 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,5 @@ - - - - - - - - - - - Maths and Physics: https://orbital-mechanics.space/intro.html @@ -23,13 +12,80 @@ https://spencermortensen.com/articles/bezier-circle/ Craft structure: -root - |- part_mesh_0 - | |- part_mesh_1 - | |- part_mesh_2 - | |- part_mesh_3 - |- part_def_0 +Craft (ModularVehiclePawn) + |- ClusterUnionComponent + | |- part_0 (root) + | |- part_1 + | |- part_2 + | |- part_3 + |- VehicleSimBaseComponent + | ... simulation components + | + |- part_def_0 (root) | |- part_def_1 | |- part_def_2 | |- part_def_3 +Craft Json: +{ + "name": , + "location": [ 0, 0, 0 ], + "rotation": [ 0, 0, 0, 1 ], + "structure": { + "part_0": { + "part_1": { + }, + "part_2": { + "part_3": { + } + } + } + }, + "parts": { + "part_0": { + "type": "command_module ?", + "location": [ 0, 0, 0 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1, + "attached_with": 1 + }, + "part_1": { + "type": "parachute ?", + "location": [ 0, -150, -50 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1 + }, + "part_2": { + "type": "fuel", + "location": [ 0, 150, -50 ], + "rotation": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1 + }, + "part_3": { + "type": "engine", + "location": [ 0, 0, -50 ], + "rotaiton": [ 0, 0, 0, 1 ], + "scale": [ 1, 1, 1 ], + "attached_at": 1 + } + }, + "stages": [ + { + "attachments": [], + "fuel_tanks": [], + "engines": [] + } + ] +} + +Creating a geoemtry collection: +uncheck "Generate Root Proxies", which disables the collection to use a invisible root as a wrapper, so collisions can be visualized +With root proxies thing should work fine, but no collision visualization since the root itself doesn't have any collision + +if encountering gravity issues: check gravity in "Level", "World" + + +@self use custom mesh component for generate once and use (for wings) at sim time. dynamic mesh are for meshes that can be constantly changing, so custom mesh is more performant diff --git a/Source/DeltaV.Target.cs b/Source/DeltaV.Target.cs index b962c42..b18ca45 100644 --- a/Source/DeltaV.Target.cs +++ b/Source/DeltaV.Target.cs @@ -9,7 +9,7 @@ public DeltaVTarget(TargetInfo Target) : base(Target) { Type = TargetType.Game; DefaultBuildSettings = BuildSettingsVersion.V5; - IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_4; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_6; ExtraModuleNames.Add("DeltaV"); } } diff --git a/Source/DeltaV/DeltaV.Build.cs b/Source/DeltaV/DeltaV.Build.cs index e6634b9..f973dc9 100644 --- a/Source/DeltaV/DeltaV.Build.cs +++ b/Source/DeltaV/DeltaV.Build.cs @@ -10,11 +10,17 @@ public DeltaV(ReadOnlyTargetRules Target) : base(Target) PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "UMG", "GeometryFramework", - "GeometryCore", "DynamicMesh", "ImageWrapper", "ProceduralMeshComponent", + "GeometryCore", "DynamicMesh", "ImageWrapper", "ProceduralMeshComponent", "GeometryCollectionEngine", "ChaosModularVehicleEngine", + "Chaos", "ChaosVehicles", "PhysicsCore", "ChaosModularVehicle", "ChaosModularVehicleEngine", + "ChaosVehiclesCore", + "ChaosVehiclesEngine", }); PrivateDependencyModuleNames.AddRange(new string[] { - "Slate", "SlateCore", "UMG", "Json", "GeometryFramework", "GeometryCore", "DynamicMesh", "GeometryScriptingCore" + "Slate", "SlateCore", "UMG", "Json", "GeometryFramework", "GeometryCore", "GeometryScriptingCore", + "Chaos", "ChaosVehicles", "PhysicsCore", "ChaosModularVehicle", "ChaosModularVehicleEngine", + "ChaosVehiclesCore", + "ChaosVehiclesEngine", }); // Uncomment if you are using Slate UI diff --git a/Source/DeltaV/DeltaV.cpp b/Source/DeltaV/DeltaV.cpp index 59bafa4..62f3f2b 100644 --- a/Source/DeltaV/DeltaV.cpp +++ b/Source/DeltaV/DeltaV.cpp @@ -4,8 +4,6 @@ #include "Modules/ModuleManager.h" #include "Modules/ModuleInterface.h" -#include "Editor/UnrealEdEngine.h" -#include "ClassIconFinder.h" #include "Styling/SlateStyle.h" #include "Styling/SlateStyleRegistry.h" diff --git a/Source/DeltaV/Private/Common/Craft.cpp b/Source/DeltaV/Private/Common/Craft.cpp index 66aa347..9ab62cc 100644 --- a/Source/DeltaV/Private/Common/Craft.cpp +++ b/Source/DeltaV/Private/Common/Craft.cpp @@ -13,70 +13,129 @@ #include "Common/Craft/FuelComponent.h" #include "Common/Craft/StageManager.h" #include "Common/Craft/FuelManager.h" +#include "Common/AssetLibrary.h" + +#include "GeometryCollection/GeometryCollection.h" +#include "GeometryCollection/GeometryCollectionClusteringUtility.h" +#include "GeometryCollection/GeometryCollectionComponent.h" + +#include "ChaosModularVehicle/ClusterUnionVehicleComponent.h" +#include "ChaosModularVehicle/VehicleSimComponentsInclude.h" +#include "ModularVehicle/VehicleSimThruster2DComponent.h" + +#include "GameFramework/PawnMovementComponent.h" + +#include "ChaosModularVehicle/ModularVehicleBaseComponent.h" + + +class Part { + UGeometryCollectionComponent* Component; + + TArray Children; +}; // Sets default values ACraft::ACraft(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer), PostPhysics(ETickingGroup::TG_PostPhysics, &ACraft::TickPostPhysics) { - // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. + // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; BaseEyeHeight = 0; PhysicsEnabled = false; - JsonUtil::ReadFile(FPaths::ProjectDir() + "Content/Crafts/empty.json"); - Orbit = CreateDefaultSubobject("OrbitComponent"); - SetRootComponent(CreateDefaultSubobject("CraftComponent")); - FuelManager = CreateDefaultSubobject("FuelManager"); StageManager = CreateDefaultSubobject("StageManager"); + + static const FName Default__Craft(TEXT("Default__Craft")); + if (GetFName() == Default__Craft) { + + } + // Name = name.random-int + // name is the saved craft file name, appended .random-int is an instance of the craft + + // Add inputs + if (auto* BaseSim = GetVehicleSimulationComponent()) { + BaseSim->InputConfig.Add(FModuleInputSetup(FName("Steering"), EModuleInputValueType::MAxis1D)); + BaseSim->InputConfig.Add(FModuleInputSetup(FName("Throttle"), EModuleInputValueType::MAxis1D)); + BaseSim->InputConfig.Add(FModuleInputSetup(FName("Thrust"), EModuleInputValueType::MAxis1D)); + BaseSim->InputConfig.Add(FModuleInputSetup(FName("Pitch"), EModuleInputValueType::MAxis1D)); + BaseSim->InputConfig.Add(FModuleInputSetup(FName("Roll"), EModuleInputValueType::MAxis1D)); + BaseSim->InputConfig.Add(FModuleInputSetup(FName("Yaw"), EModuleInputValueType::MAxis1D)); + UE_LOG(LogTemp, Warning, TEXT("Setup inputs")); + } + +} + +void ACraft::OnConstruction(const FTransform& Transform) { } void ACraft::FromJson(TSharedPtr Json) { // structure + parts // Array of (Parent, ChildJson[]) - auto& PartListJson = Json->GetObjectField(TEXT("parts")); - TArray, TSharedPtr>> Structures = { - { nullptr, Json->GetObjectField(TEXT("structure")) } - }; - for (int i = 0; i < Structures.Num(); ++i) { - for (auto& PartKVP : Structures[i].Value->Values) { - UPart* Part = NewObject(this, FName(PartKVP.Key)); - auto& PartJson = PartListJson->GetObjectField(PartKVP.Key); - Part->FromJson(PartJson); - Part->SetParent(Structures[i].Key); + for (auto& [Name, Definition] : Json->GetObjectField(TEXT("parts"))->Values) { + FTransform Transform; + // auto* Part = Cast(AddComponentByClass(UPart::StaticClass(), true, Transform, false)); - Parts.Add(PartKVP.Key, Part); + auto* Part = NewObject(this, FName(Name)); + Part->FromJson(Definition->AsObject()); + Parts.Add({ Name, Part }); + } - Structures.Add({ Part, PartKVP.Value->AsObject() }); - UE_LOG(LogTemp, Warning, TEXT("created: %s"), *PartKVP.Key); + // depth first traversal through the tree via array (avoid recursion) + TArray>> Structures = { + { GetClusterUnionComponent(), Json->GetObjectField(TEXT("structure")) } + }; + while (Structures.Num() > 0) { + auto [Parent, ChildJson] = Structures.Pop(); + for (auto& [Name, GrandChildrenJson] : ChildJson->Values) { + auto Part = Parts.FindChecked(Name); + Part->Mesh->AttachToComponent(Parent, FAttachmentTransformRules::KeepWorldTransform); + Structures.Add({ Part->Mesh, GrandChildrenJson->AsObject() }); } } - if (Structures.Num() > 1) { - Root = Structures[1].Key; - } - // stages - StageManager->FromJson(Json->GetArrayField(TEXT("stages"))); - FuelManager->FromJson(); - - for (auto& PartKVP : Parts) { - PartKVP.Value->RegisterComponent(); - } - UE_LOG(LogTemp, Warning, TEXT("Finished loading craft")); } TSharedPtr ACraft::ToJson() { - TSharedPtr Json = MakeShareable(new FJsonObject()); - TSharedPtr Structure = MakeShareable(new FJsonObject()); - TSharedPtr PartsJson = MakeShareable(new FJsonObject()); + TSharedPtr Json = MakeShared(); + TSharedPtr JsonStructure = MakeShared(); + TSharedPtr JsonParts = MakeShared(); + + for (auto& [Name, Part] : Parts) { + auto PartJson = Part->ToJson(); + JsonParts->SetObjectField(Name, PartJson); + } + // depth first traversal through + TArray>> Structure = { + { GetClusterUnionComponent(), JsonStructure } + }; + while (Structure.Num() > 0) { + auto [Parent, ChildJson] = Structure.Pop(); + for (auto& Child : Parent->GetAttachChildren()) { + // check the owner of this component is a UPart, if it is, it's the base primitive + // for the part, otherwise, it is be a subobject definition (sim/partial part) + if (UPart* Part = Cast(Child->GetOuter())) { + TSharedPtr GrandChildrenJson = MakeShared(); + ChildJson->SetObjectField(Part->GetName(), GrandChildrenJson); + Structure.Add({ Child, GrandChildrenJson }); + } + } + } + + JsonUtil::Vector(Json, TEXT("location"), GetActorLocation()); + JsonUtil::Quat(Json, TEXT("rotation"), GetActorQuat()); + Json->SetObjectField(TEXT("structure"), JsonStructure); + Json->SetObjectField(TEXT("parts"), JsonParts); + + /** // structure + parts TArray>> PartStructures; if (RootPart()) { @@ -103,7 +162,7 @@ TSharedPtr ACraft::ToJson() { // stages Json->SetArrayField(TEXT("stages"), StageManager->ToJson()); - + */ return Json; } @@ -122,6 +181,7 @@ ACraft* ACraft::Clone() { void ACraft::BeginPlay() { Super::BeginPlay(); + UE_LOG(LogTemp, Warning, TEXT("ACraft BeginPlay called")); } // Called every frame @@ -129,6 +189,7 @@ void ACraft::Tick(float DeltaTime) { Super::Tick(DeltaTime); + /* if (!PhysicsEnabled) { if (Orbit->CentralBody != nullptr) { // simulation, but no physics double Time = GetGameTimeSinceCreation(); @@ -147,9 +208,10 @@ void ACraft::Tick(float DeltaTime) FVector Gravity = RelativeLocation.GetSafeNormal() * Orbit->CentralBody->Mu / RelativeLocation.SquaredLength(); for (auto& PartKVP : Parts) { UPart* Part = PartKVP.Value; - Part->Mesh->AddForce(Gravity, NAME_None, true); + Part->Mesh->AddForce(Gravity, Part->Bone, true); } } + */ /* FVector Position, Velocity; @@ -195,7 +257,8 @@ void ACraft::Tick(float DeltaTime) } void ACraft::TickPostPhysics(float DeltaTime) { - + return; + /* if (!PhysicsEnabled && Orbit->CentralBody == nullptr) { return; // In build mode } @@ -257,6 +320,17 @@ void ACraft::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) // detaches everything, must be re-attached afterwards // also doesn't remove from the part list of the previous craft, so additional processing can be done static void TransferPart(UPart* Part, ACraft* FromCraft, ACraft* ToCraft) { + if (FromCraft == ToCraft) { + return; + } + + Part->UnregisterComponent(); + + // All attached childrens are children in the part hierchy + + + Part->Mesh->GetAttachChildren(); + UE_LOG(LogTemp, Warning, TEXT("Transfer %s"), *Part->Id); if (!FromCraft->Parts.Contains(Part->Id)) { // Part has already been moved??? @@ -264,12 +338,11 @@ static void TransferPart(UPart* Part, ACraft* FromCraft, ACraft* ToCraft) { return; } - Part->Detach(); + // Part->Detach(); for (auto& Child : Part->Children) { TransferPart(Child, FromCraft, ToCraft); } - // every part that can be connected to this has been detached, we can safely rename (change ownership) now // avoid name collisions FString OriginalName = Part->Id; @@ -286,6 +359,75 @@ static void TransferPart(UPart* Part, ACraft* FromCraft, ACraft* ToCraft) { ToCraft->Parts.Add(Part->Id, Part); } +void ACraft::Transfer(UPart* SourcePart, UPrimitiveComponent* DestPart) { + if (SourcePart == nullptr || DestPart == nullptr) { + UE_LOG(LogTemp, Warning, TEXT("some parts were nullptr")); + return; + } + ACraft* SourceCraft = SourcePart->GetOwner(); + ACraft* DestCraft = DestPart->GetOwner(); + if (SourceCraft == nullptr || DestCraft == nullptr) { + UE_LOG(LogTemp, Warning, TEXT("some crafts were nullptr")); + return; + } + auto* SourceClusterUnion = SourceCraft->GetClusterUnionComponent(); + auto* DestClusterUnion = DestCraft->GetClusterUnionComponent(); + + // go through all children of the part, unregister them, + + TArray> Components = { { DestPart, SourcePart->Mesh } }; + TArray Parts; + + // detach and unregister everything + while (Components.Num() > 0) { + auto [AttachTo, Component] = Components.Pop(); + + + // if the direct outer is a UPart, it's the base mesh transform + if (UPart* Part = Cast(Component->GetOuter())) { + Part->Rename(nullptr, DestCraft); + Part->ReregisterComponent(); + Parts.Add(Part); + Component->Rename(nullptr, Part); + } + else { + Component->Rename(nullptr, AttachTo); + } + + if (auto* PrimitiveComponent = Cast(Component)) { + SourceClusterUnion->RemoveComponentFromCluster(PrimitiveComponent); + DestClusterUnion->AddComponentToCluster(PrimitiveComponent, {}); + } + Component->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform); + Component->UnregisterComponent(); + + Component->AttachToComponent(AttachTo, FAttachmentTransformRules::KeepWorldTransform); + Component->RegisterComponent(); + + for (auto& Child : Component->GetAttachChildren()) { + Components.Add({ Component, Child }); + } + } + + for (auto* Part : Parts) { + UE_LOG(LogTemp, Warning, TEXT("transfer part - %s - %s"), *Part->GetName(), *Part->GetOuter()->GetName()); + } + UE_LOG(LogTemp, Warning, TEXT("part transfer complete")); + + /* + // rename parts, which are the top owners of their own physics/etc + for (auto* Part : Parts) { + Part->Rename(nullptr, DestCraft); + } + + // attach everything again + for (auto [AttachedTo, Component] : Components) { + Component->AttachToComponent(AttachedTo, FAttachmentTransformRules::KeepRelativeTransform); + Component->RegisterComponent(); + } + */ +} + void ACraft::DetachPart(UPart* Part, ACraft* NewCraft) { TSharedPtr CraftJson = JsonUtil::ReadFile(FPaths::ProjectDir() + "Content/Crafts/empty.json"); @@ -304,7 +446,7 @@ void ACraft::DetachPart(UPart* Part, ACraft* NewCraft) { // complete for (auto& PartKVP : NewCraft->Parts) { Parts.Remove(PartKVP.Key); - PartKVP.Value->Attach(); + // PartKVP.Value->Attach(); } // NewCraft->SetRootComponent(Part->Mesh); @@ -312,19 +454,20 @@ void ACraft::DetachPart(UPart* Part, ACraft* NewCraft) { } void ACraft::AttachPart(ACraft* SourceCraft, UPart* AttachToPart) { - if (!SourceCraft->RootPart()) { + auto& RootMeshes = SourceCraft->GetRootComponent()->GetAttachChildren(); + if (RootMeshes.Num() <= 0) { UE_LOG(LogTemp, Warning, TEXT("Source craft has no root part!")); return; } + UPart* Part = RootMeshes.Last()->GetTypedOuter(); // transfer - UPart* Part = SourceCraft->RootPart(); TransferPart(Part, SourceCraft, this); - Part->SetParent(AttachToPart); + // Part->SetParent(AttachToPart); for (auto& PartKVP : SourceCraft->Parts) { - PartKVP.Value->Attach(); + // PartKVP.Value->Attach(); } // TODO: transfer stages @@ -338,25 +481,18 @@ void ACraft::AttachPart(ACraft* SourceCraft, UPart* AttachToPart) { } void ACraft::Rotate(FRotator Rotator, float Strength) { - UPart* Engine = RootPart(); - if (PhysicsEnabled && Engine && !Rotator.IsZero()) { - FVector Axis = GetActorRotation().RotateVector(Rotator.Quaternion().GetRotationAxis()); - - Engine->Mesh->AddTorqueInDegrees(Axis * Strength); - } + } void ACraft::SetPhysicsEnabled(bool enabled) { - if (enabled == PhysicsEnabled) { - return; + for (UActorComponent* Component : GetComponents()) + { + if (UPrimitiveComponent* PrimComp = Cast(Component)) + { + PrimComp->SetSimulatePhysics(enabled); + } } PhysicsEnabled = enabled; - - for (auto& PartKVP : Parts) { - auto Part = PartKVP.Value; - Part->SetPhysicsEnabled(PhysicsEnabled); - // Part->SetSimulatePhysics(PhysicsEnabled); - } } FVector ACraft::CalculateCoM() { @@ -385,12 +521,48 @@ FVector ACraft::GetWorldCoM() { } TArray ACraft::StageCraft() { + // Temp try to lock the wheels + GetVehicleSimulationComponent()->RecreatePhysicsState(); + /** Code for getting the active chaos simulation component from the cluster union sim component + int WheelGuid = 0; + UPart* Part = Parts.FindChecked(FString("tire_fr")); + for (auto& Child : Part->Mesh->GetAttachChildren()) { + if (auto* Suspension = Cast(Child)) { + auto& SuspensionChildren = Suspension->GetAttachChildren(); + UE_LOG(LogTemp, Warning, TEXT("Found wheel has %d children"), SuspensionChildren.Num()); + if (SuspensionChildren.Num() > 0) { + if (auto* Wheel = Cast(SuspensionChildren[0])) { + Wheel->bSteeringEnabled = false; + + const auto& Data = GetVehicleSimulationComponent()->ComponentToPhysicsObjects.Find(Wheel); + + WheelGuid = Data->Guid; + UE_LOG(LogTemp, Warning, TEXT("Found wheel sim, tree index is %d"), WheelGuid); + } + } + } + UE_LOG(LogTemp, Warning, TEXT("Tire children is ")); + } + // Probably can only update the sim component, then in place replace it at the tree index, and hope there is no other reference + for (auto& Node : GetVehicleSimulationComponent()->VehicleSimulationPT->AccessSimComponentTree()->GetSimulationModuleTree()) { + if (Node.SimModule->GetGuid() == WheelGuid) { + if (Chaos::FWheelSimModule* Wheel = static_cast(Node.SimModule)) { + float MaxSteering = Wheel->AccessSetup().MaxSteeringAngle; + UE_LOG(LogTemp, Warning, TEXT("Wow it's a wheel, steering %f"), MaxSteering); + Wheel->AccessSetup().MaxSteeringAngle = 0; + } + } + } + */ + + UE_LOG(LogTemp, Warning, TEXT("---")); + // TODO: return TArray(); } FVector ACraft::GetAngularVelocity() { - return RootPart()->Mesh->GetPhysicsAngularVelocityInRadians(); + return FVector();// RootPart()->Mesh->GetPhysicsAngularVelocityInRadians(); } void ACraft::SetLocation(FVector Location) { @@ -400,10 +572,10 @@ void ACraft::SetLocation(FVector Location) { }); } else { // all parts attached to root, so only need to set root - RootPart()->Mesh->SetWorldLocation(Location); + // RootPart()->Mesh->SetWorldLocation(Location); } - SetActorLocation(Location); + // SetActorLocation(Location); return; } @@ -415,7 +587,7 @@ void ACraft::SetRotation(FQuat Rotation) { }); } else { - RootPart()->Mesh->SetWorldRotation(Rotation); + // RootPart()->Mesh->SetWorldRotation(Rotation); } return; diff --git a/Source/DeltaV/Private/Common/Craft/AeroComponent.cpp b/Source/DeltaV/Private/Common/Craft/AeroComponent.cpp index 25a8cd6..78034fe 100644 --- a/Source/DeltaV/Private/Common/Craft/AeroComponent.cpp +++ b/Source/DeltaV/Private/Common/Craft/AeroComponent.cpp @@ -33,9 +33,6 @@ void UAeroComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorC { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - if (!Part->PhysicsEnabled) { - return; - } // aerodynamics??? // find air deflection based on velocity diff --git a/Source/DeltaV/Private/Common/Craft/EngineComponent.cpp b/Source/DeltaV/Private/Common/Craft/EngineComponent.cpp index 4915864..f32d49c 100644 --- a/Source/DeltaV/Private/Common/Craft/EngineComponent.cpp +++ b/Source/DeltaV/Private/Common/Craft/EngineComponent.cpp @@ -50,9 +50,6 @@ void UEngineComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActo // ... // do engine stuff, get input, this component should also handle particles from the engine - if (!Part->PhysicsEnabled) { - return; - } // FVector ThrustVector = Part->GetComponentQuat().RotateVector(); Part->Mesh->AddForceAtLocationLocal(FVector(1000000 * Thrust, 0, 0), PivotOffset); @@ -62,7 +59,6 @@ void UEngineComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActo FVector Throttle = Part->Mesh->GetComponentQuat().RotateVector(FVector(1000000 * Thrust, 0, 0)); DrawDebugDirectionalArrow(World, Start, Start + Throttle, 10, FColor::Yellow, false, -1, 1); } - return; // temp if (Part->Parent && Part->Parent->Type == "cylinder") { diff --git a/Source/DeltaV/Private/Common/Craft/FuelComponent.cpp b/Source/DeltaV/Private/Common/Craft/FuelComponent.cpp index 77bf29d..63e63df 100644 --- a/Source/DeltaV/Private/Common/Craft/FuelComponent.cpp +++ b/Source/DeltaV/Private/Common/Craft/FuelComponent.cpp @@ -156,9 +156,6 @@ void UFuelComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorC { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - if (!Part->PhysicsEnabled) { - return; - } // only tick for fuel components at the root of each fuel group, root if parent is null or a decoupler if (Part->Parent != nullptr && Part->Parent->Type != "decoupler") { return; diff --git a/Source/DeltaV/Private/Common/Craft/StageManager.cpp b/Source/DeltaV/Private/Common/Craft/StageManager.cpp index c8d6d2c..965465a 100644 --- a/Source/DeltaV/Private/Common/Craft/StageManager.cpp +++ b/Source/DeltaV/Private/Common/Craft/StageManager.cpp @@ -54,20 +54,19 @@ void UStageManager::FromJson(TArray> Json) { } Stages.Push(Stage); } - } TArray> UStageManager::ToJson() { TArray> Json; for (UStage* Stage : Stages) { - TSharedPtr StageJson = MakeShareable(new FJsonObject()); + auto StageJson = MakeShared(); TArray> Array; for (UPart* Part : Stage->Parts) { - Array.Add(MakeShareable(new FJsonValueString(Part->Id))); + Array.Add(MakeShared(Part->Id)); } StageJson->SetArrayField("parts", Array); - Json.Push(MakeShareable(new FJsonValueObject(StageJson))); + Json.Push(MakeShared(StageJson)); } return Json; } diff --git a/Source/DeltaV/Private/Common/Craft/WheelComponent.cpp b/Source/DeltaV/Private/Common/Craft/WheelComponent.cpp index 4c91baf..357aaa1 100644 --- a/Source/DeltaV/Private/Common/Craft/WheelComponent.cpp +++ b/Source/DeltaV/Private/Common/Craft/WheelComponent.cpp @@ -14,8 +14,6 @@ UWheelComponent::UWheelComponent() { // create a physics contraint - - UE_LOG(LogTemp, Warning, TEXT("Wheel created")); } // Called when the game starts @@ -42,6 +40,7 @@ void UWheelComponent::SetPhysicsEnabled(bool bSimulate) { //Mesh->DetachFromComponent(DetachmentRule); //Physics->SetConstrainedComponents(Part, "", Mesh, ""); //Mesh->SetSimulatePhysics(true); + } else { diff --git a/Source/DeltaV/Private/Common/InputTriggerInvChordAction.cpp b/Source/DeltaV/Private/Common/InputTriggerInvChordAction.cpp new file mode 100644 index 0000000..d92b207 --- /dev/null +++ b/Source/DeltaV/Private/Common/InputTriggerInvChordAction.cpp @@ -0,0 +1,25 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Common/InputTriggerInvChordAction.h" + +#include "EnhancedInputModule.h" +#include "EnhancedPlayerInput.h" +#include "HAL/IConsoleManager.h" +#include "Misc/DataValidation.h" + +ETriggerState UInputTriggerInvChordAction::UpdateState_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue ModifiedValue, float DeltaTime) +{ + ETriggerState EventDataState = Super::UpdateState_Implementation(PlayerInput, ModifiedValue, DeltaTime); + switch (EventDataState) + { + case ETriggerState::None: + return ETriggerState::Triggered; + case ETriggerState::Ongoing: + return ETriggerState::Ongoing; + case ETriggerState::Triggered: + return ETriggerState::None; + default: + return ETriggerState::None; + } +} diff --git a/Source/DeltaV/Private/Common/JsonUtil.cpp b/Source/DeltaV/Private/Common/JsonUtil.cpp index 3d7ff25..f0fbf6f 100644 --- a/Source/DeltaV/Private/Common/JsonUtil.cpp +++ b/Source/DeltaV/Private/Common/JsonUtil.cpp @@ -56,9 +56,9 @@ FVector JsonUtil::Vector(const TSharedPtr& Json, const FString& Fie void JsonUtil::Vector(TSharedPtr& Json, const FString& FieldName, const FVector& Vector) { TArray> Array; - Array.Add(MakeShareable(new FJsonValueNumber(Vector.X))); - Array.Add(MakeShareable(new FJsonValueNumber(Vector.Y))); - Array.Add(MakeShareable(new FJsonValueNumber(Vector.Z))); + Array.Add(MakeShared(Vector.X)); + Array.Add(MakeShared(Vector.Y)); + Array.Add(MakeShared(Vector.Z)); Json->SetArrayField(FieldName, Array); } @@ -81,10 +81,10 @@ FQuat JsonUtil::Quat(const TSharedPtr& Json, const FString& FieldNa void JsonUtil::Quat(TSharedPtr& Json, const FString& FieldName, const FQuat& Quat) { TArray> Array; - Array.Add(MakeShareable(new FJsonValueNumber(Quat.X))); - Array.Add(MakeShareable(new FJsonValueNumber(Quat.Y))); - Array.Add(MakeShareable(new FJsonValueNumber(Quat.Z))); - Array.Add(MakeShareable(new FJsonValueNumber(Quat.W))); + Array.Add(MakeShared(Quat.X)); + Array.Add(MakeShared(Quat.Y)); + Array.Add(MakeShared(Quat.Z)); + Array.Add(MakeShared(Quat.W)); Json->SetArrayField(FieldName, Array); } @@ -106,9 +106,9 @@ FRotator JsonUtil::Rotator(const TSharedPtr& Json, const FString& F void JsonUtil::Rotator(TSharedPtr& Json, const FString& FieldName, const FRotator& Rotator) { TArray> Array; - Array.Add(MakeShareable(new FJsonValueNumber(Rotator.Pitch))); - Array.Add(MakeShareable(new FJsonValueNumber(Rotator.Yaw))); - Array.Add(MakeShareable(new FJsonValueNumber(Rotator.Roll))); + Array.Add(MakeShared(Rotator.Pitch)); + Array.Add(MakeShared(Rotator.Yaw)); + Array.Add(MakeShared(Rotator.Roll)); Json->SetArrayField(FieldName, Array); } diff --git a/Source/DeltaV/Private/Common/Part.cpp b/Source/DeltaV/Private/Common/Part.cpp index 7e3e1bc..3c0d5fb 100644 --- a/Source/DeltaV/Private/Common/Part.cpp +++ b/Source/DeltaV/Private/Common/Part.cpp @@ -14,6 +14,9 @@ #include "MeshDescriptionToDynamicMesh.h" #include "DynamicMeshToMeshDescription.h" // can always use this +#include "GeometryCollection/GeometryCollection.h" +#include "GeometryCollection/GeometryCollectionComponent.h" + #include "Common/AssetLibrary.h" #include "Common/AttachmentNode.h" #include "Common/JsonUtil.h" @@ -26,9 +29,9 @@ #include "Common/Craft/AeroComponent.h" #include "Common/Craft/WheelComponent.h" - -static auto DetachmentRule = FDetachmentTransformRules(EDetachmentRule::KeepWorld, false); -static auto AttachmentRule = FAttachmentTransformRules(EAttachmentRule::KeepWorld, true); +#include "ChaosModularVehicle/VehicleSimComponentsInclude.h" +#include "ModularVehicle/VehicleSimThruster2DComponent.h" +#include "ChaosModularVehicle/ClusterUnionVehicleComponent.h" static TMap> AdditionalFields = { {"fuel", UFuelComponent::StaticClass()}, @@ -40,115 +43,42 @@ static TMap> AdditionalFields = { UPart::UPart(const FObjectInitializer& ObjectInitializer) : UActorComponent(ObjectInitializer) { Parent = nullptr; Children = TArray(); - FCollisionResponseContainer(); - - Craft = Cast(GetOwner()); + Craft = GetOwner(); - // TODO: this should be at the position of the attachment node, maybe then the limit can be smaller - // and also add a drive to push the connection back towards to default position - Physics = CreateDefaultSubobject("Link"); - Physics->SetAngularSwing1Limit(EAngularConstraintMotion::ACM_Locked, 0); - Physics->SetAngularSwing2Limit(EAngularConstraintMotion::ACM_Locked, 0); - Physics->SetAngularTwistLimit(EAngularConstraintMotion::ACM_Locked, 0); - Physics->SetLinearXLimit(ELinearConstraintMotion::LCM_Locked, 0); - Physics->SetLinearYLimit(ELinearConstraintMotion::LCM_Locked, 0); - Physics->SetLinearZLimit(ELinearConstraintMotion::LCM_Locked, 0); - - // controls how noodly the craft is - Physics->SetLinearDriveParams(1e6, 1e6, 1e6); - Physics->SetLinearPositionTarget(FVector(0)); - Physics->SetLinearPositionDrive(true, true, true); - Physics->SetLinearVelocityTarget(FVector(0)); - Physics->SetLinearVelocityDrive(true, true, true); - - PhysicsEnabled = false; - - // static ConstructorHelpers::FObjectFinder PhysMaterial(TEXT("/Game/Simulation/Rubber")); - // UPhysicalMaterial* PhysMaterial = NewObject(); - // PhysMaterial->Friction = 1; - - // SetPhysMaterialOverride(PhysMaterial); Id = GetName(); } -void UPart::SetAttachmentNodeVisibility(bool visibility) { - for (auto node : AttachmentNodes) { - node->SetVisibility(visibility); - } -} - -void UPart::SetParent(UPart* NewParent) { - if (NewParent == this) { +void UPart::SetParent(UPrimitiveComponent* NewParent) { + + UPart* PartParent = nullptr;// Cast(NewParent); + if (PartParent == this) { UE_LOG(LogTemp, Warning, TEXT("Parenting self, not allowed")); return; } if (Parent != nullptr) { Parent->Children.Remove(this); - } - Detach(); + Mesh->DetachFromComponent(FDetachmentTransformRules::KeepRelativeTransform); + } - Parent = NewParent; + Parent = PartParent; if (Parent != nullptr) { Parent->Children.Add(this); + + Mesh->AttachToComponent(Parent->Mesh, FAttachmentTransformRules::KeepRelativeTransform); } - Attach(); } void UPart::BeginPlay() { Super::BeginPlay(); - - for (auto& FieldKVP : AdditionalComponents) { - FieldKVP.Value->RegisterComponent(); - } - Mesh->RegisterComponent(); - Physics->RegisterComponent(); -} - -void UPart::Detach() { - if (PhysicsEnabled) { - Physics->BreakConstraint(); - } - else { - Mesh->DetachFromComponent(DetachmentRule); - } -} - -void UPart::Attach() { - if (Parent == nullptr) { - return; - } - - if (PhysicsEnabled) { - Physics->SetConstrainedComponents(Mesh, Bone, Parent->Mesh, Parent->Bone); - } - else { - Mesh->AttachToComponent(Parent->Mesh, AttachmentRule); - } -} - -void UPart::SetPhysicsEnabled(bool bSimulate) { - if (PhysicsEnabled == bSimulate) { - return; - } - Detach(); - PhysicsEnabled = bSimulate; - Attach(); - - for (auto& FieldKVP : AdditionalComponents) { - FieldKVP.Value->SetPhysicsEnabled(bSimulate); - } - Mesh->SetSimulatePhysics(PhysicsEnabled); } void UPart::FromJson(TSharedPtr Json) { Type = Json->GetStringField(TEXT("type")); - Physics->SetRelativeLocation(JsonUtil::Vector(Json, "attach_location")); - TSharedPtr PartDefinition = UAssetLibrary::PartDefinition(Type); FString MeshPath = PartDefinition->GetStringField(TEXT("mesh")); FString MeshTypeString = PartDefinition->GetStringField(TEXT("type")); @@ -166,24 +96,43 @@ void UPart::FromJson(TSharedPtr Json) { TObjectPtr MeshObj = NewObject(this); MeshObj->SetSkeletalMesh(SkeletalMesh); Mesh = MeshObj; - Bone = MeshObj->GetBoneName(0); + Bone = MeshObj->GetBoneName(1); + + FString BoneName = Bone.ToString(); + UE_LOG(LogTemp, Warning, TEXT("Bone: %s"), *BoneName); MeshType = SKELETAL_MESH; } + else if (MeshTypeString == "geometry_collection") { + auto* GeometryCollection = UAssetLibrary::LoadAsset(*MeshPath); + auto* Component = NewObject(this); + Component->SetRestCollection(GeometryCollection); + Component->DamageThreshold = { 1e8 }; + Component->bForceUpdateActiveTransforms = true; - Physics->AttachToComponent(Mesh, AttachmentRule); - // TODO: add custom collision channel for each craft, no intervessel collision - Mesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); - Mesh->SetLinearDamping(0); - Mesh->SetAngularDamping(0); - Mesh->SetAbsolute(false, false, true); + UE_LOG(LogTemp, Warning, TEXT("Creating geometry collection")); + + Mesh = Component; + Bone = FName(""); + + MeshType = GEOMETRY_COLLECTION; + } + + Mesh->SetAbsolute(false, false, false); Mesh->SetCollisionResponseToChannel(ECC_Camera, ECR_Ignore); - Mesh->SetCollisionResponseToChannel(ECC_GameTraceChannel11, ECR_Ignore); - Mesh->SetCollisionObjectType(ECC_GameTraceChannel11); - Mesh->SetRelativeLocation(JsonUtil::Vector(Json, "location")); + // ignore self collision + // Mesh->SetCollisionResponseToChannel(ECC_GameTraceChannel11, ECR_Ignore); + // Mesh->SetCollisionObjectType(ECC_GameTraceChannel11); + + Mesh->SetWorldLocation(JsonUtil::Vector(Json, "location")); Mesh->SetWorldRotation(JsonUtil::Rotator(Json, "rotation")); Mesh->SetWorldScale3D(JsonUtil::Vector(Json, "scale")); + + + // Mesh->SetAbsolute(false, false, true); + + /* for (auto& FieldKVP : AdditionalFields) { if (Json->HasTypedField(FieldKVP.Key, EJson::Object)) { UPartComponent* AdditionalComponent = NewObject(this, FieldKVP.Value, FName(FieldKVP.Key)); @@ -191,22 +140,88 @@ void UPart::FromJson(TSharedPtr Json) { AdditionalComponents.Add(FieldKVP.Key, AdditionalComponent); } } + */ + + const TSharedPtr* SpecialJson; + if (Json->TryGetObjectField(TEXT("wheel"), SpecialJson)) { + auto& WheelJson = *SpecialJson; + + auto* Suspension = NewObject(Mesh); + Suspension->SuspensionMaxDrop = 100; + Suspension->SuspensionMaxRaise = 100; + Suspension->SpringRate = 200; + Suspension->SpringPreload = 100; + // Suspension->SuspensionForceEffect = 0; + Suspension->AttachToComponent(Mesh, FAttachmentTransformRules::KeepRelativeTransform); + Suspension->RegisterComponent(); + Craft->AddOwnedComponent(Suspension); + + auto* Wheel = NewObject(Mesh); + Wheel->MaxSteeringAngle = WheelJson->GetNumberField(TEXT("max_steering")); + Wheel->WheelRadius = 100; + Wheel->AxisType = EWheelAxisType::X; + Wheel->MaxSteeringAngle *= -1; + Wheel->bSteeringEnabled = true; + Wheel->AttachToComponent(Suspension, FAttachmentTransformRules::KeepRelativeTransform); + Wheel->RegisterComponent(); + Craft->AddOwnedComponent(Wheel); + } else if (Json->TryGetObjectField(TEXT("thruster"), SpecialJson)) { + auto& ThrusterJson = *SpecialJson; + + auto* Thruster = NewObject(Mesh); + Thruster->bSteeringEnabled = true; + Thruster->MaxThrustForce = 2000000.0f; + Thruster->MaxSteeringAngle = 20; + Thruster->AttachToComponent(Mesh, FAttachmentTransformRules::KeepRelativeTransform); + Thruster->RegisterComponent(); + Craft->AddOwnedComponent(Thruster); + } + else { + auto* Chassis = NewObject(Mesh); + Chassis->AttachToComponent(Mesh, FAttachmentTransformRules::KeepRelativeTransform); + Chassis->RegisterComponent(); + Craft->AddOwnedComponent(Chassis); + } + // extract to an overriden RegisterComponent that registers the mesh + + UE_LOG(LogTemp, Warning, TEXT("%s has %s physics state"), *GetName(), Mesh->HasValidPhysicsState() ? TEXT("valid") : TEXT("invalid")); + // ! important, super important + Craft->GetClusterUnionComponent()->AddComponentToCluster(Mesh, {}); + // Craft->GetClusterUnionComponent()->RemoveComponentFromCluster(Mesh); + // Mesh->RegisterComponent(); + } TSharedPtr UPart::ToJson() { - TSharedPtr Json = MakeShareable(new FJsonObject()); + TSharedPtr Json = MakeShared(); AActor* Owner = GetOwner(); Json->SetStringField(TEXT("type"), Type); - JsonUtil::Vector(Json, "location", Mesh->GetComponentLocation() - Owner->GetActorLocation()); - JsonUtil::Rotator(Json, "rotation", Mesh->GetComponentRotation()); + JsonUtil::Vector(Json, "location", Mesh->GetRelativeLocation());// -Owner->GetActorLocation()); + JsonUtil::Rotator(Json, "rotation", Mesh->GetRelativeRotation());// -Owner->GetActorRotation()); JsonUtil::Vector(Json, "scale", Mesh->GetRelativeScale3D()); - JsonUtil::Vector(Json, "attach_location", Physics->GetRelativeLocation()); + // JsonUtil::Vector(Json, "attach_location", Physics->GetRelativeLocation()); + + for (USceneComponent* Component : Mesh->GetAttachChildren()) { + if (auto* Suspension = Cast(Component)) { + + auto& SuspensionChildren = Suspension->GetAttachChildren(); + if (auto* Wheel = Cast(SuspensionChildren.Last())) { + auto WheelJson = MakeShared(); + WheelJson->SetNumberField("max_steering", -Wheel->MaxSteeringAngle); + Json->SetObjectField("wheel", WheelJson); + } + } else if (auto* Thruster = Cast(Component)) { + auto ThrusterJson = MakeShared(); + Json->SetObjectField(TEXT("thruster"), ThrusterJson); + } else if (auto* Chassis = Cast< UVehicleSimChassisComponent>(Component)) { - for (auto& FieldKVP : AdditionalComponents) { - Json->SetObjectField(FieldKVP.Key, FieldKVP.Value->ToJson()); + } } + // if there is a suspension component + + return Json; } @@ -222,7 +237,7 @@ UPartComponent* UPart::GetComponent(FString Name) { } }*/ - +/* FMeshDescription* UPart::CopyMeshToDynamicMesh(TObjectPtr DynamicMesh, int LOD) { FGeometryScriptCopyMeshFromAssetOptions AssetOptions; FGeometryScriptMeshReadLOD TargetLOD; @@ -252,3 +267,4 @@ FMeshDescription* UPart::CopyMeshToDynamicMesh(TObjectPtr DynamicM } return nullptr; } +*/ \ No newline at end of file diff --git a/Source/DeltaV/Private/Common/UI/MainMenu.cpp b/Source/DeltaV/Private/Common/UI/MainMenu.cpp index 968f749..e0199ff 100644 --- a/Source/DeltaV/Private/Common/UI/MainMenu.cpp +++ b/Source/DeltaV/Private/Common/UI/MainMenu.cpp @@ -26,10 +26,14 @@ void UMainMenu::PlayButtonClicked() { void UMainMenu::SettingsButtonClicked() { UE_LOG(LogTemp, Warning, TEXT("Settings button pressed")); - UGameplayStatics::OpenLevel(GetWorld(), "Simulation"); + // UGameplayStatics::OpenLevel(GetWorld(), "Simulation"); } void UMainMenu::QuitButtonClicked() { UE_LOG(LogTemp, Warning, TEXT("Quit button pressed")); RequestEngineExit("Quit Button Clicked"); } + +void UMainMenu::GenerationButtonClicked() { + UGameplayStatics::OpenLevel(GetWorld(), "Generation"); +} \ No newline at end of file diff --git a/Source/DeltaV/Private/Common/UI/StagesList.cpp b/Source/DeltaV/Private/Common/UI/StagesList.cpp index 822d9bc..0f3f70e 100644 --- a/Source/DeltaV/Private/Common/UI/StagesList.cpp +++ b/Source/DeltaV/Private/Common/UI/StagesList.cpp @@ -29,7 +29,7 @@ TPair FindStageOfPart(TArray& Stages, UPart* Part) { UDragDropOperation* UStagesList::DragItem(UUserWidget* Widget) { UDragDropOperation* Operation = NewObject(); - UStageGroup* NewWidget = CreateWidget(this, UStageGroup::BlueprintClass); + UStageGroup* NewWidget = CreateWidget(this, UStageGroup::BlueprintClass()); UStageGroup* StageItem = Cast(Widget); diff --git a/Source/DeltaV/Private/Construction/AttachmentNodes.cpp b/Source/DeltaV/Private/Construction/AttachmentNodes.cpp index b3baacb..cbf823c 100644 --- a/Source/DeltaV/Private/Construction/AttachmentNodes.cpp +++ b/Source/DeltaV/Private/Construction/AttachmentNodes.cpp @@ -21,18 +21,17 @@ UAttachmentNodes::UAttachmentNodes() if (Part == nullptr) { return; } - + static FAttachmentTransformRules AttachmentRule = FAttachmentTransformRules(EAttachmentRule::KeepRelative, true); static ConstructorHelpers::FObjectFinderSphereMeshAsset(TEXT("/Game/Shapes/AttachmentNode")); TSharedPtr PartDefinition = UAssetLibrary::PartDefinition(Part->Type); for (auto& LocationJson : PartDefinition->GetArrayField(TEXT("attachment"))) { FVector Location = JsonUtil::Vector(LocationJson->AsObject(), "location"); - - auto Node = CreateDefaultSubobject(*Location.ToString()); + auto Node = NewObject(this, *Location.ToString()); Node->SetStaticMesh(SphereMeshAsset.Object); Node->SetRelativeScale3D(FVector(0.1f)); - Node->SetupAttachment(this); + Node->AttachToComponent(this, AttachmentRule); Node->SetRelativeLocation(Location); Node->SetCollisionEnabled(ECollisionEnabled::QueryAndProbe); Node->SetCollisionResponseToAllChannels(ECR_Ignore); @@ -41,14 +40,35 @@ UAttachmentNodes::UAttachmentNodes() AttachmentNodes.Add(Node); } + /* + for (FName& SocketName : Part->Mesh->GetAllSocketNames()) { + if (!SocketName.ToString().StartsWith("node")) { + continue; + } + FTransform SocketTransform = Part->Mesh->GetSocketTransform(SocketName, RTS_Component); + + auto Node = CreateDefaultSubobject(SocketName); + Node->SetStaticMesh(SphereMeshAsset.Object); + Node->SetRelativeScale3D(FVector(0.1f)); + + Node->SetupAttachment(this, SocketName); + Node->SetRelativeLocation(SocketTransform.GetLocation()); + Node->SetCollisionEnabled(ECollisionEnabled::QueryAndProbe); + Node->SetCollisionResponseToAllChannels(ECR_Ignore); + Node->SetCollisionResponseToChannel(ECC_AttachmentNodes, ECR_Block); + Node->SetAbsolute(false, false, true); + + AttachmentNodes.Add(Node); + } + */ if (PartDefinition->HasField(TEXT("side_attachment"))) { SideAttachment = JsonUtil::Vector(PartDefinition, "side_attachment"); } else { SideAttachment = FVector(INFINITY); } - SetupAttachment(Part->Mesh); + AttachToComponent(Part->Mesh, AttachmentRule); } @@ -56,17 +76,19 @@ UAttachmentNodes::UAttachmentNodes() void UAttachmentNodes::BeginPlay() { Super::BeginPlay(); - - // ... for (auto& Node : AttachmentNodes) { Node->RegisterComponent(); } +} - UE_LOG(LogTemp, Warning, TEXT("Location %s"), *GetComponentLocation().ToString()); + +void UAttachmentNodes::OnRegister() { + Super::OnRegister(); } + // Called every frame void UAttachmentNodes::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { @@ -79,8 +101,7 @@ UAttachmentNodes* UAttachmentNodes::Get(UPart* Part) { TArray Components; Part->Mesh->GetChildrenComponents(false, Components); for (USceneComponent* Component : Components) { - UAttachmentNodes* Node = Cast(Component); - if (Node) { + if (UAttachmentNodes* Node = Cast(Component)) { return Node; } } diff --git a/Source/DeltaV/Private/Construction/ConstructionController.cpp b/Source/DeltaV/Private/Construction/ConstructionController.cpp index 6a85606..9ea2510 100644 --- a/Source/DeltaV/Private/Construction/ConstructionController.cpp +++ b/Source/DeltaV/Private/Construction/ConstructionController.cpp @@ -22,6 +22,10 @@ #include "Components/TextBlock.h" #include "Kismet/GameplayStatics.h" +#include "Common/AssetLibrary.h" +#include "EnhancedInputSubsystems.h" +#include "ChaosModularVehicle/ModularVehicleBaseComponent.h" + AConstructionController::AConstructionController() { bEnableClickEvents = true; @@ -42,35 +46,72 @@ void AConstructionController::BeginPlay() { SetShowMouseCursor(true); SetInputMode(FInputModeGameAndUI().SetHideCursorDuringCapture(false)); - HUD = CreateWidget(this, UConstructionHUD::BlueprintClass); + HUD = CreateWidget(this, UAssetLibrary::LoadClass(UConstructionHUDClass)); HUD->AddToPlayerScreen(); - + /** TransformGadget = GetWorld()->SpawnActor(); TransformGadget->Controller = this; PartShapeEditor = GetWorld()->SpawnActor(); PartShapeEditor->SetController(this); - + */ Load(); } void AConstructionController::SetupInputComponent() { Super::SetupInputComponent(); + + if (auto* LocalPlayer = GetLocalPlayer()) { + if (auto* Subsystem = LocalPlayer->GetSubsystem()) { + //auto* InputMappingContext = UAssetLibrary::LoadAsset("/Game/Construction/IMC_Construction"); + //Subsystem->AddMappingContext(InputMappingContext, 1); - // PlayerCameraManager->SetupInput(PlayerInput, InputComponent); + auto* IMC_Common = UAssetLibrary::LoadAsset("/Game/Inputs/IMC_Common"); + Subsystem->AddMappingContext(IMC_Common, 2); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("MoveForwardBackward", EKeys::W, 1.f)); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("MoveForwardBackward", EKeys::S, -1.f)); + auto* IMC_Simulation = UAssetLibrary::LoadAsset("/Game/Inputs/IMC_Simulation"); + Subsystem->AddMappingContext(IMC_Simulation, 0); + } + } + if (UEnhancedInputComponent* EnhancedInput = Cast(InputComponent)) { + auto* Move = UAssetLibrary::LoadAsset("/Game/Inputs/IA_Move"); + EnhancedInput->BindAction(Move, ETriggerEvent::Triggered, this, &AConstructionController::Move); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("MoveLeftRight", EKeys::A, -1.f)); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("MoveLeftRight", EKeys::D, 1.f)); + UE_LOG(LogTemp, Warning, TEXT("Added input")); + if (OwnedCraft != nullptr) { - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("MoveUpDown", EKeys::SpaceBar, 1.f)); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("MoveUpDown", EKeys::LeftShift, -1.f)); + } - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("LookX", EKeys::MouseX, 1.f)); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("LookY", EKeys::MouseY, -1.f)); + auto SetupCraftInput = [this, EnhancedInput](const FString Name) { + auto* Input = UAssetLibrary::LoadAsset("/Game/Inputs/IA_" + Name); + EnhancedInput->BindActionValueLambda(Input, ETriggerEvent::Triggered, [this, Name](const FInputActionValue& Input) { + if (OwnedCraft != nullptr) { + OwnedCraft->GetVehicleSimulationComponent()->SetInputAxis1D(FName(Name), Input.Get()); + } + }); + }; + + SetupCraftInput("Steering"); + SetupCraftInput("Thrust"); + SetupCraftInput("Throttle"); + SetupCraftInput("Pitch"); + SetupCraftInput("Roll"); + SetupCraftInput("Yaw"); + + auto* Look = UAssetLibrary::LoadAsset("/Game/Inputs/IA_Look"); + EnhancedInput->BindActionValueLambda(Look, ETriggerEvent::Triggered, [this](const FInputActionValue& Input) { + AddPitchInput(Input.Get().Y); + AddYawInput(Input.Get().X); + }); + + auto* Stage = UAssetLibrary::LoadAsset("/Game/Inputs/IA_Stage"); + EnhancedInput->BindActionValueLambda(Stage, ETriggerEvent::Triggered, [this](const FInputActionValue& Input) { + if (OwnedCraft != nullptr) { + OwnedCraft->StageCraft(); + } + }); + } PlayerInput->AddAxisMapping(FInputAxisKeyMapping("CameraZoom", EKeys::MouseWheelAxis, 0.05f)); @@ -103,12 +144,6 @@ void AConstructionController::SetupInputComponent() { InputComponent->BindAxis("CameraZoom", this, &AConstructionController::Zoom); - InputComponent->BindAction("RightClick", EInputEvent::IE_Pressed, this, &AConstructionController::EnableMovement); - InputComponent->BindAction("RightClick", EInputEvent::IE_Released, this, &AConstructionController::DisableMovement); - - InputComponent->BindAxis("LookX", this, &AConstructionController::AddYawInput); - InputComponent->BindAxis("LookY", this, &AConstructionController::AddPitchInput); - InputComponent->BindAction("LeftClick", IE_Pressed, this, &AConstructionController::Pressed); InputComponent->BindAction("RightClick", IE_Pressed, this, &AConstructionController::Pressed); InputComponent->BindAction("MiddleClick", IE_Pressed, this, &AConstructionController::Pressed); @@ -124,8 +159,6 @@ void AConstructionController::SetupInputComponent() { InputComponent->BindAction("Save", IE_Pressed, this, &AConstructionController::Save); InputComponent->BindAction("Load", IE_Pressed, this, &AConstructionController::Load); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("Throttle", EKeys::I, 0.1f)); - PlayerInput->AddAxisMapping(FInputAxisKeyMapping("Throttle", EKeys::K, -0.1f)); // InputComponent->BindAxis("Throttle", this, &AConstructionController::Throttle); PlayerInput->AddActionMapping(FInputActionKeyMapping("DebugAction", EKeys::L)); @@ -189,6 +222,17 @@ void AConstructionController::DisableMovement() { SetIgnoreLookInput(true); } +void AConstructionController::Move(const FInputActionValue& Movement) { + UE_LOG(LogTemp, Warning, TEXT("Moved: %s"), *Movement.ToString()); + + FRotator ControlSpaceRot = GetControlRotation(); + ControlSpaceRot.Pitch = 0; + FVector Input = Movement.Get(); + FVector Move = FVector(Input.Y, Input.X, 0); + FVector Direction = ControlSpaceRot.RotateVector(Move); + Direction.Z = Input.Z; + GetPawn()->AddMovementInput(Direction); +} void AConstructionController::Zoom(float value) { if (value != 0) { @@ -230,7 +274,7 @@ void AConstructionController::DebugAction() { //DynamicMesh->bEnableMeshGenerator = true; //DynamicMesh->SetMeshGenerator(ShapeEditor); ShapeEditor->Generate(Mesh); - DynamicMesh->SetMesh(Mesh); + DynamicMesh->SetMesh(Mesh); */ } @@ -244,23 +288,31 @@ void AConstructionController::Pressed(FKey Key) { if (Constructor.Selected) { UPart* Part = Constructor.Selected; Constructor.Place(); + /* ACraft* Craft = Cast(Part->GetOwner()); if (Craft) { HUD->SetCraft(Craft); } + */ + UE_LOG(LogTemp, Warning, TEXT("LeftMouseButton EditMode Place")); } else { + UE_LOG(LogTemp, Warning, TEXT("LeftMouseButton EditMode Grab")); Constructor.Grab(); } break; case AConstructionController::RotateMode: + UE_LOG(LogTemp, Warning, TEXT("LeftMouseButton RotateMode")); break; case AConstructionController::TranslateMode: + UE_LOG(LogTemp, Warning, TEXT("LeftMouseButton TranslateMode")); TransformGadget->StartTracking(); break; case AConstructionController::ScaleMode: + UE_LOG(LogTemp, Warning, TEXT("LeftMouseButton ScaleMode")); break; case AConstructionController::WarpMode: + UE_LOG(LogTemp, Warning, TEXT("LeftMouseButton WarpMode")); PartShapeEditor->Pressed(Key); break; default: @@ -319,6 +371,25 @@ void AConstructionController::Released(FKey Key) { } void AConstructionController::Save() { + /* + TSharedPtr CraftJson = OwnedCraft->ToJson(); + + FString Path = FPaths::Combine(FPaths::ProjectContentDir(), "Crafts/saved.json"); + JsonUtil::WriteFile(Path, CraftJson); + OwnedCraft->Destroy(); + + OwnedCraft = Constructor.CreateCraft(CraftJson); + // OwnedCraft->SetActorLocation(FVector(0, 100, 0)); + OwnedCraft->SetPhysicsEnabled(true); + + HUD->SetCraft(OwnedCraft); + Possess(OwnedCraft); + */ + + FString Path = FPaths::Combine(FPaths::ProjectContentDir(), "Crafts/car.json"); + TSharedPtr CraftJson = JsonUtil::ReadFile(Path); + OwnedCraft->FromJson(CraftJson); + /* TArray Actors; UGameplayStatics::GetAllActorsOfClass(GetWorld(), ACraft::StaticClass(), Actors); for (AActor* Actor : Actors) { @@ -326,18 +397,32 @@ void AConstructionController::Save() { FString Path = FPaths::Combine(FPaths::ProjectSavedDir(), "ship2.json"); JsonUtil::WriteFile(Path, Craft->ToJson()); } + */ } void AConstructionController::Load() { - FString Path = FPaths::Combine(FPaths::ProjectSavedDir(), "ship2.json"); + // FString Path = FPaths::Combine(FPaths::ProjectSavedDir(), "ship2.json"); + FString Path = FPaths::Combine(FPaths::ProjectContentDir(), "Crafts/car.json"); TSharedPtr CraftJson = JsonUtil::ReadFile(Path); - ACraft* Craft = Constructor.CreateCraft(CraftJson); - HUD->SetCraft(Craft); + OwnedCraft = Constructor.CreateCraft(CraftJson); + // OwnedCraft->SetActorLocation(FVector(0, 0, 100)); + OwnedCraft->SetPhysicsEnabled(false); + + HUD->SetCraft(OwnedCraft); + Possess(OwnedCraft); } void AConstructionController::PlayerTick(float DeltaTime) { Super::PlayerTick(DeltaTime); + /* + if (OwnedCraft != nullptr) { + if (auto* Sim = OwnedCraft->GetVehicleSimulationComponent()) { + Sim->SetInputAxis1D(FName("Throttle"), 1); + } + } + */ + // UE_LOG(LogTemp, Warning, TEXT("tick")); switch (ConstructionMode) diff --git a/Source/DeltaV/Private/Construction/ConstructionPawn.cpp b/Source/DeltaV/Private/Construction/ConstructionPawn.cpp index 4ecd895..2e92ef5 100644 --- a/Source/DeltaV/Private/Construction/ConstructionPawn.cpp +++ b/Source/DeltaV/Private/Construction/ConstructionPawn.cpp @@ -12,6 +12,11 @@ #include "GameFramework/FloatingPawnMovement.h" #include "GameFramework/PlayerInput.h" #include "Construction/ConstructionController.h" +#include "Common/AssetLibrary.h" + +#include "EnhancedInputSubsystems.h" +#include "EnhancedInputComponent.h" +#include "InputMappingContext.h" // Sets default values AConstructionPawn::AConstructionPawn() @@ -68,13 +73,21 @@ void AConstructionPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputCo check(PlayerInputComponent); - PlayerInputComponent->BindAxis("MoveForwardBackward", this, &AConstructionPawn::MoveForward); - PlayerInputComponent->BindAxis("MoveLeftRight", this, &AConstructionPawn::MoveRight); - PlayerInputComponent->BindAxis("MoveUpDown", this, &AConstructionPawn::MoveUp); - UE_LOG(LogTemp, Warning, TEXT("PlayerInput Setup")); } +void AConstructionPawn::Move(const FInputActionValue& Movement) { + UE_LOG(LogTemp, Warning, TEXT("Moved: %s"), *Movement.ToString()); + if (Controller) { + FRotator ControlSpaceRot = Controller->GetControlRotation(); + ControlSpaceRot.Pitch = 0; + + FVector Move = FVector(Movement.Get(), 0); + + AddMovementInput(ControlSpaceRot.RotateVector(Move)); + } +} + void AConstructionPawn::MoveRight(float Val) { if (Val != 0.f) diff --git a/Source/DeltaV/Private/Construction/Constructor.cpp b/Source/DeltaV/Private/Construction/Constructor.cpp index fa81aa9..ad2b95e 100644 --- a/Source/DeltaV/Private/Construction/Constructor.cpp +++ b/Source/DeltaV/Private/Construction/Constructor.cpp @@ -11,10 +11,11 @@ #include "Common/AttachmentNode.h" #include "Construction/ConstructionController.h" #include "Construction/AttachmentNodes.h" +#include "ChaosModularVehicle/ClusterUnionVehicleComponent.h" +#include "ChaosModularVehicle/ModularVehicleBaseComponent.h" Constructor::Constructor() { - SpawnParamsAlwaysSpawn.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; } Constructor::~Constructor() @@ -26,24 +27,32 @@ void Constructor::SetController(AConstructionController* InController) { World = Controller->GetWorld(); } -TObjectPtr Constructor::CreateCraft(TSharedPtr CraftJson) { - TObjectPtr Craft = World->SpawnActor(SpawnParamsAlwaysSpawn); +TObjectPtr Constructor::CreateCraft(TSharedPtr CraftJson, FVector Location) { + // TObjectPtr Craft = World->SpawnActor(SpawnParamsAlwaysSpawn); + FActorSpawnParameters Params = FActorSpawnParameters(); + // Params.Name = "custom-craft-name"; + Params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + TObjectPtr Craft = World->SpawnActor(Params); Craft->FromJson(CraftJson); - + // Craft->SetPhysicsEnabled(false); // add attachment nodes - for (auto& PartKVP : Craft->Parts) { - UPart* Part = PartKVP.Value; + for (auto& [Name, Part] : Craft->Parts) { + auto* AttachmentNodes = NewObject(Part->Mesh); + AttachmentNodes->RegisterComponent(); - Part->Mesh->SetCollisionEnabled(ECollisionEnabled::QueryAndProbe); - Part->Mesh->SetCollisionResponseToAllChannels(ECR_Ignore); + // Part->Mesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); + // Part->Mesh->SetCollisionResponseToAllChannels(ECR_Ignore); Part->Mesh->SetCollisionResponseToChannel(ECC_NoneHeldParts, ECR_Block); - Part->Mesh->SetSimulatePhysics(false); + Part->Mesh->RegisterComponent(); + // Craft->ClusterUnionVehicleComponent()->AddComponent(Part->Mesh); - UAttachmentNodes* AttachmentNodes = NewObject(Part); - AttachmentNodes->RegisterComponent(); + // part must be (re)registered after collision response type set, otherwise collision don't work ?! + } + // Craft->SetActorRotation(DefaultOrientation); - Craft->SetActorRotation(DefaultOrientation); + // Craft->FinishSpawning(Transform); + Craft->SetActorLocation(Location); return Craft; } @@ -54,39 +63,42 @@ void Constructor::Select(UPart* Part) { bool SameOwner = (Part && Selected && (Part->GetOwner() == Selected->GetOwner())); // both null, same part, or same owner, we don't need to update ray-trace settings - if (Part == Selected || SameOwner) { + if ((Part == Selected) || SameOwner) { Selected = Part; return; } // Set previously selected part to respond to ECC_Construct - if (Selected != nullptr && !SameOwner) { + if (Selected != nullptr) { + /* ACraft* Craft = Cast(Selected->GetOwner()); for (auto& PartKVP : Craft->Parts) { PartKVP.Value->Mesh->SetCollisionResponseToChannel(ECC_NoneHeldParts, ECR_Block); UAttachmentNodes::Get(PartKVP.Value)->SetCollisionResponseToChannel(ECC_AttachmentNodes, ECR_Block); - } + }*/ } // Set newly selected part to respond ignore to ECC_Construct - if (Part != nullptr && !SameOwner) { + if (Part != nullptr) { + /* ACraft* Craft = Cast(Part->GetOwner()); for (auto& PartKVP : Craft->Parts) { PartKVP.Value->Mesh->SetCollisionResponseToChannel(ECC_NoneHeldParts, ECR_Ignore); UAttachmentNodes::Get(PartKVP.Value)->SetCollisionResponseToChannel(ECC_AttachmentNodes, ECR_Ignore); } + */ + UE_LOG(LogTemp, Warning, TEXT("Select: part not null")); } + UE_LOG(LogTemp, Warning, TEXT("Set selected")); Selected = Part; } -UPart* Constructor::Trace(FVector Position, FVector Direction) { - return nullptr; -} - UPart* Constructor::TraceMouse() { FHitResult Result; if (Controller->GetHitResultUnderCursor(ECC_NoneHeldParts, true, Result)) { + ; + UE_LOG(LogTemp, Warning, TEXT("TraceMouse, has part under mouse %s"), *Result.GetComponent()->GetName()); return Result.GetComponent()->GetTypedOuter(); } return nullptr; @@ -97,25 +109,39 @@ void Constructor::Grab() { if (Part == nullptr) { return; } - ACraft* Craft = Cast(Part->GetOwner()); + ACraft* Craft = Part->GetOwner(); if (Craft == nullptr) { return; } + ACraft* Other = World->SpawnActor(); + ACraft::Transfer(Part, Other->GetClusterUnionComponent()); + /** if (Craft->RootPart() != Part) { - ACraft* NewCraft = World->SpawnActor(SpawnParamsAlwaysSpawn); + ACraft* NewCraft = World->SpawnActor(); Craft->DetachPart(Part, NewCraft); - } + }*/ + /* Select(Part); UpdateSymmetry(Symmetry); - FVector CameraLocation; FRotator _; - Controller->PlayerCameraManager->GetCameraViewPoint(CameraLocation, _); + */ + FVector Start; FRotator Rotation; + Controller->PlayerCameraManager->GetCameraViewPoint(Start, Rotation); + FVector End = Start + Rotation.RotateVector(FVector(1000000, 0, 0)); + FHitResult Result; + World->LineTraceSingleByChannel(Result, Start, End, ECC_NoneHeldParts); + + + + Distance = FVector::Distance(Start, Part->Mesh->GetComponentLocation()); - Distance = FVector::Distance(CameraLocation, Part->Mesh->GetComponentLocation()); + // UPart* Part = Cast(Other->GetClusterUnionComponent()->GetAttachChildren().Last().GetOuter()); + Select(Part); } UPart* Constructor::Update() { if (Selected == nullptr) { + UE_LOG(LogTemp, Warning, TEXT("Update called but no selected")); return nullptr; } @@ -123,17 +149,17 @@ UPart* Constructor::Update() { FVector CameraLocation; FVector Direction; if (!Controller->DeprojectMousePositionToWorld(CameraLocation, Direction)) { + UE_LOG(LogTemp, Warning, TEXT("Update called camera deproject failed")); return nullptr; } FVector CameraLocation2; FRotator _; Controller->PlayerCameraManager->GetCameraViewPoint(CameraLocation2, _); - FVector PartLocation = CameraLocation + Direction * Distance; - TArray Results; - FVector Start = CameraLocation; - FVector End; + FHitResult Result; + FVector Start = CameraLocation; // start of the trace ray + FVector End; // end of the trace ray, goes through every attachment node // node attachment FVector SelectedLocaction = Selected->Mesh->GetComponentLocation(); @@ -144,31 +170,27 @@ UPart* Constructor::Update() { End = (Direction * Distance + RelativeLocation) * 2 + Start; - World->LineTraceMultiByChannel(Results, Start, End, ECC_AttachmentNodes); - - for (auto& HitResult : Results) { - UStaticMeshComponent* TracedNode = Cast(HitResult.GetComponent()); - if (TracedNode == nullptr) { - continue; - } + World->LineTraceSingleByChannel(Result, Start, End, ECC_AttachmentNodes); - PartLocation = TracedNode->GetComponentLocation() - RelativeLocation; - Selected->Mesh->SetWorldLocation(PartLocation); + if (!Result.bBlockingHit) { + continue; + } + + // Handle symmetry attachment - // node attachment, destroy any symmetry parts - if (SymmetryCrafts.Num() > 0) { - for (ACraft* Craft : SymmetryCrafts) { - Craft->Destroy(); - } - SymmetryCrafts.Empty(); - } - if (Selected) { - Selected->Physics->SetWorldLocation(TracedNode->GetComponentLocation()); - } - return TracedNode->GetTypedOuter(); + // Put the part so that the node traced at is at the same location as the target node + auto NodeLocation = Result.Component->GetComponentLocation(); + auto* Part = Result.Component->GetTypedOuter(); + if (Part == nullptr) { + continue; } + Selected->GetOwner()->SetActorLocation(NodeLocation - RelativeLocation); + + UE_LOG(LogTemp, Warning, TEXT("Update part is attached")); + return Part; } + /* // side attachment End = Start + Direction * Distance; World->LineTraceMultiByChannel(Results, Start, End, ECC_NoneHeldParts); @@ -206,41 +228,54 @@ UPart* Constructor::Update() { return Part; } - Selected->Mesh->SetWorldLocation(PartLocation); - + */ + + // No attachment node or side attachment, place the craft/part at where it is + Selected->GetOwner()->SetActorLocation(CameraLocation + Direction * Distance); + + UE_LOG(LogTemp, Warning, TEXT("Update set location to %s - %s"), *(Selected->GetOwner()->GetActorLocation()).ToString(), *Selected->Mesh->GetComponentLocation().ToString()); + /* if (SymmetryCrafts.Num() > 0) { for (ACraft* Craft : SymmetryCrafts) { Craft->Destroy(); } SymmetryCrafts.Empty(); } - + */ return nullptr; } void Constructor::Place() { + UE_LOG(LogTemp, Warning, TEXT("Part placed")); UPart* Part = Update(); // part to attach to if (Part == nullptr || Selected == nullptr) { Select(nullptr); return; } - ACraft* Craft = Cast(Part->GetOwner()); - - ACraft* Source = Cast(Selected->GetOwner()); + ACraft* Craft = Part->GetOwner(); + ACraft* Source = Selected->GetOwner(); + if (Craft == nullptr || Source == nullptr) { + UE_LOG(LogTemp, Warning, TEXT("for some reason part owners are not ACraft")); + return; + } Craft->AttachPart(Source, Part); Select(nullptr); + /* for (ACraft* SymmetrySource : SymmetryCrafts) { Craft->AttachPart(SymmetrySource, Part); } UpdateSymmetry(Symmetry); + */ return; } void Constructor::Tick() { + if (Selected == nullptr) { return; } + UE_LOG(LogTemp, Warning, TEXT("update called")); // update location of selected part Update(); } diff --git a/Source/DeltaV/Private/Construction/PartShapeEditor.cpp b/Source/DeltaV/Private/Construction/PartShapeEditor.cpp index 8d3c6b3..3472334 100644 --- a/Source/DeltaV/Private/Construction/PartShapeEditor.cpp +++ b/Source/DeltaV/Private/Construction/PartShapeEditor.cpp @@ -37,6 +37,7 @@ APartShapeEditor::APartShapeEditor(const FObjectInitializer& ObjectInitializer) static ConstructorHelpers::FObjectFinderSquareMesh(TEXT("/Game/Shapes/square")); + /* Mesh = CreateDefaultSubobject("Mesh"); SetRootComponent(Mesh); @@ -56,7 +57,7 @@ APartShapeEditor::APartShapeEditor(const FObjectInitializer& ObjectInitializer) Corner->SetupAttachment(Mesh); Corners.Push(Corner); - } + }*/ } void APartShapeEditor::SetPart(UPart* Part) { @@ -81,8 +82,9 @@ void APartShapeEditor::SetPart(UPart* Part) { Box.GetCenter(); Box.GetExtent(); + /* Part->CopyMeshToDynamicMesh(Mesh->GetDynamicMesh()); - + */ Mesh->EditMesh([this](FDynamicMesh3& MeshInOut) { UpdateMesh(MeshInOut); }); @@ -132,6 +134,8 @@ void APartShapeEditor::Tick(float DeltaTime) { } void APartShapeEditor::UpdateMesh(FDynamicMesh3& MeshInOut) { + return; + /* FMeshDescription* MeshDescription = SelectedPart->CopyMeshToDynamicMesh(nullptr); FVertexArray vertices = MeshDescription->Vertices(); @@ -165,5 +169,6 @@ void APartShapeEditor::UpdateMesh(FDynamicMesh3& MeshInOut) { MeshInOut.SetVertex(Id, transformed_position); } + */ } diff --git a/Source/DeltaV/Private/Construction/UI/ConstructionHUD.cpp b/Source/DeltaV/Private/Construction/UI/ConstructionHUD.cpp index 65d6224..0a2c014 100644 --- a/Source/DeltaV/Private/Construction/UI/ConstructionHUD.cpp +++ b/Source/DeltaV/Private/Construction/UI/ConstructionHUD.cpp @@ -23,12 +23,6 @@ UConstructionHUD::UConstructionHUD(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - if (!UConstructionHUD::BlueprintClass) { - ConstructorHelpers::FClassFinder Widget(TEXT("WidgetBlueprint'/Game/Construction/UI/WBP_ConstructionHUD'")); - if (Widget.Succeeded()) { - UConstructionHUD::BlueprintClass = Widget.Class; - } - } } void UConstructionHUD::NativeOnInitialized() { @@ -61,7 +55,7 @@ void UConstructionHUD::SaveClicked() { - Controller->Load(); + // Controller->Load(); } void UConstructionHUD::ClearPart() { @@ -74,15 +68,23 @@ void UConstructionHUD::PartClicked(UObject* Object) { if (!Data) { return; } - auto Craft = Controller->Constructor.CreateCraft(Data->CraftJson); - UE_LOG(LogTemp, Warning, TEXT("stages %d"), Craft->StageManager->Stages.Num()); + // UE_LOG(LogTemp, Warning, TEXT("stages %d"), Craft->StageManager->Stages.Num()); + TArray PartList; + Craft->Parts.GenerateValueArray(PartList); + Craft->SetActorEnableCollision(false); + + if (PartList.Num() == 0) { + UE_LOG(LogTemp, Warning, TEXT("craft part list is empty")); + return; + } + UPart* Part = PartList[0]; if (Controller->Constructor.Selected) { - Controller->Constructor.Selected->GetOwner()->Destroy(); + UE_LOG(LogTemp, Warning, TEXT("has a selected thing")); Controller->Constructor.Selected = nullptr; } - Controller->Constructor.Select(Craft->RootPart()); + Controller->Constructor.Select(Part); Controller->Constructor.Distance = 500; } diff --git a/Source/DeltaV/Private/Construction/UI/PartDetails.cpp b/Source/DeltaV/Private/Construction/UI/PartDetails.cpp index 2f20c16..6e9c00e 100644 --- a/Source/DeltaV/Private/Construction/UI/PartDetails.cpp +++ b/Source/DeltaV/Private/Construction/UI/PartDetails.cpp @@ -13,16 +13,21 @@ UPartDetails::UPartDetails(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - if (!UPartDetails::BlueprintClass) { - ConstructorHelpers::FClassFinder Widget(TEXT("WidgetBlueprint'/Game/Construction/UI/WBP_PartDetails'")); - if (Widget.Succeeded()) { - UPartDetails::BlueprintClass = Widget.Class; - } - } - SetVisibility(ESlateVisibility::Hidden); } +TSubclassOf UPartDetails::BlueprintClass() { + auto Widget = TSoftClassPtr(FSoftObjectPath("/Game/Construction/UI/WBP_PartDetails.WBP_PartDetails_C")); + if (Widget.IsValid()) { + return Widget.Get(); + } + auto Loaded = Widget.LoadSynchronous(); + if (Loaded) { + return Loaded; + } + throw "Blueprint class not found"; +} + void UPartDetails::NativeOnInitialized() { Controller = GetOwningPlayer(); diff --git a/Source/DeltaV/Private/Construction/UI/PartItem.cpp b/Source/DeltaV/Private/Construction/UI/PartItem.cpp index c9bbd76..ff3646b 100644 --- a/Source/DeltaV/Private/Construction/UI/PartItem.cpp +++ b/Source/DeltaV/Private/Construction/UI/PartItem.cpp @@ -34,12 +34,18 @@ UPartItemData* UPartItemData::Create(FString Name) { UPartItem::UPartItem(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - if (!UPartItem::BlueprintClass) { - ConstructorHelpers::FClassFinder Widget(TEXT("WidgetBlueprint'/Game/Construction/UI/WBP_PartItem'")); - if (Widget.Succeeded()) { - UPartItem::BlueprintClass = Widget.Class; - } +} + +TSubclassOf UPartItem::BlueprintClass() { + auto Widget = TSoftClassPtr(FSoftObjectPath("WidgetBlueprint'/Game/Construction/UI/WBP_PartItem'")); + if (Widget.IsValid()) { + return Widget.Get(); + } + auto Loaded = Widget.LoadSynchronous(); + if (Loaded) { + return Loaded; } + throw "Blueprint class not found"; } void UPartItem::Init(UObject* ListItemObject) { diff --git a/Source/DeltaV/Private/Construction/UI/StageGroup.cpp b/Source/DeltaV/Private/Construction/UI/StageGroup.cpp index 8b08679..57b8e97 100644 --- a/Source/DeltaV/Private/Construction/UI/StageGroup.cpp +++ b/Source/DeltaV/Private/Construction/UI/StageGroup.cpp @@ -14,15 +14,19 @@ UStageGroup::UStageGroup(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - if (!UStageGroup::BlueprintClass) { - ConstructorHelpers::FClassFinder Widget(TEXT("WidgetBlueprint'/Game/Common/UI/WBP_StageGroup'")); - if (Widget.Succeeded()) { - UStageGroup::BlueprintClass = Widget.Class; - } - else { - UE_LOG(LogTemp, Warning, TEXT("WBP_StageGroup not found")); - } +} + + +TSubclassOf UStageGroup::BlueprintClass() { + auto Widget = TSoftClassPtr(FSoftObjectPath("WidgetBlueprint'/Game/Common/UI/WBP_StageGroup'")); + if (Widget.IsValid()) { + return Widget.Get(); + } + auto Loaded = Widget.LoadSynchronous(); + if (Loaded) { + return Loaded; } + throw "Blueprint class not found"; } void UStageGroup::Init(UObject* Object) { diff --git a/Source/DeltaV/Private/Construction/UI/TransformGadget.cpp b/Source/DeltaV/Private/Construction/UI/TransformGadget.cpp index 41a37d0..a608c63 100644 --- a/Source/DeltaV/Private/Construction/UI/TransformGadget.cpp +++ b/Source/DeltaV/Private/Construction/UI/TransformGadget.cpp @@ -77,11 +77,11 @@ double RayIntersection1(const FRay& A, const FRay& B) { void ATransformGadget::BeginPlay() { Super::BeginPlay(); - + /* TranslateX->RegisterComponent(); TranslateY->RegisterComponent(); TranslateZ->RegisterComponent(); - + */ GetRootComponent()->SetHiddenInGame(true, true); } diff --git a/Source/DeltaV/Private/Generation/Erosion.cpp b/Source/DeltaV/Private/Generation/Erosion.cpp new file mode 100644 index 0000000..e16aa5d --- /dev/null +++ b/Source/DeltaV/Private/Generation/Erosion.cpp @@ -0,0 +1,52 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Generation/Erosion.h" + +Erosion::Erosion() +{ + + + +} + +Erosion::~Erosion() +{ +} + +void Erosion::CalculateGradient() { + Gradient.Reset(); + for (const auto& [Edge, VertexA, VertexB] : Edges) { + FVector EdgeGradient = EdgeDirection[Edge] * (Height[VertexA] - Height[VertexB]); + + Gradient[VertexA] += EdgeGradient; + Gradient[VertexB] += EdgeGradient; + } +} + +void Erosion::Step() { + CalculateGradient(); + + /* + for (const auto& [Edge, VertexA, VertexB] : Edges) { + Gradient[VertexA]; + EdgeDirection[Edge]; + + Gradient[VertexB]; + EdgeDirection[Edge]; + } + + for (const int Vertex : Vertices) { + + } + + for (const auto& [Vertex, VertexNeighbours] : Neighbours) { + + // compute gradient + + // compute errosion + + } + */ + +} diff --git a/Source/DeltaV/Private/Generation/GenerationController.cpp b/Source/DeltaV/Private/Generation/GenerationController.cpp index ae8d7a0..5d8c501 100644 --- a/Source/DeltaV/Private/Generation/GenerationController.cpp +++ b/Source/DeltaV/Private/Generation/GenerationController.cpp @@ -43,7 +43,7 @@ void AGenerationController::BeginPlay() { void AGenerationController::Tick(float DeltaSeconds) { if (Progress) { - ShapeEditor->Iterate2(Mesh); + ShapeEditor->Iterate(Mesh); ShapeEditor->Generate(Mesh); DynamicMesh->SetMesh(Mesh); NewActor->GetDynamicMeshComponent()->NotifyMeshUpdated(); diff --git a/Source/DeltaV/Private/Generation/MeshGeneration.cpp b/Source/DeltaV/Private/Generation/MeshGeneration.cpp index 8b702c6..9d629be 100644 --- a/Source/DeltaV/Private/Generation/MeshGeneration.cpp +++ b/Source/DeltaV/Private/Generation/MeshGeneration.cpp @@ -31,7 +31,7 @@ void UMeshGeneration::Initialize(FDynamicMesh3& MeshInOut) { MeshInOut.Attributes()->EnableMaterialID(); MeshInOut.EnableVertexNormals(FVector3f(0)); - GenerateIsoSphere(MeshInOut, 6); + GenerateIsoSphere(MeshInOut, 8); for (int VertexId : MeshInOut.VertexIndicesItr()) { FVector Vertex = MeshInOut.GetVertex(VertexId); @@ -44,6 +44,9 @@ void UMeshGeneration::Initialize(FDynamicMesh3& MeshInOut) { Height = Radius; } HeightMap.Add(VertexId, Height); + PositionMap.Add(VertexId, Vertex); + GradientMap.Add(VertexId, {}); + MeshInOut.SetVertex(VertexId, Vertex.GetSafeNormal() * HeightMap[VertexId]); } } @@ -80,6 +83,36 @@ void UMeshGeneration::ComputeDrainageArea(TArray& Tree, int Node) { Tree[Node].Processed = true; } +void UMeshGeneration::Iterate3(FDynamicMesh3& MeshInOut) { + MeshInOut.CompactInPlace(); + + + // apply corrosion and uplift + // add the drain area of self to downstream + for (const auto& Vertex : MeshInOut.VerticesItr()) { + + } + + + double Friction = 0.95; // friction? + + // build the tree + // or screw the tree, just go from highest point to lowest point and apply contribution only to lower neighbours (even with momentum) + // or apply local erosion with momentum once, and then + for (const auto VertexId : MeshInOut.VertexIndicesItr()) { + FVector Gradient = GradientMap[VertexId]; + + TMap Contribution; + for (auto OtherVertexId : MeshInOut.VtxVerticesItr(VertexId)) { + // PositionMap[OtherVertexId]; + + } + } + + // solve + +} + void UMeshGeneration::Iterate2(FDynamicMesh3& MeshInOut) { // iterate through every edge, construct child/parent tree, O(E) <= O(6V) // use parent tree to resolve dependency, update child nodes with drainage area @@ -112,6 +145,7 @@ void UMeshGeneration::Iterate2(FDynamicMesh3& MeshInOut) { Tree[High].Below.Add(Low); } + // Connect up lakes // traverse tree and calculate @@ -135,8 +169,9 @@ void UMeshGeneration::Iterate2(FDynamicMesh3& MeshInOut) { DeltaMap.Add(Node, Delta); } - FlushPersistentDebugLines(GetWorld()); + return; + /* for (int Node = 0; Node < HeightMap.Num(); ++Node) { FVector A = MeshInOut.GetVertex(Node); @@ -152,6 +187,7 @@ void UMeshGeneration::Iterate2(FDynamicMesh3& MeshInOut) { } } } + */ } void UMeshGeneration::Iterate(FDynamicMesh3& MeshInOut) { diff --git a/Source/DeltaV/Private/ModularVehicle/Thruster2DSimModule.cpp b/Source/DeltaV/Private/ModularVehicle/Thruster2DSimModule.cpp new file mode 100644 index 0000000..a94f1c1 --- /dev/null +++ b/Source/DeltaV/Private/ModularVehicle/Thruster2DSimModule.cpp @@ -0,0 +1,48 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "ModularVehicle/Thruster2DSimModule.h" + +namespace Chaos { + FThruster2DSimModule::FThruster2DSimModule(const FThruster2DSettings& Settings) + : TSimModuleSettings(Settings) + { + + } + + void FThruster2DSimModule::Simulate(float DeltaTime, const FAllInputs& Inputs, FSimModuleTree& VehicleModuleSystem) + { + double Pitch = Inputs.GetControls().GetMagnitude(PitchControlName); + double Roll = Inputs.GetControls().GetMagnitude(RollControlName); + double Yaw = Inputs.GetControls().GetMagnitude(YawControlName); + + SteerAngle = Pitch * Setup().Pitch + Roll * Setup().Roll + Yaw * Setup().Yaw; + if (SteerAngle.SizeSquared() > 1) { + SteerAngle.Normalize(); + } + // = Response x Vector(0, 0, 1) (thrust direction) + FVector RotationAxis = FVector(0, SteerAngle.Y, -SteerAngle.X); + + if (RotationAxis.SizeSquared() > UE_SMALL_NUMBER) { + Steer = FQuat(RotationAxis, SteerAngle.Size() * FMath::DegreesToRadians(Setup().MaxSteeringAngle)); + Steer.Normalize(); + } + else { + Steer = FQuat(FVector(0, 0, 1), 0); + } + + // applies continuous force + FVector Force = Setup().ForceAxis * Setup().MaxThrustForce * Inputs.GetControls().GetMagnitude("Thrust"); + AddLocalForceAtPosition(Steer.RotateVector(Force), Setup().ForceOffset, true, false, false, FColor::Magenta); + } + + void FThruster2DSimModule::Animate() + { + AnimationData.AnimFlags = EAnimationFlags::AnimateRotation; + AnimationData.AnimationRotOffset.Pitch = SteerAngle.X; + AnimationData.AnimationRotOffset.Yaw = SteerAngle.Y; + // TODO: Animate rotation like wheel steering + + AnimationData.CombinedRotation = Steer; + } +} diff --git a/Source/DeltaV/Private/ModularVehicle/VehicleSimThruster2DComponent.cpp b/Source/DeltaV/Private/ModularVehicle/VehicleSimThruster2DComponent.cpp new file mode 100644 index 0000000..2ad6ae2 --- /dev/null +++ b/Source/DeltaV/Private/ModularVehicle/VehicleSimThruster2DComponent.cpp @@ -0,0 +1,29 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "ModularVehicle/VehicleSimThruster2DComponent.h" + +#include "SimModule/SimModulesInclude.h" +#include "ModularVehicle/Thruster2DSimModule.h" + +UVehicleSimThruster2DComponent::UVehicleSimThruster2DComponent() : Super() { + +} + +Chaos::ISimulationModuleBase* UVehicleSimThruster2DComponent::CreateNewCoreModule() const { + Chaos::FThruster2DSettings Settings; + + Settings.MaxThrustForce = MaxThrustForce; + Settings.ForceAxis = ForceAxis; + Settings.ForceOffset = ForceOffset; + Settings.SteeringEnabled = bSteeringEnabled; + Settings.SteeringAxis = SteeringAxis; + Settings.MaxSteeringAngle = MaxSteeringAngle; + Settings.SteeringForceEffect = SteeringForceEffect; + Settings.BoostMultiplier = BoostMultiplierEffect; + + Chaos::ISimulationModuleBase* Thruster = new Chaos::FThruster2DSimModule(Settings); + Thruster->SetAnimationEnabled(bAnimationEnabled); + + return Thruster; +} diff --git a/Source/DeltaV/Private/Simulation/OrbitComponent.cpp b/Source/DeltaV/Private/Simulation/OrbitComponent.cpp index 3d04c3a..19a2dca 100644 --- a/Source/DeltaV/Private/Simulation/OrbitComponent.cpp +++ b/Source/DeltaV/Private/Simulation/OrbitComponent.cpp @@ -178,23 +178,23 @@ void UOrbitComponent::UpdateSpline() { // update spline meshes // remove extra spline mesh components - for (int i = Spline.Num() - GetNumberOfSplineSegments(); i > 0; --i) { - USplineMeshComponent* SplineComponent = Spline.Pop(); + for (int i = Spline1.Num() - GetNumberOfSplineSegments(); i > 0; --i) { + USplineMeshComponent* SplineComponent = Spline1.Pop(); SplineComponent->UnregisterComponent(); SplineComponent->DestroyComponent(); } // add missing spline mesh components - for (int i = GetNumberOfSplineSegments() - Spline.Num(); i > 0; --i) { + for (int i = GetNumberOfSplineSegments() - Spline1.Num(); i > 0; --i) { USplineMeshComponent* SplineComponent = NewObject(this); SplineComponent->SetCollisionEnabled(ECollisionEnabled::QueryOnly); SplineComponent->SetStaticMesh(SplineMesh); SplineComponent->SetForwardAxis(ESplineMeshAxis::Z); SplineComponent->SetMobility(EComponentMobility::Movable); SplineComponent->RegisterComponent(); - Spline.Add(SplineComponent); + Spline1.Add(SplineComponent); } - if (GetNumberOfSplineSegments() != Spline.Num()) { + if (GetNumberOfSplineSegments() != Spline1.Num()) { UE_LOG(LogTemp, Warning, TEXT("Something went terribly wrong, spline component length mismatch")); } @@ -202,7 +202,7 @@ void UOrbitComponent::UpdateSpline() { FInterpCurveVector SplinePoints = GetSplinePointsPosition(); for (int i = 0; i < GetNumberOfSplinePoints() - 1; ++i) { - Spline[i]->SetStartAndEnd( + Spline1[i]->SetStartAndEnd( SplinePoints.Points[i].OutVal + CentralBody->GetActorLocation(), SplinePoints.Points[i].LeaveTangent, SplinePoints.Points[i + 1].OutVal + CentralBody->GetActorLocation(), @@ -211,7 +211,7 @@ void UOrbitComponent::UpdateSpline() { } if (IsClosedLoop()) { int i = GetNumberOfSplinePoints() - 1; - Spline[i]->SetStartAndEnd( + Spline1[i]->SetStartAndEnd( SplinePoints.Points[i].OutVal + CentralBody->GetActorLocation(), SplinePoints.Points[i].LeaveTangent, SplinePoints.Points[0].OutVal + CentralBody->GetActorLocation(), diff --git a/Source/DeltaV/Private/Simulation/SimulationController.cpp b/Source/DeltaV/Private/Simulation/SimulationController.cpp index 4f82295..4d075b9 100644 --- a/Source/DeltaV/Private/Simulation/SimulationController.cpp +++ b/Source/DeltaV/Private/Simulation/SimulationController.cpp @@ -20,6 +20,7 @@ #include "Simulation/CelestialBody.h" #include "Simulation/ControlStabilizer.h" #include "Simulation/UI/Navball.h" +#include "Common/AssetLibrary.h" ASimulationController::ASimulationController(const FObjectInitializer& ObjectInitializer) @@ -64,7 +65,7 @@ void ASimulationController::BeginPlay() { FVector origin, extent; Craft->GetActorBounds(true, origin, extent); - double SpawnDistance = Earth->GetActorScale3D().Z * 100 + extent.Z + 1; + double SpawnDistance = Earth->GetActorScale3D().Z * 100 + extent.Z + 100; FVector CraftLocation = FVector(SpawnDistance, 0, 0); Craft->SetLocation(CraftLocation); @@ -86,8 +87,7 @@ void ASimulationController::BeginPlay() { Craft->Orbit->UpdateOrbit(CraftLocation, FVector(0, 0, 1000).Cross(CraftLocation.GetSafeNormal()), 0); PlayerCameraManager->CameraStyle = FName(TEXT("FreeCam")); - - HUD = CreateWidget(this, USimulationHUD::BlueprintClass); + HUD = CreateWidget(this, UAssetLibrary::LoadClass(USimulationHUDClass)); HUD->AddToPlayerScreen(); HUD->SetNavballTarget(Craft, FVector(0, 0, 0)); diff --git a/Source/DeltaV/Private/Simulation/UI/Navball.cpp b/Source/DeltaV/Private/Simulation/UI/Navball.cpp index b815fca..3790cd7 100644 --- a/Source/DeltaV/Private/Simulation/UI/Navball.cpp +++ b/Source/DeltaV/Private/Simulation/UI/Navball.cpp @@ -148,7 +148,7 @@ void ANavball::Tick(float DeltaTime) // Stabilization - FVector TargetOrientation; + FVector TargetOrientation = FVector(0, 1, 0); switch (StabilizationMode) { case EStabilizationMode::None: diff --git a/Source/DeltaV/Private/Simulation/UI/SimulationHUD.cpp b/Source/DeltaV/Private/Simulation/UI/SimulationHUD.cpp index 24829c8..9990402 100644 --- a/Source/DeltaV/Private/Simulation/UI/SimulationHUD.cpp +++ b/Source/DeltaV/Private/Simulation/UI/SimulationHUD.cpp @@ -24,12 +24,6 @@ USimulationHUD::USimulationHUD(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { - if (!USimulationHUD::BlueprintClass) { - ConstructorHelpers::FClassFinder Widget(TEXT("WidgetBlueprint'/Game/Simulation/UI/WBP_SimulationHUD'")); - if (Widget.Succeeded()) { - USimulationHUD::BlueprintClass = Widget.Class; - } - } } void USimulationHUD::NativeOnInitialized() { diff --git a/Source/DeltaV/Public/Common/AssetLibrary.h b/Source/DeltaV/Public/Common/AssetLibrary.h index dadab64..3423586 100644 --- a/Source/DeltaV/Public/Common/AssetLibrary.h +++ b/Source/DeltaV/Public/Common/AssetLibrary.h @@ -27,7 +27,8 @@ class DELTAV_API UAssetLibrary : public UObject Object = Cast(ObjectPath.TryLoad()); } if (Object == nullptr) { - UE_LOG(LogTemp, Warning, TEXT("Failed to load asset")); + FString FilePathStr = FString(Path); + UE_LOG(LogTemp, Warning, TEXT("Failed to load asset %s"), *FilePathStr); } return Object; } @@ -58,4 +59,17 @@ class DELTAV_API UAssetLibrary : public UObject static T* LoadAsset(const ANSICHAR* Path) { return LoadAsset(FAnsiStringView(Path)); } static TSharedPtr PartDefinition(FString PartName); + + template + static TSubclassOf LoadClass(S Path) { + auto Class = TSoftClassPtr(FSoftObjectPath(Path)); + if (Class.IsValid()) { + return Class.Get(); + } + auto Loaded = Class.LoadSynchronous(); + if (Loaded) { + return Loaded; + } + throw "Blueprint class not found"; + } }; diff --git a/Source/DeltaV/Public/Common/Craft.h b/Source/DeltaV/Public/Common/Craft.h index b21f188..ba962d1 100644 --- a/Source/DeltaV/Public/Common/Craft.h +++ b/Source/DeltaV/Public/Common/Craft.h @@ -4,15 +4,17 @@ #include "CoreMinimal.h" #include "GameFramework/Pawn.h" +#include "ChaosModularVehicle/ModularVehicleClusterPawn.h" #include "Common/Part.h" #include "Components/SphereComponent.h" #include "Common/CustomTickFunction.h" +#include "PhysicsEngine/ClusterUnionComponent.h" #include "Craft.generated.h" UCLASS() -class DELTAV_API ACraft : public APawn +class DELTAV_API ACraft : public AModularVehicleClusterPawn { GENERATED_BODY() @@ -23,6 +25,9 @@ class DELTAV_API ACraft : public APawn UPROPERTY(EditAnywhere) TMap Parts; + + UPROPERTY(EditAnywhere) + TMap Meshes; UPROPERTY(EditAnywhere) TObjectPtr FuelManager; @@ -37,6 +42,7 @@ class DELTAV_API ACraft : public APawn FVector TargetVelocity; // Absolute velocity target for physics simulation (from orbit) FVector TargetPosition; + // must be called before BeginPlay() on simulation paths void FromJson(TSharedPtr Json); TSharedPtr ToJson(); ACraft* Clone(); @@ -49,6 +55,8 @@ class DELTAV_API ACraft : public APawn // Called when the game starts or when spawned virtual void BeginPlay() override; + virtual void OnConstruction(const FTransform& Transform) override; + public: // Called every frame virtual void Tick(float DeltaTime) override; @@ -56,6 +64,8 @@ class DELTAV_API ACraft : public APawn // Called to bind functionality to input virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; + static void Transfer(UPart* SourcePart, UPrimitiveComponent* DestPart); + void AttachPart(ACraft* SourceCraft, UPart* AttachToPart); void DetachPart(UPart* Part, ACraft* NewCraft); @@ -77,9 +87,6 @@ class DELTAV_API ACraft : public APawn FVector GetWorldCoM(); - UPart* RootPart() { return Root; } - - FCustomActorTick PostPhysics; void TickPostPhysics(float DeltaTime); virtual void RegisterActorTickFunctions(bool bRegister) override { diff --git a/Source/DeltaV/Public/Common/InputTriggerInvChordAction.h b/Source/DeltaV/Public/Common/InputTriggerInvChordAction.h new file mode 100644 index 0000000..acaa933 --- /dev/null +++ b/Source/DeltaV/Public/Common/InputTriggerInvChordAction.h @@ -0,0 +1,22 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "InputTriggers.h" +#include "InputTriggerInvChordAction.generated.h" + +/** + * + */ +UCLASS(NotBlueprintable, meta = (DisplayName = "Inv Chorded Action", NotInputConfigurable = "true")) +class DELTAV_API UInputTriggerInvChordAction : public UInputTriggerChordAction +{ + GENERATED_BODY() + +protected: + // Implicit, so action cannot fire unless this is firing. + virtual ETriggerType GetTriggerType_Implementation() const override { return ETriggerType::Implicit; } + + virtual ETriggerState UpdateState_Implementation(const UEnhancedPlayerInput* PlayerInput, FInputActionValue ModifiedValue, float DeltaTime) override; +}; diff --git a/Source/DeltaV/Public/Common/Part.h b/Source/DeltaV/Public/Common/Part.h index c1d53b1..a28dc8e 100644 --- a/Source/DeltaV/Public/Common/Part.h +++ b/Source/DeltaV/Public/Common/Part.h @@ -25,6 +25,7 @@ class UPart : public UActorComponent enum EMeshType { STATIC_MESH, SKELETAL_MESH, + GEOMETRY_COLLECTION, }; EMeshType MeshType; @@ -40,8 +41,6 @@ class UPart : public UActorComponent UPROPERTY(EditAnywhere) TMap AdditionalComponents; - UPhysicsConstraintComponent* Physics; - UPROPERTY(EditAnywhere) TObjectPtr Mesh; FName Bone; @@ -53,9 +52,7 @@ class UPart : public UActorComponent virtual void BeginPlay() override; - void SetAttachmentNodeVisibility(bool visibility); - - void SetParent(UPart* Part); + void SetParent(UPrimitiveComponent* Parent); /* Json serialization @@ -86,12 +83,5 @@ class UPart : public UActorComponent } return nullptr; } - - bool PhysicsEnabled; - void SetPhysicsEnabled(bool bSimulate); - - void Attach(); - void Detach(); - - FMeshDescription* CopyMeshToDynamicMesh(TObjectPtr DynamicMesh, int LOD = 0); + // FMeshDescription* CopyMeshToDynamicMesh(TObjectPtr DynamicMesh, int LOD = 0); }; diff --git a/Source/DeltaV/Public/Common/UI/MainMenu.h b/Source/DeltaV/Public/Common/UI/MainMenu.h index 03d6f23..45b2fa8 100644 --- a/Source/DeltaV/Public/Common/UI/MainMenu.h +++ b/Source/DeltaV/Public/Common/UI/MainMenu.h @@ -22,6 +22,9 @@ class DELTAV_API UMainMenu : public UUserWidget UFUNCTION(BlueprintCallable) void PlayButtonClicked(); + UFUNCTION(BlueprintCallable) + void GenerationButtonClicked(); + UFUNCTION(BlueprintCallable) void SettingsButtonClicked(); diff --git a/Source/DeltaV/Public/Construction/AttachmentNodes.h b/Source/DeltaV/Public/Construction/AttachmentNodes.h index 0690dca..4247c11 100644 --- a/Source/DeltaV/Public/Construction/AttachmentNodes.h +++ b/Source/DeltaV/Public/Construction/AttachmentNodes.h @@ -18,10 +18,13 @@ class DELTAV_API UAttachmentNodes : public USceneComponent // Sets default values for this component's properties UAttachmentNodes(); + virtual void OnRegister() override; + protected: // Called when the game starts virtual void BeginPlay() override; + public: // Called every frame virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; diff --git a/Source/DeltaV/Public/Construction/ConstructionController.h b/Source/DeltaV/Public/Construction/ConstructionController.h index 249c958..92083be 100644 --- a/Source/DeltaV/Public/Construction/ConstructionController.h +++ b/Source/DeltaV/Public/Construction/ConstructionController.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "GameFramework/PlayerController.h" #include "Constructor.h" +#include "InputActionValue.h" #include "ConstructionController.generated.h" class UPart; @@ -29,10 +30,14 @@ class DELTAV_API AConstructionController : public APlayerController void Pressed(FKey Key); void Released(FKey Key); + void Move(const FInputActionValue& Movement); + virtual void SetupInputComponent() override; virtual void PlayerTick(float DeltaTime) override; + + ACraft* OwnedCraft; protected: virtual void BeginPlay() override; diff --git a/Source/DeltaV/Public/Construction/ConstructionPawn.h b/Source/DeltaV/Public/Construction/ConstructionPawn.h index 108f3a3..039a11a 100644 --- a/Source/DeltaV/Public/Construction/ConstructionPawn.h +++ b/Source/DeltaV/Public/Construction/ConstructionPawn.h @@ -6,6 +6,7 @@ #include "GameFramework/Pawn.h" #include "Components/SphereComponent.h" +#include "InputActionValue.h" #include "ConstructionPawn.generated.h" @@ -34,6 +35,14 @@ class DELTAV_API AConstructionPawn : public APawn virtual UPawnMovementComponent* GetMovementComponent() const override; // End Pawn overrides + + /** + * Input callback to move forward in local space (or backward if Val is negative). + * @param Val Amount of movement in the forward direction (or backward if negative). + * @see APawn::AddMovementInput() + */ + void Move(const FInputActionValue& Movement); + /** * Input callback to move forward in local space (or backward if Val is negative). * @param Val Amount of movement in the forward direction (or backward if negative). diff --git a/Source/DeltaV/Public/Construction/Constructor.h b/Source/DeltaV/Public/Construction/Constructor.h index 42f7c6e..cae3a4a 100644 --- a/Source/DeltaV/Public/Construction/Constructor.h +++ b/Source/DeltaV/Public/Construction/Constructor.h @@ -17,8 +17,6 @@ class DELTAV_API Constructor { AConstructionController* Controller; - FActorSpawnParameters SpawnParamsAlwaysSpawn; - TArray SymmetryCrafts; UWorld* World; @@ -38,7 +36,7 @@ class DELTAV_API Constructor /* Create a craft with json, and perform the necessary steps to make it workable in the construction editor */ - TObjectPtr CreateCraft(TSharedPtr CraftJson); + TObjectPtr CreateCraft(TSharedPtr CraftJson, FVector Location = FVector(0)); UPart* Update(); @@ -52,8 +50,6 @@ class DELTAV_API Constructor void Deselect() { Select(nullptr); } - UPart* Trace(FVector Position, FVector Direction); - // Get the part under the mouse UPart* TraceMouse(); diff --git a/Source/DeltaV/Public/Construction/UI/ConstructionHUD.h b/Source/DeltaV/Public/Construction/UI/ConstructionHUD.h index 9873440..4a542d4 100644 --- a/Source/DeltaV/Public/Construction/UI/ConstructionHUD.h +++ b/Source/DeltaV/Public/Construction/UI/ConstructionHUD.h @@ -18,6 +18,8 @@ class UDragReorderList; class AConstructionController; class ACraft; +#define UConstructionHUDClass "/Game/Construction/UI/WBP_ConstructionHUD.WBP_ConstructionHUD_C" + /** * */ @@ -33,8 +35,6 @@ class DELTAV_API UConstructionHUD : public UUserWidget virtual void NativeOnInitialized() override; public: - inline static TSubclassOf BlueprintClass; - AConstructionController* Controller; UPROPERTY(EditAnywhere, meta = (BindWidget)) diff --git a/Source/DeltaV/Public/Construction/UI/PartDetails.h b/Source/DeltaV/Public/Construction/UI/PartDetails.h index 3e7c885..80749cd 100644 --- a/Source/DeltaV/Public/Construction/UI/PartDetails.h +++ b/Source/DeltaV/Public/Construction/UI/PartDetails.h @@ -48,7 +48,7 @@ class DELTAV_API UPartDetails : public UUserWidget public: AConstructionController* Controller; - inline static TSubclassOf BlueprintClass; + static TSubclassOf BlueprintClass(); UPROPERTY(EditAnywhere, meta = (BindWidget)) UEditableTextBox* PartName; diff --git a/Source/DeltaV/Public/Construction/UI/PartItem.h b/Source/DeltaV/Public/Construction/UI/PartItem.h index 733a67e..20f4806 100644 --- a/Source/DeltaV/Public/Construction/UI/PartItem.h +++ b/Source/DeltaV/Public/Construction/UI/PartItem.h @@ -41,7 +41,7 @@ class DELTAV_API UPartItem : public UUserWidget UPartItem(const FObjectInitializer& ObjectInitializer); public: - inline static TSubclassOf BlueprintClass; + static TSubclassOf BlueprintClass(); UPROPERTY(EditAnywhere, meta = (BindWidget)) UTextBlock* PartLabel; diff --git a/Source/DeltaV/Public/Construction/UI/StageGroup.h b/Source/DeltaV/Public/Construction/UI/StageGroup.h index fdd78cd..10fafae 100644 --- a/Source/DeltaV/Public/Construction/UI/StageGroup.h +++ b/Source/DeltaV/Public/Construction/UI/StageGroup.h @@ -20,7 +20,7 @@ class DELTAV_API UStageGroup : public UUserWidget public: UStageGroup(const FObjectInitializer& ObjectInitializer); - inline static TSubclassOf BlueprintClass; + static TSubclassOf BlueprintClass(); UFUNCTION(BlueprintCallable) void Init(UObject* Object); diff --git a/Source/DeltaV/Public/Generation/Erosion.h b/Source/DeltaV/Public/Generation/Erosion.h new file mode 100644 index 0000000..2fd79fe --- /dev/null +++ b/Source/DeltaV/Public/Generation/Erosion.h @@ -0,0 +1,37 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" + +/** + * + */ +class DELTAV_API Erosion +{ +public: + Erosion(); + ~Erosion(); + + TMap Height; + TMap Position; + + TMap Drainage; + TMap Velocity; + + TMap NextDrainage; + TMap NextVelocity; + + TArray Vertices; + TArray> Edges; + TMap EdgeDirection; + TMap> Neighbours; + + // iteration variables, should be reset for each step + TMap Gradient; + + + void CalculateGradient(); + + void Step(); +}; diff --git a/Source/DeltaV/Public/Generation/MeshGeneration.h b/Source/DeltaV/Public/Generation/MeshGeneration.h index 050ca9c..5612b38 100644 --- a/Source/DeltaV/Public/Generation/MeshGeneration.h +++ b/Source/DeltaV/Public/Generation/MeshGeneration.h @@ -35,6 +35,12 @@ class DELTAV_API UMeshGeneration : public UDynamicMeshGenerator UPROPERTY() TMap HeightMap; + UPROPERTY() + TMap PositionMap; + + UPROPERTY() + TMap GradientMap; + public: UMeshGeneration(); ~UMeshGeneration(); @@ -46,6 +52,7 @@ class DELTAV_API UMeshGeneration : public UDynamicMeshGenerator void Initialize(FDynamicMesh3& MeshInOut); + void Iterate3(FDynamicMesh3& MeshInOut); void ComputeDrainageArea(TArray& Tree, int Node); void Iterate2(FDynamicMesh3& MeshInOut); void Iterate(FDynamicMesh3& MeshInOut); diff --git a/Source/DeltaV/Public/ModularVehicle/Thruster2DSimModule.h b/Source/DeltaV/Public/ModularVehicle/Thruster2DSimModule.h new file mode 100644 index 0000000..e88e34a --- /dev/null +++ b/Source/DeltaV/Public/ModularVehicle/Thruster2DSimModule.h @@ -0,0 +1,59 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "SimModule/ThrusterModule.h" + +namespace Chaos +{ + struct FAllInputs; + class FSimModuleTree; + + const FName ThrustControl("Thrust"); + + /// + /// Thruster2D settings + /// + struct FThruster2DSettings : FThrusterSettings + { + FThruster2DSettings() + : FThrusterSettings() + { + Pitch = FVector2D(0, -1); + Roll = FVector2D(1, 0); + Yaw = FVector2D(1, 0); + } + + FVector2D Pitch; + FVector2D Roll; + FVector2D Yaw; + }; + + /// + /// A vehicle component that transmits torque from one source to another, i.e. from an engine or differential to wheels + /// + /// + class FThruster2DSimModule : public ISimulationModuleBase, public TSimModuleSettings, public TSimulationModuleTypeable + { + public: + DEFINE_CHAOSSIMTYPENAME(FThruster2DSimModule); + FThruster2DSimModule(const FThruster2DSettings& Settings); + + virtual TSharedPtr GenerateNetData(const int32 NodeArrayIndex) const override { return nullptr; } + + virtual const FString GetDebugName() const { return TEXT("Thruster2D"); } + + virtual bool IsBehaviourType(eSimModuleTypeFlags InType) const override { return (InType & NonFunctional); } + + virtual void Simulate(float DeltaTime, const FAllInputs& Inputs, FSimModuleTree& VehicleModuleSystem) override; + + virtual void Animate() override; + + private: + FVector2D SteerAngle; + FQuat Steer; + }; + + +} // namespace Chaos diff --git a/Source/DeltaV/Public/ModularVehicle/VehicleSimThruster2DComponent.h b/Source/DeltaV/Public/ModularVehicle/VehicleSimThruster2DComponent.h new file mode 100644 index 0000000..65f0403 --- /dev/null +++ b/Source/DeltaV/Public/ModularVehicle/VehicleSimThruster2DComponent.h @@ -0,0 +1,46 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "ChaosModularVehicle/VehicleSimThrusterComponent.h" +#include "VehicleSimThruster2DComponent.generated.h" + +/** + * + */ +UCLASS() +class DELTAV_API UVehicleSimThruster2DComponent : public UVehicleSimThrusterComponent +{ + GENERATED_BODY() + +public: + UVehicleSimThruster2DComponent(); + virtual ~UVehicleSimThruster2DComponent() = default; + /* + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + float MaxThrustForce; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + FVector ForceAxis; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + FVector ForceOffset; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + bool bSteeringEnabled; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + FVector SteeringAxis; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + float MaxSteeringAngle; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + float SteeringForceEffect; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Attributes) + float BoostMultiplierEffect; + */ + virtual Chaos::ISimulationModuleBase* CreateNewCoreModule() const override; +}; diff --git a/Source/DeltaV/Public/Simulation/OrbitComponent.h b/Source/DeltaV/Public/Simulation/OrbitComponent.h index efb0dc7..c63f89d 100644 --- a/Source/DeltaV/Public/Simulation/OrbitComponent.h +++ b/Source/DeltaV/Public/Simulation/OrbitComponent.h @@ -58,7 +58,7 @@ class DELTAV_API UOrbitComponent : public USplineComponent inline static TObjectPtr SplineMesh; UPROPERTY() - TArray> Spline; + TArray> Spline1; void UpdateSplineWithOrbit(); diff --git a/Source/DeltaV/Public/Simulation/UI/SimulationHUD.h b/Source/DeltaV/Public/Simulation/UI/SimulationHUD.h index b6609fb..21b6003 100644 --- a/Source/DeltaV/Public/Simulation/UI/SimulationHUD.h +++ b/Source/DeltaV/Public/Simulation/UI/SimulationHUD.h @@ -13,6 +13,8 @@ class ACraft; class UButton; class UCheckBox; +#define USimulationHUDClass "/Game/Simulation/UI/WBP_SimulationHUD.WBP_SimulationHUD_C" + /** * */ @@ -30,8 +32,6 @@ class DELTAV_API USimulationHUD : public UUserWidget virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override; public: - inline static TSubclassOf BlueprintClass; - ASimulationController* Controller; UPROPERTY(EditAnywhere, meta = (ArraySizeEnum="EStabilizationMode")) diff --git a/Source/DeltaVEditor.Target.cs b/Source/DeltaVEditor.Target.cs index c9e974f..5b6f555 100644 --- a/Source/DeltaVEditor.Target.cs +++ b/Source/DeltaVEditor.Target.cs @@ -9,7 +9,7 @@ public DeltaVEditorTarget( TargetInfo Target) : base(Target) { Type = TargetType.Editor; DefaultBuildSettings = BuildSettingsVersion.V5; - IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_4; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_6; ExtraModuleNames.Add("DeltaV"); } }