From 2eab01710668fd53e75c721860666100d6d02b35 Mon Sep 17 00:00:00 2001 From: plagman Date: Fri, 6 Jun 2008 14:00:12 +0000 Subject: [PATCH] Model animation interpolation. git-svn-id: https://svn.eduke32.com/eduke32@775 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/build/include/glbuild.h | 1 + polymer/build/include/polymer.h | 8 +-- polymer/build/include/polymost.h | 6 ++ polymer/build/src/glbuild.c | 3 + polymer/build/src/polymer.c | 94 ++++++++++++++++++++++++++++++-- polymer/eduke32/source/osdcmds.c | 1 + 6 files changed, 102 insertions(+), 11 deletions(-) diff --git a/polymer/build/include/glbuild.h b/polymer/build/include/glbuild.h index 89d58e7bc..3c8f6b0a4 100644 --- a/polymer/build/include/glbuild.h +++ b/polymer/build/include/glbuild.h @@ -140,6 +140,7 @@ extern void (APIENTRY * bglDeleteLists)(GLuint list, GLsizei range); extern void (APIENTRY * bglEnableClientState)(GLenum cap); extern void (APIENTRY * bglDisableClientState)(GLenum cap); extern void (APIENTRY * bglVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +extern void (APIENTRY * bglNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer); extern void (APIENTRY * bglTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); extern void (APIENTRY * bglDrawArrays)(GLenum mode, GLint first, GLsizei count); extern void (APIENTRY * bglDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); diff --git a/polymer/build/include/polymer.h b/polymer/build/include/polymer.h index 2b7246040..d86eecc0f 100644 --- a/polymer/build/include/polymer.h +++ b/polymer/build/include/polymer.h @@ -38,6 +38,7 @@ extern int pr_billboardingmode; extern int pr_verbosity; extern int pr_wireframe; extern int pr_vbos; +extern int pr_gpusmoothing; extern int glerror; @@ -125,13 +126,6 @@ void polymer_drawsprite(int snum); # ifdef POLYMER_C -extern int globalposx, globalposy, globalposz, globalhoriz; -extern short globalang, globalcursectnum; -extern int globalpal, cosglobalang, singlobalang; -extern int cosviewingrangeglobalang, sinviewingrangeglobalang; -extern float shadescale; -extern int globalnoeffect; - // CORE static void polymer_displayrooms(short sectnum); static void polymer_drawplane(short sectnum, short wallnum, _prplane* plane, int indicecount); diff --git a/polymer/build/include/polymost.h b/polymer/build/include/polymost.h index c4bb1c7d0..09a921294 100644 --- a/polymer/build/include/polymost.h +++ b/polymer/build/include/polymost.h @@ -38,6 +38,12 @@ pthtyp * gltexcache (int dapicnum, int dapalnum, int dameth); extern palette_t hictinting[MAXPALOOKUPS]; extern float gtang; +extern int globalposx, globalposy, globalposz, globalhoriz; +extern short globalang, globalcursectnum; +extern int globalpal, cosglobalang, singlobalang; +extern int cosviewingrangeglobalang, sinviewingrangeglobalang; +extern float shadescale; +extern int globalnoeffect; #define HICEFFECTMASK (1|2|4) diff --git a/polymer/build/src/glbuild.c b/polymer/build/src/glbuild.c index 9cb99e8b3..444ec7a1b 100644 --- a/polymer/build/src/glbuild.c +++ b/polymer/build/src/glbuild.c @@ -107,6 +107,7 @@ void (APIENTRY * bglDeleteLists)(GLuint list, GLsizei range); void (APIENTRY * bglEnableClientState)(GLenum cap); void (APIENTRY * bglDisableClientState)(GLenum cap); void (APIENTRY * bglVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +void (APIENTRY * bglNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY * bglTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); void (APIENTRY * bglDrawArrays)(GLenum mode, GLint first, GLsizei count); void (APIENTRY * bglDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); @@ -353,6 +354,7 @@ int loadgldriver(const char *driver) bglEnableClientState = GETPROC("glEnableClientState"); bglDisableClientState = GETPROC("glDisableClientState"); bglVertexPointer = GETPROC("glVertexPointer"); + bglNormalPointer = GETPROC("glNormalPointer"); bglTexCoordPointer = GETPROC("glTexCoordPointer"); bglDrawArrays = GETPROC("glDrawArrays"); bglDrawElements = GETPROC("glDrawElements"); @@ -530,6 +532,7 @@ int unloadgldriver(void) bglEnableClientState = NULL; bglDisableClientState = NULL; bglVertexPointer = NULL; + bglNormalPointer = NULL; bglTexCoordPointer = NULL; bglDrawElements = NULL; diff --git a/polymer/build/src/polymer.c b/polymer/build/src/polymer.c index 23f746613..349ed5495 100644 --- a/polymer/build/src/polymer.c +++ b/polymer/build/src/polymer.c @@ -12,12 +12,15 @@ int pr_verbosity = 1; // 0: silent, 1: errors and one-times, 2 int pr_wireframe = 0; int pr_vbos = 2; int pr_mirrordepth = 1; +int pr_gpusmoothing = 1; int glerror; GLenum mapvbousage = GL_STREAM_DRAW_ARB; GLenum modelvbousage = GL_STATIC_DRAW_ARB; +GLuint modelvp; + // DATA _prsector *prsectors[MAXSECTORS]; _prwall *prwalls[MAXWALLS]; @@ -75,6 +78,32 @@ _pranimatespritesinfo asi; int polymer_init(void) { int i, j; + char modelvpstring[] = + "!!ARBvp1.0\n" + "ATTRIB in_pos = vertex.position;\n" + "ATTRIB in_pos2 = vertex.texcoord[1];\n" + "ATTRIB in_col = vertex.color;\n" + "ATTRIB in_tex = vertex.texcoord;\n" + "OUTPUT out_pos = result.position;\n" + "OUTPUT out_col = result.color;\n" + "OUTPUT out_tex = result.texcoord;\n" + "OUTPUT out_fog = result.fogcoord;\n" + "PARAM mvp[4] = { state.matrix.mvp };\n" + "PARAM bld[2] = { state.matrix.texture[0].row[0..1] };\n" + "TEMP a;\n" + "TEMP b;\n" + "MUL a, in_pos2, bld[0].x;\n" + "MUL b, in_pos, bld[1].y;\n" + "ADD a, a, b;\n" + "DP4 b.x, mvp[0], a;\n" + "DP4 b.y, mvp[1], a;\n" + "DP4 b.z, mvp[2], a;\n" + "DP4 b.w, mvp[3], a;\n" + "MOV out_pos, b;\n" + "MOV out_col, in_col;\n" + "MOV out_tex, in_tex;\n" + "MOV out_fog, b.z;\n" + "END\n"; if (pr_verbosity >= 1) OSD_Printf("Initalizing Polymer subsystem...\n"); @@ -119,6 +148,13 @@ int polymer_init(void) i++; } + if (pr_gpusmoothing) + { + bglGenProgramsARB(1, &modelvp); + bglBindProgramARB(GL_VERTEX_PROGRAM_ARB, modelvp); + bglProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(modelvpstring), modelvpstring); + } + if (pr_verbosity >= 1) OSD_Printf("PR : Initialization complete.\n"); return (1); } @@ -2160,7 +2196,7 @@ static void polymer_drawmdsprite(spritetype *tspr) float scale; GLfloat color[4]; int surfi; - md3xyzn_t *v0; + md3xyzn_t *v0, *v1; md3surf_t *s; GLuint i; @@ -2240,10 +2276,21 @@ static void polymer_drawmdsprite(spritetype *tspr) bglColor4f(color[0], color[1], color[2], color[3]); + if (pr_gpusmoothing) + { + bglEnable(GL_VERTEX_PROGRAM_ARB); + + bglMatrixMode(GL_TEXTURE); + bglLoadIdentity(); + bglScalef(m->interpol, 1 - m->interpol, 1.0); + bglMatrixMode(GL_MODELVIEW); + } + for (surfi=0;surfihead.numsurfs;surfi++) { s = &m->head.surfs[surfi]; v0 = &s->xyzn[m->cframe*s->numverts]; + v1 = &s->xyzn[m->nframe*s->numverts]; i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,sprite[tspr->owner].pal)].skinnum,tspr->pal,surfi); if (!i) @@ -2253,26 +2300,65 @@ static void polymer_drawmdsprite(spritetype *tspr) if (pr_vbos > 1) { - bglBindBufferARB(GL_ARRAY_BUFFER_ARB, m->geometry[surfi]); - bglVertexPointer(3, GL_SHORT, sizeof(md3xyzn_t), (GLfloat*)(m->cframe * s->numverts * sizeof(md3xyzn_t))); - bglBindBufferARB(GL_ARRAY_BUFFER_ARB, m->texcoords[surfi]); bglTexCoordPointer(2, GL_FLOAT, 0, 0); + if (pr_gpusmoothing) + { + bglClientActiveTextureARB(GL_TEXTURE1_ARB); + bglEnableClientState(GL_TEXTURE_COORD_ARRAY); + } + + bglBindBufferARB(GL_ARRAY_BUFFER_ARB, m->geometry[surfi]); + bglVertexPointer(3, GL_SHORT, sizeof(md3xyzn_t), (GLfloat*)(m->cframe * s->numverts * sizeof(md3xyzn_t))); + if (pr_gpusmoothing) + bglTexCoordPointer(3, GL_SHORT, sizeof(md3xyzn_t), (GLfloat*)(m->nframe * s->numverts * sizeof(md3xyzn_t))); + bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m->indices[surfi]); bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, 0); bglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); bglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); + + if (pr_gpusmoothing) + { + bglDisableClientState(GL_TEXTURE_COORD_ARRAY); + bglClientActiveTextureARB(GL_TEXTURE0_ARB); + } } else { bglVertexPointer(3, GL_SHORT, sizeof(md3xyzn_t), v0); bglTexCoordPointer(2, GL_FLOAT, 0, s->uv); + + if (pr_gpusmoothing) + { + bglClientActiveTextureARB(GL_TEXTURE1_ARB); + bglEnableClientState(GL_TEXTURE_COORD_ARRAY); + bglTexCoordPointer(3, GL_SHORT, sizeof(md3xyzn_t), v1); + } + bglDrawElements(GL_TRIANGLES, s->numtris * 3, GL_UNSIGNED_INT, s->tris); + + if (pr_gpusmoothing) + { + bglDisableClientState(GL_TEXTURE_COORD_ARRAY); + bglClientActiveTextureARB(GL_TEXTURE0_ARB); + } } } + bglPopMatrix(); + + if (pr_gpusmoothing) + { + bglDisable(GL_VERTEX_PROGRAM_ARB); + + bglMatrixMode(GL_TEXTURE); + bglLoadIdentity(); + bglMatrixMode(GL_MODELVIEW); + } + globalnoeffect=0; } diff --git a/polymer/eduke32/source/osdcmds.c b/polymer/eduke32/source/osdcmds.c index ad6a210a6..8e14fca57 100644 --- a/polymer/eduke32/source/osdcmds.c +++ b/polymer/eduke32/source/osdcmds.c @@ -702,6 +702,7 @@ cvar[] = { "pr_verbosity", "pr_verbosity: verbosity level of the polymer renderer", (void*)&pr_verbosity, CVAR_INT, 0, 0, 3 }, { "pr_wireframe", "pr_wireframe: toggles wireframe mode", (void*)&pr_wireframe, CVAR_INT, 0, 0, 1 }, { "pr_vbos", "pr_vbos: contols Vertex Buffer Object usage. 0: no VBOs. 1: VBOs for map data. 2: VBOs for model data.", (void*)&pr_vbos, CVAR_INT, 0, 0, 2 }, + { "pr_gpusmoothing", "pr_gpusmoothing: toggles model animation interpolation", (void*)&pr_gpusmoothing, CVAR_INT, 0, 0, 1 }, #endif #endif { "r_precache", "r_precache: enable/disable the pre-level caching routine", (void*)&ud.config.useprecache, CVAR_BOOL, 0, 0, 1 },