void OnEnable() { grassPatch = (GrassPatch)target; currentSelectedObject = new HitObjectInfo(); currentSelectedGroundVert = new GroundVert(Vector3.zero); Refresh(); }
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++; } }
void RemoveDistribution(GrassPatch patch) { for (int i = 0; i < patch.grassPlanes.Count; i++) { patch.RemoveGrassPlane(i); } }
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)); } }
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(); }
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; } }
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); }
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)); } } }
void Start() { Target = GetComponent <GrassPatch>(); VariableName = "Grass" + transform.position.x + transform.position.y; }
/// <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(); } } } }
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(); }