stable-5.2
Günther Brammer 2009-05-28 01:36:03 +02:00
parent b2a16b8e1a
commit c6154b6881
2 changed files with 41 additions and 45 deletions

View File

@ -92,7 +92,7 @@ class CStdGL : public CStdDDraw
bool fFullscreen; // fullscreen mode? bool fFullscreen; // fullscreen mode?
int iClrDpt; // color depth int iClrDpt; // color depth
// shaders for the ARB extension // shaders for the ARB extension
GLuint shaders[13]; GLuint shaders[12];
// vertex buffer object // vertex buffer object
GLuint vbo; GLuint vbo;
public: public:

View File

@ -398,7 +398,6 @@ void CStdGL::BlitLandscape(SURFACE sfcSource, float fx, float fy,
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
} }
s=12; //Special-Shader!
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shaders[s]); glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shaders[s]);
if (Saturation < 255) if (Saturation < 255)
{ {
@ -488,10 +487,22 @@ void CStdGL::BlitLandscape(SURFACE sfcSource, float fx, float fy,
// color modulation // color modulation
// global modulation map // global modulation map
int i; if (shaders[0] && fUseClrModMap)
if (fUseClrModMap && dwModClr)
{ {
for (i=0; i<4; ++i) glActiveTexture(GL_TEXTURE3);
glLoadIdentity();
CSurface * pSurface = pClrModMap->GetSurface();
glScalef(1.0f/(pClrModMap->GetResolutionX()*(*pSurface->ppTex)->iSize), 1.0f/(pClrModMap->GetResolutionY()*(*pSurface->ppTex)->iSize), 1.0f);
glTranslatef(float(-pClrModMap->OffX), float(-pClrModMap->OffY), 0.0f);
glClientActiveTexture(GL_TEXTURE3);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(CBltVertex), &Vtx[0].ftx);
glClientActiveTexture(GL_TEXTURE0);
}
if (!shaders[0] && fUseClrModMap && dwModClr)
{
for (int i=0; i<4; ++i)
{ {
DWORD c = pClrModMap->GetModAt(int(Vtx[i].ftx), int(Vtx[i].fty)); DWORD c = pClrModMap->GetModAt(int(Vtx[i].ftx), int(Vtx[i].fty));
ModulateClr(c, dwModClr); ModulateClr(c, dwModClr);
@ -500,10 +511,10 @@ void CStdGL::BlitLandscape(SURFACE sfcSource, float fx, float fy,
} }
else else
{ {
for (i=0; i<4; ++i) for (int i=0; i<4; ++i)
DwTo4UB(dwModClr | dwModMask, Vtx[i].color); DwTo4UB(dwModClr | dwModMask, Vtx[i].color);
} }
for (i=0; i<4; ++i) for (int i=0; i<4; ++i)
{ {
Vtx[i].tx /= iTexSize; Vtx[i].tx /= iTexSize;
Vtx[i].ty /= iTexSize; Vtx[i].ty /= iTexSize;
@ -519,17 +530,14 @@ void CStdGL::BlitLandscape(SURFACE sfcSource, float fx, float fy,
if(mattextures[cnt]) if(mattextures[cnt])
{ {
shaderparam[0]=static_cast<GLfloat>(cnt)/255.0f; shaderparam[0]=static_cast<GLfloat>(cnt)/255.0f;
glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, shaderparam); glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 1, shaderparam);
//Bind Mat Texture
glActiveTexture(GL_TEXTURE1); //Bind Mat Texture glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, (*(mattextures[cnt]->ppTex))->texName); glBindTexture(GL_TEXTURE_2D, (*(mattextures[cnt]->ppTex))->texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glInterleavedArrays(GL_T2F_C4UB_V3F, sizeof(CBltVertex), Vtx); glInterleavedArrays(GL_T2F_C4UB_V3F, sizeof(CBltVertex), Vtx);
@ -786,6 +794,7 @@ bool CStdGL::RestoreDeviceObjects()
// reset blit states // reset blit states
dwBlitMode = 0; dwBlitMode = 0;
// Vertex Buffer Objects crash some versions of the free radeon driver. TODO: provide an option for them
if (0 && GLEW_ARB_vertex_buffer_object) if (0 && GLEW_ARB_vertex_buffer_object)
{ {
glGenBuffersARB(1, &vbo); glGenBuffersARB(1, &vbo);
@ -816,25 +825,9 @@ bool CStdGL::RestoreDeviceObjects()
"TEMP grey;\n" "TEMP grey;\n"
"DP3 grey, tmp, { 0.299, 0.587, 0.114, 1.0 };\n" "DP3 grey, tmp, { 0.299, 0.587, 0.114, 1.0 };\n"
"LRP tmp.rgb, program.local[0], tmp, grey;\n"; "LRP tmp.rgb, program.local[0], tmp, grey;\n";
const char * liquid =
"TEMP mask;\n"
"TEMP liquid;\n"
"TXP mask, fragment.texcoord, texture[1], 2D;\n"
"TXP liquid, fragment.texcoord, texture[2], 2D;\n"
// animation
"SUB liquid.rgb, liquid, {0.5, 0.5, 0.5, 0};\n"
"DP3 liquid.rgb, liquid, program.local[1];\n"
//"MAD_SAT tmp.rgb, mask.aaa, liquid, tmp;\n"
"MUL liquid.rgb, mask.aaaa, liquid;\n"
"ADD_SAT tmp.rgb, liquid, tmp;\n";
const char * fow =
"TEMP fow;\n"
// sample the texture
"TXP fow, fragment.texcoord[3], texture[3], 2D;\n"
"LRP tmp.rgb, fow.aaaa, tmp, fow;\n";
const char * landscape = const char * landscape =
"TEMP col;\n" "TEMP col;\n"
"MOV col.x, program.local[0].x;\n" //Load color to indentify "MOV col.x, program.local[1].x;\n" //Load color to indentify
"ADD col.y, col.x, 0.001;\n" "ADD col.y, col.x, 0.001;\n"
"SUB col.z, col.x, 0.001;\n" //epsilon-range "SUB col.z, col.x, 0.001;\n" //epsilon-range
"SGE tmp.r, tmp.b, 0.5015;\n" //Tunnel? "SGE tmp.r, tmp.b, 0.5015;\n" //Tunnel?
@ -846,24 +839,27 @@ bool CStdGL::RestoreDeviceObjects()
"MUL coo.xy, coo, 3.0;\n" "MUL coo.xy, coo, 3.0;\n"
"TXP tmp, coo, texture[1], 2D;\n" "TXP tmp, coo, texture[1], 2D;\n"
"MUL tmp.a, col.y, col.z;\n" "MUL tmp.a, col.y, col.z;\n"
"SUB tmp.a, 1.0, tmp.a;\n" "SUB tmp.a, 1.0, tmp.a;\n";
; const char * fow =
"TEMP fow;\n"
// sample the texture
"TXP fow, fragment.texcoord[3], texture[3], 2D;\n"
"LRP tmp.rgb, fow.aaaa, tmp, fow;\n";
const char * end = const char * end =
"MOV result.color, tmp;\n" "MOV result.color, tmp;\n"
"END\n"; "END\n";
DefineShaderARB(FormatString("%s%s%s", preface, alpha_add, end).getData(), shaders[0]); DefineShaderARB(FormatString("%s%s%s", preface, alpha_add, end).getData(), shaders[0]);
DefineShaderARB(FormatString("%s%s%s", preface, funny_add, end).getData(), shaders[1]); DefineShaderARB(FormatString("%s%s%s", preface, funny_add, end).getData(), shaders[1]);
DefineShaderARB(FormatString("%s%s%s%s", preface, liquid, alpha_add, end).getData(), shaders[2]); DefineShaderARB(FormatString("%s%s%s%s", preface, landscape, alpha_add, end).getData(), shaders[2]);
DefineShaderARB(FormatString("%s%s%s%s", preface, alpha_add, grey, end).getData(), shaders[3]); DefineShaderARB(FormatString("%s%s%s%s", preface, alpha_add, grey, end).getData(), shaders[3]);
DefineShaderARB(FormatString("%s%s%s%s", preface, funny_add, grey, end).getData(), shaders[4]); DefineShaderARB(FormatString("%s%s%s%s", preface, funny_add, grey, end).getData(), shaders[4]);
DefineShaderARB(FormatString("%s%s%s%s%s", preface, liquid, alpha_add, grey, end).getData(), shaders[5]); DefineShaderARB(FormatString("%s%s%s%s%s", preface, landscape, alpha_add, grey, end).getData(), shaders[5]);
DefineShaderARB(FormatString("%s%s%s%s", preface, alpha_add, fow, end).getData(), shaders[6]); DefineShaderARB(FormatString("%s%s%s%s", preface, alpha_add, fow, end).getData(), shaders[6]);
DefineShaderARB(FormatString("%s%s%s%s", preface, funny_add, fow, end).getData(), shaders[7]); DefineShaderARB(FormatString("%s%s%s%s", preface, funny_add, fow, end).getData(), shaders[7]);
DefineShaderARB(FormatString("%s%s%s%s%s", preface, liquid, alpha_add, fow, end).getData(), shaders[8]); DefineShaderARB(FormatString("%s%s%s%s%s", preface, landscape, alpha_add, fow, end).getData(), shaders[8]);
DefineShaderARB(FormatString("%s%s%s%s%s", preface, alpha_add, grey, fow, end).getData(), shaders[9]); DefineShaderARB(FormatString("%s%s%s%s%s", preface, alpha_add, grey, fow, end).getData(), shaders[9]);
DefineShaderARB(FormatString("%s%s%s%s%s", preface, funny_add, grey, fow, end).getData(), shaders[10]); DefineShaderARB(FormatString("%s%s%s%s%s", preface, funny_add, grey, fow, end).getData(), shaders[10]);
DefineShaderARB(FormatString("%s%s%s%s%s%s", preface, liquid, alpha_add, grey, fow, end).getData(), shaders[11]); DefineShaderARB(FormatString("%s%s%s%s%s%s", preface, landscape, alpha_add, grey, fow, end).getData(), shaders[11]);
DefineShaderARB(FormatString("%s%s%s", preface, landscape, end).getData(), shaders[12]);
} }
// done // done
return Active; return Active;