Ejemplo n.º 1
0
        public static void RenderScenePreview(Transform origin, PreviewTextures textures)
        {
            var pos = origin.position;
            var rot = origin.rotation;

            ReinitializeRenderPipeline();

            var previewRootPrefab = AssetDatabase.LoadAssetAtPath <GameObject>("Assets/Prefabs/ScenePreviewRoot.prefab");
            var previewRoot       = Object.Instantiate(previewRootPrefab);

            previewRoot.transform.rotation = rot;
            previewRoot.transform.position = pos;
            var camera = previewRoot.GetComponentInChildren <Camera>();

            // This will trigger HDCamera.Update, which must be done before calling HDCamera.GetOrCreate
            // Otherwise m_AdditionalCameraData will not be set and HDCamera will be discarded after first frame
            camera.Render();

            var hdSettings = camera.GetComponent <HDAdditionalCameraData>();

            hdSettings.hasPersistentHistory = true;
            var hd     = HDCamera.GetOrCreate(camera);
            var volume = previewRoot.GetComponentInChildren <Volume>();
            var pointCloudRenderers = Object.FindObjectsOfType <NodeTreeRenderer>();

            foreach (var pointCloudRenderer in pointCloudRenderers)
            {
                pointCloudRenderer.UpdateImmediate(camera);
            }

            Render(hd, textures, volume);

            Object.DestroyImmediate(previewRoot);
        }
Ejemplo n.º 2
0
        public static void RenderVehiclePreview(string vehicleAssetFile, PreviewTextures textures)
        {
            ReinitializeRenderPipeline();

            var cameraObj = GameObject.Find("PreviewCamera");
            var camera    = cameraObj == null ? null : cameraObj.GetComponent <Camera>();

            if (camera == null)
            {
                Debug.LogError("Camera for vehicle preview was not found. Preview won't be available.");
                return;
            }

            var volume = Object.FindObjectOfType <Volume>();

            if (volume == null)
            {
                Debug.LogError("Volume for vehicle preview was not found. Preview won't be available.");
                return;
            }

            var vehiclePrefab = AssetDatabase.LoadAssetAtPath <GameObject>(vehicleAssetFile);
            var vehicleParent = GameObject.Find("VehicleParent");
            var vehicle       = vehicleParent != null
                ? Object.Instantiate(vehiclePrefab, vehicleParent.transform)
                : Object.Instantiate(vehiclePrefab);

            vehicle.transform.localRotation = Quaternion.identity;
            vehicle.transform.localPosition = Vector3.zero;

            // adjust camera distance based on hit distance
            RaycastHit hit;
            var        start     = cameraObj.transform.position;
            var        end       = vehicle.transform.position;
            var        direction = (end - start);
            Ray        cameraRay = new Ray(start, direction);

            if (Physics.Raycast(cameraRay, out hit, LayerMask.GetMask("Agent")))
            {
                cameraObj.transform.position = hit.point + ((cameraObj.transform.position - hit.point).normalized) * 3f;
            }

            // This will trigger HDCamera.Update, which must be done before calling HDCamera.GetOrCreate
            // Otherwise m_AdditionalCameraData will not be set and HDCamera will be discarded after first frame
            camera.Render();

            var hdSettings = camera.GetComponent <HDAdditionalCameraData>();

            hdSettings.hasPersistentHistory = true;
            var hd = HDCamera.GetOrCreate(camera);

            Render(hd, textures, volume);

            Object.DestroyImmediate(vehicle);
        }
