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, }); }
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); }