public void Update() { var newPosition = Camera.main.transform.position; if (!_once) { var msw = new MyStopWatch(); msw.StartSegment("Starting segment."); _once = true; _vegetationRuntimeManagementProxy.Start(newPosition); _vegetationRuntimeManagementProxy.StartThreading(); //_globalInstancingContainer.StartThread(); _debugGrassGroupsGrowerUnderTest.FinalizeStart(); Debug.Log("L8: segment " + msw.CollectResults()); } else { //_globalInstancingContainer.DrawFrame(); _vegetationRuntimeManagementProxy.AddUpdate(newPosition); const int maxMsPerFrame = 4000; //_globalInstancingContainer.FinishUpdateBatch(); } _debugGrassGroupsGrowerUnderTest.Update(); }
private void StartBushVegetation() { var singleGenerationArea = _veConfiguration.BushSingleGenerationArea; var positionsProvider = new GrassVegetationSubjectsPositionsGenerator( new GrassVegetationSubjectsPositionsGenerator. GrassVegetationSubjectsPositionsGeneratorConfiguration() { PositionsGridSize = singleGenerationArea }); var grassIntensityDbProxy = _initializationFields.Retrive <Grass2IntensityDbProxy>(); OtherThreadExecutingLocation otherThreadExecutingLocation = new OtherThreadExecutingLocation(); var planter = CreateBushGroupsPlanter(otherThreadExecutingLocation); GrassGroupsGrower grassGroupsGrower = new GrassGroupsGrower(planter, grassIntensityDbProxy, _veConfiguration.SupportedGrassTypes, _veConfiguration.GrassPlantingCorrectionRepositioner); Grass2RuntimeManager grass2RuntimeManager = new Grass2RuntimeManager(grassGroupsGrower, new Grass2RuntimeManager.Grass2RuntimeManagerConfiguration() { GroupSize = singleGenerationArea }); var vegetationSubjectsChangesListener = new Grass2RuntimeManagerProxy(grass2RuntimeManager); otherThreadExecutingLocation.SetExecutingTarget(vegetationSubjectsChangesListener); ////// var runtimeManagement = new VegetationRuntimeManagement( positionsProvider: positionsProvider, vegetationSubjectsChangesListener: vegetationSubjectsChangesListener, visibleEntitiesContainer: new VegetationSubjectsVisibleEntitiesContainer(), configuration: _veConfiguration.BushVegetationRuntimeManagementConfiguration); var vegetationRuntimeManagementProxy = new VegetationRuntimeManagementProxy(runtimeManagement); var repositioner = _veConfiguration.VegetationRepositioner; _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable() { StartCameraField = (camera) => { vegetationRuntimeManagementProxy.StartThreading(); var newPosition = repositioner.InvMove(camera.Position); vegetationRuntimeManagementProxy.Start(newPosition); }, UpdateCameraField = (camera) => { var newPosition = repositioner.InvMove(camera.Position); vegetationRuntimeManagementProxy.AddUpdate(newPosition); vegetationRuntimeManagementProxy.SynchronicUpdate(newPosition); }, }); _ultraUpdatableContainer.AddOtherThreadProxy(vegetationSubjectsChangesListener); }
private void StartGrassRuntimeManagmentSource() { var positionsGenerator = new GrassVegetationSubjectsPositionsGenerator(_veConfiguration.GrassVegetationSubjectsPositionsGeneratorConfiguration); var grassIntensityDbProxy = _initializationFields.Retrive <Grass2IntensityDbProxy>(); var otherThreadExecutingLocation = new OtherThreadExecutingLocation(); var planter = CreateGrassGroupsPlanter(otherThreadExecutingLocation); var grower = new GrassGroupsGrower(planter, grassIntensityDbProxy, _veConfiguration.SupportedGrassTypes, _veConfiguration.GrassPlantingCorrectionRepositioner); var grass2RuntimeManager = new Grass2RuntimeManager(grower, _veConfiguration.Grass2RuntimeManagerConfiguration); var grass2RuntimeManagerProxy = new Grass2RuntimeManagerProxy(grass2RuntimeManager); otherThreadExecutingLocation.SetExecutingTarget(grass2RuntimeManagerProxy); _ultraUpdatableContainer.AddOtherThreadProxy(grass2RuntimeManagerProxy); var runtimeManagement = new VegetationRuntimeManagement( positionsProvider: positionsGenerator, vegetationSubjectsChangesListener: grass2RuntimeManagerProxy, visibleEntitiesContainer: new VegetationSubjectsVisibleEntitiesContainer(), configuration: _veConfiguration.Grass2VegetationRuntimeManagementConfiguration); var vegetationRuntimeManagementProxy = new VegetationRuntimeManagementProxy(runtimeManagement); var queryRepositioner = _veConfiguration.VegetationRepositioner; _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable() { StartCameraField = (camera) => { vegetationRuntimeManagementProxy.StartThreading(); var position = camera.Position; vegetationRuntimeManagementProxy.Start(queryRepositioner.InvMove(position)); }, UpdateCameraField = (camera) => { var position = camera.Position; vegetationRuntimeManagementProxy.AddUpdate(queryRepositioner.InvMove(position)); vegetationRuntimeManagementProxy.SynchronicUpdate(queryRepositioner.InvMove(position)); }, }); }
private void InitializeBushObjectsDb(List <VegetationSubjectEntity> smallDb, ForgingVegetationSubjectInstanceContainerProxy forgingContainerProxy) { var repositioner = _veConfiguration.VegetationRepositioner; var supportedSpecies = _veConfiguration.SupportedLeadingBushSpecies; var speciesChanger = new VegetationSpeciesRandomChanger(_veConfiguration.SpeciesChangingList, 661); //todo! var filteredEntities = smallDb .Where(c => supportedSpecies.Contains(c.Detail.SpeciesEnum)) .Select(c => speciesChanger.ChangeSpecies(c)) .Where(c => _veConfiguration.SupportedBushSpecies.Contains(c.Detail.SpeciesEnum)); var quadtree = new Quadtree <VegetationSubjectEntity>(); foreach (var entity in filteredEntities) { quadtree.Insert(MyNetTopologySuiteUtils.ToPointEnvelope(entity.Position2D), entity); } var positionsProvider = new VegetationSubjectsPositionsDatabase(quadtree); var runtimeManagement = new VegetationRuntimeManagement( positionsProvider: positionsProvider, vegetationSubjectsChangesListener: forgingContainerProxy, visibleEntitiesContainer: new VegetationSubjectsVisibleEntitiesContainer(), configuration: _veConfiguration.BushObjectsVegetationRuntimeManagementConfiguration); var vegetationRuntimeManagementProxy = new VegetationRuntimeManagementProxy(runtimeManagement); _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable() { StartCameraField = (camera) => { vegetationRuntimeManagementProxy.StartThreading(); var position = camera.Position; vegetationRuntimeManagementProxy.Start(repositioner.InvMove(position)); }, UpdateCameraField = (camera) => { var position = camera.Position; vegetationRuntimeManagementProxy.AddUpdate(repositioner.InvMove(position)); vegetationRuntimeManagementProxy.SynchronicUpdate(repositioner.InvMove(position)); }, }); }
private void StartTreesRuntimeManagment() { var globalInstancingContainer = _initializationFields.Retrive <GlobalGpuInstancingContainer>(); var representationContainer = new DesignBodyRepresentationContainer(); var instanceBucketsContainer = new DesignBodyInstanceBucketsContainer(globalInstancingContainer); var quadBillboardMesh = GameObject.CreatePrimitive(PrimitiveType.Quad).GetComponent <MeshFilter>().mesh; IDesignBodyRepresentationInstanceCombinationProvider combinationProvider; if (_veConfiguration.Mode == VegetationMode.Legacy) { var gShifter = new GTreeDetailProviderShifter(new DetailProviderRepository(), quadBillboardMesh); var treeFileManager = new TreeFileManager(new TreeFileManagerConfiguration() { WritingTreeCompletedClanDirectory = _veConfiguration.TreeCompletedClanDirectiory }); combinationProvider = new GDesignBodyRepresentationInstanceCombinationProvider(treeFileManager, gShifter); } else { var eVegetationShifter = new EVegetationDetailProviderShifter( _veConfiguration.ShaderNames, new DetailProviderRepository(), quadBillboardMesh, _veConfiguration.ReferencedAssets, _materialCommonPack); combinationProvider = new EVegetationDesignBodyRepresentationInstanceCombinationProvider(new TreePrefabManager(), eVegetationShifter, _veConfiguration.ReferencedAssets); } foreach (var pair in _veConfiguration.ShiftingConfigurations.Where(c => _veConfiguration.SupportedVegetationSpecies.Contains(c.Key))) { var clanRepresentations = combinationProvider.CreateRepresentations(pair.Value, pair.Key); representationContainer.InitializeLists(clanRepresentations); instanceBucketsContainer.InitializeLists(clanRepresentations); } var designBodySpotUpdaterProxy = _initializationFields.Retrive <DesignBodySpotUpdaterProxy>(); var mediatorSpotUpdater = new ListenerCenteredMediatorDesignBodyChangesUpdater(designBodySpotUpdaterProxy); var rootMediator = _initializationFields.Retrive <RootMediatorSpotPositionsUpdater>(); rootMediator.AddListener(mediatorSpotUpdater); var repositioner = _veConfiguration.VegetationRepositioner; var forgingContainerProxy = new ForgingVegetationSubjectInstanceContainerProxy( new ForgingVegetationSubjectInstanceContainer( new DesignBodyPortrayalForger( representationContainer, instanceBucketsContainer, repositioner), mediatorSpotUpdater//teraz napisz tak, zeby info zwrotne se spotupdatera wracalo zgodnie z multithreadingiem (szlo do innego watku!) )); mediatorSpotUpdater.SetTargetChangesListener(new LambdaSpotPositionChangesListener(dict => { forgingContainerProxy.AddSpotModifications(dict); })); _ultraUpdatableContainer.AddOtherThreadProxy(forgingContainerProxy); MyProfiler.BeginSample("Vegetation1: Loading from file"); var baseVegetationList = VegetationDatabaseFileUtils.LoadListFromFiles(_veConfiguration.LoadingVegetationDatabaseDictionaryPath); MyProfiler.EndSample(); if (_veConfiguration.GenerateTrees) { MyProfiler.BeginSample("Vegetation2: pushingToFile"); foreach (var pair in _veConfiguration.PerRankVegetationRuntimeManagementConfigurations) { var rank = pair.Key; var managementConfiguration = pair.Value; var baseRankedDb = baseVegetationList[rank]; var supportedSpecies = _veConfiguration.SupportedTreeSpecies; var filteredEntities = baseRankedDb.Where(c => supportedSpecies.Contains(c.Detail.SpeciesEnum)).ToList(); var stagnantEntities = new List <VegetationSubjectEntity>(); var nonStagnantEntities = new List <VegetationSubjectEntity>(); var nonStagnantVegetationRect = _veConfiguration.NonStagnantVegetationArea; foreach (var entity in filteredEntities) { if (nonStagnantVegetationRect.Contains(entity.Position2D)) { nonStagnantEntities.Add(entity); } else { stagnantEntities.Add(entity); } } var stagnantVegetationRuntimeManagement = new StagnantVegetationRuntimeManagement(forgingContainerProxy, stagnantEntities, _veConfiguration.StagnantVegetationRuntimeManagementConfiguration); var stagnantVegetationRuntimaManagementProxy = new StagnantVegetationRuntimeManagementProxy(stagnantVegetationRuntimeManagement); _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable() { StartField = () => { stagnantVegetationRuntimaManagementProxy.StartThreading(); } }); var quadtree = new Quadtree <VegetationSubjectEntity>(); foreach (var entity in nonStagnantEntities) { quadtree.Insert(MyNetTopologySuiteUtils.ToPointEnvelope(entity.Position2D), entity); } var positionsProvider = new VegetationSubjectsPositionsDatabase(quadtree); var runtimeManagement = new VegetationRuntimeManagement( positionsProvider: positionsProvider, vegetationSubjectsChangesListener: forgingContainerProxy, visibleEntitiesContainer: new VegetationSubjectsVisibleEntitiesContainer(), configuration: managementConfiguration); var outerVegetationRuntimeManagementProxy = new VegetationRuntimeManagementProxy(runtimeManagement); _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable() { StartCameraField = (camera) => { outerVegetationRuntimeManagementProxy.StartThreading(); var position = camera.Position; outerVegetationRuntimeManagementProxy.Start(repositioner.InvMove(position)); }, UpdateCameraField = (camera) => { var position = camera.Position; outerVegetationRuntimeManagementProxy.AddUpdate(repositioner.InvMove(position)); outerVegetationRuntimeManagementProxy.SynchronicUpdate(repositioner.InvMove(position)); }, }); } MyProfiler.EndSample(); } if (_veConfiguration.GenerateBigBushes) { InitializeBushObjectsDb(baseVegetationList[VegetationLevelRank.Small], forgingContainerProxy); } }