亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? glh_extensions.h

?? Particles and bodies interaction engine
?? H
字號:
// Comments:
//
//   The trick with GLH_EXT_SINGLE_FILE is that you need to have it defined in
// exactly one cpp file because it piggy-backs the function implementations in
// the header.  You don't want multiple implementations defined or the linker
// gets mad, but one file must have the implementations in it or the linker
// gets mad for different reasons.
// 
//   The goal was to avoid having this helper require a separate cpp file.  One
// thing you could do is just have a glh_extensions.cpp that did
// 
// #define GLH_EXT_SINGLE_FILE
// #include <glh_extensions.h>
//
// and make it the only file that ever defines GLH_EXT_SINGLE_FILE.

#ifndef GLH_EXTENSIONS
#define GLH_EXTENSIONS

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined(WIN32)
# include <windows.h>
#endif

#ifdef MACOS
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif

#ifdef WIN32
# include <GL/wglext.h>
#endif

#define CHECK_MEMORY(ptr) \
    if (NULL == ptr) { \
        printf("Error allocating memory in file %s, line %d\n", __FILE__, __LINE__); \
        exit(-1); \
    }

#ifdef GLH_EXT_SINGLE_FILE
#  define GLH_EXTENSIONS_SINGLE_FILE  // have to do this because glh_genext.h unsets GLH_EXT_SINGLE_FILE
#endif

#if (defined(WIN32) || defined(UNIX))
#include "glh_genext.h"
#elif defined(MACOS)
#include <OpenGL/glext.h>
#else
#include <GL/glext.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef GLH_EXTENSIONS_SINGLE_FILE
static char *unsupportedExts = NULL;
static char *sysExts = NULL;
#ifndef GL_SHADER_CONSISTENT_NV
#define GL_SHADER_CONSISTENT_NV           0x86DD
#endif
#ifndef GL_TEXTURE_SHADER_NV
#define GL_TEXTURE_SHADER_NV              0x86DE
#endif
#ifndef GL_SHADER_OPERATION_NV
#define GL_SHADER_OPERATION_NV            0x86DF
#endif

static int ExtensionExists(const char* extName, const char* sysExts)
{
    char *padExtName = (char*)malloc(strlen(extName) + 2);
    strcat(strcpy(padExtName, extName), " ");

    if (0 == strcmp(extName, "GL_VERSION_1_2")) {
        const char *version = (const char*)glGetString(GL_VERSION);
        if (strstr(version, "1.0") == version || strstr(version, "1.1") == version) {
            return GL_FALSE;
        } else {
            return GL_TRUE;
        }
    }
    if (0 == strcmp(extName, "GL_VERSION_1_3")) {
        const char *version = (const char*)glGetString(GL_VERSION);
        if (strstr(version, "1.0") == version ||
            strstr(version, "1.1") == version ||
            strstr(version, "1.2") == version) {
            return GL_FALSE;
        } else {
            return GL_TRUE;
        }
    }
    if (0 == strcmp(extName, "GL_VERSION_1_4")) {
        const char *version = (const char*)glGetString(GL_VERSION);
        if (strstr(version, "1.0") == version ||
            strstr(version, "1.1") == version ||
            strstr(version, "1.2") == version || 
            strstr(version, "1.3") == version) {
            return GL_FALSE;
        } else {
            return GL_TRUE;
        }
    }
    if (0 == strcmp(extName, "GL_VERSION_1_5")) {
        const char *version = (const char*)glGetString(GL_VERSION);
        if (strstr(version, "1.0") == version ||
            strstr(version, "1.1") == version ||
            strstr(version, "1.2") == version || 
            strstr(version, "1.3") == version || 
            strstr(version, "1.4") == version) {
            return GL_FALSE;
        } else {
            return GL_TRUE;
        }
    }
    if (strstr(sysExts, padExtName)) {
        free(padExtName);
        return GL_TRUE;
    } else {
        free(padExtName);
        return GL_FALSE;
    }
}

