public Material GetLightMappedMaterial(Material baseMaterial, LightMapReference lightMapRef)
        {
            var flags = LightMappingFlags.Lightmapped;

            if (lightMapRef.LightMaps.hasDirections)
            {
                flags |= LightMappingFlags.Directional;
            }
            if (lightMapRef.LightMaps.hasShadowMask)
            {
                flags |= LightMappingFlags.ShadowMask;
            }

            var key = new MaterialLookupKey
            {
                BaseMaterial = baseMaterial,
                LightMaps    = lightMapRef.LightMaps,
                Flags        = flags
            };

            if (m_LightMappedMaterialCache.TryGetValue(key, out var lightMappedMaterial))
            {
                ++m_NumLightMappedMaterialCacheHits;
                return(lightMappedMaterial);
            }
            else
            {
                ++m_NumLightMappedMaterialCacheMisses;
                lightMappedMaterial             = CreateLightMappedMaterial(baseMaterial, lightMapRef.LightMaps);
                m_LightMappedMaterialCache[key] = lightMappedMaterial;
                return(lightMappedMaterial);
            }
        }
Example #2
0
        private static void AddComponentsToEntity(
            Entity entity,
            EntityManager dstEntityManager,
            GameObjectConversionSystem conversionSystem,
            Renderer meshRenderer,
            Mesh mesh,
            List <Material> materials,
            Dictionary <MaterialLookupKey, Material> createdMaterials,
            bool flipWinding,
            int id,
            LightMaps lightMaps,
            int lightmapIndex,
            AABB localBounds)
        {
            var needMotionVectorPass = (meshRenderer.motionVectorGenerationMode == MotionVectorGenerationMode.Object) ||
                                       (meshRenderer.motionVectorGenerationMode == MotionVectorGenerationMode.ForceNoMotion);

            var renderMesh = new RenderMesh
            {
                mesh                 = mesh,
                castShadows          = meshRenderer.shadowCastingMode,
                receiveShadows       = meshRenderer.receiveShadows,
                layer                = meshRenderer.gameObject.layer,
                subMesh              = id,
                needMotionVectorPass = needMotionVectorPass
            };

            var staticLightingMode = StaticLightingMode.None;

            if (meshRenderer.lightmapIndex >= 65534 || meshRenderer.lightmapIndex < 0)
            {
                staticLightingMode = StaticLightingMode.LightProbes;
            }
            else if (meshRenderer.lightmapIndex >= 0)
            {
                staticLightingMode = StaticLightingMode.Lightmapped;
            }

            dstEntityManager.AddComponentData(entity, new PerInstanceCullingTag());
            dstEntityManager.AddComponentData(entity, new RenderBounds {
                Value = localBounds
            });

            var material = materials[id];

            if (staticLightingMode == StaticLightingMode.Lightmapped && lightMaps.isValid)
            {
                conversionSystem.DeclareAssetDependency(meshRenderer.gameObject, material);

                var localFlags = LightMappingFlags.Lightmapped;
                if (lightMaps.hasDirections)
                {
                    localFlags |= LightMappingFlags.Directional;
                }
                if (lightMaps.hasShadowMask)
                {
                    localFlags |= LightMappingFlags.ShadowMask;
                }

                var key = new MaterialLookupKey
                {
                    BaseMaterial = materials[id],
                    lightmaps    = lightMaps,
                    Flags        = localFlags
                };

                var lookUp = createdMaterials ?? new Dictionary <MaterialLookupKey, Material>();
                if (lookUp.TryGetValue(key, out Material result))
                {
                    material = result;
                }
                else
                {
                    material      = new Material(materials[id]);
                    material.name = $"{material.name}_Lightmapped_";
                    material.EnableKeyword("LIGHTMAP_ON");

                    material.SetTexture("unity_Lightmaps", lightMaps.colors);
                    material.SetTexture("unity_LightmapsInd", lightMaps.directions);
                    material.SetTexture("unity_ShadowMasks", lightMaps.shadowMasks);

                    if (lightMaps.hasDirections)
                    {
                        material.name = material.name + "_DIRLIGHTMAP";
                        material.EnableKeyword("DIRLIGHTMAP_COMBINED");
                    }

                    if (lightMaps.hasShadowMask)
                    {
                        material.name = material.name + "_SHADOW_MASK";
                    }

                    lookUp[key] = material;
                }
                dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_LightmapST()
                {
                    Value = meshRenderer.lightmapScaleOffset
                });
                dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_LightmapIndex()
                {
                    Value = lightmapIndex
                });
                dstEntityManager.AddSharedComponentData(entity, lightMaps);
            }
            else if (staticLightingMode == StaticLightingMode.LightProbes)
            {
                if (meshRenderer.lightProbeUsage == LightProbeUsage.CustomProvided)
                {
                    dstEntityManager.AddComponent <CustomProbeTag>(entity);
                }
                else if (meshRenderer.lightProbeUsage == LightProbeUsage.BlendProbes &&
                         LightmapSettings.lightProbes != null &&
                         LightmapSettings.lightProbes.count > 0)
                {
                    dstEntityManager.AddComponent <BlendProbeTag>(entity);
                }
                else
                {
                    dstEntityManager.AddComponent <AmbientProbeTag>(entity);
                }
            }
            renderMesh.material = material;

            dstEntityManager.AddSharedComponentData(entity, renderMesh);

            if (flipWinding)
            {
                dstEntityManager.AddComponent(entity, ComponentType.ReadWrite <RenderMeshFlippedWindingTag>());
            }

            conversionSystem.ConfigureEditorRenderData(entity, meshRenderer.gameObject, true);

#if ENABLE_HYBRID_RENDERER_V2
            dstEntityManager.AddComponent(entity, ComponentType.ReadOnly <WorldToLocal_Tag>());

#if HDRP_9_0_0_OR_NEWER
            // HDRP previous frame matrices (for motion vectors)
            if (needMotionVectorPass)
            {
                dstEntityManager.AddComponent(entity, ComponentType.ReadWrite <BuiltinMaterialPropertyUnity_MatrixPreviousM>());
                dstEntityManager.AddComponent(entity, ComponentType.ReadWrite <BuiltinMaterialPropertyUnity_MatrixPreviousMI_Tag>());
            }
            dstEntityManager.AddComponentData(entity, CreateMotionVectorsParams(ref renderMesh, ref meshRenderer));
#endif

            dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_RenderingLayer
            {
                Value = new uint4(meshRenderer.renderingLayerMask, 0, 0, 0)
            });

            dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_WorldTransformParams
            {
                Value = flipWinding ? new float4(0, 0, 0, -1) : new float4(0, 0, 0, 1)
            });

#if URP_9_0_0_OR_NEWER
            // Default initialized light data for URP
            dstEntityManager.AddComponentData(entity, new BuiltinMaterialPropertyUnity_LightData
            {
                Value = new float4(0, 0, 1, 0)
            });
#endif
#endif
        }