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
            });
        }
示例#3
0
        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();
        }
示例#4
0
        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());
        }
示例#5
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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);
        }
示例#10
0
 public void SetShapeRootTransform(MyTransformTriplet myTransformTriplet)
 {
     myTransformTriplet.SetTransformTo(_pyramidRootGo.transform);
 }
示例#11
0
        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());
        }