// call after swap buffers void wzPerfFrame() { if (!perfStarted) { return; // not started yet } ASSERT(queryActive == PERF_COUNT, "Missing wfPerfEnd() call"); PERF_STORE store; for (int i = 0; i < PERF_COUNT; i++) { glGetQueryObjectui64v(perfpos[i], GL_QUERY_RESULT, &store.counters[i]); } glErrors(); perfList.append(store); perfStarted = false; // Make a screenshot to document sample content time_t aclock; struct tm *t; time(&aclock); /* Get time in seconds */ t = localtime(&aclock); /* Convert time to struct */ ssprintf(screendump_filename, "screenshots/wz2100-perf-sample-%02d-%04d%02d%02d_%02d%02d%02d-%s.png", perfList.size() - 1, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, getLevelName()); screendump_required = true; GL_DEBUG("Performance sample complete"); }
void pie_ActivateShader(SHADER_MODE shaderMode, iIMDShape* shape, PIELIGHT teamcolour, PIELIGHT colour) { int maskpage = shape->tcmaskpage; int normalpage = shape->normalpage; GLfloat colour4f[4]; if (shaderMode != currentShaderMode) { GLint locTex0, locTex1, locTex2; glUseProgram(shaderProgram[shaderMode]); locTex0 = glGetUniformLocation(shaderProgram[shaderMode], "Texture0"); locTex1 = glGetUniformLocation(shaderProgram[shaderMode], "Texture1"); locTex2 = glGetUniformLocation(shaderProgram[shaderMode], "Texture2"); locTeam = glGetUniformLocation(shaderProgram[shaderMode], "teamcolour"); locStretch = glGetUniformLocation(shaderProgram[shaderMode], "stretch"); locTCMask = glGetUniformLocation(shaderProgram[shaderMode], "tcmask"); locNormalMap = glGetUniformLocation(shaderProgram[shaderMode], "normalmap"); locFog = glGetUniformLocation(shaderProgram[shaderMode], "fogEnabled"); locEcm = glGetUniformLocation(shaderProgram[shaderMode], "ecmEffect"); locTime = glGetUniformLocation(shaderProgram[shaderMode], "graphicsCycle"); // These never change glUniform1i(locTex0, 0); glUniform1i(locTex1, 1); glUniform1i(locTex2, 2); currentShaderMode = shaderMode; } glColor4ubv(colour.vector); pie_SetTexturePage(shape->texpage); pal_PIELIGHTtoRGBA4f(&colour4f[0], teamcolour); glUniform4fv(locTeam, 1, &colour4f[0]); glUniform1f(locStretch, shaderStretch); glUniform1i(locTCMask, maskpage != iV_TEX_INVALID); glUniform1i(locNormalMap, normalpage != iV_TEX_INVALID); glUniform1i(locFog, rendStates.fog); glUniform1f(locTime, timeState); glUniform1i(locEcm, ecmState); if (maskpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[maskpage].id); } if (normalpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[normalpage].id); } glActiveTexture(GL_TEXTURE0); #ifdef _DEBUG glErrors(); #endif }
void wzPerfBegin(PERF_POINT pp, const char *descr) { GL_DEBUG(descr); if (!perfStarted) { return; } ASSERT(queryActive == PERF_COUNT || pp > queryActive, "Out of order timer query call"); glBeginQuery(GL_TIME_ELAPSED, perfpos[pp]); queryActive = pp; glErrors(); }
void screenShutDown(void) { pie_ShutDown(); pie_TexShutDown(); iV_TextShutdown(); pie_Skybox_Shutdown(); delete backdropGfx; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glErrors(); }
void pie_ActivateShader(SHADER_MODE shaderMode, PIELIGHT teamcolour, int maskpage, int normalpage) { GLfloat colour4f[4]; if (shaderMode != currentShaderMode) { GLint locTex0, locTex1, locTex2; glUseProgram(shaderProgram[shaderMode]); locTex0 = glGetUniformLocation(shaderProgram[shaderMode], "Texture0"); locTex1 = glGetUniformLocation(shaderProgram[shaderMode], "Texture1"); locTex2 = glGetUniformLocation(shaderProgram[shaderMode], "Texture2"); locTeam = glGetUniformLocation(shaderProgram[shaderMode], "teamcolour"); locStretch = glGetUniformLocation(shaderProgram[shaderMode], "stretch"); locTCMask = glGetUniformLocation(shaderProgram[shaderMode], "tcmask"); locNormalMap = glGetUniformLocation(shaderProgram[shaderMode], "normalmap"); locFog = glGetUniformLocation(shaderProgram[shaderMode], "fogEnabled"); // These never change glUniform1i(locTex0, 0); glUniform1i(locTex1, 1); glUniform1i(locTex2, 2); currentShaderMode = shaderMode; } pal_PIELIGHTtoRGBA4f(&colour4f[0], teamcolour); glUniform4fv(locTeam, 1, &colour4f[0]); glUniform1f(locStretch, shaderStretch); glUniform1i(locTCMask, maskpage != iV_TEX_INVALID); glUniform1i(locNormalMap, normalpage != iV_TEX_INVALID); glUniform1i(locFog, rendStates.fog); if (maskpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE1); pie_SetTexturePage(maskpage); } if (normalpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE2); pie_SetTexturePage(normalpage); } glActiveTexture(GL_TEXTURE0); #ifdef _DEBUG glErrors(); #endif }
void wzPerfBegin(PERF_POINT pp, const char *descr) { ASSERT(queryActive == PERF_COUNT || pp > queryActive, "Out of order timer query call"); queryActive = pp; if (khr_debug) { glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, pp, -1, descr); } if (!perfStarted) { return; } glBeginQuery(GL_TIME_ELAPSED, perfpos[pp]); glErrors(); }
void pie_ActivateShader_TCMask(PIELIGHT teamcolour, int maskpage) { GLfloat colour4f[4]; pie_SetShader(SHADER_COMPONENT); pal_PIELIGHTtoRGBA4f(&colour4f[0], teamcolour); glUniform4fv(locTeam, 1, &colour4f[0]); glUniform1f(locStretch, shaderStretch); glUniform1i(locTCMask, maskpage != iV_TEX_INVALID); glUniform1i(locFog, rendStates.fog); if (maskpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE1); pie_SetTexturePage(maskpage); } glActiveTexture(GL_TEXTURE0); #ifdef _DEBUG glErrors(); #endif }
/* Initialise the double buffered display */ bool screenInitialise() { GLint glMaxTUs; GLenum err; glErrors(); err = glewInit(); if (GLEW_OK != err) { debug(LOG_FATAL, "Error: %s", glewGetErrorString(err)); exit(1); } /* Dump general information about OpenGL implementation to the console and the dump file */ ssprintf(opengl.vendor, "OpenGL Vendor: %s", glGetString(GL_VENDOR)); addDumpInfo(opengl.vendor); debug(LOG_3D, "%s", opengl.vendor); ssprintf(opengl.renderer, "OpenGL Renderer: %s", glGetString(GL_RENDERER)); addDumpInfo(opengl.renderer); debug(LOG_3D, "%s", opengl.renderer); ssprintf(opengl.version, "OpenGL Version: %s", glGetString(GL_VERSION)); addDumpInfo(opengl.version); debug(LOG_3D, "%s", opengl.version); ssprintf(opengl.GLEWversion, "GLEW Version: %s", glewGetString(GLEW_VERSION)); addDumpInfo(opengl.GLEWversion); debug(LOG_3D, "%s", opengl.GLEWversion); GLubyte const *extensionsBegin = glGetString(GL_EXTENSIONS); GLubyte const *extensionsEnd = extensionsBegin + strlen((char const *)extensionsBegin); std::vector<std::string> glExtensions; for (GLubyte const *i = extensionsBegin; i < extensionsEnd; ) { GLubyte const *j = std::find(i, extensionsEnd, ' '); glExtensions.push_back(std::string(i, j)); i = j + 1; } /* Dump extended information about OpenGL implementation to the console */ std::string line; for (unsigned n = 0; n < glExtensions.size(); ++n) { std::string word = " "; word += glExtensions[n]; if (n + 1 != glExtensions.size()) { word += ','; } if (line.size() + word.size() > 160) { debug(LOG_3D, "OpenGL Extensions:%s", line.c_str()); line.clear(); } line += word; } debug(LOG_3D, "OpenGL Extensions:%s", line.c_str()); debug(LOG_3D, "Notable OpenGL features:"); debug(LOG_3D, " * OpenGL 1.2 %s supported!", GLEW_VERSION_1_2 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.3 %s supported!", GLEW_VERSION_1_3 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.4 %s supported!", GLEW_VERSION_1_4 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.5 %s supported!", GLEW_VERSION_1_5 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 2.0 %s supported!", GLEW_VERSION_2_0 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 2.1 %s supported!", GLEW_VERSION_2_1 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 3.0 %s supported!", GLEW_VERSION_3_0 ? "is" : "is NOT"); debug(LOG_3D, " * Texture compression %s supported.", GLEW_ARB_texture_compression ? "is" : "is NOT"); debug(LOG_3D, " * Two side stencil %s supported.", GLEW_EXT_stencil_two_side ? "is" : "is NOT"); debug(LOG_3D, " * ATI separate stencil is%s supported.", GLEW_ATI_separate_stencil ? "" : " NOT"); debug(LOG_3D, " * Stencil wrap %s supported.", GLEW_EXT_stencil_wrap ? "is" : "is NOT"); debug(LOG_3D, " * Anisotropic filtering %s supported.", GLEW_EXT_texture_filter_anisotropic ? "is" : "is NOT"); debug(LOG_3D, " * Rectangular texture %s supported.", GLEW_ARB_texture_rectangle ? "is" : "is NOT"); debug(LOG_3D, " * FrameBuffer Object (FBO) %s supported.", GLEW_EXT_framebuffer_object ? "is" : "is NOT"); debug(LOG_3D, " * ARB Vertex Buffer Object (VBO) %s supported.", GLEW_ARB_vertex_buffer_object ? "is" : "is NOT"); debug(LOG_3D, " * NPOT %s supported.", GLEW_ARB_texture_non_power_of_two ? "is" : "is NOT"); debug(LOG_3D, " * texture cube_map %s supported.", GLEW_ARB_texture_cube_map ? "is" : "is NOT"); glGetIntegerv(GL_MAX_TEXTURE_UNITS, &glMaxTUs); debug(LOG_3D, " * Total number of Texture Units (TUs) supported is %d.", (int) glMaxTUs); debug(LOG_3D, " * GL_ARB_timer_query %s supported!", GLEW_ARB_timer_query ? "is" : "is NOT"); screenWidth = MAX(screenWidth, 640); screenHeight = MAX(screenHeight, 480); std::pair<int, int> glslVersion(0, 0); if (GLEW_ARB_shading_language_100 && GLEW_ARB_shader_objects) { sscanf((char const *)glGetString(GL_SHADING_LANGUAGE_VERSION), "%d.%d", &glslVersion.first, &glslVersion.second); /* Dump information about OpenGL 2.0+ implementation to the console and the dump file */ GLint glMaxTIUs, glMaxTCs, glMaxTIUAs, glmaxSamples, glmaxSamplesbuf; debug(LOG_3D, " * OpenGL GLSL Version : %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); ssprintf(opengl.GLSLversion, "OpenGL GLSL Version : %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); addDumpInfo(opengl.GLSLversion); glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &glMaxTIUs); debug(LOG_3D, " * Total number of Texture Image Units (TIUs) supported is %d.", (int) glMaxTIUs); glGetIntegerv(GL_MAX_TEXTURE_COORDS, &glMaxTCs); debug(LOG_3D, " * Total number of Texture Coords (TCs) supported is %d.", (int) glMaxTCs); glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB,&glMaxTIUAs); debug(LOG_3D, " * Total number of Texture Image Units ARB(TIUAs) supported is %d.", (int) glMaxTIUAs); glGetIntegerv(GL_SAMPLE_BUFFERS, &glmaxSamplesbuf); debug(LOG_3D, " * (current) Max Sample buffer is %d.", (int) glmaxSamplesbuf); glGetIntegerv(GL_SAMPLES, &glmaxSamples); debug(LOG_3D, " * (current) Max Sample level is %d.", (int) glmaxSamples); } bool haveARB_vertex_buffer_object = GLEW_ARB_vertex_buffer_object || GLEW_VERSION_1_5; bool canRunShaders = GLEW_VERSION_1_2 && haveARB_vertex_buffer_object && glslVersion >= std::make_pair(1, 20); // glGetString(GL_SHADING_LANGUAGE_VERSION) >= "1.20" screen_EnableMissingFunctions(); // We need to do this before pie_LoadShaders(), but the effect of this call will be undone later by iV_TextInit(), so we will need to call it again. if (!canRunShaders || !pie_LoadShaders()) { writeGameInfo("WZdebuginfo.txt"); debug(LOG_FATAL, _("OpenGL GLSL shader version 1.20 is not supported by your system. The game requires this. Please upgrade your graphics drivers/hardware, if possible.")); exit(1); } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); pie_Skybox_Init(); // Generate backdrop render backdropGfx = new GFX(GFX_TEXTURE, GL_TRIANGLE_STRIP, 2); if (GLEW_ARB_timer_query) { glGenQueries(PERF_COUNT, perfpos); } glErrors(); return true; }
/* Initialise the double buffered display */ bool screenInitialise() { GLint glMaxTUs; GLenum err; glErrors(); err = glewInit(); if (GLEW_OK != err) { debug(LOG_FATAL, "Error: %s", glewGetErrorString(err)); exit(1); } /* Dump general information about OpenGL implementation to the console and the dump file */ ssprintf(opengl.vendor, "OpenGL Vendor: %s", glGetString(GL_VENDOR)); addDumpInfo(opengl.vendor); debug(LOG_3D, "%s", opengl.vendor); ssprintf(opengl.renderer, "OpenGL Renderer: %s", glGetString(GL_RENDERER)); addDumpInfo(opengl.renderer); debug(LOG_3D, "%s", opengl.renderer); ssprintf(opengl.version, "OpenGL Version: %s", glGetString(GL_VERSION)); addDumpInfo(opengl.version); debug(LOG_3D, "%s", opengl.version); ssprintf(opengl.GLEWversion, "GLEW Version: %s", glewGetString(GLEW_VERSION)); if (strncmp(opengl.GLEWversion, "1.9.", 4) == 0) // work around known bug with KHR_debug extension support in this release { debug(LOG_WARNING, "Your version of GLEW is old and buggy, please upgrade to at least version 1.10."); khr_debug = false; } else { khr_debug = GLEW_KHR_debug; } addDumpInfo(opengl.GLEWversion); debug(LOG_3D, "%s", opengl.GLEWversion); GLubyte const *extensionsBegin = glGetString(GL_EXTENSIONS); GLubyte const *extensionsEnd = extensionsBegin + strlen((char const *)extensionsBegin); std::vector<std::string> glExtensions; for (GLubyte const *i = extensionsBegin; i < extensionsEnd; ) { GLubyte const *j = std::find(i, extensionsEnd, ' '); glExtensions.push_back(std::string(i, j)); i = j + 1; } /* Dump extended information about OpenGL implementation to the console */ std::string line; for (unsigned n = 0; n < glExtensions.size(); ++n) { std::string word = " "; word += glExtensions[n]; if (n + 1 != glExtensions.size()) { word += ','; } if (line.size() + word.size() > 160) { debug(LOG_3D, "OpenGL Extensions:%s", line.c_str()); line.clear(); } line += word; } debug(LOG_3D, "OpenGL Extensions:%s", line.c_str()); debug(LOG_3D, "Notable OpenGL features:"); debug(LOG_3D, " * OpenGL 1.2 %s supported!", GLEW_VERSION_1_2 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.3 %s supported!", GLEW_VERSION_1_3 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.4 %s supported!", GLEW_VERSION_1_4 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.5 %s supported!", GLEW_VERSION_1_5 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 2.0 %s supported!", GLEW_VERSION_2_0 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 2.1 %s supported!", GLEW_VERSION_2_1 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 3.0 %s supported!", GLEW_VERSION_3_0 ? "is" : "is NOT"); debug(LOG_3D, " * Texture compression %s supported.", GLEW_ARB_texture_compression ? "is" : "is NOT"); debug(LOG_3D, " * Two side stencil %s supported.", GLEW_EXT_stencil_two_side ? "is" : "is NOT"); debug(LOG_3D, " * ATI separate stencil is%s supported.", GLEW_ATI_separate_stencil ? "" : " NOT"); debug(LOG_3D, " * Stencil wrap %s supported.", GLEW_EXT_stencil_wrap ? "is" : "is NOT"); debug(LOG_3D, " * Anisotropic filtering %s supported.", GLEW_EXT_texture_filter_anisotropic ? "is" : "is NOT"); debug(LOG_3D, " * Rectangular texture %s supported.", GLEW_ARB_texture_rectangle ? "is" : "is NOT"); debug(LOG_3D, " * FrameBuffer Object (FBO) %s supported.", GLEW_EXT_framebuffer_object ? "is" : "is NOT"); debug(LOG_3D, " * ARB Vertex Buffer Object (VBO) %s supported.", GLEW_ARB_vertex_buffer_object ? "is" : "is NOT"); debug(LOG_3D, " * NPOT %s supported.", GLEW_ARB_texture_non_power_of_two ? "is" : "is NOT"); debug(LOG_3D, " * texture cube_map %s supported.", GLEW_ARB_texture_cube_map ? "is" : "is NOT"); glGetIntegerv(GL_MAX_TEXTURE_UNITS, &glMaxTUs); debug(LOG_3D, " * Total number of Texture Units (TUs) supported is %d.", (int) glMaxTUs); debug(LOG_3D, " * GL_ARB_timer_query %s supported!", GLEW_ARB_timer_query ? "is" : "is NOT"); debug(LOG_3D, " * KHR_DEBUG support %s detected", khr_debug ? "was" : "was NOT"); if (!GLEW_VERSION_2_0) { debug(LOG_FATAL, "OpenGL 2.0 not supported! Please upgrade your drivers."); return false; } screenWidth = MAX(screenWidth, 640); screenHeight = MAX(screenHeight, 480); std::pair<int, int> glslVersion(0, 0); sscanf((char const *)glGetString(GL_SHADING_LANGUAGE_VERSION), "%d.%d", &glslVersion.first, &glslVersion.second); /* Dump information about OpenGL 2.0+ implementation to the console and the dump file */ GLint glMaxTIUs, glMaxTCs, glMaxTIUAs, glmaxSamples, glmaxSamplesbuf; debug(LOG_3D, " * OpenGL GLSL Version : %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); ssprintf(opengl.GLSLversion, "OpenGL GLSL Version : %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); addDumpInfo(opengl.GLSLversion); glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &glMaxTIUs); debug(LOG_3D, " * Total number of Texture Image Units (TIUs) supported is %d.", (int) glMaxTIUs); glGetIntegerv(GL_MAX_TEXTURE_COORDS, &glMaxTCs); debug(LOG_3D, " * Total number of Texture Coords (TCs) supported is %d.", (int) glMaxTCs); glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB,&glMaxTIUAs); debug(LOG_3D, " * Total number of Texture Image Units ARB(TIUAs) supported is %d.", (int) glMaxTIUAs); glGetIntegerv(GL_SAMPLE_BUFFERS, &glmaxSamplesbuf); debug(LOG_3D, " * (current) Max Sample buffer is %d.", (int) glmaxSamplesbuf); glGetIntegerv(GL_SAMPLES, &glmaxSamples); debug(LOG_3D, " * (current) Max Sample level is %d.", (int) glmaxSamples); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); pie_Skybox_Init(); // Generate backdrop render backdropGfx = new GFX(GFX_TEXTURE, GL_TRIANGLE_STRIP, 2); if (GLEW_ARB_timer_query) { glGenQueries(PERF_COUNT, perfpos); } glErrors(); return true; }
static void pie_Draw3DShape2(iIMDShape *shape, int frame, PIELIGHT colour, PIELIGHT teamcolour, WZ_DECL_UNUSED PIELIGHT specular, int pieFlag, int pieFlagData) { iIMDPoly *pPolys; bool light = lighting; pie_SetAlphaTest(true); /* Set fog status */ if (!(pieFlag & pie_FORCE_FOG) && (pieFlag & pie_ADDITIVE || pieFlag & pie_TRANSLUCENT || pieFlag & pie_BUTTON)) { pie_SetFogStatus(false); } else { pie_SetFogStatus(true); } /* Set tranlucency */ if (pieFlag & pie_ADDITIVE) { pie_SetRendMode(REND_ADDITIVE); colour.byte.a = (UBYTE)pieFlagData; light = false; } else if (pieFlag & pie_TRANSLUCENT) { pie_SetRendMode(REND_ALPHA); colour.byte.a = (UBYTE)pieFlagData; light = false; } else { if (pieFlag & pie_BUTTON) { pie_SetDepthBufferStatus(DEPTH_CMP_LEQ_WRT_ON); } pie_SetRendMode(REND_OPAQUE); } if (light) { const float ambient[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; const float diffuse[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; const float specular[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; const float shininess = 10; glEnable(GL_LIGHTING); glEnable(GL_NORMALIZE); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess); } if (pieFlag & pie_HEIGHT_SCALED) // construct { glScalef(1.0f, (float)pieFlagData / (float)pie_RAISE_SCALE, 1.0f); } if (pieFlag & pie_RAISE) // collapse { glTranslatef(1.0f, (-shape->max.y * (pie_RAISE_SCALE - pieFlagData)) / pie_RAISE_SCALE, 1.0f); } glColor4ubv(colour.vector); // Only need to set once for entire model pie_SetTexturePage(shape->texpage); // Activate TCMask if needed if (shape->flags & iV_IMD_TCMASK && rendStates.rendMode == REND_OPAQUE) { #ifdef _DEBUG glErrors(); #endif if (pie_GetShadersStatus()) { pie_ActivateShader_TCMask(teamcolour, shape->tcmaskpage); } else { //Set the environment colour with tcmask GLfloat tc_env_colour[4]; pal_PIELIGHTtoRGBA4f(&tc_env_colour[0], teamcolour); // TU0 glActiveTexture(GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, tc_env_colour); // TU0 RGB glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD_SIGNED); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); // TU0 Alpha glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); // TU1 glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, _TEX_PAGE[shape->tcmaskpage].id); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); // TU1 RGB glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); // TU1 Alpha glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); // This is why we are doing in opaque mode. glEnable(GL_BLEND); glBlendFunc(GL_CONSTANT_COLOR, GL_ZERO); glBlendColor(colour.byte.r / 255.0, colour.byte.g / 255.0, colour.byte.b / 255.0, colour.byte.a / 255.0); } #ifdef _DEBUG glErrors(); #endif } for (pPolys = shape->polys; pPolys < shape->polys + shape->npolys; pPolys++) { Vector2f texCoords[pie_MAX_VERTICES_PER_POLYGON]; Vector3f vertexCoords[pie_MAX_VERTICES_PER_POLYGON]; unsigned int n; VERTEXID *index; for (n = 0, index = pPolys->pindex; n < pPolys->npnts; n++, index++) { vertexCoords[n].x = shape->points[*index].x; vertexCoords[n].y = shape->points[*index].y; vertexCoords[n].z = shape->points[*index].z; texCoords[n].x = pPolys->texCoord[n].x; texCoords[n].y = pPolys->texCoord[n].y; } polyCount++; // Run TextureAnimation (exluding the new teamcoloured models) if (frame && pPolys->flags & iV_IMD_TEXANIM && !(shape->flags & iV_IMD_TCMASK)) { frame %= shape->numFrames; if (frame > 0) { const int framesPerLine = OLD_TEXTURE_SIZE_FIX / (pPolys->texAnim.x * OLD_TEXTURE_SIZE_FIX); const int uFrame = (frame % framesPerLine) * (pPolys->texAnim.x * OLD_TEXTURE_SIZE_FIX); const int vFrame = (frame / framesPerLine) * (pPolys->texAnim.y * OLD_TEXTURE_SIZE_FIX); for (n = 0; n < pPolys->npnts; n++) { texCoords[n].x += uFrame / OLD_TEXTURE_SIZE_FIX; texCoords[n].y += vFrame / OLD_TEXTURE_SIZE_FIX; } } } glBegin(GL_TRIANGLE_FAN); if (light) { glNormal3fv((GLfloat*)&pPolys->normal); } for (n = 0; n < pPolys->npnts; n++) { glTexCoord2fv((GLfloat*)&texCoords[n]); if (shape->flags & iV_IMD_TCMASK && rendStates.rendMode == REND_OPAQUE && !pie_GetShadersStatus()) { glMultiTexCoord2fv(GL_TEXTURE1, (GLfloat*)&texCoords[n]); } glVertex3fv((GLfloat*)&vertexCoords[n]); } glEnd(); } // Deactivate TCMask if it was previously enabled if (shape->flags & iV_IMD_TCMASK && rendStates.rendMode == REND_OPAQUE) { if (pie_GetShadersStatus()) { pie_DeactivateShader(); } else { glDisable(GL_BLEND); glActiveTexture(GL_TEXTURE1); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glDisable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } } if (pieFlag & pie_BUTTON) { pie_SetDepthBufferStatus(DEPTH_CMP_ALWAYS_WRT_ON); } if (light) { glDisable(GL_LIGHTING); glDisable(GL_NORMALIZE); } }
/* Initialise the double buffered display */ bool screenInitialise() { char buf[256]; GLint glMaxTUs; GLenum err; glErrors(); err = glewInit(); if (GLEW_OK != err) { debug(LOG_FATAL, "Error: %s", glewGetErrorString(err)); exit(1); } // Copy this info to be used by the crash handler for the dump file ssprintf(buf, "OpenGL Vendor: %s", glGetString(GL_VENDOR)); addDumpInfo(buf); ssprintf(buf, "OpenGL Renderer: %s", glGetString(GL_RENDERER)); addDumpInfo(buf); ssprintf(buf, "OpenGL Version: %s", glGetString(GL_VERSION)); addDumpInfo(buf); if (GLEW_VERSION_2_0) { ssprintf(buf, "OpenGL GLSL Version : %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); addDumpInfo(buf); } /* Dump general information about OpenGL implementation to the console and the dump file */ ssprintf(buf, "OpenGL Vendor: %s", glGetString(GL_VENDOR)); addDumpInfo(buf); debug(LOG_3D, "%s", buf); ssprintf(buf, "OpenGL Renderer: %s", glGetString(GL_RENDERER)); addDumpInfo(buf); debug(LOG_3D, "%s", buf); ssprintf(buf, "OpenGL Version: %s", glGetString(GL_VERSION)); addDumpInfo(buf); debug(LOG_3D, "%s", buf); ssprintf(buf, "GLEW Version: %s", glewGetString(GLEW_VERSION)); addDumpInfo(buf); debug(LOG_3D, "%s", buf); /* Dump extended information about OpenGL implementation to the console */ debug(LOG_3D, "OpenGL Extensions : %s", glGetString(GL_EXTENSIONS)); // FIXME This is too much for MAX_LEN_LOG_LINE debug(LOG_3D, "Supported OpenGL extensions:"); debug(LOG_3D, " * OpenGL 1.2 %s supported!", GLEW_VERSION_1_2 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.3 %s supported!", GLEW_VERSION_1_3 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.4 %s supported!", GLEW_VERSION_1_4 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 1.5 %s supported!", GLEW_VERSION_1_5 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 2.0 %s supported!", GLEW_VERSION_2_0 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 2.1 %s supported!", GLEW_VERSION_2_1 ? "is" : "is NOT"); debug(LOG_3D, " * OpenGL 3.0 %s supported!", GLEW_VERSION_3_0 ? "is" : "is NOT"); debug(LOG_3D, " * Texture compression %s supported.", GLEW_ARB_texture_compression ? "is" : "is NOT"); debug(LOG_3D, " * Two side stencil %s supported.", GLEW_EXT_stencil_two_side ? "is" : "is NOT"); debug(LOG_3D, " * ATI separate stencil is%s supported.", GLEW_ATI_separate_stencil ? "" : " NOT"); debug(LOG_3D, " * Stencil wrap %s supported.", GLEW_EXT_stencil_wrap ? "is" : "is NOT"); debug(LOG_3D, " * Anisotropic filtering %s supported.", GLEW_EXT_texture_filter_anisotropic ? "is" : "is NOT"); debug(LOG_3D, " * Rectangular texture %s supported.", GLEW_ARB_texture_rectangle ? "is" : "is NOT"); debug(LOG_3D, " * FrameBuffer Object (FBO) %s supported.", GLEW_EXT_framebuffer_object ? "is" : "is NOT"); debug(LOG_3D, " * Vertex Buffer Object (VBO) %s supported.", GLEW_ARB_vertex_buffer_object ? "is" : "is NOT"); debug(LOG_3D, " * NPOT %s supported.", GLEW_ARB_texture_non_power_of_two ? "is" : "is NOT"); debug(LOG_3D, " * texture cube_map %s supported.", GLEW_ARB_texture_cube_map ? "is" : "is NOT"); glGetIntegerv(GL_MAX_TEXTURE_UNITS, &glMaxTUs); debug(LOG_3D, " * Total number of Texture Units (TUs) supported is %d.", (int) glMaxTUs); screenWidth = MAX(screenWidth, 640); screenHeight = MAX(screenHeight, 480); /* Dump information about OpenGL 2.0+ implementation to the console and the dump file */ if (GLEW_VERSION_2_0) { GLint glMaxTIUs, glMaxTCs, glMaxTIUAs, glmaxSamples, glmaxSamplesbuf; debug(LOG_3D, " * OpenGL GLSL Version : %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); ssprintf(buf, "OpenGL GLSL Version : %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); addDumpInfo(buf); glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &glMaxTIUs); debug(LOG_3D, " * Total number of Texture Image Units (TIUs) supported is %d.", (int) glMaxTIUs); glGetIntegerv(GL_MAX_TEXTURE_COORDS, &glMaxTCs); debug(LOG_3D, " * Total number of Texture Coords (TCs) supported is %d.", (int) glMaxTCs); glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB,&glMaxTIUAs); debug(LOG_3D, " * Total number of Texture Image Units ARB(TIUAs) supported is %d.", (int) glMaxTIUAs); glGetIntegerv(GL_SAMPLE_BUFFERS, &glmaxSamplesbuf); debug(LOG_3D, " * (current) Max Sample buffer is %d.", (int) glmaxSamplesbuf); glGetIntegerv(GL_SAMPLES, &glmaxSamples); debug(LOG_3D, " * (current) Max Sample level is %d.", (int) glmaxSamples); pie_LoadShaders(); } else { debug(LOG_FATAL, "OpenGL 2.0 is not supported by your system. The game require this. Please upgrade your graphics drivers, if possible."); exit(1); } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glErrors(); return true; }
void pie_ActivateShader(int shaderMode, const iIMDShape *shape, PIELIGHT teamcolour, PIELIGHT colour) { int maskpage = shape->tcmaskpage; int normalpage = shape->normalpage; int specularpage = shape->specularpage; GLfloat colour4f[4]; SHADER_PROGRAM program = shaderProgram[shaderMode]; if (shaderMode != currentShaderMode) { glUseProgram(program.program); // These do not change during our drawing pass glUniform1i(program.locFog, rendStates.fog); glUniform1f(program.locTime, timeState); currentShaderMode = shaderMode; } glColor4ubv(colour.vector); pie_SetTexturePage(shape->texpage); pal_PIELIGHTtoRGBA4f(&colour4f[0], teamcolour); glUniform4fv(program.locTeam, 1, &colour4f[0]); glUniform1i(program.locTCMask, maskpage != iV_TEX_INVALID); if (program.locStretch >= 0) { glUniform1f(program.locStretch, shaderStretch); } if (program.locNormalMap >= 0) { glUniform1i(program.locNormalMap, normalpage != iV_TEX_INVALID); } if (program.locSpecularMap >= 0) { glUniform1i(program.locSpecularMap, specularpage != iV_TEX_INVALID); } if (program.locEcm >= 0) { glUniform1i(program.locEcm, ecmState); } if (maskpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, pie_Texture(maskpage)); } if (normalpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, pie_Texture(normalpage)); } if (specularpage != iV_TEX_INVALID) { glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, pie_Texture(specularpage)); } glActiveTexture(GL_TEXTURE0); #ifdef _DEBUG glErrors(); #endif }