From 2bb7a482966b4883060aaa3c31ecbd354033c36b Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Tue, 6 May 2008 20:10:55 +0000 Subject: [PATCH] support for alpha-tested models git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@1890 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/md2.h | 1 + source/src/md3.h | 1 + source/src/model.h | 4 ++-- source/src/rendermodel.cpp | 8 ++++++++ source/src/vertmodel.h | 29 +++++++++++++++++++++++------ 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/source/src/md2.h b/source/src/md2.h index 042342b9..9e164be3 100644 --- a/source/src/md2.h +++ b/source/src/md2.h @@ -104,6 +104,7 @@ struct md2 : vertmodel mesh &m = *new mesh; meshes.add(&m); + m.owner = this; int *glcommands = new int[header.numglcommands]; fseek(file, header.offsetglcommands, SEEK_SET); diff --git a/source/src/md3.h b/source/src/md3.h index f57d56f0..e7735d7e 100644 --- a/source/src/md3.h +++ b/source/src/md3.h @@ -94,6 +94,7 @@ struct md3 : vertmodel loopi(header.nummeshes) { mesh &m = *meshes.add(new mesh); + m.owner = this; md3meshheader mheader; fseek(f, mesh_offset, SEEK_SET); fread(&mheader, sizeof(md3meshheader), 1, f); diff --git a/source/src/model.h b/source/src/model.h index f347d076..11d56212 100644 --- a/source/src/model.h +++ b/source/src/model.h @@ -38,11 +38,11 @@ struct dynent; struct model { bool cullface; - float translucency, scale; + float alphatest, translucency, scale; vec translate; int batch; - model() : cullface(true), translucency(0.25f), scale(1), translate(0, 0, 0), batch(-1) {} + model() : cullface(true), alphatest(0.9f), translucency(0.25f), scale(1), translate(0, 0, 0), batch(-1) {} virtual ~model() {} virtual bool load() = 0; diff --git a/source/src/rendermodel.cpp b/source/src/rendermodel.cpp index 1a6f77c0..71b9a281 100644 --- a/source/src/rendermodel.cpp +++ b/source/src/rendermodel.cpp @@ -28,6 +28,14 @@ void mdltranslucent(int translucency) COMMAND(mdltranslucent, ARG_1INT); +void mdlalphatest(int alphatest) +{ + checkmdl; + loadingmodel->alphatest = alphatest/100.0f; +} + +COMMAND(mdlalphatest, ARG_1INT); + void mdlscale(int percent) { checkmdl; diff --git a/source/src/vertmodel.h b/source/src/vertmodel.h index 559046d7..4aaafcb3 100644 --- a/source/src/vertmodel.h +++ b/source/src/vertmodel.h @@ -39,9 +39,12 @@ struct vertmodel : model struct tcvert { float u, v; ushort index; }; struct tri { ushort vert[3]; }; + struct part; + struct mesh { char *name; + part *owner; vec *verts; tcvert *tcverts; tri *tris; @@ -58,7 +61,7 @@ struct vertmodel : model GLuint statlist; int statlen; - mesh() : name(0), verts(0), tcverts(0), tris(0), skin(notexture), tex(0), dynbuf(0), dynidx(0), statlist(0) + mesh() : name(0), owner(0), verts(0), tcverts(0), tris(0), skin(notexture), tex(0), dynbuf(0), dynidx(0), statlist(0) { dyncur.fr1 = dynprev.fr1 = -1; } @@ -138,12 +141,22 @@ struct vertmodel : model { GLuint id = tex < 0 ? -tex : skin->id; if(tex > 0) id = lookuptexture(tex)->id; - if(id!=lasttex) + if(id != lasttex) { glBindTexture(GL_TEXTURE_2D, id); lasttex = id; } if(enablealphablend) { glDisable(GL_BLEND); enablealphablend = false; } + if(skin->bpp == 32 && owner->model->alphatest > 0) + { + if(!enablealphatest) { glEnable(GL_ALPHA_TEST); enablealphatest = true; } + if(lastalphatest != owner->model->alphatest) + { + glAlphaFunc(GL_GREATER, owner->model->alphatest); + lastalphatest = owner->model->alphatest; + } + } + else if(enablealphatest) { glDisable(GL_ALPHA_TEST); enablealphatest = false; } if(!enabledepthmask) { glDepthMask(GL_TRUE); enabledepthmask = true; } } @@ -590,6 +603,7 @@ struct vertmodel : model } if(enabledepthmask) { glDepthMask(GL_FALSE); enabledepthmask = false; } + if(enablealphatest) { glDisable(GL_ALPHA_TEST); enablealphatest = false; } if(!enablealphablend) { glEnable(GL_BLEND); @@ -669,23 +683,26 @@ struct vertmodel : model return parts.length()==1 && parts[0]->shadows; } - static bool enablealphablend, enabledepthmask; + static bool enablealphablend, enablealphatest, enabledepthmask; static GLuint lasttex; + static float lastalphatest; void startrender() { - enablealphablend = false; + enablealphablend = enablealphatest = false; enabledepthmask = true; lasttex = 0; + lastalphatest = -1; } void endrender() { if(enablealphablend) glDisable(GL_BLEND); + if(enablealphatest) glDisable(GL_ALPHA_TEST); if(!enabledepthmask) glDepthMask(GL_TRUE); } }; -bool vertmodel::enablealphablend = false, vertmodel::enabledepthmask = true; +bool vertmodel::enablealphablend = false, vertmodel::enablealphatest = false, vertmodel::enabledepthmask = true; GLuint vertmodel::lasttex = 0; - +float vertmodel::lastalphatest = -1;