CShadowHandler::CShadowHandler(void) { const bool tmpFirstInstance = firstInstance; firstInstance = false; drawShadows = false; inShadowPass = false; showShadowMap = false; firstDraw = true; shadowTexture = 0; if (!tmpFirstInstance && !canUseShadows) { return; } const bool haveShadowExts = GLEW_ARB_vertex_program && GLEW_ARB_shadow && GLEW_ARB_depth_texture && GLEW_ARB_texture_env_combine; const int configValue = configHandler.Get("Shadows", 0); if (configValue < 0 || !haveShadowExts) { logOutput.Print("shadows disabled or required OpenGL extension missing"); return; } shadowMapSize = configHandler.Get("ShadowMapSize", DEFAULT_SHADOWMAPSIZE); if (tmpFirstInstance) { // this already checks for GLEW_ARB_fragment_program if (!ProgramStringIsNative(GL_FRAGMENT_PROGRAM_ARB, "unit.fp")) { logOutput.Print("Your GFX card does not support the fragment programs needed for shadows"); return; } // this was previously set to true (redundantly since // it was actually never made false anywhere) if either // 1. (!GLEW_ARB_texture_env_crossbar && haveShadowExts) // 2. (!GLEW_ARB_shadow_ambient && GLEW_ARB_shadow) // but the non-FP result isn't nice anyway so just always // use the program if we are guaranteed of shadow support useFPShadows = true; if (!GLEW_ARB_shadow_ambient) { // can't use arbitrary texvals in case the depth comparison op fails (only 0) logOutput.Print("You are missing the \"ARB_shadow_ambient\" extension (this will probably make shadows darker than they should be)"); } } if (!InitDepthTarget()) { return; } if (tmpFirstInstance) { canUseShadows = true; } if (configValue == 0) { // free any resources allocated by InitDepthTarget() glDeleteTextures(1, &shadowTexture); shadowTexture = 0; return; // drawShadows is still false } drawShadows = true; }
void CShadowHandler::Init() { const bool tmpFirstInit = firstInit; firstInit = false; shadowConfig = configHandler->GetInt("Shadows"); shadowMapSize = configHandler->GetInt("ShadowMapSize"); shadowProMode = configHandler->GetInt("ShadowProjectionMode"); shadowGenBits = SHADOWGEN_BIT_NONE; shadowsLoaded = false; inShadowPass = false; shadowTexture = 0; dummyColorTexture = 0; if (!tmpFirstInit && !shadowsSupported) { return; } // possible values for the "Shadows" config-parameter: // < 0: disable and don't try to initialize // 0: disable, but still check if the hardware is able to run them // > 0: enabled (by default for all shadow-casting geometry if equal to 1) if (shadowConfig < 0) { LOG("[%s] shadow rendering is disabled (config-value %d)", __FUNCTION__, shadowConfig); return; } if (shadowConfig > 0) shadowGenBits = SHADOWGEN_BIT_MODEL | SHADOWGEN_BIT_MAP | SHADOWGEN_BIT_PROJ | SHADOWGEN_BIT_TREE; if (shadowConfig > 1) { shadowGenBits &= (~shadowConfig); } if (!globalRendering->haveARB && !globalRendering->haveGLSL) { LOG_L(L_WARNING, "[%s] GPU does not support either ARB or GLSL shaders for shadow rendering", __FUNCTION__); return; } if (!globalRendering->haveGLSL) { if (!GLEW_ARB_shadow || !GLEW_ARB_depth_texture || !GLEW_ARB_texture_env_combine) { LOG_L(L_WARNING, "[%s] required OpenGL ARB-extensions missing for shadow rendering", __FUNCTION__); // NOTE: these should only be relevant for FFP shadows // return; } if (!GLEW_ARB_shadow_ambient) { // can't use arbitrary texvals in case the depth comparison op fails (only 0) LOG_L(L_WARNING, "[%s] \"ARB_shadow_ambient\" extension missing (will probably make shadows darker than they should be)", __FUNCTION__); } } if (!InitDepthTarget()) { // free any resources allocated by InitDepthTarget() if (fb.IsValid()) fb.DetachAll(); glDeleteTextures(1, &shadowTexture ); glDeleteTextures(1, &dummyColorTexture); LOG_L(L_ERROR, "[%s] failed to initialize depth-texture FBO", __FUNCTION__); return; } if (tmpFirstInit) { shadowsSupported = true; } if (shadowConfig == 0) { // free any resources allocated by InitDepthTarget() if (fb.IsValid()) fb.DetachAll(); glDeleteTextures(1, &shadowTexture ); glDeleteTextures(1, &dummyColorTexture); // shadowsLoaded is still false return; } LoadShadowGenShaderProgs(); }
CShadowHandler::CShadowHandler(void): fb(0) { const bool tmpFirstInstance = firstInstance; firstInstance = false; drawShadows = false; inShadowPass = false; showShadowMap = false; firstDraw = true; shadowTexture = 0; if (!tmpFirstInstance && !canUseShadows) { return; } const int configValue = configHandler.GetInt("Shadows", 0); if (configValue < 0) { return; } shadowMapSize=configHandler.GetInt("ShadowMapSize",DEFAULT_SHADOWMAPSIZE); if (tmpFirstInstance) { if(!(GLEW_ARB_fragment_program && GLEW_ARB_fragment_program_shadow)){ logOutput.Print("You are missing an OpenGL extension needed to use shadowmaps (fragment_program_shadow)"); return; } if(!ProgramStringIsNative(GL_FRAGMENT_PROGRAM_ARB,"unit.fp")){ logOutput.Print("Your GFX card doesnt support the fragment programs needed to run in shadowed mode"); return; } if(!(GLEW_ARB_shadow && GLEW_ARB_depth_texture && GLEW_ARB_vertex_program && GLEW_ARB_texture_env_combine && GLEW_ARB_texture_env_crossbar)){ if(GLEW_ARB_shadow && GLEW_ARB_depth_texture && GLEW_ARB_vertex_program && GLEW_ARB_texture_env_combine && GLEW_ARB_fragment_program && GLEW_ARB_fragment_program_shadow){ //logOutput.Print("Using ARB_fragment_program_shadow"); useFPShadows=true; // FIXME -- always true } else { logOutput.Print("You are missing an OpenGL extension needed to use shadowmaps"); return; } } if(!GLEW_ARB_shadow_ambient){ if(GLEW_ARB_fragment_program && GLEW_ARB_fragment_program_shadow){ if(!useFPShadows){ //logOutput.Print("Using ARB_fragment_program_shadow"); } useFPShadows = true; // FIXME -- always true } else { logOutput.Print("You are missing the extension ARB_shadow_ambient, this will make shadows darker than they should be"); } } } if (!InitDepthTarget()) { return; } if (tmpFirstInstance) { canUseShadows = true; } if (configValue == 0) { // free any resources allocated by InitDepthTarget() delete fb; fb = NULL; glDeleteTextures(1, &shadowTexture); shadowTexture = 0; return; // drawShadows is still false } drawShadows = true; // useFPShadows = true; // FIXME -- why was this being forced? }
CShadowHandler::CShadowHandler(void) { const bool tmpFirstInstance = firstInstance; firstInstance = false; drawShadows = false; inShadowPass = false; shadowTexture = 0; dummyColorTexture = 0; drawTerrainShadow = true; p17 = 0.0f; p18 = 0.0f; xmid = 0; ymid = 0; x1 = 0.0f; y1 = 0.0f; x2 = 0.0f; y2 = 0.0f; if (!tmpFirstInstance && !canUseShadows) { return; } const bool haveShadowExts = GLEW_ARB_vertex_program && GLEW_ARB_shadow && GLEW_ARB_depth_texture && GLEW_ARB_texture_env_combine; //! Shadows possible values: //! -1 : disable and don't try to initialize //! 0 : disable, but still check if the hardware is able to run them //! 1 : enable (full detail) //! 2 : enable (no terrain) const int configValue = configHandler->Get("Shadows", 0); if (configValue >= 2) drawTerrainShadow = false; if (configValue < 0 || !haveShadowExts) { logOutput.Print("shadows disabled or required OpenGL extension missing"); return; } shadowMapSize = configHandler->Get("ShadowMapSize", DEFAULT_SHADOWMAPSIZE); if (tmpFirstInstance) { // this already checks for GLEW_ARB_fragment_program if (!ProgramStringIsNative(GL_FRAGMENT_PROGRAM_ARB, "ARB/units3o.fp")) { logOutput.Print("Your GFX card does not support the fragment programs needed for shadows"); return; } // this was previously set to true (redundantly since // it was actually never made false anywhere) if either // 1. (!GLEW_ARB_texture_env_crossbar && haveShadowExts) // 2. (!GLEW_ARB_shadow_ambient && GLEW_ARB_shadow) // but the non-FP result isn't nice anyway so just always // use the program if we are guaranteed of shadow support useFPShadows = true; if (!GLEW_ARB_shadow_ambient) { // can't use arbitrary texvals in case the depth comparison op fails (only 0) logOutput.Print("You are missing the \"ARB_shadow_ambient\" extension (this will probably make shadows darker than they should be)"); } } if (!InitDepthTarget()) { return; } if (tmpFirstInstance) { canUseShadows = true; } if (configValue == 0) { // free any resources allocated by InitDepthTarget() glDeleteTextures(1, &shadowTexture); shadowTexture = 0; glDeleteTextures(1, &dummyColorTexture); dummyColorTexture = 0; return; // drawShadows is still false } LoadShadowGenShaderProgs(); }
void CShadowHandler::Init() { const bool tmpFirstInit = firstInit; firstInit = false; shadowConfig = configHandler->GetInt("Shadows"); shadowMapSize = configHandler->GetInt("ShadowMapSize"); // disabled; other option usually produces worse resolution // shadowProMode = configHandler->GetInt("ShadowProjectionMode"); shadowProMode = SHADOWPROMODE_CAM_CENTER; shadowGenBits = SHADOWGEN_BIT_NONE; shadowsLoaded = false; inShadowPass = false; shadowTexture = 0; dummyColorTexture = 0; if (!tmpFirstInit && !shadowsSupported) return; // possible values for the "Shadows" config-parameter: // < 0: disable and don't try to initialize // 0: disable, but still check if the hardware is able to run them // > 0: enabled (by default for all shadow-casting geometry if equal to 1) if (shadowConfig < 0) { LOG("[%s] shadow rendering is disabled (config-value %d)", __FUNCTION__, shadowConfig); return; } if (shadowConfig > 0) shadowGenBits = SHADOWGEN_BIT_MODEL | SHADOWGEN_BIT_MAP | SHADOWGEN_BIT_PROJ | SHADOWGEN_BIT_TREE; if (shadowConfig > 1) { shadowGenBits &= (~shadowConfig); } // no warnings when running headless if (SpringVersion::IsHeadless()) return; if (!globalRendering->haveARB && !globalRendering->haveGLSL) { LOG_L(L_WARNING, "[%s] GPU does not support either ARB or GLSL shaders for shadow rendering", __FUNCTION__); return; } if (!globalRendering->haveGLSL) { if (!GLEW_ARB_shadow || !GLEW_ARB_depth_texture || !GLEW_ARB_texture_env_combine) { LOG_L(L_WARNING, "[%s] required OpenGL ARB-extensions missing for shadow rendering", __FUNCTION__); // NOTE: these should only be relevant for FFP shadows // return; } if (!GLEW_ARB_shadow_ambient) { // can't use arbitrary texvals in case the depth comparison op fails (only 0) LOG_L(L_WARNING, "[%s] \"ARB_shadow_ambient\" extension missing (will probably make shadows darker than they should be)", __FUNCTION__); } } if (!InitDepthTarget()) { // free any resources allocated by InitDepthTarget() FreeTextures(); LOG_L(L_ERROR, "[%s] failed to initialize depth-texture FBO", __FUNCTION__); return; } if (tmpFirstInit) { shadowsSupported = true; } if (shadowConfig == 0) { // free any resources allocated by InitDepthTarget() FreeTextures(); // shadowsLoaded is still false return; } // same as glOrtho(-1, 1, -1, 1, -1, 1); just inverts Z // projMatrix[SHADOWMAT_TYPE_DRAWING].LoadIdentity(); // projMatrix[SHADOWMAT_TYPE_DRAWING].SetZ(-FwdVector); // same as glOrtho(0, 1, 0, 1, 0, -1); maps [0,1] to [-1,1] projMatrix[SHADOWMAT_TYPE_DRAWING].LoadIdentity(); projMatrix[SHADOWMAT_TYPE_DRAWING].Translate(-OnesVector); projMatrix[SHADOWMAT_TYPE_DRAWING].Scale(OnesVector * 2.0f); LoadShadowGenShaderProgs(); }