support for alpha-tested models

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@1890 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
Lee Salzman
2008-05-06 20:10:55 +00:00
parent cee24ed8de
commit 2bb7a48296
5 changed files with 35 additions and 8 deletions
+1
View File
@@ -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);
+1
View File
@@ -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);
+2 -2
View File
@@ -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;
+8
View File
@@ -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;
+23 -6
View File
@@ -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;