int FindMiptex (const char *name) { int i; MaterialSystemMaterial_t matID; const char *propVal, *propVal2; int opacity; bool found; for (i=0 ; i<nummiptex ; i++) { if (!strcmp (name, textureref[i].name)) { return i; } } if (nummiptex == MAX_MAP_TEXTURES) Error ("Too many unique textures, max %d", MAX_MAP_TEXTURES); strcpy (textureref[i].name, name); textureref[i].lightmapWorldUnitsPerLuxel = 0.0f; textureref[i].flags = 0; textureref[i].contents = 0; matID = FindOriginalMaterial( name, &found ); if( matID == MATERIAL_NOT_FOUND ) { return 0; } if (!found) Warning("Material not found!: %s\n", name ); // HANDLE ALL OF THE STUFF THAT ISN'T RENDERED WITH THE MATERIAL THAT IS ONE IT. // handle sky if( ( propVal = GetMaterialVar( matID, "%compileSky" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_SKY | SURF_NOLIGHT; } else if( ( propVal = GetMaterialVar( matID, "%compile2DSky" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_SKY | SURF_SKY2D | SURF_NOLIGHT; } // handle hint brushes else if ( ( propVal = GetMaterialVar( matID, "%compileHint" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT | SURF_HINT; } // handle skip faces else if ( ( propVal = GetMaterialVar( matID, "%compileSkip" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT | SURF_SKIP; } // handle origin brushes else if ( ( propVal = GetMaterialVar( matID, "%compileOrigin" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_ORIGIN | CONTENTS_DETAIL; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // handle clip brushes else if ( ( propVal = GetMaterialVar( matID, "%compileClip" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_PLAYERCLIP | CONTENTS_MONSTERCLIP; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } else if ( ( propVal = GetMaterialVar( matID, "%playerClip" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_PLAYERCLIP; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // handle npc clip brushes else if ( ( propVal = GetMaterialVar( matID, "%compileNpcClip" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_MONSTERCLIP; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // handle surface lights which are meant to else if ( ( propVal = GetMaterialVar( matID, "%compileNoChop" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_NOCHOP; } // handle triggers else if ( ( propVal = GetMaterialVar( matID, "%compileTrigger" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= ( SURF_NOLIGHT | SURF_TRIGGER ); if ( g_NodrawTriggers ) { textureref[i].flags |= SURF_NODRAW; } } // handle nolight surfs (except water) else if ( (( propVal = GetMaterialVar( matID, "%compileNoLight" ) ) && StringIsTrue( propVal )) && !(( propVal2 = GetMaterialVar( matID, "%compileWater" ) ) && StringIsTrue( propVal2 ) ) ) { textureref[i].flags |= SURF_NOLIGHT; } else { // HANDLE ALL OF THE STUFF THAT IS RENDERED WITH THE MATERIAL THAT IS ON IT. // Handle ladders. if ( ( propVal = GetMaterialVar( matID, "%compileLadder" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_LADDER; } // handle wet materials if ( ( propVal = GetMaterialVar( matID, "%noPortal" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_NOPORTAL; } if ( ( propVal = GetMaterialVar( matID, "%compilePassBullets" ) ) && StringIsTrue( propVal ) ) { // change contents to grate, so bullets pass through // NOTE: This has effects on visibility too! textureref[i].contents &= ~CONTENTS_SOLID; textureref[i].contents |= CONTENTS_GRATE; } if( g_BumpAll || GetMaterialShaderPropertyBool( matID, UTILMATLIB_NEEDS_BUMPED_LIGHTMAPS ) ) { textureref[i].flags |= SURF_BUMPLIGHT; } if( GetMaterialShaderPropertyBool( matID, UTILMATLIB_NEEDS_LIGHTMAP ) ) { textureref[i].flags &= ~SURF_NOLIGHT; } else if( !g_bLightIfMissing ) { textureref[i].flags |= SURF_NOLIGHT; } // handle nodraw faces/brushes if ( ( propVal = GetMaterialVar( matID, "%compileNoDraw" ) ) && StringIsTrue( propVal ) ) { // textureref[i].contents |= CONTENTS_DETAIL; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // Just a combination of nodraw + pass bullets, makes things easier if ( ( propVal = GetMaterialVar( matID, "%compileInvisible" ) ) && StringIsTrue( propVal ) ) { // change contents to grate, so bullets pass through // NOTE: This has effects on visibility too! textureref[i].contents &= ~CONTENTS_SOLID; textureref[i].contents |= CONTENTS_GRATE; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } bool checkWindow = true; // handle non solid if ( ( propVal = GetMaterialVar( matID, "%compileNonsolid" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents = CONTENTS_OPAQUE; // Non-Solid can't be a window either! checkWindow = false; } // handle block LOS if ( ( propVal = GetMaterialVar( matID, "%compileBlockLOS" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents = CONTENTS_BLOCKLOS; // BlockLOS can't be a window either! checkWindow = false; } if ( ( propVal = GetMaterialVar( matID, "%compileDetail" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_DETAIL; } bool bKeepLighting = ( ( propVal = GetMaterialVar( matID, "%compileKeepLight" ) ) && StringIsTrue( propVal ) ); // handle materials that want to be treated as water. if ( ( propVal = GetMaterialVar( matID, "%compileWater" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents &= ~(CONTENTS_SOLID|CONTENTS_DETAIL); textureref[i].contents |= CONTENTS_WATER; textureref[i].flags |= SURF_WARP | SURF_NOSHADOWS | SURF_NODECALS; if ( g_DisableWaterLighting && !bKeepLighting ) { textureref[i].flags |= SURF_NOLIGHT; } // Set this so that we can check at the end of the process the presence of a a WaterLODControl entity. g_bHasWater = true; } const char *pShaderName = GetMaterialShaderName(matID); if ( !bKeepLighting && !Q_strncasecmp( pShaderName, "water", 5 ) || !Q_strncasecmp( pShaderName, "UnlitGeneric", 12 ) ) { //if ( !(textureref[i].flags & SURF_NOLIGHT) ) // Warning("Forcing lit materal %s to nolight\n", name ); textureref[i].flags |= SURF_NOLIGHT; } if ( ( propVal = GetMaterialVar( matID, "%compileSlime" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents &= ~(CONTENTS_SOLID|CONTENTS_DETAIL); textureref[i].contents |= CONTENTS_SLIME; textureref[i].flags |= SURF_NODECALS; // Set this so that we can check at the end of the process the presence of a a WaterLODControl entity. g_bHasWater = true; } opacity = GetMaterialShaderPropertyInt( matID, UTILMATLIB_OPACITY ); if ( checkWindow && opacity != UTILMATLIB_OPAQUE ) { // transparent *and solid* brushes that aren't grates or water must be windows if ( !(textureref[i].contents & (CONTENTS_GRATE|CONTENTS_WATER)) ) { textureref[i].contents |= CONTENTS_WINDOW; } textureref[i].contents &= ~CONTENTS_SOLID; // this affects engine primitive sorting, SURF_TRANS means sort as a translucent primitive if ( opacity == UTILMATLIB_TRANSLUCENT ) { textureref[i].flags |= SURF_TRANS; } } if ( textureref[i].flags & SURF_NOLIGHT ) { textureref[i].flags &= ~SURF_BUMPLIGHT; } } nummiptex++; return i; }
int FindMiptex (const char *name) { int i; MaterialSystemMaterial_t matID; const char *propVal; int opacity; bool found; for (i=0 ; i<nummiptex ; i++) { if (!strcmp (name, textureref[i].name)) { return i; } } if (nummiptex == MAX_MAP_TEXTURES) Error ("MAX_MAP_TEXTURES"); strcpy (textureref[i].name, name); textureref[i].lightmapWorldUnitsPerLuxel = 0.0f; textureref[i].flags = 0; textureref[i].contents = 0; matID = FindOriginalMaterial( name, &found ); if( matID == MATERIAL_NOT_FOUND ) { return 0; } if (!found) Warning("Material not found!: %s\n", name ); // HANDLE ALL OF THE STUFF THAT ISN'T RENDERED WITH THE MATERIAL THAT IS ONE IT. // handle sky if( ( propVal = GetMaterialVar( matID, "%compileSky" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_SKY | SURF_NOLIGHT; } // handle hint brushes else if ( ( propVal = GetMaterialVar( matID, "%compileHint" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT | SURF_HINT; } // handle skip faces else if ( ( propVal = GetMaterialVar( matID, "%compileSkip" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT | SURF_SKIP; } // handle origin brushes else if ( ( propVal = GetMaterialVar( matID, "%compileOrigin" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_ORIGIN | CONTENTS_DETAIL; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // handle clip brushes else if ( ( propVal = GetMaterialVar( matID, "%compileClip" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_PLAYERCLIP | CONTENTS_MONSTERCLIP; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // handle npc clip brushes else if ( ( propVal = GetMaterialVar( matID, "%compileNpcClip" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_MONSTERCLIP; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // handle triggers else if ( ( propVal = GetMaterialVar( matID, "%compileTrigger" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_NOLIGHT; } else if ( ( propVal = GetMaterialVar( matID, "%compilePlayerControlClip" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_DETAIL | CONTENTS_MIST; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } else { // HANDLE ALL OF THE STUFF THAT IS RENDERED WITH THE MATERIAL THAT IS ON IT. // Handle ladders. if ( ( propVal = GetMaterialVar( matID, "%compileLadder" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_LADDER; } // handle wet materials if ( ( propVal = GetMaterialVar( matID, "%compileWet" ) ) && StringIsTrue( propVal ) ) { textureref[i].flags |= SURF_WET; } if ( ( propVal = GetMaterialVar( matID, "%compilePassBullets" ) ) && StringIsTrue( propVal ) ) { // change contents to grate, so bullets pass through // NOTE: This has effects on visibility too! textureref[i].contents &= ~CONTENTS_SOLID; textureref[i].contents |= CONTENTS_GRATE; } if( g_BumpAll || GetMaterialShaderPropertyBool( matID, UTILMATLIB_NEEDS_BUMPED_LIGHTMAPS ) ) { textureref[i].flags |= SURF_BUMPLIGHT; } if( GetMaterialShaderPropertyBool( matID, UTILMATLIB_NEEDS_LIGHTMAP ) ) { textureref[i].flags &= ~SURF_NOLIGHT; } else if( !g_bLightIfMissing ) { textureref[i].flags |= SURF_NOLIGHT; } // handle nodraw faces/brushes if ( ( propVal = GetMaterialVar( matID, "%compileNoDraw" ) ) && StringIsTrue( propVal ) ) { // textureref[i].contents |= CONTENTS_DETAIL; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } // Just a combination of nodraw + pass bullets, makes things easier if ( ( propVal = GetMaterialVar( matID, "%compileInvisible" ) ) && StringIsTrue( propVal ) ) { // change contents to grate, so bullets pass through // NOTE: This has effects on visibility too! textureref[i].contents &= ~CONTENTS_SOLID; textureref[i].contents |= CONTENTS_GRATE; textureref[i].flags |= SURF_NODRAW | SURF_NOLIGHT; } bool checkWindow = true; // handle non solid if ( ( propVal = GetMaterialVar( matID, "%compileNonsolid" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents = CONTENTS_OPAQUE; // Non-Solid can't be a window either! checkWindow = false; } if ( ( propVal = GetMaterialVar( matID, "%compileDetail" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents |= CONTENTS_DETAIL; } // handle materials that want to be treated as water. if ( ( propVal = GetMaterialVar( matID, "%compileWater" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents &= ~(CONTENTS_SOLID|CONTENTS_DETAIL); textureref[i].contents |= CONTENTS_WATER; textureref[i].flags |= SURF_WARP; } if ( ( propVal = GetMaterialVar( matID, "%compileSlime" ) ) && StringIsTrue( propVal ) ) { textureref[i].contents &= ~(CONTENTS_SOLID|CONTENTS_DETAIL); textureref[i].contents |= CONTENTS_SLIME; //textureref[i].flags |= SURF_WARP; } opacity = GetMaterialShaderPropertyInt( matID, UTILMATLIB_OPACITY ); if ( checkWindow && opacity != UTILMATLIB_OPAQUE ) { // transparent *and solid* brushes that aren't grates or water must be windows if ( !(textureref[i].contents & (CONTENTS_GRATE|CONTENTS_WATER)) ) { textureref[i].contents |= CONTENTS_WINDOW; } textureref[i].contents &= ~CONTENTS_SOLID; // this affects engine primitive sorting, SURF_TRANS means sort as a translucent primitive if ( opacity == UTILMATLIB_TRANSLUCENT ) { textureref[i].flags |= SURF_TRANS; } } } nummiptex++; return i; }