//CLM these just generate D3D Texture versions of the KNS & Recolor data //we should be able to remove this class all together unsafe void recoloredExemplarToD3DTexture(Exemplar a, int l) { // recolored exemplar // . quantize ! Quantizer q = new Quantizer(a.recoloredStack(l), Globals.QUANTIZE_NUM_BITS, Globals.QUANTIZE_PERCENT_INSIDE); m_d3dRecolored_0_3 = new Texture(BRenderDevice.getDevice(), a.recoloredStack(l).width(), a.recoloredStack(l).height(), 1, 0, Format.A8R8G8B8, Pool.Managed); // . fill GraphicsStream texstream = m_d3dRecolored_0_3.LockRectangle(0, LockFlags.None); byte * data = (byte *)texstream.InternalDataPointer; int rectPitch = a.recoloredStack(l).width() * 4; for (int j = 0; j < a.recoloredStack(l).height(); j++) { for (int i = 0; i < a.recoloredStack(l).width(); i++) { int v0 = q.quantized().get(i, j, 0); int v1 = q.quantized().get(i, j, 1); int v2 = q.quantized().get(i, j, 2); int v3 = q.quantized().get(i, j, 3); Globals.Assert(v0 >= 0 && v0 <= 255); Globals.Assert(v1 >= 0 && v1 <= 255); Globals.Assert(v2 >= 0 && v2 <= 255); Globals.Assert(v3 >= 0 && v3 <= 255); data[i * 4 + j * rectPitch + 2] = (byte)(v0); data[i * 4 + j * rectPitch + 1] = (byte)(v1); data[i * 4 + j * rectPitch + 0] = (byte)(v2); data[i * 4 + j * rectPitch + 3] = (byte)(v3); } } m_d3dRecolored_0_3.UnlockRectangle(0); // de-quantization parameters m_UnqRecolored_Scale = new List <float>(Globals.NUM_RUNTIME_PCA_COMPONENTS); m_UnqRecolored_Mean = new List <float>(Globals.NUM_RUNTIME_PCA_COMPONENTS); for (int c = 0; c < Globals.NUM_RUNTIME_PCA_COMPONENTS; c++) { m_UnqRecolored_Scale.Add(q.radius(c)); m_UnqRecolored_Mean.Add(q.center(c)); } // . unquantize, recolored exemplar qr_mean_0_3 = new Vector4(m_UnqRecolored_Mean[0], m_UnqRecolored_Mean[1], m_UnqRecolored_Mean[2], m_UnqRecolored_Mean[3]); qr_scale_0_3 = new Vector4(m_UnqRecolored_Scale[0], m_UnqRecolored_Scale[1], m_UnqRecolored_Scale[2], m_UnqRecolored_Scale[3]); Vector4 div3 = new Vector4(0.33333f, 0.3333f, 0.3333f, 0.3333f); Vector4 mul2 = new Vector4(2, 2, 2, 2); qr_mean_0_3 = qr_mean_0_3 - qr_scale_0_3; qr_scale_0_3 = Vector4.Multiply(Vector4.Multiply(qr_scale_0_3, 1 / 3.0f), 2); }
unsafe void synthesisNeighborhoodsToD3DTexture(Exemplar a, int l) { // synthesis neighborhoods // . build float multidim texture from projected neighborhoods MultiDimFloatTexture tex = new MultiDimFloatTexture(a.recoloredStack(l).width(), a.recoloredStack(l).height(), Globals.NUM_RUNTIME_PCA_COMPONENTS); for (int j = 0; j < tex.height(); j++) { for (int i = 0; i < tex.width(); i++) { NeighborhoodSynth nproj = a.getProjectedSynthNeighborhood(l, i, j); for (int c = 0; c < tex.numComp(); c++) { tex.set(nproj.getValue(c), i, j, c); } } } // . quantize Quantizer q = new Quantizer(tex, Globals.QUANTIZE_NUM_BITS, Globals.QUANTIZE_PERCENT_INSIDE); m_d3dNeighborhoods_0_3 = new Texture(BRenderDevice.getDevice(), tex.width(), tex.height(), 1, 0, Format.A8R8G8B8, Pool.Managed); // . fill GraphicsStream texstream = m_d3dNeighborhoods_0_3.LockRectangle(0, LockFlags.None); byte * data = (byte *)texstream.InternalDataPointer; int rectPitch = tex.width() * 4; for (int j = 0; j < tex.height(); j++) { for (int i = 0; i < tex.width(); i++) { int v0 = q.quantized().get(i, j, 0); int v1 = q.quantized().get(i, j, 1); int v2 = q.quantized().get(i, j, 2); int v3 = q.quantized().get(i, j, 3); Globals.Assert(v0 >= 0 && v0 <= 255); Globals.Assert(v1 >= 0 && v1 <= 255); Globals.Assert(v2 >= 0 && v2 <= 255); Globals.Assert(v3 >= 0 && v3 <= 255); data[i * 4 + j * rectPitch + 2] = (byte)(v0); data[i * 4 + j * rectPitch + 1] = (byte)(v1); data[i * 4 + j * rectPitch + 0] = (byte)(v2); data[i * 4 + j * rectPitch + 3] = (byte)(v3); } } m_d3dNeighborhoods_0_3.UnlockRectangle(0); // de-quantization parameters m_UnqNeighborhoods_Scale = new List <float>(8); m_UnqNeighborhoods_Mean = new List <float>(8); for (int c = 0; c < q.quantized().numComp(); c++) { m_UnqNeighborhoods_Scale.Add(q.radius(c)); m_UnqNeighborhoods_Mean.Add(q.center(c)); } qn_mean_0_3 = new Vector4(m_UnqNeighborhoods_Mean[0], m_UnqNeighborhoods_Mean[1], m_UnqNeighborhoods_Mean[2], m_UnqNeighborhoods_Mean[3]); qn_scale_0_3 = new Vector4(m_UnqNeighborhoods_Scale[0], m_UnqNeighborhoods_Scale[1], m_UnqNeighborhoods_Scale[2], m_UnqNeighborhoods_Scale[3]); // expression in the shader is // (v*2.0-1.0)*UnqNeighborhoods_Scale_0_3 + UnqNeighborhoods_Mean_0_3 // => this is baked into the ants to reduce work load qn_mean_0_3 = qn_mean_0_3 - qn_scale_0_3; qn_scale_0_3 = qn_scale_0_3 * 2.0f; }