Example #1
0
        private Transform Spawn(double3 localPoint, double3 localH, double3 localV, double weight)
        {
            var index        = (int)math.floor(weight * 433494437.0) % prefabs.Count;
            var root         = Instantiate(prefabs[index]);
            var sampledPoint = cachedTerrain.GetLocalPoint(localPoint);

            root.SetParent(cachedTerrain.transform, false);
            root.localPosition = (float3)sampledPoint;

            if (sharedMaterial != null)
            {
                foreach (var renderer in root.GetComponentsInChildren <Renderer>())
                {
                    SgtHelper.AddMaterial(renderer, sharedMaterial.Material);
                }
            }

            switch (rotate)
            {
            case RotateType.Randomly:
            {
                var x = (float)((weight * 1224133.0) % 1787.0);
                var y = (float)((weight * 1324039.0) % 1597.0);
                var z = (float)((weight * 1424041.0) % 1321.0);

                root.rotation = quaternion.Euler(x, y, z);
            }
            break;

            case RotateType.ToSurfaceNormal:
            {
                var sampledPointL = cachedTerrain.GetLocalPoint(localPoint - localH);
                var sampledPointR = cachedTerrain.GetLocalPoint(localPoint + localH);
                var sampledPointB = cachedTerrain.GetLocalPoint(localPoint - localV);
                var sampledPointF = cachedTerrain.GetLocalPoint(localPoint + localV);

                var vectorA = sampledPointR - sampledPointL;
                var vectorB = sampledPointF - sampledPointB;
                var normal  = math.normalize(-math.cross(vectorA, vectorB));
                var angle   = (float)((weight * 1224133.0) % 1597.0);

                root.up = cachedTerrain.TransformVector(normal);
                root.Rotate(0.0f, angle, 0.0f, Space.Self);
            }
            break;

            case RotateType.ToPlanetCenter:
            {
                var normal = math.normalize(sampledPoint);
                var angle  = (float)((weight * 1224133.0) % 1597.0);

                root.up = cachedTerrain.TransformVector(normal);
                root.Rotate(0.0f, angle, 0.0f, Space.Self);
            }
            break;
            }

            return(root);
        }
 public void ApplyMaterial()
 {
     if (Renderers != null)
     {
         for (var i = Renderers.Count - 1; i >= 0; i--)
         {
             SgtHelper.AddMaterial(Renderers[i], material);
         }
     }
 }
        public void AddRenderer(MeshRenderer renderer)
        {
            if (renderer != null)
            {
                if (Renderers == null)
                {
                    Renderers = new List <MeshRenderer>();
                }

                if (Renderers.Contains(renderer) == false)
                {
                    Renderers.Add(renderer);

                    SgtHelper.AddMaterial(renderer, material);
                }
            }
        }