/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */ #include "Shaders/StdH.h" #undef TEXTURE_COUNT #undef UVMAPS_COUNT #undef COLOR_COUNT #undef FLOAT_COUNT #undef FLAGS_COUNT #define TEXTURE_COUNT 2 #define UVMAPS_COUNT 1 #define COLOR_COUNT 2 #define FLOAT_COUNT 1 #define FLAGS_COUNT 2 #define BASE_TEXTURE 0 #define BASE_UVMAP 0 #define BASE_COLOR 0 #define DETAIL_TEXTURE 1 #define DETAIL_UVMAP 1 #define DETAIL_COLOR 1 #define DETAIL_TILING 0 #define BASE_DOUBLE_SIDED (1UL<<0) // Double sided #define BASE_FULL_BRIGHT (1UL<<1) // Full bright SHADER_MAIN(Detail) { shaSetTexture(BASE_TEXTURE); shaSetTextureWrapping( GFX_REPEAT, GFX_REPEAT); shaSetUVMap(BASE_UVMAP); shaSetColor(BASE_COLOR); shaEnableDepthTest(); shaDepthFunc(GFX_LESS_EQUAL); COLOR &colModelColor = shaGetModelColor(); BOOL bDoubleSided = shaGetFlags()&BASE_DOUBLE_SIDED; BOOL bOpaque = (colModelColor&0xFF)==0xFF; if(bDoubleSided) { shaCullFace(GFX_NONE); } else { shaCullFace(GFX_BACK); } shaCalculateLight(); // if fully opaque if(bOpaque) { // shaEnableAlphaTest(TRUE); shaDisableBlend(); shaEnableDepthWrite(); // if translucent } else { // shaEnableAlphaTest(FALSE); shaEnableBlend(); shaBlendFunc(GFX_SRC_ALPHA, GFX_INV_SRC_ALPHA); shaDisableDepthWrite(); shaModifyColorForFog(); } if(shaOverBrightningEnabled()) shaSetTextureModulation(2); shaRender(); if(bOpaque) { shaDoFogPass(); } // do detail pass FLOAT fMul = shaGetFloat(DETAIL_TILING); shaBlendFunc( GFX_DST_COLOR, GFX_SRC_COLOR); shaSetTexture(DETAIL_TEXTURE); shaSetUVMap(DETAIL_UVMAP); shaSetColor(DETAIL_COLOR); shaCalculateLight(); shaEnableBlend(); GFXTexCoord *ptxcOld = shaGetUVMap(0); GFXTexCoord *ptxcNew = shaGetNewTexCoordArray(); INDEX ctTexCoords = shaGetVertexCount(); if(ctTexCoords>0) { for(INDEX itxc=0;itxc0) { for(INDEX itxc=0;itxc