using NewHorizons.External; using NewHorizons.External.VariableSize; using OWML.Utils; using UnityEngine; using NewHorizons.Utility; using Logger = NewHorizons.Utility.Logger; using NewHorizons.Components; using NewHorizons.Components.SizeControllers; namespace NewHorizons.Builder.Body { public static class WaterBuilder { public static void Make(GameObject planetGO, Sector sector, OWRigidbody rb, WaterModule module) { var waterSize = module.Size; GameObject waterGO = new GameObject("Water"); waterGO.SetActive(false); waterGO.layer = 15; waterGO.transform.parent = sector?.transform ?? planetGO.transform; waterGO.transform.localScale = new Vector3(waterSize, waterSize, waterSize); var GDTSR = GameObject.Find("Ocean_GD").GetComponent(); TessellatedSphereRenderer TSR = waterGO.AddComponent(); TSR.tessellationMeshGroup = new Tessellation.MeshGroup(); for (int i = 0; i < 16; i++) { var mesh = new Mesh(); mesh.CopyPropertiesFrom(GDTSR.tessellationMeshGroup.variants[i]); TSR.tessellationMeshGroup.variants[i] = mesh; } var GDSharedMaterials = GameObject.Find("Ocean_GD").GetComponent()._lowAltitudeMaterials; var tempArray = new Material[GDSharedMaterials.Length]; for(int i = 0; i < GDSharedMaterials.Length; i++) { tempArray[i] = new Material(GDSharedMaterials[i]); if (module.Tint != null) { tempArray[i].color = module.Tint.ToColor(); tempArray[i].SetColor("_FogColor", module.Tint.ToColor()); } } TSR.sharedMaterials = tempArray; TSR.maxLOD = 0; TSR.LODBias = 0; TSR.LODRadius = 0; OceanEffectController OEC = waterGO.AddComponent(); OEC._sector = sector; OEC._ocean = TSR; //Buoyancy var buoyancyObject = new GameObject("WaterVolume"); buoyancyObject.transform.parent = waterGO.transform; buoyancyObject.transform.localScale = Vector3.one; buoyancyObject.layer = LayerMask.NameToLayer("BasicEffectVolume"); var sphereCollider = buoyancyObject.AddComponent(); sphereCollider.radius = 1; sphereCollider.isTrigger = true; var owCollider = buoyancyObject.AddComponent(); owCollider._parentBody = rb; owCollider._collider = sphereCollider; var buoyancyTriggerVolume = buoyancyObject.AddComponent(); buoyancyTriggerVolume._owCollider = owCollider; var fluidVolume = buoyancyObject.AddComponent(); fluidVolume._fluidType = FluidVolume.Type.WATER; fluidVolume._attachedBody = rb; fluidVolume._triggerVolume = buoyancyTriggerVolume; fluidVolume._radius = waterSize; fluidVolume._layer = LayerMask.NameToLayer("BassicEffectVolume"); var fogGO = GameObject.Instantiate(GameObject.Find("GiantsDeep_Body/Sector_GD/Sector_GDInterior/Effects_GDInterior/OceanFog"), waterGO.transform); fogGO.name = "OceanFog"; fogGO.transform.localPosition = Vector3.zero; fogGO.transform.localScale = Vector3.one; if (module.Tint != null) { var adjustedColour = module.Tint.ToColor() / 4f; adjustedColour.a = adjustedColour.a * 4f; fogGO.GetComponent().material.color = adjustedColour; } if (module.Curve != null) { var sizeController = waterGO.AddComponent(); var curve = new AnimationCurve(); foreach (var pair in module.Curve) { curve.AddKey(new Keyframe(pair.Time, pair.Value)); } sizeController.scaleCurve = curve; sizeController.oceanFogMaterial = fogGO.GetComponent().material; sizeController.size = module.Size; } else { fogGO.GetComponent().material.SetFloat("_Radius", module.Size); fogGO.GetComponent().material.SetFloat("_Radius2", module.Size/2f); } // TODO: make LOD work //waterGO.AddComponent(); //waterGO.AddComponent(); // TODO: fix ruleset making the sand bubble pop up waterGO.transform.position = planetGO.transform.position; waterGO.SetActive(true); } } }