00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright © 2000-2002 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 #include "OgreD3D9Mappings.h" 00026 #include "OgreString.h" 00027 #include "OgreStringConverter.h" 00028 #include "OgreLogManager.h" 00029 #include "OgreException.h" 00030 00031 namespace Ogre 00032 { 00033 //--------------------------------------------------------------------- 00034 DWORD D3D9Mappings::get(ShadeOptions so) 00035 { 00036 switch( so ) 00037 { 00038 case SO_FLAT: 00039 return D3DSHADE_FLAT; 00040 case SO_GOURAUD: 00041 return D3DSHADE_GOURAUD; 00042 case SO_PHONG: 00043 return D3DSHADE_PHONG; 00044 } 00045 return 0; 00046 } 00047 //--------------------------------------------------------------------- 00048 D3DLIGHTTYPE D3D9Mappings::get(Ogre::Light::LightTypes lightType) 00049 { 00050 switch( lightType ) 00051 { 00052 case Light::LT_POINT: 00053 return D3DLIGHT_POINT; 00054 case Light::LT_DIRECTIONAL: 00055 return D3DLIGHT_DIRECTIONAL; 00056 case Light::LT_SPOTLIGHT: 00057 return D3DLIGHT_SPOT; 00058 } 00059 return D3DLIGHT_FORCE_DWORD; 00060 } 00061 //--------------------------------------------------------------------- 00062 DWORD D3D9Mappings::get(TexCoordCalcMethod m, const D3DCAPS9& caps) 00063 { 00064 switch( m ) 00065 { 00066 case TEXCALC_NONE: 00067 return D3DTSS_TCI_PASSTHRU; 00068 case TEXCALC_ENVIRONMENT_MAP_REFLECTION: 00069 return D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR; 00070 case TEXCALC_ENVIRONMENT_MAP_PLANAR: 00071 if (caps.VertexProcessingCaps & D3DVTXPCAPS_TEXGEN_SPHEREMAP) 00072 { 00073 // Use sphere map if available 00074 return D3DTSS_TCI_SPHEREMAP; 00075 } 00076 else 00077 { 00078 // If not, fall back on camera space reflection vector which isn't as good 00079 return D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR; 00080 } 00081 case TEXCALC_ENVIRONMENT_MAP_NORMAL: 00082 return D3DTSS_TCI_CAMERASPACENORMAL; 00083 case TEXCALC_ENVIRONMENT_MAP: 00084 if (caps.VertexProcessingCaps & D3DVTXPCAPS_TEXGEN_SPHEREMAP) 00085 { 00086 // Use sphere map if available 00087 return D3DTSS_TCI_SPHEREMAP; 00088 } 00089 else 00090 { 00091 // If not, fall back on camera space normal which isn't as good 00092 return D3DTSS_TCI_CAMERASPACENORMAL; 00093 } 00094 } 00095 return 0; 00096 } 00097 //--------------------------------------------------------------------- 00098 D3DTEXTUREADDRESS D3D9Mappings::get(TextureUnitState::TextureAddressingMode tam) 00099 { 00100 switch( tam ) 00101 { 00102 case TextureUnitState::TAM_WRAP: 00103 return D3DTADDRESS_WRAP; 00104 case TextureUnitState::TAM_MIRROR: 00105 return D3DTADDRESS_MIRROR; 00106 case TextureUnitState::TAM_CLAMP: 00107 return D3DTADDRESS_CLAMP; 00108 } 00109 return D3DTADDRESS_FORCE_DWORD; 00110 } 00111 //--------------------------------------------------------------------- 00112 D3DTEXTURESTAGESTATETYPE D3D9Mappings::get(LayerBlendType lbt) 00113 { 00114 switch( lbt ) 00115 { 00116 case LBT_COLOUR: 00117 return D3DTSS_COLOROP; 00118 case LBT_ALPHA: 00119 return D3DTSS_ALPHAOP; 00120 } 00121 return D3DTSS_FORCE_DWORD; 00122 } 00123 //--------------------------------------------------------------------- 00124 DWORD D3D9Mappings::get(LayerBlendSource lbs) 00125 { 00126 switch( lbs ) 00127 { 00128 case LBS_CURRENT: 00129 return D3DTA_CURRENT; 00130 case LBS_TEXTURE: 00131 return D3DTA_TEXTURE; 00132 case LBS_DIFFUSE: 00133 return D3DTA_DIFFUSE; 00134 case LBS_SPECULAR: 00135 return D3DTA_SPECULAR; 00136 case LBS_MANUAL: 00137 return D3DTA_TFACTOR; 00138 } 00139 return 0; 00140 } 00141 //--------------------------------------------------------------------- 00142 DWORD D3D9Mappings::get(LayerBlendOperationEx lbo, D3DCAPS9 devCaps) 00143 { 00144 switch( lbo ) 00145 { 00146 case LBX_SOURCE1: 00147 return D3DTOP_SELECTARG1; 00148 case LBX_SOURCE2: 00149 return D3DTOP_SELECTARG2; 00150 case LBX_MODULATE: 00151 return D3DTOP_MODULATE; 00152 case LBX_MODULATE_X2: 00153 return D3DTOP_MODULATE2X; 00154 case LBX_MODULATE_X4: 00155 return D3DTOP_MODULATE4X; 00156 case LBX_ADD: 00157 return D3DTOP_ADD; 00158 case LBX_ADD_SIGNED: 00159 return D3DTOP_ADDSIGNED; 00160 case LBX_ADD_SMOOTH: 00161 return D3DTOP_ADDSMOOTH; 00162 case LBX_SUBTRACT: 00163 return D3DTOP_SUBTRACT; 00164 case LBX_BLEND_DIFFUSE_ALPHA: 00165 return D3DTOP_BLENDDIFFUSEALPHA; 00166 case LBX_BLEND_TEXTURE_ALPHA: 00167 return D3DTOP_BLENDTEXTUREALPHA; 00168 case LBX_BLEND_CURRENT_ALPHA: 00169 return D3DTOP_BLENDCURRENTALPHA; 00170 case LBX_BLEND_MANUAL: 00171 return D3DTOP_BLENDFACTORALPHA; 00172 case LBX_DOTPRODUCT: 00173 if (devCaps.TextureOpCaps & D3DTEXOPCAPS_DOTPRODUCT3) 00174 return D3DTOP_DOTPRODUCT3; 00175 else 00176 return D3DTOP_MODULATE; 00177 } 00178 return 0; 00179 } 00180 //--------------------------------------------------------------------- 00181 D3DBLEND D3D9Mappings::get(SceneBlendFactor sbf) 00182 { 00183 switch( sbf ) 00184 { 00185 case SBF_ONE: 00186 return D3DBLEND_ONE; 00187 case SBF_ZERO: 00188 return D3DBLEND_ZERO; 00189 case SBF_DEST_COLOUR: 00190 return D3DBLEND_DESTCOLOR; 00191 case SBF_SOURCE_COLOUR: 00192 return D3DBLEND_SRCCOLOR; 00193 case SBF_ONE_MINUS_DEST_COLOUR: 00194 return D3DBLEND_INVDESTCOLOR; 00195 case SBF_ONE_MINUS_SOURCE_COLOUR: 00196 return D3DBLEND_INVSRCCOLOR; 00197 case SBF_DEST_ALPHA: 00198 return D3DBLEND_DESTALPHA; 00199 case SBF_SOURCE_ALPHA: 00200 return D3DBLEND_SRCALPHA; 00201 case SBF_ONE_MINUS_DEST_ALPHA: 00202 return D3DBLEND_INVDESTALPHA; 00203 case SBF_ONE_MINUS_SOURCE_ALPHA: 00204 return D3DBLEND_INVSRCALPHA; 00205 } 00206 return D3DBLEND_FORCE_DWORD; 00207 } 00208 //--------------------------------------------------------------------- 00209 DWORD D3D9Mappings::get(CompareFunction cf) 00210 { 00211 switch( cf ) 00212 { 00213 case CMPF_ALWAYS_FAIL: 00214 return D3DCMP_NEVER; 00215 case CMPF_ALWAYS_PASS: 00216 return D3DCMP_ALWAYS; 00217 case CMPF_LESS: 00218 return D3DCMP_LESS; 00219 case CMPF_LESS_EQUAL: 00220 return D3DCMP_LESSEQUAL; 00221 case CMPF_EQUAL: 00222 return D3DCMP_EQUAL; 00223 case CMPF_NOT_EQUAL: 00224 return D3DCMP_NOTEQUAL; 00225 case CMPF_GREATER_EQUAL: 00226 return D3DCMP_GREATEREQUAL; 00227 case CMPF_GREATER: 00228 return D3DCMP_GREATER; 00229 }; 00230 return 0; 00231 } 00232 //--------------------------------------------------------------------- 00233 DWORD D3D9Mappings::get(CullingMode cm, bool flip) 00234 { 00235 switch( cm ) 00236 { 00237 case CULL_NONE: 00238 return D3DCULL_NONE; 00239 case CULL_CLOCKWISE: 00240 if( flip ) 00241 return D3DCULL_CCW; 00242 else 00243 return D3DCULL_CW; 00244 case CULL_ANTICLOCKWISE: 00245 if( flip ) 00246 return D3DCULL_CW; 00247 else 00248 return D3DCULL_CCW; 00249 } 00250 return 0; 00251 } 00252 //--------------------------------------------------------------------- 00253 D3DFOGMODE D3D9Mappings::get(FogMode fm) 00254 { 00255 switch( fm ) 00256 { 00257 case FOG_EXP: 00258 return D3DFOG_EXP; 00259 case FOG_EXP2: 00260 return D3DFOG_EXP2; 00261 case FOG_LINEAR: 00262 return D3DFOG_LINEAR; 00263 } 00264 return D3DFOG_FORCE_DWORD; 00265 } 00266 //--------------------------------------------------------------------- 00267 D3DFILLMODE D3D9Mappings::get(SceneDetailLevel level) 00268 { 00269 switch(level) 00270 { 00271 case SDL_POINTS: 00272 return D3DFILL_POINT; 00273 case SDL_WIREFRAME: 00274 return D3DFILL_WIREFRAME; 00275 case SDL_SOLID: 00276 return D3DFILL_SOLID; 00277 } 00278 return D3DFILL_FORCE_DWORD; 00279 } 00280 //--------------------------------------------------------------------- 00281 DWORD D3D9Mappings::get(StencilOperation op) 00282 { 00283 switch(op) 00284 { 00285 case SOP_KEEP: 00286 return D3DSTENCILOP_KEEP; 00287 case SOP_ZERO: 00288 return D3DSTENCILOP_ZERO; 00289 case SOP_REPLACE: 00290 return D3DSTENCILOP_REPLACE; 00291 case SOP_INCREMENT: 00292 return D3DSTENCILOP_INCRSAT; 00293 case SOP_DECREMENT: 00294 return D3DSTENCILOP_DECRSAT; 00295 case SOP_INVERT: 00296 return D3DSTENCILOP_INVERT; 00297 } 00298 return 0; 00299 } 00300 //--------------------------------------------------------------------- 00301 D3DSAMPLERSTATETYPE D3D9Mappings::get(FilterType ft) 00302 { 00303 switch (ft) 00304 { 00305 case FT_MIN: 00306 return D3DSAMP_MINFILTER; 00307 break; 00308 case FT_MAG: 00309 return D3DSAMP_MAGFILTER; 00310 break; 00311 case FT_MIP: 00312 return D3DSAMP_MIPFILTER; 00313 break; 00314 } 00315 00316 // to keep compiler happy 00317 return D3DSAMP_MINFILTER; 00318 } 00319 //--------------------------------------------------------------------- 00320 DWORD D3D9Mappings::get(FilterType ft, FilterOptions fo, D3DCAPS9 devCaps, 00321 eD3DTexType texType) 00322 { 00323 DWORD capsType; 00324 00325 switch( texType ) 00326 { 00327 case D3D_TEX_TYPE_NORMAL: 00328 capsType = devCaps.TextureFilterCaps; 00329 break; 00330 case D3D_TEX_TYPE_CUBE: 00331 capsType = devCaps.CubeTextureFilterCaps; 00332 break; 00333 case D3D_TEX_TYPE_VOLUME: 00334 capsType = devCaps.VolumeTextureFilterCaps; 00335 break; 00336 } 00337 00338 switch (ft) 00339 { 00340 case FT_MIN: 00341 switch( fo ) 00342 { 00343 // NOTE: Fall through if device doesn't support requested type 00344 case FO_ANISOTROPIC: 00345 if( capsType & D3DPTFILTERCAPS_MINFANISOTROPIC ) 00346 { 00347 return D3DTEXF_ANISOTROPIC; 00348 break; 00349 } 00350 case FO_LINEAR: 00351 if( capsType & D3DPTFILTERCAPS_MINFLINEAR ) 00352 { 00353 return D3DTEXF_LINEAR; 00354 break; 00355 } 00356 case FO_POINT: 00357 case TFO_NONE: 00358 return D3DTEXF_POINT; 00359 break; 00360 } 00361 break; 00362 case FT_MAG: 00363 switch( fo ) 00364 { 00365 // NOTE: Fall through if device doesn't support requested type 00366 case FO_ANISOTROPIC: 00367 if( capsType & D3DPTFILTERCAPS_MAGFANISOTROPIC ) 00368 { 00369 return D3DTEXF_ANISOTROPIC; 00370 break; 00371 } 00372 case FO_LINEAR: 00373 if( capsType & D3DPTFILTERCAPS_MAGFLINEAR ) 00374 { 00375 return D3DTEXF_LINEAR; 00376 break; 00377 } 00378 case FO_POINT: 00379 case FO_NONE: 00380 return D3DTEXF_POINT; 00381 break; 00382 } 00383 break; 00384 case FT_MIP: 00385 switch( fo ) 00386 { 00387 case FO_ANISOTROPIC: 00388 case FO_LINEAR: 00389 if( capsType & D3DPTFILTERCAPS_MIPFLINEAR ) 00390 { 00391 return D3DTEXF_LINEAR; 00392 break; 00393 } 00394 case FO_POINT: 00395 if( capsType & D3DPTFILTERCAPS_MIPFPOINT ) 00396 { 00397 return D3DTEXF_POINT; 00398 break; 00399 } 00400 case TFO_NONE: 00401 return D3DTEXF_NONE; 00402 break; 00403 } 00404 break; 00405 } 00406 00407 // should never get here 00408 return 0; 00409 00410 } 00411 //--------------------------------------------------------------------- 00412 D3D9Mappings::eD3DTexType D3D9Mappings::get(TextureType ogreTexType) 00413 { 00414 switch( ogreTexType ) 00415 { 00416 case TEX_TYPE_1D : 00417 case TEX_TYPE_2D : 00418 return D3D9Mappings::D3D_TEX_TYPE_NORMAL; 00419 case TEX_TYPE_CUBE_MAP : 00420 return D3D9Mappings::D3D_TEX_TYPE_CUBE; 00421 case TEX_TYPE_3D : 00422 return D3D9Mappings::D3D_TEX_TYPE_VOLUME; 00423 } 00424 return D3D9Mappings::D3D_TEX_TYPE_NONE; 00425 } 00426 //--------------------------------------------------------------------- 00427 DWORD D3D9Mappings::get(HardwareBuffer::Usage usage) 00428 { 00429 DWORD ret = 0; 00430 if (usage & HardwareBuffer::HBU_DYNAMIC) 00431 { 00432 ret |= D3DUSAGE_DYNAMIC; 00433 } 00434 if (usage & HardwareBuffer::HBU_WRITE_ONLY) 00435 { 00436 ret |= D3DUSAGE_WRITEONLY; 00437 } 00438 return ret; 00439 } 00440 //--------------------------------------------------------------------- 00441 DWORD D3D9Mappings::get(HardwareBuffer::LockOptions options) 00442 { 00443 DWORD ret = 0; 00444 if (options == HardwareBuffer::HBL_DISCARD) 00445 { 00446 ret |= D3DLOCK_DISCARD; 00447 } 00448 if (options == HardwareBuffer::HBL_READ_ONLY) 00449 { 00450 ret |= D3DLOCK_READONLY; 00451 } 00452 if (options == HardwareBuffer::HBL_NO_OVERWRITE) 00453 { 00454 ret |= D3DLOCK_NOOVERWRITE; 00455 } 00456 00457 return ret; 00458 } 00459 //--------------------------------------------------------------------- 00460 D3DFORMAT D3D9Mappings::get(HardwareIndexBuffer::IndexType itype) 00461 { 00462 if (itype == HardwareIndexBuffer::IT_32BIT) 00463 { 00464 return D3DFMT_INDEX32; 00465 } 00466 else 00467 { 00468 return D3DFMT_INDEX16; 00469 } 00470 } 00471 //--------------------------------------------------------------------- 00472 D3DDECLTYPE D3D9Mappings::get(VertexElementType vType) 00473 { 00474 switch (vType) 00475 { 00476 case VET_COLOUR: 00477 return D3DDECLTYPE_D3DCOLOR; 00478 break; 00479 case VET_FLOAT1: 00480 return D3DDECLTYPE_FLOAT1; 00481 break; 00482 case VET_FLOAT2: 00483 return D3DDECLTYPE_FLOAT2; 00484 break; 00485 case VET_FLOAT3: 00486 return D3DDECLTYPE_FLOAT3; 00487 break; 00488 case VET_FLOAT4: 00489 return D3DDECLTYPE_FLOAT4; 00490 break; 00491 case VET_SHORT2: 00492 return D3DDECLTYPE_SHORT2; 00493 break; 00494 case VET_SHORT4: 00495 return D3DDECLTYPE_SHORT4; 00496 break; 00497 } 00498 // to keep compiler happy 00499 return D3DDECLTYPE_FLOAT3; 00500 } 00501 //--------------------------------------------------------------------- 00502 D3DDECLUSAGE D3D9Mappings::get(VertexElementSemantic sem) 00503 { 00504 switch (sem) 00505 { 00506 case VES_BLEND_INDICES: 00507 return D3DDECLUSAGE_BLENDINDICES; 00508 break; 00509 case VES_BLEND_WEIGHTS: 00510 return D3DDECLUSAGE_BLENDWEIGHT; 00511 break; 00512 case VES_DIFFUSE: 00513 return D3DDECLUSAGE_COLOR; // NB index will differentiate 00514 break; 00515 case VES_SPECULAR: 00516 return D3DDECLUSAGE_COLOR; // NB index will differentiate 00517 break; 00518 case VES_NORMAL: 00519 return D3DDECLUSAGE_NORMAL; 00520 break; 00521 case VES_POSITION: 00522 return D3DDECLUSAGE_POSITION; 00523 break; 00524 case VES_TEXTURE_COORDINATES: 00525 return D3DDECLUSAGE_TEXCOORD; 00526 break; 00527 case VES_BINORMAL: 00528 return D3DDECLUSAGE_BINORMAL; 00529 break; 00530 case VES_TANGENT: 00531 return D3DDECLUSAGE_TANGENT; 00532 break; 00533 } 00534 // to keep compiler happy 00535 return D3DDECLUSAGE_POSITION; 00536 } 00537 //--------------------------------------------------------------------- 00538 D3DXMATRIX D3D9Mappings::makeD3DXMatrix( const Matrix4& mat ) 00539 { 00540 // Transpose matrix 00541 // D3D9 uses row vectors i.e. V*M 00542 // Ogre, OpenGL and everything else uses column vectors i.e. M*V 00543 D3DXMATRIX d3dMat; 00544 d3dMat.m[0][0] = mat[0][0]; 00545 d3dMat.m[0][1] = mat[1][0]; 00546 d3dMat.m[0][2] = mat[2][0]; 00547 d3dMat.m[0][3] = mat[3][0]; 00548 00549 d3dMat.m[1][0] = mat[0][1]; 00550 d3dMat.m[1][1] = mat[1][1]; 00551 d3dMat.m[1][2] = mat[2][1]; 00552 d3dMat.m[1][3] = mat[3][1]; 00553 00554 d3dMat.m[2][0] = mat[0][2]; 00555 d3dMat.m[2][1] = mat[1][2]; 00556 d3dMat.m[2][2] = mat[2][2]; 00557 d3dMat.m[2][3] = mat[3][2]; 00558 00559 d3dMat.m[3][0] = mat[0][3]; 00560 d3dMat.m[3][1] = mat[1][3]; 00561 d3dMat.m[3][2] = mat[2][3]; 00562 d3dMat.m[3][3] = mat[3][3]; 00563 00564 return d3dMat; 00565 } 00566 //--------------------------------------------------------------------- 00567 Matrix4 D3D9Mappings::convertD3DXMatrix( const D3DXMATRIX& mat ) 00568 { 00569 Matrix4 ogreMat; 00570 ogreMat[0][0] = mat.m[0][0]; 00571 ogreMat[1][0] = mat.m[0][1]; 00572 ogreMat[2][0] = mat.m[0][2]; 00573 ogreMat[3][0] = mat.m[0][3]; 00574 00575 ogreMat[0][1] = mat.m[1][0]; 00576 ogreMat[1][1] = mat.m[1][1]; 00577 ogreMat[2][1] = mat.m[1][2]; 00578 ogreMat[3][1] = mat.m[1][3]; 00579 00580 ogreMat[0][2] = mat.m[2][0]; 00581 ogreMat[1][2] = mat.m[2][1]; 00582 ogreMat[2][2] = mat.m[2][2]; 00583 ogreMat[3][2] = mat.m[2][3]; 00584 00585 ogreMat[0][3] = mat.m[3][0]; 00586 ogreMat[1][3] = mat.m[3][1]; 00587 ogreMat[2][3] = mat.m[3][2]; 00588 ogreMat[3][3] = mat.m[3][3]; 00589 00590 return ogreMat; 00591 } 00592 00593 00594 }
Copyright © 2002-2003 by The OGRE Team
Last modified Wed Jan 21 00:10:07 2004