Example #1
0
    public void SetSharedMaterials(Material newSharedMaterial)
    {
        var surfaceCount = SGT_SurfaceConfiguration_.SurfaceCount(configuration);

        for (var i = 0; i < surfaceCount; i++)
        {
            SetSharedMaterial(newSharedMaterial, i);
        }
    }
    private void UpdateMaterial()
    {
        var targetSurfaceTechnique    = "Variant";
        var targetAtmosphereTechnique = "Variant";

        if (starObserver != null)
        {
            if (InsideAtmosphere(starObserver.transform.position) == false)
            {
                targetSurfaceTechnique    += "Outer";
                targetAtmosphereTechnique += "Outer";
            }
        }

        if (atmosphereSurfacePerPixel == true)
        {
            targetSurfaceTechnique += "PerPixel";
        }

        // Update surface?
        if (surfaceMaterials == null || (surfaceTechnique != targetSurfaceTechnique || SGT_ArrayHelper.ContainsSomething(surfaceMaterials) == false || surfaceMaterials.Length != SGT_SurfaceConfiguration_.SurfaceCount(SurfaceConfiguration)))
        {
            SGT_Helper.DestroyObjects(surfaceMaterials);

            surfaceTechnique = targetSurfaceTechnique;
            surfaceMaterials = SGT_SurfaceConfiguration_.CreateMaterials(surfaceMultiMesh.Configuration, "Hidden/SGT/StarSurface/" + surfaceTechnique, surfaceRenderQueue);
        }
        else
        {
            SGT_Helper.SetRenderQueues(surfaceMaterials, surfaceRenderQueue);
        }

        // Update atmosphere?
        if (atmosphereTechnique != targetAtmosphereTechnique || atmosphereMaterial == null)
        {
            SGT_Helper.DestroyObject(atmosphereMaterial);

            atmosphereTechnique = targetAtmosphereTechnique;
            atmosphereMaterial  = SGT_Helper.CreateMaterial("Hidden/SGT/StarAtmosphere/" + atmosphereTechnique, atmosphereRenderQueue);
        }
        else
        {
            SGT_Helper.SetRenderQueue(atmosphereMaterial, atmosphereRenderQueue);
        }
    }
    private void UpdateTechnique()
    {
        var targetSurfaceTechnique    = "Variant";
        var targetAtmosphereTechnique = string.Empty;
        var tagetCloudsTechnique      = string.Empty;

        if (atmosphere == true)
        {
            targetSurfaceTechnique   += "Atmosphere";
            targetAtmosphereTechnique = "Variant";

            if (planetObserver != null)
            {
                if (InsideAtmosphere(planetObserver.transform.position) == false)
                {
                    targetSurfaceTechnique    += "Outer";
                    targetAtmosphereTechnique += "Outer";
                }
            }

            if (atmosphereScattering == true)
            {
                //targetSurfaceTechnique    += "Scattering";
                targetAtmosphereTechnique += "Scattering";
            }
        }

        if (clouds == true)
        {
            tagetCloudsTechnique = "Variant";
        }

        if (surfaceTextureNormal.ContainsSomething == true)
        {
            targetSurfaceTechnique += "Normal";
        }

        if (surfaceTextureSpecular.ContainsSomething == true)
        {
            targetSurfaceTechnique += "Specular";
        }

        if (shadow == true)
        {
            switch (shadowCasterType)
            {
            case SGT_ShadowOccluder.Ring:
            {
                targetSurfaceTechnique += "RingShadow";

                if (atmosphere == true)
                {
                    targetAtmosphereTechnique += "RingShadow";
                }

                if (clouds == true)
                {
                    tagetCloudsTechnique += "RingShadow";
                }
            }
            break;

            case SGT_ShadowOccluder.Planet:
            {
                targetSurfaceTechnique += "PlanetShadow";

                if (atmosphere == true)
                {
                    targetAtmosphereTechnique += "PlanetShadow";
                }

                if (clouds == true)
                {
                    tagetCloudsTechnique += "PlanetShadow";
                }
            }
            break;
            }
        }

        if (surfaceTextureDetail != null)
        {
            targetSurfaceTechnique += "Detail";
        }

        if (surfaceMaterials != null && (surfaceTechnique != targetSurfaceTechnique || SGT_ArrayHelper.ContainsSomething(surfaceMaterials) == false || surfaceMaterials.Length != SGT_SurfaceConfiguration_.SurfaceCount(SurfaceConfiguration)))
        {
            surfaceMaterials = SGT_Helper.DestroyObjects(surfaceMaterials);
        }

        if (atmosphereMaterial != null && (atmosphere == false || atmosphereTechnique != targetAtmosphereTechnique))
        {
            atmosphereMaterial = SGT_Helper.DestroyObject(atmosphereMaterial);
        }

        if (cloudsMaterials != null && (clouds == false || cloudsTechnique != tagetCloudsTechnique || SGT_ArrayHelper.ContainsSomething(cloudsMaterials) == false || cloudsMaterials.Length != SGT_SurfaceConfiguration_.SurfaceCount(CloudsConfiguration)))
        {
            cloudsMaterials = SGT_Helper.DestroyObjects(cloudsMaterials);
        }

        // Create planet surface shaders?
        if (surfaceMaterials == null)
        {
            updateShader    |= ShaderFlags.Surface;
            surfaceTechnique = targetSurfaceTechnique;
            surfaceMaterials = SGT_SurfaceConfiguration_.CreateMaterials(SurfaceConfiguration, "Hidden/SGT/PlanetSurface/" + surfaceTechnique, surfaceRenderQueue);
        }
        else
        {
            SGT_Helper.SetRenderQueues(surfaceMaterials, surfaceRenderQueue);
        }

        // Create planet atmosphere shaders?
        if (atmosphere == true)
        {
            if (atmosphereMaterial == null)
            {
                updateShader       |= ShaderFlags.Atmosphere;
                atmosphereTechnique = targetAtmosphereTechnique;
                atmosphereMaterial  = SGT_Helper.CreateMaterial("Hidden/SGT/PlanetAtmosphere/" + atmosphereTechnique, atmosphereRenderQueue);
            }
            else
            {
                SGT_Helper.SetRenderQueue(atmosphereMaterial, atmosphereRenderQueue);
            }
        }

        // Create planet cloud shaders?
        if (clouds == true)
        {
            if (cloudsMaterials == null)
            {
                updateShader   |= ShaderFlags.Clouds;
                cloudsTechnique = tagetCloudsTechnique;
                cloudsMaterials = SGT_SurfaceConfiguration_.CreateMaterials(CloudsConfiguration, "Hidden/SGT/PlanetClouds/" + cloudsTechnique, atmosphereRenderQueue);
            }
            else
            {
                SGT_Helper.SetRenderQueues(cloudsMaterials, atmosphereRenderQueue);
            }
        }
        else
        {
            if (cloudsMaterials != null)
            {
                cloudsMaterials = SGT_Helper.DestroyObjects(cloudsMaterials);
            }
        }
    }
    private System.Collections.IEnumerator Update_Coroutine()
    {
        if (patchIndices == null)
        {
            RebuildPatchIndices();
        }

        sideCombinedMeshes = new Mesh[6][];

        // Main loop
        for (;;)
        {
            if (sides != null)
            {
                var sgtVector3 = new SGT_FillVector3();
                SendMessage("FillSurfaceObserverPosition", sgtVector3, SendMessageOptions.DontRequireReceiver);
                surfaceObserverPosition = sgtVector3.Vector3;

                var splitList = new PatchList();

                // Begin budgeting
                budgetUsage.Reset();
                budgetUsage.Start();

                // Update all patches
                for (var i = 0; i < sides.Length; i++)
                {
                    UpdatePatch(sides[i], surfaceObserverPosition, splitList);

                    /* Defer operation? */ if (OverBudgetCheck("Update Patches") == true)
                    {
                        yield return(new WaitForEndOfFrame()); budgetUsage.Reset(); budgetUsage.Start();
                    }
                }

                // Split patches?
                if (splitList.Count > 0)
                {
                    var splitCount = 0;

                    for (var i = 0; i < splitList.Count; i++)
                    {
                        splitCount += 1;

                        SplitPatch(splitList[i]);

                        if (splitCount == maxSplitsPerFrame)
                        {
                            splitCount = 0;

                            /* Defer operation? */ if (OverBudgetCheck("Split Patches") == true)
                            {
                                yield return(new WaitForEndOfFrame()); budgetUsage.Reset(); budgetUsage.Start();
                            }
                        }
                    }
                }

                // Rebuild mesh?
                if (rebuild == true)
                {
                    rebuild = false;

                    var totalSurfaces         = SGT_SurfaceConfiguration_.SurfaceCount(surfaceConfiguration);
                    var newSideCombinedMeshes = new Mesh[6][];

                    for (var surfaceIndex = 0; surfaceIndex < totalSurfaces; surfaceIndex++)
                    {
                        var buildList = new PatchList();

                        // Begin budgeting
                        budgetUsage.Reset();
                        budgetUsage.Start();

                        switch (surfaceConfiguration)
                        {
                        case SGT_SurfaceConfiguration.Sphere:
                        {
                            for (var i = 0; i < 6; i++)
                            {
                                BuildPatch(sides[i], buildList);

                                /* Defer operation? */ if (OverBudgetCheck("Build Patches") == true)
                                {
                                    yield return(new WaitForEndOfFrame()); budgetUsage.Reset(); budgetUsage.Start();
                                }
                            }
                        }
                        break;

                        case SGT_SurfaceConfiguration.Cube:
                        {
                            BuildPatch(sides[surfaceIndex], buildList);

                            /* Defer operation? */ if (OverBudgetCheck("Build Patches") == true)
                            {
                                yield return(new WaitForEndOfFrame()); budgetUsage.Reset(); budgetUsage.Start();
                            }
                        }
                        break;
                        }

                        // Stitch patches
                        var stitchCount = 0;

                        for (var i = 0; i < buildList.Count; i++)
                        {
                            stitchCount += 1;

                            StitchPatch(buildList[i]);

                            if (stitchCount == maxStitchesPerFrame)
                            {
                                stitchCount = 0;

                                /* Defer operation? */ if (OverBudgetCheck("Sitch Patches") == true)
                                {
                                    yield return(new WaitForEndOfFrame()); budgetUsage.Reset(); budgetUsage.Start();
                                }
                            }
                        }

                        var combinedMeshesList = new MeshList();
                        var combineFrom        = 0;
                        var patchesPerMesh     = verticesPerMesh / ((patchResolution + 1) * (patchResolution + 1));

                        // Create sub meshes
                        for (var i = 0; i < buildList.Count; i++)
                        {
                            var combineCount = (i + 1) - combineFrom;

                            if (combineCount == patchesPerMesh || i == (buildList.Count - 1))
                            {
                                var combinedMesh = CombinePatches(buildList, combineFrom, combineFrom + combineCount);

                                combinedMeshesList.Add(combinedMesh);

                                combineFrom = i + 1;

                                /* Defer operation? */ if (OverBudgetCheck("Combine Patches") == true)
                                {
                                    yield return(new WaitForEndOfFrame()); budgetUsage.Reset(); budgetUsage.Start();
                                }
                            }
                        }

                        var combinedMeshes = combinedMeshesList.ToArray();

                        // Append index to name?
                        if (combinedMeshes.Length > 1)
                        {
                            for (var i = 0; i < combinedMeshes.Length; i++)
                            {
                                combinedMeshes[i].name = "(" + (i + 1) + "/" + combinedMeshes.Length + ") " + combinedMeshes[i].name;
                            }
                        }

                        newSideCombinedMeshes[surfaceIndex] = combinedMeshes;
                    }

                    // Delete old meshes and swap
                    for (var i = 0; i < 6; i++)
                    {
                        SGT_Helper.DestroyObjects(sideCombinedMeshes[i]);
                    }

                    sideCombinedMeshes = newSideCombinedMeshes;

                    var generatedSurfaceMultiMesh = new SGT_SurfaceMultiMesh();

                    generatedSurfaceMultiMesh.Configuration = surfaceConfiguration;

                    for (var i = 0; i < totalSurfaces; i++)
                    {
                        generatedSurfaceMultiMesh.ReplaceAll(sideCombinedMeshes[i], i);
                    }

                    SendMessage("SetSurfaceMultiMesh", generatedSurfaceMultiMesh, SendMessageOptions.DontRequireReceiver);

                    SendMessage("TessellationFinished", this, SendMessageOptions.DontRequireReceiver);
                }
            }

            if (minUpdateInterval > 0.0f)
            {
                yield return(new WaitForSeconds(minUpdateInterval));
            }
            else
            {
                yield return(new WaitForEndOfFrame());
            }
        }
    }