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 + -
显示快捷键?