void InitTexMergeShaders (void) { int i, b; if (!gameStates.ogl.bShadersOk) gameOpts->ogl.bGlTexMerge = 0; if (!gameOpts->ogl.bGlTexMerge) gameStates.render.textures.bGlsTexMergeOk = 0; else { LogErr ("building texturing shader programs\n"); for (i = 0; i < 2; i++) { if (tmShaderProgs [i]) DeleteShaderProg (tmShaderProgs + i); b = CreateShaderProg (tmShaderProgs + i) && CreateShaderFunc (tmShaderProgs + i, tmf + i, tmv + i, texMergeFS [i], texMergeVS [i], 1) && - LinkShaderProg (tmShaderProgs + i); if (i == 2) gameStates.render.textures.bHaveMaskShader = b; else gameStates.render.textures.bGlsTexMergeOk = b; if (!gameStates.render.textures.bGlsTexMergeOk) { while (i) DeleteShaderProg (tmShaderProgs + --i); break; } } if (!gameStates.render.textures.bGlsTexMergeOk) gameOpts->ogl.bGlTexMerge = 0; } if (!(gameOpts->ogl.bGlTexMerge && gameStates.render.textures.bGlsTexMergeOk)) gameStates.ogl.bHaveTexCompression = 0; }
void InitGlareShader (void) { int bOk; ogl.m_states.bDepthBlending = 0; #if SHADER_SOFT_CORONAS PrintLog ("building corona blending shader program\n"); DeleteShaderProg (NULL); if (ogl.m_states.bRender2TextureOk && ogl.m_states.bShadersOk) { ogl.m_states.bDepthBlending = 1; for (int i = 0; i < 2; i++) { if (hGlareShader [i]) DeleteShaderProg (&hGlareShader [i]); bOk = CreateShaderProg (&hGlareShader [i]) && CreateShaderFunc (&hGlareShader [i], &hGlareFS [i], &hGlareVS [i], glareFS [i], glareVS, 1) && LinkShaderProg (&hGlareShader [i]); if (!bOk) { ogl.ClearError (0); ogl.m_states.bDepthBlending = 0; while (i) DeleteShaderProg (&hGlareShader [--i]); return; } } } #endif }
int LinkShaderProg (GLhandleARB *progP) { int i = 0; GLint bLinked; if (!progP) { progP = &genShaderProg; if (!*progP) return 0; if (gameOpts->ogl.bGlTexMerge) i |= 1; if (gameStates.render.nLightingMethod) i |= 2; if (!i) return 0; if (!CreateShaderFunc (progP, &mainFS, &mainVS, progFS [i - 1], progVS [i - 1], 0)) { DeleteShaderProg (progP); return 0; } } glLinkProgram (*progP); glGetObjectParameteriv (*progP, GL_OBJECT_LINK_STATUS_ARB, &bLinked); if (bLinked) return 1; PrintLog (" Couldn't link shader programs\n"); PrintShaderInfoLog (*progP, 1); DeleteShaderProg (progP); return 0; }
void DeleteHeadLightShader (void) { for (int i = 0; i < 2; i++) { for (int j = 0; j < 4; j++) { if (headLightShaderProgs [i][j]) { DeleteShaderProg (&headLightShaderProgs [i][j]); headLightShaderProgs [i][j] = 0; } } } }
void InitLightingShaders (int nLights) { int i, bOk; char *pszFS; if (nLights < 0) { nLights = gameData.render.ogl.nHeadLights; gameData.render.ogl.nHeadLights = 0; } if (nLights == gameData.render.ogl.nHeadLights) return; gameStates.render.bHaveDynLights = 0; LogErr ("building lighting shader programs\n"); if ((gameStates.ogl.bHeadLight = (gameStates.ogl.bShadersOk && gameOpts->render.nPath))) { gameStates.render.bHaveDynLights = 1; for (i = 0; i < 4; i++) { if (lightingShaderProgs [i]) DeleteShaderProg (lightingShaderProgs + i); #ifndef _DEBUG if (nLights == 1) pszFS = lightingFS [i]; else #endif pszFS = BuildLightingShader (lightingFS [i + 4], nLights); bOk = (pszFS != NULL) && CreateShaderProg (lightingShaderProgs + i) && CreateShaderFunc (lightingShaderProgs + i, lfs + i, lvs + i, pszFS, lightingVS [i % 4], 1) && LinkShaderProg (lightingShaderProgs + i); if (pszFS && (nLights > 1)) D2_FREE (pszFS); if (!bOk) { gameStates.ogl.bHeadLight = 0; while (i) DeleteShaderProg (lightingShaderProgs + --i); nLights = 0; break; } } } gameData.render.ogl.nHeadLights = nLights; }
void InitBlurShader (void) { int bOk; PrintLog ("building blur shader program\n"); DeleteShaderProg (NULL); if (gameStates.ogl.bRender2TextureOk && gameStates.ogl.bShadersOk && RENDERPATH) { gameStates.ogl.bHaveBlur = 1; if (hBlurShader) DeleteShaderProg (&hBlurShader); bOk = CreateShaderProg (&hBlurShader) && CreateShaderFunc (&hBlurShader, &hBlurFS, &hBlurVS, blurFS, blurVS, 1) && LinkShaderProg (&hBlurShader); if (!bOk) { gameStates.ogl.bHaveBlur = 0; DeleteShaderProg (&hBlurShader); return; } ogl.ClearError (0); } }
void InitGlareShader (void) { int bOk; gameStates.ogl.bDepthBlending = 0; #if SHADER_SOFT_CORONAS LogErr ("building corona blending shader program\n"); DeleteShaderProg (NULL); if (gameStates.ogl.bRender2TextureOk && gameStates.ogl.bShadersOk && gameOpts->render.nPath) { gameStates.ogl.bDepthBlending = 1; if (hGlareShader) DeleteShaderProg (&hGlareShader); bOk = CreateShaderProg (&hGlareShader) && CreateShaderFunc (&hGlareShader, &hGlareFS, &hGlareVS, glareFS, glareVS, 1) && LinkShaderProg (&hGlareShader); if (!bOk) { gameStates.ogl.bDepthBlending = 0; DeleteShaderProg (&hGlareShader); } } #endif }
void InitLightmapShaders (void) { int i; if (!gameStates.ogl.bShadersOk) gameStates.render.color.bLightMapsOk = 0; if (gameStates.render.color.bLightMapsOk) { LogErr ("building lightmap shader programs\n"); for (i = 0; i < 2; i++) { if (lmShaderProgs [i]) DeleteShaderProg (lmShaderProgs + i); gameStates.render.color.bLightMapsOk = CreateShaderProg (lmShaderProgs + i) && CreateShaderFunc (lmShaderProgs + i, lmFS + i, lmVS + i, lightMapFS [i], lightMapVS [i], 1) && LinkShaderProg (lmShaderProgs + i); if (!gameStates.render.color.bLightMapsOk) { while (i) DeleteShaderProg (lmShaderProgs + --i); break; } } } }
void InitGlareShader (void) { int bOk; ogl.m_states.bDepthBlending = 0; #if SHADER_SOFT_CORONAS PrintLog ("building corona blending shader program\n"); DeleteShaderProg (NULL); if (ogl.m_states.bRender2TextureOk && ogl.m_states.bShadersOk) { ogl.m_states.bDepthBlending = 1; if (hGlareShader) DeleteShaderProg (&hGlareShader); bOk = CreateShaderProg (&hGlareShader) && CreateShaderFunc (&hGlareShader, &hGlareFS, &hGlareVS, glareFS, glareVS, 1) && LinkShaderProg (&hGlareShader); if (!bOk) { ogl.m_states.bDepthBlending = 0; DeleteShaderProg (&hGlareShader); return; } ogl.ClearError (0); } #endif }
void InitHeadlightShaders (int nLights) { int i, j, bOk; char *pszFS; if (nLights < 0) { nLights = gameData.render.ogl.nHeadLights; gameData.render.ogl.nHeadLights = 0; } if (nLights == gameData.render.ogl.nHeadLights) return; gameStates.render.bHaveDynLights = 0; PrintLog ("building lighting shader programs\n"); if ((gameStates.ogl.bHeadLight = (gameStates.ogl.bShadersOk && gameOpts->render.nPath))) { gameStates.render.bHaveDynLights = 1; for (i = 0; i < 2; i++) { for (j = 0; j < 4; j++) { if (headLightShaderProgs [i][j]) DeleteShaderProg (&headLightShaderProgs [i][j]); #if 1//ndef _DEBUG if (nLights == 1) pszFS = headLightFS [i][j]; else #endif pszFS = BuildLightingShader (headLightFS [i][j + 4], nLights); bOk = (pszFS != NULL) && CreateShaderProg (&headLightShaderProgs [i][j]) && CreateShaderFunc (&headLightShaderProgs [i][j], &lfs [i][j], &lvs [i][j], pszFS, headLightVS [i][j], 1) && LinkShaderProg (&headLightShaderProgs [i][j]); if (pszFS && (nLights > 1)) D2_FREE (pszFS); if (!bOk) { DeleteHeadLightShader (); nLights = 0; break; } } } } gameData.render.ogl.nHeadLights = nLights; }