public void Grow(PlantInstance plantInstance, LayerData layerData, TextureData textureData) { this.plantInstance = plantInstance; this.layerData = layerData; plantData = this.plantInstance.GetPlantData(); plantLayerIndex = LayerData.MaskToIndex(layerData.plants); growDelay = Random.Range(0f, 0.5f); RaycastHit hit; if (Physics.Raycast(transform.position, Vector3.down, out hit, Mathf.Infinity, layerData.terrain.value)) { if (textureData.FoliageAllowed(hit.point)) { transform.position = hit.point; transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation; if (plantData.randomRotation) { transform.RotateAround(transform.position, transform.up, Random.Range(0f, 360f)); } gameObject.layer = plantLayerIndex; if (plantData.seedPrefab != null) { seedVisual = Instantiate(plantData.seedPrefab, transform.position, transform.rotation); seedVisual.transform.parent = transform; } float scale = plantInstance.GetScale(); transform.localScale = new Vector3(scale, scale, scale); if (!plantData.instantIgnite && !plantData.isCigarette) { SetupSaturation(); } state = State.Seed; } else { Destroy(gameObject); } } else { Destroy(gameObject); } }
private void SetupSaturation() { Vector3 origin = transform.position + Vector3.up; int iterations = plantData.waterCheckIterations; int rays = plantData.waterCheckRays; int waterLayerIndex = LayerData.MaskToIndex(layerData.water); float radius = plantData.waterRadius; float increment = radius / iterations; float radians = (360 * Mathf.Deg2Rad) / rays; float distance = radius; for (int i = 0; i < iterations; i++) { float offset = increment + i * increment; bool breakEarly = false; for (int j = 0; j < rays; j++) { float x = Mathf.Cos(j * radians); float y = Mathf.Sin(j * radians); Vector3 target = new Vector3(origin.x + x * offset, transform.position.y, origin.z + y * offset); Vector3 direction = target - origin; float rayDistance = GetRayDistance(origin, direction, waterLayerIndex); if (rayDistance < distance) { distance = rayDistance; breakEarly = true; } } if (breakEarly) { break; } } plantInstance.UpdateSaturation(distance); }