示例#1
0
    public int AddStar(SGT_StarfieldStarData ssd)
    {
        var starsPerMesh = SGT_Helper.MeshVertexLimit / 4;

        int rem; System.Math.DivRem(starfieldStarCount, starsPerMesh, out rem);

        // Add new mesh
        if (rem == 0)
        {
        }
        // Add to mesh
        else
        {
            var meshIndex = meshes.Length - 1;
            var mesh      = meshes[meshIndex];
            var meshData  = GetMeshData(mesh, meshIndex);
            var v0        = meshData.Positions.Length;

            meshData.AddPositions(new Vector3[4]);
            meshData.AddNormals(new Vector3[4]);
            meshData.AddColours(new Color[4]);
            meshData.AddUv0s(new Vector2[4]);
            meshData.AddUv1s(new Vector2[4]);
            meshData.AddIndices(new int[6] {
                v0, v0 + 1, v0 + 2, v0 + 3, v0 + 2, v0 + 1
            });
            meshData.Apply();
        }

        starfieldStarCount += 1;

        return(starfieldStarCount - 1);
    }
示例#2
0
    public SGT_StarfieldStarData ReadStar(int starIndex)
    {
        SGT_MeshData meshData;
        int          vertexIndex;

        if (FindStar(starIndex, out meshData, out vertexIndex) == true)
        {
            var ssd      = new SGT_StarfieldStarData();
            var position = meshData.Positions[vertexIndex];
            var uv0      = (meshData.Uv0s[vertexIndex] + meshData.Uv0s[vertexIndex + 3]) * 0.5f;
            var uv1      = meshData.Uv1s[vertexIndex];
            var colour   = meshData.Colours[vertexIndex];
            var normal   = meshData.Normals[vertexIndex] + meshData.Normals[vertexIndex + 1];

            ssd.Transform         = starfieldGameObject.transform;
            ssd.Position          = position;
            ssd.TextureIndex      = packer.FindOutputIndex(uv0);
            ssd.Angle             = -Mathf.Atan2(normal.x, normal.y);
            ssd.RadiusMin         = uv1.x - uv1.y;
            ssd.RadiusMax         = uv1.x + uv1.y;
            ssd.RadiusPulseRate   = colour.r;
            ssd.RadiusPulseOffset = colour.g;

            return(ssd);
        }

        return(null);
    }
    public SGT_StarfieldStarData ReadStar(int starIndex)
    {
        SGT_MeshData meshData;
        int          vertexIndex;

        if (FindStar(starIndex, out meshData, out vertexIndex) == true)
        {
            var ssd      = new SGT_StarfieldStarData();
            var position = meshData.Positions[vertexIndex];
            var uv0      = (meshData.Uv0s[vertexIndex] + meshData.Uv0s[vertexIndex + 3]) * 0.5f;
            var uv1      = meshData.Uv1s[vertexIndex];
            var colour   = meshData.Colours[vertexIndex];
            var normal   = meshData.Normals[vertexIndex] + meshData.Normals[vertexIndex + 1];

            ssd.Transform         = starfieldGameObject.transform;
            ssd.Position          = position;
            ssd.TextureIndex      = packer.FindOutputIndex(uv0);
            ssd.Angle             = -Mathf.Atan2(normal.x, normal.y);
            ssd.RadiusMin         = uv1.x - uv1.y;
            ssd.RadiusMax         = uv1.x + uv1.y;
            ssd.RadiusPulseRate   = colour.r;
            ssd.RadiusPulseOffset = colour.g;

            return ssd;
        }

        return null;
    }
    public int AddStar(SGT_StarfieldStarData ssd)
    {
        var starsPerMesh = SGT_Helper.MeshVertexLimit / 4;

        int rem; System.Math.DivRem(starfieldStarCount, starsPerMesh, out rem);

        // Add new mesh
        if (rem == 0)
        {
        }
        // Add to mesh
        else
        {
            var meshIndex = meshes.Length - 1;
            var mesh      = meshes[meshIndex];
            var meshData  = GetMeshData(mesh, meshIndex);
            var v0        = meshData.Positions.Length;

            meshData.AddPositions(new Vector3[4]);
            meshData.AddNormals(new Vector3[4]);
            meshData.AddColours(new Color[4]);
            meshData.AddUv0s(new Vector2[4]);
            meshData.AddUv1s(new Vector2[4]);
            meshData.AddIndices(new int[6] { v0, v0 + 1, v0 + 2, v0 + 3, v0 + 2, v0 + 1 });
            meshData.Apply();
        }

        starfieldStarCount += 1;

        return starfieldStarCount - 1;
    }
    private SGT_StarfieldStarData GenerateStar()
    {
        var starData    = new SGT_StarfieldStarData();
        var starVariant = GetStarVariant(weights.RandomIndex);

        if (starVariant.Custom == true)
        {
            var baseRadius = Random.Range(starVariant.CustomRadiusMin, starVariant.CustomRadiusMax);

            starData.RadiusMin = Mathf.Max(baseRadius - starVariant.CustomPulseRadiusMax, starVariant.CustomRadiusMin);
            starData.RadiusMax = Mathf.Min(baseRadius + starVariant.CustomPulseRadiusMax, starVariant.CustomRadiusMax);
        }
        else
        {
            var baseRadius = Random.Range(starRadiusMin, starRadiusMax);

            starData.RadiusMin = Mathf.Max(baseRadius - starPulseRadiusMax, starRadiusMin);
            starData.RadiusMax = Mathf.Min(baseRadius + starPulseRadiusMax, starRadiusMax);
        }

        starData.Variant           = starVariant;
        starData.Position          = GenerateStarPosition();
        starData.RadiusPulseRate   = Random.Range(0.0f, 1.0f);
        starData.RadiusPulseOffset = Random.Range(0.0f, 1.0f);
        starData.Angle             = Random.Range(-Mathf.PI, Mathf.PI);

        return(starData);
    }
	private SGT_StarfieldStarData GenerateStar()
	{
		var starData    = new SGT_StarfieldStarData();
		var starVariant = GetStarVariant(weights.RandomIndex);
		
		if (starVariant.Custom == true)
		{
			var baseRadius = Random.Range(starVariant.CustomRadiusMin, starVariant.CustomRadiusMax);
			
			starData.RadiusMin = Mathf.Max(baseRadius - starVariant.CustomPulseRadiusMax, starVariant.CustomRadiusMin);
			starData.RadiusMax = Mathf.Min(baseRadius + starVariant.CustomPulseRadiusMax, starVariant.CustomRadiusMax);
		}
		else
		{
			var baseRadius = Random.Range(starRadiusMin, starRadiusMax);
			
			starData.RadiusMin = Mathf.Max(baseRadius - starPulseRadiusMax, starRadiusMin);
			starData.RadiusMax = Mathf.Min(baseRadius + starPulseRadiusMax, starRadiusMax);
		}
		
		starData.Variant           = starVariant;
		starData.Position          = GenerateStarPosition();
		starData.RadiusPulseRate   = Random.Range(0.0f, 1.0f);
		starData.RadiusPulseOffset = Random.Range(0.0f, 1.0f);
		starData.Angle             = Random.Range(-Mathf.PI, Mathf.PI);
		
		return starData;
	}
    public override void OnInspector()
    {
        SGT_EditorGUI.Separator();

        SGT_EditorGUI.BeginGroup("Starfield");
        {
            Target.StarfieldStarCount    = SGT_EditorGUI.IntField("Star Count", "Amount of stars to generate in the starfield.", Target.StarfieldStarCount);
            Target.StarfieldSeed         = SGT_EditorGUI.SeedField("Seed", "The random seed to use when generating the starfield.", Target.StarfieldSeed);
            Target.StarfieldRenderQueue  = SGT_EditorGUI.IntField("Render Queue", "The render queue used by the starfield mesh.", Target.StarfieldRenderQueue);
            Target.StarfieldObserver     = SGT_EditorGUI.ObjectField("Observer", "The camera rendering this.", Target.StarfieldObserver, true);
            Target.StarfieldInBackground = SGT_EditorGUI.BoolField("In Background", "Push stars into background?", Target.StarfieldInBackground);
            Target.StarfieldAutoRegen    = SGT_EditorGUI.BoolField("Auto Regen", null, Target.StarfieldAutoRegen);

            if (Target.StarfieldAutoRegen == false)
            {
                SGT_EditorGUI.BeginFrozen(Target.Modified == true);
                {
                    if (SGT_EditorGUI.Button("Regenerate") == true)
                    {
                        Target.Regenerate();
                    }
                }
                SGT_EditorGUI.EndFrozen();
            }
        }
        SGT_EditorGUI.EndGroup();

        SGT_EditorGUI.Separator();

        SGT_EditorGUI.MarkNextFieldAsBold();
        Target.Distribution = (SGT_StarfieldDistribution)SGT_EditorGUI.EnumField("Distribution", "The star placement distribution.", Target.Distribution);
        SGT_EditorGUI.BeginIndent();
        {
            Target.DistributionRadius = SGT_EditorGUI.FloatField("Radius", "The size of the starfield across each axis.", Target.DistributionRadius);

            switch (Target.Distribution)
            {
            case SGT_StarfieldDistribution.InSphere:
            {
                Target.DistributionOuter = SGT_EditorGUI.FloatField("Outer", "The minimum radius for stars in the starfield.", Target.DistributionOuter, 0.0f, 1.0f);
            }
                goto case SGT_StarfieldDistribution.OnSphere;

            case SGT_StarfieldDistribution.EllipticalGalaxy:
            {
            }
                goto case SGT_StarfieldDistribution.OnSphere;

            case SGT_StarfieldDistribution.OnSphere:
            {
                Target.DistributionSymmetry = SGT_EditorGUI.FloatField("Symmetry", "A lower symmetry value will place more stars near the horizon/equator of the skysphere than at the poles.", Target.DistributionSymmetry, 0.0f, 1.0f);
            }
            break;
            }
        }
        SGT_EditorGUI.EndIndent();

        SGT_EditorGUI.Separator();

        SGT_EditorGUI.BeginGroup("Packer");
        {
            for (var i = 0; i < Target.Packer.InputCount; i++)
            {
                var input = Target.Packer.GetInput(i);

                SGT_EditorGUI.BeginIndent(true, 1);
                {
                    input.Texture = SGT_EditorGUI.ObjectField("Texture", null, input.Texture);

                    SGT_EditorGUI.MarkNextFieldAsBold(input.Tilesheet == true);
                    input.Tilesheet = SGT_EditorGUI.BoolField("Tilesheet", "Is this texture a tilesheet?", input.Tilesheet);

                    if (input.Tilesheet == true)
                    {
                        SGT_EditorGUI.BeginIndent();
                        {
                            input.TilesheetTilesX = SGT_EditorGUI.IntField("Tiles X", "The amount of tiles in this texture on the x axis.", input.TilesheetTilesX);
                            input.TilesheetTilesY = SGT_EditorGUI.IntField("Tiles Y", "The amount of tiles in this texture on the y axis.", input.TilesheetTilesY);
                        }
                        SGT_EditorGUI.EndIndent();
                    }

                    if (SGT_EditorGUI.Button("Remove") == true)
                    {
                        Target.Packer.RemoveInput(i);
                    }
                }
                SGT_EditorGUI.EndIndent();

                SGT_EditorGUI.Separator();
            }

            SGT_EditorGUI.BeginIndent(true, 1);
            {
                SGT_EditorGUI.MarkNextFieldAsError(Target.Packer.InputCount == 0);
                var newTexture = SGT_EditorGUI.ObjectField <Texture2D>("Add Texture", null, null);

                if (newTexture != null)
                {
                    var pi = new SGT_PackerInput();

                    pi.Texture = newTexture;

                    Target.Packer.AddInput(pi);
                }
            }
            SGT_EditorGUI.EndIndent();
        }
        SGT_EditorGUI.EndGroup();

        SGT_EditorGUI.Separator();

        SGT_EditorGUI.BeginGroup("Star");
        {
            Target.StarRadiusMin      = SGT_EditorGUI.FloatField("Radius Min", "The minimum radius of a star.", Target.StarRadiusMin);
            Target.StarRadiusMax      = SGT_EditorGUI.FloatField("Radius Max", "The maximum radius of a star.", Target.StarRadiusMax);
            Target.StarPulseRadiusMax = SGT_EditorGUI.FloatField("Pulse Radius Max", "The maximum amount a star's radius can change while pulsing (note: the final radius will always fall between the Star Radius Min/Max).", Target.StarPulseRadiusMax);
            Target.StarPulseRateMax   = SGT_EditorGUI.FloatField("Pulse Rate Max", "The maximum rate (speed) at which the stars can pulse.", Target.StarPulseRateMax);
        }
        SGT_EditorGUI.EndGroup();

        SGT_EditorGUI.Separator();

        editVariant = SGT_EditorGUI.BeginToggleGroup("Edit Star Variant", null, editVariant);
        {
            SGT_EditorGUI.MarkNextFieldAsBold();
            editVariantIndex = SGT_EditorGUI.IntField("Index", "The star variant currently being edited.", editVariantIndex, 0, Target.StarVariantCount - 1);

            var sv = Target.GetStarVariant(editVariantIndex);
            var po = Target.Packer.GetOutput(editVariantIndex);

            if (sv != null && po != null)
            {
                SGT_EditorGUI.BeginIndent();
                {
                    SGT_EditorGUI.DrawFieldTexture("Preview", null, po.OutputTexture, po.Uv);

                    sv.SpawnProbability = SGT_EditorGUI.FloatField("Spawn Probability", null, sv.SpawnProbability, 0.0f, 1.0f);

                    if (sv.Custom == true)
                    {
                        SGT_EditorGUI.MarkNextFieldAsBold();
                    }

                    var oldCustom = sv.Custom;

                    sv.Custom = SGT_EditorGUI.BoolField("Custom", null, sv.Custom);

                    if (sv.Custom == true)
                    {
                        if (oldCustom == false)
                        {
                            sv.CustomRadiusMin      = Target.StarRadiusMin;
                            sv.CustomRadiusMax      = Target.StarRadiusMax;
                            sv.CustomPulseRadiusMax = Target.StarPulseRadiusMax;
                            sv.CustomPulseRateMax   = Target.StarPulseRateMax;
                        }

                        SGT_EditorGUI.BeginIndent();
                        {
                            sv.CustomRadiusMin      = SGT_EditorGUI.FloatField("Radius Min", null, sv.CustomRadiusMin);
                            sv.CustomRadiusMax      = SGT_EditorGUI.FloatField("Radius Max", null, sv.CustomRadiusMax);
                            sv.CustomPulseRadiusMax = SGT_EditorGUI.FloatField("Pulse Radius Max", null, sv.CustomPulseRadiusMax);
                            sv.CustomPulseRateMax   = SGT_EditorGUI.FloatField("Pulse Rate Max", null, sv.CustomPulseRateMax);
                        }
                        SGT_EditorGUI.EndIndent();
                    }
                }
                SGT_EditorGUI.EndIndent();
            }
        }
        SGT_EditorGUI.EndToggleGroup();

        SGT_EditorGUI.Separator();

        editStar = SGT_EditorGUI.BeginToggleGroup("Edit Star", null, editStar);
        {
            SGT_EditorGUI.MarkNextFieldAsBold();
            editStarIndex = SGT_EditorGUI.IntField("Index", "The star currently being edited.", editStarIndex, 0, Target.StarfieldStarCount - 1);
            ssd           = Target.ReadStar(editStarIndex);

            if (ssd != null)
            {
                SGT_EditorGUI.BeginIndent();
                {
                    ssd.Position     = SGT_EditorGUI.Vector3Field("Position", null, ssd.Position);
                    ssd.TextureIndex = SGT_EditorGUI.IntField("Texture Index", null, ssd.TextureIndex, 0, Target.Packer.OutputCount - 1);
                    ssd.Angle        = SGT_EditorGUI.FloatField("Angle", null, ssd.Angle, -Mathf.PI, Mathf.PI);

                    SGT_EditorGUI.BeginGroup("Radius");
                    {
                        ssd.RadiusMin       = SGT_EditorGUI.FloatField("Min", null, ssd.RadiusMin);
                        ssd.RadiusMax       = SGT_EditorGUI.FloatField("Max", null, ssd.RadiusMax);
                        ssd.RadiusPulseRate = SGT_EditorGUI.FloatField("Pulse Rate", null, ssd.RadiusPulseRate, 0.0f, 1.0f);
                    }
                    SGT_EditorGUI.EndGroup();

                    SGT_EditorGUI.Separator();

                    if (SGT_EditorGUI.Button("Normalize Position") == true)
                    {
                        ssd.Position = ssd.Position.normalized * Target.DistributionRadius;
                    }

                    if (SGT_EditorGUI.Button("Clamp Radius") == true)
                    {
                        ssd.RadiusMin = Mathf.Clamp(ssd.RadiusMin, Target.StarRadiusMin, Target.StarRadiusMax);
                        ssd.RadiusMax = Mathf.Clamp(ssd.RadiusMax, Target.StarRadiusMin, Target.StarRadiusMax);
                    }

                    if (SGT_EditorGUI.Button("Duplicate") == true)
                    {
                        editStarIndex = Target.AddStar(ssd);
                    }

                    Target.WriteStar(ssd, editStarIndex);
                    Target.ApplyStarChanges();
                }
                SGT_EditorGUI.EndIndent();
            }
            else
            {
                SGT_EditorGUI.HelpBox("Failed to read star data.", MessageType.Error);
            }
        }
        SGT_EditorGUI.EndToggleGroup();

        SGT_EditorGUI.Separator();
    }
