示例#1
0
 void OnEnable()
 {
     grassPatch                = (GrassPatch)target;
     currentSelectedObject     = new HitObjectInfo();
     currentSelectedGroundVert = new GroundVert(Vector3.zero);
     Refresh();
 }
示例#2
0
    public void OnApplyPersistentData()
    {
        Target       = GetComponent <GrassPatch>();
        VariableName = "Grass" + transform.position.x + transform.position.y;

        if (DialogueLua.DoesVariableExist(VariableName + "Pregrow") == false)
        {
            return;
        }
        Target.Pregrow       = DialogueLua.GetVariable(VariableName + "Pregrow").asBool;
        Target.AwakeChildren = DialogueLua.GetVariable(VariableName + "AwakeChildren").AsInt;
        GrassTuft[] children = GetComponentsInChildren <GrassTuft>(true);
        int         i        = 0;

        foreach (GrassTuft child in children)
        {
            if (DialogueLua.GetVariable(VariableName + "Tuft" + i).asBool == true)
            {
                child.gameObject.SetActive(true);
            }
            else
            {
                child.gameObject.SetActive(false);
            }
            i++;
        }
    }
示例#3
0
 void RemoveDistribution(GrassPatch patch)
 {
     for (int i = 0; i < patch.grassPlanes.Count; i++)
     {
         patch.RemoveGrassPlane(i);
     }
 }
示例#4
0
    public void Scatter(GrassPatch patch)
    {
        scatteredPoints.Clear();
        // RemoveDistribution(patch);

        for (int i = 0; i < scatterAmoumt; i++)
        {
            Vector3 pos = Random.insideUnitCircle * scatterradius;
            scatteredPoints.Add(new Vector3(pos.x, 0, pos.y));
        }
    }
示例#5
0
    private void Spread()
    {
        if (GameObject.FindWithTag("Occupied Tiles") == null)
        {
            return;
        }
        if (AwakeChildren < 3)
        {
            return;
        }
        List <Vector2> emptyTiles = new List <Vector2>();
        STETilemap     occupied   = GameObject.FindWithTag("Occupied Tiles").GetComponent <STETilemap>();
        int            rand       = Random.Range(0, 101);

        if (rand <= SpreadChance)
        {
            GetComponent <ObjectPosition>().AdjustPositions();
            Vector2 Center = GetComponent <SpriteRenderer>().bounds.center;
            for (int x = -1; x < 2; x++)
            {
                for (int y = -1; y < 2; y++)
                {
                    Vector2  pos      = new Vector2(Center.x + x, Center.y + y);
                    uint     rawData  = occupied.GetTileData(pos);
                    TileData tileData = new TileData(rawData);
                    int      tileID   = tileData.tileId;
                    if (tileID == 65535)
                    {
                        emptyTiles.Add(pos);
                    }
                }
            }
        }
        if (emptyTiles.Count < 1)
        {
            return;
        }
        rand = Random.Range(0, emptyTiles.Count);
        Vector2 newGrassPos = emptyTiles[rand];

        rand = Random.Range(0, GrassPatches.Count);
        GrassPatch newPatch = GameObject.Instantiate(GrassPatches[rand], newGrassPos, transform.rotation).GetComponent <GrassPatch>();

        newPatch.Grow();
    }
示例#6
0
    public void Distribute(GrassPatch patch)
    {
        Transform parent = GameObject.FindGameObjectWithTag("Foliage").transform;

        foreach (var point in scatteredPoints)
        {
            GameObject clump = Object.Instantiate(grassObjects[Random.Range(0, grassObjects.Count - 1)]);

            clump.transform.position = patch.transform.TransformPoint(point);

            Randomize(clump);

            GrassPlane plane = patch.AddGrassPlane();
            plane.transform = clump.transform;

            clump.transform.parent = parent;
        }
    }
