public Grass2Aspect GenerateAspect(UnplantedGrassInstance unplantedInstance, Vector2 flatPosition) { var rotationInRad = unplantedInstance.FlatRotationInRadians; MyTransformTriplet transformTriplet = new MyTransformTriplet( new Vector3(0, 0, 0), new Vector3(Mathf.Deg2Rad * unplantedInstance.InitialBendingValue * 20, rotationInRad, 0), //TODO i use properties from Grass2 as inputs to EVegetation unplantedInstance.Size); UniformsPack uniforms = new UniformsPack(); uniforms.SetUniform("_Color", unplantedInstance.Color); return(new Grass2Aspect() { Entities = new List <Grass2Entity>() { new Grass2Entity() { DeltaTransformTriplet = transformTriplet, Uniforms = uniforms, FlatRotation = rotationInRad } }, FlatPos = flatPosition }); }
public Grass2Aspect GenerateAspect(UnplantedGrassInstance unplantedInstance, Vector2 flatPosition) { var rotationInRad = unplantedInstance.FlatRotationInRadians; MyTransformTriplet transformTriplet = new MyTransformTriplet( new Vector3(0, 0, 0), new Vector3(0, rotationInRad, 0), unplantedInstance.Size); UniformsPack uniforms = new UniformsPack(); uniforms.SetUniform("_InitialBendingValue", unplantedInstance.InitialBendingValue); uniforms.SetUniform("_PlantBendingStiffness", unplantedInstance.InitialBendingStiffness); uniforms.SetUniform("_PlantDirection", new Vector4(Mathf.Sin(rotationInRad), Mathf.Cos(rotationInRad), 0, 0)); //todo! uniforms.SetUniform("_Color", unplantedInstance.Color); return(new Grass2Aspect() { Entities = new List <Grass2Entity>() { new Grass2Entity() { DeltaTransformTriplet = transformTriplet, Uniforms = uniforms, FlatRotation = rotationInRad } }, FlatPos = flatPosition }); }
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(); }
private List <Grass2PositionedEntity> PositionEntitiesFromAspect(Grass2Aspect aspect, DesignBodySpotModification modification) { var flatPos = aspect.FlatPos; //var rotation = Quaternion.LookRotation(modification.Normal.normalized).eulerAngles * Mathf.Deg2Rad; //TODO recreate if (!WarningWasSaid) { Debug.Log("W4 WARNING. GRASS ROTATION IS NOT SET. DO STH!!!"); WarningWasSaid = true; } var centerTriplet = new MyTransformTriplet( new Vector3(flatPos.x, 0, flatPos.y), Vector3.zero, //rotation, Vector3.one ); if (modification.SpotData != null) { centerTriplet.Position = new Vector3(centerTriplet.Position.x, modification.SpotData.Height, centerTriplet.Position.z); } var centerMatrix = centerTriplet.ToLocalToWorldMatrix(); var additionalUniforms = new UniformsPack(); if (modification.Uniforms != null) { additionalUniforms = modification.Uniforms; } return(aspect.Entities.Select(c => new Grass2PositionedEntity() { LocalToWorldMatrix = centerMatrix * c.DeltaTransformTriplet.ToLocalToWorldMatrix(), Uniforms = UniformsPack.MergeTwo(c.Uniforms, additionalUniforms) }).ToList()); }
private void CreateObjectDebug(Mesh mesh, Matrix4x4 baseMatrix, float rotation) { var transf2 = new MyTransformTriplet(new Vector3(0, 0, 0), new Vector3(0, rotation * Mathf.Deg2Rad, 0), new Vector3(1, 1, 1)); var matrix2 = transf2.ToLocalToWorldMatrix(); var finalMatrix = baseMatrix * matrix2; var go = GameObject.CreatePrimitive(PrimitiveType.Capsule); go.transform.localPosition = new Vector3(0, 0, 0); go.GetComponent <MeshFilter>().mesh = mesh; go.name = rotation.ToString(); go.transform.localPosition = finalMatrix.ExtractPosition(); go.transform.rotation = finalMatrix.ExtractRotation(); go.transform.localScale = finalMatrix.ExtractScale(); }
public Grass2Aspect GenerateAspect(UnplantedGrassInstance unplantedInstance, Vector2 flatPosition) { var entityRotationInRad = unplantedInstance.FlatRotationInRadians; var usedBillboardIndex = _billboardClan.QueryRandom((int)(entityRotationInRad * 543.21)); //todo seed var entities = new List <Grass2Entity>(); int billboardsCount = 3; for (int i = 0; i < billboardsCount; i++) { var additionalRotation = ((Mathf.PI) / (billboardsCount)) * i; var finalRotationInRad = additionalRotation + entityRotationInRad; MyTransformTriplet transformTriplet = new MyTransformTriplet( new Vector3(0, 0, 0), new Vector3(0, finalRotationInRad, 0), unplantedInstance.Size); UniformsPack uniforms = new UniformsPack(); uniforms.SetUniform("_InitialBendingValue", unplantedInstance.InitialBendingValue); uniforms.SetUniform("_PlantBendingStiffness", unplantedInstance.InitialBendingStiffness); uniforms.SetUniform("_PlantDirection", new Vector4(Mathf.Sin(finalRotationInRad), Mathf.Cos(finalRotationInRad), finalRotationInRad, 0)); //todo! uniforms.SetUniform("_Color", unplantedInstance.Color); uniforms.SetUniform("_ArrayTextureIndex", usedBillboardIndex); var newEntity = new Grass2Entity() { DeltaTransformTriplet = transformTriplet, Uniforms = uniforms, FlatRotation = finalRotationInRad }; entities.Add(newEntity); } return(new Grass2Aspect() { Entities = entities, FlatPos = flatPosition }); }
protected override async Task <UInt32> CreateTerrainAsync() { var ring1Position = Ring1Node.Ring1Position; var xOffset = _globalHeightmap.Width * ring1Position.X; var yOffset = _globalHeightmap.Height * ring1Position.Y; var width = _globalHeightmap.Width * ring1Position.Width; var height = _globalHeightmap.Height * ring1Position.Height; var subArray = slicer.GetSubarrayWithEmptyMarginsSafe(_globalHeightmap.HeightmapAsArray, (int)xOffset, (int)yOffset, (int)width, (int)height); Point2D newGameObjectSize = new Point2D(33, 33); var simplifiedMap = simplyfyer.SimplyfyHeightmap(new HeightmapArray(subArray), newGameObjectSize.X - 1, newGameObjectSize.Y - 1); var mesh = await _meshGenerator.AddOrder( () => PlaneGenerator.CreatePlaneMesh(1, 1, simplifiedMap.HeightmapAsArray)); UniformsPack pack = await CreateUniformsPack(Ring1Node); var inGamePosition = _coordsCalculator.CalculateGlobalObjectPosition(Ring1Node.Ring1Position); var triplet = new MyTransformTriplet(new Vector3(inGamePosition.X, 0, inGamePosition.Y), Vector3.zero, new Vector3(inGamePosition.Width, 1, inGamePosition.Height)); var creationTemplate = new Ring1GroundPieceCreationTemplate() { Name = "Ring1 terrain object " + inGamePosition.ToString(), ParentGameObject = ParentObject, PieceMesh = mesh, ShaderName = "Custom/Terrain/Ring1DirectHeight", TransformTriplet = triplet, Uniforms = pack }; var objectId = OrderGrabber.AddCreationOrder(creationTemplate); return(objectId); }
protected override async Task <UInt32> CreateTerrainAsync() { //todo DOPISZ REAGOWANIE NA ZNIKNIeCIE elementu terenu - trzeba odeslac do TerrainShapeDb informacje o odblokowaniu tekstury!! var creationDetails = CalculateQueryDetails(Ring1Node.QuadLodLevel); var gameObjectMeshResolution = creationDetails.TerrainMeshResolution; //new IntVector2(241, 241); var inGamePosition = _coordsCalculator.CalculateGlobalObjectPosition(Ring1Node.Ring1Position); var mesh = await _meshGenerator.AddOrder( () => PlaneGenerator.CreateFlatPlaneMesh(gameObjectMeshResolution.X, gameObjectMeshResolution.Y)); var debugTestDivider = 240f; var triplet = new MyTransformTriplet( new Vector3(inGamePosition.X / debugTestDivider, 0, inGamePosition.Y / debugTestDivider), Vector3.zero, new Vector3(inGamePosition.Width / debugTestDivider, 20, inGamePosition.Height / debugTestDivider)); //todo! var stainResourceWithCoords = await _stainTerrainServiceProxy.RetriveResource(inGamePosition); UniformsPack pack = await CreateUniformsPack(creationDetails.QueryElementDetails, creationDetails.Pack, stainResourceWithCoords); var creationTemplate = new Ring1GroundPieceCreationTemplate() { Name = "Ring1 terrain object " + inGamePosition.ToString(), ParentGameObject = ParentObject, PieceMesh = mesh, ShaderName = "Custom/Terrain/Ring1", TransformTriplet = triplet, Uniforms = pack, ShaderKeywordSet = creationDetails.KeywordSet }; var objectId = OrderGrabber.AddCreationOrder(creationTemplate); return(objectId); }
public void Start4() { var normal = new Vector3(0.5f, 0.5f, 0).normalized; var rotationA = Quaternion.LookRotation(normal); var a1 = rotationA.eulerAngles; var tt1 = new MyTransformTriplet(Vector3.zero, rotationA.eulerAngles * Mathf.Deg2Rad, new Vector3(1, 14, 7)); var go = GameObject.CreatePrimitive(PrimitiveType.Capsule); var finalMatrix = tt1.ToLocalToWorldMatrix(); go.transform.localPosition = finalMatrix.ExtractPosition(); go.transform.rotation = finalMatrix.ExtractRotation(); go.transform.localScale = finalMatrix.ExtractScale(); var go2 = GameObject.CreatePrimitive(PrimitiveType.Capsule); go2.transform.rotation = rotationA; go2.transform.localScale = new Vector3(1, 14, 7); Debug.Log("Rot1: " + a1); }
public void SetShapeRootTransform(MyTransformTriplet myTransformTriplet) { myTransformTriplet.SetTransformTo(_pyramidRootGo.transform); }
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()); }