I think the old games used white masks that were XOR’d onto the screen, then the sprite images were XOR’d after think. I have some working code to mimic the technique but I’m not sure if I’m allowed to post it… I hope it’s useful.
bool Model::Draw(RGB *ColourOverride)
{
if (!IsLoaded) return false;
FACE_MATERIAL_DATA *MatData = TheModel->FaceMaterials;
// we will use vertex arrays, so enable them
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
// set the material shininess factor
float shininess;
shininess = 50.0f;
glMaterialfv(GL_FRONT, GL_SHININESS, &shininess);
// set the vertex and normal buffers
glVertexPointer(3, GL_FLOAT, 0, TheModel->VertexData);
glNormalPointer(GL_FLOAT, 0, TheModel->VertexNormals);
while (MatData != NULL)
{
//Set Ambient, Diffuse and Specular Material Colours
if (ColourOverride)
{
glMaterialfv(GL_FRONT, GL_AMBIENT, (float *) ColourOverride);
glMaterialfv(GL_FRONT, GL_DIFFUSE, (float *) ColourOverride);
glMaterialfv(GL_FRONT, GL_SPECULAR, (float *) ColourOverride);
}
if (MatData->TexHandle && !ColourOverride)
{
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, (MatData->TexHandle)->GetGLTextureHandle());
glTexCoordPointer(2, GL_FLOAT, 0, TheModel->MappingCoords);
}
glDrawElements(GL_TRIANGLES, MatData->NumFacesWithThisMaterial * 3, GL_UNSIGNED_SHORT, MatData->GLFaceData);
if (MatData->TexHandle && !ColourOverride)
{
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
MatData = MatData->Next;
}
// clear vertex array state
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
return true;
}