Ejemplo n.º 3
0
        private static void Render(HDCamera hd, PreviewTextures textures, Volume volume)
        {
            var camera = hd.camera;
            var hdrp   = RenderPipelineManager.currentPipeline as HDRenderPipeline;

            hdrp?.RequestSkyEnvironmentUpdate();

            var largeRes = new Vector2Int(textures[0].width, textures[0].height);
            var largeRt  = RenderTexture.GetTemporary(largeRes.x, largeRes.y, 24);

            camera.targetTexture = largeRt;

            // Physically based sky renderer builds up bounces over multiple frames, modifying indirect light
            // Render some frames in advance here so that all lighting is fully calculated for previews
            const int maxCalls = 20;
            var       calls    = 0;

            do
            {
                camera.Render();
                largeRt.IncrementUpdateCount();
            } while (calls++ < maxCalls && !SkyDone(volume, hd));

            if (!SkyDone(volume, hd))
            {
                LogSkyData(volume, hd);
                Debug.LogError($"Preview rendering failed - sky not initialized");
            }

            camera.Render();
            largeRt.IncrementUpdateCount();

            for (var i = 2; i >= 0; i--)
            {
                var res = new Vector2Int(textures[i].width, textures[i].height);
                var rt  = i == 0 ? largeRt : RenderTexture.GetTemporary(res.x, res.y, 24);

                if (i != 0)
                {
                    Graphics.Blit(largeRt, rt);
                    rt.IncrementUpdateCount();
                }

                RenderTexture.active = rt;
                textures[i].ReadPixels(new Rect(0, 0, res.x, res.y), 0, 0);
                RenderTexture.active = null;
                RenderTexture.ReleaseTemporary(rt);
            }
        }
Ejemplo n.º 4
0
        public static void RenderScenePreview(Transform origin, PreviewTextures textures, bool forcePreview)
        {
            var pos = origin.position;
            var rot = origin.rotation;

            ReinitializeRenderPipeline();

            var hasReflectionProbes = Object.FindObjectOfType <ReflectionProbe>() != null;

            var    volumes = Object.FindObjectsOfType <Volume>();
            Volume volume  = null;
            IndirectLightingController indirectLightingController = null;

            foreach (var vol in volumes)
            {
                if (vol.isGlobal && volume == null)
                {
                    volume = vol;
                    continue;
                }

                var collider = vol.GetComponent <Collider>();
                if (collider.bounds.Contains(pos))
                {
                    volume = vol;
                    break;
                }
            }

            var previewRootPrefab = AssetDatabase.LoadAssetAtPath <GameObject>("Assets/Prefabs/ScenePreviewRoot.prefab");
            var previewRoot       = Object.Instantiate(previewRootPrefab, pos, rot);
            var camera            = previewRoot.GetComponentInChildren <Camera>();

            if (forcePreview)
            {
                previewRoot.transform.SetPositionAndRotation(pos, Quaternion.Euler(new Vector3(0f, rot.eulerAngles.y, 0f)));
                camera.transform.SetParent(null);
                camera.transform.SetPositionAndRotation(pos, rot);
            }

            // This will trigger HDCamera.Update, which must be done before calling HDCamera.GetOrCreate
            // Otherwise m_AdditionalCameraData will not be set and HDCamera will be discarded after first frame
            camera.Render();

            var hdSettings = camera.GetComponent <HDAdditionalCameraData>();

            hdSettings.hasPersistentHistory = true;
            var hd = HDCamera.GetOrCreate(camera);

            if (volume == null)
            {
                volume = previewRoot.GetComponentInChildren <Volume>();
            }

            // CullingResults in first frame after loading scene does not contain aby data about reflection probes.
            // Light loop will use further options, which usually means skybox indirect reflections. This ignores
            // occlusion and will break interior lighting. Due to lack of other options, just disable indirect specular
            // lighting for preview rendering.
            indirectLightingController = volume.profile.components.FirstOrDefault(x => x is IndirectLightingController) as IndirectLightingController;
            var indirectControllerAdded = hasReflectionProbes && indirectLightingController == null;

            if (indirectControllerAdded)
            {
                indirectLightingController = volume.profile.Add <IndirectLightingController>();
            }

            var indirectMultiplier = indirectLightingController == null ? 0f : indirectLightingController.reflectionLightingMultiplier.value;

            if (hasReflectionProbes && indirectLightingController != null)
            {
                indirectLightingController.reflectionLightingMultiplier.value = 0f;
            }

            var pointCloudRenderers = Object.FindObjectsOfType <NodeTreeRenderer>();

            foreach (var pointCloudRenderer in pointCloudRenderers)
            {
                pointCloudRenderer.UpdateImmediate(camera);
            }

            Render(hd, textures, volume);

            if (hasReflectionProbes && indirectLightingController != null)
            {
                indirectLightingController.reflectionLightingMultiplier.value = indirectMultiplier;
            }

            if (indirectControllerAdded && indirectLightingController != null)
            {
                volume.profile.Remove <IndirectLightingController>();
            }

            Object.DestroyImmediate(previewRoot);
        }