main.c
来自「Wine-20031016」· C语言 代码 · 共 1,643 行 · 第 1/5 页
C
1,643 行
/* Direct3D Device * Copyright (c) 1998 Lionel ULMER * * This file contains all the common stuff for D3D devices. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include "config.h"#include <stdarg.h>#include <string.h>#include "windef.h"#include "winbase.h"#include "winerror.h"#include "objbase.h"#include "wingdi.h"#include "ddraw.h"#include "d3d.h"#include "wine/debug.h"#include "d3d_private.h"#include "main.h"WINE_DEFAULT_DEBUG_CHANNEL(ddraw);DWORD InitRenderStateTab[] = { D3DRENDERSTATE_TEXTUREHANDLE, (DWORD)NULL, D3DRENDERSTATE_ANTIALIAS, D3DANTIALIAS_NONE, /* FIXME: D3DRENDERSTATE_TEXTUREADDRESS */ D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE, /* FIXME: D3DRENDERSTATE_WRAPU */ /* FIXME: D3DRENDERSTATE_WRAPV */ D3DRENDERSTATE_ZENABLE, D3DZB_TRUE, /* This needs to be set differently according to the Z buffer status */ D3DRENDERSTATE_FILLMODE, D3DFILL_SOLID, D3DRENDERSTATE_SHADEMODE, D3DSHADE_GOURAUD, D3DRENDERSTATE_LINEPATTERN, 0, D3DRENDERSTATE_MONOENABLE, FALSE, D3DRENDERSTATE_ROP2, R2_COPYPEN, D3DRENDERSTATE_PLANEMASK, 0xFFFFFFFF, D3DRENDERSTATE_ZWRITEENABLE, TRUE, D3DRENDERSTATE_ALPHATESTENABLE, FALSE, D3DRENDERSTATE_LASTPIXEL, TRUE, D3DRENDERSTATE_TEXTUREMAG, D3DFILTER_NEAREST, D3DRENDERSTATE_TEXTUREMIN, D3DFILTER_NEAREST, D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE, D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO, D3DRENDERSTATE_TEXTUREMAPBLEND, D3DTBLEND_MODULATE, D3DRENDERSTATE_CULLMODE, D3DCULL_CCW, D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL, D3DRENDERSTATE_ALPHAREF, 0, D3DRENDERSTATE_ALPHAFUNC, D3DCMP_ALWAYS, D3DRENDERSTATE_DITHERENABLE, FALSE, D3DRENDERSTATE_ALPHABLENDENABLE, FALSE, D3DRENDERSTATE_FOGENABLE, FALSE, D3DRENDERSTATE_SPECULARENABLE, FALSE, D3DRENDERSTATE_ZVISIBLE, FALSE, D3DRENDERSTATE_SUBPIXEL, FALSE, D3DRENDERSTATE_SUBPIXELX, FALSE, D3DRENDERSTATE_STIPPLEDALPHA, FALSE, D3DRENDERSTATE_FOGCOLOR, D3DRGBA(0,0,0,0), D3DRENDERSTATE_FOGTABLEMODE, D3DFOG_NONE, /* FIXME: D3DRENDERSTATE_FOGTABLESTART (same as D3DRENDERSTATE_FOGSTART) */ /* FIXME: D3DRENDERSTATE_FOGTABLEEND (same as D3DRENDERSTATE_FOGEND) */ D3DRENDERSTATE_FOGTABLEDENSITY, 0x3F80000, /* 1.0f (same as D3DRENDERSTATE_FOGDENSITY) */ /* FIXME: D3DRENDERSTATE_STIPPLEENABLE */ D3DRENDERSTATE_EDGEANTIALIAS, FALSE, D3DRENDERSTATE_COLORKEYENABLE, FALSE, /* FIXME: D3DRENDERSTATE_BORDERCOLOR */ D3DRENDERSTATE_TEXTUREADDRESSU, D3DTADDRESS_WRAP, D3DRENDERSTATE_TEXTUREADDRESSV, D3DTADDRESS_WRAP, D3DRENDERSTATE_MIPMAPLODBIAS, 0x00000000, /* 0.0f */ D3DRENDERSTATE_ZBIAS, 0, D3DRENDERSTATE_RANGEFOGENABLE, FALSE, /* FIXME: D3DRENDERSTATE_ANISOTROPY */ /* FIXME: D3DRENDERSTATE_FLUSHBATCH */ /* FIXME: D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT */ D3DRENDERSTATE_STENCILENABLE, FALSE, D3DRENDERSTATE_STENCILFAIL, D3DSTENCILOP_KEEP, D3DRENDERSTATE_STENCILZFAIL, D3DSTENCILOP_KEEP, D3DRENDERSTATE_STENCILPASS, D3DSTENCILOP_KEEP, D3DRENDERSTATE_STENCILFUNC, D3DCMP_ALWAYS, D3DRENDERSTATE_STENCILREF, 0, D3DRENDERSTATE_STENCILMASK, 0xFFFFFFFF, D3DRENDERSTATE_STENCILWRITEMASK, 0xFFFFFFFF, /* FIXME: D3DRENDERSTATE_TEXTUREFACTOR */ /* FIXME: D3DRENDERSTATE_STIPPLEPATTERN00..31 */ D3DRENDERSTATE_WRAP0, 0, D3DRENDERSTATE_WRAP1, 0, D3DRENDERSTATE_WRAP2, 0, D3DRENDERSTATE_WRAP3, 0, D3DRENDERSTATE_WRAP4, 0, D3DRENDERSTATE_WRAP5, 0, D3DRENDERSTATE_WRAP6, 0, D3DRENDERSTATE_WRAP7, 0, D3DRENDERSTATE_CLIPPING, FALSE, D3DRENDERSTATE_LIGHTING, TRUE, D3DRENDERSTATE_EXTENTS, FALSE, D3DRENDERSTATE_AMBIENT, D3DRGBA(0,0,0,0), D3DRENDERSTATE_FOGVERTEXMODE, D3DFOG_NONE, D3DRENDERSTATE_COLORVERTEX, TRUE, D3DRENDERSTATE_LOCALVIEWER, TRUE, D3DRENDERSTATE_NORMALIZENORMALS, FALSE, /* FIXME: D3DRENDER_STATE_COLORKEYBLENDENABLE */ D3DRENDERSTATE_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1, D3DRENDERSTATE_SPECULARMATERIALSOURCE, D3DMCS_COLOR2, D3DRENDERSTATE_AMBIENTMATERIALSOURCE, D3DMCS_COLOR2, D3DRENDERSTATE_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL, D3DRENDERSTATE_VERTEXBLEND, D3DVBLEND_DISABLE, D3DRENDERSTATE_CLIPPLANEENABLE, 0};DWORD InitLightStateTab[] = { D3DLIGHTSTATE_MATERIAL, (DWORD)NULL, D3DLIGHTSTATE_AMBIENT, D3DRGBA(0,0,0,0), D3DLIGHTSTATE_COLORMODEL, D3DCOLOR_RGB, D3DLIGHTSTATE_FOGMODE, D3DFOG_NONE, D3DLIGHTSTATE_FOGSTART, 0x3F80000, /* 1.0f */ D3DLIGHTSTATE_FOGEND, 0x42C8000, /* 100.0f */ D3DLIGHTSTATE_FOGDENSITY, 0x3F80000 /* 1.0f */ /* FIXME: D3DLIGHTSTATE_COLORVERTEX */};DWORD InitTextureStageStateTab[] = { D3DTSS_COLOROP, D3DTOP_DISABLE, /* Note, it's manually set for stage 0 */ D3DTSS_COLORARG1, D3DTA_TEXTURE, D3DTSS_COLORARG2, D3DTA_CURRENT, D3DTSS_ALPHAOP, D3DTOP_DISABLE, /* Note, it's manually set for stage 0 */ D3DTSS_ALPHAARG1, D3DTA_TEXTURE, D3DTSS_ALPHAARG2, D3DTA_CURRENT, /* FIXME: D3DTSS_BUMPENVMAT00,01,10,11 */ /* D3DTSS_TEXCOORDINDEX is set manually */ D3DTSS_ADDRESS, D3DTADDRESS_WRAP, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP, D3DTSS_BORDERCOLOR, 0x00000000, D3DTSS_MAGFILTER, D3DTFG_POINT, D3DTSS_MINFILTER, D3DTFN_POINT, D3DTSS_MIPFILTER, D3DTFP_NONE, D3DTSS_MIPMAPLODBIAS, 0x00000000, /* 0.0f */ D3DTSS_MAXMIPLEVEL, 0, /* D3DTSS_MAXANISOTROPY, 1, */ /* This is to prevent warnings :-) */ /* FIXME: D3DTSS_BUMPENVLSCALE */ /* FIXME: D3DTSS_NUMPENVLOFFSET */ /* FIXME: D3DTSS_TEXTURETRANSFORMFLAGS */}; void InitDefaultStateBlock(STATEBLOCK* lpStateBlock, int version){ int i, j; TRACE("(%p,%d)\n", lpStateBlock, version); memset(lpStateBlock, 0, sizeof(STATEBLOCK)); /* Initialize render states */ for (i = 0; i < sizeof(InitRenderStateTab) / sizeof(InitRenderStateTab[0]); i += 2) { lpStateBlock->render_state[InitRenderStateTab[i] - 1] = InitRenderStateTab[i + 1]; lpStateBlock->set_flags.render_state[InitRenderStateTab[i] - 1] = TRUE; } /* Initialize texture stages states */ for (i = 0; i < MAX_TEXTURES; i++) { for (j = 0; j < sizeof(InitTextureStageStateTab) / sizeof(InitTextureStageStateTab[0]); j += 2) { lpStateBlock->texture_stage_state[i][InitTextureStageStateTab[j] - 1] = InitTextureStageStateTab[j + 1]; lpStateBlock->set_flags.texture_stage_state[i][InitTextureStageStateTab[j] - 1] = TRUE; } /* Map texture coords 0 to stage 0, 1 to stage 1, etc... */ lpStateBlock->texture_stage_state[i][D3DTSS_TEXCOORDINDEX - 1] = i; lpStateBlock->set_flags.texture_stage_state[i][D3DTSS_TEXCOORDINDEX - 1] = TRUE; } /* The first texture is particular, update it consequently */ lpStateBlock->texture_stage_state[0][D3DTSS_COLOROP - 1] = D3DTOP_MODULATE; lpStateBlock->texture_stage_state[0][D3DTSS_ALPHAOP - 1] = D3DTOP_SELECTARG1; lpStateBlock->texture_stage_state[0][D3DTSS_COLORARG2 - 1] = D3DTA_DIFFUSE; lpStateBlock->texture_stage_state[0][D3DTSS_ALPHAARG2 - 1] = D3DTA_DIFFUSE; /* Updates for particular versions */ if ((version == 1) || (version==2)) lpStateBlock->render_state[D3DRENDERSTATE_SPECULARENABLE - 1] = TRUE;}HRESULT WINAPIMain_IDirect3DDeviceImpl_7_3T_2T_1T_QueryInterface(LPDIRECT3DDEVICE7 iface, REFIID riid, LPVOID* obp){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(riid), obp); *obp = NULL; if ( IsEqualGUID( &IID_IUnknown, riid ) ) { IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7)); *obp = iface; TRACE(" Creating IUnknown interface at %p.\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3DDevice, riid ) ) { IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7)); *obp = ICOM_INTERFACE(This, IDirect3DDevice); TRACE(" Creating IDirect3DDevice interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3DDevice2, riid ) ) { IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7)); *obp = ICOM_INTERFACE(This, IDirect3DDevice2); TRACE(" Creating IDirect3DDevice2 interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3DDevice3, riid ) ) { IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7)); *obp = ICOM_INTERFACE(This, IDirect3DDevice3); TRACE(" Creating IDirect3DDevice3 interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirect3DDevice7, riid ) ) { IDirect3DDevice7_AddRef(ICOM_INTERFACE(This, IDirect3DDevice7)); *obp = ICOM_INTERFACE(This, IDirect3DDevice7); TRACE(" Creating IDirect3DDevice7 interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirectDrawSurface, riid ) || IsEqualGUID( &IID_IDirectDrawSurface2, riid ) || IsEqualGUID( &IID_IDirectDrawSurface3, riid ) ) { IDirectDrawSurface7_AddRef(ICOM_INTERFACE(This->surface, IDirectDrawSurface7)); *obp = ICOM_INTERFACE(This->surface, IDirectDrawSurface3); TRACE(" Return IDirectDrawSurface3 interface %p\n", *obp); return S_OK; } if ( IsEqualGUID( &IID_IDirectDrawSurface4, riid ) || IsEqualGUID( &IID_IDirectDrawSurface7, riid ) ) { IDirectDrawSurface7_AddRef(ICOM_INTERFACE(This->surface, IDirectDrawSurface7)); *obp = ICOM_INTERFACE(This->surface, IDirectDrawSurface7); TRACE(" Return IDirectDrawSurface7 interface %p\n", *obp); return S_OK; } FIXME("(%p): interface for IID %s NOT found!\n", This, debugstr_guid(riid)); return OLE_E_ENUM_NOMORE;}ULONG WINAPIMain_IDirect3DDeviceImpl_7_3T_2T_1T_AddRef(LPDIRECT3DDEVICE7 iface){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); TRACE("(%p/%p)->() incrementing from %lu.\n", This, iface, This->ref); return ++(This->ref);}ULONG WINAPIMain_IDirect3DDeviceImpl_7_3T_2T_1T_Release(LPDIRECT3DDEVICE7 iface){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); TRACE("(%p/%p)->() decrementing from %lu.\n", This, iface, This->ref); if (!--(This->ref)) { int i; /* Release texture associated with the device */ for (i = 0; i < MAX_TEXTURES; i++) { if (This->current_texture[i] != NULL) IDirect3DTexture2_Release(ICOM_INTERFACE(This->current_texture[i], IDirect3DTexture2)); } HeapFree(GetProcessHeap(), 0, This); return 0; } return This->ref;}HRESULT WINAPIMain_IDirect3DDeviceImpl_7_GetCaps(LPDIRECT3DDEVICE7 iface, LPD3DDEVICEDESC7 lpD3DHELDevDesc){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpD3DHELDevDesc); return DD_OK;}HRESULT WINAPIMain_IDirect3DDeviceImpl_7_3T_EnumTextureFormats(LPDIRECT3DDEVICE7 iface, LPD3DENUMPIXELFORMATSCALLBACK lpD3DEnumPixelProc, LPVOID lpArg){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lpD3DEnumPixelProc, lpArg); return DD_OK;}HRESULT WINAPIMain_IDirect3DDeviceImpl_7_3T_2T_1T_BeginScene(LPDIRECT3DDEVICE7 iface){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); TRACE("(%p/%p)->()\n", This, iface); /* Nothing to do */ return DD_OK;}HRESULT WINAPIMain_IDirect3DDeviceImpl_7_3T_2T_1T_EndScene(LPDIRECT3DDEVICE7 iface){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); TRACE("(%p/%p)->()\n", This, iface); /* Nothing to do */ return DD_OK;}HRESULT WINAPIMain_IDirect3DDeviceImpl_7_3T_2T_1T_GetDirect3D(LPDIRECT3DDEVICE7 iface, LPDIRECT3D7* lplpDirect3D7){ ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); TRACE("(%p/%p)->(%p)\n", This, iface, lplpDirect3D7); *lplpDirect3D7 = ICOM_INTERFACE(This->d3d, IDirect3D7);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?