private async Task <GRingTerrainId> CreateTerrainAsync() { //Debug.Log("G34 Start"); var triplet = _tripletProvider.ProvideTriplet(); var meshDetails = await _terrainMeshProvider.ProvideMeshDetailsAsync(); //Debug.Log("G35 Mesh detail"); var groundShapeDetails = await _groundShapeProvider.ProvideGroundTextureDetail(); //Debug.Log("G36 Ground shape detail"); var surfaceProviderDetails = await _surfaceProvider.ProvideSurfaceDetail(); var weldingDetails = _weldingUpdater.ProvideWeldingDetails(groundShapeDetails.HeightDetailOutput, meshDetails.HeightmapLod); _groundShapeToken = groundShapeDetails.GroundShapeToken; var creationTemplatesList = new List <Ring1GroundPieceCreationTemplate>(); int layerIndex = surfaceProviderDetails.Count; foreach (var surfaceDetail in surfaceProviderDetails) { UniformsPack pack = new UniformsPack(); pack.MergeWith(meshDetails.Uniforms); pack.MergeWith(groundShapeDetails.Uniforms); pack.MergeWith(surfaceDetail.UniformsWithKeywords.Uniforms); pack.MergeWith(weldingDetails.UniformsPack); var keywordsSet = ShaderKeywordSet.Merge(groundShapeDetails.ShaderKeywordSet, surfaceDetail.UniformsWithKeywords.Keywords); var layerTriplet = triplet.Clone(); var oldPosition = layerTriplet.Position; layerTriplet.Position = new Vector3(oldPosition.x, oldPosition.y + layerIndex / 2000f, oldPosition.z); creationTemplatesList.Add( new Ring1GroundPieceCreationTemplate() { Name = $"TerrainElementLayer l:{layerIndex} ql:{_flatLod.SourceQuadLod} fl:{_flatLod.ScalarValue} wd {weldingDetails.WeldingIndex}", ParentGameObject = _parentObject, PieceMesh = meshDetails.Mesh, TransformTriplet = layerTriplet, ShaderName = surfaceDetail.ShaderName, ShaderKeywordSet = keywordsSet, Uniforms = pack, Modifier = weldingDetails.Modifier }); layerIndex--; } return(new GRingTerrainId() { ElementsIds = creationTemplatesList.Select(c => _orderGrabber.AddCreationOrder(c)).ToList() }); }
private async Task <GRingTerrainId> CreateTerrainAsync() { var triplet = _tripletProvider.ProvideTriplet(); var mesh = await _meshGeneratorUtProxy.AddOrder(() => PlaneGenerator.CreateFlatPlaneMesh(65, 65)); var creationTemplatesList = new List <Ring1GroundPieceCreationTemplate>(); int layerIndex = 0; UniformsPack pack = new UniformsPack(); pack.SetUniform("_LodLevel", _flatLod.ScalarValue); pack.SetUniform("_NodeId", LastId); var groundShapeDetails = await _groundShapeProvider.ProvideGroundTextureDetail(); _groundShapeToken = groundShapeDetails.GroundShapeToken; pack.MergeWith(groundShapeDetails.Uniforms); creationTemplatesList.Add( new Ring1GroundPieceCreationTemplate() { Name = $"TerrainElementLayer l:{layerIndex} fl:{_flatLod.ScalarValue}, X:{LastId++}", ParentGameObject = _parentObject, PieceMesh = mesh, TransformTriplet = triplet, ShaderName = "Custom/Terrain/DebugTerrainedLod", //ShaderName = "Custom/Terrain/Ring0", ShaderKeywordSet = groundShapeDetails.ShaderKeywordSet, Uniforms = pack, Modifier = new Ring1GroundPieceModifier() }); var toReturn = new GRingTerrainId() { ElementsIds = creationTemplatesList.Select(c => _orderGrabber.AddCreationOrder(c)).ToList() }; return(toReturn); }
public async Task <GRingGroundShapeDetail> ProvideGroundTextureDetail() { int flatLodLevel = _flatLod.ScalarValue; if (!_configuration.SettingPerFlatLod.ContainsKey(flatLodLevel)) { Preconditions.Fail("Unsupported lod level: " + flatLodLevel); } var setting = _configuration.SettingPerFlatLod[flatLodLevel]; TerrainCardinalResolution detailResolution = setting.DetailResolution; bool directNormalCalculation = setting.DirectNormalComputation; var queryElementDetails = new List <TerrainDescriptionQueryElementDetail>() { new TerrainDescriptionQueryElementDetail() { Resolution = detailResolution, Type = TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY }, }; //if (!directNormalCalculation) //we have to do it every time , as we need normals for spot updating! { queryElementDetails.Add( new TerrainDescriptionQueryElementDetail() { Resolution = detailResolution, Type = TerrainDescriptionElementTypeEnum.NORMAL_ARRAY } ); } var uniformsPack = new UniformsPack(); uniformsPack.SetUniform("_LodLevel", flatLodLevel); var terrainOutput = await _terrainShapeDb.Query(new TerrainDescriptionQuery() { QueryArea = _terrainDetailAreaPosition, RequestedElementDetails = queryElementDetails }); var heightmapTexture = terrainOutput.GetElementOfType(TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY); uniformsPack.SetTexture("_HeightmapTex", heightmapTexture.TokenizedElement.DetailElement.Texture.Texture); uniformsPack.SetUniform("_HeightmapUv", heightmapTexture.UvBase.ToVector4()); var normalAsTexture = terrainOutput.GetElementOfType(TerrainDescriptionElementTypeEnum.NORMAL_ARRAY); if (!directNormalCalculation) { uniformsPack.SetTexture("_NormalmapTex", normalAsTexture.TokenizedElement.DetailElement.Texture.Texture); uniformsPack.SetUniform("_NormalmapUv", normalAsTexture.UvBase.ToVector4()); } List <string> keywords = new List <string>(); if (directNormalCalculation) { keywords.Add("DYNAMIC_NORMAL_GENERATION"); } IGroundShapeToken token = null; if (_spotUpdater != null) //todo remove when tests over! { token = _spotUpdater.AddArea(new GroundShapeInfo() { TextureGlobalPosition = _terrainDetailAreaPosition, TextureCoords = new MyRectangle(heightmapTexture.UvBase), HeightmapResolution = detailResolution, }, new UpdatedTerrainTextures() { HeightTexture = heightmapTexture.TokenizedElement.DetailElement.Texture.Texture, NormalTexture = normalAsTexture.TokenizedElement.DetailElement.Texture.Texture, TextureGlobalPosition = heightmapTexture.TokenizedElement.DetailElement.DetailArea, TextureCoords = new MyRectangle(heightmapTexture.UvBase), }); } else { Debug.Log("T333 WARNING. SPOT UPDATER NOT SET. SHOUDL BE USED ONLY IN TESTING"); token = new DummyGroundShapeToken(); } return(new GRingGroundShapeDetail() { ShaderKeywordSet = new ShaderKeywordSet(keywords), Uniforms = uniformsPack, GroundShapeToken = token, HeightDetailOutput = heightmapTexture }); }