Exemple #1
0
        public static Texture2D getPlanetTexture(Body body)
        {
            Texture2D tex = new Texture2D(NOISE_TEXTURE_SIZE, NOISE_TEXTURE_SIZE);
            Color[] cols = new Color[NOISE_TEXTURE_SIZE * NOISE_TEXTURE_SIZE];

            int x = 0;
            int y = 0;
            while (y < tex.height)
            {
                x = 0;
                while (x < tex.width)
                {
                    float xCoord = perlinX + (float)x / tex.width * 2f * body.BodyRadius;
                    float yCoord = perlinY + (float)y / tex.height * 2f * body.BodyRadius;
                    float sample = Mathf.PerlinNoise(xCoord, yCoord);
                    cols[y * tex.width + x] = Color.Lerp(body.SkyColor, body.CloudColor, sample);
                    x++;
                }
                y++;
            }

            perlinX = x;
            perlinY = y;

            tex.SetPixels(cols);
            tex.Apply();

            return tex;
        }
Exemple #2
0
        public static Ship newShip(int t, Body source, Body target)
        {
            GameObject o = new GameObject();
            Ship s = o.AddComponent<Ship>();

            ConeMaker.makeCone(o);
            MeshRenderer rend = o.AddComponent<MeshRenderer>();
            BoxCollider collider = o.AddComponent <BoxCollider>();

            Helpers.AddTrails(o, null);

            o.transform.position = Vector3.zero;

            o.transform.Rotate(Vector3.left, 90);

            rend.material = new Material(Shader.Find("Diffuse"));
            rend.material.mainTexture = Resources.Load<Texture>("redship");

            s.ShipType = t;
            s.Source = source;
            s.Target = target;
            o.SetActive(false);

            return s;
        }
Exemple #3
0
 public static void AddTrails(GameObject o, Body body)
 {
     TrailRenderer tr = o.AddComponent<TrailRenderer>();
     tr.castShadows = false;
     tr.receiveShadows = false;
     tr.material = getTrailMaterial();
     if(body != null)
         tr.time = body.Period * 4;
     else
         tr.time = 4;
     tr.startWidth = 0.1f;
     tr.endWidth = 0.1f;
 }
Exemple #4
0
 public static Material getPlanetMaterial(Body planet)
 {
     Material mat = new Material(Shader.Find("goffmog/PlanetShader"));
     mat.mainTexture = getPlanetTexture(planet);
     return mat;
 }
 public void StartPanningToBody(Body b)
 {
     target = b;
     panningToBody = true;
 }
        public static void Spherify(GameObject obj, Body body)
        {
            MeshFilter filter = obj.AddComponent< MeshFilter >();
            MeshRenderer render = obj.AddComponent<MeshRenderer>();
            SphereCollider coll = obj.AddComponent<SphereCollider>();
            coll.radius = body.BodyRadius;
            render.material = Helpers.getPlanetMaterial(body);
            body.BodyTexture = (Texture2D)render.material.mainTexture;
            Mesh mesh = filter.mesh;
            mesh.Clear();

            // Longitude |||
            int nbLong = 16 * (int)Mathf.Clamp(body.BodyRadius/2,1,10);
            // Latitude ---
            int nbLat = 8 * (int)Mathf.Clamp(body.BodyRadius / 2, 1, 10);

            #region Vertices
            Vector3[] vertices = new Vector3[(nbLong+1) * nbLat + 2];
            float _pi = Mathf.PI;
            float _2pi = _pi * 2f;

            vertices[0] = Vector3.up * body.BodyRadius;
            for( int lat = 0; lat < nbLat; lat++ )
            {
                float a1 = _pi * (float)(lat+1) / (nbLat+1);
                float sin1 = Mathf.Sin(a1);
                float cos1 = Mathf.Cos(a1);

                for( int lon = 0; lon <= nbLong; lon++ )
                {
                    float a2 = _2pi * (float)(lon == nbLong ? 0 : lon) / nbLong;
                    float sin2 = Mathf.Sin(a2);
                    float cos2 = Mathf.Cos(a2);

                    vertices[lon + lat * (nbLong + 1) + 1] = new Vector3(sin1 * cos2, cos1, sin1 * sin2) * body.BodyRadius;
                }
            }
            vertices[vertices.Length - 1] = Vector3.up * -body.BodyRadius;
            #endregion

            #region Normales
            Vector3[] normales = new Vector3[vertices.Length];
            for( int n = 0; n < vertices.Length; n++ )
                normales[n] = vertices[n].normalized;
            #endregion

            #region UVs
            Vector2[] uvs = new Vector2[vertices.Length];
            uvs[0] = Vector2.up;
            uvs[uvs.Length-1] = Vector2.zero;
            for( int lat = 0; lat < nbLat; lat++ )
                for( int lon = 0; lon <= nbLong; lon++ )
                    uvs[lon + lat * (nbLong + 1) + 1] = new Vector2( (float)lon / nbLong, 1f - (float)(lat+1) / (nbLat+1) );
            #endregion

            #region Triangles
            int nbFaces = vertices.Length;
            int nbTriangles = nbFaces * 2;
            int nbIndexes = nbTriangles * 3;
            int[] triangles = new int[ nbIndexes ];

            //Top Cap
            int i = 0;
            for( int lon = 0; lon < nbLong; lon++ )
            {
                triangles[i++] = lon+2;
                triangles[i++] = lon+1;
                triangles[i++] = 0;
            }

            //Middle
            for( int lat = 0; lat < nbLat - 1; lat++ )
            {
                for( int lon = 0; lon < nbLong; lon++ )
                {
                    int current = lon + lat * (nbLong + 1) + 1;
                    int next = current + nbLong + 1;

                    triangles[i++] = current;
                    triangles[i++] = current + 1;
                    triangles[i++] = next + 1;

                    triangles[i++] = current;
                    triangles[i++] = next + 1;
                    triangles[i++] = next;
                }
            }

            //Bottom Cap
            for( int lon = 0; lon < nbLong; lon++ )
            {
                triangles[i++] = vertices.Length - 1;
                triangles[i++] = vertices.Length - (lon+2) - 1;
                triangles[i++] = vertices.Length - (lon+1) - 1;
            }
            #endregion

            mesh.vertices = vertices;
            mesh.normals = normales;
            mesh.uv = uvs;
            mesh.triangles = triangles;

            mesh.RecalculateBounds();
            mesh.Optimize();
        }
