8 #include <OpenGLFramework/SpecializedBatches/WoWDisplayShader.hh>
13 WoWDisplayShader::WoWDisplayShader() {
25 fragmentShaderCode_ =
""
26 "uniform sampler2D colorImage;"
27 "uniform sampler2D dispImage;"
28 "uniform int header [256];"
31 "uniform float scale;"
37 "vec2 coord = gl_TexCoord[0];"
39 "vec3 color = vec3(0.0,0.0,0.0);"
41 "if (mod(coord.y*h,2.0) >= 0.5) {"
43 "if ((coord.x) < 0.5) {"
45 "new_coord[0]=coord[0]*2;\n"
46 "new_coord[1]=abs(flip - coord[1]);\n"
47 "color = texture2D(colorImage, new_coord);\n"
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"
58 "float x = (coord.x*w);\n"
59 "float y = (coord.y*h);\n"
61 "if (y >= h-1 && x < 256) {\n"
62 "color[2]=header[int(x)]/255.0;\n"
65 "gl_FragColor.rgb = color;"
70 fragmentShaderCode1_ =
""
71 "uniform sampler2D image;"
72 "uniform int header [256];"
75 "uniform float scale;"
76 "uniform float offset;"
78 "uniform int occlLayer;"
82 "vec2 coord = gl_TexCoord[0];"
83 "coord[1] = 1.0-coord[1];"
84 "vec3 color = vec3(0.0,0.0,0.0);"
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) {"
93 "new_coord[1]=new_coord[1]+0.5;"
97 "if (coord.x < 0.5) {"
98 "color = texture2D(image, new_coord);\n"
100 "color = texture2D(image, new_coord)*scale+offset;\n"
111 "gl_FragColor.rgb = color;"
116 WoWDisplayShader::~WoWDisplayShader() {
121 dispImageP_ = dispImage;
124 colorImageP_ = colorImage;
127 void WoWDisplayShader::Init(
int mode) {
131 CreateFragmentShaderProgram(fragmentShaderCode_);
132 CreateHeader_(fullheader_, wowFactor_, wowOffset_);
134 CreateFragmentShaderProgram(fragmentShaderCode1_);
136 for (
unsigned int i = 0; i < header_.size(); i++) {
137 newFullHeader_[i] = header_[i]*255;
138 cout << header_[i] <<
" ";
140 cout <<
" size = " << header_.size()<< endl;
146 void WoWDisplayShader::Draw() {
148 GetDepthBufferMode_()->SetDepthTest(
false);
149 width_ = GetViewport_()->GetWidth();
150 height_ = GetViewport_()->GetHeight();
152 if (dispImageP_ != NULL && colorImageP_ != NULL) {
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);
170 GetBatch_()->SetTexture(dispImageP_, 0);
171 GetBatch_()->SetTexture(colorImageP_, 1);
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_);
187 GetBatch_()->SetTexture(colorImageP_, 0);
198 void WoWDisplayShader::CreateHeader_(
int* fullheader,
int wowFactor,
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;
208 unsigned char header[] = { 0xF1, wow_content, wow_factorUChar, wow_offsetUChar,
209 wow_use_factor_plus_offset, 0x00, 0x00, 0x00, 0x00, 0x00};
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;
218 _register ^= ((byte & mask) != 0 ? 0x1 : 0x0);
220 _register ^= 0x04c11db7;
225 unsigned char *p = (
unsigned char*) &_register;
226 for (
size_t i = 0; i < 4; ++i) {
227 header[i + 6] = p[3 - i];
232 for (
int x = 0; x < 256; ++x) {
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)));
244 void WoWDisplayShader::CreateHeader2_(
int* header,
int wowFactor,
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;
254 unsigned char H[] = { 0xF1, wow_content, wow_factorUChar, wow_offsetUChar,
255 wow_use_factor_plus_offset, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x14, 0xEF};
257 for (
int x = 0; x < 256; x++) {
260 for (
int x = 0; x <= 12; x++) {
261 unsigned char val = H[x];
263 for (
int y = 7; y >= 0; y--) {
264 int b = 2 * (7 - y) + 16 * x;
275 cout <<header[b] / 255;