From dba29b0fbe2beb16b89ad9097072274720e60efe Mon Sep 17 00:00:00 2001 From: plagman Date: Thu, 5 Feb 2009 08:56:59 +0000 Subject: [PATCH] Shader Model 3 "compatibility" for multilights. The light count will be arbitrarily limited and performance will be suboptimal, but it should work. git-svn-id: https://svn.eduke32.com/eduke32@1222 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/baselayer.h | 1 + polymer/eduke32/build/include/polymer.h | 8 ++- polymer/eduke32/build/src/baselayer.c | 5 +- polymer/eduke32/build/src/polymer.c | 69 +++++++++++++++++++++-- polymer/eduke32/build/src/sdlayer.c | 4 ++ polymer/eduke32/build/src/winlayer.c | 4 ++ 6 files changed, 82 insertions(+), 9 deletions(-) diff --git a/polymer/eduke32/build/include/baselayer.h b/polymer/eduke32/build/include/baselayer.h index db6d7cb9e..bed59e614 100644 --- a/polymer/eduke32/build/include/baselayer.h +++ b/polymer/eduke32/build/include/baselayer.h @@ -58,6 +58,7 @@ struct glinfo { char envcombine; char vbos; char vsync; + char sm4; char dumped; }; extern struct glinfo glinfo; diff --git a/polymer/eduke32/build/include/polymer.h b/polymer/eduke32/build/include/polymer.h index 601a13b04..247496c59 100644 --- a/polymer/eduke32/build/include/polymer.h +++ b/polymer/eduke32/build/include/polymer.h @@ -23,6 +23,7 @@ # define _polymer_h_ # include "compat.h" +# include "baselayer.h" # include "build.h" # include "glbuild.h" # include "osd.h" @@ -45,14 +46,17 @@ extern int32_t glerror; // MATERIAL typedef enum { + PR_BIT_HEADER, // must be first + PR_BIT_NV4X_COMPAT, + PR_BIT_G8X_COMPAT, PR_BIT_ANIM_INTERPOLATION, PR_BIT_DIFFUSE_MAP, PR_BIT_DIFFUSE_DETAIL_MAP, PR_BIT_DIFFUSE_MODULATION, PR_BIT_POINT_LIGHT, PR_BIT_DIFFUSE_GLOW_MAP, - PR_BIT_DEFAULT, // must be just before last - PR_BIT_COUNT // must be last + PR_BIT_FOOTER, // must be just before last + PR_BIT_COUNT // must be last } prbittype; typedef struct s_prmaterial { diff --git a/polymer/eduke32/build/src/baselayer.c b/polymer/eduke32/build/src/baselayer.c index 7230420db..943d545b8 100644 --- a/polymer/eduke32/build/src/baselayer.c +++ b/polymer/eduke32/build/src/baselayer.c @@ -43,6 +43,7 @@ struct glinfo glinfo = 0, // env_combine 0, // Vertex Buffer Objects 0, // VSync support + 0, // Shader Model 4 support 0, // GL info dumped }; #endif @@ -145,6 +146,7 @@ int32_t osdcmd_glinfo(const osdfuncparm_t *parm) " Multitexturing: %s\n" " env_combine: %s\n" " Vertex Buffer Objects: %s\n" + " Shader Model 4: %s\n" " Extensions:\n", glinfo.maxanisotropy, glinfo.maxanisotropy>1.0?"":" (no anisotropic filtering)", glinfo.bgra ? "supported": "not supported", @@ -160,7 +162,8 @@ int32_t osdcmd_glinfo(const osdfuncparm_t *parm) glinfo.rect ? "supported": "not supported", glinfo.multitex ? "supported": "not supported", glinfo.envcombine ? "supported": "not supported", - glinfo.vbos ? "supported": "not supported" + glinfo.vbos ? "supported": "not supported", + glinfo.sm4 ? "supported": "not supported" ); s = Bstrdup(glinfo.extensions); diff --git a/polymer/eduke32/build/src/polymer.c b/polymer/eduke32/build/src/polymer.c index da84dba83..6d68330bf 100644 --- a/polymer/eduke32/build/src/polymer.c +++ b/polymer/eduke32/build/src/polymer.c @@ -125,6 +125,43 @@ int32_t lightcount; // MATERIALS _prprogrambit prprogrambits[PR_BIT_COUNT] = { + { + 1 << PR_BIT_HEADER, + // vert_def + "#version 120\n" + "\n", + // vert_prog + "", + // frag_def + "#version 120\n" + "\n", + // frag_prog + "", + }, + { + 1 << PR_BIT_NV4X_COMPAT, + // vert_def + "", + // vert_prog + "", + // frag_def + "#define LIGHTCOUNT 4\n" + "\n", + // frag_prog + "", + }, + { + 1 << PR_BIT_G8X_COMPAT, + // vert_def + "", + // vert_prog + "", + // frag_def + "#define LIGHTCOUNT lightCount\n" + "\n", + // frag_prog + "", + }, { 1 << PR_BIT_ANIM_INTERPOLATION, // vert_def @@ -216,7 +253,7 @@ _prprogrambit prprogrambits[PR_BIT_COUNT] = { "\n" " fragmentNormal = normalize(vertexNormal);\n" "\n" - " while (l < lightCount) {\n" + " while (l < LIGHTCOUNT) {\n" " lightPos = gl_LightSource[l].ambient.rgb;\n" " lightDiffuse = gl_LightSource[l].diffuse.rgb;\n" " lightRange.x = gl_LightSource[l].constantAttenuation;\n" @@ -260,7 +297,7 @@ _prprogrambit prprogrambits[PR_BIT_COUNT] = { "\n", }, { - 1 << PR_BIT_DEFAULT, + 1 << PR_BIT_FOOTER, // vert_def "void main(void)\n" "{\n" @@ -2621,10 +2658,17 @@ static int32_t polymer_bindmaterial(_prmaterial material) int32_t programbits; int32_t texunit; - programbits = prprogrambits[PR_BIT_DEFAULT].bit; + programbits = prprogrambits[PR_BIT_HEADER].bit; + programbits |= prprogrambits[PR_BIT_FOOTER].bit; // --------- bit validation + // PR_BIT_*_COMPAT + if (glinfo.sm4) + programbits |= prprogrambits[PR_BIT_G8X_COMPAT].bit; + else + programbits |= prprogrambits[PR_BIT_NV4X_COMPAT].bit; + // PR_BIT_ANIM_INTERPOLATION if (material.nextframedata) programbits |= prprogrambits[PR_BIT_ANIM_INTERPOLATION].bit; @@ -2642,7 +2686,9 @@ static int32_t polymer_bindmaterial(_prmaterial material) (material.diffusemodulation[2] != 1.0f) || (material.diffusemodulation[3] != 1.0f)) programbits |= prprogrambits[PR_BIT_DIFFUSE_MODULATION].bit; + // PR_BIT_POINT_LIGHT programbits |= prprogrambits[PR_BIT_POINT_LIGHT].bit; + // PR_BIT_DIFFUSE_GLOW_MAP if (material.glowmap) programbits |= prprogrambits[PR_BIT_DIFFUSE_GLOW_MAP].bit; @@ -2758,7 +2804,7 @@ static int32_t polymer_bindmaterial(_prmaterial material) color[5] = 0.5f; color[6] = 0.5f; - range[2] = 5000.0f / 1000.0; + range[2] = 8000.0f / 1000.0; range[3] = 10000.0f / 1000.0; bglLightfv(GL_LIGHT0, GL_AMBIENT, lightpos); @@ -2771,7 +2817,17 @@ static int32_t polymer_bindmaterial(_prmaterial material) bglLightfv(GL_LIGHT1, GL_CONSTANT_ATTENUATION, &range[2]); bglLightfv(GL_LIGHT1, GL_LINEAR_ATTENUATION, &range[3]); - bglUniform1iARB(prprograms[programbits].uniform_lightCount, lightCount); + range[3] = 0; + + bglLightfv(GL_LIGHT2, GL_LINEAR_ATTENUATION, &range[3]); + bglLightfv(GL_LIGHT3, GL_LINEAR_ATTENUATION, &range[3]); + bglLightfv(GL_LIGHT4, GL_LINEAR_ATTENUATION, &range[3]); + bglLightfv(GL_LIGHT5, GL_LINEAR_ATTENUATION, &range[3]); + bglLightfv(GL_LIGHT6, GL_LINEAR_ATTENUATION, &range[3]); + bglLightfv(GL_LIGHT7, GL_LINEAR_ATTENUATION, &range[3]); + + if (glinfo.sm4) + bglUniform1iARB(prprograms[programbits].uniform_lightCount, lightCount); } // PR_BIT_DIFFUSE_GLOW_MAP @@ -2895,8 +2951,9 @@ static void polymer_compileprogram(int32_t programbits) prprograms[programbits].uniform_detailMap = bglGetUniformLocationARB(program, "detailMap"); prprograms[programbits].uniform_detailScale = bglGetUniformLocationARB(program, "detailScale"); } + // PR_BIT_POINT_LIGHT - if (programbits & prprogrambits[PR_BIT_POINT_LIGHT].bit) + if (programbits & prprogrambits[PR_BIT_POINT_LIGHT].bit && glinfo.sm4) { prprograms[programbits].uniform_lightCount = bglGetUniformLocationARB(program, "lightCount"); } diff --git a/polymer/eduke32/build/src/sdlayer.c b/polymer/eduke32/build/src/sdlayer.c index 0735f8c13..69cd1a3cb 100644 --- a/polymer/eduke32/build/src/sdlayer.c +++ b/polymer/eduke32/build/src/sdlayer.c @@ -1196,6 +1196,10 @@ int32_t setvideomode(int32_t x, int32_t y, int32_t c, int32_t fs) { glinfo.vbos = 1; } + else if (!Bstrcmp((char *)p2, "GL_EXT_gpu_shader4")) + { + glinfo.sm4 = 1; + } } Bfree(p); diff --git a/polymer/eduke32/build/src/winlayer.c b/polymer/eduke32/build/src/winlayer.c index 1fef95b13..401b6e1b4 100644 --- a/polymer/eduke32/build/src/winlayer.c +++ b/polymer/eduke32/build/src/winlayer.c @@ -3472,6 +3472,10 @@ static int32_t SetupOpenGL(int32_t width, int32_t height, int32_t bitspp) { glinfo.vsync = 1; } + else if (!Bstrcmp((char *)p2, "GL_EXT_gpu_shader4")) + { + glinfo.sm4 = 1; + } } Bfree(p); }