コード例 #1
0
    public override void OnInspectorGUI()
    {
        ShadowVolume source = (ShadowVolume)target;

        source.ShadowMesh = (Mesh)EditorGUILayout.ObjectField(new GUIContent("Shadow Mesh", shadowMeshTooltip), source.ShadowMesh, typeof(Mesh), false);

        source.IsSimple = EditorGUILayout.Toggle(new GUIContent("Is Simple", isSimpleTooltip), source.IsSimple);

        source.Layer = EditorGUILayout.LayerField(new GUIContent("Layer", layerTooltip), source.Layer);

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }
コード例 #2
0
    protected void SetupGameObject(Transform transform)
    {
        // Destroy existing shadow game objects before performing recursion
        foreach (Transform child in transform)
        {
            if (child.name.Contains("Shadow"))
            {
                DestroyImmediate(child.gameObject);
            }
        }

        // Recursively setup (non-shadow game object) children first
        if (setupChildren)
        {
            foreach (Transform child in transform)
            {
                SetupGameObject(child);
            }
        }

        // Add shadow game object
        if (!transform.name.Contains("Shadow"))
        {
            // Examine current game object
            MeshFilter          meshFilter          = transform.GetComponent <MeshFilter>();
            SkinnedMeshRenderer skinnedMeshRenderer = transform.GetComponent <SkinnedMeshRenderer>();

            if (meshFilter != null && meshFilter.sharedMesh != null)
            {
                // Add shadow volume component
                ShadowVolume shadowVolume = transform.gameObject.GetComponent <ShadowVolume>();

                if (shadowVolume == null)
                {
                    shadowVolume = transform.gameObject.AddComponent <ShadowVolume>();
                }

                shadowVolume.IsSimple = isSimple;
                shadowVolume.Layer    = layer;

                if (createShadowMeshes)
                {
                    Mesh shadowMesh = ShadowAssetCreator.CreateAsset(meshFilter.sharedMesh, boundsMargin);

                    shadowVolume.ShadowMesh = shadowMesh;
                }
            }
            else if (skinnedMeshRenderer != null && skinnedMeshRenderer.sharedMesh != null)
            {
                // Create skinned shadow game object
                GameObject shadowGameObject = new GameObject("Skinned Shadow");

                // Set Transform
                shadowGameObject.transform.parent        = transform;
                shadowGameObject.transform.localPosition = Vector3.zero;
                shadowGameObject.transform.localRotation = Quaternion.identity;
                shadowGameObject.transform.localScale    = Vector3.one;

                // Set SkinnedMeshRenderer
                SkinnedMeshRenderer shadowRenderer = shadowGameObject.AddComponent <SkinnedMeshRenderer>();

                if (createShadowMeshes)
                {
                    Mesh shadowMesh = ShadowAssetCreator.CreateAsset(skinnedMeshRenderer.sharedMesh, boundsMargin);

                    if (shadowMesh != null)
                    {
                        shadowRenderer.bones      = skinnedMeshRenderer.bones;
                        shadowRenderer.sharedMesh = shadowMesh;
                    }
                }

                // Set SkinnedShadowVolume
                SkinnedShadowVolume shadowVolume = shadowGameObject.AddComponent <SkinnedShadowVolume>();

                shadowVolume.IsSimple         = isSimple;
                shadowVolume.gameObject.layer = layer;
            }
        }
    }
コード例 #3
0
    public void Start()
    {
        ShadowVolumeRenderer shadowVolumeRenderer = ShadowVolumeRenderer.Instance;

        if (shadowVolumeRenderer == null)
        {
            return;
        }

        ShadowVolumeBackend backend   = shadowVolumeRenderer.Backend;
        ShadowVolume        component = GetComponent <ShadowVolume>();

        GameObject shadow = new GameObject("Shadow");

        shadow.layer = component.Layer;

        shadow.transform.parent        = gameObject.transform;
        shadow.transform.localPosition = Vector3.zero;
        shadow.transform.localRotation = Quaternion.identity;

        shadow.AddComponent <MeshFilter>().sharedMesh = component.ShadowMesh;

        Material[] materials = null;

        if (backend == ShadowVolumeBackend.StencilBuffer)
        {
            if (component.IsSimple)
            {
                materials = new Material[] { component.stencilFrontBack };
            }
            else
            {
                materials = new Material[] { component.stencilBackFrontAlways, component.stencilFrontBack };
            }
        }
        else if (backend == ShadowVolumeBackend.StencilBufferNoTwoSided)
        {
            if (component.IsSimple)
            {
                materials = new Material[] { component.stencilFront, component.stencilBack };
            }
            else
            {
                materials = new Material[] { component.stencilBackAlways, component.stencilFrontAlways, component.stencilFront, component.stencilBack };
            }
        }
        else if (backend == ShadowVolumeBackend.AlphaChannel)
        {
            if (component.IsSimple)
            {
                materials = new Material[] { component.alphaFront, component.alphaBack };
            }
            else
            {
                materials = new Material[] { component.alphaBackAlways, component.alphaFrontAlways, component.alphaFront, component.alphaBack };
            }
        }
        else if (backend == ShadowVolumeBackend.AlphaChannelNoBlendOp)
        {
            if (component.IsSimple)
            {
                materials = new Material[] { component.alphaFront, component.alphaBackNoBlendOp };
            }
            else
            {
                materials = new Material[] { component.alphaBackAlways, component.alphaFrontAlwaysNoBlendOp, component.alphaFront, component.alphaBackNoBlendOp };
            }
        }

        shadow.AddComponent <MeshRenderer>().sharedMaterials = materials;

        component.enabled = false;
    }