Example #1
0
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);
    }
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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();
}
Example #5
0
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);
    }
}
Example #6
0
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);
    }
}
Example #7
0
/* 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;
}