/* =========================================================================== ARX FATALIS GPL Source Code Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company. This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code'). Arx Fatalis Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Arx Fatalis Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Arx Fatalis Source Code. If not, see . In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #include "ARX_GlobalMods.h" #include "EERIEMath.h" #include "arx_menu2.h" #include "arx_time.h" #include #define _CRTDBG_MAP_ALLOC #include bool bUSE_D3DFOG_INTER; float fZFogStartWorld; float fZFogEndWorld; GLOBAL_MODS current; GLOBAL_MODS desired; GLOBAL_MODS stacked; extern long USE_D3DFOG; extern long EDITMODE; // changement du clipping Z valeur max & min #define DEFAULT_ZCLIP 6400.f #define DEFAULT_MINZCLIP 1200.f extern CMenuConfig * pMenuConfig; extern float fZFogEnd; extern float fZFogStart; extern bool bZBUFFER; extern D3DMATRIX ProjectionMatrix; extern unsigned long ulBKGColor = 0; void ARX_GLOBALMODS_Reset() { memset(&desired, 0, sizeof(GLOBAL_MODS)); memset(¤t, 0, sizeof(GLOBAL_MODS)); current.zclip = DEFAULT_ZCLIP; memset(&stacked, 0, sizeof(GLOBAL_MODS)); stacked.zclip = DEFAULT_ZCLIP; desired.zclip = DEFAULT_ZCLIP; desired.depthcolor.r = 0.f; desired.depthcolor.g = 0.f; desired.depthcolor.b = 0.f; } float Approach(float current, float desired, float increment) { if (desired > current) { current += increment; if (desired < current) current = desired; } else if (desired < current) { current -= increment; if (desired > current) current = desired; } return current; } void ARX_GLOBALMODS_Stack() { memcpy(&stacked, &desired, sizeof(GLOBAL_MODS)); desired.depthcolor.r = 0.f; desired.depthcolor.g = 0.f; desired.depthcolor.b = 0.f; desired.zclip = DEFAULT_ZCLIP; } void ARX_GLOBALMODS_UnStack() { memcpy(&desired, &stacked, sizeof(GLOBAL_MODS)); } void ARX_GLOBALMODS_Apply() { if (EDITMODE) return; float baseinc = _framedelay; float incdiv1000 = _framedelay * DIV1000; if (desired.flags & GMOD_ZCLIP) { current.zclip = Approach(current.zclip, desired.zclip, baseinc * 2); } else // return to default... { desired.zclip = current.zclip = Approach(current.zclip, DEFAULT_ZCLIP, baseinc * 2); } // Now goes for RGB mods if (desired.flags & GMOD_DCOLOR) { current.depthcolor.r = Approach(current.depthcolor.r, desired.depthcolor.r, incdiv1000); current.depthcolor.g = Approach(current.depthcolor.g, desired.depthcolor.g, incdiv1000); current.depthcolor.b = Approach(current.depthcolor.b, desired.depthcolor.b, incdiv1000); } else { current.depthcolor.r = Approach(current.depthcolor.r, 0, incdiv1000); current.depthcolor.g = Approach(current.depthcolor.g, 0, incdiv1000); current.depthcolor.b = Approach(current.depthcolor.b, 0, incdiv1000); } ModeLight &= ~MODE_DEPTHCUEING; if (pMenuConfig) { float fZclipp = ((((float)pMenuConfig->iFogDistance) * 1.2f) * (DEFAULT_ZCLIP - DEFAULT_MINZCLIP) / 10.f) + DEFAULT_MINZCLIP; fZclipp += (ACTIVECAM->focal - 310.f) * 5.f; SetCameraDepth(__min(current.zclip, fZclipp)); } else { SetCameraDepth(current.zclip); } if (USE_D3DFOG) { D3DDEVICEDESC7 d3dDeviceDesc; GDevice->GetCaps(&d3dDeviceDesc); #define PERCENT_FOG (.6f) ulBKGColor = D3DRGB(current.depthcolor.r, current.depthcolor.g, current.depthcolor.b); //pour compatibilité ATI, etc... GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, ulBKGColor); float zval; zval = fZFogEnd; float zvalstart = fZFogStart; if ((!pMenuConfig->bATI) && (d3dDeviceDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_FOGTABLE)) { GDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, D3DFOG_NONE); GDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, D3DFOG_LINEAR); bUSE_D3DFOG_INTER = true; //WORLD COORDINATE if (d3dDeviceDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_WFOG) { zval *= ACTIVECAM->cdepth; zvalstart *= ACTIVECAM->cdepth; } } else { zval *= ACTIVECAM->cdepth; zvalstart *= ACTIVECAM->cdepth; fZFogStartWorld = zvalstart; fZFogEndWorld = zval; GDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, D3DFOG_LINEAR); GDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, D3DFOG_NONE); bUSE_D3DFOG_INTER = false; } GDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEEND, *((LPDWORD)(&zval))); GDevice->SetRenderState(D3DRENDERSTATE_FOGTABLESTART, *((LPDWORD)(&zvalstart))); } else { GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, D3DRGB(current.depthcolor.r, current.depthcolor.g, current.depthcolor.b)); GDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, D3DFOG_NONE); GDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, D3DFOG_NONE); } }