Index: ddraw/glDirect3DDevice.cpp |
— | — | @@ -120,6 +120,53 @@ |
121 | 121 | FALSE, //clipplaneenable
|
122 | 122 | };
|
123 | 123 |
|
| 124 | +const TEXTURESTAGE texstagedefault0 =
|
| 125 | +{
|
| 126 | + D3DTOP_MODULATE,
|
| 127 | + D3DTA_TEXTURE,
|
| 128 | + D3DTA_CURRENT,
|
| 129 | + D3DTOP_SELECTARG1,
|
| 130 | + D3DTA_TEXTURE,
|
| 131 | + D3DTA_CURRENT,
|
| 132 | + 0,0,0,0,
|
| 133 | + 0,
|
| 134 | + D3DTADDRESS_WRAP,
|
| 135 | + D3DTADDRESS_WRAP,
|
| 136 | + 0,
|
| 137 | + D3DTFG_POINT,
|
| 138 | + D3DTFN_POINT,
|
| 139 | + D3DTFP_NONE,
|
| 140 | + 0,
|
| 141 | + 0,
|
| 142 | + 1,
|
| 143 | + 0,
|
| 144 | + 0,
|
| 145 | + D3DTTFF_DISABLE
|
| 146 | +};
|
| 147 | +const TEXTURESTAGE texstagedefault1 =
|
| 148 | +{
|
| 149 | + D3DTOP_DISABLE,
|
| 150 | + D3DTA_TEXTURE,
|
| 151 | + D3DTA_CURRENT,
|
| 152 | + D3DTOP_DISABLE,
|
| 153 | + D3DTA_TEXTURE,
|
| 154 | + D3DTA_CURRENT,
|
| 155 | + 0,0,0,0,
|
| 156 | + 0,
|
| 157 | + D3DTADDRESS_WRAP,
|
| 158 | + D3DTADDRESS_WRAP,
|
| 159 | + 0,
|
| 160 | + D3DTFG_POINT,
|
| 161 | + D3DTFN_POINT,
|
| 162 | + D3DTFP_NONE,
|
| 163 | + 0,
|
| 164 | + 0,
|
| 165 | + 1,
|
| 166 | + 0,
|
| 167 | + 0,
|
| 168 | + D3DTTFF_DISABLE
|
| 169 | +};
|
| 170 | +
|
124 | 171 | int setdrawmode(D3DPRIMITIVETYPE d3dptPrimitiveType)
|
125 | 172 | {
|
126 | 173 | switch(d3dptPrimitiveType)
|
— | — | @@ -153,6 +200,9 @@ |
154 | 201 | __gluMakeIdentityf(matView);
|
155 | 202 | __gluMakeIdentityf(matProjection);
|
156 | 203 | __gluMakeIdentityf(matNormal);
|
| 204 | + texstages[0] = texstagedefault0;
|
| 205 | + texstages[1] = texstages[2] = texstages[3] = texstages[4] =
|
| 206 | + texstages[5] = texstages[6] = texstages[7] = texstagedefault1;
|
157 | 207 | refcount = 1;
|
158 | 208 | inscene = false;
|
159 | 209 | normal_dirty = false;
|
— | — | @@ -468,11 +518,31 @@ |
469 | 519 | FIXME("glDirect3DDevice7::EndStateBlock: stub");
|
470 | 520 | ERR(DDERR_GENERIC);
|
471 | 521 | }
|
| 522 | +
|
| 523 | +// Use EXACTLY one line per entry. Don't change layout of the list.
|
| 524 | +const int TEXFMT_START = __LINE__;
|
| 525 | +const DDPIXELFORMAT texformats[] =
|
| 526 | +{
|
| 527 | + {sizeof(DDPIXELFORMAT),DDPF_RGB|DDPF_ALPHAPIXELS,0,16,0xF00,0xF0,0xF,0xF000},
|
| 528 | + {sizeof(DDPIXELFORMAT),DDPF_RGB|DDPF_ALPHAPIXELS,0,16,0x7C00,0x3E0,0x1F,0x8000},
|
| 529 | + {sizeof(DDPIXELFORMAT),DDPF_RGB,0,16,0xF800,0x7E0,0x1F,0},
|
| 530 | + {sizeof(DDPIXELFORMAT),DDPF_RGB|DDPF_ALPHAPIXELS,0,32,0xFF0000,0xFF00,0xFF,0xFF000000}
|
| 531 | +};
|
| 532 | +const int TEXFMT_END = __LINE__ - 4;
|
| 533 | +const int numtexfmt = TEXFMT_END-TEXFMT_START;
|
| 534 | +
|
472 | 535 | HRESULT WINAPI glDirect3DDevice7::EnumTextureFormats(LPD3DENUMPIXELFORMATSCALLBACK lpd3dEnumPixelProc, LPVOID lpArg)
|
473 | 536 | {
|
474 | 537 | if(!this) return DDERR_INVALIDPARAMS;
|
475 | | - FIXME("glDirect3DDevice7::EnumTextureFormats: stub");
|
476 | | - ERR(DDERR_GENERIC);
|
| 538 | + HRESULT result;
|
| 539 | + DDPIXELFORMAT fmt;
|
| 540 | + for(int i = 0; i < numtexfmt; i++)
|
| 541 | + {
|
| 542 | + memcpy(&fmt,&texformats[i],sizeof(DDPIXELFORMAT));
|
| 543 | + result = lpd3dEnumPixelProc(&fmt,lpArg);
|
| 544 | + if(result != D3DENUMRET_OK) return D3D_OK;
|
| 545 | + }
|
| 546 | + return D3D_OK;
|
477 | 547 | }
|
478 | 548 | HRESULT WINAPI glDirect3DDevice7::GetCaps(LPD3DDEVICEDESC7 lpD3DDevDesc)
|
479 | 549 | {
|
— | — | @@ -557,8 +627,84 @@ |
558 | 628 | }
|
559 | 629 | HRESULT WINAPI glDirect3DDevice7::GetTextureStageState(DWORD dwStage, D3DTEXTURESTAGESTATETYPE dwState, LPDWORD lpdwValue)
|
560 | 630 | {
|
| 631 | + if(dwStage > 7) return DDERR_INVALIDPARAMS;
|
| 632 | + if(!lpdwValue) return DDERR_INVALIDPARAMS;
|
561 | 633 | if(!this) return DDERR_INVALIDPARAMS;
|
562 | | - FIXME("glDirect3DDevice7::GetTextureStageState: stub");
|
| 634 | + switch(dwState)
|
| 635 | + {
|
| 636 | + case D3DTSS_COLOROP:
|
| 637 | + *lpdwValue = texstages[dwStage].colorop;
|
| 638 | + return D3D_OK;
|
| 639 | + case D3DTSS_COLORARG1:
|
| 640 | + *lpdwValue = texstages[dwStage].colorarg1;
|
| 641 | + return D3D_OK;
|
| 642 | + case D3DTSS_COLORARG2:
|
| 643 | + *lpdwValue = texstages[dwStage].colorarg2;
|
| 644 | + return D3D_OK;
|
| 645 | + case D3DTSS_ALPHAOP:
|
| 646 | + *lpdwValue = texstages[dwStage].alphaop;
|
| 647 | + return D3D_OK;
|
| 648 | + case D3DTSS_ALPHAARG1:
|
| 649 | + *lpdwValue = texstages[dwStage].alphaarg1;
|
| 650 | + return D3D_OK;
|
| 651 | + case D3DTSS_ALPHAARG2:
|
| 652 | + *lpdwValue = texstages[dwStage].alphaarg2;
|
| 653 | + return D3D_OK;
|
| 654 | + case D3DTSS_BUMPENVMAT00:
|
| 655 | + memcpy(lpdwValue,&texstages[dwStage].bumpenv00,sizeof(D3DVALUE));
|
| 656 | + return D3D_OK;
|
| 657 | + case D3DTSS_BUMPENVMAT01:
|
| 658 | + memcpy(lpdwValue,&texstages[dwStage].bumpenv01,sizeof(D3DVALUE));
|
| 659 | + return D3D_OK;
|
| 660 | + case D3DTSS_BUMPENVMAT10:
|
| 661 | + memcpy(lpdwValue,&texstages[dwStage].bumpenv10,sizeof(D3DVALUE));
|
| 662 | + return D3D_OK;
|
| 663 | + case D3DTSS_BUMPENVMAT11:
|
| 664 | + memcpy(lpdwValue,&texstages[dwStage].bumpenv11,sizeof(D3DVALUE));
|
| 665 | + return D3D_OK;
|
| 666 | + case D3DTSS_TEXCOORDINDEX:
|
| 667 | + *lpdwValue = texstages[dwStage].texcoordindex;
|
| 668 | + return D3D_OK;
|
| 669 | + case D3DTSS_ADDRESS:
|
| 670 | + case D3DTSS_ADDRESSU:
|
| 671 | + *lpdwValue = texstages[dwStage].addressu;
|
| 672 | + return D3D_OK;
|
| 673 | + case D3DTSS_ADDRESSV:
|
| 674 | + *lpdwValue = texstages[dwStage].addressv;
|
| 675 | + return D3D_OK;
|
| 676 | + case D3DTSS_BORDERCOLOR:
|
| 677 | + *lpdwValue = texstages[dwStage].bordercolor;
|
| 678 | + return D3D_OK;
|
| 679 | + case D3DTSS_MAGFILTER:
|
| 680 | + *lpdwValue = texstages[dwStage].magfilter;
|
| 681 | + return D3D_OK;
|
| 682 | + case D3DTSS_MINFILTER:
|
| 683 | + *lpdwValue = texstages[dwStage].minfilter;
|
| 684 | + return D3D_OK;
|
| 685 | + case D3DTSS_MIPFILTER:
|
| 686 | + *lpdwValue = texstages[dwStage].mipfilter;
|
| 687 | + return D3D_OK;
|
| 688 | + case D3DTSS_MIPMAPLODBIAS:
|
| 689 | + memcpy(lpdwValue,&texstages[dwStage].lodbias,sizeof(D3DVALUE));
|
| 690 | + return D3D_OK;
|
| 691 | + case D3DTSS_MAXMIPLEVEL:
|
| 692 | + *lpdwValue = texstages[dwStage].miplevel;
|
| 693 | + return D3D_OK;
|
| 694 | + case D3DTSS_MAXANISOTROPY:
|
| 695 | + *lpdwValue = texstages[dwStage].anisotropy;
|
| 696 | + return D3D_OK;
|
| 697 | + case D3DTSS_BUMPENVLSCALE:
|
| 698 | + memcpy(lpdwValue,&texstages[dwStage].bumpenvlscale,sizeof(D3DVALUE));
|
| 699 | + return D3D_OK;
|
| 700 | + case D3DTSS_BUMPENVLOFFSET:
|
| 701 | + memcpy(lpdwValue,&texstages[dwStage].bumpenvloffset,sizeof(D3DVALUE));
|
| 702 | + return D3D_OK;
|
| 703 | + case D3DTSS_TEXTURETRANSFORMFLAGS:
|
| 704 | + *lpdwValue = texstages[dwStage].textransform;
|
| 705 | + return D3D_OK;
|
| 706 | + default:
|
| 707 | + return DDERR_INVALIDPARAMS;
|
| 708 | + }
|
563 | 709 | ERR(DDERR_GENERIC);
|
564 | 710 | }
|
565 | 711 | HRESULT WINAPI glDirect3DDevice7::GetTransform(D3DTRANSFORMSTATETYPE dtstTransformStateType, LPD3DMATRIX lpD3DMatrix)
|
Index: ddraw/glDirect3DDevice.h |
— | — | @@ -19,6 +19,33 @@ |
20 | 20 | #ifndef __GLDIRECT3DDEVICE_H
|
21 | 21 | #define __GLDIRECT3DDEVICE_H
|
22 | 22 |
|
| 23 | +struct TEXTURESTAGE
|
| 24 | +{
|
| 25 | + D3DTEXTUREOP colorop;
|
| 26 | + DWORD colorarg1;
|
| 27 | + DWORD colorarg2;
|
| 28 | + D3DTEXTUREOP alphaop;
|
| 29 | + DWORD alphaarg1;
|
| 30 | + DWORD alphaarg2;
|
| 31 | + D3DVALUE bumpenv00;
|
| 32 | + D3DVALUE bumpenv01;
|
| 33 | + D3DVALUE bumpenv10;
|
| 34 | + D3DVALUE bumpenv11;
|
| 35 | + DWORD texcoordindex;
|
| 36 | + D3DTEXTUREADDRESS addressu;
|
| 37 | + D3DTEXTUREADDRESS addressv;
|
| 38 | + DWORD bordercolor;
|
| 39 | + D3DTEXTUREMAGFILTER magfilter;
|
| 40 | + D3DTEXTUREMINFILTER minfilter;
|
| 41 | + D3DTEXTUREMIPFILTER mipfilter;
|
| 42 | + D3DVALUE lodbias;
|
| 43 | + DWORD miplevel;
|
| 44 | + DWORD anisotropy;
|
| 45 | + D3DVALUE bumpenvlscale;
|
| 46 | + D3DVALUE bumpenvloffset;
|
| 47 | + D3DTEXTURETRANSFORMFLAGS textransform;
|
| 48 | +};
|
| 49 | +
|
23 | 50 | class glDirect3DLight;
|
24 | 51 | class glDirectDrawSurface7;
|
25 | 52 | class glDirect3DDevice7 : public IDirect3DDevice7
|
— | — | @@ -99,6 +126,7 @@ |
100 | 127 | int gllights[8];
|
101 | 128 | glDirectDrawSurface7 *glDDS7;
|
102 | 129 | DWORD renderstate[153];
|
| 130 | + TEXTURESTAGE texstages[8];
|
103 | 131 |
|
104 | 132 | private:
|
105 | 133 | HRESULT fvftoglvertex(DWORD dwVertexTypeDesc,LPDWORD vertptr);
|
Index: ddraw/glRenderer.cpp |
— | — | @@ -1068,6 +1068,16 @@ |
1069 | 1069 | glVertexAttribPointer(colorloc,4,GL_UNSIGNED_BYTE,true,vertices[i+8].stride,vertices[i+8].data);
|
1070 | 1070 | }
|
1071 | 1071 | }
|
| 1072 | + for(i = 0; i < 8; i++)
|
| 1073 | + {
|
| 1074 | + {
|
| 1075 | + switch(texformats[i])
|
| 1076 | + {
|
| 1077 | +
|
| 1078 | + }
|
| 1079 | +
|
| 1080 | + }
|
| 1081 | + }
|
1072 | 1082 | if(device->normal_dirty) device->UpdateNormalMatrix();
|
1073 | 1083 | GLint loc = glGetUniformLocation(prog,"world");
|
1074 | 1084 | viewLHtoRH(tmpmat,device->matWorld);
|
Index: ddraw/shadergen.cpp |
— | — | @@ -91,7 +91,7 @@ |
92 | 92 | Bit 47: Enable texture coordinate transform
|
93 | 93 | Bits 48-49: Number of texcoord dimensions
|
94 | 94 | Bit 50: Projected texcoord
|
95 | | -Bits 51-52: Texutre coordinate format:
|
| 95 | +Bits 51-52: Texture coordinate format:
|
96 | 96 | 00=2dim 01=3dim 10=4dim 11=1dim
|
97 | 97 | */
|
98 | 98 | void ZeroShaderArray()
|