static const char* EatWhiteSpace(const char *str)
{
    for (; *str && (' ' == *str || '\t' == *str || '\n' == *str); str++);
    return str;
}

static const char* EatNonWhiteSpace(const char *str)
{
    for (; *str && (' ' != *str && '\t' != *str && '\n' != *str); str++);
    return str;
}

int glh_init_extensions(const char *origReqExts)
{
    // Length of requested extensions string
    size_t reqExtsLen;
    char *reqExts;
    // Ptr for individual extensions within reqExts
    char *reqExt;
    int success = GL_TRUE;
    // build space-padded extension string
    if (NULL == sysExts) {
        const char *extensions = (const char*)glGetString(GL_EXTENSIONS);
        size_t sysExtsLen = strlen(extensions);
        const char *winsys_extensions = "";     
        size_t winsysExtsLen = 0;
#if defined(WIN32)
        {
            PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = 0;
            wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
            if(wglGetExtensionsStringARB)
            {
                winsys_extensions = wglGetExtensionsStringARB(wglGetCurrentDC());
                winsysExtsLen = strlen(winsys_extensions);
            }
        }
#elif defined(UNIX)
        {

          winsys_extensions = glXQueryExtensionsString (glXGetCurrentDisplay(),DefaultScreen(glXGetCurrentDisplay())) ;
          winsysExtsLen = strlen (winsys_extensions);
        }
#endif
        // Add 2 bytes, one for padding space, one for terminating NULL
        sysExts = (char*)malloc(sysExtsLen + winsysExtsLen + 3);
        CHECK_MEMORY(sysExts);
        strcpy(sysExts, extensions);
        sysExts[sysExtsLen] = ' ';
        sysExts[sysExtsLen + 1] = 0;
        strcat(sysExts, winsys_extensions);
        sysExts[sysExtsLen + 1 + winsysExtsLen] = ' ';
        sysExts[sysExtsLen + 1 + winsysExtsLen + 1] = 0;
    }

    if (NULL == origReqExts)
        return GL_TRUE;
    reqExts = strdup(origReqExts);
    reqExtsLen = strlen(reqExts);
    if (NULL == unsupportedExts) {
        unsupportedExts = (char*)malloc(reqExtsLen + 2);
    } else if (reqExtsLen > strlen(unsupportedExts)) {
        unsupportedExts = (char*)realloc(unsupportedExts, reqExtsLen + 2);
    }
    CHECK_MEMORY(unsupportedExts);
    *unsupportedExts = 0;

    // Parse requested extension list
    for (reqExt = reqExts;
        (reqExt = (char*)EatWhiteSpace(reqExt)) && *reqExt;
        reqExt = (char*)EatNonWhiteSpace(reqExt))
    {
        char *extEnd = (char*)EatNonWhiteSpace(reqExt);
        char saveChar = *extEnd;
        *extEnd = (char)0;

#if (defined(WIN32) || defined(UNIX))
        if (!ExtensionExists(reqExt, sysExts) || !glh_init_extension(reqExt)) {
#elif defined(MACOS)
        if (!ExtensionExists(reqExt, sysExts)) {    // don't try to get function pointers if on MacOS
#endif
            // add reqExt to end of unsupportedExts
            strcat(unsupportedExts, reqExt);
            strcat(unsupportedExts, " ");
            success = GL_FALSE;
        }
        *extEnd = saveChar;
    }
    free(reqExts);
    return success;
}

const char* glh_get_unsupported_extensions()
{
    return (const char*)unsupportedExts;
}

void glh_shutdown_extensions()
{
    if (unsupportedExts)
    {
        free(unsupportedExts);
        unsupportedExts = NULL;
    }
    if (sysExts)
    {
        free(sysExts);
        sysExts = NULL;
    }
}

int glh_extension_supported(const char *extension)
{
    static const GLubyte *extensions = NULL;
    const GLubyte *start;
    GLubyte *where, *terminator;
    
    // Extension names should not have spaces.
    where = (GLubyte *) strchr(extension, ' ');
    if (where || *extension == '\0')
      return 0;
    
    if (!extensions)
      extensions = glGetString(GL_EXTENSIONS);

    // It takes a bit of care to be fool-proof about parsing the
    // OpenGL extensions string.  Don't be fooled by sub-strings,
    // etc.
    start = extensions;
    for (;;) 
    {
        where = (GLubyte *) strstr((const char *) start, extension);
        if (!where)
            break;
        terminator = where + strlen(extension);
        if (where == start || *(where - 1) == ' ') 
        {
            if (*terminator == ' ' || *terminator == '\0') 
            {
                return 1;
            }
        }
        start = terminator;
    }
    return 0;
}

#else
int glh_init_extensions(const char *origReqExts);
const char* glh_get_unsupported_extensions();
void glh_shutdown_extensions();
int glh_extension_supported(const char *extension);
#endif /* GLH_EXT_SINGLE_FILE */

#ifdef __cplusplus
}
#endif

