private TerrainDetailGenerator CreateTerrainDetailGenerator( Texture mainTexture, UTTextureRendererProxy utTextureRendererProxy, CommonExecutorUTProxy commonExecutorUtProxy, UnityThreadComputeShaderExecutorObject computeShaderExecutorObject, ComputeShaderContainerGameObject containerGameObject) { var featureAppliers = new List <RankedTerrainFeatureApplier>(); if (_configuration.EngraveTerrainFeatures) { featureAppliers.AddRange(FinalTerrainFeatureAppliers.CreateFeatureAppliers( utTextureRendererProxy, containerGameObject, commonExecutorUtProxy, computeShaderExecutorObject )); } if (_configuration.EngraveRoadsInTerrain) { featureAppliers.Add(FinalTerrainFeatureAppliers.CreateRoadEngravingApplier(CreateRoadEngravingFeatureApplier())); } TerrainDetailGeneratorConfiguration generatorConfiguration = _configuration.TerrainDetailGeneratorConfiguration; TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize() { Texture = mainTexture, Size = new IntVector2(mainTexture.width, mainTexture.height) }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24)); TerrainDetailGenerator generator = new TerrainDetailGenerator(generatorConfiguration, utTextureRendererProxy, fullFundationData, featureAppliers, commonExecutorUtProxy); return(generator); }
public Grass2BakingBillboardClanGenerator( ComputeShaderContainerGameObject computeShaderContainer, UnityThreadComputeShaderExecutorObject shaderExecutorObject) { _computeShaderContainer = computeShaderContainer; _shaderExecutorObject = shaderExecutorObject; }
public static TerrainDetailGenerator CreateTerrainDetailGenerator( Texture mainTexture, UTTextureRendererProxy utTextureRendererProxy, CommonExecutorUTProxy commonExecutorUtProxy, UnityThreadComputeShaderExecutorObject computeShaderExecutorObject, ComputeShaderContainerGameObject containerGameObject) { var featureAppliers = TerrainDetailProviderDebugUtils.CreateFeatureAppliers(utTextureRendererProxy, containerGameObject, commonExecutorUtProxy, computeShaderExecutorObject); TerrainDetailGeneratorConfiguration generatorConfiguration = new TerrainDetailGeneratorConfiguration() { TerrainDetailImageSideDisjointResolution = 240 }; TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize() { Texture = mainTexture, Size = new IntVector2(mainTexture.width, mainTexture.height) }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24)); TerrainDetailGenerator generator = new TerrainDetailGenerator(generatorConfiguration, utTextureRendererProxy, fullFundationData, featureAppliers, commonExecutorUtProxy); return(generator); }
public WeldingExecutor(ComputeShaderContainerGameObject computeShaderContainer, UnityThreadComputeShaderExecutorObject shaderExecutorObject, Texture weldTexture) { _computeShaderContainer = computeShaderContainer; _shaderExecutorObject = shaderExecutorObject; _weldTexture = weldTexture; }
public void Start(ComputeShaderContainerGameObject computeShaderContainer) { var commonExecutor = new CommonExecutorUTProxy(); var shaderExecutorObject = new UnityThreadComputeShaderExecutorObject(); var updater = new DesignBodySpotUpdater(new DesignBodySpotChangeCalculator(computeShaderContainer, shaderExecutorObject, commonExecutor, HeightDenormalizer.Identity)); _designBodySpotUpdaterProxy = new DesignBodySpotUpdaterProxy(updater); updater.SetChangesListener(new LambdaSpotPositionChangesListener(null, dict => { foreach (var pair in dict) { _grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value); } })); _designBodySpotUpdaterProxy.StartThreading(() => { }); var meshGenerator = new GrassMeshGenerator(); var mesh = meshGenerator.GetGrassBladeMesh(1); var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/Grass.Instanced")); instancingMaterial.enableInstancing = true; var commonUniforms = new UniformsPack(); commonUniforms.SetUniform("_BendingStrength", 0.0f); commonUniforms.SetUniform("_WindDirection", Vector4.one); var instancingContainer = new GpuInstancingVegetationSubjectContainer( new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms), 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), }) ); _globalGpuInstancingContainer = new GlobalGpuInstancingContainer(); var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer); GrassGroupsContainer grassGroupsContainer = new GrassGroupsContainer(_globalGpuInstancingContainer, bucketId); IGrassPositionResolver grassPositionResolver = new SimpleRandomSamplerPositionResolver(); GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer(); _grassGroupsPlanter = new GrassGroupsPlanter( grassDetailInstancer, grassPositionResolver, grassGroupsContainer, _designBodySpotUpdaterProxy, new LegacyGrass2BladeAspectsGenerator(), GrassDebugUtils.TemplatesDictionary, Repositioner.Identity); }
public void Compute() { CommonExecutorUTProxy commonExecutor = new CommonExecutorUTProxy(); HabitatMapDbProxy habitatMapDbProxy = _gameInitializationFields.Retrive <HabitatMapDbProxy>(); ComputeShaderContainerGameObject computeShaderContainer = _gameInitializationFields.Retrive <ComputeShaderContainerGameObject>(); UnityThreadComputeShaderExecutorObject shaderExecutorObject = _gameInitializationFields.Retrive <UnityThreadComputeShaderExecutorObject>(); var templatesDict = _vegetationConfiguration.FloraDomainCreationTemplates; var floraConfiguration = _vegetationConfiguration.FloraConfiguration; var spatialDbConfiguration = _vegetationConfiguration.FloraDomainSpatialDbConfiguration; var dbsDict = new Dictionary <HabitatAndZoneType, ISpatialDb <FloraDomainIntensityArea> >(); foreach (var pair in templatesDict) { IStoredPartsGenerator <FloraDomainIntensityArea> partsGenerator = new FloraDomainIntensityGenerator(pair.Value, computeShaderContainer, shaderExecutorObject, commonExecutor, 1f, floraConfiguration); var spatialDb = new CacheingSpatialDb <FloraDomainIntensityArea>( new SpatialDb <FloraDomainIntensityArea>(partsGenerator, spatialDbConfiguration), spatialDbConfiguration); dbsDict[pair.Key] = spatialDb; } var floraDomainDb = new FloraDomainDbProxy(dbsDict); var biomeProvidersGenerators = _vegetationConfiguration.BiomeConfigurationsDict(floraDomainDb) .ToDictionary(c => c.Key, c => new BiomeProvidersFromHabitatGenerator(habitatMapDbProxy, c.Value)); var genralPlacer = new GeneralMultiDistrictPlacer( _vegetationConfiguration.GeneralMultiDistrictPlacerConfiguration, _gameInitializationFields.Retrive <TerrainShapeDbProxy>(), commonExecutor, biomeProvidersGenerators); var database = genralPlacer.Generate( _vegetationConfiguration.GenerationArea, _vegetationConfiguration.RankDependentSpeciesCharacteristics(), _vegetationConfiguration.GenerationCenter); var vegetationOnRoadRemover = new VegetationOnRoadRemover( _gameInitializationFields.Retrive <RoadDatabaseProxy>(), _vegetationConfiguration.VegetationOnRoadRemoverConfiguration ); var newDb = vegetationOnRoadRemover.RemoveCollidingTrees(database, _vegetationConfiguration.GenerationArea); //CreateDebugObjects(newDb.Subjects.ToDictionary(c => c.Key, c => c.Value.QueryAll())); VegetationDatabaseFileUtils.WriteToFileNonOverwrite( _pathsConfiguration.LoadingVegetationDatabaseDictionaryPath, newDb); }
public HabitatToGrassIntensityMapGenerator(ComputeShaderContainerGameObject computeShaderContainer, UnityThreadComputeShaderExecutorObject shaderExecutorObject, CommonExecutorUTProxy commonExecutor, HabitatToGrassIntensityMapGeneratorConfiguration configuration) { _computeShaderContainer = computeShaderContainer; _shaderExecutorObject = shaderExecutorObject; _configuration = configuration; _commonExecutor = commonExecutor; }
public void Start(ComputeShaderContainerGameObject ComputeShaderContainer) { IGrassIntensityMapProvider grassIntensityMapProvider = GrassGroupsGrowerDebugObject.CreateDebugIntensityMapProvider(); _planterUnderTest.Start(ComputeShaderContainer); GrassGroupsPlanter grassGroupsPlanter = _planterUnderTest.GrassGroupsPlanter; _grower = new GrassGroupsGrower(grassGroupsPlanter, grassIntensityMapProvider, new List <GrassType>() { GrassType.Debug1, GrassType.Debug2 }, Repositioner.Identity); }
public void FillTerrainDetailsCache(ComputeShaderContainerGameObject computeShaderContainer) { TaskUtils.SetGlobalMultithreading(false); _gameInitializationFields.SetField(computeShaderContainer); InitializeTerrainDb(true); var db = _gameInitializationFields.Retrive <ITerrainShapeDb>(); var queries = RecordingTerrainShapeDb.LoadQueriesFromFile(@"C:\inz\allQueries.json"); Debug.Log("AXXX + " + queries.Count); foreach (var aQuery in queries.Skip(3).Take(10)) { var xx = db.Query(aQuery).Wait(1000); } }
public void Compute(ComputeShaderContainerGameObject computeShaderContainer) { TaskUtils.SetGlobalMultithreading(false); _gameInitializationFields.SetField(computeShaderContainer); var msw = new MyStopWatch(); //var queries = RecordingTerrainShapeDb.LoadQueriesFromFile(@"C:\inz\allQueries.json"); //Debug.Log("H8: " + StringUtils.ToString(queries.Select(c => c.QueryArea))); //msw.StartSegment("TerrainDbInitialization"); //InitializeTerrainDb(true); //TestHeightNormalization(); //return; msw.StartSegment("PathPrecomputation"); var pathPrecomputation = new PathPrecomputation(_gameInitializationFields, _precomputationConfiguration, _filePathsConfiguration); //pathPrecomputation.Compute(); pathPrecomputation.Load(); msw.StartSegment("HabitatMapDbPrecomputation"); var habitatMapDbPrecomputation = new HabitatMapDbPrecomputation(_gameInitializationFields, _precomputationConfiguration, _filePathsConfiguration); habitatMapDbPrecomputation.Compute(); habitatMapDbPrecomputation.Load(); //msw.StartSegment("Ring1Precomputation"); //var ring1Precomputation = new Ring1Precomputation(_gameInitializationFields, _precomputationConfiguration, // _filePathsConfiguration); //ring1Precomputation.Compute(); //ring1Precomputation.Load(); //msw.StartSegment("VegetationDatabasePrecomputation"); //var vegetationDatabasePrecomputation = // new VegetationDatabasePrecomputation(_gameInitializationFields, _precomputationConfiguration, _filePathsConfiguration); //vegetationDatabasePrecomputation.Compute(); //msw.StartSegment("Grass2billboardsPrecomputation"); //var grass2BillboardsPrecomputation = new Grass2BillboardsPrecomputer(_gameInitializationFields, _filePathsConfiguration); ////grass2BillboardsPrecomputation.Compute(); //Debug.Log("L8 Precomputation time: "+msw.CollectResults()); }
public static ESurfacePatchProvider ConstructProvider(UltraUpdatableContainer updatableContainer, Dictionary <int, float> intensityPatternPixelsPerUnit, ComputeShaderContainerGameObject shaderContainerGO, int mipmapLevelToExtract, Dictionary <int, float> plateStampPixelsPerUnit) { var ring2ShaderRepository = Ring2PlateShaderRepository.Create(); TextureConcieverUTProxy conciever = new TextureConcieverUTProxy(); updatableContainer.Add(conciever); var ring2PatchesPainterUtProxy = new Ring2PatchesPainterUTProxy( new Ring2PatchesPainter( new Ring2MultishaderMaterialRepository(ring2ShaderRepository, Ring2ShaderNames.ShaderNames))); updatableContainer.Add(ring2PatchesPainterUtProxy); UTRing2PlateStamperProxy stamperProxy = new UTRing2PlateStamperProxy( new Ring2PlateStamper(new Ring2PlateStamperConfiguration() { PlateStampPixelsPerUnit = plateStampPixelsPerUnit }, shaderContainerGO)); updatableContainer.Add(stamperProxy); UTTextureRendererProxy textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(shaderContainerGO), new TextureRendererServiceConfiguration() { StepSize = new Vector2(500, 500) })); updatableContainer.Add(textureRendererProxy); CommonExecutorUTProxy commonExecutorUtProxy = new CommonExecutorUTProxy(); //todo updatableContainer.Add(commonExecutorUtProxy); Ring2PatchStamplingOverseerFinalizer patchStamperOverseerFinalizer = new Ring2PatchStamplingOverseerFinalizer(stamperProxy, textureRendererProxy, commonExecutorUtProxy); MipmapExtractor mipmapExtractor = new MipmapExtractor(textureRendererProxy); var patchesCreatorProxy = new GRing2PatchesCreatorProxy(CreateRing2PatchesCreator(updatableContainer, intensityPatternPixelsPerUnit)); return(new ESurfacePatchProvider(patchesCreatorProxy, patchStamperOverseerFinalizer, commonExecutorUtProxy, mipmapExtractor, mipmapLevelToExtract)); }
public TerrainShapeDbUnderTest(bool useTextureSavingToDisk = false, bool useCornerMerging = false, string terrainDetailFilePath = "C:\\unityCache\\", bool useTextureLoadingFromDisk = false) { CommonExecutorUTProxy commonExecutorUtProxy = new CommonExecutorUTProxy(); ComputeShaderContainerGameObject containerGameObject = GameObject.FindObjectOfType <ComputeShaderContainerGameObject>(); var globalHeightTexture = CreateGlobalHeightTexture(commonExecutorUtProxy); UTTextureRendererProxy textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(containerGameObject), new TextureRendererServiceConfiguration() { StepSize = new Vector2(400, 400) })); UnityThreadComputeShaderExecutorObject computeShaderExecutorObject = new UnityThreadComputeShaderExecutorObject(); var terrainDetailGenerator = Ring1DebugObjectV2.CreateTerrainDetailGenerator( globalHeightTexture, textureRendererProxy, commonExecutorUtProxy, computeShaderExecutorObject, containerGameObject); TerrainDetailCornerMerger merger = null; LateAssignFactory <BaseTerrainDetailProvider> detailProviderFactory = new LateAssignFactory <BaseTerrainDetailProvider>(); if (useCornerMerging) { merger = new TerrainDetailCornerMerger(detailProviderFactory, new TerrainDetailAlignmentCalculator(240), textureRendererProxy, new TextureConcieverUTProxy(), new CommonExecutorUTProxy(), new TerrainDetailCornerMergerConfiguration()); } var terrainDetailProvider = Ring1DebugObjectV2.CreateTerrainDetailProvider(terrainDetailGenerator, merger); _shapeDb = FETerrainShapeDbInitialization.CreateTerrainShapeDb(terrainDetailProvider, commonExecutorUtProxy , new TerrainDetailAlignmentCalculator(240), useCornerMerging, useTextureSavingToDisk, useTextureLoadingFromDisk , new TerrainDetailFileManager(terrainDetailFilePath, commonExecutorUtProxy)); var baseProvider = new FromTerrainDbBaseTerrainDetailProvider(_shapeDb); detailProviderFactory.Assign(baseProvider); terrainDetailGenerator.SetBaseTerrainDetailProvider(baseProvider); }
public void Start() { TaskUtils.SetGlobalMultithreading(false); ComputeShaderContainerGameObject containerGameObject = GameObject.FindObjectOfType <ComputeShaderContainerGameObject>(); UTTextureRendererProxy textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(containerGameObject), new TextureRendererServiceConfiguration() { StepSize = new Vector2(400, 400) })); var meshGeneratorUtProxy = new MeshGeneratorUTProxy(new MeshGeneratorService()); eTerrainHeightPyramidFacades = new List <ETerrainHeightPyramidFacade>() { StartTerrainThings(meshGeneratorUtProxy, textureRendererProxy, containerGameObject, new List <HeightPyramidLevel>() { HeightPyramidLevel.Top }), //StartTerrainThings(meshGeneratorUtProxy, textureRendererProxy, containerGameObject, // new List<HeightPyramidLevel>() {HeightPyramidLevel.Top, HeightPyramidLevel.Mid, HeightPyramidLevel.Bottom}) }; }
private ETerrainHeightPyramidFacade StartTerrainThings(MeshGeneratorUTProxy meshGeneratorUtProxy, UTTextureRendererProxy textureRendererProxy, ComputeShaderContainerGameObject containerGameObject, List <HeightPyramidLevel> startConfigurationHeightPyramidLevels) { var startConfiguration = ETerrainHeightPyramidFacadeStartConfiguration.DefaultConfiguration; //startConfiguration.HeightPyramidLevels = new List<HeightPyramidLevel>() {HeightPyramidLevel.Top}; startConfiguration.HeightPyramidLevels = startConfigurationHeightPyramidLevels; ETerrainHeightBuffersManager buffersManager = new ETerrainHeightBuffersManager(); var eTerrainHeightPyramidFacade = new ETerrainHeightPyramidFacade(buffersManager, meshGeneratorUtProxy, textureRendererProxy, startConfiguration); var perLevelTemplates = eTerrainHeightPyramidFacade.GenerateLevelTemplates(); var levels = startConfiguration.HeightPyramidLevels; buffersManager.InitializeBuffers(levels.ToDictionary(c => c, c => new EPyramidShaderBuffersGeneratorPerRingInput() { FloorTextureResolution = startConfiguration.CommonConfiguration.FloorTextureSize.X, //TODO i use only X, - works only for squares HeightMergeRanges = perLevelTemplates[c].PerRingTemplates.ToDictionary(k => k.Key, k => k.Value.HeightMergeRange), CeilSliceWorldSize = startConfiguration.PerLevelConfigurations[c].FloorTextureWorldSize.x, // TODO works only for square pyramids - i use width RingUvRanges = startConfiguration.CommonConfiguration.RingsUvRange }), startConfiguration.CommonConfiguration.MaxLevelsCount, startConfiguration.CommonConfiguration.MaxRingsPerLevelCount); var configuration = new FEConfiguration(new FilePathsConfiguration()); GlobalServicesProfileInfo servicesProfileInfo = new GlobalServicesProfileInfo(); var ultraUpdatableContainer = new UltraUpdatableContainer( configuration.SchedulerConfiguration, servicesProfileInfo, configuration.UpdatableContainerConfiguration); var updatableContainer = new UpdatableContainer(); var intensityPatternPixelsPerUnit = new Dictionary <int, float>() { { 1, 1 } }; int mipmapLevelToExtract = 2; var plateStampPixelsPerUnit = new Dictionary <int, float>() { { 1, 3 } }; var surfacePatchProvider = ESurfaceProviderInitializationHelper.ConstructProvider( ultraUpdatableContainer, intensityPatternPixelsPerUnit, containerGameObject, mipmapLevelToExtract, plateStampPixelsPerUnit); var surfaceTextureFormat = RenderTextureFormat.ARGB32; eTerrainHeightPyramidFacade.Start(perLevelTemplates, new Dictionary <EGroundTextureType, OneGroundTypeLevelTextureEntitiesGenerator>() { //{ // EGroundTextureType.SurfaceTexture, new OneGroundTypeLevelTextureEntitiesGenerator() // { // SegmentFillingListenerGeneratorFunc = (level) => // { // var floorTexture = EGroundTextureGenerator.GenerateEmptyGroundTexture(startConfiguration.CommonConfiguration.FloorTextureSize, // surfaceTextureFormat); // var segmentsPlacer = new ESurfaceSegmentPlacer(textureRendererProxy, floorTexture // , startConfiguration.CommonConfiguration.SlotMapSize, startConfiguration.CommonConfiguration.FloorTextureSize); // var pyramidLevelManager = new GroundLevelTexturesManager(startConfiguration.CommonConfiguration.SlotMapSize); // var segmentModificationManager = new SoleLevelGroundTextureSegmentModificationsManager(segmentsPlacer, pyramidLevelManager); // return new SegmentFillingListenerWithFloorTexture() // { // FloorTexture = floorTexture, // SegmentFillingListener = // new LambdaSegmentFillingListener( // (c) => // { // var segmentLength = startConfiguration.PerLevelConfigurations[level].BiggestShapeObjectInGroupLength; // var sap = c.SegmentAlignedPosition; // MyRectangle surfaceWorldSpaceRectangle = new MyRectangle(sap.X * segmentLength, sap.Y * segmentLength, // segmentLength, segmentLength); // var texturesPack = surfacePatchProvider.ProvideSurfaceDetailAsync(surfaceWorldSpaceRectangle, new FlatLod(1, 1)).Result; // if (texturesPack != null) // { // var mainTexture = texturesPack.MainTexture; // segmentModificationManager.AddSegmentAsync(mainTexture, c.SegmentAlignedPosition); // GameObject.Destroy(mainTexture); // } // //} // }, // (c) => { }, // (c) => { }) // }; // }, // } //} } ); Traveller.transform.position = new Vector3(startConfiguration.InitialTravellerPosition.x, 0, startConfiguration.InitialTravellerPosition.y); eTerrainHeightPyramidFacade.DisableLevelShapes(HeightPyramidLevel.Bottom); return(eTerrainHeightPyramidFacade); }
public void Start() { UnityEngine.Random.InitState(412); TaskUtils.SetGlobalMultithreading(false); UnityThreadComputeShaderExecutorObject shaderExecutorObject = new UnityThreadComputeShaderExecutorObject(); ComputeShaderContainerGameObject containerGameObject = GameObject.FindObjectOfType <ComputeShaderContainerGameObject>(); UTTextureRendererProxy textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(containerGameObject), new TextureRendererServiceConfiguration() { StepSize = new Vector2(400, 400) })); var meshGeneratorUtProxy = new MeshGeneratorUTProxy(new MeshGeneratorService()); var startConfiguration = ETerrainHeightPyramidFacadeStartConfiguration.DefaultConfiguration; ETerrainHeightBuffersManager buffersManager = new ETerrainHeightBuffersManager(); _eTerrainHeightPyramidFacade = new ETerrainHeightPyramidFacade(buffersManager, meshGeneratorUtProxy, textureRendererProxy, startConfiguration); var perLevelTemplates = _eTerrainHeightPyramidFacade.GenerateLevelTemplates(); var levels = startConfiguration.PerLevelConfigurations.Keys; var ePyramidShaderBuffersGeneratorPerRingInputs = levels.ToDictionary(c => c, c => new EPyramidShaderBuffersGeneratorPerRingInput() { FloorTextureResolution = startConfiguration.CommonConfiguration.FloorTextureSize.X, //TODO i use only X, - works only for squares HeightMergeRanges = perLevelTemplates[c].PerRingTemplates.ToDictionary(k => k.Key, k => k.Value.HeightMergeRange), CeilSliceWorldSize = startConfiguration.PerLevelConfigurations[c].FloorTextureWorldSize.x, // TODO works only for square pyramids - i use width RingUvRanges = startConfiguration.CommonConfiguration.RingsUvRange }); buffersManager.InitializeBuffers(ePyramidShaderBuffersGeneratorPerRingInputs, startConfiguration.CommonConfiguration.MaxLevelsCount, startConfiguration.CommonConfiguration.MaxRingsPerLevelCount); _eTerrainHeightPyramidFacade.Start(perLevelTemplates, new Dictionary <EGroundTextureType, OneGroundTypeLevelTextureEntitiesGenerator>() { //{ // EGroundTextureType.HeightMap, new OneGroundTypeLevelTextureEntitiesGenerator() // { // SegmentFillingListenerGeneratorFunc = (level) => // { // var floorTexture = // EGroundTextureGenerator.GenerateEmptyGroundTexture(startConfiguration.CommonConfiguration.FloorTextureSize, // startConfiguration.CommonConfiguration.HeightTextureFormat); // var segmentsPlacer = new ESurfaceSegmentPlacer(textureRendererProxy, floorTexture // , startConfiguration.CommonConfiguration.SlotMapSize, startConfiguration.CommonConfiguration.FloorTextureSize); // var pyramidLevelManager = new GroundLevelTexturesManager(startConfiguration.CommonConfiguration.SlotMapSize); // var segmentModificationManager = new SoleLevelGroundTextureSegmentModificationsManager(segmentsPlacer, pyramidLevelManager); // return new SegmentFillingListenerWithFloorTexture() // { // FloorTexture = floorTexture, // SegmentFillingListener = new LambdaSegmentFillingListener( // (c) => // { // var segmentTexture = ETerrainIntegrationMultipleSegmentsDEO.CreateDummySegmentTexture(c, level); // segmentModificationManager.AddSegmentAsync(segmentTexture, c.SegmentAlignedPosition); // }, // (c) => { }, // (c) => { } // ) // }; // }, // } //} } ); //_eTerrainHeightPyramidFacade.DisableShapes(); _eTerrainHeightPyramidFacade.DisableLevelShapes(HeightPyramidLevel.Bottom); Traveller.transform.position = new Vector3(startConfiguration.InitialTravellerPosition.x, 0, startConfiguration.InitialTravellerPosition.y); var ePropLocationConfiguration = new EPropElevationConfiguration(); EPropConstantPyramidParameters ePropConstantPyramidParameters = new EPropConstantPyramidParameters() { LevelsCount = startConfiguration.HeightPyramidLevels.Count, RingsPerLevelCount = startConfiguration.CommonConfiguration.MaxRingsPerLevelCount, //TODO parametrize HeightScale = startConfiguration.CommonConfiguration.YScale }; _elevationManager = new EPropElevationManager(new CommonExecutorUTProxy(), shaderExecutorObject, ePropLocationConfiguration, ePropConstantPyramidParameters); var heightFloorTextureArray = _eTerrainHeightPyramidFacade.FloorTextureArrays.Where(c => c.TextureType == EGroundTextureType.HeightMap).Select(c => c.Texture).First(); var initializedBuffers = _elevationManager.Initialize(buffersManager.PyramidPerFrameParametersBuffer, buffersManager.EPyramidConfigurationBuffer, heightFloorTextureArray); var ePropLocaleBuffer = initializedBuffers.EPropLocaleBuffer; var ePropIdsBuffer = initializedBuffers.EPropIdsBuffer; _dummyObjectsDisplayer = new EPropDummyObjectsDisplayer(ePropLocationConfiguration.ScopeLength, ePropLocaleBuffer, ePropIdsBuffer, FindObjectOfType <BufferReloaderRootGO>()); _dummyObjectsDisplayer.Start(); _dummyObjectsInstancingDisplayer = new EPropDummyObjectsInstancingDisplayer(DebugMesh, DebugMeshMaterial); _dummyObjectsInstancingDisplayer.Start(); _dummyObjectsInstancingDisplayer.SetLocaleBuffers(ePropLocaleBuffer, ePropIdsBuffer, ePropLocationConfiguration.ScopeLength); _sectorAreasDisplayer = new EPropDebugSectorAreasDisplayer(); _sectorAreasDisplayer.Start(); _mergeRingsDisplayer = new EPropDebugMergeRingsDisplayer(); _mergeRingsDisplayer.Start(); var levelWorldSizes = startConfiguration.PerLevelConfigurations.ToDictionary(c => c.Key, c => c.Value.FloorTextureWorldSize); var ringMergeRanges = perLevelTemplates.ToDictionary(c => c.Key, c => c.Value.PerRingTemplates.ToDictionary(k => k.Key, k => k.Value.HeightMergeRange)); _ePropHotAreaSelector = new EPropHotAreaSelector(levelWorldSizes, ringMergeRanges); _elevationManager.DebugInitializeSectors(new MyRectangle(-200, -200, 400, 400)); }
public static UltraUpdatableContainer InitializeFinalElements(FEConfiguration configuration, ComputeShaderContainerGameObject containerGameObject, GameInitializationFields gameInitializationFields, Dictionary <int, Ring2RegionsDbGeneratorConfiguration> ring2RegionsDatabasesConfiguration = null , bool initializeLegacyDesignBodySpotUpdater = false) { TaskUtils.SetGlobalMultithreading(configuration.Multithreading); return(TaskUtils.ExecuteFunctionWithOverridenMultithreading(true, () => { var servicesProfileInfo = new GlobalServicesProfileInfo(); gameInitializationFields.SetField(servicesProfileInfo); var ultraUpdatableContainer = new UltraUpdatableContainer( configuration.SchedulerConfiguration, servicesProfileInfo, configuration.UpdatableContainerConfiguration); configuration.TerrainShapeDbConfiguration.UseTextureSavingToDisk = true; gameInitializationFields.SetField(containerGameObject); gameInitializationFields.SetField(configuration.Repositioner); gameInitializationFields.SetField(configuration.HeightDenormalizer); var initializingHelper = new FEInitializingHelper(gameInitializationFields, ultraUpdatableContainer, configuration); initializingHelper.InitializeUTService(new TextureConcieverUTProxy()); initializingHelper.InitializeUTService(new UnityThreadComputeShaderExecutorObject()); initializingHelper.InitializeUTService(new CommonExecutorUTProxy()); initializingHelper.CreatePathProximityTextureDb(); if (initializeLegacyDesignBodySpotUpdater) { initializingHelper.InitializeDesignBodySpotUpdater(); } initializingHelper.InitializeUTRendererProxy(); initializingHelper.InitializeUTService(new MeshGeneratorUTProxy(new MeshGeneratorService())); if (ring2RegionsDatabasesConfiguration != null) { initializingHelper.InitializeComplexRing2RegionsDatabase(ring2RegionsDatabasesConfiguration); } else { initializingHelper.InitializeMonoliticRing2RegionsDatabase(); } //var finalTerrainInitialization = new FinalTerrainInitialization(_ultraUpdatableContainer, _gameInitializationFields, _configuration, FeGRingConfiguration); //finalTerrainInitialization.Start(); initializingHelper.InitializeGlobalInstancingContainer(); //var finalVegetation = new FinalVegetation(_gameInitializationFields, _ultraUpdatableContainer, VegetationConfiguration); //finalVegetation.Start(); return ultraUpdatableContainer; })); }
public TAMSoleImagesPack GenerateTamPack(TAMPackGenerationConfiguration configuration, bool generateDebugPlates, ComputeShaderContainerGameObject shaderContainerGameObject) { var tones = configuration.Tones; var levels = configuration.Levels; var tonesCount = tones.Count; var levelsCount = levels.Count; var templateGenerator = new TAMTemplateGenerator( new PoissonTAMImageDiagramGenerator( new TAMPoissonDiskSampler(), new StrokesGenerator(configuration.StrokesGeneratorConfiguration), configuration.PoissonTamImageDiagramGeneratorConfiguration) ); var template = templateGenerator.Generate(new TAMTemplateSpecification() { Tones = tones, MipmapLevels = levels }); var margin = configuration.Margin; var smallestLevelSoleImageResolution = configuration.SmallestLevelSoleImageResolution; var renderer = new TAMDeckRenderer( Image.FromFile(configuration.StrokeImagePath), Image.FromFile(configuration.BlankImagePath), new TAMDeckRendererConfiguration() { SoleImagesResolutionPerLevel = levels .Select((level, i) => new { level, i }) .ToDictionary(c => c.level, c => c.i) .ToDictionary(pair => pair.Key, pair => (smallestLevelSoleImageResolution * Mathf.Pow(2, pair.Value)).ToIntVector()), Margin = margin, StrokeHeightMultiplierPerLevel = levels .Select((level, i) => new { level, i }) .ToDictionary(c => c.level, c => c.i) .ToDictionary(pair => pair.Key, pair => configuration.StrokeHeightMultiplierForZeroLevel / Mathf.Pow(2, pair.Value)) }); var deck = renderer.Render(template); var wrapper = new TAMMarginsWrapper(new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(shaderContainerGameObject), new TextureRendererServiceConfiguration() { StepSize = configuration.RendererOneStepSize })), new TAMMarginsWrapperConfiguration() { Margin = margin, }); for (int toneIndex = 0; toneIndex < tonesCount; toneIndex++) { for (int levelIndex = 0; levelIndex < levelsCount; levelIndex++) { var image = deck.Columns[tones[toneIndex]][levels[levelIndex]]; var soleTexture = wrapper.WrapTexture(TAMUtils.ImageToTexture2D(image)); var strokesCount = template.Columns[tones[toneIndex]][levels[levelIndex]].Strokes.Count; if (generateDebugPlates) { CreateTexturedPlate(soleTexture, 11f * new Vector2(toneIndex, levelIndex), "Tone " + toneIndex + " Level " + levelIndex + " Count" + strokesCount); } } } var soleImagesPack = new TAMSoleImagesPack(deck.Columns.ToDictionary( c => c.Key, c => c.Value.ToDictionary( k => k.Key, k => wrapper.WrapTexture(TAMUtils.ImageToTexture2D(k.Value))))); return(soleImagesPack); }
public void Start(ComputeShaderContainerGameObject computeShaderContainer) { var commonExecutor = new CommonExecutorUTProxy(); var shaderExecutorObject = new UnityThreadComputeShaderExecutorObject(); var updater = new DesignBodySpotUpdater(new DesignBodySpotChangeCalculator(computeShaderContainer, shaderExecutorObject, commonExecutor, HeightDenormalizer.Identity)); _designBodySpotUpdaterProxy = new DesignBodySpotUpdaterProxy(updater); updater.SetChangesListener(new LambdaSpotPositionChangesListener(null, dict => { foreach (var pair in dict) { _grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value); } })); _designBodySpotUpdaterProxy.StartThreading(() => { }); var meshGenerator = new GrassMeshGenerator(); var mesh = meshGenerator.GetGrassBillboardMesh(0, 1); var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/GrassBushBillboard.Instanced")); instancingMaterial.enableInstancing = true; /// CLAN var billboardsFileManger = new Grass2BillboardClanFilesManager(); var clan = billboardsFileManger.Load(@"C:\inz\billboards\", new IntVector2(256, 256)); var singleToDuo = new Grass2BakingBillboardClanGenerator(computeShaderContainer, shaderExecutorObject); var bakedClan = singleToDuo.GenerateBakedAsync(clan).Result; /// var commonUniforms = new UniformsPack(); commonUniforms.SetUniform("_BendingStrength", 0.0f); commonUniforms.SetUniform("_WindDirection", Vector4.one); commonUniforms.SetTexture("_DetailTex", bakedClan.DetailTextureArray); commonUniforms.SetTexture("_BladeSeedTex", bakedClan.BladeSeedTextureArray); var instancingContainer = new GpuInstancingVegetationSubjectContainer( new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms), 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("_ArrayTextureIndex", GpuInstancingUniformType.Float), }) ); _globalGpuInstancingContainer = new GlobalGpuInstancingContainer(); var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer); GrassGroupsContainer grassGroupsContainer = new GrassGroupsContainer(_globalGpuInstancingContainer, bucketId); IGrassPositionResolver grassPositionResolver = new PoissonDiskSamplerPositionResolver(new MyRange(1.5f * 0.4f * 10, 10 * 2 * 1.3f)); //IGrassPositionResolver grassPositionResolver = new SimpleRandomSamplerPositionResolver(); GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer(); _grassGroupsPlanter = new GrassGroupsPlanter( grassDetailInstancer, grassPositionResolver, grassGroupsContainer, _designBodySpotUpdaterProxy, new Grass2BushAspectsGenerator(bakedClan), //todo! GrassDebugUtils.BushTemplates, Repositioner.Identity); }
public static List <RankedTerrainFeatureApplier> CreateFeatureAppliers( UTTextureRendererProxy utTextureRendererProxy, ComputeShaderContainerGameObject computeShaderContainerGameObject, CommonExecutorUTProxy commonExecutor, UnityThreadComputeShaderExecutorObject threadComputeShaderExecutorObject) { var toReturn = new List <RankedTerrainFeatureApplier>() { new RankedTerrainFeatureApplier() { Rank = 1, Applier = new RandomNoiseTerrainFeatureApplier(utTextureRendererProxy, commonExecutor, new Dictionary <TerrainCardinalResolution, RandomNoiseTerrainFeatureApplierConfiguration> { { TerrainCardinalResolution.MIN_RESOLUTION, new RandomNoiseTerrainFeatureApplierConfiguration() { DetailResolutionMultiplier = 1, NoiseStrengthMultiplier = 1 } }, { TerrainCardinalResolution.MID_RESOLUTION, new RandomNoiseTerrainFeatureApplierConfiguration() { DetailResolutionMultiplier = 8, NoiseStrengthMultiplier = 0.45f } }, { TerrainCardinalResolution.MAX_RESOLUTION, new RandomNoiseTerrainFeatureApplierConfiguration() { DetailResolutionMultiplier = 8 * 8, NoiseStrengthMultiplier = 4.7f * 0.45f / 9f //todo CHANGE IT !! } }, }), AvalibleResolutions = new List <TerrainCardinalResolution>() { TerrainCardinalResolution.MIN_RESOLUTION, TerrainCardinalResolution.MID_RESOLUTION, TerrainCardinalResolution.MAX_RESOLUTION, } }, new RankedTerrainFeatureApplier() { Rank = 2, Applier = new DiamondSquareTerrainFeatureApplier( new RandomProviderGenerator(123), commonExecutor, utTextureRendererProxy, new Dictionary <TerrainCardinalResolution, DiamondSquareTerrainFeatureApplierConfiguration> { { TerrainCardinalResolution.MIN_RESOLUTION, new DiamondSquareTerrainFeatureApplierConfiguration { DiamondSquareWorkingArrayLength = 32, DiamondSquareWeight = 0.012f } }, { TerrainCardinalResolution.MID_RESOLUTION, new DiamondSquareTerrainFeatureApplierConfiguration { DiamondSquareWorkingArrayLength = 32, DiamondSquareWeight = 0.0025f * 1.3f } }, { TerrainCardinalResolution.MAX_RESOLUTION, new DiamondSquareTerrainFeatureApplierConfiguration { DiamondSquareWorkingArrayLength = 32, DiamondSquareWeight = 0.0003f } }, }), AvalibleResolutions = new List <TerrainCardinalResolution>() { TerrainCardinalResolution.MIN_RESOLUTION, TerrainCardinalResolution.MID_RESOLUTION, TerrainCardinalResolution.MAX_RESOLUTION, } }, new RankedTerrainFeatureApplier() { Rank = 3, Applier = new ThermalErosionTerrainFeatureApplier(computeShaderContainerGameObject, threadComputeShaderExecutorObject, commonExecutor, new Dictionary <TerrainCardinalResolution, ThermalErosionTerrainFeatureApplierConfiguration> { { TerrainCardinalResolution.MIN_RESOLUTION, new ThermalErosionTerrainFeatureApplierConfiguration { } }, { TerrainCardinalResolution.MID_RESOLUTION, new ThermalErosionTerrainFeatureApplierConfiguration { TParam = 0.001f / 2.3f, CParam = 0.06f } }, }), AvalibleResolutions = new List <TerrainCardinalResolution>() { TerrainCardinalResolution.MIN_RESOLUTION, TerrainCardinalResolution.MID_RESOLUTION } }, new RankedTerrainFeatureApplier() { Rank = 4, Applier = new HydraulicErosionTerrainFeatureApplier(computeShaderContainerGameObject, threadComputeShaderExecutorObject, new Dictionary <TerrainCardinalResolution, HydraulicEroderConfiguration>() { { TerrainCardinalResolution.MIN_RESOLUTION, new HydraulicEroderConfiguration() { StepCount = 20, kr_ConstantWaterAddition = 0.000002f, // 0.0001f, ks_GroundToSedimentFactor = 1f, ke_WaterEvaporationFactor = 0.05f, kc_MaxSedimentationFactor = 0.8f, } }, { TerrainCardinalResolution.MID_RESOLUTION, new HydraulicEroderConfiguration() { StepCount = 20, kr_ConstantWaterAddition = 0.000002f, // 0.0001f, ks_GroundToSedimentFactor = 1f, ke_WaterEvaporationFactor = 0.05f, kc_MaxSedimentationFactor = 0.8f / 2f, } }, { TerrainCardinalResolution.MAX_RESOLUTION, new HydraulicEroderConfiguration() { StepCount = 20, kr_ConstantWaterAddition = 0.0000035f, // 0.0001f, ks_GroundToSedimentFactor = 1f, ke_WaterEvaporationFactor = 0.05f, kc_MaxSedimentationFactor = 0.8f / 4f, } } }), AvalibleResolutions = new List <TerrainCardinalResolution>() { TerrainCardinalResolution.MIN_RESOLUTION, TerrainCardinalResolution.MID_RESOLUTION, TerrainCardinalResolution.MAX_RESOLUTION, } }, new RankedTerrainFeatureApplier() { Rank = 5, Applier = new TweakedThermalErosionTerrainFeatureApplier(computeShaderContainerGameObject, threadComputeShaderExecutorObject, new Dictionary <TerrainCardinalResolution, TweakedThermalErosionTerrainFeatureApplierConfiguration> { { TerrainCardinalResolution.MIN_RESOLUTION, new TweakedThermalErosionTerrainFeatureApplierConfiguration() { } }, { TerrainCardinalResolution.MID_RESOLUTION, new TweakedThermalErosionTerrainFeatureApplierConfiguration() { TParam = 0.001f, CParam = 0.008f } }, { TerrainCardinalResolution.MAX_RESOLUTION, new TweakedThermalErosionTerrainFeatureApplierConfiguration() { TParam = 0.001f, CParam = 0.008f } }, }), AvalibleResolutions = new List <TerrainCardinalResolution>() { TerrainCardinalResolution.MIN_RESOLUTION, TerrainCardinalResolution.MID_RESOLUTION, TerrainCardinalResolution.MAX_RESOLUTION, } }, }; return(toReturn); }
public TamIdSoleImagesPack GenerateTamPack(TamIdPackGenerationConfiguration configuration, bool generateDebugPlates, ComputeShaderContainerGameObject shaderContainerGameObject) { var tones = configuration.Tones; var levels = configuration.Levels; var templateGenerator = new TAMTemplateGenerator( new PoissonTAMImageDiagramGenerator( new TAMPoissonDiskSampler(), new StrokesGenerator(configuration.StrokesGeneratorConfiguration), configuration.PoissonTamImageDiagramGeneratorConfiguration) ); var template = templateGenerator.Generate(new TAMTemplateSpecification() { Tones = tones, MipmapLevels = levels }); var margin = configuration.Margin; var smallestLevelSoleImageResolution = configuration.SmallestLevelSoleImageResolution; Debug.Log("XXXy: " + configuration.StrokeImagePath); var a1 = Image.FromFile(configuration.StrokeImagePath); var a2 = Image.FromFile(configuration.BlankImagePath); var renderer = new TamIdDeckRenderer( Image.FromFile(configuration.StrokeImagePath), Image.FromFile(configuration.BlankImagePath), new TAMDeckRendererConfiguration() { UseSmoothAlpha = configuration.UseSmoothAlpha, UseDithering = configuration.UseDithering, SoleImagesResolutionPerLevel = levels .Select((level, i) => new { level, i }) .ToDictionary(c => c.level, c => c.i) .ToDictionary(pair => pair.Key, pair => (smallestLevelSoleImageResolution * Mathf.Pow(2, pair.Value)).ToIntVector()), Margin = margin, StrokeHeightMultiplierPerLevel = levels .Select((level, i) => new { level, i }) .ToDictionary(c => c.level, c => c.i) .ToDictionary(pair => pair.Key, pair => configuration.StrokeHeightMultiplierForZeroLevel / Mathf.Pow(2, pair.Value)) }, configuration.LayersCount); var deck = renderer.Render(template); var wrapper = new TAMMarginsWrapper(new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(shaderContainerGameObject), new TextureRendererServiceConfiguration() { StepSize = configuration.RendererOneStepSize })), new TAMMarginsWrapperConfiguration() { Margin = margin, }); var soleImagesPack = new TamIdSoleImagesPack(deck.Columns.ToDictionary( c => c.Key, c => c.Value.ToDictionary( k => k.Key, k => { var x1 = k.Value.Select(r => wrapper.WrapTexture(TAMUtils.ImageToTexture2D(r))).ToList(); return(x1); }))); deck.DisposeImages(); return(soleImagesPack); }