static void WINE_GLAPI wine_glFogfv(GLenum pname, const GLfloat *param) { if(pname == GL_FOG_COORDINATE_SOURCE_EXT) { WineD3DContext *ctx = getActiveContext(); ctx->gl_fog_source = (GLint) *param; if(*param == GL_FRAGMENT_DEPTH_EXT) { if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG); } else { WARN("Fog coords activated, but not supported. Using slow emulation\n"); old_fogcoord_glDisable(GL_FOG); } } else { if(pname == GL_FOG_COLOR) { WineD3DContext *ctx = getActiveContext(); ctx->fogcolor[0] = param[0]; ctx->fogcolor[1] = param[1]; ctx->fogcolor[2] = param[2]; ctx->fogcolor[3] = param[3]; } else if(pname == GL_FOG_START) { getActiveContext()->fogstart = *param; } else if(pname == GL_FOG_END) { getActiveContext()->fogend = *param; } old_fogcoord_glFogfv(pname, param); } }
static void wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { WineD3DContext *ctx = getActiveContext(); ctx->color[0] = r; ctx->color[1] = g; ctx->color[2] = b; ctx->color[3] = a; old_fogcoord_glColor4f(r, g, b, a); }
static void WINE_GLAPI wine_glDisable(GLenum cap) { if(cap == GL_FOG) { WineD3DContext *ctx = getActiveContext(); ctx->fog_enabled = 0; if(ctx->gl_fog_source != GL_FRAGMENT_DEPTH_EXT) return; } old_fogcoord_glDisable(cap); }
bool Context::isExtensionAvailable(const char* name) { static std::vector<std::string> extensions; static bool loaded = false; if (!loaded) { const Context* context = getActiveContext(); if (!context) return false; const char* extensionString = NULL; if(context->getSettings().majorVersion < 3) { // Try to load the < 3.0 way extensionString = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); do { const char* extension = extensionString; while(*extensionString && (*extensionString != ' ')) extensionString++; extensions.push_back(std::string(extension, extensionString)); } while (*extensionString++); } else { // Try to load the >= 3.0 way glGetStringiFuncType glGetStringiFunc = NULL; glGetStringiFunc = reinterpret_cast<glGetStringiFuncType>(getFunction("glGetStringi")); if (glGetStringiFunc) { int numExtensions = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions); if (numExtensions) { for (unsigned int i = 0; i < static_cast<unsigned int>(numExtensions); ++i) { extensionString = reinterpret_cast<const char*>(glGetStringiFunc(GL_EXTENSIONS, i)); extensions.push_back(extensionString); } } } } loaded = true; } return std::find(extensions.begin(), extensions.end(), name) != extensions.end(); }
static void WINE_GLAPI wine_glFogi(GLenum pname, GLint param) { if(pname == GL_FOG_COORDINATE_SOURCE_EXT) { WineD3DContext *ctx = getActiveContext(); ctx->gl_fog_source = param; if(param == GL_FRAGMENT_DEPTH_EXT) { if(ctx->fog_enabled) old_fogcoord_glEnable(GL_FOG); } else { WARN("Fog coords activated, but not supported. Using slow emulation\n"); old_fogcoord_glDisable(GL_FOG); } } else { if(pname == GL_FOG_START) { getActiveContext()->fogstart = param; } else if(pname == GL_FOG_END) { getActiveContext()->fogend = param; } old_fogcoord_glFogi(pname, param); } }
static void WINE_GLAPI wine_glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { WineD3DContext *ctx = getActiveContext(); if(ctx->gl_fog_source == GL_FOG_COORDINATE_EXT && ctx->fog_enabled) { GLfloat c[4] = {ctx->color[0], ctx->color[1], ctx->color[2], ctx->color[3]}; GLfloat i; i = (ctx->fogend - ctx->fog_coord_value) / (ctx->fogend - ctx->fogstart); c[0] = i * c[0] + (1.0 - i) * ctx->fogcolor[0]; c[1] = i * c[1] + (1.0 - i) * ctx->fogcolor[1]; c[2] = i * c[2] + (1.0 - i) * ctx->fogcolor[2]; old_fogcoord_glColor4f(c[0], c[1], c[2], c[3]); old_fogcoord_glVertex4f(x, y, z, w); } else { old_fogcoord_glVertex4f(x, y, z, w); } }
/* In D3D the fog coord is a UBYTE, so there's no problem with using the single * precision function */ static void wine_glFogCoordfEXT(GLfloat f) { WineD3DContext *ctx = getActiveContext(); ctx->fog_coord_value = f; }