#endif /* GLH_EXTENSIONS */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91对白在线观看九色| 亚洲美腿欧美偷拍| 日韩国产高清影视| 91麻豆精品秘密| 国产精品乱码久久久久久| 国产精品一二一区| 久久蜜桃av一区二区天堂| 激情亚洲综合在线| 久久综合国产精品| 国产一区二区三区美女| 久久久美女艺术照精彩视频福利播放| 激情五月播播久久久精品| 337p粉嫩大胆噜噜噜噜噜91av| 免费av成人在线| 久久亚区不卡日本| 国产69精品久久777的优势| 国产视频不卡一区| av成人老司机| 一区二区在线观看av| 欧美视频日韩视频| 久久精品国产在热久久| 欧美精品一区二区三区很污很色的| 加勒比av一区二区| 欧美国产日韩亚洲一区| 91视频国产资源| 亚洲二区在线视频| 2欧美一区二区三区在线观看视频| 国产精品一区二区果冻传媒| 中文一区二区在线观看| 972aa.com艺术欧美| 国产精品成人免费| 色婷婷久久久综合中文字幕| 首页国产欧美久久| 欧美mv日韩mv国产网站app| 国产一区二区三区免费观看| 中文字幕一区三区| 精品婷婷伊人一区三区三| 日本三级亚洲精品| 久久免费视频一区| 欧美视频精品在线| 精品亚洲国产成人av制服丝袜 | 极品瑜伽女神91| 一区精品在线播放| 日韩欧美国产综合一区| 成人午夜激情在线| 天堂av在线一区| 国产精品久久久久一区| 91精品国产综合久久精品性色| 国产精品一级二级三级| 亚洲超碰97人人做人人爱| 久久久久久久av麻豆果冻| 欧美午夜精品免费| 国产成人99久久亚洲综合精品| 亚洲午夜影视影院在线观看| 久久精品亚洲一区二区三区浴池 | 午夜久久久影院| 欧美国产成人精品| 日韩一区二区免费视频| 91美女片黄在线| 国产盗摄视频一区二区三区| 偷窥少妇高潮呻吟av久久免费| 久久精品亚洲国产奇米99| 欧美日韩国产首页| 99久久精品国产毛片| 国产精品自拍三区| 日韩电影在线免费看| 亚洲视频一区在线观看| 欧美顶级少妇做爰| 色爱区综合激月婷婷| 成人午夜短视频| 国产综合色在线视频区| 五月激情六月综合| 国产欧美va欧美不卡在线| 日韩欧美一区在线| 欧美日本韩国一区| 色婷婷av一区二区三区大白胸| 国产福利一区二区三区视频在线 | 日韩影视精彩在线| 亚洲精品视频一区二区| 亚洲国产岛国毛片在线| 欧美成人一区二区三区片免费| 欧美羞羞免费网站| 日本高清无吗v一区| zzijzzij亚洲日本少妇熟睡| 国产在线播放一区三区四| 久草精品在线观看| 韩国成人福利片在线播放| 老司机免费视频一区二区| 日本欧美一区二区在线观看| 亚洲成人精品一区| 石原莉奈在线亚洲三区| 亚洲情趣在线观看| 亚洲乱码国产乱码精品精98午夜 | 欧美一区二区三区免费在线看| 成人a级免费电影| 成人精品免费视频| caoporm超碰国产精品| 成人av第一页| 色呦呦国产精品| 欧美亚洲高清一区| 欧美一区二区精品在线| 欧美tickling网站挠脚心| 国产亚洲精品超碰| 亚洲国产精品99久久久久久久久 | 欧美亚洲国产bt| 在线不卡中文字幕播放| 91精品国产免费| 日韩精品资源二区在线| 欧美成人精精品一区二区频| 精品盗摄一区二区三区| 久久久九九九九| 亚洲少妇30p| 亚洲成人av一区二区| 日本伊人午夜精品| 精品午夜久久福利影院| 国产一区二区不卡| 成人手机电影网| 99久久久久免费精品国产 | 日韩欧美一级二级三级| 国产精品久久久一本精品| 亚洲永久免费av| 久久国产精品99精品国产| 成人97人人超碰人人99| 欧美日韩你懂得| 中文av一区特黄| 亚洲一区二区三区中文字幕| 免费在线观看精品| 大白屁股一区二区视频| 欧美日韩卡一卡二| 久久婷婷色综合| 一区二区三区波多野结衣在线观看| 天天色综合成人网| 国产91清纯白嫩初高中在线观看 | 亚洲www啪成人一区二区麻豆| 久久国内精品自在自线400部| 99亚偷拍自图区亚洲| 欧美老女人在线| 中日韩免费视频中文字幕| 日韩不卡手机在线v区| 成人免费高清在线观看| 欧美日韩mp4| 久久久久久亚洲综合| 午夜精品成人在线视频| 国产精品自拍三区| 欧美一区二区三区免费观看视频| 国产精品久久久久一区二区三区共| 视频一区中文字幕国产| av日韩在线网站| 精品国产91乱码一区二区三区| 亚洲美女偷拍久久| 国产乱码字幕精品高清av| 欧美色爱综合网| 国产精品第一页第二页第三页| 美女视频第一区二区三区免费观看网站 | 欧美成人a视频| 亚洲综合成人网| 高清不卡在线观看| 久久香蕉国产线看观看99| 亚洲日本va在线观看| 国产成人免费视频精品含羞草妖精 | 91精品国产综合久久香蕉麻豆| 中文字幕一区二区在线播放| 国产在线精品一区二区不卡了| 欧美三级电影网| 自拍视频在线观看一区二区| 亚洲一区二区三区在线| www.久久精品| 国产精品乱子久久久久| 国产成人精品免费网站| 日韩免费在线观看| 天天免费综合色| 欧美日精品一区视频| 亚洲天堂精品视频| 97国产一区二区| 亚洲人被黑人高潮完整版| 成人av中文字幕| 亚洲国产精品精华液ab| 国产成人亚洲综合a∨婷婷| 26uuu亚洲综合色| 国产综合色精品一区二区三区| 欧美一区二区三区色| 男人的j进女人的j一区| 欧美精品久久天天躁| 五月天网站亚洲| 88在线观看91蜜桃国自产| 天天影视网天天综合色在线播放| 欧美私模裸体表演在线观看| 亚洲精品美国一| 欧美亚洲国产一区二区三区va| 亚洲无人区一区| 欧美片网站yy| 久久精品国产亚洲高清剧情介绍| 4438x成人网最大色成网站| 日本伊人精品一区二区三区观看方式| 欧美一区二区视频在线观看 | 欧美一级片在线| 激情文学综合插| 国产精品久久久久影院老司| av电影一区二区| 午夜国产精品一区|