Exemple #7
0
        public static void createMoonsForPlanet(Body planet, bool outer)
        {
            int chance = outer ? 3 : 5;

            if ((Helpers.GalacticRandom.Next(6) + 1) < chance)
                return;

            int numberOfMoons = outer ? Helpers.GetFibonacci(1,6) : Helpers.GetSmallFibonacci();

            float lastorbit = Helpers.GetFibonacci(0,7);
            float lastradius = 0;

            for(int i = 0; i < numberOfMoons; i++)
            {
                Body moon = createMoon(ref lastorbit, ref lastradius, planet.BodyRadius, outer);
                moon.BodyType = BODY_TYPE_MOON;
                planet.childBodies.Add(moon);
                moon.ParentBody = planet;
            }

            planet.ClearedOrbit = lastorbit + lastradius;
        }
        public static GameObject MakeTorus(Body body)
        {
            GameObject o = new GameObject();
            o.transform.position = Vector3.zero;

            MeshFilter filter = o.AddComponent< MeshFilter >();
            MeshRenderer render = o.AddComponent<MeshRenderer>();
            render.receiveShadows = false;
            render.castShadows = false;
            render.material = new Material(Shader.Find("Unlit/Transparent"));
            render.material.mainTexture = (Texture)Resources.Load<Texture>("ring");
            Mesh mesh = filter.mesh;
            mesh.Clear();

            float radius1 = body.Orbit;
            float radius2 = 0.08f;
            int nbRadSeg = 512;
            int nbSides = 16;

            #region Vertices
            Vector3[] vertices = new Vector3[(nbRadSeg+1) * (nbSides+1)];
            float _2pi = Mathf.PI * 2f;
            for( int seg = 0; seg <= nbRadSeg; seg++ )
            {
                int currSeg = seg  == nbRadSeg ? 0 : seg;

                float t1 = (float)currSeg / nbRadSeg * _2pi;
                Vector3 r1 = new Vector3( Mathf.Cos(t1) * radius1, 0f, Mathf.Sin(t1) * radius1 );

                for( int side = 0; side <= nbSides; side++ )
                {
                    int currSide = side == nbSides ? 0 : side;

                    Vector3 normale = Vector3.Cross( r1, Vector3.up );
                    float t2 = (float)currSide / nbSides * _2pi;
                    Vector3 r2 = Quaternion.AngleAxis( -t1 * Mathf.Rad2Deg, Vector3.up ) *new Vector3( Mathf.Sin(t2) * radius2, Mathf.Cos(t2) * radius2 );

                    vertices[side + seg * (nbSides+1)] = r1 + r2;
                }
            }
            #endregion

            #region Normales
            Vector3[] normales = new Vector3[vertices.Length];
            for( int seg = 0; seg <= nbRadSeg; seg++ )
            {
                int currSeg = seg  == nbRadSeg ? 0 : seg;

                float t1 = (float)currSeg / nbRadSeg * _2pi;
                Vector3 r1 = new Vector3( Mathf.Cos(t1) * radius1, 0f, Mathf.Sin(t1) * radius1 );

                for( int side = 0; side <= nbSides; side++ )
                {
                    normales[side + seg * (nbSides+1)] = (vertices[side + seg * (nbSides+1)] - r1).normalized;
                }
            }
            #endregion

            #region UVs
            Vector2[] uvs = new Vector2[vertices.Length];
            for( int seg = 0; seg <= nbRadSeg; seg++ )
                for( int side = 0; side <= nbSides; side++ )
                    uvs[side + seg * (nbSides+1)] = new Vector2( (float)seg / nbRadSeg, (float)side / nbSides );
            #endregion

            #region Triangles
            int nbFaces = vertices.Length;
            int nbTriangles = nbFaces * 2;
            int nbIndexes = nbTriangles * 3;
            int[] triangles = new int[ nbIndexes ];

            int i = 0;
            for( int seg = 0; seg <= nbRadSeg; seg++ )
            {
                for( int side = 0; side <= nbSides - 1; side++ )
                {
                    int current = side + seg * (nbSides+1);
                    int next = side + (seg < (nbRadSeg) ?(seg+1) * (nbSides+1) : 0);

                    if( i < triangles.Length - 6 )
                    {
                        triangles[i++] = current;
                        triangles[i++] = next;
                        triangles[i++] = next+1;

                        triangles[i++] = current;
                        triangles[i++] = next+1;
                        triangles[i++] = current+1;
                    }
                }
            }
            #endregion

            mesh.vertices = vertices;
            mesh.normals = normales;
            mesh.uv = uvs;
            mesh.triangles = triangles;

            mesh.RecalculateBounds();
            mesh.Optimize();

            return o;
        }