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:
@@ -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);
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user