Esempio n. 1
0
        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()
            });
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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
            });
        }