Esempio n. 1
0
        public HeightPyramidSegmentShapeGroup CreateGroup(HeightPyramidLevelTemplate pyramidLevelTemplate, HeightPyramidLevel level, GameObject pyramidRootGo)
        {
            var parentGO = new GameObject("ETerrainParent " + level);
            var center   = pyramidLevelTemplate.Center;

            parentGO.transform.localPosition = new Vector3(center.x, 0, center.y);

            var ringTemplateElementMesh = _meshGenerator.AddOrder(() =>
                                                                  PlaneGenerator.CreateETerrainSegmentMesh(_perLevelConfiguration.RingObjectMeshVertexLength.X, _perLevelConfiguration.RingObjectMeshVertexLength.Y))
                                          .Result; //todo
            var centerMesh = _meshGenerator.AddOrder(() =>
                                                     PlaneGenerator.CreateETerrainSegmentMesh(_perLevelConfiguration.CenterObjectMeshVertexLength.X, _perLevelConfiguration.CenterObjectMeshVertexLength.Y))
                             .Result; //todo

            var shapeMeshesToCombine = new List <CombineInstance>();

            foreach (var shapeTemplate in pyramidLevelTemplate.ShapeTemplates)
            {
                Mesh thisSegmentMesh = null;
                if (shapeTemplate.RingIndex == 0) //center
                {
                    thisSegmentMesh = centerMesh;
                }
                else
                {
                    thisSegmentMesh = ringTemplateElementMesh;
                }

                var trs = CreateTrsMatrixForShape(shapeTemplate);
                shapeMeshesToCombine.Add(new CombineInstance()
                {
                    transform = trs,
                    mesh      = thisSegmentMesh
                });
            }

            var finalMesh = _meshGenerator.AddOrder(() =>
            {
                var m = MeshGenerationUtils.CreateMeshAsSum(shapeMeshesToCombine);
                MeshGenerationUtils.RecalculateUvAsInPlane(m);
                return(m);
            }).Result; //TODO

            MeshGenerationUtils.SetYBoundsToInfinity(finalMesh);

            var mainObject = CreateShapeObject(finalMesh, "MainObject", center, pyramidLevelTemplate.FlatSize);

            mainObject.transform.SetParent(parentGO.transform);

            parentGO.transform.localScale = new Vector3(1, _commonConfiguration.YScale, 1);
            parentGO.transform.SetParent(pyramidRootGo.transform);
            return(new HeightPyramidSegmentShapeGroup()
            {
                CentralShape = mainObject,
                ParentGameObject = parentGO,
            });
        }
Esempio n. 2
0
        private GrassGroupsPlanter CreateGrassGroupsPlanter(OtherThreadExecutingLocation otherThreadExecutingLocation)
        {
            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBladeMesh(1);

            MeshGenerationUtils.SetYBoundsToInfinity(mesh);

            var instancingMaterial = _veConfiguration.ReferencedAssets.GrassMaterial;

            if (_materialCommonPack != null)
            {
                _materialCommonPack.SetToMaterial(instancingMaterial);
            }

            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.6f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            var gpuInstancerCommonData = new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms);

            gpuInstancerCommonData.CastShadows = _veConfiguration.GrassCastShadows;
            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                gpuInstancerCommonData,
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_Pointer", GpuInstancingUniformType.Float),
            })
                );

            var globalGpuInstancingContainer = _initializationFields.Retrive <GlobalGpuInstancingContainer>();
            var bucketId             = globalGpuInstancingContainer.CreateBucket(instancingContainer);
            var grassGroupsContainer = new GrassGroupsContainer(globalGpuInstancingContainer, bucketId);

            var grassPositionResolver = new SimpleRandomSamplerPositionResolver();

            var grassDetailInstancer = new GrassDetailInstancer();

            var designBodySpotUpdaterProxy = _initializationFields.Retrive <DesignBodySpotUpdaterProxy>();

            var mediatorSpotUpdater = new ListenerCenteredMediatorDesignBodyChangesUpdater(designBodySpotUpdaterProxy);

            IGrass2AspectsGenerator grassAspectGenerator;

            if (_veConfiguration.Mode == VegetationMode.Legacy)
            {
                grassAspectGenerator = new LegacyGrass2BladeAspectsGenerator();
            }
            else
            {
                grassAspectGenerator = new EVegetationGrass2BladeAspectsGenerator();
            }

            var grassGroupsPlanter = new GrassGroupsPlanter(
                grassDetailInstancer, grassPositionResolver,
                grassGroupsContainer,
                mediatorSpotUpdater,
                grassAspectGenerator,
                _veConfiguration.GrassTemplates,
                _veConfiguration.VegetationRepositioner);

            mediatorSpotUpdater.SetTargetChangesListener(new LambdaSpotPositionChangesListener(null, dict =>
            {
                otherThreadExecutingLocation.Execute(() =>
                {
                    foreach (var pair in dict)
                    {
                        grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value);
                    }
                    return(TaskUtils.EmptyCompleted());
                });
            }));

            var rootMediator = _initializationFields.Retrive <RootMediatorSpotPositionsUpdater>();

            rootMediator.AddListener(mediatorSpotUpdater);

            return(grassGroupsPlanter);
        }