|
|
//----------------------------------------------------------------------------
//
// rampif.cpp
//
// Implements RampService.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//----------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
#include "rampif.h"
#include "rampmat.hpp"
//----------------------------------------------------------------------------
//
// RastRampService
//
// Called by d3dim to update RampRast about material cchanges and so on.
//
//----------------------------------------------------------------------------
HRESULT RastRampService(ULONG_PTR dwCtx, RastRampServiceType srvType, ULONG_PTR arg1, LPVOID arg2) { D3DContext *pD3DCtx = (D3DContext *)dwCtx;
switch (srvType) { case RAMP_SERVICE_CREATEMAT : return pD3DCtx->RampCreateMaterial((D3DMATERIALHANDLE) arg1); case RAMP_SERVICE_DESTORYMAT : return pD3DCtx->RampDestroyMaterial((D3DMATERIALHANDLE) arg1); case RAMP_SERVICE_SETMATDATA : return pD3DCtx->RampMaterialChanged((D3DMATERIALHANDLE) arg1); case RAMP_SERVICE_SETLIGHTSTATE: return pD3DCtx->RampSetLightstate((UINT32)arg1, arg2); case RAMP_SERVICE_FIND_LIGHTINGRANGE: return pD3DCtx->RampFindLightingRange((RAMP_RANGE_INFO *)arg1); case RAMP_SERVICE_CLEAR: return pD3DCtx->RampClear(); case RAMP_SERVICE_MATERIAL_TO_PIXEL: return pD3DCtx->RampMaterialToPixel((D3DMATERIALHANDLE) arg1, (DWORD*) arg2); case RAMP_SERVICE_SCENE_CAPTURE: return pD3DCtx->RampSceneCapture((DWORD)arg1, (LPDIRECT3DDEVICEI)arg2); case RAMP_SERVICE_PALETTE_CHANGED: return pD3DCtx->RampPaletteChanged((D3DTEXTUREHANDLE)arg1); case RAMP_SERVICE_CLEAR_TEX_RECT: return pD3DCtx->RampClearTexRect((D3DMATERIALHANDLE)arg1, (LPD3DRECT)arg2); default: D3D_ERR("(Rast) Invalid Service type passed to RastRampService"); return DDERR_GENERIC; } return D3D_OK; }
//----------------------------------------------------------------------------
//
// RastService
//
// Generic Rasterizer service call.
//
// Only use currently is to compute the RGB8 clear color, which requires
// accessing an internal ramp map.
//
//----------------------------------------------------------------------------
HRESULT RastService(ULONG_PTR dwCtx, RastServiceType srvType, DWORD arg1, LPVOID arg2) { D3DContext *pD3DCtx = (D3DContext *)dwCtx;
switch (srvType) { case RAST_SERVICE_RGB8COLORTOPIXEL : return pD3DCtx->RGB8ColorToPixel((D3DCOLOR) arg1, (DWORD*)arg2); default: D3D_ERR("(Rast) Invalid Service type passed to RastService"); return DDERR_GENERIC; } }
inline HRESULT D3DContext::RampCreateMaterial(D3DMATERIALHANDLE hMat) { return RLDDIRampCreateMaterial( (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv, hMat, &(m_RastCtx)); }
inline HRESULT D3DContext::RampDestroyMaterial(D3DMATERIALHANDLE hMat) { return RLDDIRampDestroyMaterial( (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv, hMat); }
inline HRESULT D3DContext::RampMaterialChanged(D3DMATERIALHANDLE hMat) { RLDDIRampLightingDriver *pLtDriver = (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv; if (pLtDriver) { // Update the material
HRESULT hr = RLDDIRampMaterialChanged(pLtDriver, hMat);
RampUpdateRangeInfo();
return hr; } else { return DDERR_GENERIC; } }
inline HRESULT D3DContext::RampSetLightstate(UINT32 uState, LPVOID pVal) { RLDDIRampLightingDriver *pRampdrv = (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv; // d3dim has alreay filtered out invlaid light states
switch (uState) { case D3DLIGHTSTATE_MATERIAL: RampSetMaterial(*((LPD3DMATERIALHANDLE)pVal)); break; case D3DLIGHTSTATE_AMBIENT: { D3DCOLOR Color = *((D3DCOLOR*)pVal); pRampdrv->driver.ambient = (FLOAT)(RGBA_GETRED(Color) * 0x4c + RGBA_GETGREEN(Color) * 0x96 + RGBA_GETBLUE(Color) * 0x1d) * (1.0F/(256.0F*255.0F)); } break; case D3DLIGHTSTATE_FOGMODE: pRampdrv->driver.fog_mode = *((D3DFOGMODE*)pVal); break; case D3DLIGHTSTATE_FOGSTART: pRampdrv->driver.fog_start = *((FLOAT*)pVal); break; case D3DLIGHTSTATE_FOGEND: pRampdrv->driver.fog_end = *((FLOAT*)pVal); break; case D3DLIGHTSTATE_FOGDENSITY: pRampdrv->driver.fog_density = *((FLOAT*)pVal); break; case D3DLIGHTSTATE_COLORMODEL: pRampdrv->driver.color_model = *((D3DCOLORMODEL*)pVal); break; } return D3D_OK; }
inline void D3DContext::BeginSceneHook(void) { RLDDIRampBeginSceneHook((RLDDIRampLightingDriver*)m_RastCtx.pRampDrv); RampUpdateRangeInfo(); }
inline void D3DContext::EndSceneHook(void) { RLDDIRampEndSceneHook((RLDDIRampLightingDriver*)m_RastCtx.pRampDrv); }
inline HRESULT D3DContext::RampMaterialToPixel(D3DMATERIALHANDLE hMat, DWORD* pPixel) { *pPixel = RLDDIRampMaterialToPixel( (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv, hMat); return D3D_OK; }
//----------------------------------------------------------------------------
//
// RastClearRamp
//
// This is for RampRast only.
//
//----------------------------------------------------------------------------
inline HRESULT D3DContext::RampClear(void) { // We only need to call BeginSceneHook here
BeginSceneHook();
return D3D_OK; }
inline void D3DContext::RampUpdateRangeInfo(void) { RLDDIRampLightingDriver *pLtDriver = (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv;
if (pLtDriver && pLtDriver->current_material) { // Update the ramp info. in RastCtx
pLtDriver->current_material->FindLightingRange( &(m_RastCtx.RampBase), &(m_RastCtx.RampSize), &(m_RastCtx.bRampSpecular), (unsigned long**)&(m_RastCtx.pTexRampMap));
// Make sure DD Palette is updated after it gets set by FindLightingRange
RLDDIRampUpdateDDPalette(&m_RastCtx); } } inline void D3DContext::RampSetMaterial(D3DMATERIALHANDLE hMat) { RLDDIRampLightingDriver *pLtDriver = (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv; RLDDIRampSetMaterial(pLtDriver, hMat); // Update the ramp info. in RastCtx
RampUpdateRangeInfo(); }
inline HRESULT D3DContext::RampFindLightingRange(RAMP_RANGE_INFO *pRampInfo) { RLDDIRampLightingDriver *pLtDriver = (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv;
if (pLtDriver && pLtDriver->current_material) { RampUpdateRangeInfo();
pRampInfo->base = m_RastCtx.RampBase; pRampInfo->size = m_RastCtx.RampSize; pRampInfo->specular = m_RastCtx.bRampSpecular; pRampInfo->pTexRampMap = m_RastCtx.pTexRampMap;
return D3D_OK; } else { return DDERR_GENERIC; } }
//-----------------------------------------------------------------------------
//
// RampSceneCapture
//
// Called on either begin or end scene to perform needed deferred operations on
// ramp materials and palettes.
//
//-----------------------------------------------------------------------------
inline HRESULT D3DContext::RampSceneCapture(DWORD dwStart, LPDIRECT3DDEVICEI lpDevI) { // always do begin, so that even materials used on internal begin/end's
// (like textured fills) get properly aged so they don't go away.
if (dwStart) { BeginSceneHook(); } else { if (!(lpDevI->dwHintFlags & D3DDEVBOOL_HINTFLAGS_INTERNAL_BEGIN_END)) { EndSceneHook(); } } return DD_OK; }
//---------------------------------------------------------------------
// Builds color index that moste closely matches the D3DCOLOR source color.
// For use in 8 bit RGB mode which requires a palette.
//
// Returns:
// color index in range 0 to 0xff
//
//---------------------------------------------------------------------
inline HRESULT D3DContext::RGB8ColorToPixel(D3DCOLOR Color, DWORD* pdwPalIdx) { if ((m_RastCtx.pRampMap == NULL) || (pdwPalIdx == NULL)) { return DDERR_GENERIC; } INT32 iMapIdx = MAKE_RGB8(RGBA_GETRED(Color), RGBA_GETGREEN(Color), RGBA_GETBLUE(Color)); iMapIdx &= 0xff; // RGB8 ramp map always first and only rampmap
// 8 bit result
*pdwPalIdx = m_RastCtx.pRampMap[iMapIdx] & 0xff; return DD_OK; }
//---------------------------------------------------------------------
// Causes the texture handle passed to have its colors rebuild, based
// on the new palette.
//
// Returns:
// color index in range 0 to 0xff
//
//---------------------------------------------------------------------
inline HRESULT D3DContext::RampPaletteChanged(D3DTEXTUREHANDLE hTex) { RLDDIRampLightingDriver *pLtDriver = (RLDDIRampLightingDriver*)m_RastCtx.pRampDrv;
return RLDDIRampPaletteChanged(pLtDriver, hTex); }
//---------------------------------------------------------------------
// Handles legacy non-power of 2 texture fill for clear.
//
// Returns:
// D3D_OK
//
//---------------------------------------------------------------------
inline HRESULT D3DContext::RampClearTexRect(D3DMATERIALHANDLE hMat, LPD3DRECT pRect) { switch (m_RastCtx.iSurfaceBitCount) { case 8: Ramp_Mono_ScaleImage_8(&m_RastCtx, hMat, pRect); break; case 16: Ramp_Mono_ScaleImage_16(&m_RastCtx, hMat, pRect); break; case 24: Ramp_Mono_ScaleImage_24(&m_RastCtx, hMat, pRect); break; case 32: Ramp_Mono_ScaleImage_32(&m_RastCtx, hMat, pRect); break; } return D3D_OK; }
|