示例#7
0
    public void OnRecordPersistentData()
    {
        Target       = GetComponent <GrassPatch>();
        VariableName = "Grass" + transform.position.x + transform.position.y;
        DialogueLua.SetVariable(VariableName + "Pregrow", Target.Pregrow);
        GrassTuft[] children = GetComponentsInChildren <GrassTuft>(true);
        int         i        = 0;
        int         awake    = 0;

        foreach (GrassTuft child in children)
        {
            if (child.gameObject.activeSelf == true)
            {
                DialogueLua.SetVariable(VariableName + "Tuft" + i, true);
                awake += 1;
            }
            else
            {
                DialogueLua.SetVariable(VariableName + "Tuft" + i, false);
            }
            i++;
        }
        DialogueLua.SetVariable(VariableName + "AwakeChildren", awake);
    }
示例#8
0
    void Paint(SceneView sv)
    {
        if (!isPainting)
        {
            return;
        }

        if (painter.currentGroup == null)
        {
            return;
        }

        if (objectsToScatter.Count == 0)
        {
            return;
        }

        RaycastHit hitInfo = new RaycastHit();
        // var ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);
        Ray ray       = GetRay(sv);
        var layerMask = 1 << painter.paintLayer;

        //Spray
        if (Physics.Raycast(ray.origin, ray.direction, out hitInfo, Mathf.Infinity, layerMask))
        {
            GameObject newObj = null;
            Quaternion myRot;
            float      dist      = Mathf.Infinity;
            GameObject objToInst = null;
            //Spray
            if (painter.currentGroup.sprayRadius > 0)
            {
                var        randomCircle = Random.insideUnitCircle * painter.currentGroup.sprayRadius;
                var        rayDirection = (hitInfo.point + new Vector3(randomCircle.x, 0, randomCircle.y)) - ray.origin;
                RaycastHit newHit;
                if (Physics.Raycast(ray.origin, rayDirection, out newHit, Mathf.Infinity, layerMask))
                {
                    hitInfo = newHit;
                }
            }

            //Check Distance
            if (painter.currentGroup.transform.childCount != 0)
            {
                foreach (var obj in myObjToInstArray)//currentGroup.transform)
                {
                    var tempDist = Vector3.Distance(hitInfo.point, obj.transform.position);
                    if (tempDist < dist)
                    {
                        dist = tempDist;
                    }
                }
            }

            // See if we are inside of a mask zone.
            // Find all game objects with tag paintMask
            GameObject[] objectsArray;
            var          objectMask = false;
            objectsArray = GameObject.FindGameObjectsWithTag("Foliage");
            // Iterate through all objects and check for isInside
            foreach (GameObject go in objectsArray)
            {
                if (go.GetComponent <Collider>())
                {
                    if (CheckIsInside(go.GetComponent <Collider>(), hitInfo.point))
                    {
                        objectMask = true;
                        // EditorUtility.DisplayDialog("Hit a prefab painting mask!", "It looks like we hit an object with the tag paintMask", "Continue", "You have to continue");
                    }
                }
            }

            float angle;
            angle = Vector3.Angle(hitInfo.normal, new Vector3(0, 1, 0));

            float hitHeight;
            hitHeight = hitInfo.point.y;

            // JO Added check for slop angle and altitude
            if (dist >= painter.currentGroup.distanceRadius && angle <= painter.currentGroup.maxSlopeVal && angle >= painter.currentGroup.minSlopeVal && hitHeight >= painter.currentGroup.minAltitudeVal && hitHeight <= painter.currentGroup.maxAltitudeVal && !objectMask)
            {
                //Biblio Method
                if (painter.bibSortIndex == 0)
                {
                    // Random
                    // JO Here is where you would pick an item based on the random probability of each
                    var myRandom = Random.Range(0, objectsToScatter.Count);
                    objToInst = objectsToScatter[myRandom];
                }
                if (painter.bibSortIndex == 1)
                {
                    objToInst = objectsToScatter[painter.soloObjectIndex];
                }

                // Check is we're using normal placement
                myRot = Quaternion.identity;
                if (painter.currentGroup.useNormal)
                {
                    myRot = Quaternion.FromToRotation(objToInst.transform.up, hitInfo.normal) * objToInst.transform.rotation;
                }

                //Create the Object
                // if using foilage groups
                if (painter.currentGroup.useFoilageGroups)
                {
                    newObj = Object.Instantiate(objToInst);
                    newObj.transform.position = hitInfo.point;

                    //FoilageSystem.Foliage(){ }

                    GrassPatch instPatch     = newObj.GetComponent <GrassPatch>();
                    GrassPatch originalPatch = objToInst.GetComponent <GrassPatch>();

                    for (int i = 0; i < originalPatch.grassPlanes.Count; i++)
                    {
                        GrassPlane originalPlane = originalPatch.grassPlanes[i]; // original patch
                        GrassPlane instPlane     = instPatch.grassPlanes[i];     // instantiated patch

                        instPlane.transform        = Object.Instantiate(originalPlane.transform.gameObject).transform;
                        instPlane.transform.parent = newObj.transform;

                        // make position its relative position is same as original
                        Vector3 worldPos = newObj.transform.TransformPoint(originalPlane.transform.localPosition);
                        Vector3 localPos = newObj.transform.InverseTransformPoint(worldPos);
                        instPlane.transform.localPosition = localPos;

                        // make it rotate according to ground normal
                        // instPlane.transform.rotation = myRot;
                        RaycastHit hit = new RaycastHit();
                        if (Physics.Raycast(instPlane.transform.position, Vector3.down, out hit, LayerMask.NameToLayer("Ground")))
                        {
                            //Quaternion rot = Quaternion.FromToRotation(instPlane.transform.up, hit.normal) * instPlane.transform.rotation;
                            //instPlane.transform.rotation = rot;
                            //instPlane.transform.eulerAngles = hit.normal;
                            //instPlane.transform.position = hit.point;
                        }
                        instPlane.groundVerts = originalPlane.groundVerts;
                    }

                    myObjToInstArray.Add(newObj);
                }
                else
                {
                    newObj = Object.Instantiate(objToInst); // PrefabUtility.InstantiatePrefab(objToInst);
                    newObj.transform.position = hitInfo.point;
                    newObj.transform.rotation = myRot;
                    myObjToInstArray.Add(newObj);
                }

                // Update Points Array
                painter.currentGroup.AddScatterObject(newObj, hitInfo.point, newObj.transform.localScale, hitInfo.normal, painter.currentGroup.useNormal);

                // Update Position Pivot
                if (painter.currentGroup.transform.childCount == 0)
                {
                    painter.currentGroup.transform.position = newObj.transform.position;
                    newObj.transform.parent = painter.currentGroup.transform;
                }
                else
                {
                    newObj.transform.parent = painter.currentGroup.transform;
                }
                RandomizeSolo(painter.currentGroup.myPointsList[painter.currentGroup.myPointsList.Count - 1]);

                // if using foilage groups
                if (painter.currentGroup.useFoilageGroups)
                {
                    GrassPatch patch = newObj.GetComponent <GrassPatch>();
                    patch.Place();
                }
            }
        }
    }
        private void CreateGrassPatchGrid()
        {
            //Transform terrain bounds center from local to world coordinates
            var localToWorldMatrix       = Matrix4x4.TRS(Ctx.Transform.position, Quaternion.identity, Vector3.one);
            var terrainBoundsWorldCenter = localToWorldMatrix.MultiplyPoint3x4(Ctx.DimensionsInput.GetBounds().center);
            //Prepare some measurements
            var terrainSize        = new Vector2(Ctx.DimensionsInput.GetWidth(), Ctx.DimensionsInput.GetDepth());
            var heightSamplingRate = Ctx.HeightInput.GetSamplingRate();
            var patchQuantity      = new Vector2Int((int)(terrainSize.x / Ctx.Settings.PatchSize),
                                                    (int)(terrainSize.y / Ctx.Settings.PatchSize));

            _grassPatches = new GrassPatch[patchQuantity.y, patchQuantity.x];

            //Initiate all Leaf Patches by creating their BoundingBox and textureCoordinates for heightmap Access
            for (var y = 0; y < patchQuantity.y; y++)
            {
                for (var x = 0; x < patchQuantity.x; x++)
                {
                    //Create patch texture coordinates in range 0..1, where x: xStart, y: yStart, z: width, w:height
                    var patchTexCoord = new Vector4((float)x / patchQuantity.x, (float)y / patchQuantity.y,
                                                    1f / patchQuantity.x,
                                                    1f / patchQuantity.y);

                    //Calculate bounding box center and size in world coordinates
                    var patchBoundsCenter = new Vector3(
                        terrainBoundsWorldCenter.x - Ctx.DimensionsInput.GetBounds().extents.x,
                        Ctx.Transform.position.y,
                        terrainBoundsWorldCenter.z - Ctx.DimensionsInput.GetBounds().extents.z);
                    var patchBoundsSize = new Vector3(Ctx.Settings.PatchSize, 0, Ctx.Settings.PatchSize);
                    //We can already calculate x and z positions
                    patchBoundsCenter.x += x * Ctx.Settings.PatchSize + Ctx.Settings.PatchSize / 2;
                    patchBoundsCenter.z += y * Ctx.Settings.PatchSize + Ctx.Settings.PatchSize / 2;

                    var minHeight = float.PositiveInfinity;
                    var maxHeight = float.NegativeInfinity;
                    for (var j = patchTexCoord.x; j < patchTexCoord.x + patchTexCoord.z; j += heightSamplingRate.x)
                    {
                        for (var k = patchTexCoord.y; k < patchTexCoord.y + patchTexCoord.w; k += heightSamplingRate.y)
                        {
                            var height = Ctx.HeightInput.GetHeight(j, k);
                            if (height < minHeight)
                            {
                                minHeight = height;
                            }
                            if (height > maxHeight)
                            {
                                maxHeight = height;
                            }
                        }
                    }

                    //We can now calculate the center.y and height of BoundingBox
                    patchBoundsCenter.y += minHeight + (maxHeight - minHeight) / 2;
                    patchBoundsSize.y    = maxHeight - minHeight;

                    //Create new patch and give it the data we just calculated
                    _grassPatches[y, x] = new GrassPatch(Ctx, patchTexCoord,
                                                         new Bounds(patchBoundsCenter, patchBoundsSize));
                }
            }
        }
