Neodroid  0.2.0
Machine Learning Environment Prototyping Tool
ColorEncoding.cs
Go to the documentation of this file.
1 using UnityEngine;
2 
3 namespace droid.Runtime.Utilities.GameObjects.NeodroidCamera.Synthesis {
7  public static class ColorEncoding {
13  public static byte ReverseBits(byte value) {
14  return (byte)((value * 0x0202020202 & 0x010884422010) % 1023);
15  }
16 
23  public static int SparsifyBits(byte value, int sparse) {
24  var ret_val = 0;
25  for (var bits = 0; bits < 8; bits++, value >>= 1) {
26  ret_val |= (value & 1);
27  ret_val <<= sparse;
28  }
29 
30  return ret_val >> sparse;
31  }
32 
38  public static Color EncodeIdAsColor(int instance_id) {
39  var uid = instance_id * 2;
40  if (uid < 0) {
41  uid = -uid + 1;
42  }
43 
44  var sid = (SparsifyBits((byte)(uid >> 16), 3) << 2)
45  | (SparsifyBits((byte)(uid >> 8), 3) << 1)
46  | SparsifyBits((byte)(uid), 3);
47  //Debug.Log(uid + " >>> " + System.Convert.ToString(sid, 2).PadLeft(24, '0'));
48 
49  var r = (byte)(sid >> 8);
50  var g = (byte)(sid >> 16);
51  var b = (byte)(sid);
52 
53  //Debug.Log(r + " " + g + " " + b);
54  return new Color32(r, g, b, 255);
55  }
56 
63  public static Color EncodeTagHashCodeAsColor(int hash) {
64  //var a = (byte)(hash >> 24);
65  var r = (byte)(hash >> 16);
66  var g = (byte)(hash >> 8);
67  var b = (byte)(hash);
68  return new Color32(r, g, b, 255);
69  }
70 
77  public static Color EncodeLayerAsColor(int layer, float z = .7f) {
78  // z value must be in the range (0.5 .. 1.0)
79  // in order to avoid color overlaps when using 'divider' in this func
80 
81  // First 8 layers are Unity Builtin layers
82  // Unity supports up to 32 layers in total
83 
84  // Lets create palette of unique 16 colors
85  var unique_colors = new[] {
86  new Color(1, 1, 1, 1),
87  new Color(z, z, z, 1), // 0
88  new Color(1, 1, z, 1),
89  new Color(1, z, 1, 1),
90  new Color(z, 1, 1, 1), //
91  new Color(1, z, 0, 1),
92  new Color(z, 0, 1, 1),
93  new Color(0, 1, z, 1), // 7
94 
95  new Color(1, 0, 0, 1),
96  new Color(0, 1, 0, 1),
97  new Color(0, 0, 1, 1), // 8
98  new Color(1, 1, 0, 1),
99  new Color(1, 0, 1, 1),
100  new Color(0, 1, 1, 1), //
101  new Color(1, z, z, 1),
102  new Color(z, 1, z, 1) // 15
103  };
104 
105  // Create as many colors as necessary by using base 16 color palette
106  // To create more than 16 - will simply adjust brightness with 'divider'
107  var color = unique_colors[layer % unique_colors.Length];
108  var divider = 1.0f + Mathf.Floor(layer / unique_colors.Length);
109  color /= divider;
110 
111  return color;
112  }
113  }
114 }