⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extgl.cpp

📁 030_Particle_system using opengl
💻 CPP
字号:
#include "init.h"

/* getProcAddress */
static void *extgl_GetProcAddress(char *name)
{
    void *t = wglGetProcAddress(name);
    if (t == NULL)ext.z_error = 1;  
    return t;
} 

#ifdef GL_ARB_multitexture
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL;
PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = NULL;
PFNGLMULTITEXCOORD1FARBPROC glMultiTexCoord1fARB = NULL;
PFNGLMULTITEXCOORD1FVARBPROC glMultiTexCoord1fvARB = NULL;
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL;
PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB = NULL;
PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB = NULL;
PFNGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fvARB = NULL;
//PFNGLMULTITEXCOORD4FARBPROC glMultiTexCoord4fARB = NULL;
//PFNGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fvARB = NULL;
#endif

#ifdef GL_ARB_vertex_program
glVertexAttrib3fARBPROC glVertexAttrib3fARB = NULL;
glVertexAttrib4fARBPROC glVertexAttrib4fARB = NULL;
glVertexAttrib3fvARBPROC glVertexAttrib3fvARB = NULL;
glVertexAttrib4fvARBPROC glVertexAttrib4fvARB = NULL;

glProgramStringARBPROC glProgramStringARB = NULL;
glBindProgramARBPROC glBindProgramARB = NULL;
glDeleteProgramsARBPROC glDeleteProgramsARB = NULL;
glGenProgramsARBPROC glGenProgramsARB = NULL;

glProgramEnvParameter4fARBPROC glProgramEnvParameter4fARB = NULL;
glProgramEnvParameter4fvARBPROC glProgramEnvParameter4fvARB = NULL;

glProgramLocalParameter4fARBPROC glProgramLocalParameter4fARB = NULL;
glProgramLocalParameter4fvARBPROC glProgramLocalParameter4fvARB = NULL;

glGetProgramivARBPROC glGetProgramivARB = NULL;
glGetProgramStringARBPROC glGetProgramStringARB = NULL;
#endif /* GL_ARB_vertex_program */

static inline init_ARB_multitexture()
{
	glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) extgl_GetProcAddress("glActiveTextureARB");
	glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) extgl_GetProcAddress("glClientActiveTextureARB");

	glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) extgl_GetProcAddress("glMultiTexCoord1fARB");
	glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) extgl_GetProcAddress("glMultiTexCoord1fvARB");
	glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) extgl_GetProcAddress("glMultiTexCoord2fARB");
	glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) extgl_GetProcAddress("glMultiTexCoord2fvARB");
	glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) extgl_GetProcAddress("glMultiTexCoord3fARB");
	glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) extgl_GetProcAddress("glMultiTexCoord3fvARB");
//	glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) extgl_GetProcAddress("glMultiTexCoord4fARB");
//	glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) extgl_GetProcAddress("glMultiTexCoord4fvARB");
}

static inline void Init_ARB_vertex_program()
{
#ifdef GL_ARB_vertex_program
    glVertexAttrib3fARB = (glVertexAttrib3fARBPROC) extgl_GetProcAddress("glVertexAttrib3fARB");
    glVertexAttrib4fARB = (glVertexAttrib4fARBPROC) extgl_GetProcAddress("glVertexAttrib4fARB");
    glVertexAttrib3fvARB = (glVertexAttrib3fvARBPROC) extgl_GetProcAddress("glVertexAttrib3fvARB");
    glVertexAttrib4fvARB = (glVertexAttrib4fvARBPROC) extgl_GetProcAddress("glVertexAttrib4fvARB");

    glProgramStringARB = (glProgramStringARBPROC) extgl_GetProcAddress("glProgramStringARB");
    glBindProgramARB = (glBindProgramARBPROC) extgl_GetProcAddress("glBindProgramARB");
    glDeleteProgramsARB = (glDeleteProgramsARBPROC) extgl_GetProcAddress("glDeleteProgramsARB");
    glGenProgramsARB = (glGenProgramsARBPROC) extgl_GetProcAddress("glGenProgramsARB");

    glProgramEnvParameter4fARB = (glProgramEnvParameter4fARBPROC) extgl_GetProcAddress("glProgramEnvParameter4fARB");
    glProgramEnvParameter4fvARB = (glProgramEnvParameter4fvARBPROC) extgl_GetProcAddress("glProgramEnvParameter4fvARB");

    glProgramLocalParameter4fARB = (glProgramLocalParameter4fARBPROC) extgl_GetProcAddress("glProgramLocalParameter4fARB");
    glProgramLocalParameter4fvARB = (glProgramLocalParameter4fvARBPROC) extgl_GetProcAddress("glProgramLocalParameter4fvARB");

    glGetProgramivARB = (glGetProgramivARBPROC) extgl_GetProcAddress("glGetProgramivARB");
    glGetProgramStringARB = (glGetProgramStringARBPROC) extgl_GetProcAddress("glGetProgramStringARB");
#endif
}