示例#10
0
 void Start()
 {
     Target       = GetComponent <GrassPatch>();
     VariableName = "Grass" + transform.position.x + transform.position.y;
 }
示例#11
0
    /// <summary>
    /// This is just a "Demo" function.
    /// Distributes the points across the location, based on the position
    /// of Generated Points.
    /// </summary>
    public void Distribute(FoilageGroup group)
    {
        if (Points == null || group == null)
        {
            Debug.Log("Points not generated or foilage groups is null");
            return;
        }

        RaycastHit hitInfo;
        // create a parent for distributed objects
        GameObject parent = new GameObject();

        parent.name = location.name + " -Parent";

        foreach (Vector3 position in Points)
        {
            if (Physics.Raycast(position, Vector3.down, out hitInfo)) // create a ray from destinaion position in -Y direction.
            {
                // choose a random object from foilage group objects
                int        rand        = Random.Range(0, group.groupObjects.Count);
                GameObject originalObj = group.groupObjects[rand];

                if (originalObj.GetComponent <GrassPatch>())
                {
                    GameObject newObj = Instantiate(originalObj);
                    newObj.transform.position = hitInfo.point + new Vector3(0, 3f, 0);
                    newObj.transform.parent   = parent.transform;

                    group.Randomize(newObj, group.foilageRules[rand]);

                    GrassPatch instPatch     = newObj.GetComponent <GrassPatch>();
                    GrassPatch originalPatch = originalObj.GetComponent <GrassPatch>();

                    for (int i = 0; i < originalPatch.grassPlanes.Count; i++)
                    {
                        GrassPlane originalPlane = originalPatch.grassPlanes[i]; // original patch
                        GrassPlane instPlane     = instPatch.grassPlanes[i];     // instantiated patch

                        instPlane.transform        = Instantiate(originalPlane.transform.gameObject).transform;
                        instPlane.transform.parent = newObj.transform;

                        // copy settings
                        instPlane.groundVerts = originalPlane.groundVerts;

                        // make position its relative position is same as original
                        Vector3 worldPos = newObj.transform.TransformPoint(originalPlane.transform.localPosition);
                        Vector3 localPos = newObj.transform.InverseTransformPoint(worldPos);
                        instPlane.transform.localPosition = localPos;

                        // make it rotate according to ground normal
                        hitInfo = new RaycastHit();
                        if (Physics.Raycast(instPlane.transform.position, -Vector3.up * 5f, out hitInfo, LayerMask.NameToLayer("Ground")))
                        {
                            if (group.foilageRules[rand].useNormal)
                            {
                                instPlane.transform.localEulerAngles = hitInfo.normal;
                            }
                            instPlane.transform.position = hitInfo.point;
                        }
                    }
                    instPatch.Place();
                }
            }
        }
    }
