Neodroid  0.2.0
Machine Learning Environment Prototyping Tool
SynthesisUtilities.cs
Go to the documentation of this file.
1 using System;
2 using UnityEngine;
3 using UnityEngine.Rendering;
4 
5 namespace droid.Runtime.Utilities.GameObjects.NeodroidCamera.Synthesis {
9  public static class SynthesisUtilities {
10  static readonly int _sensitivity = Shader.PropertyToID("_Sensitivity");
11  public const string _Shader_Layer_Color_Name = "_LayerColor";
12  public const string _Shader_Tag_Color_Name = "_TagColor";
13  public const string _Shader_MaterialId_Color_Name = "_MaterialIdColor";
14  public const string _Shader_ObjectId_Color_Name = "_ObjectIdColor";
15  public const string _Shader_OutputMode_Name = "_OutputMode";
16 
17  public static CapturePass[] _Default_Capture_Passes = {
18  new CapturePass {
19  _Name = "_img",
20  _ReplacementMode =
21  ReplacementModes.None_
22  },
23  new CapturePass {
24  _Name = "_id",
25  _SupportsAntialiasing =
26  false,
27  _ReplacementMode =
28  ReplacementModes
29  .Object_id_
30  },
31  new CapturePass {
32  _Name = "_layer",
33  _SupportsAntialiasing =
34  false,
35  _ReplacementMode =
36  ReplacementModes
37  .Layer_id_
38  },
39  new CapturePass {
40  _Name = "_depth",
41  _ReplacementMode =
42  ReplacementModes
43  .Depth_compressed_
44  },
45  new CapturePass {
46  _Name = "_normals",
47  _ReplacementMode =
48  ReplacementModes
49  .Normals_
50  },
51  new CapturePass {
52  _Name = "_mat_id",
53  _SupportsAntialiasing =
54  false,
55  _ReplacementMode =
56  ReplacementModes
57  .Material_id_
58  },
59  new CapturePass {
60  _Name = "_tag",
61  _SupportsAntialiasing =
62  false,
63  _ReplacementMode =
64  ReplacementModes
65  .Material_id_
66  },
67  new CapturePass {
68  _Name = "_flow",
69  _SupportsAntialiasing =
70  false,
71  _NeedsRescale = true,
72  _ReplacementMode =
73  ReplacementModes.Flow_
74  }
75  };
76 
80  [Serializable]
81  public struct CapturePass {
82  // configuration
83  public string _Name;
84  public bool _SupportsAntialiasing;
85  public bool _NeedsRescale;
86  public Camera _Camera;
87  public ReplacementModes _ReplacementMode;
88  }
89 
93  public enum ReplacementModes {
97  Object_id_ = 0,
98 
102  Material_id_ = 1,
103 
107  Layer_id_ = 2,
108 
112  Tag_id_ = 3,
113 
117  Depth_compressed_ = 4,
118 
122  Depth_multichannel_ = 5,
123 
127  Normals_ = 6,
128 
132  None_ = 7,
133 
137  Flow_ = 8
138  }
139 
143  public static void SetupCapturePassesFull(Camera camera,
144  Shader replacement_shader,
145  Shader optical_flow_shader,
146  Material optical_flow_material,
147  float optical_flow_sensitivity,
148  ref CapturePass[] capture_passes) {
149  SetupHiddenCapturePassCameras(camera, ref capture_passes);
150  CleanRefreshPassCameras(camera, ref capture_passes);
151 
152  // cache materials and setup material properties
153  if (!optical_flow_material || optical_flow_material.shader != optical_flow_shader) {
154  optical_flow_material = new Material(optical_flow_shader);
155  }
156 
157  optical_flow_material.SetFloat(_sensitivity, optical_flow_sensitivity);
158 
159  // setup command buffers and replacement shaders
160  AddReplacementShaderCommandBufferOnCamera(capture_passes[1]._Camera,
161  replacement_shader,
162  capture_passes[1]._ReplacementMode);
163  AddReplacementShaderCommandBufferOnCamera(capture_passes[2]._Camera,
164  replacement_shader,
165  capture_passes[2]._ReplacementMode);
166  AddReplacementShaderCommandBufferOnCamera(capture_passes[6]._Camera,
167  replacement_shader,
168  capture_passes[6]._ReplacementMode);
169 
170  AddReplacementShaderCommandBufferOnCamera(capture_passes[5]._Camera,
171  replacement_shader,
172  capture_passes[5]._ReplacementMode);
173 
174  AddReplacementShaderCommandBufferOnCamera(capture_passes[3]._Camera,
175  replacement_shader,
176  capture_passes[3]._ReplacementMode,
177  Color.white);
178  AddReplacementShaderCommandBufferOnCamera(capture_passes[4]._Camera,
179  replacement_shader,
180  capture_passes[4]._ReplacementMode);
181  SetupCameraWithPostShader(capture_passes[8]._Camera,
182  optical_flow_material,
183  DepthTextureMode.Depth | DepthTextureMode.MotionVectors);
184  }
185 
186  public static void SetupCapturePassesReplacementShader(Camera camera,
187  Shader replacement_shader,
188  ref CapturePass[] capture_passes) {
189  SetupHiddenCapturePassCameras(camera, ref capture_passes);
190  CleanRefreshPassCameras(camera, ref capture_passes);
191 
192  foreach (var capture_pass in capture_passes) {
193  AddReplacementShaderCommandBufferOnCamera(capture_pass._Camera,
194  replacement_shader,
195  capture_pass._ReplacementMode);
196  }
197  }
198 
199  static void CleanRefreshPassCameras(Camera camera, ref CapturePass[] capture_passes) {
200  var target_display = 1;
201  foreach (var pass in capture_passes) {
202  if (pass._Camera == camera) {
203  continue;
204  }
205 
206  pass._Camera.RemoveAllCommandBuffers(); // cleanup capturing camera
207  pass._Camera.CopyFrom(camera); // copy all "main" camera parameters into capturing camera
208  pass._Camera.targetDisplay =
209  target_display++; // set targetDisplay here since it gets overriden by CopyFrom()
210  }
211  }
212 
213  static void AddReplacementShaderCommandBufferOnCamera(Camera cam, Shader shader, ReplacementModes mode) {
214  AddReplacementShaderCommandBufferOnCamera(cam, shader, mode, Color.black);
215  }
216 
217  static void AddReplacementShaderCommandBufferOnCamera(Camera camera,
218  Shader shader,
219  ReplacementModes mode,
220  Color clear_color) {
221  var cb = new CommandBuffer {name = mode.ToString()};
222  cb.SetGlobalInt(_Shader_OutputMode_Name, (int)mode);
223  camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, cb);
224  camera.AddCommandBuffer(CameraEvent.BeforeFinalPass, cb);
225  camera.SetReplacementShader(shader, "");
226  camera.backgroundColor = clear_color;
227  camera.clearFlags = CameraClearFlags.SolidColor;
228  }
229 
230  static void SetupCameraWithPostShader(Camera cam,
231  Material material,
232  DepthTextureMode depth_texture_mode = DepthTextureMode.None) {
233  var cb = new CommandBuffer {name = cam.name};
234  cb.Blit(null, BuiltinRenderTextureType.CurrentActive, material);
235  cam.AddCommandBuffer(CameraEvent.AfterEverything, cb);
236  cam.depthTextureMode = depth_texture_mode;
237  }
238 
244  static void SetupHiddenCapturePassCameras(Camera camera, ref CapturePass[] capture_passes) {
245  capture_passes[0]._Camera = camera;
246  for (var q = 1; q < capture_passes.Length; q++) {
247  capture_passes[q]._Camera = CreateHiddenCamera(capture_passes[q]._Name, camera.transform);
248  }
249  }
250 
251  static Camera CreateHiddenCamera(string cam_name, Transform parent) {
252  var go = new GameObject(cam_name, typeof(Camera)) {hideFlags = HideFlags.HideAndDontSave};
253  go.transform.parent = parent;
254 
255  var new_camera = go.GetComponent<Camera>();
256  return new_camera;
257  }
258  }
259 }