├── 1.png ├── 2.png ├── 3.png ├── README.md └── TestHeightMap ├── Config ├── DefaultEditor.ini ├── DefaultEngine.ini ├── DefaultGame.ini └── DefaultInput.ini ├── Content ├── BP_GameMode.uasset ├── Grass_D.uasset ├── Grass_Mat.uasset ├── Grass_N.uasset ├── HM1.uasset ├── HM2.uasset ├── NewMap.umap ├── TESTHEIGHTMAP.uasset ├── TestDif.uasset ├── TestHM.uasset └── Test_Mat.uasset ├── Source ├── TestHeightMap.Target.cs ├── TestHeightMap │ ├── Private │ │ ├── TestHeightMap.cpp │ │ ├── TestHeightMapGameMode.cpp │ │ └── TestHeightMapLand.cpp │ ├── Public │ │ ├── TestHeightMap.h │ │ ├── TestHeightMapGameMode.h │ │ └── TestHeightMapLand.h │ └── TestHeightMap.Build.cs └── TestHeightMapEditor.Target.cs └── TestHeightMap.uproject /1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/1.png -------------------------------------------------------------------------------- /2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/2.png -------------------------------------------------------------------------------- /3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/3.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UE4HeightMapGenerator 2 | 3 | Example how to generate mesh from heightmap texture using UProceduralMeshComponent. 4 | 5 | You can define: 6 | 7 | 1. Texture to generate from (shoud be grayscale and power of two) 8 | 9 | 2. Material assign to generated mesh 10 | 11 | 3. Generated mesh size 12 | 13 | 4. Polygon size 14 | 15 | 5. Optimization type: 16 | 17 | None, // without optimization 18 | AxesAlternately, // 2 pass: first Y then X 19 | FrontAndBack, // 1 pass: front on Y and back on X 20 | 21 | 6. Downsampling type 22 | 23 | None = 1, // Same as original 24 | TwoTimes = 2, // 2 times lower 25 | FourTimes = 4, // 4 times lower 26 | 27 | 28 | Class ATestHeightMapLand can be spawned and used in any project, just add .cpp and .h files 29 | 30 | Bugs: 31 | 32 | 1. Rectangle and Square optimizations are not finished still. So do not use them. 33 | 34 | 2. Optimized mesh has wrong normals 35 | 36 | ![UE4HeightMapGenerator](https://github.com/h2ogit/UE4HeightMapGenerator/blob/master/1.png) 37 | ![UE4HeightMapGenerator](https://github.com/h2ogit/UE4HeightMapGenerator/blob/master/2.png) 38 | ![UE4HeightMapGenerator](https://github.com/h2ogit/UE4HeightMapGenerator/blob/master/3.png) 39 | -------------------------------------------------------------------------------- /TestHeightMap/Config/DefaultEditor.ini: -------------------------------------------------------------------------------- 1 | [EditoronlyBP] 2 | bAllowClassAndBlueprintPinMatching=true 3 | bReplaceBlueprintWithClass=true 4 | bDontLoadBlueprintOutsideEditor=true 5 | bBlueprintIsNotBlueprintType=true 6 | -------------------------------------------------------------------------------- /TestHeightMap/Config/DefaultEngine.ini: -------------------------------------------------------------------------------- 1 | [URL] 2 | [/Script/Engine.RendererSettings] 3 | r.MobileHDR=True 4 | r.MobileNumDynamicPointLights=4 5 | r.MobileDynamicPointLightsUseStaticBranch=True 6 | r.AllowOcclusionQueries=True 7 | r.MinScreenRadiusForLights=0.030000 8 | r.MinScreenRadiusForDepthPrepass=0.030000 9 | r.PrecomputedVisibilityWarning=False 10 | r.TextureStreaming=True 11 | Compat.UseDXT5NormalMaps=False 12 | r.AllowStaticLighting=True 13 | r.NormalMapsForStaticLighting=False 14 | r.GenerateMeshDistanceFields=False 15 | r.GenerateLandscapeGIData=True 16 | r.TessellationAdaptivePixelsPerTriangle=48.000000 17 | r.SeparateTranslucency=True 18 | r.TranslucentSortPolicy=0 19 | TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000) 20 | r.CustomDepth=1 21 | r.DefaultFeature.Bloom=True 22 | r.DefaultFeature.AmbientOcclusion=True 23 | r.DefaultFeature.AmbientOcclusionStaticFraction=True 24 | r.DefaultFeature.AutoExposure=True 25 | r.DefaultFeature.MotionBlur=True 26 | r.DefaultFeature.LensFlare=True 27 | r.DefaultFeature.AntiAliasing=2 28 | r.EarlyZPass=3 29 | r.EarlyZPassMovable=False 30 | r.DBuffer=False 31 | r.ClearSceneMethod=1 32 | r.BasePassOutputsVelocity=False 33 | r.WireframeCullThreshold=5.000000 34 | UIScaleRule=ShortestSide 35 | UIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,Keys=),ExternalCurve=None) 36 | 37 | [/Script/HardwareTargeting.HardwareTargetingSettings] 38 | TargetedHardwareClass=Desktop 39 | AppliedTargetedHardwareClass=Desktop 40 | DefaultGraphicsPerformance=Maximum 41 | AppliedDefaultGraphicsPerformance=Maximum 42 | 43 | [/Script/EngineSettings.GameMapsSettings] 44 | EditorStartupMap=/Game/NewMap 45 | LocalMapOptions= 46 | TransitionMap=/Engine/Maps/Entry 47 | bUseSplitscreen=True 48 | TwoPlayerSplitscreenLayout=Horizontal 49 | ThreePlayerSplitscreenLayout=FavorTop 50 | GameInstanceClass=/Script/Engine.GameInstance 51 | GameDefaultMap=/Game//Game/NewMap 52 | ServerDefaultMap=/Game//Game/NewMap 53 | GlobalDefaultGameMode=/Script/Engine.GameMode 54 | GlobalDefaultServerGameMode=/Script/Engine.GameMode 55 | 56 | [/Script/Engine.UserInterfaceSettings] 57 | RenderFocusRule=NavigationOnly 58 | DefaultCursor=None 59 | TextEditBeamCursor=None 60 | CrosshairsCursor=None 61 | GrabHandCursor=None 62 | GrabHandClosedCursor=None 63 | SlashedCircleCursor=None 64 | ApplicationScale=1.000000 65 | UIScaleRule=ShortestSide 66 | CustomScalingRuleClass=None 67 | UIScaleCurve=(EditorCurveData=(PreInfinityExtrap=RCCE_Constant,PostInfinityExtrap=RCCE_Constant,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))),ExternalCurve=None) 68 | 69 | -------------------------------------------------------------------------------- /TestHeightMap/Config/DefaultGame.ini: -------------------------------------------------------------------------------- 1 | [/Script/EngineSettings.GeneralProjectSettings] 2 | ProjectID=58EDD3D844F93DC9C0109C8706FD08DD 3 | -------------------------------------------------------------------------------- /TestHeightMap/Config/DefaultInput.ini: -------------------------------------------------------------------------------- 1 | [/Script/Engine.InputSettings] 2 | +ActionMappings=(ActionName="Jump", Key=SpaceBar) 3 | +ActionMappings=(ActionName="Jump", Key=Gamepad_FaceButton_Bottom) 4 | 5 | +AxisMappings=(AxisName="MoveForward", Key=W, Scale=1.f) 6 | +AxisMappings=(AxisName="MoveForward", Key=S, Scale=-1.f) 7 | +AxisMappings=(AxisName="MoveForward", Key=Up, Scale=1.f) 8 | +AxisMappings=(AxisName="MoveForward", Key=Down, Scale=-1.f) 9 | +AxisMappings=(AxisName="MoveForward", Key=Gamepad_LeftY, Scale=1.f) 10 | 11 | +AxisMappings=(AxisName="MoveRight", Key=A, Scale=-1.f) 12 | +AxisMappings=(AxisName="MoveRight", Key=D, Scale=1.f) 13 | +AxisMappings=(AxisName="MoveRight", Key=Gamepad_LeftX, Scale=1.f) 14 | 15 | +AxisMappings=(AxisName="TurnRate", Key=Gamepad_RightX, Scale=1.f) 16 | +AxisMappings=(AxisName="TurnRate", Key=Left, Scale=-1.f) 17 | +AxisMappings=(AxisName="TurnRate", Key=Right, Scale=1.f) 18 | +AxisMappings=(AxisName="Turn", Key=MouseX, Scale=1.f) 19 | 20 | +AxisMappings=(AxisName="LookUpRate", Key=Gamepad_RightY, Scale=1.f) 21 | +AxisMappings=(AxisName="LookUp", Key=MouseY, Scale=-1.f) 22 | -------------------------------------------------------------------------------- /TestHeightMap/Content/BP_GameMode.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/BP_GameMode.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/Grass_D.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/Grass_D.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/Grass_Mat.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/Grass_Mat.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/Grass_N.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/Grass_N.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/HM1.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/HM1.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/HM2.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/HM2.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/NewMap.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/NewMap.umap -------------------------------------------------------------------------------- /TestHeightMap/Content/TESTHEIGHTMAP.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/TESTHEIGHTMAP.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/TestDif.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/TestDif.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/TestHM.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/TestHM.uasset -------------------------------------------------------------------------------- /TestHeightMap/Content/Test_Mat.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Content/Test_Mat.uasset -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap.Target.cs: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class TestHeightMapTarget : TargetRules 7 | { 8 | public TestHeightMapTarget(TargetInfo Target) 9 | { 10 | Type = TargetType.Game; 11 | } 12 | 13 | // 14 | // TargetRules interface. 15 | // 16 | 17 | public override void SetupBinaries( 18 | TargetInfo Target, 19 | ref List OutBuildBinaryConfigurations, 20 | ref List OutExtraModuleNames 21 | ) 22 | { 23 | OutExtraModuleNames.AddRange( new string[] { "TestHeightMap" } ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap/Private/TestHeightMap.cpp: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | #include "TestHeightMap.h" 4 | 5 | IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, TestHeightMap, "TestHeightMap" ); 6 | -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap/Private/TestHeightMapGameMode.cpp: -------------------------------------------------------------------------------- 1 | #include "TestHeightMap.h" 2 | #include "TestHeightMapGameMode.h" 3 | #include "TestHeightMapLand.h" 4 | 5 | void ATestHeightMapGameMode::StartMatch() 6 | { 7 | Super::StartMatch(); 8 | 9 | FActorSpawnParameters lSpawnInfo; 10 | lSpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn; 11 | lSpawnInfo.bNoFail = true; 12 | lSpawnInfo.Owner = this; 13 | 14 | FVector lLocation0(0, -600.f, 0.f); 15 | class ATestHeightMapLand* lLandTest0 = GetWorld()->SpawnActor(ATestHeightMapLand::StaticClass(), lLocation0, FRotator::ZeroRotator, lSpawnInfo); 16 | if (lLandTest0) 17 | { 18 | lLandTest0->GenerateUnoptimizedPattern(HeightMap, MeshMaterial, LandscapeSize, PolygonSize); 19 | } 20 | 21 | FVector lLandLocation(0.f, 0.f, 0.f); 22 | class ATestHeightMapLand* lLand = GetWorld()->SpawnActor(ATestHeightMapLand::StaticClass(), lLandLocation, FRotator::ZeroRotator, lSpawnInfo); 23 | if (lLand) 24 | { 25 | lLand->Generate(HeightMap, MeshMaterial, LandscapeSize, PolygonSize, OptimizationType, DownSamplingType); 26 | } 27 | } 28 | 29 | 30 | -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap/Private/TestHeightMapLand.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/h2ogit/UE4HeightMapGenerator/b937501e29d69509368fb8aa3d3aaa23b1509692/TestHeightMap/Source/TestHeightMap/Private/TestHeightMapLand.cpp -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap/Public/TestHeightMap.h: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | #pragma once 4 | 5 | #include "Engine.h" 6 | 7 | -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap/Public/TestHeightMapGameMode.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "TestHeightMapLand.h" 4 | #include "GameFramework/GameMode.h" 5 | #include "TestHeightMapGameMode.generated.h" 6 | 7 | /** 8 | * 9 | */ 10 | UCLASS(MinimalAPI) 11 | class ATestHeightMapGameMode : public AGameMode 12 | { 13 | GENERATED_BODY() 14 | 15 | public: 16 | virtual void StartMatch() override; 17 | 18 | protected: 19 | UPROPERTY(EditDefaultsOnly, Category = "TEST") 20 | class UTexture2D* HeightMap; 21 | 22 | UPROPERTY(EditDefaultsOnly, Category = "TEST") 23 | class UMaterial* MeshMaterial; 24 | 25 | UPROPERTY(EditDefaultsOnly, Category = "TEST") 26 | FVector LandscapeSize; 27 | 28 | UPROPERTY(EditDefaultsOnly, Category = "TEST") 29 | uint8 PolygonSize; 30 | 31 | UPROPERTY(EditDefaultsOnly, Category = "TEST") 32 | EQuadOptimizationType OptimizationType; 33 | 34 | UPROPERTY(EditDefaultsOnly, Category = "TEST") 35 | EDownSamplingType DownSamplingType; 36 | }; 37 | 38 | -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap/Public/TestHeightMapLand.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ProceduralMeshComponent.h" 3 | #include "TestHeightMapLand.generated.h" 4 | 5 | UENUM(NotBlueprintType, NotBlueprintable) 6 | enum class EQuadOptimizationType : uint8 7 | { 8 | None, // without optimization 9 | AxesAlternately, // 2 pass: first Y then X 10 | FrontAndBack, // 1 pass: front on Y and back on X 11 | Square, // 1 pass: square 12 | Rectangle, // 1 pass: rectangle 13 | }; 14 | 15 | UENUM(NotBlueprintType, NotBlueprintable) 16 | enum class EDownSamplingType : uint8 17 | { 18 | None = 1, // Same as original 19 | TwoTimes = 2, // 2 times lower 20 | FourTimes = 4, // 4 times lower 21 | }; 22 | 23 | USTRUCT(NotBlueprintType, NotBlueprintable) 24 | struct FVertice 25 | { 26 | GENERATED_USTRUCT_BODY() 27 | 28 | public: 29 | UPROPERTY() 30 | FVector Loc; 31 | 32 | UPROPERTY() 33 | FColor Color; 34 | 35 | FVertice() 36 | { 37 | Loc = FVector::ZeroVector; 38 | Color = FColor::White; 39 | } 40 | 41 | bool operator==(const FVertice& OtherVertice) const 42 | { 43 | if ((Loc == OtherVertice.Loc) && (Color == OtherVertice.Color)) 44 | { 45 | return true; 46 | } 47 | else 48 | { 49 | return false; 50 | } 51 | } 52 | }; 53 | 54 | USTRUCT(NotBlueprintType, NotBlueprintable) 55 | struct FQuad 56 | { 57 | GENERATED_USTRUCT_BODY() 58 | 59 | public: 60 | UPROPERTY() 61 | int32 V1; 62 | 63 | UPROPERTY() 64 | int32 V2; 65 | 66 | UPROPERTY() 67 | int32 V3; 68 | 69 | UPROPERTY() 70 | int32 V4; 71 | 72 | UPROPERTY() 73 | bool bUsed; 74 | 75 | FQuad() 76 | { 77 | V1 = -1; 78 | V2 = -1; 79 | V3 = -1; 80 | V4 = -1; 81 | bUsed = false; 82 | } 83 | 84 | float GetQuadSize(TArray& Vertices) const 85 | { 86 | return (Vertices[V1].Loc + Vertices[V2].Loc + Vertices[V3].Loc + Vertices[V4].Loc).Size(); 87 | } 88 | 89 | bool HasSameSide(const FQuad& OtherQuad) const 90 | { 91 | if ((OtherQuad.V1 == V4) && (OtherQuad.V2 == V3)) 92 | { 93 | return true; 94 | } 95 | else 96 | { 97 | return false; 98 | } 99 | } 100 | 101 | bool HasSameHeight(const FQuad& OtherQuad, TArray& Vertices) const 102 | { 103 | if ((Vertices[OtherQuad.V1].Loc.Z == Vertices[V1].Loc.Z) && (Vertices[OtherQuad.V2].Loc.Z == Vertices[V2].Loc.Z) && (Vertices[OtherQuad.V3].Loc.Z == Vertices[V3].Loc.Z) && (Vertices[OtherQuad.V4].Loc.Z == Vertices[V4].Loc.Z)) 104 | { 105 | return true; 106 | } 107 | else 108 | { 109 | return false; 110 | } 111 | } 112 | }; 113 | 114 | /** 115 | * 116 | */ 117 | UCLASS() 118 | class ATestHeightMapLand : public AActor 119 | { 120 | GENERATED_BODY() 121 | 122 | public: 123 | ATestHeightMapLand(const FObjectInitializer& ObjectInitializer); 124 | 125 | void GenerateUnoptimizedPattern(class UTexture2D* aHeightMap, class UMaterial* aMat, FVector aSize, int32 PolygonSize); 126 | 127 | void Generate(class UTexture2D* aHeightMap, class UMaterial* aMat, FVector aSize, int32 PolygonSize, EQuadOptimizationType OptimizationType, EDownSamplingType DownSamplingType); 128 | 129 | protected: 130 | UPROPERTY(Transient) 131 | class UProceduralMeshComponent* Mesh; 132 | 133 | private: 134 | void GenerateMesh(TArray& Vertices, TArray& Triangles, TArray& Normals, TArray& UVs, TArray& Tangents, TArray& VertexColors, class UTexture2D* aHeightMap, int32 PolygonSize, EQuadOptimizationType OptimizationType, EDownSamplingType DownSamplingType); 135 | 136 | void OptimizeMeshQuads_AxesAlternately(TArray& NormalQuads, TArray& NormalVertices, FIntPoint& TextureSize, TArray& OptimizedQuads); 137 | void OptimizeMeshQuads_Square(TArray& NormalQuads, TArray& NormalVertices, FIntPoint& TextureSize, TArray& OptimizedQuads); 138 | void OptimizeMeshQuads_Rectangle(TArray& NormalQuads, TArray& NormalVertices, FIntPoint& TextureSize, TArray& OptimizedQuads); 139 | void OptimizeMeshQuads_FrontAndBack(TArray& NormalQuads, TArray& NormalVertices, FIntPoint& TextureSize, TArray& OptimizedQuads); 140 | }; 141 | -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMap/TestHeightMap.Build.cs: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class TestHeightMap : ModuleRules 6 | { 7 | public TestHeightMap(TargetInfo Target) 8 | { 9 | PublicDependencyModuleNames.AddRange(new string[] { 10 | "Core" 11 | , "CoreUObject" 12 | , "Engine" 13 | , "InputCore" 14 | , "RHI" 15 | , "RenderCore" 16 | , "ProceduralMeshComponent" 17 | //, "CustomMeshComponent" 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /TestHeightMap/Source/TestHeightMapEditor.Target.cs: -------------------------------------------------------------------------------- 1 | // Fill out your copyright notice in the Description page of Project Settings. 2 | 3 | using UnrealBuildTool; 4 | using System.Collections.Generic; 5 | 6 | public class TestHeightMapEditorTarget : TargetRules 7 | { 8 | public TestHeightMapEditorTarget(TargetInfo Target) 9 | { 10 | Type = TargetType.Editor; 11 | } 12 | 13 | // 14 | // TargetRules interface. 15 | // 16 | 17 | public override void SetupBinaries( 18 | TargetInfo Target, 19 | ref List OutBuildBinaryConfigurations, 20 | ref List OutExtraModuleNames 21 | ) 22 | { 23 | OutExtraModuleNames.AddRange( new string[] { "TestHeightMap" } ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /TestHeightMap/TestHeightMap.uproject: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "EngineAssociation": "4.9", 4 | "Category": "", 5 | "Description": "", 6 | "Modules": [ 7 | { 8 | "Name": "TestHeightMap", 9 | "Type": "Runtime", 10 | "LoadingPhase": "Default", 11 | "AdditionalDependencies": [ 12 | "Engine" 13 | ] 14 | } 15 | ], 16 | "Plugins": [ 17 | { 18 | "Name": "Substance", 19 | "Enabled": true, 20 | "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/offers/2f6439c2f9584f49809d9b13b16c2ba4" 21 | } 22 | ] 23 | } --------------------------------------------------------------------------------