1 using System.Collections;
2 using System.Collections.Generic;
4 using UnityEngine.Rendering;
17 [Header(
"Camera Controller Properties")]
20 private List<Camera> cameras =
new List<Camera>();
21 private Transform airplane;
22 public List<CapturePass> CapturePassList =
new List<CapturePass>();
23 public int startCameraIndex =1;
24 private int curentCameraIndex=1;
25 private int currentCaprtureCamera=1;
26 [Header(
"Shader Setup")]
27 public Shader uberReplacementShader;
28 public Shader opticalFlowShader;
29 public float opticalFlowSensitivity = 1.0f;
31 [Header(
"Save Image Capture")]
32 public bool saveImage =
true;
33 public bool saveIdSegmentation =
true;
34 public bool saveLayerSegmentation =
true;
35 public bool saveDepth =
true;
36 public bool saveNormals =
true;
37 public bool saveOpticalFlow=
true;
41 new CapturePass() { name =
"_id", supportsAntialiasing =
false },
42 new CapturePass() { name =
"_layer", supportsAntialiasing =
false },
45 new CapturePass() { name =
"_flow", supportsAntialiasing =
false, needsRescale =
true }
52 public bool supportsAntialiasing;
53 public bool needsRescale;
54 public CapturePass(
string name_) { name = name_; supportsAntialiasing =
true; needsRescale =
false; camera =
null; }
61 private Material opticalFlowMaterial;
63 public enum ReplacementMode
68 DepthMultichannel = 3,
74 #region Builtin Methods
82 cameras.Add(GameObject.Find(CommonFunctions.ActiveAirplane+
"/FollowCamera").GetComponent<Camera>());
83 cameras.Add(GameObject.Find(CommonFunctions.ActiveAirplane+
"/CockpitCamera").GetComponent<Camera>());
86 if (startCameraIndex >=0 && startCameraIndex < cameras.Count)
89 cameras[startCameraIndex].enabled =
true;
90 cameras[startCameraIndex].GetComponent<AudioListener>().enabled =
true;
91 startCameraIndex = curentCameraIndex;
101 for (
int q = 0; q < capturePasses.Length; q++)
103 capturePasses[q].camera = CreateHiddenCamera(capturePasses[q].name, cameras[currentCaprtureCamera].transform);
104 CapturePassList.Add(capturePasses[q]);
114 private Camera CreateHiddenCamera(
string name, Transform parentCamera)
116 var go =
new GameObject(name, typeof(Camera));
117 go.hideFlags = HideFlags.HideAndDontSave;
118 go.transform.SetParent(parentCamera,
false);
119 var newCamera = go.GetComponent<Camera>();
120 newCamera.enabled =
false;
131 int activeCamera = StaticCameraSchema.ActiveCamera;
132 int captureCamera = StaticCameraSchema.CaptureCamera;
133 int captureType = StaticCameraSchema.CaptureType;
134 bool isCapture = StaticCameraSchema.IsCapture;
135 int captureWidth = StaticCameraSchema.CaptureWidth;
136 int captureHeight = StaticCameraSchema.CaptureHeight;
137 bool isActive = StaticCameraSchema.IsActive;
140 curentCameraIndex = activeCamera;
143 string logString = System.String.Format(
"Active scene camera - {0} Capture camera - {1} Width - {2} Height - {3}: ",curentCameraIndex, currentCaprtureCamera, captureWidth, captureHeight);
144 StaticLogger.Log = logString;
145 Debug.unityLogger.Log(logString);
146 StaticCameraSchema.IsActive =
false;
153 CapturePass pass = CapturePassList[captureType];
154 pass.camera.enabled =
true;
155 ScreenToBytes(pass.camera, cameras[curentCameraIndex] , captureWidth, captureHeight, pass.supportsAntialiasing, pass.needsRescale, ref StaticOutputSchema.ScreenCapture);
157 if(currentCaprtureCamera != captureCamera)
159 ResetAllCaptureCam(capturePasses);
160 currentCaprtureCamera = captureCamera;
161 string logString = System.String.Format(
"Active scene camera - {0} Capture camera - {1} Width - {2} Height - {3}: ",curentCameraIndex, currentCaprtureCamera, captureWidth, captureHeight);
162 StaticLogger.Log = logString;
163 Debug.unityLogger.Log(logString);
173 if(input.CameraSwitch){
207 void ResetAllCaptureCam(CapturePass[] CapturePassList){
208 foreach(CapturePass pass
in CapturePassList)
210 pass.camera.enabled =
false;
215 #region Custom Methods
216 public void ScreenToBytes(Camera cam, Camera mainCamera,
int width,
int height,
bool supportsAntialiasing,
bool needsRescale, ref
byte[] screencapture)
228 if (width <= 0 || height <= 0)
230 width = Screen.width;
231 height = Screen.height;
235 var format = RenderTextureFormat.Default;
236 var readWrite = RenderTextureReadWrite.Default;
237 var antiAliasing = (supportsAntialiasing) ? Mathf.Max(1, QualitySettings.antiAliasing) : 1;
240 RenderTexture.GetTemporary(width, height, depth, format, readWrite, antiAliasing);
241 var renderRT = (!needsRescale) ? finalRT :
242 RenderTexture.GetTemporary(mainCamera.pixelWidth, mainCamera.pixelHeight, depth, format, readWrite, antiAliasing);
243 var tex =
new Texture2D(width, height, TextureFormat.RGB24,
false);
245 var prevActiveRT = RenderTexture.active;
246 var prevCameraRT = cam.targetTexture;
249 RenderTexture.active = renderRT;
250 cam.targetTexture = renderRT;
257 RenderTexture.active = finalRT;
258 Graphics.Blit(renderRT, finalRT);
259 RenderTexture.ReleaseTemporary(renderRT);
263 tex.ReadPixels(
new Rect(0, 0, tex.width, tex.height), 0, 0);
267 screencapture = tex.EncodeToPNG();
282 private void Save(Camera cam, Camera mainCamera,
string filename,
int width,
int height,
bool supportsAntialiasing,
bool needsRescale)
285 var format = RenderTextureFormat.Default;
286 var readWrite = RenderTextureReadWrite.Default;
287 var antiAliasing = (supportsAntialiasing) ? Mathf.Max(1, QualitySettings.antiAliasing) : 1;
290 RenderTexture.GetTemporary(width, height, depth, format, readWrite, antiAliasing);
291 var renderRT = (!needsRescale) ? finalRT :
292 RenderTexture.GetTemporary(mainCamera.pixelWidth, mainCamera.pixelHeight, depth, format, readWrite, antiAliasing);
293 var tex =
new Texture2D(width, height, TextureFormat.RGB24,
false);
295 var prevActiveRT = RenderTexture.active;
296 var prevCameraRT = cam.targetTexture;
299 RenderTexture.active = renderRT;
300 cam.targetTexture = renderRT;
307 RenderTexture.active = finalRT;
308 Graphics.Blit(renderRT, finalRT);
309 RenderTexture.ReleaseTemporary(renderRT);
313 tex.ReadPixels(
new Rect(0, 0, tex.width, tex.height), 0, 0);
317 var bytes = tex.EncodeToPNG();
318 File.WriteAllBytes(filename, bytes);
321 cam.targetTexture = prevCameraRT;
322 RenderTexture.active = prevActiveRT;
325 RenderTexture.ReleaseTemporary(finalRT);
337 if (curentCameraIndex >= cameras.Count){
338 curentCameraIndex = 0;
340 cameras[curentCameraIndex].enabled =
true;
341 cameras[curentCameraIndex].GetComponent<AudioListener>().enabled =
true;
352 if (cameraId <= cameras.Count){
353 cameras[cameraId].enabled =
true;
354 cameras[cameraId].GetComponent<AudioListener>().enabled =
true;
355 curentCameraIndex = cameraId;
362 void DisableAllCameras()
364 if(cameras.Count > 0)
366 foreach(Camera cam
in cameras)
369 cam.GetComponent<AudioListener>().enabled =
false;
381 static private void SetupCameraWithReplacementShader(Camera cam, Shader shader, ReplacementMode mode, Color clearColor)
383 var cb =
new CommandBuffer();
384 cb.SetGlobalFloat(
"_OutputMode", (
int)mode);
385 cam.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, cb);
386 cam.AddCommandBuffer(CameraEvent.BeforeFinalPass, cb);
387 cam.SetReplacementShader(shader,
"");
388 cam.backgroundColor = clearColor;
389 cam.clearFlags = CameraClearFlags.SolidColor;
390 cam.allowHDR =
false;
391 cam.allowMSAA =
false;
399 var renderers = Object.FindObjectsOfType<Renderer>();
400 var mpb =
new MaterialPropertyBlock();
401 foreach (var r
in renderers)
403 var
id = r.gameObject.GetInstanceID();
404 var layer = r.gameObject.layer;
405 var tag = r.gameObject.tag;
407 mpb.SetColor(
"_ObjectColor",
ColorEncoding.EncodeIDAsColor(
id));
408 mpb.SetColor(
"_CategoryColor",
ColorEncoding.EncodeLayerAsColor(layer));
409 r.SetPropertyBlock(mpb);
418 int targetDisplay = 1;
419 foreach (var pass
in capturePasses)
421 if (pass.camera == activeCamera)
425 pass.camera.RemoveAllCommandBuffers();
428 pass.camera.CopyFrom(activeCamera);
431 pass.camera.targetDisplay = targetDisplay++;
435 if (!opticalFlowMaterial || opticalFlowMaterial.shader != opticalFlowShader)
436 opticalFlowMaterial =
new Material(opticalFlowShader);
437 opticalFlowMaterial.SetFloat(
"_Sensitivity", opticalFlowSensitivity);
440 SetupCameraWithReplacementShader(capturePasses[1].camera, uberReplacementShader, ReplacementMode.ObjectId, Color.black);
441 SetupCameraWithReplacementShader(capturePasses[2].camera, uberReplacementShader, ReplacementMode.CatergoryId, Color.black);
442 SetupCameraWithReplacementShader(capturePasses[3].camera, uberReplacementShader, ReplacementMode.DepthCompressed, Color.white);
443 SetupCameraWithReplacementShader(capturePasses[4].camera, uberReplacementShader, ReplacementMode.Normals, Color.black);
444 SetupCameraWithPostShader(capturePasses[5].camera, opticalFlowMaterial, DepthTextureMode.Depth | DepthTextureMode.MotionVectors);
453 static private void SetupCameraWithPostShader(Camera cam, Material material, DepthTextureMode depthTextureMode = DepthTextureMode.None)
455 var cb =
new CommandBuffer();
456 cb.Blit(
null, BuiltinRenderTextureType.CurrentActive, material);
457 cam.AddCommandBuffer(CameraEvent.AfterEverything, cb);
458 cam.depthTextureMode = depthTextureMode;