DXGL r165 - Code Review

Jump to navigation Jump to search
Repository:DXGL
Revision:r164‎ | r165 | r166 >
Date:18:31, 5 June 2012
Author:admin
Status:new
Tags:
Comment:
Support texture stage alpha operations
Modified paths:
  • /ddraw/glDirect3DDevice.cpp (modified) (history)
  • /ddraw/shadergen.cpp (modified) (history)

Diff [purge]

Index: ddraw/glDirect3DDevice.cpp
@@ -1190,6 +1190,26 @@
11911191 return D3DERR_UNSUPPORTEDCOLOROPERATION;
11921192 }
11931193 }
 1194+ for(int i = 0; i < 8; i++)
 1195+ {
 1196+ switch(texstages[i].alphaop)
 1197+ {
 1198+ case D3DTOP_DISABLE:
 1199+ case D3DTOP_SELECTARG1:
 1200+ case D3DTOP_SELECTARG2:
 1201+ case D3DTOP_MODULATE:
 1202+ case D3DTOP_MODULATE2X:
 1203+ case D3DTOP_MODULATE4X:
 1204+ case D3DTOP_ADD:
 1205+ case D3DTOP_ADDSIGNED:
 1206+ case D3DTOP_ADDSIGNED2X:
 1207+ case D3DTOP_SUBTRACT:
 1208+ case D3DTOP_ADDSMOOTH:
 1209+ break;
 1210+ default:
 1211+ return D3DERR_UNSUPPORTEDALPHAOPERATION;
 1212+ }
 1213+ }
11941214 if(lpdwPasses) *lpdwPasses = 1;
11951215 return D3D_OK;
11961216 }
Index: ddraw/shadergen.cpp
@@ -578,7 +578,7 @@
579579 int args[4];
580580 bool texfail;
581581 const string blendargs[] = {"color","gl_Color","texture2DProj(texX,gl_TexCoord[Y]).rgb",
582 - "texture2DProj(texX,gl_TexCoord[Y]).a","texfactor","gl_SecondaryColor","vec3(1,1,1)","1",".rgb",".a"};
 582+ "texture2DProj(texX,gl_TexCoord[Y]).a","texfactor","gl_SecondaryColor","vec3(1,1,1)","1",".rgb",".a","alpha"};
583583 for(i = 0; i < 8; i++)
584584 {
585585 if((texstate[i].shaderid & 31) == D3DTOP_DISABLE)break;
@@ -634,7 +634,7 @@
635635 break;
636636 case D3DTA_TFACTOR:
637637 FIXME("Support texture factor value");
638 - arg2 = blendargs[4];
 638+ arg2 = blendargs[4]+blendargs[8];
639639 break;
640640 case D3DTA_SPECULAR:
641641 arg2 = blendargs[5]+blendargs[8];
@@ -678,6 +678,103 @@
679679 fsrc->append("color = " + arg1 + " + " + arg2 + " - " + arg1 + " * " + arg2 + ";\n");
680680 break;
681681 }
 682+ if(((texstate[i].shaderid>>17) & 31) == D3DTOP_DISABLE)break;
 683+ // Alpha stage
 684+ texfail = false;
 685+ args[2] = (texstate[i].shaderid>>22)&63;
 686+ switch(args[2]&7) //arg1
 687+ {
 688+ case D3DTA_CURRENT:
 689+ default:
 690+ arg1 = blendargs[10];
 691+ break;
 692+ case D3DTA_DIFFUSE:
 693+ arg1 = blendargs[1]+blendargs[9];
 694+ break;
 695+ case D3DTA_TEXTURE:
 696+ if((texstate[i].shaderid >> 59)&1)
 697+ {
 698+ arg1 = blendargs[3];
 699+ arg1.replace(17,1,_itoa(i,idstring,10));
 700+ arg1.replace(31,1,_itoa((texstate[i].shaderid>>54)&7,idstring,10));
 701+ }
 702+ else texfail = true;
 703+ break;
 704+ case D3DTA_TFACTOR:
 705+ FIXME("Support texture factor value");
 706+ arg1 = blendargs[4]+blendargs[9];
 707+ break;
 708+ case D3DTA_SPECULAR:
 709+ arg1 = blendargs[5]+blendargs[9];
 710+ break;
 711+ }
 712+ if(args[2] & D3DTA_COMPLEMENT)
 713+ arg1 = "(1.0 - " + arg1 + ")";
 714+ args[3] = (texstate[i].shaderid>>28)&63;
 715+ switch(args[3]&7) //arg2
 716+ {
 717+ case D3DTA_CURRENT:
 718+ default:
 719+ arg2 = blendargs[0];
 720+ break;
 721+ case D3DTA_DIFFUSE:
 722+ arg2 = blendargs[1]+blendargs[8];
 723+ break;
 724+ case D3DTA_TEXTURE:
 725+ if((texstate[i].shaderid >> 59)&1)
 726+ {
 727+ arg2 = blendargs[3];
 728+ arg2.replace(17,1,_itoa(i,idstring,10));
 729+ arg2.replace(31,1,_itoa((texstate[i].shaderid>>54)&7,idstring,10));
 730+ }
 731+ else texfail = true;
 732+ break;
 733+ case D3DTA_TFACTOR:
 734+ FIXME("Support texture factor value");
 735+ arg2 = blendargs[4]+blendargs[8];
 736+ break;
 737+ case D3DTA_SPECULAR:
 738+ arg2 = blendargs[5]+blendargs[8];
 739+ break;
 740+ }
 741+ if(args[3] & D3DTA_COMPLEMENT)
 742+ arg1 = "(1.0 - " + arg1 + ")";
 743+ if(!texfail) switch(texstate[i].shaderid & 31)
 744+ {
 745+ case D3DTOP_DISABLE:
 746+ default:
 747+ break;
 748+ case D3DTOP_SELECTARG1:
 749+ fsrc->append("alpha = " + arg1 + ";\n");
 750+ break;
 751+ case D3DTOP_SELECTARG2:
 752+ fsrc->append("alpha = " + arg2 + ";\n");
 753+ break;
 754+ case D3DTOP_MODULATE:
 755+ fsrc->append("alpha = " + arg1 + " * " + arg2 + ";\n");
 756+ break;
 757+ case D3DTOP_MODULATE2X:
 758+ fsrc->append("alpha = (" + arg1 + " * " + arg2 + ") * 2.0;\n");
 759+ break;
 760+ case D3DTOP_MODULATE4X:
 761+ fsrc->append("alpha = (" + arg1 + " * " + arg2 + ") * 4.0;\n");
 762+ break;
 763+ case D3DTOP_ADD:
 764+ fsrc->append("alpha = " + arg1 + " + " + arg2 + ";\n");
 765+ break;
 766+ case D3DTOP_ADDSIGNED:
 767+ fsrc->append("alpha = " + arg1 + " + " + arg2 + " - .5;\n");
 768+ break;
 769+ case D3DTOP_ADDSIGNED2X:
 770+ fsrc->append("alpha = (" + arg1 + " + " + arg2 + " - .5) * 2.0;\n");
 771+ break;
 772+ case D3DTOP_SUBTRACT:
 773+ fsrc->append("alpha = " + arg1 + " - " + arg2 + ";\n");
 774+ break;
 775+ case D3DTOP_ADDSMOOTH:
 776+ fsrc->append("alpha = " + arg1 + " + " + arg2 + " - " + arg1 + " * " + arg2 + ";\n");
 777+ break;
 778+ }
682779 }
683780 fsrc->append(op_colorfragout);
684781 fsrc->append(mainend);