extension ext;

bool isInString(char *string, const char *search)
{
	int pos=0;
	int maxpos=strlen(search)-1;
	int len=strlen(string);	
	char *other;
	for (int i=0; i<len; i++) 
	{
		if ((i==0) || ((i>1) && string[i-1]=='\n')) 
		{							// New Extension Begins Here!
			other=&string[i];			
			pos=0;													// Begin New Search
			while (string[i]!='\n') 
			{														// Search Whole Extension-String
				if (string[i]==search[pos]) pos++;					// Next Position
				if ((pos>maxpos) && string[i+1]=='\n') return true; // We Have A Winner!
				i++;
			}			
		}
	}	
	return false;													// Sorry, Not Found!
}

#define GET_INTEGER( extension, maximum, variable, value)	\
	if(ext.extension)										\
		glGetIntegerv( maximum, &ext.max.variable);			\
	else													\
		ext.max.variable=value;

int extInit()
{
	char *extensions;
	extensions=strdup((char *) glGetString(GL_EXTENSIONS));			// Fetch Extension String
	int len=strlen(extensions);
	for (int i=0; i<len; i++)										// Separate It By Newline Instead Of Blank
		if (extensions[i]==' ') extensions[i]='\n';

	if(isInString(extensions,"GL_ARB_multitexture"))ext.ARB_multitexture=1;
	if(isInString(extensions,"GL_ARB_texture_compression"))ext.ARB_texture_compression=1;
	if(isInString(extensions,"GL_ARB_texture_cube_map"))ext.ARB_texture_cube_map=1;
	if(isInString(extensions,"GL_ARB_texture_env_add"))ext.ARB_texture_env_add=1;
	if(isInString(extensions,"GL_ARB_texture_env_combine"))ext.ARB_texture_env_combine=1;
	if(isInString(extensions,"GL_ARB_texture_env_dot3"))ext.ARB_texture_env_dot3=1;
	if(isInString(extensions,"GL_ARB_vertex_program"))ext.ARB_vertex_program=1;

	if(isInString(extensions,"GL_EXT_bgra"))ext.EXT_bgra=1;
	if(isInString(extensions,"GL_EXT_separate_specular_color"))ext.EXT_separate_specular_color=1;
	if(isInString(extensions,"GL_EXT_texture_cube_map"))ext.ARB_texture_cube_map=1;
	if(isInString(extensions,"GL_EXT_texture_edge_clamp"))ext.EXT_texture_edge_clamp=1;
	if(isInString(extensions,"GL_EXT_texture_filter_anisotropic"))ext.EXT_texture_filter_anisotropic=1;

	if(isInString(extensions,"GL_SGIS_texture_edge_clamp"))ext.EXT_texture_edge_clamp=1;
	if(isInString(extensions,"GL_SGIS_generate_mipmap"))ext.SGIS_generate_mipmap=1;

	glGetIntegerv( GL_MAX_TEXTURE_SIZE, &ext.max.max_texture_size);

	GET_INTEGER( ARB_multitexture, GL_MAX_TEXTURE_UNITS_ARB, max_texture_units, 1);
	GET_INTEGER( ARB_texture_cube_map, GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, max_cube_map_texture_size, 1);
	GET_INTEGER( EXT_texture_filter_anisotropic, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, max_texture_max_anisotropy, 1);

	ext.z_error=0;
	if(ext.ARB_multitexture)init_ARB_multitexture();
	if(ext.ARB_vertex_program)Init_ARB_vertex_program();

	free(extensions);
	if(ext.z_error)return 0;
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -