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; }
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; }
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; }
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(); }
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; }