#include "pch.h" #include "SampleSW.h" #pragma hdrstop const D3DCAPS8 CMyDriver::c_D3DCaps= { // Indicates this is software rasterizer. /*D3DDEVTYPE_HAL|| D3DDEVTYPE_REF||*/ D3DDEVTYPE_SW, // Adapter ordinal (isn't used to report anything). 0, // Caps (See ddraw.h & d3d8caps.h for details of each CAP). /*DDCAPS_3D| DDCAPS_ALIGNBOUNDARYDEST| DDCAPS_ALIGNSIZEDEST| DDCAPS_ALIGNBOUNDARYSRC| DDCAPS_ALIGNSIZESRC| DDCAPS_ALIGNSTRIDE| DDCAPS_BLT| DDCAPS_BLTQUEUE| DDCAPS_BLTFOURCC| DDCAPS_BLTSTRETCH| DDCAPS_GDI| DDCAPS_OVERLAY| DDCAPS_OVERLAYCANTCLIP| DDCAPS_OVERLAYFOURCC| DDCAPS_OVERLAYSTRETCH| DDCAPS_PALETTE| DDCAPS_PALETTEVSYNC| DDCAPS_READSCANLINE| DDCAPS_VBI| DDCAPS_ZBLTS| DDCAPS_ZOVERLAYS| DDCAPS_COLORKEY| DDCAPS_ALPHA| DDCAPS_COLORKEYHWASSIST| DDCAPS_NOHARDWARE| DDCAPS_BLTCOLORFILL| DDCAPS_BANKSWITCHED| DDCAPS_BLTDEPTHFILL| DDCAPS_CANCLIP| DDCAPS_CANCLIPSTRETCHED| DDCAPS_CANBLTSYSMEM| D3DCAPS_READ_SCANLINE|*/ 0, // Caps2 /*DDCAPS2_CERTIFIED| DDCAPS2_NO2DDURING3DSCENE| DDCAPS2_VIDEOPORT| DDCAPS2_AUTOFLIPOVERLAY| DDCAPS2_CANBOBINTERLEAVED| DDCAPS2_CANBOBNONINTERLEAVED| DDCAPS2_COLORCONTROLOVERLAY| DDCAPS2_COLORCONTROLPRIMARY|*/ DDCAPS2_CANDROPZ16BIT| /*DDCAPS2_NONLOCALVIDMEM| DDCAPS2_NONLOCALVIDMEMCAPS| DDCAPS2_NOPAGELOCKREQUIRED|*/ DDCAPS2_WIDESURFACES| /*DDCAPS2_CANFLIPODDEVEN| DDCAPS2_CANBOBHARDWARE| DDCAPS2_COPYFOURCC| DDCAPS2_PRIMARYGAMMA|*/ DDCAPS2_CANRENDERWINDOWED| /*DDCAPS2_CANCALIBRATEGAMMA| DDCAPS2_FLIPINTERVAL| DDCAPS2_FLIPNOVSYNC| DDCAPS2_CANMANAGETEXTURE| DDCAPS2_TEXMANINNONLOCALVIDMEM| DDCAPS2_STEREO| DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL| D3DCAPS2_NO2DDURING3DSCENE| D3DCAPS2_FULLSCREENGAMMA|*/ D3DCAPS2_CANRENDERWINDOWED| /*D3DCAPS2_CANCALIBRATEGAMMA|*/ 0, // Caps3 0, // Presentation Intervals 0, // Cursor Caps 0, // DevCaps (See d3d8caps.h & d3dhal.h) // The SDDI driver should keep D3DDEVCAPS_TEXTUREVIDEOMEMORY enabled. The // runtime does not behave correctly if the driver does not enable and // support this cap. In other words, all textures must be able to be // vid mem (driver allocated) textures, at least. D3DDEVCAPS_EXECUTESYSTEMMEMORY| /*D3DDEVCAPS_EXECUTEVIDEOMEMORY|*/ D3DDEVCAPS_TLVERTEXSYSTEMMEMORY| /*D3DDEVCAPS_TLVERTEXVIDEOMEMORY|*/ D3DDEVCAPS_TEXTURESYSTEMMEMORY| D3DDEVCAPS_TEXTUREVIDEOMEMORY| D3DDEVCAPS_DRAWPRIMTLVERTEX| /*D3DDEVCAPS_CANRENDERAFTERFLIP| D3DDEVCAPS_TEXTURENONLOCALVIDMEM| D3DDEVCAPS_DRAWPRIMITIVES2|*/ /*D3DDEVCAPS_SEPARATETEXTUREMEMORIES|*/ D3DDEVCAPS_DRAWPRIMITIVES2EX| /*D3DDEVCAPS_HWTRANSFORMANDLIGHT| D3DDEVCAPS_CANBLTSYSTONONLOCAL|*/ D3DDEVCAPS_HWRASTERIZATION| /*D3DDEVCAPS_PUREDEVICE| D3DDEVCAPS_QUINTICRTPATCHES| D3DDEVCAPS_RTPATCHES| D3DDEVCAPS_RTPATCHHANDLEZERO| D3DDEVCAPS_NPATCHES| D3DDEVCAPS_HWVERTEXBUFFER| D3DDEVCAPS_HWINDEXBUFFER|*/ 0, // Primitive Misc Caps D3DPMISCCAPS_MASKZ| D3DPMISCCAPS_LINEPATTERNREP| D3DPMISCCAPS_CULLNONE| D3DPMISCCAPS_CULLCW| D3DPMISCCAPS_CULLCCW| D3DPMISCCAPS_COLORWRITEENABLE| /*D3DPMISCCAPS_CLIPPLANESCALEDPOINTS| D3DPMISCCAPS_CLIPTLVERTS|*/ D3DPMISCCAPS_TSSARGTEMP| D3DPMISCCAPS_BLENDOP| 0, // Raster Caps /*D3DPRASTERCAPS_DITHER| D3DPRASTERCAPS_ROP2| D3DPRASTERCAPS_XOR| D3DPRASTERCAPS_PAT|*/ D3DPRASTERCAPS_ZTEST| /*D3DPRASTERCAPS_FOGVERTEX| D3DPRASTERCAPS_FOGTABLE| D3DPRASTERCAPS_ANTIALIASEDGES| D3DPRASTERCAPS_MIPMAPLODBIAS| D3DPRASTERCAPS_ZBIAS| D3DPRASTERCAPS_ZBUFFERLESSHSR| D3DPRASTERCAPS_FOGRANGE| D3DPRASTERCAPS_ANISOTROPY| D3DPRASTERCAPS_WBUFFER| D3DPRASTERCAPS_WFOG| D3DPRASTERCAPS_ZFOG| D3DPRASTERCAPS_COLORPERSPECTIVE| D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE| */ 0, // Z Compare Caps D3DPCMPCAPS_NEVER| D3DPCMPCAPS_LESS| D3DPCMPCAPS_EQUAL| D3DPCMPCAPS_LESSEQUAL| D3DPCMPCAPS_GREATER| D3DPCMPCAPS_NOTEQUAL| D3DPCMPCAPS_GREATEREQUAL| D3DPCMPCAPS_ALWAYS| 0, // Src Blend Caps D3DPBLENDCAPS_ZERO| D3DPBLENDCAPS_ONE| D3DPBLENDCAPS_SRCCOLOR| D3DPBLENDCAPS_INVSRCCOLOR| D3DPBLENDCAPS_SRCALPHA| D3DPBLENDCAPS_INVSRCALPHA| D3DPBLENDCAPS_DESTALPHA| D3DPBLENDCAPS_INVDESTALPHA| D3DPBLENDCAPS_DESTCOLOR| D3DPBLENDCAPS_INVDESTCOLOR| D3DPBLENDCAPS_SRCALPHASAT| D3DPBLENDCAPS_BOTHSRCALPHA| D3DPBLENDCAPS_BOTHINVSRCALPHA| 0, // Dest Blend Caps D3DPBLENDCAPS_ZERO| D3DPBLENDCAPS_ONE| D3DPBLENDCAPS_SRCCOLOR| D3DPBLENDCAPS_INVSRCCOLOR| D3DPBLENDCAPS_SRCALPHA| D3DPBLENDCAPS_INVSRCALPHA| D3DPBLENDCAPS_DESTALPHA| D3DPBLENDCAPS_INVDESTALPHA| D3DPBLENDCAPS_DESTCOLOR| D3DPBLENDCAPS_INVDESTCOLOR| D3DPBLENDCAPS_SRCALPHASAT| 0, // Alpha Compare Caps D3DPCMPCAPS_NEVER| D3DPCMPCAPS_LESS| D3DPCMPCAPS_EQUAL| D3DPCMPCAPS_LESSEQUAL| D3DPCMPCAPS_GREATER| D3DPCMPCAPS_NOTEQUAL| D3DPCMPCAPS_GREATEREQUAL| D3DPCMPCAPS_ALWAYS| 0, // Shade Caps D3DPSHADECAPS_COLORGOURAUDRGB| D3DPSHADECAPS_SPECULARGOURAUDRGB| D3DPSHADECAPS_ALPHAGOURAUDBLEND| D3DPSHADECAPS_FOGGOURAUD| 0, // Texture Caps D3DPTEXTURECAPS_PERSPECTIVE| /*D3DPTEXTURECAPS_POW2|*/ D3DPTEXTURECAPS_ALPHA| /*D3DPTEXTURECAPS_SQUAREONLY|*/ D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE| D3DPTEXTURECAPS_ALPHAPALETTE| /*D3DPTEXTURECAPS_NONPOW2CONDITIONAL|*/ D3DPTEXTURECAPS_PROJECTED| D3DPTEXTURECAPS_CUBEMAP| D3DPTEXTURECAPS_VOLUMEMAP| D3DPTEXTURECAPS_MIPMAP| D3DPTEXTURECAPS_MIPVOLUMEMAP| D3DPTEXTURECAPS_MIPCUBEMAP| /*D3DPTEXTURECAPS_CUBEMAP_POW2| D3DPTEXTURECAPS_VOLUMEMAP_POW2|*/ 0, // Texture Filter Caps D3DPTFILTERCAPS_MINFPOINT| D3DPTFILTERCAPS_MINFLINEAR| D3DPTFILTERCAPS_MINFANISOTROPIC| D3DPTFILTERCAPS_MIPFPOINT| D3DPTFILTERCAPS_MIPFLINEAR| D3DPTFILTERCAPS_MAGFPOINT| D3DPTFILTERCAPS_MAGFLINEAR| D3DPTFILTERCAPS_MAGFANISOTROPIC| D3DPTFILTERCAPS_MAGFAFLATCUBIC| D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC| 0, // Cube Texture Filter Caps D3DPTFILTERCAPS_MINFPOINT| D3DPTFILTERCAPS_MINFLINEAR| D3DPTFILTERCAPS_MINFANISOTROPIC| D3DPTFILTERCAPS_MIPFPOINT| D3DPTFILTERCAPS_MIPFLINEAR| D3DPTFILTERCAPS_MAGFPOINT| D3DPTFILTERCAPS_MAGFLINEAR| D3DPTFILTERCAPS_MAGFANISOTROPIC| D3DPTFILTERCAPS_MAGFAFLATCUBIC| D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC| 0, // Volume Texture Filter Caps D3DPTFILTERCAPS_MINFPOINT| D3DPTFILTERCAPS_MINFLINEAR| D3DPTFILTERCAPS_MINFANISOTROPIC| D3DPTFILTERCAPS_MIPFPOINT| D3DPTFILTERCAPS_MIPFLINEAR| D3DPTFILTERCAPS_MAGFPOINT| D3DPTFILTERCAPS_MAGFLINEAR| D3DPTFILTERCAPS_MAGFANISOTROPIC| D3DPTFILTERCAPS_MAGFAFLATCUBIC| D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC| 0, // Texture Address Caps D3DPTADDRESSCAPS_WRAP| D3DPTADDRESSCAPS_MIRROR| D3DPTADDRESSCAPS_CLAMP| D3DPTADDRESSCAPS_BORDER| D3DPTADDRESSCAPS_INDEPENDENTUV| D3DPTADDRESSCAPS_MIRRORONCE| 0, // Volume Texture Address Caps D3DPTADDRESSCAPS_WRAP| D3DPTADDRESSCAPS_MIRROR| D3DPTADDRESSCAPS_CLAMP| D3DPTADDRESSCAPS_BORDER| D3DPTADDRESSCAPS_INDEPENDENTUV| D3DPTADDRESSCAPS_MIRRORONCE| 0, // Line Caps D3DLINECAPS_TEXTURE| D3DLINECAPS_ZTEST| D3DLINECAPS_BLEND| D3DLINECAPS_ALPHACMP| D3DLINECAPS_FOG| 0, // Max Texture Width, Height, Volume Extent 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF, // Max Texture Repeat, Texture Aspect Ratio, Anisotropy 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFF, // Max VertexW 1.0e10f, // Guard Band left, top, right, bottom -32768.0f, -32768.0f, 32767.0f, 32767.0f, // Extents Adjust 0.0f, // Stencil Caps D3DSTENCILCAPS_KEEP| D3DSTENCILCAPS_ZERO| D3DSTENCILCAPS_REPLACE| D3DSTENCILCAPS_INCRSAT| D3DSTENCILCAPS_DECRSAT| D3DSTENCILCAPS_INVERT| D3DSTENCILCAPS_INCR| D3DSTENCILCAPS_DECR| 0, // FVF Caps (8& D3DFVFCAPS_TEXCOORDCOUNTMASK)| D3DFVFCAPS_DONOTSTRIPELEMENTS| D3DFVFCAPS_PSIZE| 0, // TextureOpCaps D3DTEXOPCAPS_DISABLE| D3DTEXOPCAPS_SELECTARG1| D3DTEXOPCAPS_SELECTARG2| D3DTEXOPCAPS_MODULATE| D3DTEXOPCAPS_MODULATE2X| D3DTEXOPCAPS_MODULATE4X| D3DTEXOPCAPS_ADD| D3DTEXOPCAPS_ADDSIGNED| D3DTEXOPCAPS_ADDSIGNED2X| D3DTEXOPCAPS_SUBTRACT| D3DTEXOPCAPS_ADDSMOOTH| D3DTEXOPCAPS_BLENDDIFFUSEALPHA| D3DTEXOPCAPS_BLENDTEXTUREALPHA| D3DTEXOPCAPS_BLENDFACTORALPHA| D3DTEXOPCAPS_BLENDTEXTUREALPHAPM| D3DTEXOPCAPS_BLENDCURRENTALPHA| D3DTEXOPCAPS_PREMODULATE| D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR| D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA| D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR| D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA| D3DTEXOPCAPS_BUMPENVMAP| D3DTEXOPCAPS_BUMPENVMAPLUMINANCE| D3DTEXOPCAPS_DOTPRODUCT3| D3DTEXOPCAPS_MULTIPLYADD| D3DTEXOPCAPS_LERP| 0, // Max Texture Blend Stages, Simulatenous Textures D3DHAL_TSS_MAXSTAGES, D3DHAL_TSS_MAXSTAGES, // Vertex Processing Caps /*D3DVTXPCAPS_TEXGEN| D3DVTXPCAPS_MATERIALSOURCE7| D3DVTXPCAPS_DIRECTIONALLIGHTS| D3DVTXPCAPS_POSITIONALLIGHTS| D3DVTXPCAPS_LOCALVIEWER| D3DVTXPCAPS_TWEENING|*/ 0, // Max Active Lights, User Clip Planes, Vertex Blend Matrices 0, 0, 0, // Max Vertex Blend Matrix Index, Point Size, Primitive Count 0, 1.0f, 0xFFFFFFFF, // Max Vertex Index, Streams, Stream Stride, 0xFFFFFFFF, 1, 256, // Vertex Shader version, Max Vertex Shader Const D3DVS_VERSION(0,0), 0, // Pixel Shader version, Max Pixel Shader Value D3DPS_VERSION(1,0), 16.0f, }; const CMyDriver::CSurfaceCapWrap CMyDriver::c_aSurfaces[]= { // Tex, VTex, CTex, OffSTarg, SameFmtTarg, Z/S, Z/SWColor, SameFmtToA, 3D CSurfaceCapWrap( D3DFMT_A4R4G4B4, true, false, false, false, false, false, false, false, false), CSurfaceCapWrap( D3DFMT_R5G6B5, true, false, false, false, false, false, false, false, false), CSurfaceCapWrap( D3DFMT_A8R8G8B8, true, false, false, true, true, false, false, false, true), CSurfaceCapWrap( D3DFMT_X8R8G8B8, true, false, false, true, true, false, false, false, true), CSurfaceCapWrap( D3DFMT_D16_LOCKABLE, false, false, false, false, false, true, true, false, false), /* CSurfaceCapWrap( D3DFMT_D32, false, false, false, false, false, true, true, false, false),*/ }; CMyDriver::CMyDriver(): CMinimalDriver< CMyDriver, CMyRasterizer>( c_aSurfaces, c_aSurfaces+ sizeof(c_aSurfaces)/ sizeof(c_aSurfaces[0])) { } /* const CMyContext::TDP2CmdBind CMyContext::c_aDP2Bindings[]= { TDP2CmdBind( D3DDP2OP_VIEWPORTINFO, DP2ViewportInfo), TDP2CmdBind( D3DDP2OP_WINFO, DP2WInfo), TDP2CmdBind( D3DDP2OP_RENDERSTATE, DP2RenderState), TDP2CmdBind( D3DDP2OP_TEXTURESTAGESTATE, DP2TextureStageState), TDP2CmdBind( D3DDP2OP_CLEAR, DP2Clear), TDP2CmdBind( D3DDP2OP_SETVERTEXSHADER, DP2SetVertexShader), TDP2CmdBind( D3DDP2OP_SETSTREAMSOURCE, DP2SetStreamSource), TDP2CmdBind( D3DDP2OP_SETINDICES, DP2SetIndices), TDP2CmdBind( D3DDP2OP_DRAWPRIMITIVE2, DP2DrawPrimitive2), TDP2CmdBind( D3DDP2OP_DRAWPRIMITIVE, DP2DrawPrimitive), TDP2CmdBind( D3DDP2OP_SETRENDERTARGET, DP2SetRenderTarget) }; const CMyContext::TDP2CmdBind* CMyContext::GetDP2Bindings( unsigned int& iBindings) { iBindings= sizeof(c_aDP2Bindings)/ sizeof(c_aDP2Bindings[0]); return c_aDP2Bindings; } HRESULT CMyContext::DP2DrawPrimitive( TDP2Data& DP2Data, const D3DHAL_DP2COMMAND* pCmd, const void* pP) { const D3DHAL_DP2DRAWPRIMITIVE* pParam= reinterpret_cast< const D3DHAL_DP2DRAWPRIMITIVE*>(pP); const D3DHAL_DP2VIEWPORTINFO& ViewportInfo= (*this); const D3DHAL_DP2VERTEXSHADER& VertexShader= (*this); const D3DHAL_DP2SETSTREAMSOURCE& StreamSource= (*this); const D3DHAL_DP2SETINDICES& Indices= (*this); LPDDRAWI_DDRAWSURFACE_LCL pVBuffer= m_pGblDriver->SurfaceDBFind( m_pAssociatedDDraw, StreamSource.dwVBHandle); assert( pVBuffer!= NULL); if((VertexShader.dwHandle& D3DFVF_POSITION_MASK)!= D3DFVF_XYZRHW) return D3DERR_COMMAND_UNPARSED; const UINT8* pData= reinterpret_cast< const UINT8*>( pVBuffer->lpGbl->fpVidMem); pData+= pParam->VStart* StreamSource.dwStride; WORD wPrimitiveCount( pCmd->wPrimitiveCount); if( wPrimitiveCount) do { assert( pParam->primType== D3DPT_TRIANGLELIST); DWORD dwPrimCount( pParam->PrimitiveCount); if( dwPrimCount) do { const float* pfXYZ= reinterpret_cast(pData); int iX( pfXYZ[0]); int iY( pfXYZ[1]); // TODO: Fix. if( iX>= 0 && iX< ViewportInfo.dwWidth && iY>= 0 && iY< ViewportInfo.dwHeight) { DWORD* pPixel= reinterpret_cast( reinterpret_cast(m_pDDSLcl->lpGbl->fpVidMem)+ (m_pDDSLcl->lpGbl->lPitch)* iY+ sizeof( DWORD)* iX); *pPixel= 0xFFFFFFFF; } pData+= StreamSource.dwStride; pfXYZ= reinterpret_cast(pData); iX= pfXYZ[0]; iY= pfXYZ[1]; // TODO: Fix. if( iX>= 0 && iX< ViewportInfo.dwWidth && iY>= 0 && iY< ViewportInfo.dwHeight) { DWORD* pPixel= reinterpret_cast( reinterpret_cast(m_pDDSLcl->lpGbl->fpVidMem)+ (m_pDDSLcl->lpGbl->lPitch)* iY+ sizeof( DWORD)* iX); *pPixel= 0xFFFFFFFF; } pData+= StreamSource.dwStride; pfXYZ= reinterpret_cast(pData); iX= pfXYZ[0]; iY= pfXYZ[1]; // TODO: Fix. if( iX>= 0 && iX< ViewportInfo.dwWidth && iY>= 0 && iY< ViewportInfo.dwHeight) { DWORD* pPixel= reinterpret_cast( reinterpret_cast(m_pDDSLcl->lpGbl->fpVidMem)+ (m_pDDSLcl->lpGbl->lPitch)* iY+ sizeof( DWORD)* iX); *pPixel= 0xFFFFFFFF; } pData+= StreamSource.dwStride; } while( --dwPrimCount); pParam++; } while( --wPrimitiveCount); return DD_OK; } HRESULT CMyContext::DP2DrawPrimitive2( TDP2Data& DP2Data, const D3DHAL_DP2COMMAND* pCmd, const void* pP) { const D3DHAL_DP2DRAWPRIMITIVE2* pParam= reinterpret_cast< const D3DHAL_DP2DRAWPRIMITIVE2*>(pP); const D3DHAL_DP2VIEWPORTINFO& ViewportInfo= (*this); const D3DHAL_DP2VERTEXSHADER& VertexShader= (*this); const D3DHAL_DP2SETSTREAMSOURCE& StreamSource= (*this); const D3DHAL_DP2SETINDICES& Indices= (*this); LPDDRAWI_DDRAWSURFACE_LCL pVBuffer= m_pGblDriver->SurfaceDBFind( m_pAssociatedDDraw, StreamSource.dwVBHandle); assert( pVBuffer!= NULL); assert((VertexShader.dwHandle& D3DFVF_POSITION_MASK)== D3DFVF_XYZRHW); const UINT8* pData= reinterpret_cast< const UINT8*>( pVBuffer->lpGbl->fpVidMem); pData+= pParam->FirstVertexOffset; WORD wPrimitiveCount( pCmd->wPrimitiveCount); if( wPrimitiveCount) do { assert( pParam->primType== D3DPT_TRIANGLELIST); DWORD dwPrimCount( pParam->PrimitiveCount); if( dwPrimCount) do { const float* pfXYZ= reinterpret_cast(pData); int iX( pfXYZ[0]); int iY( pfXYZ[1]); // TODO: Fix. if( iX>= 0 && iX< ViewportInfo.dwWidth && iY>= 0 && iY< ViewportInfo.dwHeight) { DWORD* pPixel= reinterpret_cast( reinterpret_cast(m_pDDSLcl->lpGbl->fpVidMem)+ (m_pDDSLcl->lpGbl->lPitch)* iY+ sizeof( DWORD)* iX); *pPixel= 0xFFFFFFFF; } pData+= StreamSource.dwStride; pfXYZ= reinterpret_cast(pData); iX= pfXYZ[0]; iY= pfXYZ[1]; // TODO: Fix. if( iX>= 0 && iX< ViewportInfo.dwWidth && iY>= 0 && iY< ViewportInfo.dwHeight) { DWORD* pPixel= reinterpret_cast( reinterpret_cast(m_pDDSLcl->lpGbl->fpVidMem)+ (m_pDDSLcl->lpGbl->lPitch)* iY+ sizeof( DWORD)* iX); *pPixel= 0xFFFFFFFF; } pData+= StreamSource.dwStride; pfXYZ= reinterpret_cast(pData); iX= pfXYZ[0]; iY= pfXYZ[1]; // TODO: Fix. if( iX>= 0 && iX< ViewportInfo.dwWidth && iY>= 0 && iY< ViewportInfo.dwHeight) { DWORD* pPixel= reinterpret_cast( reinterpret_cast(m_pDDSLcl->lpGbl->fpVidMem)+ (m_pDDSLcl->lpGbl->lPitch)* iY+ sizeof( DWORD)* iX); *pPixel= 0xFFFFFFFF; } pData+= StreamSource.dwStride; } while( --dwPrimCount); pParam++; } while( --wPrimitiveCount); return DD_OK; } */