Exemplo n.º 1
0
    private void CreateShadowVolume(ABakingTask completeBakingTask)
    {
        Transform root = GetRoot();

        Material debugMtrl = GetDebugMaterial();

        ShadowVolumeObject svObj = FindShadowVolumeObject(completeBakingTask.Transform.gameObject);

        if (svObj == null)
        {
            GameObject newMeshGo = new GameObject("_$SV " + completeBakingTask.Transform.gameObject.name + "$_");
            newMeshGo.transform.parent           = root;
            newMeshGo.transform.localScale       = completeBakingTask.Transform.lossyScale;
            newMeshGo.transform.localEulerAngles = completeBakingTask.Transform.eulerAngles;
            newMeshGo.transform.localPosition    = completeBakingTask.Transform.position;
            MeshFilter mf = newMeshGo.AddComponent <MeshFilter>();
            mf.sharedMesh = completeBakingTask.GetNewMesh();
            MeshRenderer mr = newMeshGo.AddComponent <MeshRenderer>();
            mr.sharedMaterial = debugMtrl;
            mr.enabled        = false;

            svObj                    = newMeshGo.AddComponent <ShadowVolumeObject>();
            svObj.source             = completeBakingTask.Transform.gameObject;
            svObj.sourceMeshRenderer = completeBakingTask.Transform.GetComponent <MeshRenderer>();
            svObj.sourceMeshFilter   = completeBakingTask.Transform.GetComponent <MeshFilter>();
            svObj.meshFilter         = mf;
            svObj.l2w                = mf.transform.localToWorldMatrix;
            svObj.wPos               = mf.transform.position;
        }
        else
        {
            svObj.transform.parent           = root;
            svObj.transform.localScale       = completeBakingTask.Transform.lossyScale;
            svObj.transform.localEulerAngles = completeBakingTask.Transform.eulerAngles;
            svObj.transform.localPosition    = completeBakingTask.Transform.position;

            svObj.l2w  = svObj.meshFilter.transform.localToWorldMatrix;
            svObj.wPos = svObj.meshFilter.transform.position;

            MeshFilter mf = svObj.gameObject.GetComponent <MeshFilter>();
            if (mf == null)
            {
                mf = svObj.gameObject.AddComponent <MeshFilter>();
            }
            mf.sharedMesh = completeBakingTask.GetNewMesh();

            MeshRenderer mr = svObj.gameObject.GetComponent <MeshRenderer>();
            if (mr == null)
            {
                mr = svObj.gameObject.AddComponent <MeshRenderer>();
            }
            mr.sharedMaterial = debugMtrl;
            mr.enabled        = false;
        }
    }