Exemple #1
0
 public async Task InsertPlantsProfile(PlantProfile pl) => await PlantsCollection.InsertOneAsync(pl);
    public static List <TreeData> TreeCloudFromRaycasts(int seed, Vector2 sampleCenter, WorldData worldData, PlantProfile profile)
    {
        #region Variables

        Random.State initialState = Random.state;
        Random.InitState(seed);

        List <TreeData> treeCloud = new List <TreeData>();
        Vector3         position;
        Quaternion      rotation;
        Vector3         scale;

        int   density     = Mathf.RoundToInt((Statics.terrainDataResolution * 0.5f) * profile.density);
        float maxAltitude = Statics.maximumGlobalHeight + 1;
        float minAltitude = Statics.minimumGlobalHeight - 1;
        float noise       = 0.5f;

        Ray        ray;
        RaycastHit hit;
        float      distance      = maxAltitude - minAltitude;
        LayerMask  collisionMask = Statics.groundLayer;
        LayerMask  obstacleMask  = Statics.obstacleLayer;

        float elevation;

        #endregion

        for (int i = 0; i < density; i++)
        {
            Vector3 origin = new Vector3(sampleCenter.x, 0, sampleCenter.y);
            origin.y  = maxAltitude;
            origin.x += Statics.terrainDataResolution * Random.Range(-0.5f, 0.5f);
            origin.z += Statics.terrainDataResolution * Random.Range(-0.5f, 0.5f);

            elevation = Logics.SampleDataSet(origin.z, origin.x, worldData.elevation);

            if (profile.habitat == PlantHabitat.Terrestrial)
            {
                if (elevation < (Statics.minimumGrowthHeight + 2.5f) / Statics.maximumGlobalHeight)
                {
                    continue;
                }
                if (elevation > (Statics.maximumGrowthHeight - 2.5f) / Statics.maximumGlobalHeight)
                {
                    continue;
                }
            }
            else if (profile.habitat == PlantHabitat.Marine)
            {
                if (elevation > (Statics.minimumGrowthHeight + 2.5f) / Statics.maximumGlobalHeight)
                {
                    continue;
                }
                if (elevation < Statics.seaLevel - 0.002f)
                {
                    continue;
                }
            }
            else if (profile.habitat == PlantHabitat.Aquatic)
            {
                if (elevation > Statics.seaLevel - 0.002f)
                {
                    continue;
                }
            }

            ray = new Ray(origin, -Vector3.up);

            if (Physics.Raycast(origin + (Vector3.up * (1000 - maxAltitude)), -Vector3.up, out hit, distance + 1001, obstacleMask, QueryTriggerInteraction.Collide))
            {
                continue;
            }

            if (Physics.Raycast(ray, out hit, distance, collisionMask, QueryTriggerInteraction.Collide))
            {
                position = hit.point - Vector3.up * Random.Range(1f, 2f);
                rotation = Quaternion.Euler(
                    (Vector3.right * Random.Range(-noise, noise)) +
                    (Vector3.up * Random.Range(0, 360)) +
                    (Vector3.forward * Random.Range(-noise, noise))
                    );
                scale = Vector3.one * Random.Range(1 - noise, 1 + noise);

                GameObject newTree = Instantiate(profile.model, Statics.treesParent, true);
                newTree.name = profile.name + " (" + i + ")";

                newTree.transform.position   = position;
                newTree.transform.rotation   = rotation;
                newTree.transform.localScale = scale;

                treeCloud.Add(new TreeData(position, rotation, scale));
            }
        }

        Random.state = initialState;
        return(treeCloud);
    }
        public ValuesController()
        {
            SEPDimensionEntities entities = new SEPDimensionEntities();



            /*
             * foreach (D_Time f in entities.D_Time.ToList())
             * {
             *  result_time = result_time + f.ToString();
             * }
             *
             */

            foreach (F_CO2 f in entities.F_CO2.ToList())
            {
                result_co2 = result_co2 + f.ToString();
            }

            foreach (F_Humidity f in entities.F_Humidity.ToList())
            {
                result_humidity = result_humidity + f.ToString();
            }

            foreach (F_Light f in entities.F_Light.ToList())
            {
                result_light = result_light + f.ToString();
            }

            foreach (F_Temperature f in entities.F_Temperature.ToList())
            {
                result_temperature = result_temperature + f.ToString();
            }

            foreach (F_Watering f in entities.F_Watering.ToList())
            {
                result_watering = result_watering + f.ToString();
            }

            int counter = 0;
            int x       = 0;



            var c_co2         = result_co2.Split(',');
            var c_humidty     = result_humidity.Split(',');
            var c_light       = result_light.Split(',');
            var c_temperature = result_temperature.Split(',');
            var c_watering    = result_watering.Split(',');

            for (int i = 0; i < c_co2.Length; i++)
            {
                PlantProfile plant = new PlantProfile();

                int.TryParse(c_co2[i], out x);
                plant.setCo2(x);

                int.TryParse(c_humidty[i], out x);
                plant.setHumidity(x);

                int.TryParse(c_light[i], out x);
                plant.setLight(x);

                int.TryParse(c_temperature[i], out x);
                plant.setTemperature(x);

                plant.setWatering(c_watering[i]);

                plants.Add(plant);
            }
        }
    public static MeshData PointCloudFromRaycasts(int resolution, int seed, Vector2 sampleCenter, WorldData worldData, PlantProfile profile)
    {
        #region Variables

        Random.State initialState = Random.state;
        Random.InitState(seed);

        int   verticesPerLine   = resolution;
        float spaceBetweenGrass = (float)Statics.terrainDataDetailResolution / verticesPerLine;
        float noise             = spaceBetweenGrass * 0.25f;

        float maxAltitude = Statics.maximumGlobalHeight + 1;
        float minAltitude = Statics.minimumGlobalHeight - 1;

        float elevation;

        Ray        ray;
        RaycastHit hit;
        float      distance      = maxAltitude - minAltitude;
        LayerMask  collisionMask = Statics.groundLayer;
        LayerMask  obstacleMask  = Statics.noGrowZone;

        Vector3 vertexPosition;
        Vector2 uvPercent;
        Vector3 normalDirection;
        Color   color;
        int     index = 0;

        MeshData meshData = new MeshData(true);

        #endregion

        for (int z = 0; z < verticesPerLine; z++)
        {
            for (int x = 0; x < verticesPerLine; x++)
            {
                float realX = x * spaceBetweenGrass;
                float realZ = z * spaceBetweenGrass;

                Vector2 noiseOffset  = new Vector2(Random.Range(-noise, noise), Random.Range(-noise, noise));
                Vector2 sampleOffset = new Vector2(realX - (verticesPerLine * 0.5f), realZ - (verticesPerLine * 0.5f));
                Vector3 origin       = new Vector3(sampleCenter.x + sampleOffset.x + noiseOffset.x, maxAltitude, sampleCenter.y + sampleOffset.y + noiseOffset.y);

                if (profile.density < Statics.hash.SampleHashAbs(origin))
                {
                    continue;
                }

                elevation = Logics.SampleDataSet(origin.z, origin.x, worldData.elevation);

                if (profile.habitat == PlantHabitat.Terrestrial)
                {
                    if (elevation < (Statics.minimumGrowthHeight + 1f) / Statics.maximumGlobalHeight)
                    {
                        continue;
                    }
                    if (elevation > (Statics.maximumGrowthHeight - 1f) / Statics.maximumGlobalHeight)
                    {
                        continue;
                    }
                }
                else if (profile.habitat == PlantHabitat.Marine)
                {
                    if (elevation > (Statics.minimumGrowthHeight + 1f) / Statics.maximumGlobalHeight)
                    {
                        continue;
                    }
                    if (elevation < Statics.seaLevel - 0.002f)
                    {
                        continue;
                    }
                }
                else if (profile.habitat == PlantHabitat.Aquatic)
                {
                    if (elevation > Statics.seaLevel - 0.002f)
                    {
                        continue;
                    }
                }

                ray = new Ray(origin, -Vector3.up);
                if (Physics.Raycast(origin + (Vector3.up * (1000 - maxAltitude)), -Vector3.up, out hit, distance + 1001, obstacleMask, QueryTriggerInteraction.Collide))
                {
                    continue;
                }

                if (Physics.Raycast(ray, out hit, distance, collisionMask, QueryTriggerInteraction.Collide))
                {
                    vertexPosition = new Vector3(hit.point.x - sampleCenter.x, hit.point.y - 0.01f, hit.point.z - sampleCenter.y);
                    uvPercent      = new Vector2((realX + noiseOffset.x) / verticesPerLine, (realZ + noiseOffset.y) / verticesPerLine);

                    float perlin = Statics.hash.SamplePerlin(vertexPosition);

                    normalDirection = hit.normal * Maths.Map(perlin, 0.25f, 0.75f, 0.5f, 1.25f);
                    if (perlin <= profile.diseasePrevalence)
                    {
                        color = Color.Lerp(profile.unhealthyDark, profile.unhealthyBright, Statics.hash.SampleHashAbs(vertexPosition));
                    }
                    else
                    {
                        color = Color.Lerp(profile.healthyDark, profile.healthyBright, Statics.hash.SampleHashAbs(vertexPosition));
                    }

                    meshData.AddPoint(index, vertexPosition, uvPercent, normalDirection, color);
                    index++;
                }
            }
        }

        Random.state = initialState;
        return(meshData);
    }
        public async void Post([FromBody] PlantProfile plants)
        {
            var monogDbService = new MongoDBMain("Project", "PlantProfiles", "mongodb://ea9d9986e87a086f47cf3eedf97735a3");

            await monogDbService.InsertPlantsProfile(plants);
        }