nux-1.16.0
|
00001 /* 00002 * Copyright 2010 Inalogic® Inc. 00003 * 00004 * This program is free software: you can redistribute it and/or modify it 00005 * under the terms of the GNU Lesser General Public License, as 00006 * published by the Free Software Foundation; either version 2.1 or 3.0 00007 * of the License. 00008 * 00009 * This program is distributed in the hope that it will be useful, but 00010 * WITHOUT ANY WARRANTY; without even the implied warranties of 00011 * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR 00012 * PURPOSE. See the applicable version of the GNU Lesser General Public 00013 * License for more details. 00014 * 00015 * You should have received a copy of both the GNU Lesser General Public 00016 * License along with this program. If not, see <http://www.gnu.org/licenses/> 00017 * 00018 * Authored by: Jay Taoko <jaytaoko@inalogic.com> 00019 * 00020 */ 00021 00022 #ifndef NUX_OPENGLES_20 00023 00024 #include "GLResource.h" 00025 #include "IOpenGLBaseTexture.h" 00026 #include "RenderingPipe.h" 00027 #include "GraphicsEngine.h" 00028 00029 namespace nux 00030 { 00031 00032 // Conventional Attribute Binding Generic Attribute Binding 00033 // ------------------------------ ------------------------- 00034 // vertex.position vertex.attrib[0] 00035 // vertex.weight vertex.attrib[1] 00036 // vertex.weight[0] vertex.attrib[1] 00037 // vertex.normal vertex.attrib[2] 00038 // vertex.color vertex.attrib[3] 00039 // vertex.color.primary vertex.attrib[3] 00040 // vertex.color.secondary vertex.attrib[4] 00041 // vertex.fogcoord vertex.attrib[5] 00042 // vertex.texcoord vertex.attrib[8] 00043 // vertex.texcoord[0] vertex.attrib[8] 00044 // vertex.texcoord[1] vertex.attrib[9] 00045 // vertex.texcoord[2] vertex.attrib[10] 00046 // vertex.texcoord[3] vertex.attrib[11] 00047 // vertex.texcoord[4] vertex.attrib[12] 00048 // vertex.texcoord[5] vertex.attrib[13] 00049 // vertex.texcoord[6] vertex.attrib[14] 00050 // vertex.texcoord[7] vertex.attrib[15] 00051 // vertex.texcoord[n] vertex.attrib[8+n] 00052 00053 // # Vertex Attribute Registers 00054 // # attribute Register Components Underlying State 00055 // # vertex.position (x,y,z,w) object position 00056 // # vertex.weight (w,w,w,w) vertex weights 0-3 00057 // # vertex.weight[n] (w,w,w,w) vertex weights n-n+3 00058 // # vertex.normal (x,y,z,1) NORMAL 00059 // # vertex.color (r,g,b,a) primary color 00060 // # vertex.color.primary (r,g,b,a) primary color 00061 // # vertex.color.secondary (r,g,b,a) secondary color 00062 // # vertex.fogcoord (f,0,0,1) fog coordinate 00063 // # vertex.texcoord (s,t,r,q) texture coordinate, unit 0 00064 // # vertex.texcoord[n] (s,t,r,q) texture coordinate, unit n 00065 // # vertex.matrixindex (i,i,i,i) vertex matrix indices 0-3 00066 // # vertex.matrixindex[n] (i,i,i,i) vertex matrix indices n-n+3 00067 // # vertex.attrib[n] (x,y,z,w) generic vertex attribute n 00068 // 00069 // 00070 // # Result Register Components Description 00071 // # result.position (x,y,z,w) position in clip coordinates 00072 // # result.color (r,g,b,a) front-facing, primary color 00073 // # result.color.primary (r,g,b,a) front-facing, primary color 00074 // # result.color.front (r,g,b,a) front-facing, primary color 00075 // # result.color.front.primary (r,g,b,a) front-facing, primary color 00076 // # result.color.front.secondary (r,g,b,a) front-facing, secondary color 00077 // # result.color.back (r,g,b,a) back-facing, primary color 00078 // # result.color.back.primary (r,g,b,a) back-facing, primary color 00079 // # result.color.back.secondary (r,g,b,a) back-facing, secondary color 00080 // # result.fogcoord (f,*,*,*) fog coordinate 00081 // # result.pointsize (s,*,*,*) point size 00082 // # result.texcoord (s,t,r,q) texture coordinate, unit 0 00083 // # result.color.secondary (r,g,b,a) front-facing, secondary color 00084 // # result.texcoord[n] (s,t,r,q) texture coordinate, unit n 00085 00086 // # Fragment Attribute Binding Components Underlying State 00087 // # -------------------------- ---------- ---------------------------- 00088 // # fragment.color (r,g,b,a) primary color 00089 // # fragment.color.primary (r,g,b,a) primary color 00090 // # fragment.color.secondary (r,g,b,a) secondary color 00091 // # fragment.texcoord (s,t,r,q) texture coordinate, unit 0 00092 // # fragment.texcoord[n] (s,t,r,q) texture coordinate, unit n 00093 // # fragment.fogcoord (f,0,0,1) fog distance/coordinate 00094 // # fragment.position (x,y,z,1/w) window position 00095 00096 00097 // # Fragment Program Results Components Description 00098 // # ----------------------------- ---------- ---------------------------- 00099 // # result.color (r,g,b,a) color 00100 // # result.depth (*,*,d,*) depth coordinate 00101 00102 00103 void GraphicsEngine::InitAsmColorShader() 00104 { 00105 NString AsmVtx = TEXT ( 00106 "!!ARBvp1.0 \n\ 00107 ATTRIB iPos = vertex.position; \n\ 00108 ATTRIB iColor = vertex.attrib[3]; \n\ 00109 PARAM mvp[4] = {state.matrix.mvp}; \n\ 00110 OUTPUT oPos = result.position; \n\ 00111 OUTPUT oColor = result.color; \n\ 00112 # Transform the vertex to clip coordinates. \n\ 00113 DP4 oPos.x, mvp[0], iPos; \n\ 00114 DP4 oPos.y, mvp[1], iPos; \n\ 00115 DP4 oPos.z, mvp[2], iPos; \n\ 00116 DP4 oPos.w, mvp[3], iPos; \n\ 00117 MOV oColor, iColor; \n\ 00118 END"); 00119 00120 NString AsmFrg = TEXT ( 00121 "!!ARBfp1.0 \n\ 00122 MOV result.color, fragment.color; \n\ 00123 END"); 00124 00125 m_AsmColor = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00126 m_AsmColor->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00127 m_AsmColor->LoadPixelShader (AsmFrg.GetTCharPtr() ); 00128 m_AsmColor->Link(); 00129 } 00130 00131 void GraphicsEngine::InitAsmTextureShader() 00132 { 00133 NString AsmVtx = TEXT ( 00134 "!!ARBvp1.0 \n\ 00135 ATTRIB iPos = vertex.position; \n\ 00136 ATTRIB iColor = vertex.attrib[3]; \n\ 00137 PARAM mvp[4] = {state.matrix.mvp}; \n\ 00138 OUTPUT oPos = result.position; \n\ 00139 OUTPUT oColor = result.color; \n\ 00140 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 00141 # Transform the vertex to clip coordinates. \n\ 00142 DP4 oPos.x, mvp[0], iPos; \n\ 00143 DP4 oPos.y, mvp[1], iPos; \n\ 00144 DP4 oPos.z, mvp[2], iPos; \n\ 00145 DP4 oPos.w, mvp[3], iPos; \n\ 00146 MOV oColor, iColor; \n\ 00147 MOV oTexCoord0, vertex.attrib[8]; \n\ 00148 END"); 00149 00150 NString AsmFrg = TEXT ( 00151 "!!ARBfp1.0 \n\ 00152 TEMP tex0; \n\ 00153 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00154 MUL result.color, fragment.color, tex0; \n\ 00155 END"); 00156 00157 NString AsmFrgRect = TEXT ( 00158 "!!ARBfp1.0 \n\ 00159 TEMP tex0; \n\ 00160 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 00161 MUL result.color, fragment.color, tex0; \n\ 00162 END"); 00163 00164 m_AsmTextureModColor = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00165 m_AsmTextureModColor->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00166 m_AsmTextureModColor->LoadPixelShader (AsmFrg.GetTCharPtr() ); 00167 m_AsmTextureModColor->Link(); 00168 00169 m_AsmTextureRectModColor = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00170 m_AsmTextureRectModColor->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00171 m_AsmTextureRectModColor->LoadPixelShader (AsmFrgRect.GetTCharPtr() ); 00172 m_AsmTextureRectModColor->Link(); 00173 } 00174 00175 void GraphicsEngine::InitAsmColorModTexMaskAlpha() 00176 { 00177 NString AsmVtx = TEXT ( 00178 "!!ARBvp1.0 \n\ 00179 OUTPUT oPos = result.position; \n\ 00180 OUTPUT oColor = result.color; \n\ 00181 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 00182 # Transform the vertex to clip coordinates. \n\ 00183 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 00184 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 00185 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 00186 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 00187 MOV oColor, vertex.attrib[3]; \n\ 00188 MOV oTexCoord0, vertex.attrib[8]; \n\ 00189 END"); 00190 00191 NString AsmFrg = TEXT ( 00192 "!!ARBfp1.0 \n\ 00193 TEMP tex0; \n\ 00194 TEMP temp; \n\ 00195 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00196 MOV temp, fragment.color; \n\ 00197 MUL temp.w, fragment.color, tex0.wwww; \n\ 00198 MOV result.color, temp; \n\ 00199 END"); 00200 00201 NString AsmFrgRect = TEXT ( 00202 "!!ARBfp1.0 \n\ 00203 TEMP tex0; \n\ 00204 TEMP temp; \n\ 00205 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 00206 MOV temp, fragment.color; \n\ 00207 MUL temp.w, fragment.color, tex0.wwww; \n\ 00208 MOV result.color, temp; \n\ 00209 END"); 00210 00211 m_AsmColorModTexMaskAlpha = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00212 m_AsmColorModTexMaskAlpha->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00213 m_AsmColorModTexMaskAlpha->LoadPixelShader (AsmFrg.GetTCharPtr() ); 00214 m_AsmColorModTexMaskAlpha->Link(); 00215 00216 m_AsmColorModTexRectMaskAlpha = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00217 m_AsmColorModTexRectMaskAlpha->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00218 m_AsmColorModTexRectMaskAlpha->LoadPixelShader (AsmFrgRect.GetTCharPtr() ); 00219 m_AsmColorModTexRectMaskAlpha->Link(); 00220 } 00221 00222 void GraphicsEngine::InitAsm2TextureAdd() 00223 { 00224 NString AsmVtx = TEXT ( 00225 "!!ARBvp1.0 \n\ 00226 ATTRIB iPos = vertex.position; \n\ 00227 OUTPUT oPos = result.position; \n\ 00228 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 00229 OUTPUT oTexCoord1 = result.texcoord[1]; \n\ 00230 # Transform the vertex to clip coordinates. \n\ 00231 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 00232 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 00233 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 00234 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 00235 MOV oTexCoord0, vertex.attrib[8]; \n\ 00236 MOV oTexCoord1, vertex.attrib[9]; \n\ 00237 END"); 00238 00239 NString AsmFrg = TEXT ( 00240 "!!ARBfp1.0 \n\ 00241 PARAM color0 = program.local[0]; \n\ 00242 PARAM color1 = program.local[1]; \n\ 00243 TEMP tex0; \n\ 00244 TEMP tex1; \n\ 00245 TEMP temp; \n\ 00246 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00247 MUL temp, color0, tex0; \n\ 00248 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00249 MAD temp, color1, tex1, temp; \n\ 00250 MOV result.color, temp; \n\ 00251 END"); 00252 00253 NString AsmFrgRect = TEXT ( 00254 "!!ARBfp1.0 \n\ 00255 PARAM color0 = program.local[0]; \n\ 00256 PARAM color1 = program.local[1]; \n\ 00257 TEMP tex0; \n\ 00258 TEMP tex1; \n\ 00259 TEMP temp; \n\ 00260 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 00261 MUL temp, color0, tex0; \n\ 00262 TEX tex1, fragment.texcoord[1], texture[1], RECT; \n\ 00263 MAD temp, color1, tex1, temp; \n\ 00264 MOV result.color, temp; \n\ 00265 END"); 00266 00267 m_Asm2TextureAdd = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00268 m_Asm2TextureAdd->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00269 m_Asm2TextureAdd->LoadPixelShader (AsmFrg.GetTCharPtr() ); 00270 m_Asm2TextureAdd->Link(); 00271 00272 m_Asm2TextureRectAdd = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00273 m_Asm2TextureRectAdd->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00274 m_Asm2TextureRectAdd->LoadPixelShader (AsmFrgRect.GetTCharPtr() ); 00275 m_Asm2TextureRectAdd->Link(); 00276 } 00277 00278 void GraphicsEngine::InitAsm2TextureDepRead () 00279 { 00280 NString AsmVtx = TEXT ( 00281 "!!ARBvp1.0 \n\ 00282 ATTRIB iPos = vertex.position; \n\ 00283 OUTPUT oPos = result.position; \n\ 00284 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 00285 OUTPUT oTexCoord1 = result.texcoord[1]; \n\ 00286 # Transform the vertex to clip coordinates. \n\ 00287 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 00288 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 00289 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 00290 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 00291 MOV oTexCoord0, vertex.attrib[8]; \n\ 00292 MOV oTexCoord1, vertex.attrib[9]; \n\ 00293 END"); 00294 00295 NString AsmFrg = TEXT ( 00296 "!!ARBfp1.0 \n\ 00297 PARAM color0 = program.local[0]; \n\ 00298 PARAM color1 = program.local[1]; \n\ 00299 TEMP tex0; \n\ 00300 TEMP tex1; \n\ 00301 TEMP temp; \n\ 00302 TEMP temp0; \n\ 00303 TEMP temp1; \n\ 00304 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00305 MAD temp, {2.0, 2.0, 2.0, 2.0}, tex0, {-1.0, -1.0, -1.0, -1.0}; \n\ 00306 MUL temp0, color0, temp; \n\ 00307 ADD temp1, texture[1]; \n\ 00308 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00309 MUL result.color, color1, tex1; \n\ 00310 END"); 00311 00312 NString AsmFrgRect = TEXT ( 00313 "!!ARBfp1.0 \n\ 00314 PARAM color0 = program.local[0]; \n\ 00315 PARAM color1 = program.local[1]; \n\ 00316 TEMP tex0; \n\ 00317 TEMP tex1; \n\ 00318 TEMP temp; \n\ 00319 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 00320 MAD temp, {2.0, 2.0, 2.0, 2.0}, tex0, {-1.0, -1.0, -1.0, -1.0}; \n\ 00321 MUL temp, color0, tex0; \n\ 00322 TEX tex1, fragment.texcoord[1], temp, RECT; \n\ 00323 MUL result.color, color1, tex1; \n\ 00324 END"); 00325 00326 m_ASM2TextureDepRead = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 00327 m_ASM2TextureDepRead->LoadVertexShader (AsmVtx.GetTCharPtr ()); 00328 m_ASM2TextureDepRead->LoadPixelShader (AsmFrg.GetTCharPtr ()); 00329 m_ASM2TextureDepRead->Link (); 00330 00331 m_ASM2TextureRectDepRead = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 00332 m_ASM2TextureRectDepRead->LoadVertexShader (AsmVtx.GetTCharPtr ()); 00333 m_ASM2TextureRectDepRead->LoadPixelShader (AsmFrgRect.GetTCharPtr ()); 00334 m_ASM2TextureRectDepRead->Link (); 00335 } 00336 00337 void GraphicsEngine::InitAsm2TextureMod() 00338 { 00339 NString AsmVtx = TEXT ( 00340 "!!ARBvp1.0 \n\ 00341 ATTRIB iPos = vertex.position; \n\ 00342 OUTPUT oPos = result.position; \n\ 00343 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 00344 OUTPUT oTexCoord1 = result.texcoord[1]; \n\ 00345 # Transform the vertex to clip coordinates. \n\ 00346 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 00347 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 00348 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 00349 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 00350 MOV oTexCoord0, vertex.attrib[8]; \n\ 00351 MOV oTexCoord1, vertex.attrib[9]; \n\ 00352 END"); 00353 00354 NString AsmFrg = TEXT ( 00355 "!!ARBfp1.0 \n\ 00356 PARAM color0 = program.local[0]; \n\ 00357 PARAM color1 = program.local[1]; \n\ 00358 TEMP tex0; \n\ 00359 TEMP tex1; \n\ 00360 TEMP temp0; \n\ 00361 TEMP temp1; \n\ 00362 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00363 MUL temp0, color0, tex0; \n\ 00364 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00365 MUL temp1, color1, tex1; \n\ 00366 MUL result.color, temp0, temp1; \n\ 00367 END"); 00368 00369 NString AsmFrgRect = TEXT ( 00370 "!!ARBfp1.0 \n\ 00371 PARAM color0 = program.local[0]; \n\ 00372 PARAM color1 = program.local[1]; \n\ 00373 TEMP tex0; \n\ 00374 TEMP tex1; \n\ 00375 TEMP temp0; \n\ 00376 TEMP temp1; \n\ 00377 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 00378 MUL temp0, color0, tex0; \n\ 00379 TEX tex1, fragment.texcoord[1], texture[1], RECT; \n\ 00380 MUL temp1, color1, tex1; \n\ 00381 MUL result.color, temp0, temp1; \n\ 00382 END"); 00383 00384 m_Asm2TextureMod = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00385 m_Asm2TextureMod->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00386 m_Asm2TextureMod->LoadPixelShader (AsmFrg.GetTCharPtr() ); 00387 m_Asm2TextureMod->Link(); 00388 00389 m_Asm2TextureRectMod = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00390 m_Asm2TextureRectMod->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00391 m_Asm2TextureRectMod->LoadPixelShader (AsmFrgRect.GetTCharPtr() ); 00392 m_Asm2TextureRectMod->Link(); 00393 } 00394 00395 void GraphicsEngine::InitAsm4TextureAdd() 00396 { 00397 NString AsmVtx = TEXT ( 00398 "!!ARBvp1.0 \n\ 00399 ATTRIB iPos = vertex.position; \n\ 00400 OUTPUT oPos = result.position; \n\ 00401 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 00402 OUTPUT oTexCoord1 = result.texcoord[1]; \n\ 00403 OUTPUT oTexCoord2 = result.texcoord[2]; \n\ 00404 OUTPUT oTexCoord3 = result.texcoord[3]; \n\ 00405 # Transform the vertex to clip coordinates. \n\ 00406 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 00407 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 00408 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 00409 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 00410 MOV oTexCoord0, vertex.attrib[8]; \n\ 00411 MOV oTexCoord1, vertex.attrib[9]; \n\ 00412 MOV oTexCoord2, vertex.attrib[10]; \n\ 00413 MOV oTexCoord3, vertex.attrib[11]; \n\ 00414 END"); 00415 00416 NString AsmFrg = TEXT ( 00417 "!!ARBfp1.0 \n\ 00418 PARAM color0 = program.local[0]; \n\ 00419 PARAM color1 = program.local[1]; \n\ 00420 PARAM color2 = program.local[2]; \n\ 00421 PARAM color3 = program.local[3]; \n\ 00422 TEMP tex0; \n\ 00423 TEMP tex1; \n\ 00424 TEMP tex2; \n\ 00425 TEMP tex3; \n\ 00426 TEMP temp; \n\ 00427 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00428 MUL temp, color0, tex0; \n\ 00429 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00430 MAD temp, color1, tex1, temp; \n\ 00431 TEX tex2, fragment.texcoord[2], texture[2], 2D; \n\ 00432 MAD temp, color2, tex2, temp; \n\ 00433 TEX tex3, fragment.texcoord[3], texture[3], 2D; \n\ 00434 MAD temp, color3, tex3, temp; \n\ 00435 MOV result.color, temp; \n\ 00436 END"); 00437 00438 NString AsmFrgRect = TEXT ( 00439 "!!ARBfp1.0 \n\ 00440 PARAM color0 = program.local[0]; \n\ 00441 PARAM color1 = program.local[1]; \n\ 00442 PARAM color2 = program.local[2]; \n\ 00443 PARAM color3 = program.local[3]; \n\ 00444 TEMP tex0; \n\ 00445 TEMP tex1; \n\ 00446 TEMP tex2; \n\ 00447 TEMP tex3; \n\ 00448 TEMP temp; \n\ 00449 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 00450 MUL temp, color0, tex0; \n\ 00451 TEX tex1, fragment.texcoord[1], texture[1], RECT; \n\ 00452 MAD temp, color1, tex1, temp; \n\ 00453 TEX tex2, fragment.texcoord[2], texture[2], RECT; \n\ 00454 MAD temp, color2, tex2, temp; \n\ 00455 TEX tex3, fragment.texcoord[3], texture[3], RECT; \n\ 00456 MAD temp, color3, tex3, temp; \n\ 00457 MOV result.color, temp; \n\ 00458 END"); 00459 00460 m_Asm4TextureAdd = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00461 m_Asm4TextureAdd->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00462 m_Asm4TextureAdd->LoadPixelShader (AsmFrg.GetTCharPtr() ); 00463 m_Asm4TextureAdd->Link(); 00464 00465 m_Asm4TextureRectAdd = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00466 m_Asm4TextureRectAdd->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00467 m_Asm4TextureRectAdd->LoadPixelShader (AsmFrgRect.GetTCharPtr() ); 00468 m_Asm4TextureRectAdd->Link(); 00469 } 00470 00471 void GraphicsEngine::InitAsmBlendModes() 00472 { 00473 NString AsmVtx = TEXT ( 00474 "!!ARBvp1.0 \n\ 00475 OUTPUT oPos = result.position; \n\ 00476 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 00477 OUTPUT oTexCoord1 = result.texcoord[1]; \n\ 00478 # Transform the vertex to clip coordinates. \n\ 00479 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 00480 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 00481 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 00482 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 00483 MOV oTexCoord0, vertex.attrib[8]; \n\ 00484 MOV oTexCoord1, vertex.attrib[9]; \n\ 00485 END"); 00486 00487 NString AsmPSBNormal = TEXT ( 00488 "!!ARBfp1.0 \n\ 00489 TEMP tex0; \n\ 00490 TEMP tex1; \n\ 00491 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00492 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00493 MOV result.color, tex0; \n\ 00494 END"); 00495 00496 m_AsmPSBNormal = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00497 m_AsmPSBNormal->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00498 m_AsmPSBNormal->LoadPixelShader (AsmPSBNormal.GetTCharPtr() ); 00499 m_AsmPSBNormal->Link(); 00500 00501 // Lighten 00502 NString AsmPSBLighten = TEXT ( 00503 "!!ARBfp1.0 \n\ 00504 TEMP tex0; \n\ 00505 TEMP tex1; \n\ 00506 TEMP temp; \n\ 00507 TEMP cmpres; \n\ 00508 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00509 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00510 SUB temp, tex0, tex1; \n\ 00511 CMP cmpres, temp, tex1, tex0; \n\ 00512 MOV result.color, temp; \n\ 00513 END"); 00514 00515 m_AsmPSBLighten = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00516 m_AsmPSBLighten->LoadVertexShader (AsmVtx.GetTCharPtr() ); 00517 m_AsmPSBLighten->LoadPixelShader (AsmPSBLighten.GetTCharPtr() ); 00518 m_AsmPSBLighten->Link(); 00519 00520 // Darken 00521 NString AsmPSBDarken = TEXT ( 00522 "!!ARBfp1.0 \n\ 00523 TEMP tex0; \n\ 00524 TEMP tex1; \n\ 00525 TEMP temp; \n\ 00526 TEMP cmpres; \n\ 00527 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00528 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00529 SUB temp, tex1, tex0; \n\ 00530 CMP cmpres, temp, tex1, tex0; \n\ 00531 MOV result.color, temp; \n\ 00532 END"); 00533 00534 m_AsmPSBDarken = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 00535 m_AsmPSBDarken->LoadVertexShader (AsmVtx.GetTCharPtr ()); 00536 m_AsmPSBDarken->LoadPixelShader (AsmPSBDarken.GetTCharPtr ()); 00537 m_AsmPSBDarken->Link (); 00538 00539 // Multiply 00540 NString AsmPSBMultiply = TEXT ( 00541 "!!ARBfp1.0 \n\ 00542 TEMP tex0; \n\ 00543 TEMP tex1; \n\ 00544 TEMP temp; \n\ 00545 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 00546 TEX tex1, fragment.texcoord[1], texture[1], 2D; \n\ 00547 MUL result.color, tex0, tex1; \n\ 00548 END"); 00549 00550 m_AsmPSBMultiply = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 00551 m_AsmPSBMultiply->LoadVertexShader (AsmVtx.GetTCharPtr ()); 00552 m_AsmPSBMultiply->LoadPixelShader (AsmPSBMultiply.GetTCharPtr ()); 00553 m_AsmPSBMultiply->Link (); 00554 } 00555 00556 00557 00558 void GraphicsEngine::QRP_ASM_Color (int x, int y, int width, int height, const Color &c0) 00559 { 00560 QRP_ASM_Color (x, y, width, height, c0, c0, c0, c0); 00561 } 00562 00563 void GraphicsEngine::QRP_ASM_Color (int x, int y, int width, int height, const Color &c0, const Color &c1, const Color &c2, const Color &c3) 00564 { 00565 NUX_RETURN_IF_FALSE (m_AsmColor.IsValid()); 00566 00567 float fx = x, fy = y; 00568 float VtxBuffer[] = 00569 { 00570 fx, fy, 0.0f, 1.0f, c0.red, c0.green, c0.blue, c0.alpha, 00571 fx, fy + height, 0.0f, 1.0f, c1.red, c1.green, c1.blue, c1.alpha, 00572 fx + width, fy + height, 0.0f, 1.0f, c2.red, c2.green, c2.blue, c2.alpha, 00573 fx + width, fy, 0.0f, 1.0f, c3.red, c3.green, c3.blue, c3.alpha, 00574 }; 00575 00576 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 00577 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 00578 00579 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_AsmColor; 00580 00581 shader_program->Begin(); 00582 00583 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 00584 CHECKGL ( glLoadIdentity() ); 00585 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 00586 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 00587 CHECKGL ( glLoadIdentity() ); 00588 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 00589 00590 00591 int VertexLocation = VTXATTRIB_POSITION; 00592 int VertexColorLocation = VTXATTRIB_COLOR; 00593 00594 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 00595 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer) ); 00596 00597 if (VertexColorLocation != -1) 00598 { 00599 CHECKGL ( glEnableVertexAttribArrayARB (VertexColorLocation) ); 00600 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexColorLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer + 4) ); 00601 } 00602 00603 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 00604 00605 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 00606 00607 if (VertexColorLocation != -1) 00608 CHECKGL ( glDisableVertexAttribArrayARB (VertexColorLocation) ); 00609 00610 shader_program->End(); 00611 } 00612 00613 void GraphicsEngine::QRP_ASM_1Tex (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &color) 00614 { 00615 NUX_RETURN_IF_FALSE (m_AsmTextureModColor.IsValid()); 00616 NUX_RETURN_IF_FALSE (m_AsmTextureRectModColor.IsValid()); 00617 00618 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 00619 float fx = x, fy = y; 00620 float VtxBuffer[] = 00621 { 00622 fx, fy, 0.0f, 1.0f, texxform.u0, texxform.v0, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00623 fx, fy + height, 0.0f, 1.0f, texxform.u0, texxform.v1, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00624 fx + width, fy + height, 0.0f, 1.0f, texxform.u1, texxform.v1, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00625 fx + width, fy, 0.0f, 1.0f, texxform.u1, texxform.v0, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00626 }; 00627 00628 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 00629 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 00630 00631 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_AsmTextureModColor; 00632 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 00633 { 00634 shader_program = m_AsmTextureRectModColor; 00635 } 00636 shader_program->Begin(); 00637 00638 SetTexture (GL_TEXTURE0, device_texture); 00639 00640 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 00641 CHECKGL ( glLoadIdentity() ); 00642 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 00643 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 00644 CHECKGL ( glLoadIdentity() ); 00645 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 00646 00647 00648 int VertexLocation = VTXATTRIB_POSITION; 00649 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 00650 int VertexColorLocation = VTXATTRIB_COLOR; 00651 00652 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 00653 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer) ); 00654 00655 if (TextureCoord0Location != -1) 00656 { 00657 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 00658 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 4) ); 00659 } 00660 00661 if (VertexColorLocation != -1) 00662 { 00663 CHECKGL ( glEnableVertexAttribArrayARB (VertexColorLocation) ); 00664 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexColorLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 8) ); 00665 } 00666 00667 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 00668 00669 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 00670 00671 if (TextureCoord0Location != -1) 00672 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 00673 00674 if (VertexColorLocation != -1) 00675 CHECKGL ( glDisableVertexAttribArrayARB (VertexColorLocation) ); 00676 00677 shader_program->End(); 00678 } 00679 00680 void GraphicsEngine::QRP_ASM_ColorModTexAlpha (int x, int y, int width, int height, 00681 ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &color) 00682 { 00683 NUX_RETURN_IF_FALSE (m_AsmColorModTexMaskAlpha.IsValid()); 00684 NUX_RETURN_IF_FALSE (m_AsmColorModTexRectMaskAlpha.IsValid()); 00685 00686 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 00687 00688 float fx = x, fy = y; 00689 float VtxBuffer[] = 00690 { 00691 fx, fy, 0.0f, 1.0f, texxform.u0, texxform.v0, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00692 fx, fy + height, 0.0f, 1.0f, texxform.u0, texxform.v1, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00693 fx + width, fy + height, 0.0f, 1.0f, texxform.u1, texxform.v1, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00694 fx + width, fy, 0.0f, 1.0f, texxform.u1, texxform.v0, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 00695 }; 00696 00697 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 00698 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 00699 00700 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_AsmColorModTexMaskAlpha; 00701 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 00702 { 00703 shader_program = m_AsmColorModTexRectMaskAlpha; 00704 } 00705 shader_program->Begin(); 00706 00707 SetTexture (GL_TEXTURE0, device_texture); 00708 00709 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 00710 CHECKGL ( glLoadIdentity() ); 00711 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 00712 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 00713 CHECKGL ( glLoadIdentity() ); 00714 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 00715 00716 00717 int VertexLocation = VTXATTRIB_POSITION; 00718 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 00719 int VertexColorLocation = VTXATTRIB_COLOR; 00720 00721 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 00722 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer) ); 00723 00724 if (TextureCoord0Location != -1) 00725 { 00726 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 00727 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 4) ); 00728 } 00729 00730 if (VertexColorLocation != -1) 00731 { 00732 CHECKGL ( glEnableVertexAttribArrayARB (VertexColorLocation) ); 00733 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexColorLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 8) ); 00734 } 00735 00736 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 00737 00738 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 00739 00740 if (TextureCoord0Location != -1) 00741 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 00742 00743 if (VertexColorLocation != -1) 00744 CHECKGL ( glDisableVertexAttribArrayARB (VertexColorLocation) ); 00745 00746 shader_program->End(); 00747 } 00748 00749 void GraphicsEngine::QRP_ASM_2Tex (int x, int y, int width, int height, 00750 ObjectPtr<IOpenGLBaseTexture> device_texture0, TexCoordXForm &texxform0, const Color &color0, 00751 ObjectPtr<IOpenGLBaseTexture> device_texture1, TexCoordXForm &texxform1, const Color &color1) 00752 { 00753 NUX_RETURN_IF_FALSE (m_Asm2TextureAdd.IsValid()); 00754 NUX_RETURN_IF_FALSE (m_Asm2TextureRectAdd.IsValid()); 00755 00756 QRP_Compute_Texture_Coord (width, height, device_texture0, texxform0); 00757 QRP_Compute_Texture_Coord (width, height, device_texture1, texxform1); 00758 00759 float fx = x, fy = y; 00760 float VtxBuffer[] = 00761 { 00762 fx, fy, 0.0f, 1.0f, texxform0.u0, texxform0.v0, 0.0f, 1.0f, texxform1.u0, texxform1.v0, 0.0f, 1.0f, 00763 fx, fy + height, 0.0f, 1.0f, texxform0.u0, texxform0.v1, 0.0f, 1.0f, texxform1.u0, texxform1.v1, 0.0f, 1.0f, 00764 fx + width, fy + height, 0.0f, 1.0f, texxform0.u1, texxform0.v1, 0.0f, 1.0f, texxform1.u1, texxform1.v1, 0.0f, 1.0f, 00765 fx + width, fy, 0.0f, 1.0f, texxform0.u1, texxform0.v0, 0.0f, 1.0f, texxform1.u1, texxform1.v0, 0.0f, 1.0f, 00766 }; 00767 00768 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 00769 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 00770 00771 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_Asm2TextureAdd; 00772 if(device_texture0->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 00773 { 00774 shader_program = m_Asm2TextureRectAdd; 00775 } 00776 shader_program->Begin(); 00777 00778 SetTexture (GL_TEXTURE0, device_texture0); 00779 SetTexture (GL_TEXTURE1, device_texture1); 00780 00781 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 00782 CHECKGL ( glLoadIdentity() ); 00783 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 00784 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 00785 CHECKGL ( glLoadIdentity() ); 00786 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 00787 00788 int VertexLocation = VTXATTRIB_POSITION; 00789 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 00790 int TextureCoord1Location = VTXATTRIB_TEXCOORD1; 00791 00792 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, color0.red, color0.green, color0.blue, color0.alpha ) ); 00793 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, color1.red, color1.green, color1.blue, color1.alpha ) ); 00794 00795 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 00796 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer) ); 00797 00798 if (TextureCoord0Location != -1) 00799 { 00800 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 00801 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 4) ); 00802 } 00803 00804 if (TextureCoord1Location != -1) 00805 { 00806 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord1Location) ); 00807 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord1Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 8) ); 00808 } 00809 00810 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 00811 00812 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 00813 00814 if (TextureCoord0Location != -1) 00815 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 00816 00817 if (TextureCoord1Location != -1) 00818 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord1Location) ); 00819 00820 shader_program->End(); 00821 } 00822 00823 void GraphicsEngine::QRP_ASM_DisturbedTexture ( 00824 int x, int y, int width, int height, 00825 ObjectPtr<IOpenGLBaseTexture> distorsion_texture, TexCoordXForm &texxform0, const Color& c0, 00826 ObjectPtr<IOpenGLBaseTexture> src_device_texture, TexCoordXForm &texxform1, const Color& c1) 00827 { 00828 NUX_RETURN_IF_FALSE (m_ASM2TextureDepRead.IsValid()); 00829 NUX_RETURN_IF_FALSE (m_ASM2TextureRectDepRead.IsValid()); 00830 00831 QRP_Compute_Texture_Coord (width, height, distorsion_texture, texxform0); 00832 QRP_Compute_Texture_Coord (width, height, src_device_texture, texxform1); 00833 00834 float fx = x, fy = y; 00835 float VtxBuffer[] = 00836 { 00837 fx, fy, 0.0f, 1.0f, texxform0.u0, texxform0.v0, 0.0f, 1.0f, texxform1.u0, texxform1.v0, 0.0f, 1.0f, 00838 fx, fy + height, 0.0f, 1.0f, texxform0.u0, texxform0.v1, 0.0f, 1.0f, texxform1.u0, texxform1.v1, 0.0f, 1.0f, 00839 fx + width, fy + height, 0.0f, 1.0f, texxform0.u1, texxform0.v1, 0.0f, 1.0f, texxform1.u1, texxform1.v1, 0.0f, 1.0f, 00840 fx + width, fy, 0.0f, 1.0f, texxform0.u1, texxform0.v0, 0.0f, 1.0f, texxform1.u1, texxform1.v0, 0.0f, 1.0f, 00841 }; 00842 00843 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 00844 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 00845 00846 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_ASM2TextureDepRead; 00847 if(src_device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 00848 { 00849 shader_program = m_ASM2TextureRectDepRead; 00850 } 00851 shader_program->Begin(); 00852 00853 SetTexture (GL_TEXTURE0, distorsion_texture); 00854 SetTexture (GL_TEXTURE1, src_device_texture); 00855 00856 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 00857 CHECKGL ( glLoadIdentity() ); 00858 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 00859 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 00860 CHECKGL ( glLoadIdentity() ); 00861 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 00862 00863 int VertexLocation = VTXATTRIB_POSITION; 00864 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 00865 int TextureCoord1Location = VTXATTRIB_TEXCOORD1; 00866 00867 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, c0.red, c0.green, c0.blue, c0.alpha ) ); 00868 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, c1.red, c1.green, c1.blue, c1.alpha ) ); 00869 00870 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 00871 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer) ); 00872 00873 if (TextureCoord0Location != -1) 00874 { 00875 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 00876 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 4) ); 00877 } 00878 00879 if (TextureCoord1Location != -1) 00880 { 00881 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord1Location) ); 00882 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord1Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 8) ); 00883 } 00884 00885 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 00886 00887 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 00888 00889 if (TextureCoord0Location != -1) 00890 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 00891 00892 if (TextureCoord1Location != -1) 00893 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord1Location) ); 00894 00895 shader_program->End(); 00896 } 00897 00898 void GraphicsEngine::QRP_ASM_2TexMod (int x, int y, int width, int height, 00899 ObjectPtr<IOpenGLBaseTexture> device_texture0, TexCoordXForm &texxform0, const Color &color0, 00900 ObjectPtr<IOpenGLBaseTexture> device_texture1, TexCoordXForm &texxform1, const Color &color1) 00901 { 00902 NUX_RETURN_IF_FALSE (m_Asm2TextureMod.IsValid()); 00903 NUX_RETURN_IF_FALSE (m_Asm2TextureRectMod.IsValid()); 00904 00905 QRP_Compute_Texture_Coord (width, height, device_texture0, texxform0); 00906 QRP_Compute_Texture_Coord (width, height, device_texture1, texxform1); 00907 00908 float fx = x, fy = y; 00909 float VtxBuffer[] = 00910 { 00911 fx, fy, 0.0f, 1.0f, texxform0.u0, texxform0.v0, 0.0f, 1.0f, texxform1.u0, texxform1.v0, 0.0f, 1.0f, 00912 fx, fy + height, 0.0f, 1.0f, texxform0.u0, texxform0.v1, 0.0f, 1.0f, texxform1.u0, texxform1.v1, 0.0f, 1.0f, 00913 fx + width, fy + height, 0.0f, 1.0f, texxform0.u1, texxform0.v1, 0.0f, 1.0f, texxform1.u1, texxform1.v1, 0.0f, 1.0f, 00914 fx + width, fy, 0.0f, 1.0f, texxform0.u1, texxform0.v0, 0.0f, 1.0f, texxform1.u1, texxform1.v0, 0.0f, 1.0f, 00915 }; 00916 00917 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 00918 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 00919 00920 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_Asm2TextureMod; 00921 if(device_texture0->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 00922 { 00923 shader_program = m_Asm2TextureRectMod; 00924 } 00925 shader_program->Begin(); 00926 00927 SetTexture (GL_TEXTURE0, device_texture0); 00928 SetTexture (GL_TEXTURE1, device_texture1); 00929 00930 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 00931 CHECKGL ( glLoadIdentity() ); 00932 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 00933 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 00934 CHECKGL ( glLoadIdentity() ); 00935 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 00936 00937 int VertexLocation = VTXATTRIB_POSITION; 00938 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 00939 int TextureCoord1Location = VTXATTRIB_TEXCOORD1; 00940 00941 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, color0.red, color0.green, color0.blue, color0.alpha ) ); 00942 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, color1.red, color1.green, color1.blue, color1.alpha ) ); 00943 00944 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 00945 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer) ); 00946 00947 if (TextureCoord0Location != -1) 00948 { 00949 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 00950 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 4) ); 00951 } 00952 00953 if (TextureCoord1Location != -1) 00954 { 00955 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord1Location) ); 00956 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord1Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 8) ); 00957 } 00958 00959 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 00960 00961 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 00962 00963 if (TextureCoord0Location != -1) 00964 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 00965 00966 if (TextureCoord1Location != -1) 00967 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord1Location) ); 00968 00969 shader_program->End(); 00970 } 00971 00972 void GraphicsEngine::QRP_ASM_4Tex (int x, int y, int width, int height, 00973 ObjectPtr<IOpenGLBaseTexture> device_texture0, TexCoordXForm &texxform0, const Color &color0, 00974 ObjectPtr<IOpenGLBaseTexture> device_texture1, TexCoordXForm &texxform1, const Color &color1, 00975 ObjectPtr<IOpenGLBaseTexture> device_texture2, TexCoordXForm &texxform2, const Color &color2, 00976 ObjectPtr<IOpenGLBaseTexture> device_texture3, TexCoordXForm &texxform3, const Color &color3) 00977 { 00978 NUX_RETURN_IF_FALSE (m_Asm4TextureAdd.IsValid()); 00979 NUX_RETURN_IF_FALSE (m_Asm4TextureRectAdd.IsValid()); 00980 00981 QRP_Compute_Texture_Coord (width, height, device_texture0, texxform0); 00982 QRP_Compute_Texture_Coord (width, height, device_texture1, texxform1); 00983 QRP_Compute_Texture_Coord (width, height, device_texture2, texxform1); 00984 QRP_Compute_Texture_Coord (width, height, device_texture3, texxform1); 00985 00986 float fx = x, fy = y; 00987 float VtxBuffer[] = 00988 { 00989 fx, fy, 0.0f, 1.0f, texxform0.u0, texxform0.v0, 0, 1.0f, texxform1.u0, texxform1.v0, 0, 1.0f, texxform2.u0, texxform2.v0, 0, 1.0f, texxform3.u0, texxform3.v0, 0, 1.0f, 00990 fx, fy + height, 0.0f, 1.0f, texxform0.u0, texxform0.v1, 0, 1.0f, texxform1.u0, texxform1.v1, 0, 1.0f, texxform2.u0, texxform2.v1, 0, 1.0f, texxform3.u0, texxform3.v1, 0, 1.0f, 00991 fx + width, fy + height, 0.0f, 1.0f, texxform0.u1, texxform0.v1, 0, 1.0f, texxform1.u1, texxform1.v1, 0, 1.0f, texxform2.u1, texxform2.v1, 0, 1.0f, texxform3.u1, texxform3.v1, 0, 1.0f, 00992 fx + width, fy, 0.0f, 1.0f, texxform0.u1, texxform0.v0, 0, 1.0f, texxform1.u1, texxform1.v0, 0, 1.0f, texxform2.u1, texxform2.v0, 0, 1.0f, texxform3.u1, texxform3.v0, 0, 1.0f, 00993 }; 00994 00995 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 00996 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 00997 00998 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_Asm4TextureAdd; 00999 if(device_texture0->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 01000 { 01001 shader_program = m_Asm4TextureRectAdd; 01002 } 01003 shader_program->Begin(); 01004 01005 SetTexture (GL_TEXTURE0, device_texture0); 01006 SetTexture (GL_TEXTURE1, device_texture1); 01007 SetTexture (GL_TEXTURE2, device_texture1); 01008 SetTexture (GL_TEXTURE3, device_texture1); 01009 01010 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01011 CHECKGL ( glLoadIdentity() ); 01012 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01013 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01014 CHECKGL ( glLoadIdentity() ); 01015 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01016 01017 int VertexLocation = VTXATTRIB_POSITION; 01018 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 01019 int TextureCoord1Location = VTXATTRIB_TEXCOORD1; 01020 int TextureCoord2Location = VTXATTRIB_TEXCOORD2; 01021 int TextureCoord3Location = VTXATTRIB_TEXCOORD3; 01022 01023 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, color0.red, color0.green, color0.blue, color0.alpha ) ); 01024 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, color1.red, color1.green, color1.blue, color1.alpha ) ); 01025 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 2, color2.red, color2.green, color2.blue, color2.alpha ) ); 01026 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 3, color3.red, color3.green, color3.blue, color3.alpha ) ); 01027 01028 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 01029 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 80, VtxBuffer) ); 01030 01031 if (TextureCoord0Location != -1) 01032 { 01033 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 01034 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 80, VtxBuffer + 4) ); 01035 } 01036 01037 if (TextureCoord1Location != -1) 01038 { 01039 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord1Location) ); 01040 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord1Location, 4, GL_FLOAT, GL_FALSE, 80, VtxBuffer + 8) ); 01041 } 01042 01043 if (TextureCoord2Location != -1) 01044 { 01045 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord2Location) ); 01046 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord2Location, 4, GL_FLOAT, GL_FALSE, 80, VtxBuffer + 12) ); 01047 } 01048 01049 if (TextureCoord3Location != -1) 01050 { 01051 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord3Location) ); 01052 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord3Location, 4, GL_FLOAT, GL_FALSE, 80, VtxBuffer + 16) ); 01053 } 01054 01055 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 01056 01057 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 01058 01059 if (TextureCoord0Location != -1) 01060 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 01061 01062 if (TextureCoord1Location != -1) 01063 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord1Location) ); 01064 01065 if (TextureCoord2Location != -1) 01066 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord2Location) ); 01067 01068 if (TextureCoord3Location != -1) 01069 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord3Location) ); 01070 01071 shader_program->End(); 01072 } 01073 01075 void GraphicsEngine::QRP_ASM_Triangle (int x0, int y0, 01076 int x1, int y1, 01077 int x2, int y2, 01078 Color c0) 01079 { 01080 QRP_ASM_Triangle (x0, y0, x1, y1, x2, y2, c0, c0, c0); 01081 } 01082 01083 void GraphicsEngine::QRP_ASM_Triangle (int x0, int y0, 01084 int x1, int y1, 01085 int x2, int y2, 01086 Color c0, Color c1, Color c2) 01087 { 01088 NUX_RETURN_IF_FALSE (m_AsmColor.IsValid()); 01089 01090 float VtxBuffer[] = 01091 { 01092 static_cast<float>(x0), static_cast<float>(y0), 0.0f, 1.0f, c0.red, c0.green, c0.blue, c0.alpha, 01093 static_cast<float>(x1), static_cast<float>(y1), 0.0f, 1.0f, c1.red, c1.green, c1.blue, c1.alpha, 01094 static_cast<float>(x2), static_cast<float>(y2), 0.0f, 1.0f, c2.red, c2.green, c2.blue, c2.alpha, 01095 }; 01096 01097 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01098 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01099 01100 ObjectPtr<IOpenGLAsmShaderProgram> ShaderProg = m_AsmColor; 01101 01102 ShaderProg->Begin(); 01103 01104 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01105 CHECKGL ( glLoadIdentity() ); 01106 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01107 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01108 CHECKGL ( glLoadIdentity() ); 01109 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01110 01111 int VertexLocation = VTXATTRIB_POSITION; 01112 int VertexColorLocation = VTXATTRIB_COLOR; 01113 01114 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 01115 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer) ); 01116 01117 CHECKGL ( glEnableVertexAttribArrayARB (VertexColorLocation) ); 01118 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexColorLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer + 4) ); 01119 01120 CHECKGL ( glDrawArrays (GL_TRIANGLES, 0, 3) ); 01121 01122 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 01123 CHECKGL ( glDisableVertexAttribArrayARB (VertexColorLocation) ); 01124 ShaderProg->End(); 01125 01126 m_triangle_stats++; 01127 } 01128 01130 // DRAW LINES // 01132 void GraphicsEngine::QRP_ASM_Line (int x0, int y0, 01133 int x1, int y1, Color c0) 01134 { 01135 QRP_ASM_Line (x0, y0, x1, y1, c0, c0); 01136 } 01137 01138 void GraphicsEngine::QRP_ASM_Line (int x0, int y0, 01139 int x1, int y1, Color c0, Color c1) 01140 { 01141 NUX_RETURN_IF_FALSE (m_AsmColor.IsValid()); 01142 01143 float VtxBuffer[] = 01144 { 01145 static_cast<float>(x0), static_cast<float>(y0), 0.0f, 1.0f, c0.red, c0.green, c0.blue, c0.alpha, 01146 static_cast<float>(x1), static_cast<float>(y1), 0.0f, 1.0f, c1.red, c1.green, c1.blue, c1.alpha, 01147 }; 01148 01149 ObjectPtr<IOpenGLAsmShaderProgram> ShaderProg = m_AsmColor; 01150 01151 01152 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01153 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01154 ShaderProg->Begin(); 01155 01156 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01157 CHECKGL ( glLoadIdentity() ); 01158 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01159 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01160 CHECKGL ( glLoadIdentity() ); 01161 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01162 01163 int VertexLocation = VTXATTRIB_POSITION; 01164 int VertexColorLocation = VTXATTRIB_COLOR; 01165 01166 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 01167 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer) ); 01168 01169 if (VertexColorLocation != -1) 01170 { 01171 CHECKGL ( glEnableVertexAttribArrayARB (VertexColorLocation) ); 01172 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexColorLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer + 4) ); 01173 } 01174 01175 CHECKGL ( glDrawArrays (GL_LINES, 0, 2) ); 01176 01177 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 01178 01179 if (VertexColorLocation != -1) 01180 CHECKGL ( glDisableVertexAttribArrayARB (VertexColorLocation) ); 01181 01182 ShaderProg->End(); 01183 01184 m_line_stats++; 01185 } 01186 01187 void GraphicsEngine::QRP_ASM_QuadWireframe (int x0, int y0, int width, int height, 01188 Color c0, 01189 Color c1, 01190 Color c2, 01191 Color c3) 01192 { 01193 NUX_RETURN_IF_FALSE (m_AsmColor.IsValid()); 01194 01195 float fx0 = x0, fy0 = y0; 01196 float VtxBuffer[] = 01197 { 01198 fx0, fy0, 0.0f, 1.0f, c0.red, c0.green, c0.blue, c0.alpha, 01199 fx0, fy0 + height - 1, 0.0f, 1.0f, c1.red, c1.green, c1.blue, c1.alpha, 01200 fx0 + width - 1, fy0 + height - 1, 0.0f, 1.0f, c2.red, c2.green, c2.blue, c2.alpha, 01201 fx0 + width - 1, fy0, 0.0f, 1.0f, c3.red, c3.green, c3.blue, c3.alpha, 01202 fx0, fy0, 0.0f, 1.0f, c0.red, c0.green, c0.blue, c0.alpha, 01203 }; 01204 01205 ObjectPtr<IOpenGLAsmShaderProgram> ShaderProg = m_AsmColor; 01206 01207 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01208 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01209 ShaderProg->Begin(); 01210 01211 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01212 CHECKGL ( glLoadIdentity() ); 01213 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01214 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01215 CHECKGL ( glLoadIdentity() ); 01216 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01217 01218 int VertexLocation = VTXATTRIB_POSITION; 01219 int VertexColorLocation = VTXATTRIB_COLOR; 01220 01221 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 01222 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer) ); 01223 01224 if (VertexColorLocation != -1) 01225 { 01226 CHECKGL ( glEnableVertexAttribArrayARB (VertexColorLocation) ); 01227 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexColorLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer + 4) ); 01228 } 01229 01230 CHECKGL ( glDrawArrays (GL_LINE_STRIP, 0, 5) ); 01231 01232 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 01233 01234 if (VertexColorLocation != -1) 01235 CHECKGL ( glDisableVertexAttribArrayARB (VertexColorLocation) ); 01236 01237 ShaderProg->End(); 01238 01239 m_line_stats++; 01240 } 01241 01242 void GraphicsEngine::InitAsmPower () 01243 { 01244 NString AsmVtx = TEXT ( 01245 "!!ARBvp1.0 \n\ 01246 ATTRIB iPos = vertex.position; \n\ 01247 OUTPUT oPos = result.position; \n\ 01248 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 01249 # Transform the vertex to clip coordinates. \n\ 01250 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 01251 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 01252 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 01253 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 01254 MOV oTexCoord0, vertex.attrib[8]; \n\ 01255 END"); 01256 01257 01258 NString AsmFrg = TEXT ( 01259 "!!ARBfp1.0 \n\ 01260 PARAM color0 = program.local[0]; \n\ 01261 PARAM exponent = program.local[1]; \n\ 01262 TEMP tex0; \n\ 01263 TEMP final; \n\ 01264 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 01265 POW final.r, tex0.r, exponent.r; \n\ 01266 POW final.g, tex0.g, exponent.g; \n\ 01267 POW final.b, tex0.b, exponent.b; \n\ 01268 MOV final.a, tex0.a; \n\ 01269 MUL result.color, color0, final; \n\ 01270 END"); 01271 01272 NString AsmFrgRect = TEXT ( 01273 "!!ARBfp1.0 \n\ 01274 PARAM color0 = program.local[0]; \n\ 01275 PARAM exponent = program.local[1]; \n\ 01276 TEMP tex0; \n\ 01277 TEMP final; \n\ 01278 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 01279 POW final.r, tex0.r, exponent.r; \n\ 01280 POW final.g, tex0.g, exponent.g; \n\ 01281 POW final.b, tex0.b, exponent.b; \n\ 01282 MOV final.a, tex0.a; \n\ 01283 MUL result.color, color0, final; \n\ 01284 END"); 01285 01286 _asm_tex_component_exponentiation_prog = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 01287 _asm_tex_component_exponentiation_prog->LoadVertexShader (AsmVtx.GetTCharPtr ()); 01288 _asm_tex_component_exponentiation_prog->LoadPixelShader (AsmFrg.GetTCharPtr ()); 01289 _asm_tex_component_exponentiation_prog->Link(); 01290 } 01291 01292 void GraphicsEngine::QRP_ASM_Power (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, Vector4 exponent) 01293 { 01294 NUX_RETURN_IF_FALSE (_asm_tex_component_exponentiation_prog.IsValid()); 01295 NUX_RETURN_IF_FALSE (_asm_texrect_component_exponentiation_prog.IsValid()); 01296 01297 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 01298 float fx = x, fy = y; 01299 float VtxBuffer[] = 01300 { 01301 fx, fy, 0.0f, 1.0f, texxform.u0, texxform.v0, 0, 1.0f, 01302 fx, fy + height, 0.0f, 1.0f, texxform.u0, texxform.v1, 0, 1.0f, 01303 fx + width, fy + height, 0.0f, 1.0f, texxform.u1, texxform.v1, 0, 1.0f, 01304 fx + width, fy, 0.0f, 1.0f, texxform.u1, texxform.v0, 0, 1.0f, 01305 }; 01306 01307 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01308 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01309 01310 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = _asm_tex_component_exponentiation_prog; 01311 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 01312 { 01313 shader_program = _asm_texrect_component_exponentiation_prog; 01314 } 01315 shader_program->Begin(); 01316 01317 SetTexture (GL_TEXTURE0, device_texture); 01318 01319 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, c0.red, c0.green, c0.blue, c0.alpha)); 01320 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, exponent.x, exponent.y, exponent.z, exponent.w)); 01321 01322 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01323 CHECKGL ( glLoadIdentity() ); 01324 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01325 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01326 CHECKGL ( glLoadIdentity() ); 01327 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01328 01329 01330 int VertexLocation = VTXATTRIB_POSITION; 01331 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 01332 01333 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 01334 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer) ); 01335 01336 if (TextureCoord0Location != -1) 01337 { 01338 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 01339 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer + 4) ); 01340 } 01341 01342 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 01343 01344 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 01345 01346 if (TextureCoord0Location != -1) 01347 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 01348 01349 shader_program->End(); 01350 } 01351 01352 void GraphicsEngine::InitAsmAlphaReplicate () 01353 { 01354 NString AsmVtx = TEXT ( 01355 "!!ARBvp1.0 \n\ 01356 ATTRIB iPos = vertex.position; \n\ 01357 OUTPUT oPos = result.position; \n\ 01358 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 01359 # Transform the vertex to clip coordinates. \n\ 01360 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 01361 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 01362 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 01363 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 01364 MOV oTexCoord0, vertex.attrib[8]; \n\ 01365 END"); 01366 01367 01368 NString AsmFrg = TEXT ( 01369 "!!ARBfp1.0 \n\ 01370 PARAM color0 = program.local[0]; \n\ 01371 TEMP tex0; \n\ 01372 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 01373 MUL result.color, color0, tex0.aaaa; \n\ 01374 END"); 01375 01376 NString AsmFrgRect = TEXT ( 01377 "!!ARBfp1.0 \n\ 01378 PARAM color0 = program.local[0]; \n\ 01379 TEMP tex0; \n\ 01380 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 01381 MUL result.color, color0, tex0.aaaa; \n\ 01382 END"); 01383 01384 _asm_tex_alpha_replicate_prog = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 01385 _asm_tex_alpha_replicate_prog->LoadVertexShader (AsmVtx.GetTCharPtr ()); 01386 _asm_tex_alpha_replicate_prog->LoadPixelShader (AsmFrg.GetTCharPtr ()); 01387 _asm_tex_alpha_replicate_prog->Link (); 01388 01389 } 01390 01391 void GraphicsEngine::QRP_ASM_AlphaReplicate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, 01392 const Color &c0) 01393 { 01394 NUX_RETURN_IF_FALSE (_asm_tex_alpha_replicate_prog.IsValid()); 01395 NUX_RETURN_IF_FALSE (_asm_texrect_alpha_replicate_prog.IsValid()); 01396 01397 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 01398 float fx = x, fy = y; 01399 float VtxBuffer[] = 01400 { 01401 fx, fy, 0.0f, 1.0f, texxform.u0, texxform.v0, 0, 1.0f, 01402 fx, fy + height, 0.0f, 1.0f, texxform.u0, texxform.v1, 0, 1.0f, 01403 fx + width, fy + height, 0.0f, 1.0f, texxform.u1, texxform.v1, 0, 1.0f, 01404 fx + width, fy, 0.0f, 1.0f, texxform.u1, texxform.v0, 0, 1.0f, 01405 }; 01406 01407 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01408 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01409 01410 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = _asm_tex_alpha_replicate_prog; 01411 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 01412 { 01413 shader_program = _asm_texrect_alpha_replicate_prog; 01414 } 01415 shader_program->Begin(); 01416 01417 SetTexture (GL_TEXTURE0, device_texture); 01418 01419 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, c0.red, c0.green, c0.blue, c0.alpha)); 01420 01421 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01422 CHECKGL ( glLoadIdentity() ); 01423 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01424 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01425 CHECKGL ( glLoadIdentity() ); 01426 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01427 01428 01429 int VertexLocation = VTXATTRIB_POSITION; 01430 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 01431 01432 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 01433 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer) ); 01434 01435 if (TextureCoord0Location != -1) 01436 { 01437 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 01438 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer + 4) ); 01439 } 01440 01441 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 01442 01443 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 01444 01445 if (TextureCoord0Location != -1) 01446 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 01447 01448 shader_program->End(); 01449 } 01450 01451 void GraphicsEngine::InitAsmColorMatrixFilter () 01452 { 01453 NString AsmVtx = TEXT ( 01454 "!!ARBvp1.0 \n\ 01455 ATTRIB iPos = vertex.position; \n\ 01456 OUTPUT oPos = result.position; \n\ 01457 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 01458 # Transform the vertex to clip coordinates. \n\ 01459 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 01460 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 01461 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 01462 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 01463 MOV oTexCoord0, vertex.attrib[8]; \n\ 01464 END"); 01465 01466 01467 NString AsmFrg = TEXT ( 01468 "!!ARBfp1.0 \n\ 01469 PARAM color0 = program.local[0]; \n\ 01470 PARAM CM0 = program.local[1]; \n\ 01471 PARAM CM1 = program.local[2]; \n\ 01472 PARAM CM2 = program.local[3]; \n\ 01473 PARAM CM3 = program.local[4]; \n\ 01474 PARAM offset = program.local[5]; \n\ 01475 TEMP tex0; \n\ 01476 TEMP final; \n\ 01477 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 01478 MAD final.r, tex0, CM0, offset.r; \n\ 01479 MAD final.g, tex0, CM1, offset.g; \n\ 01480 MAD final.b, tex0, CM2, offset.b; \n\ 01481 MAD final.a, tex0, CM3, offset.a; \n\ 01482 MUL result.color, color0, final; \n\ 01483 END"); 01484 01485 NString AsmFrgRect = TEXT ( 01486 "!!ARBfp1.0 \n\ 01487 PARAM color0 = program.local[0]; \n\ 01488 PARAM CM0 = program.local[1]; \n\ 01489 PARAM CM1 = program.local[2]; \n\ 01490 PARAM CM2 = program.local[3]; \n\ 01491 PARAM CM3 = program.local[4]; \n\ 01492 PARAM offset = program.local[5]; \n\ 01493 TEMP tex0; \n\ 01494 TEMP final; \n\ 01495 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 01496 MAD final.r, tex0, CM0, offset.r; \n\ 01497 MAD final.g, tex0, CM1, offset.g; \n\ 01498 MAD final.b, tex0, CM2, offset.b; \n\ 01499 MAD final.a, tex0, CM3, offset.a; \n\ 01500 MUL result.color, color0, final; \n\ 01501 END"); 01502 01503 _asm_tex_color_matrix_filter_prog = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 01504 _asm_tex_color_matrix_filter_prog->LoadVertexShader (AsmVtx.GetTCharPtr ()); 01505 _asm_tex_color_matrix_filter_prog->LoadPixelShader (AsmFrg.GetTCharPtr ()); 01506 _asm_tex_color_matrix_filter_prog->Link (); 01507 01508 _asm_texrect_color_matrix_filter_prog = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 01509 _asm_texrect_color_matrix_filter_prog->LoadVertexShader (AsmVtx.GetTCharPtr ()); 01510 _asm_texrect_color_matrix_filter_prog->LoadPixelShader (AsmFrgRect.GetTCharPtr ()); 01511 _asm_texrect_color_matrix_filter_prog->Link (); 01512 } 01513 01514 void GraphicsEngine::QRP_ASM_ColorMatrix (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, 01515 const Color &c0, Matrix4 color_matrix, Vector4 offset) 01516 { 01517 NUX_RETURN_IF_FALSE (_asm_tex_color_matrix_filter_prog.IsValid()); 01518 NUX_RETURN_IF_FALSE (_asm_texrect_color_matrix_filter_prog.IsValid()); 01519 01520 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 01521 float fx = x, fy = y; 01522 float VtxBuffer[] = 01523 { 01524 fx, fy, 0.0f, 1.0f, texxform.u0, texxform.v0, 0, 1.0f, 01525 fx, fy + height, 0.0f, 1.0f, texxform.u0, texxform.v1, 0, 1.0f, 01526 fx + width, fy + height, 0.0f, 1.0f, texxform.u1, texxform.v1, 0, 1.0f, 01527 fx + width, fy, 0.0f, 1.0f, texxform.u1, texxform.v0, 0, 1.0f, 01528 }; 01529 01530 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01531 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01532 01533 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = _asm_tex_color_matrix_filter_prog; 01534 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 01535 { 01536 shader_program = _asm_texrect_color_matrix_filter_prog; 01537 } 01538 shader_program->Begin(); 01539 01540 SetTexture (GL_TEXTURE0, device_texture); 01541 01542 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, c0.red, c0.green, c0.blue, c0.alpha)); 01543 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, color_matrix.m[0][0], color_matrix.m[0][1], color_matrix.m[0][2], color_matrix.m[0][3])); 01544 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 2, color_matrix.m[1][0], color_matrix.m[1][1], color_matrix.m[1][2], color_matrix.m[1][3])); 01545 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 3, color_matrix.m[2][0], color_matrix.m[2][1], color_matrix.m[2][2], color_matrix.m[2][3])); 01546 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 4, color_matrix.m[3][0], color_matrix.m[3][1], color_matrix.m[3][2], color_matrix.m[3][3])); 01547 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 5, offset.x, offset.y, offset.z, offset.w)); 01548 01549 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01550 CHECKGL ( glLoadIdentity() ); 01551 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01552 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01553 CHECKGL ( glLoadIdentity() ); 01554 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01555 01556 01557 int VertexLocation = VTXATTRIB_POSITION; 01558 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 01559 01560 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 01561 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer) ); 01562 01563 if (TextureCoord0Location != -1) 01564 { 01565 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 01566 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 32, VtxBuffer + 4) ); 01567 } 01568 01569 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 01570 01571 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 01572 01573 if (TextureCoord0Location != -1) 01574 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 01575 01576 shader_program->End(); 01577 } 01578 01579 void GraphicsEngine::InitAsmSeparableGaussFilter() 01580 { 01581 NString AsmVtx = TEXT ( 01582 "!!ARBvp1.0 \n\ 01583 ATTRIB iPos = vertex.position; \n\ 01584 OUTPUT oPos = result.position; \n\ 01585 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 01586 OUTPUT oTexCoord1 = result.texcoord[1]; \n\ 01587 OUTPUT oTexCoord2 = result.texcoord[2]; \n\ 01588 OUTPUT oTexCoord3 = result.texcoord[3]; \n\ 01589 OUTPUT oTexCoord4 = result.texcoord[4]; \n\ 01590 OUTPUT oTexCoord5 = result.texcoord[5]; \n\ 01591 OUTPUT oTexCoord6 = result.texcoord[6]; \n\ 01592 # Transform the vertex to clip coordinates. \n\ 01593 DP4 oPos.x, state.matrix.mvp.row[0], vertex.position; \n\ 01594 DP4 oPos.y, state.matrix.mvp.row[1], vertex.position; \n\ 01595 DP4 oPos.z, state.matrix.mvp.row[2], vertex.position; \n\ 01596 DP4 oPos.w, state.matrix.mvp.row[3], vertex.position; \n\ 01597 MOV oTexCoord0, vertex.attrib[8]; \n\ 01598 MOV oTexCoord1, vertex.attrib[9]; \n\ 01599 MOV oTexCoord2, vertex.attrib[10]; \n\ 01600 MOV oTexCoord3, vertex.attrib[11]; \n\ 01601 MOV oTexCoord4, vertex.attrib[12]; \n\ 01602 MOV oTexCoord5, vertex.attrib[13]; \n\ 01603 MOV oTexCoord6, vertex.attrib[14]; \n\ 01604 END"); 01605 01606 01607 NString AsmFrg = TEXT ( 01608 "!!ARBfp1.0 \n\ 01609 TEMP tex0; \n\ 01610 TEMP final; \n\ 01611 MOV final, {0, 0, 0, 0}; \n\ 01612 TEX tex0, fragment.texcoord[0], texture[0], 2D; \n\ 01613 MAD final, tex0, program.local[0], final; \n\ 01614 TEX tex0, fragment.texcoord[1], texture[0], 2D; \n\ 01615 MAD final, tex0, program.local[1], final; \n\ 01616 TEX tex0, fragment.texcoord[2], texture[0], 2D; \n\ 01617 MAD final, tex0, program.local[2], final; \n\ 01618 TEX tex0, fragment.texcoord[3], texture[0], 2D; \n\ 01619 MAD final, tex0, program.local[3], final; \n\ 01620 TEX tex0, fragment.texcoord[4], texture[0], 2D; \n\ 01621 MAD final, tex0, program.local[4], final; \n\ 01622 TEX tex0, fragment.texcoord[5], texture[0], 2D; \n\ 01623 MAD final, tex0, program.local[5], final; \n\ 01624 TEX tex0, fragment.texcoord[6], texture[0], 2D; \n\ 01625 MAD final, tex0, program.local[6], final; \n\ 01626 MOV result.color, final; \n\ 01627 END"); 01628 01629 01630 NString AsmFrgRect = TEXT ( 01631 "!!ARBfp1.0 \n\ 01632 TEMP tex0; \n\ 01633 TEMP final; \n\ 01634 MOV final, {0, 0, 0, 0}; \n\ 01635 TEX tex0, fragment.texcoord[0], texture[0], RECT; \n\ 01636 MAD final, tex0, program.local[0], final; \n\ 01637 TEX tex0, fragment.texcoord[1], texture[0], RECT; \n\ 01638 MAD final, tex0, program.local[1], final; \n\ 01639 TEX tex0, fragment.texcoord[2], texture[0], RECT; \n\ 01640 MAD final, tex0, program.local[2], final; \n\ 01641 TEX tex0, fragment.texcoord[3], texture[0], RECT; \n\ 01642 MAD final, tex0, program.local[3], final; \n\ 01643 TEX tex0, fragment.texcoord[4], texture[0], RECT; \n\ 01644 MAD final, tex0, program.local[4], final; \n\ 01645 TEX tex0, fragment.texcoord[5], texture[0], RECT; \n\ 01646 MAD final, tex0, program.local[5], final; \n\ 01647 TEX tex0, fragment.texcoord[6], texture[0], RECT; \n\ 01648 MAD final, tex0, program.local[6], final; \n\ 01649 MOV result.color, final; \n\ 01650 END"); 01651 01652 _asm_tex_separable_gauss_filter_prog = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 01653 _asm_tex_separable_gauss_filter_prog->LoadVertexShader (AsmVtx.GetTCharPtr ()); 01654 _asm_tex_separable_gauss_filter_prog->LoadPixelShader (AsmFrg.GetTCharPtr ()); 01655 _asm_tex_separable_gauss_filter_prog->Link (); 01656 01657 _asm_texrect_separable_gauss_filter_prog = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 01658 _asm_texrect_separable_gauss_filter_prog->LoadVertexShader (AsmVtx.GetTCharPtr ()); 01659 _asm_texrect_separable_gauss_filter_prog->LoadPixelShader (AsmFrgRect.GetTCharPtr ()); 01660 _asm_texrect_separable_gauss_filter_prog->Link (); 01661 } 01662 01663 void GraphicsEngine::QRP_ASM_HorizontalGauss (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma) 01664 { 01665 NUX_RETURN_IF_FALSE (_asm_tex_separable_gauss_filter_prog.IsValid()); 01666 NUX_RETURN_IF_FALSE (_asm_texrect_separable_gauss_filter_prog.IsValid()); 01667 01668 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 01669 01670 float delta = 1.0f / device_texture->GetWidth(); 01671 01672 float fx = x, fy = y; 01673 float VtxBuffer[] = 01674 { 01675 fx, fy, 0.0f, 1.0f, 01676 texxform.u0 - 3.0f * delta, texxform.v0, 0, 1.0f, 01677 texxform.u0 - 2.0f * delta, texxform.v0, 0, 1.0f, 01678 texxform.u0 - 1.0f * delta, texxform.v0, 0, 1.0f, 01679 texxform.u0 + 0.0f * delta, texxform.v0, 0, 1.0f, 01680 texxform.u0 + 1.0f * delta, texxform.v0, 0, 1.0f, 01681 texxform.u0 + 2.0f * delta, texxform.v0, 0, 1.0f, 01682 texxform.u0 + 3.0f * delta, texxform.v0, 0, 1.0f, 01683 fx, fy + height, 0.0f, 1.0f, 01684 texxform.u0 - 3.0f * delta, texxform.v1, 0, 1.0f, 01685 texxform.u0 - 2.0f * delta, texxform.v1, 0, 1.0f, 01686 texxform.u0 - 1.0f * delta, texxform.v1, 0, 1.0f, 01687 texxform.u0 + 0.0f * delta, texxform.v1, 0, 1.0f, 01688 texxform.u0 + 1.0f * delta, texxform.v1, 0, 1.0f, 01689 texxform.u0 + 2.0f * delta, texxform.v1, 0, 1.0f, 01690 texxform.u0 + 3.0f * delta, texxform.v1, 0, 1.0f, 01691 fx + width, fy + height, 0.0f, 1.0f, 01692 texxform.u1 - 3.0f * delta, texxform.v1, 0, 1.0f, 01693 texxform.u1 - 2.0f * delta, texxform.v1, 0, 1.0f, 01694 texxform.u1 - 1.0f * delta, texxform.v1, 0, 1.0f, 01695 texxform.u1 + 0.0f * delta, texxform.v1, 0, 1.0f, 01696 texxform.u1 + 1.0f * delta, texxform.v1, 0, 1.0f, 01697 texxform.u1 + 2.0f * delta, texxform.v1, 0, 1.0f, 01698 texxform.u1 + 3.0f * delta, texxform.v1, 0, 1.0f, 01699 fx + width, fy, 0.0f, 1.0f, 01700 texxform.u1 - 3.0f * delta, texxform.v0, 0, 1.0f, 01701 texxform.u1 - 2.0f * delta, texxform.v0, 0, 1.0f, 01702 texxform.u1 - 1.0f * delta, texxform.v0, 0, 1.0f, 01703 texxform.u1 + 0.0f * delta, texxform.v0, 0, 1.0f, 01704 texxform.u1 + 1.0f * delta, texxform.v0, 0, 1.0f, 01705 texxform.u1 + 2.0f * delta, texxform.v0, 0, 1.0f, 01706 texxform.u1 + 3.0f * delta, texxform.v0, 0, 1.0f, 01707 }; 01708 01709 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01710 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01711 01712 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = _asm_tex_separable_gauss_filter_prog; 01713 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 01714 { 01715 shader_program = _asm_texrect_separable_gauss_filter_prog; 01716 } 01717 shader_program->Begin(); 01718 01719 SetTexture (GL_TEXTURE0, device_texture); 01720 01721 // Set the Gaussian weights 01722 { 01723 float *W; 01724 GaussianWeights(&W, 1, 7); 01725 01726 for(int i = 0; i < 7; i++) 01727 { 01728 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, i, W[i], W[i], W[i], W[i])); 01729 } 01730 delete[] W; 01731 } 01732 01733 CHECKGL ( glMatrixMode (GL_MODELVIEW) ); 01734 CHECKGL ( glLoadIdentity() ); 01735 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLModelViewMatrix().m) ); 01736 CHECKGL ( glMatrixMode (GL_PROJECTION) ); 01737 CHECKGL ( glLoadIdentity() ); 01738 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m) ); 01739 01740 01741 int VertexLocation = VTXATTRIB_POSITION; 01742 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 01743 int TextureCoord1Location = VTXATTRIB_TEXCOORD1; 01744 int TextureCoord2Location = VTXATTRIB_TEXCOORD2; 01745 int TextureCoord3Location = VTXATTRIB_TEXCOORD3; 01746 int TextureCoord4Location = VTXATTRIB_TEXCOORD4; 01747 int TextureCoord5Location = VTXATTRIB_TEXCOORD5; 01748 int TextureCoord6Location = VTXATTRIB_TEXCOORD6; 01749 01750 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation)); 01751 CHECKGL ( glVertexAttribPointerARB ((GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer)); 01752 01753 //if (TextureCoord0Location != -1) 01754 { 01755 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location)); 01756 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord1Location)); 01757 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord2Location)); 01758 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord3Location)); 01759 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord4Location)); 01760 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord5Location)); 01761 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord6Location)); 01762 01763 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 4)); 01764 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord1Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 8)); 01765 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord2Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 12)); 01766 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord3Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 16)); 01767 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord4Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 20)); 01768 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord5Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 24)); 01769 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord6Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 28)); 01770 } 01771 01772 CHECKGL (glDrawArrays (GL_TRIANGLE_FAN, 0, 4)); 01773 01774 CHECKGL (glDisableVertexAttribArrayARB (VertexLocation)); 01775 01776 if (TextureCoord0Location != -1) 01777 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord0Location)); 01778 if (TextureCoord1Location != -1) 01779 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord1Location)); 01780 if (TextureCoord2Location != -1) 01781 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord2Location)); 01782 if (TextureCoord3Location != -1) 01783 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord3Location)); 01784 if (TextureCoord4Location != -1) 01785 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord4Location)); 01786 if (TextureCoord5Location != -1) 01787 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord5Location)); 01788 if (TextureCoord6Location != -1) 01789 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord6Location)); 01790 01791 shader_program->End(); 01792 } 01793 01794 void GraphicsEngine::QRP_ASM_VerticalGauss (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &c0, float sigma) 01795 { 01796 NUX_RETURN_IF_FALSE (_asm_tex_separable_gauss_filter_prog.IsValid()); 01797 NUX_RETURN_IF_FALSE (_asm_texrect_separable_gauss_filter_prog.IsValid()); 01798 01799 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 01800 01801 float delta = 1.0f / device_texture->GetHeight(); 01802 01803 float fx = x, fy = y; 01804 float VtxBuffer[] = 01805 { 01806 fx, fy, 0.0f, 1.0f, 01807 texxform.u0, texxform.v0 - 3.0f * delta, 0, 1.0f, 01808 texxform.u0, texxform.v0 - 2.0f * delta, 0, 1.0f, 01809 texxform.u0, texxform.v0 - 1.0f * delta, 0, 1.0f, 01810 texxform.u0, texxform.v0 + 0.0f * delta, 0, 1.0f, 01811 texxform.u0, texxform.v0 + 1.0f * delta, 0, 1.0f, 01812 texxform.u0, texxform.v0 + 2.0f * delta, 0, 1.0f, 01813 texxform.u0, texxform.v0 + 3.0f * delta, 0, 1.0f, 01814 fx, fy + height, 0.0f, 1.0f, 01815 texxform.u0, texxform.v1 - 3.0f * delta, 0, 1.0f, 01816 texxform.u0, texxform.v1 - 2.0f * delta, 0, 1.0f, 01817 texxform.u0, texxform.v1 - 1.0f * delta, 0, 1.0f, 01818 texxform.u0, texxform.v1 + 0.0f * delta, 0, 1.0f, 01819 texxform.u0, texxform.v1 + 1.0f * delta, 0, 1.0f, 01820 texxform.u0, texxform.v1 + 2.0f * delta, 0, 1.0f, 01821 texxform.u0, texxform.v1 + 3.0f * delta, 0, 1.0f, 01822 fx + width, fy + height, 0.0f, 1.0f, 01823 texxform.u1, texxform.v1 - 3.0f * delta, 0, 1.0f, 01824 texxform.u1, texxform.v1 - 2.0f * delta, 0, 1.0f, 01825 texxform.u1, texxform.v1 - 1.0f * delta, 0, 1.0f, 01826 texxform.u1, texxform.v1 + 0.0f * delta, 0, 1.0f, 01827 texxform.u1, texxform.v1 + 1.0f * delta, 0, 1.0f, 01828 texxform.u1, texxform.v1 + 2.0f * delta, 0, 1.0f, 01829 texxform.u1, texxform.v1 + 3.0f * delta, 0, 1.0f, 01830 fx + width, fy, 0.0f, 1.0f, 01831 texxform.u1, texxform.v0 - 3.0f * delta, 0, 1.0f, 01832 texxform.u1, texxform.v0 - 2.0f * delta, 0, 1.0f, 01833 texxform.u1, texxform.v0 - 1.0f * delta, 0, 1.0f, 01834 texxform.u1, texxform.v0 + 0.0f * delta, 0, 1.0f, 01835 texxform.u1, texxform.v0 + 1.0f * delta, 0, 1.0f, 01836 texxform.u1, texxform.v0 + 2.0f * delta, 0, 1.0f, 01837 texxform.u1, texxform.v0 + 3.0f * delta, 0, 1.0f, 01838 }; 01839 01840 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 01841 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 01842 01843 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = _asm_tex_separable_gauss_filter_prog; 01844 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 01845 { 01846 shader_program = _asm_texrect_separable_gauss_filter_prog; 01847 } 01848 shader_program->Begin(); 01849 01850 SetTexture (GL_TEXTURE0, device_texture); 01851 01852 // Set the Gaussian weights 01853 { 01854 float *W; 01855 GaussianWeights(&W, 1, 7); 01856 01857 for(int i = 0; i < 7; i++) 01858 { 01859 CHECKGL (glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, i, W[i], W[i], W[i], W[i])); 01860 } 01861 delete[] W; 01862 } 01863 01864 CHECKGL ( glMatrixMode (GL_MODELVIEW)); 01865 CHECKGL ( glLoadIdentity ()); 01866 CHECKGL ( glLoadMatrixf ((FLOAT *) GetOpenGLModelViewMatrix().m)); 01867 CHECKGL ( glMatrixMode (GL_PROJECTION)); 01868 CHECKGL ( glLoadIdentity ()); 01869 CHECKGL ( glLoadMatrixf ( (FLOAT *) GetOpenGLProjectionMatrix().m)); 01870 01871 01872 int VertexLocation = VTXATTRIB_POSITION; 01873 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 01874 int TextureCoord1Location = VTXATTRIB_TEXCOORD1; 01875 int TextureCoord2Location = VTXATTRIB_TEXCOORD2; 01876 int TextureCoord3Location = VTXATTRIB_TEXCOORD3; 01877 int TextureCoord4Location = VTXATTRIB_TEXCOORD4; 01878 int TextureCoord5Location = VTXATTRIB_TEXCOORD5; 01879 int TextureCoord6Location = VTXATTRIB_TEXCOORD6; 01880 01881 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation)); 01882 CHECKGL ( glVertexAttribPointerARB ((GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer)); 01883 01884 //if (TextureCoord0Location != -1) 01885 { 01886 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location)); 01887 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord1Location)); 01888 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord2Location)); 01889 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord3Location)); 01890 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord4Location)); 01891 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord5Location)); 01892 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord6Location)); 01893 01894 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 4)); 01895 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord1Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 8)); 01896 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord2Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 12)); 01897 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord3Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 16)); 01898 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord4Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 20)); 01899 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord5Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 24)); 01900 CHECKGL ( glVertexAttribPointerARB ((GLuint) TextureCoord6Location, 4, GL_FLOAT, GL_FALSE, 128, VtxBuffer + 28)); 01901 } 01902 01903 CHECKGL (glDrawArrays (GL_TRIANGLE_FAN, 0, 4)); 01904 01905 CHECKGL (glDisableVertexAttribArrayARB (VertexLocation)); 01906 01907 if (TextureCoord0Location != -1) 01908 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord0Location)); 01909 if (TextureCoord1Location != -1) 01910 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord1Location)); 01911 if (TextureCoord2Location != -1) 01912 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord2Location)); 01913 if (TextureCoord3Location != -1) 01914 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord3Location)); 01915 if (TextureCoord4Location != -1) 01916 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord4Location)); 01917 if (TextureCoord5Location != -1) 01918 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord5Location)); 01919 if (TextureCoord6Location != -1) 01920 CHECKGL (glDisableVertexAttribArrayARB (TextureCoord6Location)); 01921 01922 shader_program->End(); 01923 } 01924 01925 ObjectPtr<IOpenGLBaseTexture> GraphicsEngine::QRP_ASM_GetBlurTexture ( 01926 int x, int y, 01927 int buffer_width, int buffer_height, 01928 ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, 01929 const Color& c0, 01930 float sigma, int num_pass) 01931 { 01932 // _offscreen_color_rt0.Release (); 01933 // _offscreen_color_rt1.Release (); 01934 // _offscreen_depth_rt0.Release (); 01935 // _offscreen_depth_rt1.Release (); 01936 01937 int quad_width = device_texture->GetWidth (); 01938 int quad_height = device_texture->GetHeight (); 01939 01940 num_pass = Clamp<int> (num_pass, 1, 5); 01941 01942 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject (); 01943 int previous_width = 0; 01944 int previous_height = 0; 01945 if (prevFBO.IsValid ()) 01946 { 01947 previous_width = prevFBO->GetWidth (); 01948 previous_height = prevFBO->GetHeight (); 01949 } 01950 else 01951 { 01952 previous_width = _graphics_display.GetWindowWidth (); 01953 previous_height = _graphics_display.GetWindowHeight (); 01954 } 01955 01956 CHECKGL (glClearColor (0, 0, 0, 0)); 01957 _offscreen_color_rt0->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 01958 _offscreen_color_rt0->SetFiltering(GL_NEAREST, GL_NEAREST); 01959 _offscreen_color_rt1->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 01960 _offscreen_color_rt1->SetFiltering(GL_NEAREST, GL_NEAREST); 01961 01962 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt0, _offscreen_depth_rt0, buffer_width, buffer_height); 01963 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 01964 01965 QRP_ASM_1Tex(x, y, quad_width, quad_height, device_texture, texxform, color::White); 01966 01967 TexCoordXForm texxform1; 01968 for (int i = 0; i < num_pass; i++) 01969 { 01970 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt1, _offscreen_depth_rt1, buffer_width, buffer_height); 01971 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 01972 QRP_ASM_HorizontalGauss(0, 0, buffer_width, buffer_height, _offscreen_color_rt0, texxform1, c0); 01973 01974 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt0, _offscreen_depth_rt0, buffer_width, buffer_height); 01975 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 01976 QRP_ASM_VerticalGauss(0, 0, buffer_width, buffer_height, _offscreen_color_rt1, texxform1, c0); 01977 } 01978 01979 _offscreen_fbo->Deactivate(); 01980 01981 if (prevFBO.IsValid ()) 01982 { 01983 prevFBO->Activate (true); 01984 SetViewport(0, 0, previous_width, previous_height); 01985 } 01986 else 01987 { 01988 SetViewport(0, 0, previous_width, previous_height); 01989 } 01990 01991 return _offscreen_color_rt0; 01992 } 01993 01994 void GraphicsEngine::QRP_ASM_GetBlurTextureFx ( 01995 int x, int y, int buffer_width, int buffer_height, 01996 FxStructure *fx_structure, TexCoordXForm &texxform, const Color& color, float sigma, int num_pass) 01997 { 01998 int quad_width = fx_structure->src_texture->GetWidth (); 01999 int quad_height = fx_structure->src_texture->GetHeight (); 02000 02001 num_pass = Clamp<int> (num_pass, 1, 5); 02002 02003 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject (); 02004 int previous_width = 0; 02005 int previous_height = 0; 02006 if (prevFBO.IsValid ()) 02007 { 02008 previous_width = prevFBO->GetWidth (); 02009 previous_height = prevFBO->GetHeight (); 02010 } 02011 else 02012 { 02013 previous_width = _graphics_display.GetWindowWidth (); 02014 previous_height = _graphics_display.GetWindowHeight (); 02015 } 02016 02017 CHECKGL (glClearColor (0, 0, 0, 0)); 02018 fx_structure->src_texture->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02019 fx_structure->src_texture->SetFiltering(GL_NEAREST, GL_NEAREST); 02020 fx_structure->dst_texture->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02021 fx_structure->dst_texture->SetFiltering(GL_NEAREST, GL_NEAREST); 02022 fx_structure->temp_texture->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02023 fx_structure->temp_texture->SetFiltering(GL_NEAREST, GL_NEAREST); 02024 02025 SetFrameBufferHelper(_offscreen_fbo, fx_structure->dst_texture, _offscreen_depth_rt0, buffer_width, buffer_height); 02026 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02027 02028 QRP_ASM_1Tex(x, y, quad_width, quad_height, fx_structure->src_texture, texxform, color::White); 02029 02030 TexCoordXForm texxform1; 02031 for (int i = 0; i < num_pass; i++) 02032 { 02033 SetFrameBufferHelper(_offscreen_fbo, fx_structure->temp_texture, _offscreen_depth_rt1, buffer_width, buffer_height); 02034 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02035 QRP_ASM_HorizontalGauss(0, 0, buffer_width, buffer_height, fx_structure->dst_texture, texxform1, color); 02036 02037 SetFrameBufferHelper(_offscreen_fbo, fx_structure->dst_texture, _offscreen_depth_rt0, buffer_width, buffer_height); 02038 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02039 QRP_ASM_VerticalGauss(0, 0, buffer_width, buffer_height, fx_structure->temp_texture, texxform1, color); 02040 } 02041 02042 _offscreen_fbo->Deactivate(); 02043 02044 if (prevFBO.IsValid ()) 02045 { 02046 prevFBO->Activate (true); 02047 SetViewport(0, 0, previous_width, previous_height); 02048 } 02049 else 02050 { 02051 SetViewport(0, 0, previous_width, previous_height); 02052 } 02053 } 02054 02055 ObjectPtr<IOpenGLBaseTexture> GraphicsEngine::QRP_ASM_GetPower ( 02056 ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color & c0, const Vector4 &exponent) 02057 { 02058 int quad_width = device_texture->GetWidth (); 02059 int quad_height = device_texture->GetHeight (); 02060 02061 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject (); 02062 int previous_width = 0; 02063 int previous_height = 0; 02064 if (prevFBO.IsValid ()) 02065 { 02066 previous_width = prevFBO->GetWidth (); 02067 previous_height = prevFBO->GetHeight (); 02068 } 02069 else 02070 { 02071 previous_width = _graphics_display.GetWindowWidth (); 02072 previous_height = _graphics_display.GetWindowHeight (); 02073 } 02074 02075 CHECKGL (glClearColor (0, 0, 0, 0)); 02076 _offscreen_color_rt0->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02077 _offscreen_color_rt0->SetFiltering(GL_NEAREST, GL_NEAREST); 02078 _offscreen_color_rt1->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02079 _offscreen_color_rt1->SetFiltering(GL_NEAREST, GL_NEAREST); 02080 02081 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt0, _offscreen_depth_rt0, quad_width, quad_height); 02082 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02083 QRP_ASM_1Tex(0, 0, quad_width, quad_height, device_texture, texxform, color::White); 02084 02085 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt1, _offscreen_depth_rt1, quad_width, quad_height); 02086 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02087 QRP_ASM_Power(0, 0, quad_width, quad_height, _offscreen_color_rt0, texxform, c0, exponent); 02088 02089 _offscreen_fbo->Deactivate(); 02090 02091 if (prevFBO.IsValid ()) 02092 { 02093 prevFBO->Activate (true); 02094 SetViewport(0, 0, previous_width, previous_height); 02095 } 02096 else 02097 { 02098 SetViewport(0, 0, previous_width, previous_height); 02099 } 02100 02101 return _offscreen_color_rt1; 02102 } 02103 02104 ObjectPtr<IOpenGLBaseTexture> GraphicsEngine::QRP_ASM_GetAlphaTexture ( 02105 ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, 02106 const Color & c0) 02107 { 02108 // _offscreen_color_rt0.Release (); 02109 // _offscreen_color_rt1.Release (); 02110 // _offscreen_depth_rt0.Release (); 02111 // _offscreen_depth_rt1.Release (); 02112 02113 int quad_width = device_texture->GetWidth (); 02114 int quad_height = device_texture->GetHeight (); 02115 02116 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject (); 02117 int previous_width = 0; 02118 int previous_height = 0; 02119 if (prevFBO.IsValid ()) 02120 { 02121 previous_width = prevFBO->GetWidth (); 02122 previous_height = prevFBO->GetHeight (); 02123 } 02124 else 02125 { 02126 previous_width = _graphics_display.GetWindowWidth (); 02127 previous_height = _graphics_display.GetWindowHeight (); 02128 } 02129 02130 CHECKGL (glClearColor (0, 0, 0, 0)); 02131 _offscreen_color_rt0->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02132 _offscreen_color_rt0->SetFiltering(GL_NEAREST, GL_NEAREST); 02133 _offscreen_color_rt1->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02134 _offscreen_color_rt1->SetFiltering(GL_NEAREST, GL_NEAREST); 02135 02136 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt0, _offscreen_depth_rt0, quad_width, quad_height); 02137 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02138 QRP_ASM_1Tex(0, 0, quad_width, quad_height, device_texture, texxform, color::White); 02139 02140 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt1, _offscreen_depth_rt1, quad_width, quad_height); 02141 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02142 QRP_ASM_AlphaReplicate(0, 0, quad_width, quad_height, _offscreen_color_rt0, texxform, c0); 02143 02144 _offscreen_fbo->Deactivate(); 02145 02146 if (prevFBO.IsValid ()) 02147 { 02148 prevFBO->Activate (true); 02149 SetViewport(0, 0, previous_width, previous_height); 02150 } 02151 else 02152 { 02153 SetViewport(0, 0, previous_width, previous_height); 02154 } 02155 02156 return _offscreen_color_rt1; 02157 } 02158 02159 ObjectPtr<IOpenGLBaseTexture> GraphicsEngine::QRP_ASM_GetColorMatrixTexture ( 02160 ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color & c0, Matrix4 color_matrix, Vector4 offset) 02161 { 02162 int quad_width = device_texture->GetWidth (); 02163 int quad_height = device_texture->GetHeight (); 02164 02165 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject (); 02166 int previous_width = 0; 02167 int previous_height = 0; 02168 if (prevFBO.IsValid ()) 02169 { 02170 previous_width = prevFBO->GetWidth (); 02171 previous_height = prevFBO->GetHeight (); 02172 } 02173 else 02174 { 02175 previous_width = _graphics_display.GetWindowWidth (); 02176 previous_height = _graphics_display.GetWindowHeight (); 02177 } 02178 02179 CHECKGL (glClearColor (0, 0, 0, 0)); 02180 _offscreen_color_rt0->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02181 _offscreen_color_rt0->SetFiltering(GL_NEAREST, GL_NEAREST); 02182 _offscreen_color_rt1->SetWrap(GL_CLAMP, GL_CLAMP, GL_CLAMP); 02183 _offscreen_color_rt1->SetFiltering(GL_NEAREST, GL_NEAREST); 02184 02185 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt0, _offscreen_depth_rt0, quad_width, quad_height); 02186 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02187 QRP_ASM_1Tex(0, 0, quad_width, quad_height, device_texture, texxform, color::White); 02188 02189 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt1, _offscreen_depth_rt1, quad_width, quad_height); 02190 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02191 QRP_ASM_ColorMatrix (0, 0, quad_width, quad_height, _offscreen_color_rt0, texxform, c0, color_matrix, offset); 02192 02193 _offscreen_fbo->Deactivate(); 02194 02195 if (prevFBO.IsValid ()) 02196 { 02197 prevFBO->Activate (true); 02198 SetViewport(0, 0, previous_width, previous_height); 02199 } 02200 else 02201 { 02202 SetViewport(0, 0, previous_width, previous_height); 02203 } 02204 02205 return _offscreen_color_rt1; 02206 } 02207 02208 ObjectPtr<IOpenGLBaseTexture> GraphicsEngine::QRP_ASM_GetLQBlur ( 02209 int x, int y, 02210 int buffer_width, int buffer_height, 02211 ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, 02212 const Color& c0) 02213 { 02214 // _offscreen_color_rt0.Release (); 02215 // _offscreen_color_rt1.Release (); 02216 // _offscreen_depth_rt0.Release (); 02217 // _offscreen_depth_rt1.Release (); 02218 02219 int quad_width = device_texture->GetWidth (); 02220 int quad_height = device_texture->GetHeight (); 02221 02222 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject (); 02223 int previous_width = 0; 02224 int previous_height = 0; 02225 if (prevFBO.IsValid ()) 02226 { 02227 previous_width = prevFBO->GetWidth (); 02228 previous_height = prevFBO->GetHeight (); 02229 } 02230 else 02231 { 02232 previous_width = _graphics_display.GetWindowWidth (); 02233 previous_height = _graphics_display.GetWindowHeight (); 02234 } 02235 02236 CHECKGL (glClearColor (0, 0, 0, 0)); 02237 _offscreen_color_rt0->SetWrap (GL_CLAMP, GL_CLAMP, GL_CLAMP); 02238 _offscreen_color_rt0->SetFiltering (GL_NEAREST, GL_NEAREST); 02239 _offscreen_color_rt1->SetWrap (GL_CLAMP, GL_CLAMP, GL_CLAMP); 02240 _offscreen_color_rt1->SetFiltering (GL_NEAREST, GL_NEAREST); 02241 _offscreen_color_rt2->SetWrap (GL_CLAMP, GL_CLAMP, GL_CLAMP); 02242 _offscreen_color_rt2->SetFiltering (GL_NEAREST, GL_NEAREST); 02243 _offscreen_color_rt3->SetWrap (GL_CLAMP, GL_CLAMP, GL_CLAMP); 02244 _offscreen_color_rt3->SetFiltering (GL_NEAREST, GL_NEAREST); 02245 02246 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt0, _offscreen_depth_rt0, quad_width/2, quad_height/2); 02247 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02248 QRP_ASM_1Tex (0, 0, quad_width / 2, quad_height / 2, device_texture, texxform, color::White); 02249 02250 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt1, _offscreen_depth_rt1, quad_width/4, quad_height/4); 02251 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02252 QRP_ASM_1Tex (0, 0, quad_width / 4, quad_height / 4, _offscreen_color_rt0, texxform, color::White); 02253 02254 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt2, _offscreen_depth_rt2, quad_width/8, quad_height/8); 02255 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02256 QRP_ASM_1Tex (0, 0, quad_width / 8, quad_height / 8, _offscreen_color_rt1, texxform, color::White); 02257 02258 SetFrameBufferHelper(_offscreen_fbo, _offscreen_color_rt3, _offscreen_depth_rt3, quad_width, quad_height); 02259 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 02260 02261 TexCoordXForm texxform0; 02262 TexCoordXForm texxform1; 02263 TexCoordXForm texxform2; 02264 TexCoordXForm texxform3; 02265 02266 texxform0.flip_v_coord = true; 02267 texxform2.flip_v_coord = true; 02268 QRP_ASM_4Tex (0, 0, quad_width, quad_height, 02269 device_texture, texxform0, Color(0.25, 0.25, 0.25, 0.25), 02270 _offscreen_color_rt0, texxform1, Color(0.25, 0.25, 0.25, 0.25), 02271 _offscreen_color_rt1, texxform2, Color(0.25, 0.25, 0.25, 0.25), 02272 _offscreen_color_rt2, texxform3, Color(0.25, 0.25, 0.25, 0.25)); 02273 02274 _offscreen_fbo->Deactivate(); 02275 02276 if (prevFBO.IsValid ()) 02277 { 02278 prevFBO->Activate (true); 02279 SetViewport(0, 0, previous_width, previous_height); 02280 } 02281 else 02282 { 02283 SetViewport(0, 0, previous_width, previous_height); 02284 } 02285 return _offscreen_color_rt3; 02286 } 02287 02288 void GraphicsEngine::InitAsmPixelateShader () 02289 { 02290 NString AsmVtx = TEXT ( 02291 "!!ARBvp1.0 \n\ 02292 ATTRIB iPos = vertex.position; \n\ 02293 ATTRIB iColor = vertex.attrib[3]; \n\ 02294 PARAM mvp[4] = {state.matrix.mvp}; \n\ 02295 OUTPUT oPos = result.position; \n\ 02296 OUTPUT oColor = result.color; \n\ 02297 OUTPUT oTexCoord0 = result.texcoord[0]; \n\ 02298 # Transform the vertex to clip coordinates. \n\ 02299 DP4 oPos.x, mvp[0], iPos; \n\ 02300 DP4 oPos.y, mvp[1], iPos; \n\ 02301 DP4 oPos.z, mvp[2], iPos; \n\ 02302 DP4 oPos.w, mvp[3], iPos; \n\ 02303 MOV oColor, iColor; \n\ 02304 MOV oTexCoord0, vertex.attrib[8]; \n\ 02305 END"); 02306 02307 NString AsmFrg = TEXT ( 02308 "!!ARBfp1.0 \n\ 02309 TEMP tex0; \n\ 02310 TEMP tex_coord; \n\ 02311 PARAM pixel_size = program.local [0]; \n\ 02312 PARAM pixel_size_inv = program.local [1]; \n\ 02313 MUL tex_coord, fragment.texcoord[0], pixel_size_inv; \n\ 02314 FLR tex_coord, tex_coord; \n\ 02315 MUL tex_coord, tex_coord, pixel_size; \n\ 02316 TEX tex0, tex_coord, texture[0], 2D; \n\ 02317 MUL result.color, fragment.color, tex0; \n\ 02318 END"); 02319 02320 NString AsmFrgRect = TEXT ( 02321 "!!ARBfp1.0 \n\ 02322 TEMP tex0; \n\ 02323 TEMP tex_coord; \n\ 02324 PARAM pixel_size = program.local [0]; \n\ 02325 PARAM pixel_size_inv = program.local [1]; \n\ 02326 MUL tex_coord, fragment.texcoord[0], pixel_size_inv; \n\ 02327 FLR tex_coord, tex_coord; \n\ 02328 MUL tex_coord, tex_coord, pixel_size; \n\ 02329 TEX tex0, tex_coord, texture[0], RECT; \n\ 02330 MUL result.color, fragment.color, tex0; \n\ 02331 END"); 02332 02333 m_AsmPixelate = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram(); 02334 m_AsmPixelate->LoadVertexShader (AsmVtx.GetTCharPtr() ); 02335 m_AsmPixelate->LoadPixelShader (AsmFrg.GetTCharPtr() ); 02336 m_AsmPixelate->Link(); 02337 02338 m_AsmPixelateRect = GetGraphicsDisplay()->GetGpuDevice()->CreateAsmShaderProgram (); 02339 m_AsmPixelateRect->LoadVertexShader (AsmVtx.GetTCharPtr ()); 02340 m_AsmPixelateRect->LoadPixelShader (AsmFrgRect.GetTCharPtr ()); 02341 m_AsmPixelateRect->Link(); 02342 } 02343 02344 void GraphicsEngine::QRP_ASM_Pixelate (int x, int y, int width, int height, ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform, const Color &color, int pixel_size) 02345 { 02346 NUX_RETURN_IF_FALSE (m_AsmPixelate.IsValid()); 02347 NUX_RETURN_IF_FALSE (m_AsmPixelateRect.IsValid()); 02348 02349 if (pixel_size <= 0) 02350 pixel_size = 1; 02351 02352 QRP_Compute_Texture_Coord (width, height, device_texture, texxform); 02353 float fx = x, fy = y; 02354 float VtxBuffer[] = 02355 { 02356 fx, fy, 0.0f, 1.0f, texxform.u0, texxform.v0, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 02357 fx, fy + height, 0.0f, 1.0f, texxform.u0, texxform.v1, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 02358 fx + width, fy + height, 0.0f, 1.0f, texxform.u1, texxform.v1, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 02359 fx + width, fy, 0.0f, 1.0f, texxform.u1, texxform.v0, 0, 1.0f, color.red, color.green, color.blue, color.alpha, 02360 }; 02361 02362 float tex_width = device_texture->GetWidth (); 02363 float tex_height = device_texture->GetHeight (); 02364 02365 CHECKGL (glBindBufferARB (GL_ARRAY_BUFFER_ARB, 0) ); 02366 CHECKGL (glBindBufferARB (GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); 02367 02368 bool rectangle_texture = false; 02369 ObjectPtr<IOpenGLAsmShaderProgram> shader_program = m_AsmPixelate; 02370 if(device_texture->Type().IsDerivedFromType(IOpenGLRectangleTexture::StaticObjectType)) 02371 { 02372 shader_program = m_AsmPixelateRect; 02373 rectangle_texture = true; 02374 } 02375 shader_program->Begin(); 02376 02377 SetTexture (GL_TEXTURE0, device_texture); 02378 02379 CHECKGL (glMatrixMode (GL_MODELVIEW)); 02380 CHECKGL (glLoadIdentity ()); 02381 CHECKGL (glLoadMatrixf ((FLOAT *) GetOpenGLModelViewMatrix ().m)); 02382 CHECKGL (glMatrixMode (GL_PROJECTION)); 02383 CHECKGL (glLoadIdentity ()); 02384 CHECKGL (glLoadMatrixf ((FLOAT *) GetOpenGLProjectionMatrix ().m)); 02385 02386 int VertexLocation = VTXATTRIB_POSITION; 02387 int TextureCoord0Location = VTXATTRIB_TEXCOORD0; 02388 int VertexColorLocation = VTXATTRIB_COLOR; 02389 02390 if (rectangle_texture == false) 02391 { 02392 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, (float)pixel_size/(float)tex_width, (float)pixel_size/(float)tex_height, 1.0f, 1.0f)); 02393 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, (float)tex_width/(float)pixel_size, (float)tex_height/(float)pixel_size, 1.0f, 1.0f)); 02394 } 02395 else 02396 { 02397 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 0, pixel_size, pixel_size, 1.0f, 1.0f)); 02398 CHECKGL ( glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB, 1, 1.0f/pixel_size, 1.0f/pixel_size, 1.0f, 1.0f)); 02399 } 02400 02401 CHECKGL ( glEnableVertexAttribArrayARB (VertexLocation) ); 02402 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer) ); 02403 02404 if (TextureCoord0Location != -1) 02405 { 02406 CHECKGL ( glEnableVertexAttribArrayARB (TextureCoord0Location) ); 02407 CHECKGL ( glVertexAttribPointerARB ( (GLuint) TextureCoord0Location, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 4) ); 02408 } 02409 02410 if (VertexColorLocation != -1) 02411 { 02412 CHECKGL ( glEnableVertexAttribArrayARB (VertexColorLocation) ); 02413 CHECKGL ( glVertexAttribPointerARB ( (GLuint) VertexColorLocation, 4, GL_FLOAT, GL_FALSE, 48, VtxBuffer + 8) ); 02414 } 02415 02416 CHECKGL ( glDrawArrays (GL_TRIANGLE_FAN, 0, 4) ); 02417 02418 CHECKGL ( glDisableVertexAttribArrayARB (VertexLocation) ); 02419 02420 if (TextureCoord0Location != -1) 02421 CHECKGL ( glDisableVertexAttribArrayARB (TextureCoord0Location) ); 02422 02423 if (VertexColorLocation != -1) 02424 CHECKGL ( glDisableVertexAttribArrayARB (VertexColorLocation) ); 02425 02426 shader_program->End(); 02427 } 02428 02429 ObjectPtr<IOpenGLBaseTexture> GraphicsEngine::QRP_ASM_GetPixelBlocks ( 02430 ObjectPtr<IOpenGLBaseTexture> device_texture, TexCoordXForm &texxform0, const Color& c0, int pixel_size) 02431 { 02432 int quad_width = device_texture->GetWidth (); 02433 int quad_height = device_texture->GetHeight (); 02434 02435 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject (); 02436 int previous_width = 0; 02437 int previous_height = 0; 02438 if (prevFBO.IsValid ()) 02439 { 02440 previous_width = prevFBO->GetWidth (); 02441 previous_height = prevFBO->GetHeight (); 02442 } 02443 else 02444 { 02445 previous_width = _graphics_display.GetWindowWidth (); 02446 previous_height = _graphics_display.GetWindowHeight (); 02447 } 02448 02449 CHECKGL (glClearColor (0, 0, 0, 0)); 02450 SetFrameBufferHelper (_offscreen_fbo, _offscreen_color_rt0, _offscreen_depth_rt0, quad_width, quad_height); 02451 CHECKGL (glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)); 02452 QRP_ASM_Pixelate (0, 0, quad_width, quad_height, device_texture, texxform0, c0, pixel_size); 02453 02454 _offscreen_fbo->Deactivate (); 02455 02456 if (prevFBO.IsValid ()) 02457 { 02458 prevFBO->Activate (true); 02459 SetViewport (0, 0, previous_width, previous_height); 02460 } 02461 else 02462 { 02463 SetViewport (0, 0, previous_width, previous_height); 02464 } 02465 return _offscreen_color_rt0; 02466 } 02467 02468 void GraphicsEngine::QRP_ASM_GetCopyTexture( 02469 int width, int height, 02470 ObjectPtr<IOpenGLBaseTexture>& dst_device_texture, 02471 ObjectPtr<IOpenGLBaseTexture>& src_device_texture, 02472 TexCoordXForm &texxform0, const Color& c0) 02473 { 02474 if (src_device_texture.IsValid() == false) 02475 { 02476 return; 02477 } 02478 02479 ObjectPtr<IOpenGLFrameBufferObject> prevFBO = GetGraphicsDisplay()->GetGpuDevice()->GetCurrentFrameBufferObject(); 02480 int previous_width = 0; 02481 int previous_height = 0; 02482 02483 if (prevFBO.IsValid()) 02484 { 02485 previous_width = prevFBO->GetWidth(); 02486 previous_height = prevFBO->GetHeight(); 02487 } 02488 else 02489 { 02490 previous_width = _graphics_display.GetWindowWidth(); 02491 previous_height = _graphics_display.GetWindowHeight(); 02492 } 02493 02494 if ((dst_device_texture.IsValid() == false) || 02495 (dst_device_texture->GetWidth() != width) || 02496 (dst_device_texture->GetHeight() != height) || 02497 (dst_device_texture->GetPixelFormat() != src_device_texture->GetPixelFormat())) 02498 { 02499 dst_device_texture = _graphics_display.GetGpuDevice()->CreateTexture(width, height, 1, src_device_texture->GetPixelFormat()); 02500 } 02501 02502 CHECKGL(glClearColor(0, 0, 0, 0)); 02503 ObjectPtr<IOpenGLBaseTexture> depth_buffer(NULL); 02504 SetFrameBufferHelper(_offscreen_fbo, dst_device_texture, depth_buffer, width, height); 02505 CHECKGL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)); 02506 02507 QRP_ASM_1Tex(0, 0, width, height, src_device_texture, texxform0, c0); 02508 02509 _offscreen_fbo->Deactivate(); 02510 02511 if (prevFBO.IsValid()) 02512 { 02513 prevFBO->Activate(true); 02514 SetViewport(0, 0, previous_width, previous_height); 02515 } 02516 else 02517 { 02518 SetViewport(0, 0, previous_width, previous_height); 02519 } 02520 } 02521 } 02522 #endif // NUX_OPENGLES_20 02523