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");
}
}