00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028 #include "3d/mesh_blender.h"
00029 #include "3d/driver.h"
00030 #include "3d/fast_floor.h"
00031
00032
00033 namespace NL3D {
00034
00035
00036
00037 void CMeshBlender::prepareRenderForGlobalAlpha(CMaterial &material, IDriver *drv, float globalAlpha, uint8 globalAlphaInt, bool gaDisableZWrite)
00038 {
00039
00040 if(gaDisableZWrite)
00041 {
00042
00043 _BkZWrite=material.getZWrite ();
00044 material.setZWrite (false);
00045 }
00046
00047
00048 _BkBlend=material.getBlend ();
00049 material.setBlend (true);
00050
00051
00052 _BkOpacity= material.getOpacity ();
00053 _BkSrcBlend= material.getSrcBlend();
00054 _BkDstBlend= material.getDstBlend();
00055
00056
00057 if(drv->supportBlendConstantColor())
00058 {
00059
00060 material.setOpacity ( 255 );
00061
00062
00063 drv->setBlendConstantColor( CRGBA(0,0,0, globalAlphaInt) );
00064
00065
00066 material.setSrcBlend(CMaterial::blendConstantAlpha);
00067
00068
00069 if ((_BkBlend == false) || (_BkDstBlend != CMaterial::one))
00070 material.setDstBlend(CMaterial::blendConstantInvAlpha);
00071
00072
00073
00074 }
00075
00076 else
00077 {
00078
00079 material.setOpacity (globalAlphaInt);
00080
00081
00082 material.setSrcBlend(CMaterial::srcalpha);
00083
00084
00085 if ((_BkBlend == false) || (_BkDstBlend != CMaterial::one))
00086 material.setDstBlend(CMaterial::invsrcalpha);
00087
00088
00089 if(material.getAlphaTest())
00090 {
00091 _BkAlphaTestThreshold= material.getAlphaTestThreshold();
00092 material.setAlphaTestThreshold(_BkAlphaTestThreshold * globalAlpha);
00093 }
00094 }
00095
00096 }
00097
00098
00099 void CMeshBlender::restoreRender(CMaterial &material, IDriver *drv, bool gaDisableZWrite)
00100 {
00101
00102 if(gaDisableZWrite)
00103 {
00104 material.setZWrite (_BkZWrite);
00105 }
00106
00107
00108 material.setBlend (_BkBlend);
00109
00110
00111 material.setOpacity (_BkOpacity);
00112 material.setSrcBlend(_BkSrcBlend);
00113 material.setDstBlend(_BkDstBlend);
00114
00115
00116 if(drv->supportBlendConstantColor())
00117 {
00118
00119 }
00120 else
00121 {
00122
00123 if(material.getAlphaTest())
00124 {
00125 material.setAlphaTestThreshold(_BkAlphaTestThreshold);
00126 }
00127 }
00128 }
00129
00130
00131
00132 void CMeshBlender::prepareRenderForGlobalAlphaCoarseMesh(CMaterial &material, IDriver *drv, NLMISC::CRGBA color, float globalAlpha, bool gaDisableZWrite)
00133 {
00134
00135
00136 uint8 globalAlphaInt= (uint8)OptFastFloor(255 * globalAlpha);
00137
00138
00139 if(gaDisableZWrite)
00140 material.setZWrite (false);
00141
00142 material.setBlend (true);
00143
00144
00145 _BkupColor= material.getColor();
00146 _BkSrcBlend= material.getSrcBlend();
00147 _BkDstBlend= material.getDstBlend();
00148
00149
00150 if(drv->supportBlendConstantColor())
00151 {
00152
00153 color.A= 255;
00154
00155 material.setColor ( color );
00156
00157
00158 drv->setBlendConstantColor( CRGBA(0,0,0, globalAlphaInt) );
00159
00160
00161 material.setSrcBlend(CMaterial::blendConstantAlpha);
00162 material.setDstBlend(CMaterial::blendConstantInvAlpha);
00163 }
00164 else
00165 {
00166
00167 color.A= globalAlphaInt;
00168
00169 material.setColor ( color );
00170
00171
00172 material.setSrcBlend(CMaterial::srcalpha);
00173 material.setDstBlend(CMaterial::invsrcalpha);
00174
00175
00176 material.setAlphaTestThreshold(0.5f * globalAlpha);
00177 }
00178 }
00179
00180
00181 void CMeshBlender::restoreRenderCoarseMesh(CMaterial &material, IDriver *drv, bool gaDisableZWrite)
00182 {
00183
00184 material.setColor ( _BkupColor );
00185 material.setSrcBlend(_BkSrcBlend);
00186 material.setDstBlend(_BkDstBlend);
00187
00188
00189 if(gaDisableZWrite)
00190 material.setZWrite (true);
00191
00192 material.setBlend (false);
00193
00194
00195 if(drv->supportBlendConstantColor())
00196 {
00197
00198 }
00199 else
00200 {
00201
00202 material.setAlphaTestThreshold(0.5f);
00203 }
00204 }
00205
00206 }