diff --git a/NewHorizons/Builder/Body/HeightMapBuilder.cs b/NewHorizons/Builder/Body/HeightMapBuilder.cs index 53348a1b..7807fbbe 100644 --- a/NewHorizons/Builder/Body/HeightMapBuilder.cs +++ b/NewHorizons/Builder/Body/HeightMapBuilder.cs @@ -23,22 +23,22 @@ namespace NewHorizons.Builder.Body Texture2D smoothnessMap; Texture2D normalMap; Texture2D emissionMap; - Texture2D tileBlendMap; - Texture2D baseTextureTile; - Texture2D baseSmoothnessTile; - Texture2D baseNormalTile; - Texture2D redTextureTile; - Texture2D redSmoothnessTile; - Texture2D redNormalTile; - Texture2D greenTextureTile; - Texture2D greenSmoothnessTile; - Texture2D greenNormalTile; - Texture2D blueTextureTile; - Texture2D blueSmoothnessTile; - Texture2D blueNormalTile; - Texture2D alphaTextureTile; - Texture2D alphaSmoothnessTile; - Texture2D alphaNormalTile; + Texture2D tileBlendMap = null; + Texture2D baseTextureTile = null; + Texture2D baseSmoothnessTile = null; + Texture2D baseNormalTile = null; + Texture2D redTextureTile = null; + Texture2D redSmoothnessTile = null; + Texture2D redNormalTile = null; + Texture2D greenTextureTile = null; + Texture2D greenSmoothnessTile = null; + Texture2D greenNormalTile = null; + Texture2D blueTextureTile = null; + Texture2D blueSmoothnessTile = null; + Texture2D blueNormalTile = null; + Texture2D alphaTextureTile = null; + Texture2D alphaSmoothnessTile = null; + Texture2D alphaNormalTile = null; try { if (!string.IsNullOrEmpty(module.heightMap) && !File.Exists(Path.Combine(mod.ModHelper.Manifest.ModFolderPath, module.heightMap))) @@ -73,22 +73,41 @@ namespace NewHorizons.Builder.Body smoothnessMap = Load(module.smoothnessMap, "smoothnessMap", false); normalMap = Load(module.normalMap, "normalMap", true); emissionMap = Load(module.emissionMap, "emissionMap", false); - tileBlendMap = Load(module.tileBlendMap, "tileBlendMap", false); - baseTextureTile = Load(module.baseTile.textureTile, "baseTile textureTile", false); - baseSmoothnessTile = Load(module.baseTile.smoothnessTile, "baseTile smoothnessTile", false); - baseNormalTile = Load(module.baseTile.normalTile, "baseTile normalTile", true); - redTextureTile = Load(module.redTile.textureTile, "redTile textureTile", false); - redSmoothnessTile = Load(module.redTile.smoothnessTile, "redTile smoothnessTile", false); - redNormalTile = Load(module.redTile.normalTile, "redTile normalTile", true); - greenTextureTile = Load(module.greenTile.textureTile, "greenTile textureTile", false); - greenSmoothnessTile = Load(module.greenTile.smoothnessTile, "greenTile smoothnessTile", false); - greenNormalTile = Load(module.greenTile.normalTile, "greenTile normalTile", true); - blueTextureTile = Load(module.blueTile.textureTile, "blueTile textureTile", false); - blueSmoothnessTile = Load(module.blueTile.smoothnessTile, "blueTile smoothnessTile", false); - blueNormalTile = Load(module.blueTile.normalTile, "blueTile normalTile", true); - alphaTextureTile = Load(module.alphaTile.textureTile, "alphaTile textureTile", false); - alphaSmoothnessTile = Load(module.alphaTile.smoothnessTile, "alphaTile smoothnessTile", false); - alphaNormalTile = Load(module.alphaTile.normalTile, "alphaTile normalTile", true); + + if (useLOD) + { + tileBlendMap = Load(module.tileBlendMap, "tileBlendMap", false); + if (module.baseTile != null) + { + baseTextureTile = Load(module.baseTile.textureTile, "baseTile textureTile", false); + baseSmoothnessTile = Load(module.baseTile.smoothnessTile, "baseTile smoothnessTile", false); + baseNormalTile = Load(module.baseTile.normalTile, "baseTile normalTile", true); + } + if (module.redTile != null) + { + redTextureTile = Load(module.redTile.textureTile, "redTile textureTile", false); + redSmoothnessTile = Load(module.redTile.smoothnessTile, "redTile smoothnessTile", false); + redNormalTile = Load(module.redTile.normalTile, "redTile normalTile", true); + } + if (module.greenTile != null) + { + greenTextureTile = Load(module.greenTile.textureTile, "greenTile textureTile", false); + greenSmoothnessTile = Load(module.greenTile.smoothnessTile, "greenTile smoothnessTile", false); + greenNormalTile = Load(module.greenTile.normalTile, "greenTile normalTile", true); + } + if (module.blueTile != null) + { + blueTextureTile = Load(module.blueTile.textureTile, "blueTile textureTile", false); + blueSmoothnessTile = Load(module.blueTile.smoothnessTile, "blueTile smoothnessTile", false); + blueNormalTile = Load(module.blueTile.normalTile, "blueTile normalTile", true); + } + if (module.alphaTile != null) + { + alphaTextureTile = Load(module.alphaTile.textureTile, "alphaTile textureTile", false); + alphaSmoothnessTile = Load(module.alphaTile.smoothnessTile, "alphaTile smoothnessTile", false); + alphaNormalTile = Load(module.alphaTile.normalTile, "alphaTile normalTile", true); + } + } // If the texturemap is the same as the heightmap don't delete it #176 // Do the same with emissionmap @@ -111,16 +130,7 @@ namespace NewHorizons.Builder.Body var emissionColor = module.emissionColor?.ToColor() ?? Color.white; - var level1 = MakeLODTerrain( - cubeSphere, heightMap, module.minHeight, module.maxHeight, resolution, stretch, - textureMap, smoothnessMap, module.smoothness, module.metallic, normalMap, module.normalStrength, emissionMap, emissionColor, - tileBlendMap, - module.baseTile.scale, baseTextureTile, baseSmoothnessTile, baseNormalTile, module.baseTile.normalStrength, - module.redTile.scale, redTextureTile, redSmoothnessTile, redNormalTile, module.redTile.normalStrength, - module.greenTile.scale, greenTextureTile, greenSmoothnessTile, greenNormalTile, module.greenTile.normalStrength, - module.blueTile.scale, blueTextureTile, blueSmoothnessTile, blueNormalTile, module.blueTile.normalStrength, - module.alphaTile.scale, alphaTextureTile, alphaSmoothnessTile, alphaNormalTile, module.alphaTile.normalStrength - ); + var level1 = MakeLODTerrain(resolution, useLOD); var cubeSphereMC = cubeSphere.AddComponent(); cubeSphereMC.sharedMesh = level1.gameObject.GetComponent().mesh; @@ -128,16 +138,7 @@ namespace NewHorizons.Builder.Body if (useLOD) { var level2Res = (int)Mathf.Clamp(resolution / 2f, 1 /*cube moment*/, 100); - var level2 = MakeLODTerrain( - cubeSphere, heightMap, module.minHeight, module.maxHeight, level2Res, stretch, - textureMap, smoothnessMap, module.smoothness, module.metallic, normalMap, module.normalStrength, emissionMap, emissionColor, - default, - default, default, default, default, default, - default, default, default, default, default, - default, default, default, default, default, - default, default, default, default, default, - default, default, default, default, default - ); + var level2 = MakeLODTerrain(level2Res, false); var LODGroup = cubeSphere.AddComponent(); LODGroup.size = module.maxHeight; @@ -170,108 +171,104 @@ namespace NewHorizons.Builder.Body if (deleteHeightmapFlag) ImageUtilities.DeleteTexture(mod, module.heightMap, heightMap); return cubeSphere; - } - // lol fuck the stack - private static MeshRenderer MakeLODTerrain( - GameObject root, Texture2D heightMap, float minHeight, float maxHeight, int resolution, Vector3 stretch, - Texture2D textureMap, Texture2D smoothnessMap, float smoothness, float metallic, Texture2D normalMap, float normalStrength, Texture2D emissionMap, Color emissionColor, - Texture2D tileBlendMap, - float baseScale, Texture2D baseTextureTile, Texture2D baseSmoothnessTile, Texture2D baseNormalTile, float baseNormalStrength, - float redScale, Texture2D redTextureTile, Texture2D redSmoothnessTile, Texture2D redNormalTile, float redNormalStrength, - float greenScale, Texture2D greenTextureTile, Texture2D greenSmoothnessTile, Texture2D greenNormalTile, float greenNormalStrength, - float blueScale, Texture2D blueTextureTile, Texture2D blueSmoothnessTile, Texture2D blueNormalTile, float blueNormalStrength, - float alphaScale, Texture2D alphaTextureTile, Texture2D alphaSmoothnessTile, Texture2D alphaNormalTile, float alphaNormalStrength - ) - { - var LODCubeSphere = new GameObject("LODCubeSphere"); - LODCubeSphere.AddComponent().mesh = CubeSphere.Build(resolution, heightMap, minHeight, maxHeight, stretch); - var cubeSphereMR = LODCubeSphere.AddComponent(); - var material = new Material(PlanetShader); - cubeSphereMR.material = material; - material.name = textureMap.name; - // string based property lookup. cry about it - material.mainTexture = textureMap; - material.SetFloat("_Smoothness", smoothness); - material.SetFloat("_Metallic", metallic); - material.SetTexture("_SmoothnessMap", smoothnessMap); - material.SetFloat("_BumpStrength", normalStrength); - material.SetTexture("_BumpMap", normalMap); - material.SetColor("_EmissionColor", emissionColor); - material.SetTexture("_EmissionMap", emissionMap); - material.SetTexture("_BlendMap", tileBlendMap); - if (baseTextureTile || baseSmoothnessTile || baseNormalTile) + MeshRenderer MakeLODTerrain(int resolution, bool useTriplanar) { - material.EnableKeyword("BASE_TILE"); - material.SetFloat("_BaseTileScale", baseScale); - material.SetTexture("_BaseTileAlbedo", baseTextureTile); - material.SetTexture("_BaseTileSmoothnessMap", baseSmoothnessTile); - material.SetFloat("_BaseTileBumpStrength", baseNormalStrength); - material.SetTexture("_BaseTileBumpMap", baseNormalTile); - } - else - { - material.DisableKeyword("BASE_TILE"); - } - if (redTextureTile || redSmoothnessTile || redNormalTile) - { - material.EnableKeyword("RED_TILE"); - material.SetFloat("_RedTileScale", redScale); - material.SetTexture("_RedTileAlbedo", redTextureTile); - material.SetTexture("_RedTileSmoothnessMap", redSmoothnessTile); - material.SetFloat("_RedTileBumpStrength", redNormalStrength); - material.SetTexture("_RedTileBumpMap", redNormalTile); - } - else - { - material.DisableKeyword("RED_TILE"); - } - if (greenTextureTile || greenSmoothnessTile || greenNormalTile) - { - material.EnableKeyword("GREEN_TILE"); - material.SetFloat("_GreenTileScale", greenScale); - material.SetTexture("_GreenTileAlbedo", greenTextureTile); - material.SetTexture("_GreenTileSmoothnessMap", greenSmoothnessTile); - material.SetFloat("_GreenTileBumpStrength", greenNormalStrength); - material.SetTexture("_GreenTileBumpMap", greenNormalTile); - } - else - { - material.DisableKeyword("GREEN_TILE"); - } - if (blueTextureTile || blueSmoothnessTile || blueNormalTile) - { - material.EnableKeyword("BLUE_TILE"); - material.SetFloat("_BlueTileScale", blueScale); - material.SetTexture("_BlueTileAlbedo", blueTextureTile); - material.SetTexture("_BlueTileSmoothnessMap", blueSmoothnessTile); - material.SetFloat("_BlueTileBumpStrength", blueNormalStrength); - material.SetTexture("_BlueTileBumpMap", blueNormalTile); - } - else - { - material.DisableKeyword("BLUE_TILE"); - } - if (alphaTextureTile || alphaSmoothnessTile || alphaNormalTile) - { - material.EnableKeyword("ALPHA_TILE"); - material.SetFloat("_AlphaTileScale", alphaScale); - material.SetTexture("_AlphaTileAlbedo", alphaTextureTile); - material.SetTexture("_AlphaTileSmoothnessMap", alphaSmoothnessTile); - material.SetFloat("_AlphaTileBumpStrength", alphaNormalStrength); - material.SetTexture("_AlphaTileBumpMap", alphaNormalTile); - } - else - { - material.DisableKeyword("ALPHA_TILE"); - } + var LODCubeSphere = new GameObject("LODCubeSphere"); - LODCubeSphere.transform.parent = root.transform; - LODCubeSphere.transform.localPosition = Vector3.zero; + LODCubeSphere.AddComponent().mesh = CubeSphere.Build(resolution, heightMap, module.minHeight, module.maxHeight, stretch); - return cubeSphereMR; + var cubeSphereMR = LODCubeSphere.AddComponent(); + var material = new Material(PlanetShader); + cubeSphereMR.material = material; + material.name = textureMap.name; + + material.mainTexture = textureMap; + material.SetFloat("_Smoothness", module.smoothness); + material.SetFloat("_Metallic", module.metallic); + material.SetTexture("_SmoothnessMap", smoothnessMap); + material.SetFloat("_BumpStrength", module.normalStrength); + material.SetTexture("_BumpMap", normalMap); + material.SetColor("_EmissionColor", emissionColor); + material.SetTexture("_EmissionMap", emissionMap); + + if (useTriplanar) + { + material.SetTexture("_BlendMap", tileBlendMap); + if (module.baseTile != null) + { + material.EnableKeyword("BASE_TILE"); + material.SetFloat("_BaseTileScale", module.baseTile.scale); + material.SetTexture("_BaseTileAlbedo", baseTextureTile); + material.SetTexture("_BaseTileSmoothnessMap", baseSmoothnessTile); + material.SetFloat("_BaseTileBumpStrength", module.baseTile.normalStrength); + material.SetTexture("_BaseTileBumpMap", baseNormalTile); + } + else + { + material.DisableKeyword("BASE_TILE"); + } + if (module.redTile != null) + { + material.EnableKeyword("RED_TILE"); + material.SetFloat("_RedTileScale", module.redTile.scale); + material.SetTexture("_RedTileAlbedo", redTextureTile); + material.SetTexture("_RedTileSmoothnessMap", redSmoothnessTile); + material.SetFloat("_RedTileBumpStrength", module.redTile.normalStrength); + material.SetTexture("_RedTileBumpMap", redNormalTile); + } + else + { + material.DisableKeyword("RED_TILE"); + } + if (module.greenTile != null) + { + material.EnableKeyword("GREEN_TILE"); + material.SetFloat("_GreenTileScale", module.greenTile.scale); + material.SetTexture("_GreenTileAlbedo", greenTextureTile); + material.SetTexture("_GreenTileSmoothnessMap", greenSmoothnessTile); + material.SetFloat("_GreenTileBumpStrength", module.greenTile.normalStrength); + material.SetTexture("_GreenTileBumpMap", greenNormalTile); + } + else + { + material.DisableKeyword("GREEN_TILE"); + } + if (module.blueTile != null) + { + material.EnableKeyword("BLUE_TILE"); + material.SetFloat("_BlueTileScale", module.blueTile.scale); + material.SetTexture("_BlueTileAlbedo", blueTextureTile); + material.SetTexture("_BlueTileSmoothnessMap", blueSmoothnessTile); + material.SetFloat("_BlueTileBumpStrength", module.blueTile.normalStrength); + material.SetTexture("_BlueTileBumpMap", blueNormalTile); + } + else + { + material.DisableKeyword("BLUE_TILE"); + } + if (module.alphaTile != null) + { + material.EnableKeyword("ALPHA_TILE"); + material.SetFloat("_AlphaTileScale", module.alphaTile.scale); + material.SetTexture("_AlphaTileAlbedo", alphaTextureTile); + material.SetTexture("_AlphaTileSmoothnessMap", alphaSmoothnessTile); + material.SetFloat("_AlphaTileBumpStrength", module.alphaTile.normalStrength); + material.SetTexture("_AlphaTileBumpMap", alphaNormalTile); + } + else + { + material.DisableKeyword("ALPHA_TILE"); + } + } + + LODCubeSphere.transform.parent = cubeSphere.transform; + LODCubeSphere.transform.localPosition = Vector3.zero; + + return cubeSphereMR; + } } } }