示例#8
0
    public void WriteStar(SGT_StarfieldStarData ssd, int starIndex)
    {
        if (ssd != null)
        {
            var po = packer.GetOutput(ssd.TextureIndex);

            if (po != null)
            {
                SGT_MeshData meshData;
                int          vertexIndex;

                if (FindStar(starIndex, out meshData, out vertexIndex) == true)
                {
                    var v0       = vertexIndex;
                    var v1       = v0 + 1;
                    var v2       = v1 + 1;
                    var v3       = v2 + 1;
                    var position = ssd.Position;
                    var uv1      = new Vector2((ssd.RadiusMin + ssd.RadiusMax) * 0.5f, (ssd.RadiusMax - ssd.RadiusMin) * 0.5f);
                    var colour   = new Color(ssd.RadiusPulseRate, ssd.RadiusPulseOffset, 0.0f, 0.0f);
                    var right    = SGT_Helper.Rotate(Vector2.right * SGT_Helper.InscribedBox, ssd.Angle);
                    var up       = SGT_Helper.Rotate(Vector2.up * SGT_Helper.InscribedBox, ssd.Angle);

                    if (meshData.Positions[v0] != position)
                    {
                        meshData.Positions[v0] = position;
                        meshData.Positions[v1] = position;
                        meshData.Positions[v2] = position;
                        meshData.Positions[v3] = position;

                        meshData.Modified = true;
                    }

                    if (meshData.Normals[v0] != SGT_Helper.NewVector3(-right + up, 0.0f))
                    {
                        meshData.Normals[v0] = SGT_Helper.NewVector3(-right + up, 0.0f);
                        meshData.Normals[v1] = SGT_Helper.NewVector3(right + up, 0.0f);
                        meshData.Normals[v2] = SGT_Helper.NewVector3(-right - up, 0.0f);
                        meshData.Normals[v3] = SGT_Helper.NewVector3(right - up, 0.0f);

                        meshData.Modified = true;
                    }

                    if (meshData.Uv0s[v0] != po.UvTopLeft && meshData.Uv0s[v3] != po.UvBottomRight)
                    {
                        meshData.Uv0s[v0] = po.UvTopLeft;
                        meshData.Uv0s[v1] = po.UvTopRight;
                        meshData.Uv0s[v2] = po.UvBottomLeft;
                        meshData.Uv0s[v3] = po.UvBottomRight;

                        meshData.Modified = true;
                    }

                    if (meshData.Uv1s[v0] != uv1)
                    {
                        meshData.Uv1s[v0] = uv1;
                        meshData.Uv1s[v1] = uv1;
                        meshData.Uv1s[v2] = uv1;
                        meshData.Uv1s[v3] = uv1;

                        meshData.Modified = true;
                    }

                    if (meshData.Colours[v0] != colour)
                    {
                        meshData.Colours[v0] = colour;
                        meshData.Colours[v1] = colour;
                        meshData.Colours[v2] = colour;
                        meshData.Colours[v3] = colour;

                        meshData.Modified = true;
                    }
                }
            }
        }
    }
    public void WriteStar(SGT_StarfieldStarData ssd, int starIndex)
    {
        if (ssd != null)
        {
            var po = packer.GetOutput(ssd.TextureIndex);

            if (po != null)
            {
                SGT_MeshData meshData;
                int          vertexIndex;

                if (FindStar(starIndex, out meshData, out vertexIndex) == true)
                {
                    var v0       = vertexIndex;
                    var v1       = v0 + 1;
                    var v2       = v1 + 1;
                    var v3       = v2 + 1;
                    var position = ssd.Position;
                    var uv1      = new Vector2((ssd.RadiusMin + ssd.RadiusMax) * 0.5f, (ssd.RadiusMax - ssd.RadiusMin) * 0.5f);
                    var colour   = new Color(ssd.RadiusPulseRate, ssd.RadiusPulseOffset, 0.0f, 0.0f);
                    var right    = SGT_Helper.Rotate(Vector2.right * SGT_Helper.InscribedBox, ssd.Angle);
                    var up       = SGT_Helper.Rotate(Vector2.up    * SGT_Helper.InscribedBox, ssd.Angle);

                    if (meshData.Positions[v0] != position)
                    {
                        meshData.Positions[v0] = position;
                        meshData.Positions[v1] = position;
                        meshData.Positions[v2] = position;
                        meshData.Positions[v3] = position;

                        meshData.Modified = true;
                    }

                    if (meshData.Normals[v0] != SGT_Helper.NewVector3(-right + up, 0.0f))
                    {
                        meshData.Normals[v0] = SGT_Helper.NewVector3(-right + up, 0.0f);
                        meshData.Normals[v1] = SGT_Helper.NewVector3( right + up, 0.0f);
                        meshData.Normals[v2] = SGT_Helper.NewVector3(-right - up, 0.0f);
                        meshData.Normals[v3] = SGT_Helper.NewVector3( right - up, 0.0f);

                        meshData.Modified = true;
                    }

                    if (meshData.Uv0s[v0] != po.UvTopLeft && meshData.Uv0s[v3] != po.UvBottomRight)
                    {
                        meshData.Uv0s[v0] = po.UvTopLeft;
                        meshData.Uv0s[v1] = po.UvTopRight;
                        meshData.Uv0s[v2] = po.UvBottomLeft;
                        meshData.Uv0s[v3] = po.UvBottomRight;

                        meshData.Modified = true;
                    }

                    if (meshData.Uv1s[v0] != uv1)
                    {
                        meshData.Uv1s[v0] = uv1;
                        meshData.Uv1s[v1] = uv1;
                        meshData.Uv1s[v2] = uv1;
                        meshData.Uv1s[v3] = uv1;

                        meshData.Modified = true;
                    }

                    if (meshData.Colours[v0] != colour)
                    {
                        meshData.Colours[v0] = colour;
                        meshData.Colours[v1] = colour;
                        meshData.Colours[v2] = colour;
                        meshData.Colours[v3] = colour;

                        meshData.Modified = true;
                    }
                }
            }
        }
    }