示例#12
0
        public override void Create()
        {
            base.Create();

            Music.Instance.Play(Assets.HAPPY, true);
            Music.Instance.Volume(1f);

            uiCamera.Visible = false;

            var w = pdsharp.noosa.Camera.Main.CameraWidth;
            var h = pdsharp.noosa.Camera.Main.CameraHeight;

            var archs = new Archs();

            archs.Reversed = true;
            archs.SetSize(w, h);
            Add(archs);

            var vx = Align((w - WIDTH) / 2);
            var vy = Align((h - HEIGHT) / 2);

            var s = pdsharp.noosa.Camera.Main.CameraToScreen(vx, vy);

            _viewport = new pdsharp.noosa.Camera(s.X, s.Y, WIDTH, HEIGHT, defaultZoom);
            pdsharp.noosa.Camera.Add(_viewport);

            var window = new Group();

            window.Camera = _viewport;
            Add(window);

            var dayTime = !Dungeon.NightMode;

            var sky = new Sky(dayTime);

            sky.Scale.Set(WIDTH, HEIGHT);
            window.Add(sky);

            if (!dayTime)
            {
                for (var i = 0; i < Nstars; i++)
                {
                    var size = pdsharp.utils.Random.Float();
                    var star = new ColorBlock(size, size, Color.Argb(255, 255, 255, 255));
                    star.X  = pdsharp.utils.Random.Float(WIDTH) - size / 2;
                    star.Y  = pdsharp.utils.Random.Float(HEIGHT) - size / 2;
                    star.Am = size * (1 - star.Y / HEIGHT);
                    window.Add(star);
                }
            }

            const float range = HEIGHT * 2 / 3;

            for (var i = 0; i < Nclouds; i++)
            {
                var cloud = new Cloud((Nclouds - 1 - i) * (range / Nclouds) + pdsharp.utils.Random.Float(range / Nclouds), dayTime);
                window.Add(cloud);
            }

            var nPatches = (int)(sky.Width / GrassPatch.WIDTH + 1);

            for (var i = 0; i < nPatches * 4; i++)
            {
                var patch = new GrassPatch((i - 0.75f) * GrassPatch.WIDTH / 4, HEIGHT + 1, dayTime);
                patch.Brightness(dayTime ? 0.7f : 0.4f);
                window.Add(patch);
            }

            var a = new Avatar(Dungeon.Hero.heroClass);

            a.X = Align((WIDTH - a.Width) / 2);
            a.Y = HEIGHT - a.Height + 1;
            window.Add(a);

            var pet = new Pet();

            pet.Rm = pet.Gm = pet.Bm = 1.2f;
            pet.X  = WIDTH / 2 + 2;
            pet.Y  = HEIGHT - pet.Height;
            window.Add(pet);

            if (dayTime)
            {
                a.Brightness(1.2f);
                pet.Brightness(1.2f);
            }

            //window.Add(new TouchArea(sky) { protected void OnClick(Touch touch) { pet.Jump(); }; });

            for (var i = 0; i < nPatches; i++)
            {
                var patch = new GrassPatch((i - 0.5f) * GrassPatch.WIDTH, HEIGHT, dayTime);
                patch.Brightness(dayTime ? 1.0f : 0.8f);
                window.Add(patch);
            }

            var frame = new Image(Assets.SURFACE);

            if (!dayTime)
            {
                frame.Hardlight(0xDDEEFF);
            }

            frame.Frame(0, 0, 88, 125);
            frame.X = vx - 4;
            frame.Y = vy - 9;
            Add(frame);

            var gameOver = new RedButton("Game Over");

            gameOver.ClickAction = GameOverClickAction;
            gameOver.SetSize(WIDTH - 10, 20);
            gameOver.SetPos(5 + frame.X + 4, frame.Y + frame.Height + 4);
            Add(gameOver);

            Badge.ValidateHappyEnd();

            FadeIn();
        }