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 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 static void GenerateGrass(MeshData meshData, Texture2D texture, MeshData grassColourMeshData, Texture2D grassColourTexture) { Vector3[] vertices = meshData.vertices; Vector2[] uvs = meshData.uvs; Vector2[] uvsColour = grassColourMeshData.uvs; float grassRotationBias = 50f; //GameObject MapGenerator = GameObject.Find("MapGenerator"); //Color standard = MapGenerator.GetComponent<MapGenerator>().regions[2].colour; for (int i = 0; i < 5; i++) { for (int v = 0; v < vertices.Length; v++) { GrassMeshData grassMeshData = GrassMeshGenerator.GenerateGrassMesh(meshData, v, 0.4f, 0.8f, 0.2f, 2.0f, 0.25f); GameObject grass = new GameObject("GrassBlade"); grass.transform.position = RandomizePosition(vertices[v]); Vector3 euler = grass.transform.eulerAngles; euler.y = RandomizeRotation(grassRotationBias); grass.transform.eulerAngles = euler; grass.transform.parent = GameObject.Find("GrassContainer").transform; grass.AddComponent <MeshFilter>(); grass.AddComponent <MeshRenderer>(); grass.GetComponent <MeshFilter>().mesh = grassMeshData.CreateMesh(); MeshRenderer rend = grass.GetComponent <MeshRenderer>(); Material fieldMaterial = (Material)Resources.Load("Material/FieldTexture", typeof(Material)); rend.material = fieldMaterial; rend.material.mainTexture = SimulateLighting(fieldMaterial, uvs, v); Color standard = texture.GetPixelBilinear(uvs[v].x, uvs[v].y); Color colourMapPixel = grassColourTexture.GetPixelBilinear(uvsColour[v].x, uvsColour[v].y); rend.material.color = RandomizeColor(standard, colourMapPixel); //Yellow // 169 188 34 /* * green 96 128 56 * * * * */ } } }
public SingleGrassEntitySplatGenerator(GrassSingleGenerator entityGenerator, IEntityPositionProvider positionProvider, GrassSingleAbstractSettingGenerator grassSingleAbstractSettingGenerator, IGrassInstanceContainer grassInstanceContainer, GrassMeshGenerator meshGenerator, Material material) { this._entityGenerator = entityGenerator; this._positionProvider = positionProvider; this._grassSingleAbstractSettingGenerator = grassSingleAbstractSettingGenerator; this._grassInstanceContainer = grassInstanceContainer; _meshGenerator = meshGenerator; this._material = material; }
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); }
public void Start() { var meshGenerator = new GrassMeshGenerator(); var mesh = meshGenerator.GetGrassBladeMesh(1); var material = new Material(Shader.Find("Custom/Vegetation/Grass")); material.SetFloat("_BendingStrength", 0.2f); material.SetFloat("_InitialBendingValue", 0.4f); material.SetFloat("_PlantBendingStiffness", 0.3f); material.SetVector("_WindDirection", Vector4.one); material.SetVector("_PlantDirection", Vector4.one); material.SetColor("_Color", Color.green); material.SetFloat("_RandSeed", 44.4f); var go = GameObject.CreatePrimitive(PrimitiveType.Capsule); go.GetComponent <MeshFilter>().mesh = mesh; go.GetComponent <MeshRenderer>().material = material; var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/Grass.Instanced")); instancingMaterial.enableInstancing = true; _globalGpuInstancingContainer = new GlobalGpuInstancingContainer(); var commonUniforms = new UniformsPack(); commonUniforms.SetUniform("_BendingStrength", 0.8f); 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), }) ); var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer); var uniforms = new UniformsPack(); uniforms.SetUniform("_InitialBendingValue", 0.4f); uniforms.SetUniform("_PlantBendingStiffness", 0.3f); uniforms.SetUniform("_PlantDirection", Vector4.one); uniforms.SetUniform("_Color", Color.green); uniforms.SetUniform("_RandSeed", 44.4f); var msw = new MyStopWatch(); msw.StartSegment("AddingClassic"); for (int x = 0; x < 300; x++) { for (int y = 0; y < 300; y++) { var myTriplet = new MyTransformTriplet(new Vector3(x, 0, y), Vector3.zero, Vector3.one); _globalGpuInstancingContainer.AddInstance(bucketId, myTriplet.ToLocalToWorldMatrix(), uniforms); } } _globalGpuInstancingContainer.StartThread(); _globalGpuInstancingContainer.FinishUpdateBatch(); Debug.Log("It took: " + msw.CollectResults()); }
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); }
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); }