Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
WoWDisplayShader.cpp
1 /*
2  * WoWDisplayShader.cpp
3  *
4  * Created on: Feb 9, 2010
5  * Author: africk
6  */
7 
8 #include <OpenGLFramework/SpecializedBatches/WoWDisplayShader.hh>
9 
10 using namespace std;
11 using namespace BIAS;
12 
13 WoWDisplayShader::WoWDisplayShader() {
14  dispImageP_ = NULL;
15  colorImageP_ = NULL;
16  width_ = 960;
17  height_ = 540;
18  wowFactor_ = 0x40;
19  wowOffset_ = 0x80;
20  flip_ = 0;
21  scale_ = 1;
22  mode_ = 0;
23  withOcclLayer_ = 0;
24 
25  fragmentShaderCode_ = ""
26  "uniform sampler2D colorImage;"
27  "uniform sampler2D dispImage;"
28  "uniform int header [256];"
29  "uniform float w;"
30  "uniform float h;"
31  "uniform float scale;"
32  "uniform int flip;" // 0 no , 1 yes
33  ""
34  ""
35  "void main() {"
36  ""
37  "vec2 coord = gl_TexCoord[0];"
38  ""
39  "vec3 color = vec3(0.0,0.0,0.0);"
40  ""
41  "if (mod(coord.y*h,2.0) >= 0.5) {"
42  ""
43  "if ((coord.x) < 0.5) {"
44  "vec2 new_coord;"
45  "new_coord[0]=coord[0]*2;\n"
46  "new_coord[1]=abs(flip - coord[1]);\n"
47  "color = texture2D(colorImage, new_coord);\n"
48  "} else {"
49  "vec2 new_coord;"
50  "new_coord[0]=(coord[0] - 0.5)*2;\n"
51  "new_coord[1]=coord[1];\n"
52  "color = (((max(0.0,min(255.0,texture2D(dispImage, new_coord))) - 128.0) * scale) + 128.0)/255.0;\n"
53  "}"
54  ""
55  ""
56  "}"
57  ""
58  "float x = (coord.x*w);\n"
59  "float y = (coord.y*h);\n"
60  ""
61  "if (y >= h-1 && x < 256) {\n"
62  "color[2]=header[int(x)]/255.0;\n"
63  "}\n"
64  ""
65  "gl_FragColor.rgb = color;"
66  ""
67  "}";
68 
69 
70  fragmentShaderCode1_ = ""
71  "uniform sampler2D image;"
72  "uniform int header [256];"
73  "uniform float w;"
74  "uniform float h;"
75  "uniform float scale;"
76  "uniform float offset;"
77  "uniform float flip;"
78  "uniform int occlLayer;" //0 no occl , 1 occl
79  ""
80  "void main() {"
81  ""
82  "vec2 coord = gl_TexCoord[0];"
83  "coord[1] = 1.0-coord[1];"
84  "vec3 color = vec3(0.0,0.0,0.0);"
85  ""
86  ""
87  "vec2 new_coord = coord;"
88  "if (occlLayer == 1) {"
89  "new_coord[1]=new_coord[1]/2.0;"
90  "if (mod(int(coord[1]*h),2) == 0) {"
91  // "new_coord[1]=new_coord[1]+0.5;"
92  "} else {"
93  "new_coord[1]=new_coord[1]+0.5;"
94  "}"
95  "}"
96  ""
97  "if (coord.x < 0.5) {"
98  "color = texture2D(image, new_coord);\n"
99  "} else {"
100  "color = texture2D(image, new_coord)*scale+offset;\n"
101  "}"
102  ""
103  ""
104  // "float x = (coord.x*w);\n"
105  // "float y = (coord.y*h);\n"
106  ""
107  // "if (y <= 1 && int(x) < 512) {\n"
108  // "color[2]=header[int(x)]/255.0;\n"
109  // "}\n"
110  ""
111  "gl_FragColor.rgb = color;"
112  ""
113  "}";
114 }
115 
116 WoWDisplayShader::~WoWDisplayShader() {
117  // TODO Auto-generated destructor stub
118 }
119 
120 void WoWDisplayShader::SetDisparityImage(glfTexture2D* dispImage) {
121  dispImageP_ = dispImage;
122 }
123 void WoWDisplayShader::SetColorImage(glfTexture2D* colorImage) {
124  colorImageP_ = colorImage;
125 }
126 
127 void WoWDisplayShader::Init(int mode) {
128  InitBatch_();
129  mode_ = mode;
130  if (mode == 0) {
131  CreateFragmentShaderProgram(fragmentShaderCode_);
132  CreateHeader_(fullheader_, wowFactor_, wowOffset_);
133  } else {
134  CreateFragmentShaderProgram(fragmentShaderCode1_);
135  // CreateHeader2_(fullheader_, wowFactor_, wowOffset_);
136  for (unsigned int i = 0; i < header_.size(); i++) {
137  newFullHeader_[i] = header_[i]*255;
138  cout << header_[i] << " ";
139  }
140  cout << " size = " << header_.size()<< endl;
141  }
142 
143 
144 }
145 
146 void WoWDisplayShader::Draw() {
147 
148  GetDepthBufferMode_()->SetDepthTest(false);
149  width_ = GetViewport_()->GetWidth();
150  height_ = GetViewport_()->GetHeight();
151  if (mode_ == 0) {
152  if (dispImageP_ != NULL && colorImageP_ != NULL) {
153  // if (GetRenderTarget() == NULL) {
154  // glClearColor(0, 0, 0, 0);
155  // glClear(GL_COLOR_BUFFER_BIT);
156  // } else {
157  // GetRenderTarget()->ClearColorBuffer(0, 0, 0, 0);
158  // GetRenderTarget()->ClearDepthBuffer(1.0);
159  // }
160 
161 
162  GetShaderProgram_()->SetUniform("flip", flip_);
163  GetShaderProgram_()->SetUniform("scale", scale_);
164  GetShaderProgram_()->SetUniform("w", (float) width_);
165  GetShaderProgram_()->SetUniform("h", (float) height_);
166  GetShaderProgram_()->SetUniform("header", 256, fullheader_);
167  GetShaderProgram_()->SetUniform("dispImage", (int) 0);
168  GetShaderProgram_()->SetUniform("colorImage", (int) 1);
169 
170  GetBatch_()->SetTexture(dispImageP_, 0);
171  GetBatch_()->SetTexture(colorImageP_, 1);
172  GetBatch_()->Draw();
173  }
174  } else {
175 
176  if (colorImageP_ != NULL) {
177  GetShaderProgram_()->SetUniform("flip", flip_);
178  GetShaderProgram_()->SetUniform("scale", scale_);
179  GetShaderProgram_()->SetUniform("offset", (float)0);
180  GetShaderProgram_()->SetUniform("w", (float) width_);
181  GetShaderProgram_()->SetUniform("h", (float) height_);
182  GetShaderProgram_()->SetUniform("header", 256, newFullHeader_);
183  GetShaderProgram_()->SetUniform("image", (int) 0);
184  GetShaderProgram_()->SetUniform("occlLayer", withOcclLayer_);
185 
186 
187  GetBatch_()->SetTexture(colorImageP_, 0);
188  GetBatch_()->Draw();
189  }
190 
191 
192  }
193 
194 }
195 
196 //#####################################################
197 
198 void WoWDisplayShader::CreateHeader_(int* fullheader, int wowFactor,
199  int wowOffset) {
200 
201  unsigned char wow_content = 0x02;
202  unsigned char wow_use_factor = 0x80;
203  unsigned char wow_use_offset = 0x40;
204  unsigned char wow_use_factor_plus_offset = wow_use_factor + wow_use_offset;
205  unsigned char wow_factorUChar = wowFactor;
206  unsigned char wow_offsetUChar = wowOffset;
207 
208  unsigned char header[] = { 0xF1, wow_content, wow_factorUChar, wow_offsetUChar,
209  wow_use_factor_plus_offset, 0x00, 0x00, 0x00, 0x00, 0x00};
210  {
211  unsigned long _register = 0;
212  for (int i = 0; i < 10; ++i) {
213  unsigned char mask = 0x80;
214  unsigned char byte = header[i];
215  for (int j = 0; j < 8; ++j) {
216  bool topBit = (_register & 0x80000000) != 0;
217  _register <<= 1;
218  _register ^= ((byte & mask) != 0 ? 0x1 : 0x0);
219  if (topBit) {
220  _register ^= 0x04c11db7;
221  }
222  mask >>= 1;
223  }
224  }
225  unsigned char *p = (unsigned char*) &_register;
226  for (size_t i = 0; i < 4; ++i) {
227  header[i + 6] = p[3 - i];
228  }
229  }
230 
231  {
232  for (int x = 0; x < 256; ++x) {
233  fullheader[x] = 0;
234  }
235  for (int x = 0; x <= 9; ++x) {
236  for (int y = 7; y >= 0; --y) {
237  int i = 2 * (7 - y) + 16 * x;
238  fullheader[i] = (((1 << (y)) & (header[x])) << (7 - (y)));
239  }
240  }
241  }
242 }
243 
244 void WoWDisplayShader::CreateHeader2_(int* header, int wowFactor,
245  int wowOffset) {
246 
247  unsigned char wow_content = 0x02;
248  unsigned char wow_use_factor = 0x80;
249  unsigned char wow_use_offset = 0x40;
250  unsigned char wow_factorUChar = wowFactor;
251  unsigned char wow_offsetUChar = wowOffset;
252  unsigned char wow_use_factor_plus_offset = wow_use_factor + wow_use_offset;
253 
254  unsigned char H[] = { 0xF1, wow_content, wow_factorUChar, wow_offsetUChar,
255  wow_use_factor_plus_offset, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x14, 0xEF};
256 
257  for (int x = 0; x < 256; x++) {
258  header[x] = 0;
259  }
260  for (int x = 0; x <= 12; x++) {
261  unsigned char val = H[x];
262  cout << "[";
263  for (int y = 7; y >= 0; y--) {
264  int b = 2 * (7 - y) + 16 * x;
265 
266 
267  if (val & 0x80) {
268  header[b] = 128;
269  val = val & 0x7F;
270  } else {
271  header[b] = 0;
272  }
273  val = val << 1;
274 
275  cout <<header[b] / 255;
276  }
277  cout << "] ";
278  }
279  cout << endl;
280 }
A 2D texture.
Definition: glfTexture2D.hh:40