├── docs ├── Overview.vsdx ├── Design preview.docx ├── images │ ├── EditorClasses.PNG │ ├── PNGRecorder.PNG │ ├── RecorderClip.png │ ├── TimelineTrack.png │ ├── recorder-menu.png │ ├── GameModeClasses.PNG │ ├── RecorderWindow.png │ ├── TimelineClasses.PNG │ ├── ConceptualBlocks.PNG │ ├── Recorders_and_inputs.PNG │ ├── RecorderEngineClasses.PNG │ ├── PNGRecorder.PNG.meta │ ├── RecorderClip.png.meta │ ├── ConceptualBlocks.PNG.meta │ ├── EditorClasses.PNG.meta │ ├── GameModeClasses.PNG.meta │ ├── RecorderWindow.png.meta │ ├── TimelineClasses.PNG.meta │ ├── TimelineTrack.png.meta │ ├── recorder-menu.png.meta │ ├── RecorderEngineClasses.PNG.meta │ └── Recorders_and_inputs.PNG.meta ├── Overview.vsdx.meta ├── Design preview.docx.meta └── images.meta ├── source ├── FrameRecorder │ ├── Recorders │ │ ├── AnimationRecorder │ │ │ ├── Editor.meta │ │ │ └── Editor │ │ │ │ ├── AnimationRecorder.cs.meta │ │ │ │ ├── AnimationRecorderSettings.cs.meta │ │ │ │ ├── AnimationRecorderSettingsEditor.cs.meta │ │ │ │ ├── AnimationRecorder.cs │ │ │ │ ├── AnimationRecorderSettings.cs │ │ │ │ └── AnimationRecorderSettingsEditor.cs │ │ ├── AnimationRecorder.meta │ │ ├── ImageRecorder.meta │ │ └── ImageRecorder │ │ │ ├── Engine.meta │ │ │ ├── Editor.meta │ │ │ ├── Engine │ │ │ ├── ImageRecorder.cs.meta │ │ │ ├── ImageRecorderSettings.cs.meta │ │ │ ├── ImageRecorder.cs │ │ │ └── ImageRecorderSettings.cs │ │ │ └── Editor │ │ │ ├── ImageRecorderEditor.cs.meta │ │ │ └── ImageRecorderEditor.cs │ ├── license.meta │ ├── Inputs │ │ ├── Animation.meta │ │ ├── Camera360.meta │ │ ├── Camera360 │ │ │ ├── Editor.meta │ │ │ ├── Engine.meta │ │ │ ├── Engine │ │ │ │ ├── Camera360Input.cs.meta │ │ │ │ ├── Camera360InputSettings.cs.meta │ │ │ │ └── Camera360InputSettings.cs │ │ │ └── Editor │ │ │ │ ├── Camera360InputEditor.cs.meta │ │ │ │ └── Camera360InputEditor.cs │ │ ├── Animation │ │ │ ├── Editor.meta │ │ │ └── Editor │ │ │ │ ├── AnimationInput.cs.meta │ │ │ │ ├── AnimationInputSettings.cs.meta │ │ │ │ ├── AnimationInputSettingsEditor.cs.meta │ │ │ │ ├── AnimationInput.cs │ │ │ │ ├── AnimationInputSettings.cs │ │ │ │ └── AnimationInputSettingsEditor.cs │ │ ├── CBRenderTexture.meta │ │ ├── CBRenderTexture │ │ │ ├── Editor.meta │ │ │ ├── Engine.meta │ │ │ ├── Shaders.meta │ │ │ ├── Shaders │ │ │ │ └── CopyFB.shader.meta │ │ │ ├── Engine │ │ │ │ ├── CBRenderTextureInput.cs.meta │ │ │ │ ├── CBRenderTextureInputSettings.cs.meta │ │ │ │ ├── GameViewSize.cs.meta │ │ │ │ └── CBRenderTextureInputSettings.cs │ │ │ └── Editor │ │ │ │ ├── CBRenderTextureInputSettingsEditor.cs.meta │ │ │ │ └── CBRenderTextureInputSettingsEditor.cs │ │ ├── RenderTextureSampler.meta │ │ ├── RenderTextureSampler │ │ │ ├── Editor.meta │ │ │ ├── Engine.meta │ │ │ ├── Shaders.meta │ │ │ ├── Shaders │ │ │ │ ├── BS4Normalize.shader.meta │ │ │ │ ├── BS4Accumulate.shader.meta │ │ │ │ ├── BS4SuperShader.shader.meta │ │ │ │ ├── BS4Accumulate.shader │ │ │ │ ├── BS4Normalize.shader │ │ │ │ └── BS4SuperShader.shader │ │ │ ├── Engine │ │ │ │ ├── RenderTextureSampler.cs.meta │ │ │ │ ├── RenderTextureSamplerSettings.cs.meta │ │ │ │ └── RenderTextureSamplerSettings.cs │ │ │ └── Editor │ │ │ │ ├── RenderTextureSamplerEditor.cs.meta │ │ │ │ └── RenderTextureSamplerEditor.cs │ │ ├── RenderTexture.meta │ │ ├── ScreenCapture.meta │ │ ├── RenderTexture │ │ │ ├── Editor.meta │ │ │ ├── Engine.meta │ │ │ ├── Engine │ │ │ │ ├── RenderTextureInput.cs.meta │ │ │ │ ├── RenderTextureInputSettings.cs.meta │ │ │ │ ├── RenderTextureInputSettings.cs │ │ │ │ └── RenderTextureInput.cs │ │ │ └── Editor │ │ │ │ ├── RenderTextureInputSettingsEditor.cs.meta │ │ │ │ └── RenderTextureInputSettingsEditor.cs │ │ └── ScreenCapture │ │ │ ├── Editor.meta │ │ │ ├── Engine.meta │ │ │ ├── Engine │ │ │ ├── ScreenCaptureInput.cs.meta │ │ │ ├── ScreenCaptureInputSettings.cs.meta │ │ │ ├── ScreenCaptureInputSettings.cs │ │ │ └── ScreenCaptureInput.cs │ │ │ └── Editor │ │ │ ├── ScreenCaptureInputEditor.cs.meta │ │ │ └── ScreenCaptureInputEditor.cs │ ├── Core.meta │ ├── Inputs.meta │ ├── Packager.meta │ ├── Recorders.meta │ ├── Core │ │ ├── Editor.meta │ │ ├── Engine.meta │ │ ├── Shaders.meta │ │ ├── Editor │ │ │ ├── Timeline.meta │ │ │ ├── ResolutionSelector.cs.meta │ │ │ ├── AboutBox.cs.meta │ │ │ ├── EnumHelper.cs.meta │ │ │ ├── RecorderEditor.cs.meta │ │ │ ├── RecorderSelector.cs.meta │ │ │ ├── RecorderWindow.cs.meta │ │ │ ├── RecorderWindowSettings.cs.meta │ │ │ ├── SerializableObjHelper.cs.meta │ │ │ ├── Timeline │ │ │ │ └── RecorderClipEditor.cs.meta │ │ │ ├── InputEditor.cs.meta │ │ │ ├── FileNameDrawer.cs.meta │ │ │ ├── OutputPathDrawer.cs.meta │ │ │ ├── RTInputSelector.cs.meta │ │ │ ├── RecorderWindowSettings.cs │ │ │ ├── ResolutionSelector.cs │ │ │ ├── InputEditor.cs │ │ │ ├── FileNameDrawer.cs │ │ │ ├── OutputPathDrawer.cs │ │ │ ├── RTInputSelector.cs │ │ │ ├── AboutBox.cs │ │ │ ├── SerializableObjHelper.cs │ │ │ └── EnumHelper.cs │ │ ├── Engine │ │ │ ├── Timeline.meta │ │ │ ├── ImageInputSettings.cs.meta │ │ │ ├── InputSettingsComponent.cs │ │ │ ├── Recorder.cs.meta │ │ │ ├── Verbose.cs.meta │ │ │ ├── InputBinder.cs.meta │ │ │ ├── InputSettings.cs.meta │ │ │ ├── RecorderInput.cs.meta │ │ │ ├── SceneHook.cs.meta │ │ │ ├── TextureFlipper.cs.meta │ │ │ ├── UnityHelpers.cs.meta │ │ │ ├── GenericRecorder.cs.meta │ │ │ ├── InputSettingsList.cs.meta │ │ │ ├── RecorderAttribute.cs.meta │ │ │ ├── RecorderComponent.cs.meta │ │ │ ├── RecorderSettings.cs.meta │ │ │ ├── RecorderVersion.cs.meta │ │ │ ├── RecordersInventory.cs.meta │ │ │ ├── RecordingSession.cs.meta │ │ │ ├── BaseRenderTextureInput.cs.meta │ │ │ ├── ImageRecorderSettings.cs.meta │ │ │ ├── InputSettingsComponent.cs.meta │ │ │ ├── Timeline │ │ │ │ ├── RecorderClip.cs.meta │ │ │ │ ├── RecorderTrack.cs.meta │ │ │ │ ├── RecorderPlayableBehaviour.cs.meta │ │ │ │ ├── WaitForEndOfFrameComponent.cs.meta │ │ │ │ ├── RecorderTrack.cs │ │ │ │ ├── WaitForEndOfFrameComponent.cs │ │ │ │ ├── RecorderClip.cs │ │ │ │ └── RecorderPlayableBehaviour.cs │ │ │ ├── OutputPath.cs.meta │ │ │ ├── FileNameGenerator.cs.meta │ │ │ ├── FrameRateHelper.cs.meta │ │ │ ├── RecorderVersion.cs │ │ │ ├── GenericRecorder.cs │ │ │ ├── InputSettings.cs │ │ │ ├── ImageInputSettings.cs │ │ │ ├── UnityHelpers.cs │ │ │ ├── RecorderInput.cs │ │ │ ├── BaseRenderTextureInput.cs │ │ │ ├── TextureFlipper.cs │ │ │ ├── RecorderAttribute.cs │ │ │ ├── InputBinder.cs │ │ │ ├── Verbose.cs │ │ │ ├── ImageRecorderSettings.cs │ │ │ ├── RecorderComponent.cs │ │ │ ├── FrameRateHelper.cs │ │ │ └── OutputPath.cs │ │ └── Shaders │ │ │ ├── VerticalFlipper.shader.meta │ │ │ └── VerticalFlipper.shader │ ├── Packager │ │ ├── Editor.meta │ │ ├── Private.meta │ │ ├── Private │ │ │ ├── Editor.meta │ │ │ └── Editor │ │ │ │ ├── FRPackager.cs.meta │ │ │ │ └── FRPackager.cs │ │ └── Editor │ │ │ ├── FRPackagerPaths.cs.meta │ │ │ └── FRPackagerPaths.cs │ └── license ├── FrameRecorder.meta ├── Audio.meta ├── Audio │ ├── Editor.meta │ └── Editor │ │ ├── AudioInput.cs.meta │ │ ├── AudioInputSettings.cs.meta │ │ ├── AudioInputSettingsEditor.cs.meta │ │ ├── AudioInputSettings.cs │ │ └── AudioInputSettingsEditor.cs ├── Recorder.meta └── Recorder │ ├── Editor.meta │ └── Editor │ ├── MediaRecorder.cs.meta │ ├── MediaRecorderEditor.cs.meta │ ├── MediaRecorderSettings.cs.meta │ ├── MediaRecorderEditor.cs │ └── MediaRecorderSettings.cs ├── license.meta ├── issue_template.md ├── issue_template.md.meta ├── README.md.meta ├── docs.meta ├── source.meta └── license /docs/Overview.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/Overview.vsdx -------------------------------------------------------------------------------- /docs/Design preview.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/Design preview.docx -------------------------------------------------------------------------------- /docs/images/EditorClasses.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/EditorClasses.PNG -------------------------------------------------------------------------------- /docs/images/PNGRecorder.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/PNGRecorder.PNG -------------------------------------------------------------------------------- /docs/images/RecorderClip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/RecorderClip.png -------------------------------------------------------------------------------- /docs/images/TimelineTrack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/TimelineTrack.png -------------------------------------------------------------------------------- /docs/images/recorder-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/recorder-menu.png -------------------------------------------------------------------------------- /docs/images/GameModeClasses.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/GameModeClasses.PNG -------------------------------------------------------------------------------- /docs/images/RecorderWindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/RecorderWindow.png -------------------------------------------------------------------------------- /docs/images/TimelineClasses.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/TimelineClasses.PNG -------------------------------------------------------------------------------- /docs/images/ConceptualBlocks.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/ConceptualBlocks.PNG -------------------------------------------------------------------------------- /docs/images/Recorders_and_inputs.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/Recorders_and_inputs.PNG -------------------------------------------------------------------------------- /docs/images/RecorderEngineClasses.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/GenericFrameRecorder/HEAD/docs/images/RecorderEngineClasses.PNG -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 49dc301ad9764dae95349a3b7603aa34 3 | timeCreated: 1503942643 -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder/Editor/AnimationRecorder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0808b4ae0e5a40bc818e43f28ebe29e2 3 | timeCreated: 1503926464 -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder/Editor/AnimationRecorderSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a9f55b158f7c43688c1c21ce05ac46ba 3 | timeCreated: 1503926485 -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder/Editor/AnimationRecorderSettingsEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b5f9edca0e76485d8490267712eb006c 3 | timeCreated: 1503942663 -------------------------------------------------------------------------------- /license.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3d1ee2a4fdbf74a53b086f78d6d07db7 3 | timeCreated: 1504627508 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /issue_template.md: -------------------------------------------------------------------------------- 1 | ##### What happened? 2 | 3 | ##### Is it reproduceable? 4 | 5 | ##### Released package version / tag? 6 | 7 | ##### Unity version, operating system, target platform (standalone windows, mac, iOS, PS4...)? -------------------------------------------------------------------------------- /issue_template.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 08b73bf0f58e24b4a9fa26c8d0f528c5 3 | timeCreated: 1504627508 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /source/FrameRecorder/license.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d4a883be6cc3a6547b0849c2f51911d9 3 | timeCreated: 1504201738 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bce584456d820498b8cc7bd0ff6fdd25 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 26b884e8bf1552d49b39fd7c9298b0ac 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2e24b7fe0de831246ae297d7c0f37b8c 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360/Engine.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b4f589ba14ada1d41836980cf91f2253 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /README.md.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c0586942fbd52d74c85eb3bc37149306 3 | timeCreated: 1502734123 4 | licenseType: Pro 5 | DefaultImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 118aaf48522942c3953f714a6739285e 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /source/FrameRecorder.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a08b35c30775e274cacf0ab18c4d82cb 3 | folderAsset: yes 4 | timeCreated: 1491415339 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /docs/Overview.vsdx.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5e54c38624610754b8ac9d40c3955fd3 3 | timeCreated: 1502734123 4 | licenseType: Pro 5 | DefaultImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1b5da8d5495a2674cb152dbad7183f98 3 | folderAsset: yes 4 | timeCreated: 1495745135 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /docs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b81dc917e23c89d4ea07195b1e91bd4a 3 | folderAsset: yes 4 | timeCreated: 1502734123 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /docs/Design preview.docx.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7876ec50ebbeb1e478f2dd7278943df6 3 | timeCreated: 1502734123 4 | licenseType: Pro 5 | DefaultImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6cbec5a6a20c2074e9b44e94a96092d6 3 | folderAsset: yes 4 | timeCreated: 1491415339 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Packager.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 15f12a496aa3c88409866d2afba95518 3 | folderAsset: yes 4 | timeCreated: 1499869880 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5fad8f72e139ab746a1f5f1546f60b6b 3 | folderAsset: yes 4 | timeCreated: 1494348128 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6382041f97ff6f5418ac1472f2d64b82 3 | folderAsset: yes 4 | timeCreated: 1502734123 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a6b346140d4dd0c48b4431a7f27d450d 3 | folderAsset: yes 4 | timeCreated: 1491415339 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 465980b32e42e4a439d49f4d4bf0ef31 3 | folderAsset: yes 4 | timeCreated: 1491417212 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Shaders.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c69c0493c79074d449c15f409d40e8ff 3 | folderAsset: yes 4 | timeCreated: 1504903787 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Packager/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e44e70f5c4e1e284b968729e18cdf339 3 | folderAsset: yes 4 | timeCreated: 1499869908 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /docs/images.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b40e27b0bc7fce9448e873dc5e218ec6 3 | folderAsset: yes 4 | timeCreated: 1502734123 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/Audio.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9c5b01e0a69a84297bc9fec89e4159ff 3 | folderAsset: yes 4 | timeCreated: 1502429657 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/Timeline.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cddc7fe0980fba144be44ff9d0023c24 3 | folderAsset: yes 4 | timeCreated: 1496253836 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Packager/Private.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c742c94f793226744ade4af40fb73c2e 3 | folderAsset: yes 4 | timeCreated: 1499877481 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/Audio/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7682926e3d3e8412ca8b99a853746ea3 3 | folderAsset: yes 4 | timeCreated: 1502429657 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d710ed9c46e2cf948ac52d735f4a83f0 3 | folderAsset: yes 4 | timeCreated: 1491415339 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f400e83e75546484ba9cba936ede7675 3 | folderAsset: yes 4 | timeCreated: 1504040760 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d153af1e5305b464d9dad25493e1b509 3 | folderAsset: yes 4 | timeCreated: 1495745446 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Packager/Private/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3223f6f081989b04cb5e439c3a3298b5 3 | folderAsset: yes 4 | timeCreated: 1499877481 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ffa0df4e3b31c8c4a9e2facb63af80ee 3 | folderAsset: yes 4 | timeCreated: 1494348128 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/Recorder.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9513f369a97374649befbe2a0ab40c8f 3 | folderAsset: yes 4 | timeCreated: 1502736060 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4059535d8a68aaa4b833f869d81edd59 3 | folderAsset: yes 4 | timeCreated: 1495745635 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Engine.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9bfa8ff658fb3fd49a570cf114ab7c94 3 | folderAsset: yes 4 | timeCreated: 1496237936 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Shaders.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4bd7f4201fbd4c84d96b0479c6f986fa 3 | folderAsset: yes 4 | timeCreated: 1495745594 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f9bf5f2835771fd4d8f203a4f0e76e96 3 | folderAsset: yes 4 | timeCreated: 1494516827 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Engine.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 69d2b9d7b3721a6448987b6e2afbccc1 3 | folderAsset: yes 4 | timeCreated: 1496237950 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/Recorder/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a792ed034f3d1459bbebef185d07ac1c 3 | folderAsset: yes 4 | timeCreated: 1501796122 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce9b6bd86cafb3f46a218e8e60f16e7c 3 | folderAsset: yes 4 | timeCreated: 1494642103 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Engine.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ac695920c02287c4a84673ab0fd6640f 3 | folderAsset: yes 4 | timeCreated: 1496237914 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Shaders.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6d4cea4a62f94b949b7c8eded57c2ccc 3 | folderAsset: yes 4 | timeCreated: 1495745576 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7fc965cf58e7cb04694a50211c23743c 3 | folderAsset: yes 4 | timeCreated: 1494348128 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Shaders/VerticalFlipper.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 70029941490acf74aa463ca446032d3d 3 | timeCreated: 1504903883 4 | licenseType: Pro 5 | ShaderImporter: 6 | defaultTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Shaders/CopyFB.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0a97d971fb4e03f41b27d50d0e59b7a5 3 | timeCreated: 1504916509 4 | licenseType: Pro 5 | ShaderImporter: 6 | defaultTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cb499ec071a55cd4b8f4df814a75ff88 3 | folderAsset: yes 4 | timeCreated: 1499701067 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 860e2fa82cdb5ca47ba9e65328cd0ffb 3 | folderAsset: yes 4 | timeCreated: 1510340443 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d94d064c6a1b2ea41828db86476a10a0 3 | folderAsset: yes 4 | timeCreated: 1499701079 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Engine.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 29952222f66e37144801f135b84928fd 3 | folderAsset: yes 4 | timeCreated: 1499701085 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0a7887af1e7dbbe4284421bb5148ad9e 3 | folderAsset: yes 4 | timeCreated: 1510340455 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Engine.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6545d3b37c7f0bf4f95f24a46b443cea 3 | folderAsset: yes 4 | timeCreated: 1510340461 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Shaders/BS4Normalize.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1e48dcc6629339d438e7c701fa87866d 3 | timeCreated: 1494516881 4 | licenseType: Free 5 | ShaderImporter: 6 | defaultTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Shaders/BS4Accumulate.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 24232f5f40aada14995712e173fc8bd7 3 | timeCreated: 1494516871 4 | licenseType: Free 5 | ShaderImporter: 6 | defaultTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Shaders/BS4SuperShader.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9700ad97272d0dc4587c6882edb94130 3 | timeCreated: 1494516890 4 | licenseType: Free 5 | ShaderImporter: 6 | defaultTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/ResolutionSelector.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9b9f59dbe78d8ab43ad96132525a4ce7 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/ImageInputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c325a4f7bd7f8b047aa4fbd825163d85 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/InputSettingsComponent.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace UnityEngine.Recorder 6 | { 7 | public class InputSettingsComponent : MonoBehaviour 8 | { 9 | public List m_Settings; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360/Engine/Camera360Input.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6c433f8333932f14da0b7f9b6963258e 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/AboutBox.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7a5ee59e307671242998d2b49bb809e3 3 | timeCreated: 1504289434 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Recorder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 58fe471fc3009fb4d8cf266a5cc5a7a1 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Verbose.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6c3909f411e0e1b42b3a95ded8e1fd5a 3 | timeCreated: 1504911468 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360/Editor/Camera360InputEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 265a2c6c7e77b6149a0fc4a60bb29cf9 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/EnumHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1b214d139e24e30418dc1f364e2a9361 3 | timeCreated: 1496174097 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/InputBinder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cbfd129ef371e0b468332962917d1a8b 3 | timeCreated: 1504708921 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/InputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fca86976b230bf6489cba451676ee05b 3 | timeCreated: 1494616113 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderInput.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9f956c0b0f15ce74aac4600909d4e55f 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/SceneHook.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e378e9c2cad5a7e48a6931f63edd1421 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/TextureFlipper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 638d71d378e8c794285fa6bc5cbfcd19 3 | timeCreated: 1504913521 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/UnityHelpers.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 639bab1152ec3984184d25ab38abd226 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360/Engine/Camera360InputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f482d23ae5c5c16468b9bec7d87e7d62 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/RecorderEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c2d3ad15b5919624bbfcb237e18fd2ec 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/RecorderSelector.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b94e4c4dfdb07cb43b93121a598b6e00 3 | timeCreated: 1493839035 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/RecorderWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d99962793b726bf4881e4b1719950d8f 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/GenericRecorder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e971ec30698b0bf41bd9afdd5694c8ba 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/InputSettingsList.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 68168008d5a13ae469b8010cdd9c280a 3 | timeCreated: 1504637954 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderAttribute.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ca62b38426adb1d47ad6cd6c94001b6a 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderComponent.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6122dab7ff1764c468a03aa29f49ea5b 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 180842267b7175e4c9dedaf1f548db0f 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderVersion.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9e740d9b4062aba498ea343c42b49a37 3 | timeCreated: 1504287906 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecordersInventory.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e11d656cf6217cb41ba5443ff354aea7 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecordingSession.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 061b0c1d04c01f54fa322b11b8662964 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Packager/Editor/FRPackagerPaths.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6f48dc1b58b9d14409a730335a20999c 3 | timeCreated: 1499875980 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/Audio/Editor/AudioInput.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d53962d7bf5a4415ba204aea5e80e746 3 | timeCreated: 1502429657 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/RecorderWindowSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a0205cb8957891b44b142689caa23987 3 | timeCreated: 1494445965 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/SerializableObjHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b91f080b208afff4d94678e466eeecc4 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/BaseRenderTextureInput.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1dd8c8968d3848743a824ed5191b2805 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/ImageRecorderSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f3941bff05f4e88479d3c4741b63bbf1 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/InputSettingsComponent.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 393ba449d1ca2d84ead6595000d41c14 3 | timeCreated: 1504640541 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/RecorderClip.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f1e95aa6d658d694785bfde37c857fff 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/RecorderTrack.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 0e6cf5671577b7344ba25c25b4346ce4 3 | timeCreated: 1491415343 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Packager/Private/Editor/FRPackager.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: afecd1860c70f0549bfb8990cda708d1 3 | timeCreated: 1499869898 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/Timeline/RecorderClipEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c7fe8472aebc45f4b93027b60a4003b3 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation/Editor/AnimationInput.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 262e9424f303141518c858a648377c23 3 | timeCreated: 1504030414 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/Audio/Editor/AudioInputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fae41d0797227451ea4b10db1c086647 3 | timeCreated: 1502429657 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation/Editor/AnimationInputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c011637fb4c894c56a9178092966b5ac 3 | timeCreated: 1504030414 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Engine/ImageRecorder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1ba8d1176c817374b97c04409a853fc5 3 | timeCreated: 1494348128 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/Recorder/Editor/MediaRecorder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 81bb4b24c44c943b49c402cbdad20d9c 3 | timeCreated: 1501796122 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/Audio/Editor/AudioInputSettingsEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: db4f1a6c0bab84e29b9a12b4db3909c0 3 | timeCreated: 1502429657 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/InputEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8974526d005ae444390dd14b549e88c1 3 | timeCreated: 1502389922 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/OutputPath.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 44034f3dfb9cc1b4c9e86ff509fe70f4 3 | timeCreated: 1502405084 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/RecorderPlayableBehaviour.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d580900d83be2664c9c035d6e50791fe 3 | timeCreated: 1491415344 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/WaitForEndOfFrameComponent.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fb0550cc97f23464f99f702c09306f21 3 | timeCreated: 1491590881 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Engine/CBRenderTextureInput.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 259b8fb9320857347949f5b5d08628b2 3 | timeCreated: 1495745837 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Editor/ImageRecorderEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3d5a09c81dc527545a1051b2e9b1a646 3 | timeCreated: 1494348128 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/Recorder/Editor/MediaRecorderEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 856c53159e929467abccd8747fc0fbbb 3 | timeCreated: 1501796122 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/Recorder/Editor/MediaRecorderSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6fde0a8ac3e6b482c95fa602e65ab045 3 | timeCreated: 1501796122 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/FileNameDrawer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 705506601d70ac144bf0d9182eac6424 3 | timeCreated: 1502463803 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/OutputPathDrawer.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: eba378c9cb692fe42a5d65b8ff4fd410 3 | timeCreated: 1502405084 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/RTInputSelector.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d35823aa542c3b545a76fd2a11a61fce 3 | timeCreated: 1502805158 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/FileNameGenerator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a95cc60500f985d458e4f1b1af26903f 3 | timeCreated: 1502401798 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/FrameRateHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6c11366d05dbe874d88a4cb28e5433ac 3 | timeCreated: 1502396811 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation/Editor/AnimationInputSettingsEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: afc6867a22e414a188b45973bcc23273 3 | timeCreated: 1504040760 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Engine/RenderTextureSampler.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6bda971be788f044c91c68400f4a2ad6 3 | timeCreated: 1494516853 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Engine/ImageRecorderSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 06397f605c749fe4dbe2df4bbd1ef4a1 3 | timeCreated: 1494348128 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Engine/CBRenderTextureInputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8d935bf7a4fcf66488738bda5536c1cb 3 | timeCreated: 1495746327 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Editor/CBRenderTextureInputSettingsEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 79441d490803fbc458081b9e7b696a66 3 | timeCreated: 1495785424 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Editor/RenderTextureSamplerEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 225145e129ea169449ebe485a462e36a 3 | timeCreated: 1494603718 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Engine/RenderTextureSamplerSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f88da291941f5f54098ecaf6bf1bc3b9 3 | timeCreated: 1494603869 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Engine/GameViewSize.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: de45754c6cad118478a1baf55b905edf 3 | timeCreated: 1499364456 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Engine/RenderTextureInput.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2b489925208325240a6246efb44d6e67 3 | timeCreated: 1499701845 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Engine/ScreenCaptureInput.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 74df144a4ec2f8049a8fdc52d05d35bc 3 | timeCreated: 1510340499 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Engine/RenderTextureInputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3ef190f44e596a94ebfec7c7b888a950 3 | timeCreated: 1499701145 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Editor/ScreenCaptureInputEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7be4a1e8b0e041d488d5c5b413073863 3 | timeCreated: 1510340549 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Engine/ScreenCaptureInputSettings.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a93936c560512aa4f89b283d08d5b3f0 3 | timeCreated: 1510340516 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Editor/RenderTextureInputSettingsEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 72cd87241899a7446a3b6e2ece276a56 3 | timeCreated: 1499701145 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/RecorderWindowSettings.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.Recorder; 3 | 4 | namespace UnityEditor.Recorder 5 | { 6 | /// 7 | /// This is just a helper class that should disappear once we have a proper way of saving the recorder window settings... 8 | /// 9 | public class RecorderWindowSettings : ScriptableObject 10 | { 11 | public RecorderSettings m_Settings; 12 | } 13 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderVersion.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | 6 | namespace UnityEditor.Recorder 7 | { 8 | public class RecorderVersion : ScriptableObject 9 | { 10 | public const string Version = "0.2"; // major.minor.build 11 | public static int BuildNumber = 30; 12 | public static string Tag 13 | { 14 | get { return string.Format("{0}.{1:0000}", Version, BuildNumber); } 15 | } 16 | public const string Stage = "(experimental)"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Engine/ScreenCaptureInputSettings.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2017_3_OR_NEWER 2 | using System; 3 | using System.Collections; 4 | using System.Collections.Generic; 5 | using UnityEngine; 6 | 7 | namespace UnityEngine.Recorder.Input 8 | { 9 | public class ScreenCaptureInputSettings : ImageInputSettings 10 | { 11 | public override Type inputType 12 | { 13 | get { return typeof(ScreenCaptureInput); } 14 | } 15 | 16 | public override bool ValidityCheck( List errors ) 17 | { 18 | return true; 19 | } 20 | } 21 | } 22 | 23 | #endif -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/RecorderTrack.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine.Timeline; 2 | 3 | namespace UnityEngine.Recorder.Timeline 4 | { 5 | 6 | /// 7 | /// What is it: Declares a type of Timeline Track that can host Recording clips 8 | /// Motivation: Allow Timeline to trigger recordings 9 | /// 10 | /// Note: Instances of this call Own their associated Settings asset's lifetime. 11 | /// 12 | [System.Serializable] 13 | [TrackClipType(typeof(RecorderClip))] 14 | [TrackMediaType(TimelineAsset.MediaType.Script)] 15 | [TrackColor(0f, 0.53f, 0.08f)] 16 | public class RecorderTrack : TrackAsset 17 | { 18 | 19 | 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Engine/RenderTextureInputSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace UnityEngine.Recorder.Input 5 | { 6 | public class RenderTextureInputSettings : ImageInputSettings 7 | { 8 | public RenderTexture m_SourceRTxtr; 9 | 10 | public override Type inputType 11 | { 12 | get { return typeof(RenderTextureInput); } 13 | } 14 | 15 | public override bool ValidityCheck(List errors) 16 | { 17 | var ok = true; 18 | 19 | if (m_SourceRTxtr == null) 20 | { 21 | ok = false; 22 | errors.Add("Missing source render texture object/asset."); 23 | } 24 | 25 | return ok; 26 | } 27 | 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/GenericRecorder.cs: -------------------------------------------------------------------------------- 1 | namespace UnityEngine.Recorder 2 | { 3 | /// 4 | /// What is it: helper templated class of Recorder that provides a getter for the settings fields that returns the exected type os settings. 5 | /// Motivation: Root class Recorder has a field for the settings but it's a nuisance to always have to cast it to the 6 | /// specialized type, when accessed from the specialized recorder class. 7 | /// 8 | public abstract class GenericRecorder : Recorder where TSettings : RecorderSettings 9 | { 10 | [SerializeField] 11 | protected TSettings m_Settings; 12 | public override RecorderSettings settings 13 | { 14 | get { return m_Settings; } 15 | set { m_Settings = (TSettings)value; } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Shaders/VerticalFlipper.shader: -------------------------------------------------------------------------------- 1 | Shader "Hidden/Unity/Recorder/Custom/VerticalFlipper" { 2 | Properties{_MainTex("Texture", any) = "" {}} 3 | 4 | CGINCLUDE 5 | #include "UnityCG.cginc" 6 | 7 | uniform sampler2D _MainTex; 8 | 9 | struct v2f 10 | { 11 | float4 pos : SV_Position; 12 | float2 uv : TEXCOORD0; 13 | }; 14 | 15 | v2f vert(appdata_img v) 16 | { 17 | v2f o; 18 | o.pos = UnityObjectToClipPos(v.vertex); 19 | o.uv = v.texcoord; 20 | return o; 21 | } 22 | 23 | half4 copy_and_flip_verticaly(v2f i) : SV_Target{ 24 | float2 uv = i.uv; 25 | uv.y = 1.0 - uv.y; 26 | return tex2D(_MainTex, uv); 27 | } 28 | 29 | ENDCG 30 | 31 | Subshader { 32 | Pass{ 33 | Blend Off Cull Off ZTest Off ZWrite Off 34 | CGPROGRAM 35 | #pragma vertex vert 36 | #pragma fragment copy_and_flip_verticaly 37 | ENDCG 38 | } 39 | } 40 | 41 | Fallback off 42 | } 43 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/InputSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEditor; 4 | 5 | namespace UnityEngine.Recorder 6 | { 7 | /// 8 | /// What is this: 9 | /// Motivation : 10 | /// Notes: 11 | /// 12 | public abstract class RecorderInputSetting : ScriptableObject 13 | { 14 | public abstract Type inputType { get; } 15 | public abstract bool ValidityCheck(List errors); 16 | public string m_DisplayName; 17 | public string m_Id; 18 | 19 | protected virtual void OnEnable() 20 | { 21 | if (string.IsNullOrEmpty(m_Id)) 22 | m_Id = Guid.NewGuid().ToString(); 23 | } 24 | 25 | 26 | public bool storeInScene 27 | { 28 | get { return Attribute.GetCustomAttribute(GetType(), typeof(StoreInSceneAttribute)) != null; } 29 | } 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/ImageInputSettings.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | namespace UnityEngine.Recorder.Input 6 | { 7 | public abstract class ImageInputSettings : RecorderInputSetting 8 | { 9 | public EImageDimension maxSupportedSize { get; set; } // dynamic & contextual: do not save 10 | public EImageDimension m_OutputSize = EImageDimension.x720p_HD; 11 | public EImageAspect m_AspectRatio = EImageAspect.x16_9; 12 | public bool m_ForceEvenSize = false; 13 | 14 | public override bool ValidityCheck( List errors ) 15 | { 16 | var ok = true; 17 | 18 | if (m_OutputSize > maxSupportedSize) 19 | { 20 | ok = false; 21 | errors.Add("Output size exceeds maximum supported size: " + (int)maxSupportedSize ); 22 | } 23 | 24 | return ok; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Engine/RenderTextureInput.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEngine.Recorder; 6 | using UnityEngine.Recorder.Input; 7 | using UnityEngine.Rendering; 8 | 9 | namespace UnityEngine.Recorder.Input 10 | { 11 | public class RenderTextureInput : BaseRenderTextureInput 12 | { 13 | RenderTextureInputSettings cbSettings 14 | { 15 | get { return (RenderTextureInputSettings)settings; } 16 | } 17 | 18 | public override void BeginRecording(RecordingSession session) 19 | { 20 | if (cbSettings.m_SourceRTxtr == null) 21 | throw new Exception("No Render Texture object provided as source"); 22 | 23 | outputHeight = cbSettings.m_SourceRTxtr.height; 24 | outputWidth = cbSettings.m_SourceRTxtr.width; 25 | outputRT = cbSettings.m_SourceRTxtr; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/UnityHelpers.cs: -------------------------------------------------------------------------------- 1 | using Object = UnityEngine.Object; 2 | 3 | namespace UnityEngine.Recorder 4 | { 5 | 6 | /// 7 | /// What is this: 8 | /// Motivation : 9 | /// Notes: 10 | /// 11 | public static class UnityHelpers 12 | { 13 | public static void Destroy(Object obj, bool allowDestroyingAssets = false) 14 | { 15 | if (obj == null) 16 | return; 17 | #if UNITY_EDITOR 18 | if (UnityEditor.EditorApplication.isPlaying) 19 | Object.Destroy(obj); 20 | else 21 | Object.DestroyImmediate(obj, allowDestroyingAssets); 22 | #else 23 | Object.Destroy(obj); 24 | #endif 25 | obj = null; 26 | } 27 | 28 | public static bool IsPlaying() 29 | { 30 | #if UNITY_EDITOR 31 | return UnityEditor.EditorApplication.isPlaying; 32 | #else 33 | return true; 34 | #endif 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /source/Audio/Editor/AudioInputSettings.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2017_3_OR_NEWER 2 | using System; 3 | using System.Collections.Generic; 4 | using UnityEngine.Audio; 5 | using UnityEngine.Recorder; 6 | 7 | namespace UnityEditor.Recorder.Input 8 | { 9 | public class AudioInputSettings : RecorderInputSetting 10 | { 11 | public bool m_PreserveAudio = true; 12 | 13 | #if RECORD_AUDIO_MIXERS 14 | [System.Serializable] 15 | public struct MixerGroupRecorderListItem 16 | { 17 | [SerializeField] 18 | public AudioMixerGroup m_MixerGroup; 19 | 20 | [SerializeField] 21 | public bool m_Isolate; 22 | } 23 | public MixerGroupRecorderListItem[] m_AudioMixerGroups; 24 | #endif 25 | 26 | public override Type inputType 27 | { 28 | get { return typeof(AudioInput); } 29 | } 30 | 31 | public override bool ValidityCheck(List errors) 32 | { 33 | return true; 34 | } 35 | } 36 | } 37 | #endif -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Engine/CBRenderTextureInputSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace UnityEngine.Recorder.Input 5 | { 6 | public class CBRenderTextureInputSettings : ImageInputSettings 7 | { 8 | public EImageSource source = EImageSource.ActiveCameras; 9 | public string m_CameraTag; 10 | public bool m_FlipFinalOutput = false; 11 | public bool m_AllowTransparency = false; 12 | public bool m_CaptureUI = false; 13 | 14 | public override Type inputType 15 | { 16 | get { return typeof(CBRenderTextureInput); } 17 | } 18 | 19 | public override bool ValidityCheck( List errors ) 20 | { 21 | var ok = base.ValidityCheck(errors); 22 | if (source == EImageSource.TaggedCamera && string.IsNullOrEmpty(m_CameraTag)) 23 | { 24 | ok = false; 25 | errors.Add("Missing tag for camera selection"); 26 | } 27 | 28 | return ok; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /license: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2017, Unity Technologies 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /source/FrameRecorder/license: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2017, Unity Technologies 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderInput.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace UnityEngine.Recorder 4 | { 5 | 6 | /// 7 | /// What is this: 8 | /// Motivation : 9 | /// Notes: 10 | /// 11 | public class RecorderInput : IDisposable 12 | { 13 | public int SourceID { get; set; } 14 | public RecorderInputSetting settings { get; set; } 15 | 16 | ~RecorderInput() 17 | { 18 | Dispose(false); 19 | } 20 | 21 | public void Dispose() 22 | { 23 | Dispose(true); 24 | } 25 | 26 | protected virtual void Dispose(bool disposing) 27 | { 28 | GC.SuppressFinalize(this); 29 | } 30 | 31 | public virtual void SessionCreated(RecordingSession session) {} 32 | 33 | public virtual void BeginRecording(RecordingSession session) {} 34 | 35 | public virtual void NewFrameStarting(RecordingSession session) {} 36 | 37 | public virtual void NewFrameReady(RecordingSession session) {} 38 | 39 | public virtual void FrameDone(RecordingSession session) {} 40 | 41 | public virtual void EndRecording(RecordingSession session) {} 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/BaseRenderTextureInput.cs: -------------------------------------------------------------------------------- 1 | namespace UnityEngine.Recorder 2 | { 3 | /// 4 | /// What is this: Base class for inputs that provide a RenderRexture as output to Recorders 5 | /// Motivation : Having a base class for render texture Inputs greatly simplifies Recorders job of supporting 6 | /// multiple input implementations for fetching images. 7 | /// 8 | public abstract class BaseRenderTextureInput : RecorderInput 9 | { 10 | public RenderTexture outputRT { get; set; } 11 | 12 | public int outputWidth { get; protected set; } 13 | public int outputHeight { get; protected set; } 14 | 15 | public void ReleaseBuffer() 16 | { 17 | if (outputRT != null) 18 | { 19 | if (outputRT == RenderTexture.active) 20 | RenderTexture.active = null; 21 | 22 | outputRT.Release(); 23 | outputRT = null; 24 | } 25 | } 26 | 27 | protected override void Dispose(bool disposing) 28 | { 29 | base.Dispose(disposing); 30 | 31 | if (disposing) 32 | ReleaseBuffer(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Engine/RenderTextureSamplerSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace UnityEngine.Recorder.Input 5 | { 6 | /// 7 | /// What is it: 8 | /// Motivation: 9 | /// 10 | public enum ESuperSamplingCount 11 | { 12 | x1 = 1, 13 | x2 = 2, 14 | x4 = 4, 15 | x8 = 8, 16 | x16 = 16, 17 | } 18 | 19 | public class RenderTextureSamplerSettings : ImageInputSettings 20 | { 21 | public EImageSource source = EImageSource.ActiveCameras; 22 | public EImageDimension m_RenderSize = EImageDimension.x720p_HD; 23 | public ESuperSamplingCount m_SuperSampling = ESuperSamplingCount.x1; 24 | public float m_SuperKernelPower = 16f; 25 | public float m_SuperKernelScale = 1f; 26 | public string m_CameraTag; 27 | public ColorSpace m_ColorSpace = ColorSpace.Gamma; 28 | public bool m_FlipFinalOutput = false; 29 | 30 | public override Type inputType 31 | { 32 | get { return typeof(RenderTextureSampler); } 33 | } 34 | 35 | public override bool ValidityCheck( List errors ) 36 | { 37 | return true; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Packager/Editor/FRPackagerPaths.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using UnityEngine; 3 | using UnityEngine.Recorder; 4 | 5 | namespace UnityEditor.Recorder 6 | { 7 | class FRPackagerPaths : ScriptableObject 8 | { 9 | public static string GetRecorderRootPath() 10 | { 11 | var path = GetFrameRecorderPath(); 12 | path = path.Substring(path.IndexOf("Assets")); 13 | return path; 14 | } 15 | 16 | public static string GetRecorderVersionFilePath() 17 | { 18 | var dummy = ScriptableObject.CreateInstance(); 19 | var path = Application.dataPath + AssetDatabase.GetAssetPath(MonoScript.FromScriptableObject(dummy)).Substring("Assets".Length); 20 | UnityHelpers.Destroy(dummy); 21 | return path; 22 | } 23 | 24 | public static string GetFrameRecorderPath() 25 | { 26 | var dummy = ScriptableObject.CreateInstance(); 27 | var path = Application.dataPath + AssetDatabase.GetAssetPath(MonoScript.FromScriptableObject(dummy)).Substring("Assets".Length); 28 | UnityHelpers.Destroy(dummy); 29 | 30 | path= path.Replace("/Packager/Editor/FRPackagerPaths.cs", ""); 31 | return path.Substring(0, path.LastIndexOf("/")); 32 | } 33 | 34 | } 35 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/TextureFlipper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | 6 | namespace UnityEngine.Recorder 7 | { 8 | public class TextureFlipper : IDisposable 9 | { 10 | Shader m_shVFlip; 11 | Material m_VFLipMaterial; 12 | RenderTexture m_WorkTexture; 13 | 14 | public TextureFlipper() 15 | { 16 | m_shVFlip = Shader.Find("Hidden/Unity/Recorder/Custom/VerticalFlipper"); 17 | m_VFLipMaterial = new Material(m_shVFlip); 18 | } 19 | 20 | public void Flip(RenderTexture target) 21 | { 22 | if (m_WorkTexture == null || m_WorkTexture.width != target.width || m_WorkTexture.height != target.height) 23 | { 24 | UnityHelpers.Destroy(m_WorkTexture); 25 | m_WorkTexture = new RenderTexture(target.width, target.height, target.depth, target.format, RenderTextureReadWrite.Linear); 26 | } 27 | Graphics.Blit( target, m_WorkTexture, m_VFLipMaterial ); 28 | Graphics.Blit( m_WorkTexture, target ); 29 | } 30 | 31 | public void Dispose() 32 | { 33 | UnityHelpers.Destroy(m_WorkTexture); 34 | m_WorkTexture = null; 35 | UnityHelpers.Destroy(m_VFLipMaterial); 36 | m_VFLipMaterial = null; 37 | } 38 | 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTexture/Editor/RenderTextureInputSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.Recorder; 4 | using UnityEngine.Recorder.Input; 5 | 6 | namespace UnityEditor.Recorder.Input 7 | { 8 | [CustomEditor(typeof(RenderTextureInputSettings))] 9 | public class RenderTextureInputSettingsEditor : InputEditor 10 | { 11 | SerializedProperty m_SourceRTxtr; 12 | 13 | protected void OnEnable() 14 | { 15 | if (target == null) 16 | return; 17 | 18 | var pf = new PropertyFinder(serializedObject); 19 | m_SourceRTxtr = pf.Find(w => w.m_SourceRTxtr); 20 | } 21 | 22 | public override void OnInspectorGUI() 23 | { 24 | EditorGUILayout.PropertyField(m_SourceRTxtr, new GUIContent("Source")); 25 | using (new EditorGUI.DisabledScope(true)) 26 | { 27 | var res = "N/A"; 28 | if (m_SourceRTxtr.objectReferenceValue != null) 29 | { 30 | var renderTexture = (RenderTexture)m_SourceRTxtr.objectReferenceValue; 31 | res = string.Format("{0} , {1}", renderTexture.width, renderTexture.height); 32 | } 33 | EditorGUILayout.TextField("Resolution", res); 34 | } 35 | 36 | serializedObject.ApplyModifiedProperties(); 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/ResolutionSelector.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEditor; 4 | using UnityEditor.Recorder; 5 | using UnityEngine; 6 | using UnityEngine.Recorder; 7 | using UnityEngine.Recorder.Input; 8 | 9 | namespace UnityEditor.Recorder 10 | { 11 | public class ResolutionSelector 12 | { 13 | string[] m_MaskedNames; 14 | EImageDimension m_MaxRes = EImageDimension.Window; 15 | 16 | public void OnInspectorGUI(EImageDimension max, SerializedProperty size ) 17 | { 18 | if (m_MaskedNames == null || max != m_MaxRes) 19 | { 20 | m_MaskedNames = EnumHelper.ClipOutEnumNames((int)EImageDimension.Window, (int)max); 21 | m_MaxRes = max; 22 | } 23 | 24 | using (var check = new EditorGUI.ChangeCheckScope()) 25 | { 26 | var index = EnumHelper.GetClippedIndexFromEnumValue(size.intValue, (int)EImageDimension.Window, (int)m_MaxRes); 27 | index = EditorGUILayout.Popup("Output Resolution", index, m_MaskedNames); 28 | 29 | if (check.changed) 30 | size.intValue = EnumHelper.GetEnumValueFromClippedIndex(index, (int)EImageDimension.Window, (int)m_MaxRes); 31 | 32 | if (size.intValue > (int)m_MaxRes) 33 | size.intValue = (int)m_MaxRes; 34 | } 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/WaitForEndOfFrameComponent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | 4 | namespace UnityEngine.Recorder.Timeline 5 | { 6 | 7 | /// 8 | /// What is it: Signals RecorderPlayableBehaviour when frame is reached. 9 | /// Motivation: RecorderPlayableBehaviour does does not have a way to detect the end of frame, 10 | /// which is when the RecordFrame signal must be given to the Recording session. Using this component, 11 | /// we can use MonoBehaviour coroutines to inform the Recorder of the end of frame. 12 | /// 13 | /// Notes: 14 | /// - There is a 1-to-1 instance count between RecorderPlayableBehaviour and WaitForEndOfFrameComponent 15 | /// - This component get's added to a transient GameObject, that lives in the scene in play mode and that is associated 16 | /// to the recording session. 17 | /// 18 | [ExecuteInEditMode] 19 | class WaitForEndOfFrameComponent : MonoBehaviour 20 | { 21 | [NonSerialized] 22 | public RecorderPlayableBehaviour m_playable; 23 | 24 | public IEnumerator WaitForEndOfFrame() 25 | { 26 | yield return new WaitForEndOfFrame(); 27 | if(m_playable != null) 28 | m_playable.FrameEnded(); 29 | } 30 | 31 | public void LateUpdate() 32 | { 33 | StartCoroutine(WaitForEndOfFrame()); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Editor/ScreenCaptureInputEditor.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2017_3_OR_NEWER 2 | 3 | using System.Collections.Generic; 4 | using UnityEngine; 5 | using UnityEngine.Recorder; 6 | using UnityEngine.Recorder.Input; 7 | 8 | namespace UnityEditor.Recorder.Input 9 | { 10 | [CustomEditor(typeof(ScreenCaptureInputSettings))] 11 | public class ScreenCaptureInputEditor : InputEditor 12 | { 13 | SerializedProperty m_RenderSize; 14 | SerializedProperty m_RenderAspect; 15 | ResolutionSelector m_ResSelector; 16 | 17 | protected void OnEnable() 18 | { 19 | if (target == null) 20 | return; 21 | 22 | var pf = new PropertyFinder(serializedObject); 23 | m_RenderSize = pf.Find(w => w.m_OutputSize); 24 | m_RenderAspect = pf.Find(w => w.m_AspectRatio); 25 | 26 | m_ResSelector = new ResolutionSelector(); 27 | } 28 | 29 | public override void OnInspectorGUI() 30 | { 31 | AddProperty(m_RenderSize, () => 32 | { 33 | m_ResSelector.OnInspectorGUI((target as ImageInputSettings).maxSupportedSize, m_RenderSize); 34 | }); 35 | 36 | if (m_RenderSize.intValue > (int)EImageDimension.Window) 37 | { 38 | AddProperty(m_RenderAspect, () => EditorGUILayout.PropertyField(m_RenderAspect, new GUIContent("Aspect Ratio"))); 39 | } 40 | serializedObject.ApplyModifiedProperties(); 41 | } 42 | } 43 | } 44 | 45 | #endif -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderAttribute.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace UnityEngine.Recorder 4 | { 5 | 6 | /// 7 | /// What is this: Provides the information needed to register Recorder classes with the RecorderInventory. 8 | /// Motivation : Dynamically discover Recorder classes and provide a classification system and link between the recorder classes and their Settings classes. 9 | /// 10 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 11 | public class RecorderAttribute : Attribute 12 | { 13 | public Type settings; 14 | public string category; 15 | public string displayName; 16 | 17 | public RecorderAttribute(Type settingsType, string category, string displayName) 18 | { 19 | this.settings = settingsType; 20 | this.category = category; 21 | this.displayName = displayName; 22 | } 23 | } 24 | 25 | /// 26 | /// What is this: Indicate that a Input settings instance is scene specific and should not be shared accross scenes (not in a project wide asset) 27 | /// Motivation : Some input settings target specific scenes, for example target a game object in the scene. Having the settings be stored in the 28 | /// scene simplifies referencing. 29 | /// 30 | [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 31 | public class StoreInSceneAttribute : Attribute 32 | { 33 | public StoreInSceneAttribute() 34 | { 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/InputBinder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace UnityEngine.Recorder 5 | { 6 | /// 7 | /// What is it: Place holder for an input setting, in a recorder settings asset, for an input setting that is stored in the scene. 8 | /// Motivation: Input settings can be flagged to persist in the scene and not in the asset. This is to facilitate settings that target specific scene objects. 9 | /// When settings are saved in the scene, need a place holder in the recorder asset that will indicate that the real settings should be read from the scene. 10 | /// 11 | public class InputBinder : RecorderInputSetting 12 | { 13 | [SerializeField] 14 | string m_TypeName; 15 | 16 | public string typeName 17 | { 18 | get 19 | { 20 | return m_TypeName; 21 | } 22 | set 23 | { 24 | if( string.IsNullOrEmpty(value) ) 25 | throw new ArgumentException("Invalid type name value being set!"); 26 | m_TypeName = value; 27 | } 28 | } 29 | 30 | public override Type inputType 31 | { 32 | get 33 | { 34 | if( string.IsNullOrEmpty(typeName) ) 35 | throw new Exception("Invalid/uninitialized type!"); 36 | 37 | return Type.GetType(typeName); 38 | } 39 | } 40 | 41 | public override bool ValidityCheck( List errors ) 42 | { 43 | return false; 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation/Editor/AnimationInput.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEditor.Experimental.Animations; 3 | using UnityEngine; 4 | using UnityEngine.Recorder; 5 | 6 | namespace UnityEditor.Experimental.Recorder.Input 7 | { 8 | public class AnimationInput : RecorderInput 9 | { 10 | public GameObjectRecorder m_gameObjectRecorder; 11 | private float m_time; 12 | 13 | public override void BeginRecording(RecordingSession session) 14 | { 15 | var aniSettings = (settings as AnimationInputSettings); 16 | 17 | if (!aniSettings.enabled) 18 | return; 19 | 20 | var srcGO = aniSettings.gameObject; 21 | #if UNITY_2018_1_OR_NEWER 22 | m_gameObjectRecorder = new GameObjectRecorder(srcGO); 23 | #else 24 | m_gameObjectRecorder = new GameObjectRecorder {root = srcGO}; 25 | #endif 26 | foreach (var binding in aniSettings.bindingType) 27 | { 28 | #if UNITY_2018_2_OR_NEWER 29 | m_gameObjectRecorder.BindComponentsOfType(srcGO, binding, aniSettings.recursive); 30 | #else 31 | m_gameObjectRecorder.BindComponent(srcGO, binding, aniSettings.recursive); 32 | #endif 33 | } 34 | m_time = session.recorderTime; 35 | } 36 | 37 | public override void NewFrameReady(RecordingSession session) 38 | { 39 | if (session.recording && (settings as AnimationInputSettings).enabled ) 40 | { 41 | m_gameObjectRecorder.TakeSnapshot(session.recorderTime - m_time); 42 | m_time = session.recorderTime; 43 | } 44 | } 45 | 46 | 47 | } 48 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/InputEditor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEngine.Recorder; 5 | 6 | namespace UnityEditor.Recorder 7 | { 8 | public abstract class InputEditor : Editor 9 | { 10 | protected List m_SettingsErrors = new List(); 11 | 12 | public delegate EFieldDisplayState IsFieldAvailableDelegate(SerializedProperty property); 13 | 14 | public IsFieldAvailableDelegate isFieldAvailableForHost { get; set; } 15 | 16 | protected virtual void AddProperty(SerializedProperty prop, Action action) 17 | { 18 | var state = isFieldAvailableForHost == null ? EFieldDisplayState.Disabled : isFieldAvailableForHost(prop); 19 | 20 | if (state == EFieldDisplayState.Enabled) 21 | state = IsFieldAvailable(prop); 22 | if (state != EFieldDisplayState.Hidden) 23 | { 24 | using (new EditorGUI.DisabledScope(state == EFieldDisplayState.Disabled)) 25 | action(); 26 | } 27 | } 28 | 29 | protected virtual EFieldDisplayState IsFieldAvailable(SerializedProperty property) 30 | { 31 | return EFieldDisplayState.Enabled; 32 | } 33 | 34 | public virtual void OnValidateSettingsGUI() 35 | { 36 | m_SettingsErrors.Clear(); 37 | if (!(target as RecorderInputSetting).ValidityCheck(m_SettingsErrors)) 38 | { 39 | for (int i = 0; i < m_SettingsErrors.Count; i++) 40 | { 41 | EditorGUILayout.HelpBox(m_SettingsErrors[i], MessageType.Warning); 42 | } 43 | } 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Editor/ImageRecorderEditor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using UnityEngine.Recorder; 4 | using UnityEngine.Recorder.Input; 5 | 6 | namespace UnityEditor.Recorder 7 | { 8 | [CustomEditor(typeof(ImageRecorderSettings))] 9 | public class ImageRecorderEditor : RecorderEditor 10 | { 11 | SerializedProperty m_OutputFormat; 12 | 13 | [MenuItem("Tools/Recorder/Video")] 14 | static void ShowRecorderWindow() 15 | { 16 | RecorderWindow.ShowAndPreselectCategory("Video"); 17 | } 18 | 19 | protected override void OnEnable() 20 | { 21 | base.OnEnable(); 22 | 23 | if (target == null) 24 | return; 25 | 26 | var pf = new PropertyFinder(serializedObject); 27 | m_OutputFormat = pf.Find(w => w.m_OutputFormat); 28 | } 29 | 30 | protected override void OnEncodingGroupGui() 31 | { 32 | // hiding this group by not calling parent class's implementation. 33 | } 34 | 35 | protected override void OnOutputGui() 36 | { 37 | AddProperty(m_OutputFormat, () => EditorGUILayout.PropertyField(m_OutputFormat, new GUIContent("Output format"))); 38 | base.OnOutputGui(); 39 | } 40 | 41 | protected override EFieldDisplayState GetFieldDisplayState(SerializedProperty property) 42 | { 43 | if (property.name == "m_AllowTransparency") 44 | { 45 | return (target as ImageRecorderSettings).m_OutputFormat == PNGRecordeOutputFormat.JPEG ? EFieldDisplayState.Hidden : EFieldDisplayState.Enabled; 46 | } 47 | 48 | return base.GetFieldDisplayState(property); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/FileNameDrawer.cs: -------------------------------------------------------------------------------- 1 | using System.Linq; 2 | using UnityEngine; 3 | using UnityEngine.Recorder; 4 | 5 | namespace UnityEditor.Recorder 6 | { 7 | [CustomPropertyDrawer(typeof(FileNameGenerator))] 8 | public class FileNameDrawer : PropertyDrawer 9 | { 10 | static string[] m_FileNameTags; 11 | 12 | static FileNameDrawer() 13 | { 14 | var temp = FileNameGenerator.tagLabels.ToList(); 15 | temp.Insert(0, "+ tag"); 16 | m_FileNameTags = temp.ToArray(); 17 | } 18 | 19 | public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) 20 | { 21 | EditorGUI.BeginProperty(position, label, property); 22 | position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); 23 | 24 | var indent = EditorGUI.indentLevel; 25 | EditorGUI.indentLevel = 0; 26 | 27 | float tagWidth = 50; 28 | float txtWidth = position.width - tagWidth - 5; 29 | Rect txtRect = new Rect(position.x, position.y, txtWidth, position.height); 30 | Rect tagRect = new Rect(position.x + txtWidth + 5, position.y, tagWidth, position.height); 31 | 32 | EditorGUI.PropertyField(txtRect, property.FindPropertyRelative( "m_Pattern"), GUIContent.none); 33 | 34 | int value = EditorGUI.Popup(tagRect, 0, m_FileNameTags); 35 | if (value != 0) 36 | { 37 | var pattern = property.FindPropertyRelative("m_Pattern"); 38 | pattern.stringValue = FileNameGenerator.AddTag(pattern.stringValue, (FileNameGenerator.ETags)(value - 1) ); 39 | } 40 | 41 | EditorGUI.indentLevel = indent; 42 | EditorGUI.EndProperty(); 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation/Editor/AnimationInputSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEngine; 5 | using UnityEngine.Recorder; 6 | 7 | namespace UnityEditor.Experimental.Recorder.Input 8 | { 9 | [Serializable] 10 | [StoreInScene] 11 | public class AnimationInputSettings : RecorderInputSetting 12 | { 13 | public GameObject gameObject; 14 | public bool enabled = false; 15 | public bool recursive = true; 16 | 17 | public bool fold = true; 18 | 19 | [HideInInspector] 20 | public List bindingTypeName = new List(); 21 | public List bindingType 22 | { 23 | get 24 | { 25 | var ret = new List(bindingTypeName.Count); 26 | foreach (var t in bindingTypeName) 27 | { 28 | ret.Add( Type.GetType(t)); 29 | } 30 | return ret; 31 | } 32 | } 33 | 34 | public override Type inputType 35 | { 36 | get { return typeof(AnimationInput); } 37 | } 38 | 39 | public override bool ValidityCheck( List errors ) 40 | { 41 | var ok = true; 42 | if (enabled) 43 | { 44 | 45 | if (gameObject != null 46 | && bindingType.Count > 0 47 | && bindingType.Any(x => typeof(MonoBehaviour).IsAssignableFrom(x) || typeof(ScriptableObject).IsAssignableFrom(x)) 48 | ) 49 | { 50 | ok = false; 51 | errors.Add("Monobehaviours and ScriptableObjects are not supported inputs."); 52 | } 53 | } 54 | 55 | return ok; 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Shaders/BS4Accumulate.shader: -------------------------------------------------------------------------------- 1 | // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' 2 | 3 | Shader "Hidden/BeautyShot/Accumulate" { 4 | Properties { 5 | _MainTex("Diffuse", 2D) = "white" {} 6 | _OfsX("OfsX", Float) = 0 7 | _OfsY("OfsY", Float) = 0 8 | _Width("Width", Float) = 1 9 | _Height("Height", Float) = 1 10 | _Scale("Scale", Float) = 1 11 | _Pass("Pass", int) = 0 12 | } 13 | 14 | CGINCLUDE 15 | 16 | // FIXME: Had to comment out to make it work on OSX. Needs to be revised. 17 | // #pragma only_renderers d3d11 ps4 opengl 18 | 19 | #include "UnityCG.cginc" 20 | 21 | struct v2f { 22 | float4 pos : SV_Position; 23 | float2 uv : TEXCOORD0; 24 | }; 25 | 26 | v2f vert(appdata_img v) { 27 | v2f o; 28 | o.pos = UnityObjectToClipPos(v.vertex); 29 | o.uv = v.texcoord; 30 | return o; 31 | } 32 | 33 | uniform sampler2D _MainTex; 34 | uniform float4 _MainTex_TexelSize; 35 | 36 | uniform sampler2D _PreviousTexture; 37 | Float _OfsX; 38 | Float _OfsY; 39 | Float _Width; 40 | Float _Height; 41 | Float _Scale; 42 | int _Pass; 43 | 44 | float4 frag(v2f i) : SV_Target { 45 | float4 previous = tex2D(_PreviousTexture, i.uv); 46 | float2 tmp = i.uv; 47 | float4 current = {0,0,0,0}; 48 | if( i.uv.x >= _OfsX && i.uv.x <= (_OfsX+ _Width) && i.uv.y >= _OfsY && i.uv.y <= (_OfsY + _Height)) 49 | { 50 | tmp.x = (tmp.x - _OfsX) / _Scale; 51 | tmp.y = (tmp.y - _OfsY) / _Scale; 52 | current = tex2D(_MainTex, tmp); 53 | 54 | if (_Pass == 0) 55 | return current; 56 | else 57 | return previous + current; 58 | } 59 | else 60 | return previous; 61 | } 62 | 63 | ENDCG 64 | 65 | SubShader { 66 | Cull Off ZTest Always ZWrite Off 67 | 68 | Pass { 69 | CGPROGRAM 70 | #pragma vertex vert 71 | #pragma fragment frag 72 | ENDCG 73 | } 74 | }} -------------------------------------------------------------------------------- /docs/images/PNGRecorder.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fd0953b86fa6f00458845be022298125 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/RecorderClip.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a6f32382e1ef264478a3655625b48a7f 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/ConceptualBlocks.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4e3f7ae0ca1bff446a939689cb86a88a 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/EditorClasses.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c04a708d31567d34c82f96647f7f87a5 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/GameModeClasses.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b15081e8ccdc2b84daf453df9692c22a 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/RecorderWindow.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e24a12e56bdb6e34fbc53861b06af31f 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/TimelineClasses.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 87284fa086e97074e981090614161053 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/TimelineTrack.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 358aaca06f7bb0a44b6d1aa285a1a05f 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/recorder-menu.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 69aa95bd7386a14459d55585a0ee5a71 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/RecorderEngineClasses.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8fe5f709dcf22ff4b928bff52c6985a6 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /docs/images/Recorders_and_inputs.PNG.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e28a47cfbd5e4d64190a3d2956d3a419 3 | timeCreated: 1502734128 4 | licenseType: Pro 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | externalObjects: {} 8 | serializedVersion: 4 9 | mipmaps: 10 | mipMapMode: 0 11 | enableMipMap: 1 12 | sRGBTexture: 1 13 | linearTexture: 0 14 | fadeOut: 0 15 | borderMipMap: 0 16 | mipMapsPreserveCoverage: 0 17 | alphaTestReferenceValue: 0.5 18 | mipMapFadeDistanceStart: 1 19 | mipMapFadeDistanceEnd: 3 20 | bumpmap: 21 | convertToNormalMap: 0 22 | externalNormalMap: 0 23 | heightScale: 0.25 24 | normalMapFilter: 0 25 | isReadable: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -1 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 49 | spritePixelsToUnits: 100 50 | alphaUsage: 1 51 | alphaIsTransparency: 0 52 | spriteTessellationDetail: -1 53 | textureType: 0 54 | textureShape: 1 55 | maxTextureSizeSet: 0 56 | compressionQualitySet: 0 57 | textureFormatSet: 0 58 | platformSettings: 59 | - buildTarget: DefaultTexturePlatform 60 | maxTextureSize: 2048 61 | resizeAlgorithm: 0 62 | textureFormat: -1 63 | textureCompression: 1 64 | compressionQuality: 50 65 | crunchedCompression: 0 66 | allowsAlphaSplitting: 0 67 | overridden: 0 68 | spriteSheet: 69 | serializedVersion: 2 70 | sprites: [] 71 | outline: [] 72 | physicsShape: [] 73 | spritePackingTag: 74 | userData: 75 | assetBundleName: 76 | assetBundleVariant: 77 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Verbose.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | #if UNITY_EDITOR 3 | using UnityEditor; 4 | #endif 5 | namespace UnityEngine.Recorder 6 | { 7 | #if UNITY_EDITOR 8 | [InitializeOnLoad] 9 | public class Verbose 10 | { 11 | const string MENU_NAME = "Tools/Recorder/Debug mode"; 12 | static bool m_cachedState; 13 | 14 | public static bool enabled 15 | { 16 | get { return m_cachedState; } 17 | set 18 | { 19 | EditorPrefs.SetBool(MENU_NAME, value); 20 | m_cachedState = value; 21 | var go = SceneHook.GetGameObject(false); 22 | if (go != null) 23 | { 24 | go.hideFlags = value ? HideFlags.None : HideFlags.HideInHierarchy; 25 | } 26 | } 27 | } 28 | 29 | static Verbose() 30 | { 31 | enabled = EditorPrefs.GetBool(MENU_NAME, false); 32 | 33 | /// Delaying until first editor tick so that the menu will be populated before setting check state, and re-apply correct action 34 | EditorApplication.delayCall += () => PerformAction(enabled); 35 | } 36 | 37 | [MenuItem(MENU_NAME, false, Int32.MaxValue)] 38 | static void ToggleAction() 39 | { 40 | PerformAction(!enabled); 41 | } 42 | 43 | public static void PerformAction(bool newState) 44 | { 45 | Menu.SetChecked(MENU_NAME, newState); 46 | enabled = newState; 47 | } 48 | 49 | } 50 | 51 | #else 52 | public class Verbose 53 | { 54 | static bool m_State; 55 | public static bool enabled 56 | { 57 | get { return m_State; } 58 | set 59 | { 60 | m_State = value; 61 | var go = SceneHook.GetGameObject(false); 62 | if (go != null) 63 | { 64 | go.hideFlags = value ? HideFlags.None : HideFlags.HideInHierarchy; 65 | } 66 | } 67 | } 68 | } 69 | #endif 70 | 71 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/ImageRecorderSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.Remoting.Messaging; 3 | 4 | namespace UnityEngine.Recorder 5 | { 6 | 7 | /// 8 | /// What is it: enum oof standard display resolutions 9 | /// Motivation: just nice to have. simplifies and makes things more explicit. 10 | /// 11 | public enum EImageDimension 12 | { 13 | //x8640p_16K = 8640, 14 | x4320p_8K = 4320, 15 | x2880p_5K = 2880, 16 | x2160p_4K = 2160, 17 | x1440p_QHD = 1440, 18 | x1080p_FHD = 1080, 19 | x720p_HD = 720, 20 | x480p = 480, 21 | x240p = 240, 22 | Window = 0, 23 | //Manual = -1, for user entering his own resolution 24 | } 25 | 26 | 27 | /// 28 | /// What is it: enum oof standard display aspect ratios 29 | /// Motivation: just nice to have. simplifies and makes things more explicit. 30 | /// 31 | public enum EImageAspect 32 | { 33 | x16_9, 34 | x16_10, 35 | x19_10, 36 | x5_4, 37 | x4_3, 38 | } 39 | 40 | /// 41 | /// What is it: utility class to convert an aspect ratio enum value to it's corresponding float. 42 | /// Motivation: just nice to have. 43 | /// 44 | public class AspectRatioHelper 45 | { 46 | public static float GetRealAR(EImageAspect aspectRatio) 47 | { 48 | switch (aspectRatio) 49 | { 50 | case EImageAspect.x16_9: 51 | return 16.0f / 9.0f; 52 | case EImageAspect.x16_10: 53 | return 16.0f / 10.0f; 54 | case EImageAspect.x19_10: 55 | return 19.0f / 10.0f; 56 | case EImageAspect.x5_4: 57 | return 5.0f / 4.0f; 58 | case EImageAspect.x4_3: 59 | return 4.0f / 3.0f; 60 | default: 61 | throw new ArgumentOutOfRangeException("aspectRatio", aspectRatio, null); 62 | } 63 | } 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/OutputPathDrawer.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.Recorder; 3 | 4 | namespace UnityEditor.Recorder 5 | { 6 | [CustomPropertyDrawer(typeof(OutputPath))] 7 | class OutputPathDrawer : PropertyDrawer 8 | { 9 | public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) 10 | { 11 | EditorGUI.BeginProperty(position, label, property); 12 | position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); 13 | 14 | var indent = EditorGUI.indentLevel; 15 | EditorGUI.indentLevel = 0; 16 | 17 | float rootWidth = 70; 18 | float btnWidth = 30; 19 | float leafWidth = position.width - rootWidth - btnWidth - 10; 20 | var rootRect = new Rect(position.x, position.y, rootWidth, position.height); 21 | var leafRect = new Rect(position.x + rootWidth + 5, position.y, leafWidth, position.height); 22 | var btnRect = new Rect(position.x + rootWidth + leafWidth + 10, position.y, btnWidth, position.height); 23 | 24 | 25 | EditorGUI.PropertyField(rootRect, property.FindPropertyRelative("m_root"), GUIContent.none); 26 | EditorGUI.PropertyField(leafRect, property.FindPropertyRelative("m_leaf"), GUIContent.none); 27 | 28 | var fullPath = OutputPath.GetFullPath( (OutputPath.ERoot)property.FindPropertyRelative("m_root").intValue, property.FindPropertyRelative("m_leaf").stringValue); 29 | if (GUI.Button( btnRect, new GUIContent("...", fullPath))) 30 | { 31 | var newPath = EditorUtility.OpenFolderPanel("Select output location", fullPath, ""); 32 | if (!string.IsNullOrEmpty(newPath)) 33 | { 34 | var newValue = OutputPath.FromPath(newPath); 35 | property.FindPropertyRelative("m_root").intValue = (int)newValue.root; 36 | property.FindPropertyRelative("m_leaf").stringValue = newValue.leaf; 37 | } 38 | } 39 | 40 | EditorGUI.indentLevel = indent; 41 | EditorGUI.EndProperty(); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Shaders/BS4Normalize.shader: -------------------------------------------------------------------------------- 1 | Shader "Hidden/BeautyShot/Normalize" { 2 | Properties { _MainTex ("Texture", any) = "" {} } 3 | 4 | SubShader { 5 | Pass { 6 | ZTest Always Cull Off ZWrite Off 7 | 8 | CGPROGRAM 9 | #pragma vertex vert 10 | #pragma fragment frag 11 | #pragma target 2.0 12 | 13 | #include "UnityCG.cginc" 14 | 15 | sampler2D _MainTex; 16 | uniform float4 _MainTex_ST; 17 | 18 | float _NormalizationFactor; 19 | int _ApplyGammaCorrection; 20 | 21 | float floatToGammaSpace(float value) 22 | { 23 | if (value <= 0.0) 24 | return 0.0F; 25 | else if (value <= 0.0031308) 26 | return 12.92 * value; 27 | else if (value < 1.0) 28 | return 1.055 * pow(value, 0.4166667) - 0.055; 29 | else if (value == 1.0) 30 | return 1.0; 31 | else 32 | return pow(value, 0.45454545454545); 33 | } 34 | 35 | float4 float4ToGammaSpace(float4 value) 36 | { 37 | float4 gammaValue; 38 | 39 | gammaValue[0] = floatToGammaSpace(value[0]); 40 | gammaValue[1] = floatToGammaSpace(value[1]); 41 | gammaValue[2] = floatToGammaSpace(value[2]); 42 | gammaValue[3] = value[3]; 43 | 44 | return gammaValue; 45 | } 46 | 47 | struct appdata_t { 48 | float4 vertex : POSITION; 49 | float2 texcoord : TEXCOORD0; 50 | }; 51 | 52 | struct v2f { 53 | float4 vertex : SV_POSITION; 54 | float2 texcoord : TEXCOORD0; 55 | }; 56 | 57 | v2f vert (appdata_t v) 58 | { 59 | v2f o; 60 | o.vertex = UnityObjectToClipPos(v.vertex); 61 | o.texcoord = TRANSFORM_TEX(v.texcoord.xy, _MainTex); 62 | return o; 63 | } 64 | 65 | fixed4 frag (v2f i) : SV_Target 66 | { 67 | float4 mainTex = tex2D(_MainTex, i.texcoord); 68 | if(_ApplyGammaCorrection == 0) 69 | return mainTex * _NormalizationFactor; 70 | else 71 | return float4ToGammaSpace( mainTex * _NormalizationFactor ); 72 | } 73 | ENDCG 74 | 75 | } 76 | } 77 | Fallback Off 78 | } 79 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/RTInputSelector.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEngine.Recorder; 5 | 6 | namespace UnityEditor.Recorder 7 | { 8 | public class RTInputSelector 9 | { 10 | RecorderSettings recSettings; 11 | 12 | struct InputGroup 13 | { 14 | public string title; 15 | public string[] captions; 16 | public Type[] types; 17 | } 18 | 19 | SortedDictionary m_Groups; 20 | 21 | public RTInputSelector( RecorderSettings recSettings ) 22 | { 23 | m_Groups = new SortedDictionary(); 24 | this.recSettings = recSettings; 25 | 26 | AddGroups( recSettings.GetInputGroups() ); 27 | } 28 | 29 | void AddGroups(List groups) 30 | { 31 | for(int i = 0; i < groups.Count; i++) 32 | { 33 | m_Groups.Add(m_Groups.Count, 34 | new InputGroup() 35 | { 36 | title = groups[i].title, 37 | captions = groups[i].typesFilter.Select(x => x.title).ToArray(), 38 | types = groups[i].typesFilter.Select(x => x.type).ToArray(), 39 | }); 40 | } 41 | } 42 | 43 | public bool OnInputGui( int groupIndex, ref RecorderInputSetting input) 44 | { 45 | if (!m_Groups.ContainsKey(groupIndex)) 46 | return false; 47 | if (m_Groups[groupIndex].types.Length < 2) 48 | return false; 49 | 50 | int index = 0; 51 | for (int i = 0; i < m_Groups[groupIndex].types.Length; i++) 52 | { 53 | if (m_Groups[groupIndex].types[i] == input.GetType()) 54 | { 55 | index = i; 56 | break; 57 | } 58 | } 59 | var newIndex = EditorGUILayout.Popup("Collection method", index, m_Groups[groupIndex].captions); 60 | 61 | if (index != newIndex) 62 | { 63 | input = recSettings.NewInputSettingsObj( m_Groups[groupIndex].types[newIndex], m_Groups[groupIndex].title ); 64 | return true; 65 | } 66 | 67 | return false; 68 | } 69 | } 70 | 71 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/RecorderClip.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine.Playables; 3 | using UnityEngine.Timeline; 4 | 5 | namespace UnityEngine.Recorder.Timeline 6 | { 7 | /// 8 | /// What is it: Implements a Timeline Clip asset that can be inserted onto a timeline track to trigger a recording of something. 9 | /// Motivation: Allow Timeline to trigger recordings 10 | /// 11 | /// Note: Instances of this call Own their associated Settings asset's lifetime. 12 | /// 13 | [System.ComponentModel.DisplayName("Recorder Clip")] 14 | public class RecorderClip : PlayableAsset, ITimelineClipAsset 15 | { 16 | public delegate void RecordingClipDoneDelegate(RecorderClip clip); 17 | 18 | public static RecordingClipDoneDelegate OnClipDone; 19 | 20 | [SerializeField] 21 | public RecorderSettings m_Settings; 22 | 23 | public Type recorderType 24 | { 25 | get { return m_Settings == null ? null : m_Settings.recorderType; } 26 | } 27 | 28 | public ClipCaps clipCaps 29 | { 30 | get { return ClipCaps.None; } 31 | } 32 | 33 | public override Playable CreatePlayable(PlayableGraph graph, GameObject owner) 34 | { 35 | var playable = ScriptPlayable.Create(graph); 36 | var behaviour = playable.GetBehaviour(); 37 | if (recorderType != null && UnityHelpers.IsPlaying()) 38 | { 39 | behaviour.session = new RecordingSession() 40 | { 41 | m_Recorder = RecordersInventory.GenerateNewRecorder(recorderType, m_Settings), 42 | m_RecorderGO = SceneHook.HookupRecorder(), 43 | }; 44 | behaviour.OnEnd = () => 45 | { 46 | try 47 | { 48 | if (OnClipDone != null) OnClipDone(this); 49 | } 50 | catch (Exception ex) 51 | { 52 | Debug.Log("OnClipDone call back generated an exception: " + ex.Message ); 53 | Debug.LogException(ex); 54 | } 55 | }; 56 | } 57 | return playable; 58 | } 59 | 60 | public virtual void OnDestroy() 61 | { 62 | UnityHelpers.Destroy( m_Settings, true ); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder/Editor/AnimationRecorder.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Linq; 3 | using UnityEditor; 4 | using UnityEditor.Experimental.Recorder.Input; 5 | using UnityEngine; 6 | using UnityEngine.Recorder; 7 | using UnityEngine.Recorder.Input; 8 | 9 | namespace UnityEditor.Experimental.Recorder 10 | { 11 | [Recorder(typeof(AnimationRecorderSettings), "Animation Clips", "Unity/Animation Recording")] 12 | public class AnimationRecorder : GenericRecorder 13 | { 14 | public override void RecordFrame(RecordingSession session) 15 | { 16 | } 17 | 18 | 19 | public override void EndRecording(RecordingSession ctx) 20 | { 21 | var ars = ctx.settings as AnimationRecorderSettings; 22 | 23 | for (int i = 0; i < m_Inputs.Count; ++i) 24 | { 25 | var set = (settings.inputsSettings[i] as AnimationInputSettings); 26 | if (set.enabled) 27 | { 28 | var dir = "Assets/" + ars.outputPath; 29 | var idx = dir.LastIndexOf('/'); 30 | if (idx > -1) 31 | { 32 | dir = dir.Substring(0,idx); 33 | } 34 | dir = ReplaceTokens(dir, ars, set); 35 | Directory.CreateDirectory(dir); 36 | 37 | var aInput = m_Inputs[i] as AnimationInput; 38 | AnimationClip clip = new AnimationClip(); 39 | var clipName = ReplaceTokens(("Assets/" + ars.outputPath),ars, set)+".anim"; 40 | clipName = AssetDatabase.GenerateUniqueAssetPath(clipName); 41 | AssetDatabase.CreateAsset(clip, clipName); 42 | aInput.m_gameObjectRecorder.SaveToClip(clip); 43 | aInput.m_gameObjectRecorder.ResetRecording(); 44 | } 45 | } 46 | 47 | ars.take++; 48 | base.EndRecording(ctx); 49 | } 50 | 51 | private string ReplaceTokens(string input, AnimationRecorderSettings ars, AnimationInputSettings ais) 52 | { 53 | var idx = m_Inputs.Select(x => x.settings).ToList().IndexOf(ais); 54 | return input.Replace(AnimationRecorderSettings.goToken, ais.gameObject.name) 55 | .Replace(AnimationRecorderSettings.inputToken,(idx+1).ToString("00")) 56 | .Replace(AnimationRecorderSettings.takeToken, ars.take.ToString("000")); 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /source/Audio/Editor/AudioInputSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2017_3_OR_NEWER 2 | using UnityEditorInternal; 3 | using UnityEngine; 4 | using UnityEngine.Recorder; 5 | using UnityEngine.Recorder.Input; 6 | using UnityEngine.UI; 7 | 8 | namespace UnityEditor.Recorder.Input 9 | { 10 | [CustomEditor(typeof(AudioInputSettings))] 11 | public class AudioInputSettingsEditor : InputEditor 12 | { 13 | SerializedProperty m_PreserveAudio; 14 | #if RECORD_AUDIO_MIXERS 15 | SerializedProperty m_AudioMixerGroups; 16 | ReorderableList m_AudioMixerGroupsList; 17 | #endif 18 | 19 | protected void OnEnable() 20 | { 21 | if (target == null) 22 | return; 23 | 24 | var pf = new PropertyFinder(serializedObject); 25 | m_PreserveAudio = pf.Find(w => w.m_PreserveAudio); 26 | 27 | #if RECORD_AUDIO_MIXERS 28 | m_AudioMixerGroups = serializedObject.FindProperty(x => x.m_AudioMixerGroups); 29 | m_AudioMixerGroupsList = new ReorderableList(serializedObject, m_AudioMixerGroups, true, true, true, true); 30 | m_AudioMixerGroupsList.drawElementCallback = 31 | (Rect rect, int index, bool isActive, bool isFocused) => 32 | { 33 | var element = m_AudioMixerGroupsList.serializedProperty.GetArrayElementAtIndex(index); 34 | rect.y += 2; 35 | EditorGUI.PropertyField( 36 | new Rect(rect.x - 25, rect.y, rect.width - 90, EditorGUIUtility.singleLineHeight), 37 | element.FindPropertyRelative("m_MixerGroup"), GUIContent.none); 38 | EditorGUI.PropertyField( 39 | new Rect(rect.x + rect.width - 85, rect.y, 20, EditorGUIUtility.singleLineHeight), 40 | element.FindPropertyRelative("m_Isolate"), GUIContent.none); 41 | EditorGUI.LabelField( 42 | new Rect(rect.x + rect.width - 65, rect.y, 60, EditorGUIUtility.singleLineHeight), 43 | new GUIContent ("Isolate", "Isolate group from mix")); 44 | }; 45 | 46 | m_AudioMixerGroupsList.drawHeaderCallback = (Rect rect) => 47 | { 48 | EditorGUI.LabelField(rect, "Audio Mixer Groups"); 49 | }; 50 | #endif 51 | } 52 | 53 | public override void OnInspectorGUI() 54 | { 55 | EditorGUILayout.PropertyField(m_PreserveAudio, new GUIContent("Capture audio")); 56 | 57 | #if RECORD_AUDIO_MIXERS 58 | if (m_AudioMixerGroups != null) 59 | { 60 | serializedObject.Update(); 61 | m_AudioMixerGroupsList.DoLayoutList(); 62 | } 63 | #endif 64 | 65 | serializedObject.ApplyModifiedProperties(); 66 | } 67 | } 68 | } 69 | 70 | #endif -------------------------------------------------------------------------------- /source/FrameRecorder/Packager/Private/Editor/FRPackager.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using UnityEngine; 4 | 5 | namespace UnityEditor.Recorder 6 | { 7 | static class FRPackager 8 | { 9 | const string k_PackageName = "Recorder"; 10 | 11 | public static string GetFrameRecorderRootPath() 12 | { 13 | return Application.dataPath + "/Recorder/"; 14 | } 15 | 16 | [MenuItem("Tools/Recorder/Asset Store/Decrement Version", false, 100)] 17 | static void DecrementVersion() 18 | { 19 | UpdateVersion(-1); 20 | } 21 | 22 | [MenuItem("Tools/Recorder/Asset Store/Generate Assetstore package", false, 100)] 23 | static void GenerateAssetStorePackage() 24 | { 25 | var rootPath = FRPackagerPaths.GetRecorderRootPath(); 26 | 27 | UpdateVersion(1); 28 | 29 | var files = new [] 30 | { 31 | Path.Combine(rootPath, "Recorder_install.pdf" ), 32 | Path.Combine(rootPath, "Framework.meta" ), 33 | Path.Combine(rootPath, "Framework/Core" ), 34 | Path.Combine(rootPath, "Framework/Inputs" ), 35 | Path.Combine(rootPath, "Framework/Recorders" ), 36 | Path.Combine(rootPath, "Framework/Packager/Editor" ), 37 | Path.Combine(rootPath, "Extensions/UTJ" ), 38 | Path.Combine(rootPath, "Extensions/FCIntegration" ), 39 | Path.Combine(rootPath, "Extensions/MovieRecorder" ), 40 | }; 41 | var destFile = k_PackageName + " " + RecorderVersion.Stage + " v"+ RecorderVersion.Tag + ".unitypackage"; 42 | AssetDatabase.ExportPackage(files, destFile, ExportPackageOptions.Recurse); 43 | Debug.Log("Generated package: " + destFile); 44 | } 45 | 46 | static void UpdateVersion( int delta ) 47 | { 48 | var path = FRPackagerPaths.GetRecorderVersionFilePath(); 49 | var script = File.ReadAllText(path); 50 | 51 | var tag = "public static int BuildNumber"; 52 | var startOffset = script.IndexOf(tag); 53 | 54 | var endOffset = script.IndexOf(";", startOffset); 55 | var pattern = script.Substring(startOffset, endOffset - startOffset); 56 | 57 | RecorderVersion.BuildNumber+=delta; 58 | script = script.Replace(pattern, string.Format("public static int BuildNumber = {0}", RecorderVersion.BuildNumber)); 59 | File.WriteAllText(path, script); 60 | AssetDatabase.Refresh(); 61 | 62 | Debug.Log( "Version Tag set to: "+RecorderVersion.Tag); 63 | } 64 | 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder/Editor/AnimationRecorderSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using UnityEditor.Experimental.Recorder.Input; 5 | using UnityEngine; 6 | using UnityEngine.Recorder; 7 | using UnityEngine.Recorder.Input; 8 | 9 | namespace UnityEditor.Experimental.Recorder 10 | { 11 | [ExecuteInEditMode] 12 | [Serializable] 13 | public class AnimationRecorderSettings : RecorderSettings 14 | { 15 | public string outputPath = "AnimRecorder"+takeToken+"/"+goToken+"_"+inputToken; 16 | public int take = 1; 17 | public static string goToken = ""; 18 | public static string takeToken = ""; 19 | public static string inputToken = ""; 20 | public override List GetDefaultInputSettings() 21 | { 22 | return new List() 23 | { 24 | NewInputSettingsObj("Animation") 25 | }; 26 | } 27 | 28 | public override bool isPlatformSupported 29 | { 30 | get 31 | { 32 | return Application.platform == RuntimePlatform.LinuxEditor || 33 | Application.platform == RuntimePlatform.OSXEditor || 34 | Application.platform == RuntimePlatform.WindowsEditor; 35 | } 36 | } 37 | 38 | public override List GetInputGroups() 39 | { 40 | return new List() 41 | { 42 | new InputGroupFilter() 43 | { 44 | title = "Animation", 45 | typesFilter = new List() 46 | { 47 | new TInputFilter("GameObject Recorder"), 48 | } 49 | } 50 | }; 51 | } 52 | 53 | public override bool ValidityCheck( List errors ) 54 | { 55 | var ok = base.ValidityCheck(errors); 56 | 57 | if (inputsSettings == null) 58 | { 59 | ok = false; 60 | errors.Add("Invalid state!"); 61 | } 62 | if (!inputsSettings.Cast().Any(x => x != null && x.enabled && x.gameObject != null )) 63 | { 64 | ok = false; 65 | errors.Add("No input object set/enabled."); 66 | } 67 | 68 | if ( string.IsNullOrEmpty(outputPath)) 69 | { 70 | ok = false; 71 | errors.Add("Invalid output path."); 72 | } 73 | 74 | return ok; 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /source/Recorder/Editor/MediaRecorderEditor.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2017_3_OR_NEWER 2 | 3 | using System; 4 | using System.Collections.Generic; 5 | using UnityEditor.Recorder.Input; 6 | using UnityEngine; 7 | using UnityEngine.Recorder; 8 | using UnityEngine.Recorder.Input; 9 | 10 | namespace UnityEditor.Recorder 11 | { 12 | [CustomEditor(typeof(MediaRecorderSettings))] 13 | public class MediaRecorderEditor : RecorderEditor 14 | { 15 | SerializedProperty m_OutputFormat; 16 | #if UNITY_2018_1_OR_NEWER 17 | SerializedProperty m_EncodingBitRateMode; 18 | #endif 19 | SerializedProperty m_FlipVertical; 20 | RTInputSelector m_RTInputSelector; 21 | 22 | [MenuItem("Window/Recorder/Video")] 23 | static void ShowRecorderWindow() 24 | { 25 | RecorderWindow.ShowAndPreselectCategory("Video"); 26 | } 27 | 28 | protected override void OnEnable() 29 | { 30 | base.OnEnable(); 31 | 32 | if (target == null) 33 | return; 34 | 35 | var pf = new PropertyFinder(serializedObject); 36 | m_OutputFormat = pf.Find(w => w.m_OutputFormat); 37 | #if UNITY_2018_1_OR_NEWER 38 | m_EncodingBitRateMode = pf.Find(w => w.m_VideoBitRateMode); 39 | #endif 40 | } 41 | 42 | #if UNITY_2018_1_OR_NEWER 43 | protected override void OnEncodingGui() 44 | { 45 | AddProperty(m_EncodingBitRateMode, () => EditorGUILayout.PropertyField(m_EncodingBitRateMode, new GUIContent("Bitrate Mode"))); 46 | } 47 | #else 48 | protected override void OnEncodingGroupGui() 49 | { 50 | // hiding this group by not calling parent class's implementation. 51 | } 52 | #endif 53 | 54 | protected override void OnOutputGui() 55 | { 56 | AddProperty(m_OutputFormat, () => EditorGUILayout.PropertyField(m_OutputFormat, new GUIContent("Output format"))); 57 | 58 | base.OnOutputGui(); 59 | } 60 | 61 | protected override EFieldDisplayState GetFieldDisplayState(SerializedProperty property) 62 | { 63 | if (property.name == "m_FlipVertical" || property.name == "m_CaptureEveryNthFrame" ) 64 | return EFieldDisplayState.Hidden; 65 | if (property.name == "m_FrameRateMode" ) 66 | return EFieldDisplayState.Disabled; 67 | 68 | if (property.name == "m_AllowTransparency") 69 | { 70 | return (target as MediaRecorderSettings).m_OutputFormat == MediaRecorderOutputFormat.MP4 ? EFieldDisplayState.Disabled : EFieldDisplayState.Enabled; 71 | } 72 | 73 | return base.GetFieldDisplayState(property); 74 | } 75 | 76 | 77 | } 78 | } 79 | 80 | #endif 81 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Shaders/BS4SuperShader.shader: -------------------------------------------------------------------------------- 1 | // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' 2 | 3 | Shader "Hidden/Volund/BS4SuperShader" { 4 | Properties { 5 | _MainTex("Diffuse", 2D) = "white" {} 6 | } 7 | 8 | CGINCLUDE 9 | 10 | // FIXME: Had to comment out to make it work on OSX. Needs to be revised. 11 | // #pragma only_renderers d3d11 ps4 opengl 12 | 13 | #include "UnityCG.cginc" 14 | 15 | struct v2f { 16 | float4 pos : SV_Position; 17 | float2 uv : TEXCOORD0; 18 | }; 19 | 20 | v2f vert(appdata_img v) { 21 | v2f o; 22 | o.pos = UnityObjectToClipPos(v.vertex); 23 | o.uv = v.texcoord; 24 | return o; 25 | } 26 | 27 | uniform sampler2D _MainTex; 28 | uniform float4 _MainTex_TexelSize; 29 | 30 | uniform float4 _Target_TexelSize; 31 | 32 | uniform float _KernelCosPower; 33 | uniform float _KernelScale; 34 | uniform float _NormalizationFactor; 35 | int _ApplyGammaCorrection; 36 | 37 | float floatToGammaSpace(float value) 38 | { 39 | if (value <= 0.0) 40 | return 0.0F; 41 | else if (value <= 0.0031308) 42 | return 12.92 * value; 43 | else if (value < 1.0) 44 | return 1.055 * pow(value, 0.4166667) - 0.055; 45 | else if (value == 1.0) 46 | return 1.0; 47 | else 48 | return pow(value, 0.45454545454545); 49 | } 50 | 51 | float4 float4ToGammaSpace(float4 value) 52 | { 53 | float4 gammaValue; 54 | 55 | gammaValue[0] = floatToGammaSpace(value[0]); 56 | gammaValue[1] = floatToGammaSpace(value[1]); 57 | gammaValue[2] = floatToGammaSpace(value[2]); 58 | gammaValue[3] = value[3]; 59 | 60 | return gammaValue; 61 | } 62 | 63 | float4 frag(v2f i) : SV_Target { 64 | const int width = ceil(_MainTex_TexelSize.z / _Target_TexelSize.z / 2.f); 65 | const float ratio = 1.f / (1.41f * width); 66 | 67 | float weight = 0.f; 68 | float4 color = float4(0.f, 0.f, 0.f, 0.f); 69 | 70 | for(int y = -width; y <= width; ++y) { 71 | for(int x = -width; x <= width; ++x) { 72 | float2 off = float2(x * _MainTex_TexelSize.x, y * _MainTex_TexelSize.y); 73 | float2 uv = i.uv + off; 74 | 75 | float3 s = tex2D(_MainTex, uv).rgb; 76 | 77 | float c = clamp(sqrt(x*x + y*y) * ratio * (1.f/_KernelScale), -1.57f, 1.57f); 78 | float w = pow(cos(c), _KernelCosPower); 79 | color.rgb += s.rgb * w; 80 | weight += w; 81 | } 82 | } 83 | 84 | if (_ApplyGammaCorrection == 0) 85 | return _NormalizationFactor * color.rgbb / weight; 86 | else 87 | return float4ToGammaSpace(_NormalizationFactor * color.rgbb / weight); 88 | } 89 | 90 | ENDCG 91 | 92 | SubShader { 93 | Cull Off ZTest Always ZWrite Off 94 | 95 | Pass { 96 | CGPROGRAM 97 | #pragma vertex vert 98 | #pragma fragment frag 99 | ENDCG 100 | } 101 | }} -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360/Engine/Camera360InputSettings.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2018_1_OR_NEWER 2 | 3 | using System; 4 | using System.Collections.Generic; 5 | 6 | namespace UnityEngine.Recorder.Input 7 | { 8 | 9 | public class Camera360InputSettings : ImageInputSettings 10 | { 11 | public EImageSource source = EImageSource.MainCamera; 12 | public string m_CameraTag; 13 | public bool m_FlipFinalOutput = false; 14 | public bool m_RenderStereo = true; 15 | public float m_StereoSeparation = 0.065f; 16 | public int m_MapSize = 1024; 17 | public int m_OutputWidth = 1024; 18 | public int m_OutputHeight = 2048; 19 | 20 | public override Type inputType 21 | { 22 | get { return typeof(Camera360Input); } 23 | } 24 | 25 | public override bool ValidityCheck( List errors ) 26 | { 27 | bool ok = base.ValidityCheck(errors); 28 | 29 | if (source == EImageSource.TaggedCamera && string.IsNullOrEmpty(m_CameraTag)) 30 | { 31 | ok = false; 32 | errors.Add("Missing camera tag"); 33 | } 34 | 35 | if (m_OutputWidth != (1 << (int)Math.Log(m_OutputWidth, 2))) 36 | { 37 | ok =false; 38 | errors.Add("Output width must be a power of 2."); 39 | } 40 | 41 | if (m_OutputWidth < 128 || m_OutputWidth > 8 * 1024) 42 | { 43 | ok = false; 44 | errors.Add( string.Format( "Output width must fall between {0} and {1}.", 128, 8*1024 )); 45 | } 46 | 47 | if (m_OutputHeight != (1 << (int)Math.Log(m_OutputHeight, 2))) 48 | { 49 | ok =false; 50 | errors.Add("Output height must be a power of 2."); 51 | } 52 | 53 | if (m_OutputHeight < 128 || m_OutputHeight > 8 * 1024) 54 | { 55 | ok = false; 56 | errors.Add( string.Format( "Output height must fall between {0} and {1}.", 128, 8*1024 )); 57 | } 58 | 59 | if (m_MapSize != (1 << (int)Math.Log(m_MapSize, 2))) 60 | { 61 | ok = false; 62 | errors.Add("Cube Map size must be a power of 2."); 63 | } 64 | 65 | if( m_MapSize < 16 || m_MapSize > 8 * 1024 ) 66 | { 67 | ok = false; 68 | errors.Add( string.Format( "Cube Map size must fall between {0} and {1}.", 16, 8*1024 )); 69 | } 70 | 71 | if (m_RenderStereo && m_StereoSeparation < float.Epsilon) 72 | { 73 | ok = false; 74 | errors.Add("Stereo separation value is too small."); 75 | } 76 | 77 | return ok; 78 | } 79 | } 80 | 81 | } 82 | 83 | #endif -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/RecorderComponent.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | 4 | namespace UnityEngine.Recorder 5 | { 6 | 7 | /// 8 | /// What is this: 9 | /// Motivation : 10 | /// Notes: 11 | /// 12 | [ExecuteInEditMode] 13 | public class RecorderComponent : MonoBehaviour 14 | { 15 | public bool autoExitPlayMode { get; set; } 16 | public RecordingSession session { get; set; } 17 | 18 | public void Update() 19 | { 20 | if (session != null && session.recording) 21 | session.PrepareNewFrame(); 22 | } 23 | 24 | IEnumerator RecordFrame() 25 | { 26 | yield return new WaitForEndOfFrame(); 27 | if (session != null && session.recording) 28 | { 29 | session.RecordFrame(); 30 | 31 | switch (session.m_Recorder.settings.m_DurationMode) 32 | { 33 | case DurationMode.Manual: 34 | break; 35 | case DurationMode.SingleFrame: 36 | { 37 | if (session.m_Recorder.recordedFramesCount == 1) 38 | enabled = false; 39 | break; 40 | } 41 | case DurationMode.FrameInterval: 42 | { 43 | if (session.frameIndex > session.settings.m_EndFrame) 44 | enabled = false; 45 | break; 46 | } 47 | case DurationMode.TimeInterval: 48 | { 49 | if (session.settings.m_FrameRateMode == FrameRateMode.Variable) 50 | { 51 | if (session.m_CurrentFrameStartTS >= session.settings.m_EndTime) 52 | enabled = false; 53 | } 54 | else 55 | { 56 | var expectedFrames = (session.settings.m_EndTime - session.settings.m_StartTime) * session.settings.m_FrameRate; 57 | if (session.RecordedFrameSpan >= expectedFrames) 58 | enabled = false; 59 | } 60 | break; 61 | } 62 | } 63 | } 64 | } 65 | 66 | public void LateUpdate() 67 | { 68 | if (session != null && session.recording) 69 | StartCoroutine(RecordFrame()); 70 | } 71 | 72 | public void OnDisable() 73 | { 74 | if (session != null) 75 | { 76 | session.Dispose(); 77 | session = null; 78 | 79 | #if UNITY_EDITOR 80 | if (autoExitPlayMode) 81 | UnityEditor.EditorApplication.isPlaying = false; 82 | #endif 83 | } 84 | } 85 | 86 | public void OnDestroy() 87 | { 88 | if (session != null) 89 | session.Dispose(); 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Animation/Editor/AnimationInputSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using UnityEditor.Experimental.Recorder.Input; 4 | using UnityEditor.Recorder; 5 | using UnityEngine; 6 | 7 | namespace UnityEditor.Experimental.FrameRecorder.Input 8 | { 9 | [CustomEditor(typeof(AnimationInputSettings))] 10 | public class AnimationInputSettingsEditor : InputEditor 11 | { 12 | public override void OnInspectorGUI() 13 | { 14 | var animImputSetting = target as AnimationInputSettings;; 15 | 16 | EditorGUI.BeginChangeCheck(); 17 | animImputSetting.gameObject = EditorGUILayout.ObjectField("Game Object",animImputSetting.gameObject, typeof(GameObject), true) as GameObject; 18 | if (EditorGUI.EndChangeCheck()) 19 | { 20 | animImputSetting.enabled = animImputSetting.gameObject != null; 21 | 22 | if (animImputSetting.gameObject != null) 23 | { 24 | animImputSetting.bindingTypeName.Add(animImputSetting.gameObject.GetComponent().GetType().AssemblyQualifiedName); 25 | } 26 | } 27 | 28 | if (animImputSetting.gameObject != null) 29 | { 30 | var compos = animImputSetting.gameObject.GetComponents() 31 | .Where(x => x != null) 32 | .Select(x => x.GetType()); 33 | if (animImputSetting.recursive) 34 | { 35 | compos = compos.Union(animImputSetting.gameObject.GetComponentsInChildren() 36 | .Where(x => x != null) 37 | .Select(x => x.GetType())); 38 | } 39 | 40 | compos = compos.Distinct() 41 | .Where(x => !typeof(MonoBehaviour).IsAssignableFrom(x) && x != typeof(Animator)) // black list 42 | .ToList(); 43 | var compoNames = compos.Select(x => x.AssemblyQualifiedName).ToList(); 44 | 45 | int flags = 0; 46 | foreach (var t in animImputSetting.bindingTypeName) 47 | { 48 | var found = compoNames.IndexOf(t); 49 | if (found != -1) 50 | flags |= 1 << found; 51 | } 52 | EditorGUI.BeginChangeCheck(); 53 | flags = EditorGUILayout.MaskField("Recorded Target(s)", flags, compos.Select(x => x.Name).ToArray()); 54 | if (EditorGUI.EndChangeCheck()) 55 | { 56 | animImputSetting.bindingTypeName = new List(); 57 | for (int i=0;i 7 | /// What is this: Standard industry frame rates. 8 | /// Motivation : Some framerates are not correctly expressible as floats du to precision, so 9 | /// so having an enum with the standard frame rates used in industry, allows us 10 | /// to correctly carry precision in the settings. Precision loss is then the fault 11 | /// of the components further down the line. 12 | /// 13 | [Flags] 14 | public enum EFrameRate 15 | { 16 | FR_CUSTOM = 1, 17 | FR_23 = 1 << 2, // 24 * 1000 / 1001 18 | FR_24 = 1 << 3, 19 | FR_25 = 1 << 4, 20 | FR_29 = 1 << 5, // 30 * 1000 / 1001, 21 | FR_30 = 1 << 6, 22 | FR_50 = 1 << 7, 23 | FR_59 = 1 << 8, // 60 * 1000 / 1001, 24 | FR_60 = 1 << 9 25 | } 26 | 27 | /// 28 | /// What is this: Utility class that converts EFrameRate to text and to float 29 | /// Motivation : since the enum is expressed as integers, need something to provide associated float values 30 | /// and also provide human readable lables for the UI. 31 | /// 32 | public class FrameRateHelper 33 | { 34 | public static float ToFloat(EFrameRate value, float customValue) 35 | { 36 | switch (value) 37 | { 38 | case EFrameRate.FR_CUSTOM: 39 | return customValue; 40 | case EFrameRate.FR_23: 41 | return 24 * 1000 / 1001f; 42 | case EFrameRate.FR_24: 43 | return 24; 44 | case EFrameRate.FR_25: 45 | return 25; 46 | case EFrameRate.FR_29: 47 | return 30 * 1000 / 1001f; 48 | case EFrameRate.FR_30: 49 | return 30; 50 | case EFrameRate.FR_50: 51 | return 50; 52 | case EFrameRate.FR_59: 53 | return 60 * 1000 / 1001f; 54 | case EFrameRate.FR_60: 55 | return 60; 56 | default: 57 | throw new ArgumentOutOfRangeException("value", value, null); 58 | } 59 | } 60 | 61 | public static string ToLable(EFrameRate value) 62 | { 63 | switch (value) 64 | { 65 | case EFrameRate.FR_23: 66 | return "23.97"; 67 | case EFrameRate.FR_24: 68 | return "Film (24)"; 69 | case EFrameRate.FR_25: 70 | return "PAL (25)"; 71 | case EFrameRate.FR_29: 72 | return "NTSC (29.97)"; 73 | case EFrameRate.FR_30: 74 | return "30"; 75 | case EFrameRate.FR_50: 76 | return "50"; 77 | case EFrameRate.FR_59: 78 | return "59.94" ; 79 | case EFrameRate.FR_60: 80 | return "60"; 81 | case EFrameRate.FR_CUSTOM: 82 | default: 83 | return "(custom)"; 84 | } 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/AboutBox.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | 4 | namespace UnityEditor.Recorder 5 | { 6 | public class AboutBox : EditorWindow 7 | { 8 | [MenuItem("Tools/Recorder/About...", false, Int32.MaxValue)] 9 | public static void ShowAboutBox() 10 | { 11 | EditorWindow.GetWindowWithRect(new Rect(100, 100, 550, 330), true, "About Recorder"); 12 | } 13 | 14 | GUIContent s_Header; 15 | 16 | void OnEnable() 17 | { 18 | s_Header = EditorGUIUtility.IconContent("AboutWindow.MainHeader"); 19 | } 20 | 21 | public void OnGUI() 22 | { 23 | GUILayout.Space(10); 24 | GUILayout.BeginHorizontal(); 25 | GUILayout.Space(5); 26 | GUILayout.BeginVertical(); 27 | GUILayout.Label(s_Header, GUIStyle.none); 28 | 29 | GUILayout.BeginHorizontal(); 30 | GUILayout.Space(52f); 31 | GUILayout.Label("Recorder " + RecorderVersion.Stage, EditorStyles.boldLabel); 32 | GUILayout.EndHorizontal(); 33 | 34 | GUILayout.BeginHorizontal(); 35 | GUILayout.Space(52f); 36 | GUILayout.Label(string.Format("Version {0}", RecorderVersion.Tag)); 37 | GUILayout.EndHorizontal(); 38 | GUILayout.Space(4); 39 | GUILayout.EndVertical(); 40 | GUILayout.EndHorizontal(); 41 | 42 | var text = "The Unity Recorder package is a collection of Recorders that allow in-game capturing of data and saving it. For example; generate an mp4 file from a game session.\r\n\r\nIn support to the recorders, it provides a graphical interface that is used to manually trigger recording sessions, which take care of: entering play mode, recording requested data and exiting play mode when done. It also supports triggering recording sessions from user scripts and timeline tracks.\r\n\r\nThe Recorder is aimed at extensibility and is implemented as a plugin system, where anyone can create new recorders and have them seamlessly integrate into the Unity Recorder ecosystem, while maximizing code reuse."; 43 | 44 | float textWidth = position.width - 10; 45 | float textHeight = EditorStyles.wordWrappedLabel.CalcHeight(new GUIContent(text), textWidth); 46 | Rect creditsNamesRect = new Rect(5, 120, textWidth, textHeight); 47 | GUI.Label(creditsNamesRect, text, EditorStyles.wordWrappedLabel); 48 | GUILayout.Space(25); 49 | GUILayout.Space(textHeight); 50 | GUILayout.BeginHorizontal(); 51 | if (GUILayout.Button("View user manual")) 52 | { 53 | var file = FRPackagerPaths.GetFrameRecorderPath() + "/Recorder_install.pdf"; 54 | Debug.Log(file); 55 | Application.OpenURL(file); 56 | this.Close(); 57 | } 58 | GUILayout.Space(25); 59 | if (GUILayout.Button("Want to write a recorder?")) 60 | { 61 | Application.OpenURL("https://github.com/Unity-Technologies/GenericFrameRecorder/blob/master/README.md"); 62 | this.Close(); 63 | } 64 | GUILayout.EndHorizontal(); 65 | GUILayout.Space(5); 66 | GUILayout.BeginHorizontal(); 67 | if (GUILayout.Button("Unity's User forum")) 68 | { 69 | Application.OpenURL("https://forum.unity.com/threads/unity-recorder-update.509458/"); 70 | this.Close(); 71 | } 72 | GUILayout.EndHorizontal(); 73 | 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Engine/ImageRecorder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using UnityEngine.Recorder.Input; 4 | 5 | namespace UnityEngine.Recorder 6 | { 7 | [Recorder(typeof(ImageRecorderSettings),"Video", "Unity/Image sequence" )] 8 | public class ImageRecorder : GenericRecorder 9 | { 10 | 11 | public override bool BeginRecording(RecordingSession session) 12 | { 13 | if (!base.BeginRecording(session)) { return false; } 14 | 15 | m_Settings.m_DestinationPath.CreateDirectory(); 16 | 17 | return true; 18 | } 19 | 20 | public override void RecordFrame(RecordingSession session) 21 | { 22 | if (m_Inputs.Count != 1) 23 | throw new Exception("Unsupported number of sources"); 24 | 25 | Texture2D tex = null; 26 | #if UNITY_2017_3_OR_NEWER 27 | if (m_Inputs[0] is ScreenCaptureInput) 28 | { 29 | tex = ((ScreenCaptureInput)m_Inputs[0]).image; 30 | if (m_Settings.m_OutputFormat == PNGRecordeOutputFormat.EXR) 31 | { 32 | var textx = new Texture2D(tex.width, tex.height, TextureFormat.RGBAFloat, false); 33 | textx.SetPixels(tex.GetPixels()); 34 | tex = textx; 35 | } 36 | else if (m_Settings.m_OutputFormat == PNGRecordeOutputFormat.PNG) 37 | { 38 | var textx = new Texture2D(tex.width, tex.height, TextureFormat.RGB24, false); 39 | textx.SetPixels(tex.GetPixels()); 40 | tex = textx; 41 | } 42 | } 43 | else 44 | #endif 45 | { 46 | var input = (BaseRenderTextureInput)m_Inputs[0]; 47 | var width = input.outputRT.width; 48 | var height = input.outputRT.height; 49 | tex = new Texture2D(width, height, m_Settings.m_OutputFormat != PNGRecordeOutputFormat.EXR ? TextureFormat.RGBA32 : TextureFormat.RGBAFloat, false); 50 | var backupActive = RenderTexture.active; 51 | RenderTexture.active = input.outputRT; 52 | tex.ReadPixels(new Rect(0, 0, width, height), 0, 0, false); 53 | tex.Apply(); 54 | RenderTexture.active = backupActive; 55 | } 56 | 57 | byte[] bytes; 58 | string ext; 59 | switch (m_Settings.m_OutputFormat) 60 | { 61 | case PNGRecordeOutputFormat.PNG: 62 | bytes = tex.EncodeToPNG(); 63 | ext = "png"; 64 | break; 65 | case PNGRecordeOutputFormat.JPEG: 66 | bytes = tex.EncodeToJPG(); 67 | ext = "jpg"; 68 | break; 69 | case PNGRecordeOutputFormat.EXR: 70 | bytes = tex.EncodeToEXR(); 71 | ext = "exr"; 72 | break; 73 | default: 74 | throw new ArgumentOutOfRangeException(); 75 | } 76 | 77 | if(m_Inputs[0] is BaseRenderTextureInput || m_Settings.m_OutputFormat != PNGRecordeOutputFormat.JPEG) 78 | UnityHelpers.Destroy(tex); 79 | 80 | var fileName = m_Settings.m_BaseFileName.BuildFileName( session, recordedFramesCount, tex.width, tex.height, ext); 81 | var path = Path.Combine( m_Settings.m_DestinationPath.GetFullPath(), fileName); 82 | 83 | File.WriteAllBytes( path, bytes); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/Timeline/RecorderPlayableBehaviour.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine.Playables; 3 | 4 | namespace UnityEngine.Recorder.Timeline 5 | { 6 | /// 7 | /// What is it: Implements a playable that records something triggered by a Timeline Recorder Clip. 8 | /// Motivation: Allow Timeline to trigger recordings 9 | /// 10 | /// Notes: 11 | /// - Totally ignores the time info comming from the playable infrastructure. Only conciders scaled time. 12 | /// - Does not support multiple OnGraphStart... 13 | /// - It relies on WaitForEndOfFrameComponent to inform the Session object that it's time to record to frame. 14 | /// 15 | public class RecorderPlayableBehaviour : PlayableBehaviour 16 | { 17 | PlayState m_PlayState = PlayState.Paused; 18 | public RecordingSession session { get; set; } 19 | WaitForEndOfFrameComponent endOfFrameComp; 20 | bool m_FirstOneSkipped; 21 | 22 | public Action OnEnd; 23 | 24 | public override void OnGraphStart(Playable playable) 25 | { 26 | if (session != null) 27 | { 28 | // does not support multiple starts... 29 | session.SessionCreated(); 30 | m_PlayState = PlayState.Paused; 31 | } 32 | } 33 | 34 | public override void OnGraphStop(Playable playable) 35 | { 36 | if (session != null && session.recording) 37 | { 38 | session.EndRecording(); 39 | session.Dispose(); 40 | session = null; 41 | 42 | if (OnEnd != null) 43 | OnEnd(); 44 | } 45 | } 46 | 47 | public override void PrepareFrame(Playable playable, FrameData info) 48 | { 49 | if (session != null && session.recording) 50 | { 51 | session.PrepareNewFrame(); 52 | } 53 | } 54 | 55 | public override void ProcessFrame(Playable playable, FrameData info, object playerData) 56 | { 57 | if (session != null) 58 | { 59 | if (endOfFrameComp == null) 60 | { 61 | endOfFrameComp = session.m_RecorderGO.AddComponent(); 62 | endOfFrameComp.m_playable = this; 63 | } 64 | } 65 | } 66 | 67 | public override void OnBehaviourPlay(Playable playable, FrameData info) 68 | { 69 | if (session == null) 70 | return; 71 | 72 | // Assumption: OnPlayStateChanged( PlayState.Playing ) ONLY EVER CALLED ONCE for this type of playable. 73 | m_PlayState = PlayState.Playing; 74 | session.BeginRecording(); 75 | } 76 | 77 | public override void OnBehaviourPause(Playable playable, FrameData info) 78 | { 79 | if (session == null) 80 | return; 81 | 82 | if (session.recording && m_PlayState == PlayState.Playing) 83 | { 84 | session.EndRecording(); 85 | session.Dispose(); 86 | session = null; 87 | 88 | if (OnEnd != null) 89 | OnEnd(); 90 | } 91 | 92 | m_PlayState = PlayState.Paused; 93 | } 94 | 95 | public void FrameEnded() 96 | { 97 | if (session != null && session.recording) 98 | session.RecordFrame(); 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/ImageRecorder/Engine/ImageRecorderSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using UnityEngine.Recorder.Input; 4 | 5 | namespace UnityEngine.Recorder 6 | { 7 | 8 | public enum PNGRecordeOutputFormat 9 | { 10 | PNG, 11 | JPEG, 12 | EXR 13 | } 14 | 15 | [ExecuteInEditMode] 16 | public class ImageRecorderSettings : RecorderSettings 17 | { 18 | public PNGRecordeOutputFormat m_OutputFormat = PNGRecordeOutputFormat.JPEG; 19 | 20 | ImageRecorderSettings() 21 | { 22 | m_BaseFileName.pattern = "image_<0000>."; 23 | } 24 | 25 | public override List GetDefaultInputSettings() 26 | { 27 | return new List() 28 | { 29 | NewInputSettingsObj("Pixels") 30 | }; 31 | } 32 | 33 | public override bool ValidityCheck( List errors ) 34 | { 35 | var ok = base.ValidityCheck(errors); 36 | 37 | if( string.IsNullOrEmpty(m_DestinationPath.GetFullPath() )) 38 | { 39 | ok = false; 40 | errors.Add("Missing destination path."); 41 | } 42 | if( string.IsNullOrEmpty(m_BaseFileName.pattern)) 43 | { 44 | ok = false; 45 | errors.Add("missing file name"); 46 | } 47 | 48 | return ok; 49 | } 50 | 51 | public override bool SelfAdjustSettings() 52 | { 53 | if (inputsSettings.Count == 0 ) 54 | return false; 55 | 56 | bool adjusted = false; 57 | 58 | if (inputsSettings[0] is RenderTextureSamplerSettings) 59 | { 60 | var input = (RenderTextureSamplerSettings)inputsSettings[0]; 61 | var colorSpace = m_OutputFormat == PNGRecordeOutputFormat.EXR ? ColorSpace.Linear : ColorSpace.Gamma; 62 | if (input.m_ColorSpace != colorSpace) 63 | { 64 | input.m_ColorSpace = colorSpace; 65 | adjusted = true; 66 | } 67 | } 68 | 69 | if (inputsSettings[0] is ImageInputSettings) 70 | { 71 | var iis = (ImageInputSettings)inputsSettings[0]; 72 | if (iis.maxSupportedSize != EImageDimension.x4320p_8K) 73 | { 74 | iis.maxSupportedSize = EImageDimension.x4320p_8K; 75 | adjusted = true; 76 | } 77 | } 78 | 79 | return adjusted; 80 | } 81 | 82 | public override List GetInputGroups() 83 | { 84 | return new List() 85 | { 86 | new InputGroupFilter() 87 | { 88 | title = "Pixels", typesFilter = new List() 89 | { 90 | #if UNITY_2017_3_OR_NEWER 91 | new TInputFilter("Screen"), 92 | #endif 93 | new TInputFilter("Camera(s)"), 94 | #if UNITY_2018_1_OR_NEWER 95 | new TInputFilter("360 View (feature preview)"), 96 | #endif 97 | new TInputFilter("Sampling"), 98 | new TInputFilter("Render Texture"), 99 | } 100 | } 101 | }; 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/SerializableObjHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq.Expressions; 3 | 4 | namespace UnityEditor.Recorder 5 | { 6 | public static class SerializableObjHelper 7 | { 8 | public delegate TResult FuncX(TType x); 9 | public static SerializedProperty FindProperty(this SerializedObject obj, Expression> exp) 10 | { 11 | var body = exp.Body as MemberExpression; 12 | if (body == null) 13 | { 14 | var ubody = (UnaryExpression)exp.Body; 15 | body = ubody.Operand as MemberExpression; 16 | } 17 | 18 | var name = body.Member.Name; 19 | 20 | return obj.FindProperty(name); 21 | } 22 | 23 | public static SerializedProperty FindProperty(this SerializedObject obj, Expression> exp) 24 | { 25 | var body = exp.Body as MemberExpression; 26 | if (body == null) 27 | { 28 | var ubody = (UnaryExpression)exp.Body; 29 | body = ubody.Operand as MemberExpression; 30 | } 31 | 32 | var name = body.Member.Name; 33 | 34 | return obj.FindProperty(name); 35 | } 36 | 37 | public static SerializedProperty FindPropertyRelative(this SerializedProperty obj, Expression> exp) 38 | { 39 | var body = exp.Body as MemberExpression; 40 | if (body == null) 41 | { 42 | var ubody = (UnaryExpression)exp.Body; 43 | body = ubody.Operand as MemberExpression; 44 | } 45 | 46 | var name = body.Member.Name; 47 | 48 | return obj.FindPropertyRelative(name); 49 | } 50 | 51 | public static bool TargetsSameField(this SerializedProperty obj, SerializedProperty other) 52 | { 53 | if (obj.serializedObject.targetObject != other.serializedObject.targetObject) 54 | return false; 55 | 56 | return obj.name == other.name; 57 | } 58 | } 59 | 60 | public class StructPropertyFinder where TType : struct 61 | { 62 | SerializedObject m_Obj; 63 | public StructPropertyFinder(SerializedObject obj) 64 | { 65 | m_Obj = obj; 66 | } 67 | 68 | public delegate TResult FuncX(TType x); 69 | public SerializedProperty Find( Expression> exp) 70 | { 71 | var body = exp.Body as MemberExpression; 72 | if (body == null) 73 | { 74 | var ubody = (UnaryExpression)exp.Body; 75 | body = ubody.Operand as MemberExpression; 76 | } 77 | 78 | var name = body.Member.Name; 79 | 80 | return m_Obj.FindProperty(name); 81 | } 82 | 83 | } 84 | 85 | public class PropertyFinder where TType : class 86 | { 87 | SerializedObject m_Obj; 88 | public PropertyFinder(SerializedObject obj) 89 | { 90 | m_Obj = obj; 91 | } 92 | 93 | public delegate TResult FuncX(TType x); 94 | public SerializedProperty Find( Expression> exp) 95 | { 96 | var body = exp.Body as MemberExpression; 97 | if (body == null) 98 | { 99 | var ubody = (UnaryExpression)exp.Body; 100 | body = ubody.Operand as MemberExpression; 101 | } 102 | 103 | var name = body.Member.Name; 104 | 105 | return m_Obj.FindProperty(name); 106 | } 107 | 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/ScreenCapture/Engine/ScreenCaptureInput.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2017_3_OR_NEWER 2 | 3 | using System; 4 | using System.Collections; 5 | using System.Collections.Generic; 6 | using UnityEngine; 7 | using UnityEngine.Recorder; 8 | 9 | namespace UnityEngine.Recorder.Input 10 | { 11 | public class ScreenCaptureInput : RecorderInput 12 | { 13 | bool m_ModifiedResolution; 14 | 15 | public Texture2D image { get; private set; } 16 | 17 | public ScreenCaptureInputSettings scSettings 18 | { 19 | get { return (ScreenCaptureInputSettings)settings; } 20 | } 21 | 22 | public int outputWidth { get; protected set; } 23 | public int outputHeight { get; protected set; } 24 | 25 | public override void NewFrameReady(RecordingSession session) 26 | { 27 | image = ScreenCapture.CaptureScreenshotAsTexture(); 28 | } 29 | 30 | public override void BeginRecording(RecordingSession session) 31 | { 32 | int screenWidth = Screen.width; 33 | int screenHeight = Screen.height; 34 | #if UNITY_EDITOR 35 | switch (scSettings.m_OutputSize) 36 | { 37 | case EImageDimension.Window: 38 | { 39 | GameViewSize.GetGameRenderSize(out screenWidth, out screenHeight); 40 | outputWidth = screenWidth; 41 | outputHeight = screenHeight; 42 | 43 | if (scSettings.m_ForceEvenSize) 44 | { 45 | outputWidth = (outputWidth + 1) & ~1; 46 | outputHeight = (outputHeight + 1) & ~1; 47 | } 48 | break; 49 | } 50 | 51 | default: 52 | { 53 | outputHeight = (int)scSettings.m_OutputSize; 54 | outputWidth = (int)(outputHeight * AspectRatioHelper.GetRealAR(scSettings.m_AspectRatio)); 55 | 56 | if (scSettings.m_ForceEvenSize) 57 | { 58 | outputWidth = (outputWidth + 1) & ~1; 59 | outputHeight = (outputHeight + 1) & ~1; 60 | } 61 | 62 | break; 63 | } 64 | } 65 | 66 | int w, h; 67 | GameViewSize.GetGameRenderSize(out w, out h); 68 | if (w != outputWidth || h != outputHeight) 69 | { 70 | var size = GameViewSize.SetCustomSize(outputWidth, outputHeight) ?? GameViewSize.AddSize(outputWidth, outputHeight); 71 | if (GameViewSize.m_ModifiedResolutionCount == 0) 72 | GameViewSize.BackupCurrentSize(); 73 | else 74 | { 75 | if (size != GameViewSize.currentSize) 76 | { 77 | Debug.LogError("Requestion a resultion change while a recorder's input has already requested one! Undefined behaviour."); 78 | } 79 | } 80 | GameViewSize.m_ModifiedResolutionCount++; 81 | m_ModifiedResolution = true; 82 | GameViewSize.SelectSize(size); 83 | } 84 | #endif 85 | 86 | } 87 | 88 | public override void FrameDone(RecordingSession session) 89 | { 90 | UnityHelpers.Destroy(image); 91 | image = null; 92 | } 93 | 94 | protected override void Dispose(bool disposing) 95 | { 96 | if (disposing) 97 | { 98 | #if UNITY_EDITOR 99 | if (m_ModifiedResolution) 100 | { 101 | GameViewSize.m_ModifiedResolutionCount--; 102 | if (GameViewSize.m_ModifiedResolutionCount == 0) 103 | GameViewSize.RestoreSize(); 104 | } 105 | #endif 106 | } 107 | 108 | base.Dispose(disposing); 109 | } 110 | } 111 | } 112 | 113 | #endif -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Engine/OutputPath.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using UnityEngine; 4 | 5 | 6 | namespace UnityEngine.Recorder 7 | { 8 | [Serializable] 9 | public struct OutputPath 10 | { 11 | public enum ERoot 12 | { 13 | Absolute, 14 | Current, 15 | PersistentData, 16 | StreamingAssets, 17 | TemporaryCache, 18 | AssetsPath, 19 | } 20 | 21 | [SerializeField] ERoot m_root; 22 | [SerializeField] string m_leaf; 23 | 24 | public ERoot root 25 | { 26 | get { return m_root; } 27 | set { m_root = value; } 28 | } 29 | public string leaf 30 | { 31 | get { return m_leaf; } 32 | set { m_leaf = value; } 33 | } 34 | 35 | public static OutputPath FromPath(string path) 36 | { 37 | OutputPath result; 38 | if (path.Contains(Application.streamingAssetsPath)) 39 | { 40 | result.m_root = ERoot.StreamingAssets; 41 | result.m_leaf = path.Replace(Application.streamingAssetsPath, ""); 42 | } 43 | else if (path.Contains(Application.dataPath)) 44 | { 45 | result.m_root = ERoot.AssetsPath; 46 | result.m_leaf = path.Replace(Application.dataPath, ""); 47 | } 48 | else if (path.Contains(Application.persistentDataPath)) 49 | { 50 | result.m_root = ERoot.PersistentData; 51 | result.m_leaf = path.Replace(Application.persistentDataPath, ""); 52 | } 53 | else if (path.Contains(Application.temporaryCachePath)) 54 | { 55 | result.m_root = ERoot.TemporaryCache; 56 | result.m_leaf = path.Replace(Application.temporaryCachePath, ""); 57 | } 58 | else if( path.Contains(Directory.GetCurrentDirectory().Replace(@"\", "/"))) 59 | { 60 | result.m_root = ERoot.Current; 61 | result.m_leaf = path.Replace(Directory.GetCurrentDirectory().Replace(@"\", "/"), ""); 62 | } 63 | else 64 | { 65 | result.m_root = ERoot.Absolute; 66 | result.m_leaf = path; 67 | } 68 | 69 | return result; 70 | } 71 | 72 | public static string GetFullPath(ERoot root, string leaf) 73 | { 74 | if (root == ERoot.Absolute) 75 | { 76 | return leaf; 77 | } 78 | if (root == ERoot.Current) 79 | { 80 | return string.IsNullOrEmpty(leaf) ? "." : "./" + leaf; 81 | } 82 | 83 | string ret = ""; 84 | switch (root) 85 | { 86 | case ERoot.PersistentData: 87 | ret = Application.persistentDataPath; 88 | break; 89 | case ERoot.StreamingAssets: 90 | ret = Application.streamingAssetsPath; 91 | break; 92 | case ERoot.TemporaryCache: 93 | ret = Application.temporaryCachePath; 94 | break; 95 | case ERoot.AssetsPath: 96 | ret = Application.dataPath; 97 | break; 98 | } 99 | 100 | if (!leaf.StartsWith("/")) 101 | { 102 | ret += "/"; 103 | } 104 | ret += leaf; 105 | return ret; 106 | } 107 | 108 | public string GetFullPath() 109 | { 110 | return GetFullPath(m_root, m_leaf); 111 | } 112 | 113 | public void CreateDirectory() 114 | { 115 | var path = GetFullPath(); 116 | if(path.Length > 0 && !System.IO.Directory.Exists(path) ) 117 | { 118 | System.IO.Directory.CreateDirectory(path); 119 | } 120 | } 121 | } 122 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/CBRenderTexture/Editor/CBRenderTextureInputSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.Recorder; 3 | using UnityEngine.Recorder.Input; 4 | 5 | namespace UnityEditor.Recorder.Input 6 | { 7 | [CustomEditor(typeof(CBRenderTextureInputSettings))] 8 | public class CBRenderTextureInputSettingsEditor : InputEditor 9 | { 10 | static EImageSource m_SupportedSources = EImageSource.MainCamera | EImageSource.ActiveCameras | EImageSource.TaggedCamera; 11 | string[] m_MaskedSourceNames; 12 | ResolutionSelector m_ResSelector; 13 | 14 | SerializedProperty m_Source; 15 | SerializedProperty m_CameraTag; 16 | SerializedProperty m_RenderSize; 17 | SerializedProperty m_RenderAspect; 18 | SerializedProperty m_FlipFinalOutput; 19 | SerializedProperty m_Transparency; 20 | SerializedProperty m_CaptureUI; 21 | 22 | protected void OnEnable() 23 | { 24 | if (target == null) 25 | return; 26 | 27 | 28 | var pf = new PropertyFinder(serializedObject); 29 | m_Source = pf.Find(w => w.source); 30 | m_CameraTag = pf.Find(w => w.m_CameraTag); 31 | 32 | m_RenderSize = pf.Find(w => w.m_OutputSize); 33 | m_RenderAspect = pf.Find(w => w.m_AspectRatio); 34 | m_FlipFinalOutput = pf.Find( w => w.m_FlipFinalOutput ); 35 | m_Transparency = pf.Find(w => w.m_AllowTransparency); 36 | m_CaptureUI = pf.Find(w => w.m_CaptureUI); 37 | 38 | m_ResSelector = new ResolutionSelector(); 39 | } 40 | 41 | public override void OnInspectorGUI() 42 | { 43 | AddProperty(m_Source, () => 44 | { 45 | using (var check = new EditorGUI.ChangeCheckScope()) 46 | { 47 | if (m_MaskedSourceNames == null) 48 | m_MaskedSourceNames = EnumHelper.MaskOutEnumNames((int)m_SupportedSources); 49 | var index = EnumHelper.GetMaskedIndexFromEnumValue(m_Source.intValue, (int)m_SupportedSources); 50 | index = EditorGUILayout.Popup("Source", index, m_MaskedSourceNames); 51 | 52 | if (check.changed) 53 | m_Source.intValue = EnumHelper.GetEnumValueFromMaskedIndex(index, (int)m_SupportedSources); 54 | } 55 | }); 56 | 57 | var inputType = (EImageSource)m_Source.intValue; 58 | if ((EImageSource)m_Source.intValue == EImageSource.TaggedCamera ) 59 | { 60 | ++EditorGUI.indentLevel; 61 | AddProperty(m_CameraTag, () => EditorGUILayout.PropertyField(m_CameraTag, new GUIContent("Tag"))); 62 | --EditorGUI.indentLevel; 63 | } 64 | 65 | 66 | if (inputType != EImageSource.RenderTexture) 67 | { 68 | AddProperty(m_RenderSize, () => 69 | { 70 | m_ResSelector.OnInspectorGUI((target as ImageInputSettings).maxSupportedSize, m_RenderSize); 71 | }); 72 | 73 | if (m_RenderSize.intValue > (int)EImageDimension.Window) 74 | { 75 | AddProperty(m_RenderAspect, () => EditorGUILayout.PropertyField(m_RenderAspect, new GUIContent("Aspect Ratio"))); 76 | } 77 | 78 | if(inputType == EImageSource.ActiveCameras) 79 | { 80 | AddProperty(m_CaptureUI, () => EditorGUILayout.PropertyField(m_CaptureUI, new GUIContent("Capture UI"))); 81 | } 82 | } 83 | 84 | AddProperty(m_Transparency, () => EditorGUILayout.PropertyField(m_Transparency, new GUIContent("Capture alpha"))); 85 | 86 | if (Verbose.enabled) 87 | { 88 | using (new EditorGUI.DisabledScope(true)) 89 | { 90 | EditorGUILayout.PropertyField(m_FlipFinalOutput, new GUIContent("Flip output")); 91 | } 92 | } 93 | 94 | serializedObject.ApplyModifiedProperties(); 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /source/FrameRecorder/Recorders/AnimationRecorder/Editor/AnimationRecorderSettingsEditor.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEditor.Experimental.Recorder; 3 | using UnityEditor.Experimental.Recorder.Input; 4 | using UnityEditor.Recorder; 5 | using UnityEngine; 6 | using UnityEngine.Recorder; 7 | using UnityEngine.Recorder.Input; 8 | 9 | namespace UnityEditor.Experimental.FrameRecorder 10 | { 11 | [Serializable] 12 | [CustomEditor(typeof(AnimationRecorderSettings))] 13 | public class AnimationRecorderSettingsEditor: RecorderEditor 14 | { 15 | private bool recorderSettings = false; 16 | 17 | [MenuItem("Tools/Recorder/Animation Clips")] 18 | private static void ShowRecorderWindow() 19 | { 20 | RecorderWindow.ShowAndPreselectCategory("Animation Clips"); 21 | } 22 | 23 | protected override void OnInputGui() 24 | { 25 | var aRecorderSettings = target as AnimationRecorderSettings; 26 | var inputs = aRecorderSettings.inputsSettings; 27 | 28 | for (int i = 0; i < inputs.Count; i++) 29 | { 30 | 31 | GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(1)); 32 | var input = inputs[i] as AnimationInputSettings; 33 | 34 | 35 | EditorGUILayout.BeginHorizontal(); 36 | var r = EditorGUILayout.GetControlRect(); 37 | var rFold = r; 38 | rFold.width = 20; 39 | input.fold = EditorGUI.Foldout(rFold,input.fold,""); 40 | r.xMin += 15; 41 | input.enabled = EditorGUI.ToggleLeft(r,"Object Recorder",input.enabled); 42 | 43 | var gearStyle = new GUIStyle("Icon.Options"); 44 | GUILayout.FlexibleSpace(); 45 | if (GUILayout.Button(gearStyle.normal.background,new GUIStyle("IconButton"))) 46 | { 47 | var menu = new GenericMenu(); 48 | menu.AddItem(new GUIContent("Remove"),false, data => 49 | { 50 | var ais = data as AnimationInputSettings; 51 | aRecorderSettings.inputsSettings.Remove(ais); 52 | }, 53 | inputs[i]); 54 | 55 | menu.ShowAsContext(); 56 | } 57 | 58 | using (new EditorGUI.IndentLevelScope(1)) 59 | { 60 | EditorGUILayout.EndHorizontal(); 61 | if (input.fold) 62 | { 63 | OnInputGui(i); 64 | 65 | } 66 | } 67 | 68 | } 69 | 70 | EditorGUILayout.BeginHorizontal(); 71 | GUILayout.FlexibleSpace(); 72 | if (GUILayout.Button("Add Object To Record", GUILayout.Width(200))) 73 | { 74 | var newSettings = aRecorderSettings.NewInputSettingsObj("Animation"); 75 | aRecorderSettings.inputsSettings.Add(newSettings); 76 | } 77 | GUILayout.FlexibleSpace(); 78 | EditorGUILayout.EndHorizontal(); 79 | } 80 | 81 | protected override void OnOutputGui() 82 | { 83 | var aRecorderSettings = target as AnimationRecorderSettings; 84 | aRecorderSettings.outputPath = EditorGUILayout.TextField("Output Path", aRecorderSettings.outputPath); 85 | } 86 | 87 | protected override void OnEncodingGroupGui() 88 | { 89 | } 90 | 91 | protected override void OnGroupGui() 92 | { 93 | recorderSettings = EditorGUILayout.Foldout(recorderSettings,"Recorder Settings"); 94 | if (recorderSettings) 95 | { 96 | using (new EditorGUI.IndentLevelScope(1)) 97 | { 98 | OnOutputGroupGui(); 99 | OnEncodingGroupGui(); 100 | OnFrameRateGroupGui(); 101 | OnBoundsGroupGui(); 102 | } 103 | } 104 | 105 | OnInputGui(); 106 | } 107 | 108 | } 109 | } -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/Camera360/Editor/Camera360InputEditor.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2018_1_OR_NEWER 2 | 3 | using UnityEngine; 4 | using UnityEngine.Recorder; 5 | using UnityEngine.Recorder.Input; 6 | 7 | namespace UnityEditor.Recorder.Input 8 | { 9 | [CustomEditor(typeof(Camera360InputSettings))] 10 | public class Camera360InputEditor : InputEditor 11 | { 12 | static EImageSource m_SupportedSources = EImageSource.MainCamera | EImageSource.TaggedCamera; 13 | string[] m_MaskedSourceNames; 14 | 15 | SerializedProperty m_Source; 16 | SerializedProperty m_CameraTag; 17 | SerializedProperty m_FlipFinalOutput; 18 | SerializedProperty m_StereoSeparation; 19 | SerializedProperty m_CubeMapSz; 20 | SerializedProperty m_OutputWidth; 21 | SerializedProperty m_OutputHeight; 22 | SerializedProperty m_RenderStereo; 23 | 24 | protected void OnEnable() 25 | { 26 | if (target == null) 27 | return; 28 | 29 | var pf = new PropertyFinder(serializedObject); 30 | m_Source = pf.Find(w => w.source); 31 | m_CameraTag = pf.Find(w => w.m_CameraTag); 32 | 33 | m_StereoSeparation = pf.Find(w => w.m_StereoSeparation); 34 | m_FlipFinalOutput = pf.Find( w => w.m_FlipFinalOutput ); 35 | m_CubeMapSz = pf.Find( w => w.m_MapSize ); 36 | m_OutputWidth = pf.Find(w => w.m_OutputWidth); 37 | m_OutputHeight = pf.Find(w => w.m_OutputHeight); 38 | m_RenderStereo = pf.Find(w => w.m_RenderStereo); 39 | } 40 | 41 | public override void OnInspectorGUI() 42 | { 43 | AddProperty(m_Source, () => 44 | { 45 | using (var check = new EditorGUI.ChangeCheckScope()) 46 | { 47 | if (m_MaskedSourceNames == null) 48 | m_MaskedSourceNames = EnumHelper.MaskOutEnumNames((int)m_SupportedSources); 49 | var index = EnumHelper.GetMaskedIndexFromEnumValue(m_Source.intValue, (int)m_SupportedSources); 50 | index = EditorGUILayout.Popup("Source", index, m_MaskedSourceNames); 51 | 52 | if (check.changed) 53 | m_Source.intValue = EnumHelper.GetEnumValueFromMaskedIndex(index, (int)m_SupportedSources); 54 | } 55 | }); 56 | 57 | var inputType = (EImageSource)m_Source.intValue; 58 | if ((EImageSource)m_Source.intValue == EImageSource.TaggedCamera ) 59 | { 60 | ++EditorGUI.indentLevel; 61 | AddProperty(m_CameraTag, () => EditorGUILayout.PropertyField(m_CameraTag, new GUIContent("Tag"))); 62 | --EditorGUI.indentLevel; 63 | } 64 | 65 | AddProperty(m_OutputWidth, () => 66 | { 67 | AddProperty(m_OutputWidth, () => EditorGUILayout.PropertyField(m_OutputWidth, new GUIContent("Output width"))); 68 | }); 69 | 70 | AddProperty(m_OutputHeight, () => 71 | { 72 | AddProperty(m_OutputWidth, () => EditorGUILayout.PropertyField(m_OutputHeight, new GUIContent("Output height"))); 73 | }); 74 | 75 | AddProperty(m_CubeMapSz, () => 76 | { 77 | AddProperty(m_CubeMapSz, () => EditorGUILayout.PropertyField(m_CubeMapSz, new GUIContent("Cube map width"))); 78 | }); 79 | 80 | AddProperty(m_RenderStereo, () => 81 | { 82 | AddProperty(m_RenderStereo, () => EditorGUILayout.PropertyField(m_RenderStereo, new GUIContent("Render in Stereo"))); 83 | }); 84 | 85 | AddProperty(m_StereoSeparation, () => 86 | { 87 | ++EditorGUI.indentLevel; 88 | using (new EditorGUI.DisabledScope(!m_RenderStereo.boolValue)) 89 | { 90 | AddProperty(m_StereoSeparation, () => EditorGUILayout.PropertyField(m_StereoSeparation, new GUIContent("Stereo Separation"))); 91 | } 92 | --EditorGUI.indentLevel; 93 | }); 94 | 95 | if (Verbose.enabled) 96 | { 97 | using (new EditorGUI.DisabledScope(true)) 98 | { 99 | EditorGUILayout.PropertyField(m_FlipFinalOutput, new GUIContent("Flip output")); 100 | } 101 | } 102 | 103 | serializedObject.ApplyModifiedProperties(); 104 | } 105 | } 106 | } 107 | 108 | #endif -------------------------------------------------------------------------------- /source/FrameRecorder/Inputs/RenderTextureSampler/Editor/RenderTextureSamplerEditor.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using UnityEngine; 3 | using UnityEngine.Recorder; 4 | using UnityEngine.Recorder.Input; 5 | 6 | namespace UnityEditor.Recorder.Input 7 | { 8 | [CustomEditor(typeof(RenderTextureSamplerSettings))] 9 | public class RenderTextureSamplerEditor : InputEditor 10 | { 11 | static EImageSource m_SupportedSources = EImageSource.ActiveCameras | EImageSource.MainCamera | EImageSource.TaggedCamera; 12 | string[] m_MaskedSourceNames; 13 | SerializedProperty m_Source; 14 | SerializedProperty m_RenderSize; 15 | SerializedProperty m_FinalSize; 16 | SerializedProperty m_AspectRatio; 17 | SerializedProperty m_SuperSampling; 18 | SerializedProperty m_CameraTag; 19 | SerializedProperty m_FlipFinalOutput; 20 | ResolutionSelector m_ResSelector; 21 | 22 | protected void OnEnable() 23 | { 24 | if (target == null) 25 | return; 26 | 27 | var pf = new PropertyFinder(serializedObject); 28 | m_Source = pf.Find(w => w.source); 29 | m_RenderSize = pf.Find(w => w.m_RenderSize); 30 | m_AspectRatio = pf.Find(w => w.m_AspectRatio); 31 | m_SuperSampling = pf.Find(w => w.m_SuperSampling); 32 | m_FinalSize = pf.Find(w => w.m_OutputSize); 33 | m_CameraTag = pf.Find(w => w.m_CameraTag); 34 | m_FlipFinalOutput = pf.Find( w => w.m_FlipFinalOutput ); 35 | m_ResSelector = new ResolutionSelector(); 36 | } 37 | 38 | 39 | public override void OnInspectorGUI() 40 | { 41 | AddProperty(m_Source, () => 42 | { 43 | using (var check = new EditorGUI.ChangeCheckScope()) 44 | { 45 | if (m_MaskedSourceNames == null) 46 | m_MaskedSourceNames = EnumHelper.MaskOutEnumNames((int)m_SupportedSources); 47 | var index = EnumHelper.GetMaskedIndexFromEnumValue(m_Source.intValue, (int)m_SupportedSources); 48 | index = EditorGUILayout.Popup("Object(s) of interest", index, m_MaskedSourceNames); 49 | 50 | if (check.changed) 51 | m_Source.intValue = EnumHelper.GetEnumValueFromMaskedIndex(index, (int)m_SupportedSources); 52 | } 53 | }); 54 | 55 | var inputType = (EImageSource)m_Source.intValue; 56 | 57 | if ((EImageSource)m_Source.intValue == EImageSource.TaggedCamera) 58 | { 59 | ++EditorGUI.indentLevel; 60 | AddProperty(m_CameraTag, () => EditorGUILayout.PropertyField(m_CameraTag, new GUIContent("Tag"))); 61 | --EditorGUI.indentLevel; 62 | } 63 | 64 | AddProperty(m_AspectRatio, () => EditorGUILayout.PropertyField(m_AspectRatio, new GUIContent("Aspect Ratio"))); 65 | AddProperty(m_SuperSampling, () => EditorGUILayout.PropertyField(m_SuperSampling, new GUIContent("Super sampling"))); 66 | 67 | var renderSize = m_RenderSize; 68 | AddProperty(m_RenderSize, () => 69 | { 70 | 71 | if (inputType != EImageSource.RenderTexture) 72 | { 73 | EditorGUILayout.PropertyField(m_RenderSize, new GUIContent("Rendering resolution")); 74 | if (m_FinalSize.intValue > renderSize.intValue) 75 | m_FinalSize.intValue = renderSize.intValue; 76 | } 77 | }); 78 | 79 | AddProperty(m_FinalSize, () => 80 | { 81 | m_ResSelector.OnInspectorGUI( (target as ImageInputSettings).maxSupportedSize, m_FinalSize ); 82 | if (m_FinalSize.intValue == (int)EImageDimension.Window) 83 | m_FinalSize.intValue = (int)EImageDimension.x720p_HD; 84 | if (m_FinalSize.intValue > renderSize.intValue) 85 | renderSize.intValue = m_FinalSize.intValue; 86 | }); 87 | 88 | if (Verbose.enabled) 89 | { 90 | using (new EditorGUI.DisabledScope(true)) 91 | { 92 | EditorGUILayout.TextField("Color Space", (target as RenderTextureSamplerSettings).m_ColorSpace.ToString()); 93 | EditorGUILayout.PropertyField(m_FlipFinalOutput, new GUIContent("Flip output")); 94 | } 95 | } 96 | 97 | serializedObject.ApplyModifiedProperties(); 98 | } 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /source/FrameRecorder/Core/Editor/EnumHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace UnityEditor.Recorder 5 | { 6 | public static class EnumHelper 7 | { 8 | 9 | public static int GetEnumValueFromMaskedIndex(int index, int mask) 10 | { 11 | if (!typeof(TEnum).IsEnum) throw new ArgumentException("Arg not an enum"); 12 | var values = Enum.GetValues(typeof(TEnum)); 13 | for( int i = 0, j = -1; i < values.Length; i++ ) 14 | { 15 | if (((int)values.GetValue(i) & mask) != 0) 16 | j++; 17 | 18 | if (j == index) 19 | return (int)values.GetValue(i); 20 | } 21 | throw new ArgumentException("invalid masked index"); 22 | } 23 | 24 | public static int GetEnumValueFromClippedIndex(int index, int start, int end) 25 | { 26 | if (!typeof(TEnum).IsEnum) throw new ArgumentException("Arg not an enum"); 27 | var values = Enum.GetValues(typeof(TEnum)); 28 | for( int i = 0, j = -1; i < values.Length; i++ ) 29 | { 30 | if ((int)values.GetValue(i) >= start && (int)values.GetValue(i) <= end ) 31 | j++; 32 | 33 | if (j == index) 34 | return (int)values.GetValue(i); 35 | } 36 | throw new ArgumentException("invalid clipped index"); 37 | } 38 | 39 | 40 | public static int GetMaskedIndexFromEnumValue(int value, int mask) 41 | { 42 | if (!typeof(TEnum).IsEnum) throw new ArgumentException("Arg not an enum"); 43 | var values = Enum.GetValues(typeof(TEnum)); 44 | for( int i = 0, j = -1; i < values.Length; i++ ) 45 | { 46 | var v = (int)values.GetValue(i); 47 | if ((v & mask) != 0) 48 | { 49 | j++; 50 | if (v == value) 51 | return j; 52 | } 53 | } 54 | return 0; 55 | } 56 | 57 | public static int GetClippedIndexFromEnumValue(int value, int start, int end) 58 | { 59 | if (!typeof(TEnum).IsEnum) throw new ArgumentException("Arg not an enum"); 60 | var values = Enum.GetValues(typeof(TEnum)); 61 | for( int i = 0, j = -1; i < values.Length; i++ ) 62 | { 63 | var v = (int)values.GetValue(i); 64 | if (v >= start && v <= end) 65 | { 66 | j++; 67 | if (v == value) 68 | return j; 69 | } 70 | } 71 | return 0; 72 | } 73 | 74 | public delegate string EnumToStringDelegate(int value); 75 | public static string[] MaskOutEnumNames(int mask, EnumToStringDelegate toString ) 76 | { 77 | if (!typeof(TEnum).IsEnum) throw new ArgumentException("Arg not an enum"); 78 | var values = Enum.GetValues(typeof(TEnum)); 79 | var result = new List(); 80 | for( int i = 0; i < values.Length; i++ ) 81 | { 82 | if( ((int)values.GetValue(i) & mask ) != 0 ) 83 | result.Add( toString( (int)values.GetValue(i) )); 84 | } 85 | return result.ToArray(); 86 | } 87 | 88 | public static string[] MaskOutEnumNames(int mask ) 89 | { 90 | if (!typeof(TEnum).IsEnum) throw new ArgumentException("Arg not an enum"); 91 | var names = Enum.GetNames(typeof(TEnum)); 92 | var values = Enum.GetValues(typeof(TEnum)); 93 | var result = new List(); 94 | for( int i = 0; i < values.Length; i++ ) 95 | { 96 | if( ((int)values.GetValue(i) & mask ) != 0 ) 97 | result.Add( (string)names.GetValue(i) ); 98 | } 99 | return result.ToArray(); 100 | } 101 | 102 | public static string[] ClipOutEnumNames(int start, int end ) 103 | { 104 | if (!typeof(TEnum).IsEnum) throw new ArgumentException("Arg not an enum"); 105 | var names = Enum.GetNames(typeof(TEnum)); 106 | var values = Enum.GetValues(typeof(TEnum)); 107 | var result = new List(); 108 | for( int i = 0; i < values.Length; i++ ) 109 | { 110 | if( (int)values.GetValue(i) >= start && (int)values.GetValue(i) <= end ) 111 | result.Add( (string)names.GetValue(i) ); 112 | } 113 | return result.ToArray(); 114 | } 115 | 116 | 117 | 118 | } 119 | 120 | } -------------------------------------------------------------------------------- /source/Recorder/Editor/MediaRecorderSettings.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_2017_3_OR_NEWER 2 | 3 | using System; 4 | using System.Collections.Generic; 5 | using UnityEditor.Recorder.Input; 6 | using UnityEngine; 7 | using UnityEngine.Recorder; 8 | using UnityEngine.Recorder.Input; 9 | namespace UnityEditor.Recorder 10 | { 11 | 12 | public enum MediaRecorderOutputFormat 13 | { 14 | MP4, 15 | WEBM 16 | } 17 | 18 | [ExecuteInEditMode] 19 | public class MediaRecorderSettings : RecorderSettings 20 | { 21 | public MediaRecorderOutputFormat m_OutputFormat = MediaRecorderOutputFormat.MP4; 22 | #if UNITY_2018_1_OR_NEWER 23 | public UnityEditor.VideoBitrateMode m_VideoBitRateMode = UnityEditor.VideoBitrateMode.High; 24 | #endif 25 | public bool m_AppendSuffix = false; 26 | 27 | MediaRecorderSettings() 28 | { 29 | m_BaseFileName.pattern = "movie."; 30 | } 31 | 32 | public override List GetDefaultInputSettings() 33 | { 34 | return new List() 35 | { 36 | NewInputSettingsObj("Pixels"), 37 | NewInputSettingsObj("Audio") 38 | }; 39 | } 40 | 41 | public override bool ValidityCheck( List errors ) 42 | { 43 | var ok = base.ValidityCheck(errors); 44 | 45 | if( string.IsNullOrEmpty(m_DestinationPath.GetFullPath() )) 46 | { 47 | ok = false; 48 | errors.Add("Missing destination path."); 49 | } 50 | if( string.IsNullOrEmpty(m_BaseFileName.pattern)) 51 | { 52 | ok = false; 53 | errors.Add("missing file name"); 54 | } 55 | 56 | return ok; 57 | } 58 | 59 | public override RecorderInputSetting NewInputSettingsObj(Type type, string title) 60 | { 61 | var obj = base.NewInputSettingsObj(type, title); 62 | if (type == typeof(CBRenderTextureInputSettings)) 63 | { 64 | (obj as CBRenderTextureInputSettings).m_ForceEvenSize = true; 65 | (obj as CBRenderTextureInputSettings).m_FlipFinalOutput = Application.platform == RuntimePlatform.OSXEditor; 66 | } 67 | if (type == typeof(RenderTextureSamplerSettings)) 68 | { 69 | (obj as RenderTextureSamplerSettings).m_ForceEvenSize = true; 70 | } 71 | if (type == typeof(ScreenCaptureInputSettings)) 72 | { 73 | (obj as ScreenCaptureInputSettings).m_ForceEvenSize = true; 74 | } 75 | 76 | return obj ; 77 | } 78 | 79 | public override List GetInputGroups() 80 | { 81 | return new List() 82 | { 83 | new InputGroupFilter() 84 | { 85 | title = "Pixels", 86 | typesFilter = new List() 87 | { 88 | new TInputFilter("Game View"), 89 | new TInputFilter("Specific Camera(s)"), 90 | #if UNITY_2018_1_OR_NEWER 91 | new TInputFilter("360 View (feature preview)"), 92 | #endif 93 | new TInputFilter("Sampling (off screen)"), 94 | new TInputFilter("Render Texture Asset"), 95 | } 96 | }, 97 | new InputGroupFilter() 98 | { 99 | title = "Sound", 100 | typesFilter = new List() 101 | { 102 | new TInputFilter("Audio"), 103 | } 104 | } 105 | }; 106 | } 107 | 108 | public override bool SelfAdjustSettings() 109 | { 110 | if (inputsSettings.Count == 0 ) 111 | return false; 112 | 113 | var adjusted = false; 114 | 115 | if (inputsSettings[0] is ImageInputSettings) 116 | { 117 | var iis = (ImageInputSettings)inputsSettings[0]; 118 | var maxRes = m_OutputFormat == MediaRecorderOutputFormat.MP4 ? EImageDimension.x2160p_4K : EImageDimension.x4320p_8K; 119 | if (iis.maxSupportedSize != maxRes) 120 | { 121 | iis.maxSupportedSize = maxRes; 122 | adjusted = true; 123 | } 124 | } 125 | 126 | return adjusted; 127 | } 128 | 129 | } 130 | } 131 | 132 | #endif --------------------------------------------------------------------------------