public void Start() { var meshGenerator = new GrassMeshGenerator(); var mesh = meshGenerator.GetGrassBillboardMesh(0, 1); var normal = new Vector3(0.5f, 0.5f, 0).normalized; var rotationA = Quaternion.LookRotation(normal); var transf = new MyTransformTriplet( new Vector3(0, 0, 0), rotationA.eulerAngles * Mathf.Deg2Rad, new Vector3(1, 1, 1)); var matrix = transf.ToLocalToWorldMatrix(); for (int i = 0; i < 360; i += 30) { CreateObjectDebug(mesh, matrix, i); } //var transf2 = new MyTransformTriplet(new Vector3(0,0,0), new Vector3(0, 60*Mathf.Deg2Rad, 0), new Vector3(1,1,1) ); //var matrix2 = transf2.ToLocalToWorldMatrix(); //var finalMatrix = matrix * matrix2; //go.transform.localPosition = finalMatrix.ExtractPosition(); //go.transform.rotation = finalMatrix.ExtractRotation(); //go.transform.localScale = finalMatrix.ExtractScale(); }
public void Start2() { TaskUtils.SetGlobalMultithreading(false); var meshGenerator = new GrassMeshGenerator(); var mesh = meshGenerator.GetGrassBillboardMesh(0, 1); var generator = new Grass2BillboardGenerator(new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(ComputeShaderContainer), new TextureRendererServiceConfiguration() { StepSize = new Vector2(10, 10) })), new Grass2BillboardGenerator.Grass2BillboardGeneratorConfiguration() { BillboardSize = new IntVector2(256, 256) }); var tex = generator.GenerateBillboardImageAsync(40, 1).Result; tex.filterMode = FilterMode.Point; var material = new Material(Shader.Find("Custom/Vegetation/GrassBushBillboard")); material.SetTexture("_MainTex", tex); for (int x = 0; x < 30; x++) { for (int y = 0; y < 30; y++) { var go = GameObject.CreatePrimitive(PrimitiveType.Capsule); go.transform.localPosition = new Vector3(x, 0, y); go.GetComponent <MeshFilter>().mesh = mesh; go.GetComponent <MeshRenderer>().material = material; } } }
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); }
private GrassGroupsPlanter CreateBushGroupsPlanter(OtherThreadExecutingLocation otherThreadExecutingLocation) { 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(_veConfiguration.Grass2BillboardsPath, new IntVector2(256, 256)); var singleToDuo = new Grass2BakingBillboardClanGenerator( _initializationFields.Retrive <ComputeShaderContainerGameObject>(), _initializationFields.Retrive <UnityThreadComputeShaderExecutorObject>()); var bakedClan = singleToDuo.GenerateBakedAsync(clan).Result; /// var commonUniforms = new UniformsPack(); commonUniforms.SetUniform("_BendingStrength", 0.6f); 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), new GpuInstancingUniformTemplate("_Pointer", GpuInstancingUniformType.Float), }) ); var globalGpuInstancingContainer = _initializationFields.Retrive <GlobalGpuInstancingContainer>(); var bucketId = globalGpuInstancingContainer.CreateBucket(instancingContainer); GrassGroupsContainer grassGroupsContainer = new GrassGroupsContainer(globalGpuInstancingContainer, bucketId); IGrassPositionResolver grassPositionResolver = new PoissonDiskSamplerPositionResolver(_veConfiguration.BushExclusionRadiusRange); GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer(); DesignBodySpotUpdaterProxy designBodySpotUpdaterProxy = _initializationFields.Retrive <DesignBodySpotUpdaterProxy>(); var mediatorSpotUpdater = new ListenerCenteredMediatorDesignBodyChangesUpdater(designBodySpotUpdaterProxy); var grassGroupsPlanter = new GrassGroupsPlanter( grassDetailInstancer, grassPositionResolver, grassGroupsContainer, mediatorSpotUpdater, new Grass2BushAspectsGenerator(bakedClan), //todo! _veConfiguration.BushTemplatesConfiguration, _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); }