Skip to content

Commit 44fee19

Browse files
authored
[GEN] Bring ShaderClass::Apply more in line with Zero Hour (#776)
1 parent 60ab32b commit 44fee19

File tree

1 file changed

+127
-118
lines changed
  • Generals/Code/Libraries/Source/WWVegas/WW3D2

1 file changed

+127
-118
lines changed

Generals/Code/Libraries/Source/WWVegas/WW3D2/shader.cpp

Lines changed: 127 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -531,83 +531,100 @@ void ShaderClass::Apply()
531531
return;
532532
}
533533

534-
if(diff & (ShaderClass::MASK_PRIGRADIENT|ShaderClass::MASK_TEXTURING))
535-
{
536-
D3DTEXTUREOP cOp = D3DTOP_SELECTARG1;
537-
D3DTEXTUREOP aOp = D3DTOP_SELECTARG1;
538-
DWORD cArg1 = D3DTA_DIFFUSE, cArg2 = D3DTA_DIFFUSE;
539-
DWORD aArg1 = D3DTA_DIFFUSE, aArg2 = D3DTA_DIFFUSE;
534+
// Defaults
535+
536+
D3DTEXTUREOP PricOp = D3DTOP_SELECTARG1;
537+
DWORD PricArg1 = D3DTA_DIFFUSE;
538+
DWORD PricArg2 = D3DTA_DIFFUSE;
539+
540+
D3DTEXTUREOP PriaOp = D3DTOP_SELECTARG1;
541+
DWORD PriaArg1 = D3DTA_DIFFUSE;
542+
DWORD PriaArg2 = D3DTA_DIFFUSE;
543+
544+
D3DTEXTUREOP SeccOp = D3DTOP_DISABLE;
545+
DWORD SeccArg1 = D3DTA_TEXTURE;
546+
DWORD SeccArg2 = D3DTA_CURRENT;
547+
548+
D3DTEXTUREOP SecaOp = D3DTOP_DISABLE;
549+
DWORD SecaArg1 = D3DTA_TEXTURE;
550+
DWORD SecaArg2 = D3DTA_CURRENT;
540551

552+
int pri_mask=ShaderClass::MASK_PRIGRADIENT|ShaderClass::MASK_TEXTURING;
553+
int sec_mask=ShaderClass::MASK_POSTDETAILCOLORFUNC|ShaderClass::MASK_TEXTURING;
554+
int seca_mask=ShaderClass::MASK_POSTDETAILALPHAFUNC|ShaderClass::MASK_TEXTURING;
555+
556+
if(diff & pri_mask)
557+
{
541558
if(Get_Texturing() == ShaderClass::TEXTURING_ENABLE)
542559
{
543560
switch(Get_Primary_Gradient())
544561
{
545562
case ShaderClass::GRADIENT_DISABLE:
546563
//Decal
547-
cOp = D3DTOP_SELECTARG1;
548-
cArg1 = D3DTA_TEXTURE;
549-
cArg2 = D3DTA_CURRENT;
550-
aOp = D3DTOP_SELECTARG1;
551-
aArg1 = D3DTA_TEXTURE;
552-
aArg2 = D3DTA_CURRENT;
564+
PricOp = D3DTOP_SELECTARG1;
565+
PricArg1 = D3DTA_TEXTURE;
566+
PricArg2 = D3DTA_CURRENT;
567+
PriaOp = D3DTOP_SELECTARG1;
568+
PriaArg1 = D3DTA_TEXTURE;
569+
PriaArg2 = D3DTA_CURRENT;
553570
break;
554571
default:
555572
case ShaderClass::GRADIENT_MODULATE:
556573
//Modulate Alpha
557-
cOp = D3DTOP_MODULATE;
558-
cArg1 = D3DTA_TEXTURE;
559-
cArg2 = D3DTA_DIFFUSE;
560-
aOp = D3DTOP_MODULATE;
561-
aArg1 = D3DTA_TEXTURE;
562-
aArg2 = D3DTA_DIFFUSE;
574+
PricOp = D3DTOP_MODULATE;
575+
PricArg1 = D3DTA_TEXTURE;
576+
PricArg2 = D3DTA_DIFFUSE;
577+
PriaOp = D3DTOP_MODULATE;
578+
PriaArg1 = D3DTA_TEXTURE;
579+
PriaArg2 = D3DTA_DIFFUSE;
563580
break;
564581
case ShaderClass::GRADIENT_ADD:
565582
if(!(TextureOpCaps & D3DTEXOPCAPS_ADD))
566-
cOp = D3DTOP_MODULATE;
583+
PricOp = D3DTOP_MODULATE;
567584
else
568-
cOp = D3DTOP_ADD;
569-
cArg1 = D3DTA_TEXTURE;
570-
cArg2 = D3DTA_DIFFUSE;
571-
aOp = D3DTOP_MODULATE;
572-
aArg1 = D3DTA_TEXTURE;
573-
aArg2 = D3DTA_DIFFUSE;
585+
PricOp = D3DTOP_ADD;
586+
PricArg1 = D3DTA_TEXTURE;
587+
PricArg2 = D3DTA_DIFFUSE;
588+
PriaOp = D3DTOP_MODULATE;
589+
PriaArg1 = D3DTA_TEXTURE;
590+
PriaArg2 = D3DTA_DIFFUSE;
574591
break;
575592
// Bump map is a hack currently as we only have two stages in use!
576593
case ShaderClass::GRADIENT_BUMPENVMAP:
577594
if(TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAP)
578595
{
579-
cOp=D3DTOP_BUMPENVMAP;
580-
cArg1=D3DTA_TEXTURE;
581-
cArg2=D3DTA_DIFFUSE;
582-
aOp = D3DTOP_DISABLE;
583-
aArg1 = D3DTA_TEXTURE;
584-
aArg2 = D3DTA_CURRENT;
596+
PricOp=D3DTOP_BUMPENVMAP;
597+
PricArg1=D3DTA_TEXTURE;
598+
PricArg2=D3DTA_DIFFUSE;
599+
PriaOp = D3DTOP_DISABLE;
600+
PriaArg1 = D3DTA_TEXTURE;
601+
PriaArg2 = D3DTA_CURRENT;
585602
}
586603
break;
587604

588605
// Bump map is a hack currently as we only have two stages in use!
589606
case ShaderClass::GRADIENT_BUMPENVMAPLUMINANCE:
590607
if(TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAPLUMINANCE)
591608
{
592-
cOp=D3DTOP_BUMPENVMAPLUMINANCE;
593-
cArg1=D3DTA_TEXTURE;
594-
cArg2=D3DTA_DIFFUSE;
595-
aOp = D3DTOP_DISABLE;
596-
aArg1 = D3DTA_TEXTURE;
597-
aArg2 = D3DTA_CURRENT;
609+
PricOp=D3DTOP_BUMPENVMAPLUMINANCE;
610+
PricArg1=D3DTA_TEXTURE;
611+
PricArg2=D3DTA_DIFFUSE;
612+
PriaOp = D3DTOP_DISABLE;
613+
PriaArg1 = D3DTA_TEXTURE;
614+
PriaArg2 = D3DTA_CURRENT;
598615
}
599616
break;
600617

601618
// Bump map is a hack currently as we only have two stages in use!
602619
case ShaderClass::GRADIENT_DOTPRODUCT3:
603620
if(TextureOpCaps & D3DTEXOPCAPS_DOTPRODUCT3)
604621
{
605-
cOp=D3DTOP_DOTPRODUCT3;
606-
cArg1=D3DTA_TEXTURE;
607-
cArg2=D3DTA_DIFFUSE;
608-
aOp = D3DTOP_DISABLE;
609-
aArg1 = D3DTA_TEXTURE;
610-
aArg2 = D3DTA_CURRENT;
622+
PricOp = D3DTOP_DOTPRODUCT3;
623+
PricArg1 = D3DTA_TEXTURE;
624+
PricArg2 = D3DTA_DIFFUSE;
625+
PriaOp = D3DTOP_DISABLE;
626+
PriaArg1 = D3DTA_TEXTURE;
627+
PriaArg2 = D3DTA_CURRENT;
611628
}
612629
break;
613630
}
@@ -617,54 +634,50 @@ void ShaderClass::Apply()
617634
switch(Get_Primary_Gradient())
618635
{
619636
case ShaderClass::GRADIENT_DISABLE:
620-
cOp = D3DTOP_DISABLE;
621-
cArg1 = D3DTA_TEXTURE;
622-
cArg2 = D3DTA_CURRENT;
623-
aOp = D3DTOP_DISABLE;
624-
aArg1 = D3DTA_TEXTURE;
625-
aArg2 = D3DTA_CURRENT;
637+
PricOp = D3DTOP_DISABLE;
638+
PricArg1 = D3DTA_TEXTURE;
639+
PricArg2 = D3DTA_CURRENT;
640+
PriaOp = D3DTOP_DISABLE;
641+
PriaArg1 = D3DTA_TEXTURE;
642+
PriaArg2 = D3DTA_CURRENT;
626643
break;
627644
default:
628645
case ShaderClass::GRADIENT_MODULATE:
629-
cOp = D3DTOP_SELECTARG2;
630-
cArg1 = D3DTA_TEXTURE;
631-
cArg2 = D3DTA_DIFFUSE;
632-
aOp = D3DTOP_SELECTARG2;
633-
aArg1 = D3DTA_TEXTURE;
634-
aArg2 = D3DTA_DIFFUSE;
646+
PricOp = D3DTOP_SELECTARG2;
647+
PricArg1 = D3DTA_TEXTURE;
648+
PricArg2 = D3DTA_DIFFUSE;
649+
PriaOp = D3DTOP_SELECTARG2;
650+
PriaArg1 = D3DTA_TEXTURE;
651+
PriaArg2 = D3DTA_DIFFUSE;
635652
break;
636653
case ShaderClass::GRADIENT_ADD:
637-
cOp = D3DTOP_SELECTARG2;
638-
cArg1 = D3DTA_TEXTURE;
639-
cArg2 = D3DTA_DIFFUSE;
640-
aOp = D3DTOP_SELECTARG2;
641-
aArg1 = D3DTA_TEXTURE;
642-
aArg2 = D3DTA_DIFFUSE;
654+
PricOp = D3DTOP_SELECTARG2;
655+
PricArg1 = D3DTA_TEXTURE;
656+
PricArg2 = D3DTA_DIFFUSE;
657+
PriaOp = D3DTOP_SELECTARG2;
658+
PriaArg1 = D3DTA_TEXTURE;
659+
PriaArg2 = D3DTA_DIFFUSE;
643660
break;
644661
}
645662
}
646663

647664
if (WW3D::Is_Coloring_Enabled())
648665
{
649-
cArg2=aArg2=D3DTA_TFACTOR;
650-
cOp=aOp=D3DTOP_SELECTARG2;
666+
PricArg2=PriaArg2=D3DTA_TFACTOR;
667+
PricOp=PriaOp=D3DTOP_SELECTARG2;
651668
}
652669

653-
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLOROP,cOp);
654-
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLORARG1,cArg1);
655-
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLORARG2,cArg2);
656-
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAOP,aOp);
657-
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAARG1,aArg1);
658-
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAARG2,aArg2);
670+
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLOROP,PricOp);
671+
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLORARG1,PricArg1);
672+
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLORARG2,PricArg2);
673+
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAOP,PriaOp);
674+
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAARG1,PriaArg1);
675+
DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAARG2,PriaArg2);
659676
diff &= ~(ShaderClass::MASK_PRIGRADIENT);
660677
}
661678

662-
if(diff & (ShaderClass::MASK_POSTDETAILCOLORFUNC|ShaderClass::MASK_TEXTURING))
679+
if(diff & sec_mask)
663680
{
664-
D3DTEXTUREOP cOp = D3DTOP_DISABLE;
665-
DWORD cArg1 = D3DTA_TEXTURE;
666-
DWORD cArg2 = D3DTA_CURRENT;
667-
668681
if(Get_Texturing()== ShaderClass::TEXTURING_ENABLE)
669682
{
670683
switch(Get_Post_Detail_Color_Func())
@@ -676,88 +689,84 @@ void ShaderClass::Apply()
676689
case ShaderClass::DETAILCOLOR_DETAIL:
677690
if(TextureOpCaps & D3DTEXOPCAPS_MODULATE)
678691
{
679-
cOp = D3DTOP_SELECTARG1;
680-
cArg1 = D3DTA_TEXTURE;
681-
cArg2 = D3DTA_CURRENT;
692+
SeccOp = D3DTOP_SELECTARG1;
693+
SeccArg1 = D3DTA_TEXTURE;
694+
SeccArg2 = D3DTA_CURRENT;
682695
}
683696
break;
684697

685698
case ShaderClass::DETAILCOLOR_SCALE:
686699
if(TextureOpCaps & D3DTEXOPCAPS_MODULATE)
687700
{
688-
cOp = D3DTOP_MODULATE;
689-
cArg1 = D3DTA_TEXTURE;
690-
cArg2 = D3DTA_CURRENT;
701+
SeccOp = D3DTOP_MODULATE;
702+
SeccArg1 = D3DTA_TEXTURE;
703+
SeccArg2 = D3DTA_CURRENT;
691704
}
692705
break;
693706

694707
case ShaderClass::DETAILCOLOR_INVSCALE:
695708
if(TextureOpCaps & D3DTEXOPCAPS_ADDSMOOTH)
696709
{
697-
cOp = D3DTOP_ADDSMOOTH;
698-
cArg1 = D3DTA_TEXTURE;
699-
cArg2 = D3DTA_CURRENT;
710+
SeccOp = D3DTOP_ADDSMOOTH;
711+
SeccArg1 = D3DTA_TEXTURE;
712+
SeccArg2 = D3DTA_CURRENT;
700713
}
701714
break;
702715

703716
case ShaderClass::DETAILCOLOR_ADD:
704717
if(TextureOpCaps & D3DTEXOPCAPS_ADD)
705718
{
706-
cOp = D3DTOP_ADD;
707-
cArg1 = D3DTA_TEXTURE;
708-
cArg2 = D3DTA_CURRENT;
719+
SeccOp = D3DTOP_ADD;
720+
SeccArg1 = D3DTA_TEXTURE;
721+
SeccArg2 = D3DTA_CURRENT;
709722
}
710723
break;
711724

712725
case ShaderClass::DETAILCOLOR_SUB:
713726
if(TextureOpCaps & D3DTEXOPCAPS_SUBTRACT)
714727
{
715-
cOp = D3DTOP_SUBTRACT;
716-
cArg1 = D3DTA_TEXTURE;
717-
cArg2 = D3DTA_CURRENT;
728+
SeccOp = D3DTOP_SUBTRACT;
729+
SeccArg1 = D3DTA_TEXTURE;
730+
SeccArg2 = D3DTA_CURRENT;
718731
}
719732
break;
720733

721734
case ShaderClass::DETAILCOLOR_SUBR:
722735
if(TextureOpCaps & D3DTEXOPCAPS_SUBTRACT)
723736
{
724-
cOp = D3DTOP_SUBTRACT;
725-
cArg1 = D3DTA_CURRENT;
726-
cArg2 = D3DTA_TEXTURE;
737+
SeccOp = D3DTOP_SUBTRACT;
738+
SeccArg1 = D3DTA_CURRENT;
739+
SeccArg2 = D3DTA_TEXTURE;
727740
}
728741
break;
729742

730743
case ShaderClass::DETAILCOLOR_BLEND:
731744
if(TextureOpCaps & D3DTEXOPCAPS_BLENDTEXTUREALPHA)
732745
{
733-
cOp = D3DTOP_BLENDTEXTUREALPHA;
734-
cArg1 = D3DTA_TEXTURE;
735-
cArg2 = D3DTA_CURRENT;
746+
SeccOp = D3DTOP_BLENDTEXTUREALPHA;
747+
SeccArg1 = D3DTA_TEXTURE;
748+
SeccArg2 = D3DTA_CURRENT;
736749
}
737750
break;
738751

739752
case ShaderClass::DETAILCOLOR_DETAILBLEND:
740753
if(TextureOpCaps & D3DTEXOPCAPS_BLENDCURRENTALPHA)
741754
{
742-
cOp = D3DTOP_BLENDCURRENTALPHA;
743-
cArg1 = D3DTA_TEXTURE;
744-
cArg2 = D3DTA_CURRENT;
755+
SeccOp = D3DTOP_BLENDCURRENTALPHA;
756+
SeccArg1 = D3DTA_TEXTURE;
757+
SeccArg2 = D3DTA_CURRENT;
745758
}
746759
break;
747760
}
748761
}
749-
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLOROP,cOp);
750-
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLORARG1,cArg1);
751-
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLORARG2,cArg2);
762+
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLOROP,SeccOp);
763+
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLORARG1,SeccArg1);
764+
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLORARG2,SeccArg2);
752765
}
753766
diff &= ~(ShaderClass::MASK_POSTDETAILCOLORFUNC);
754767

755-
if(diff & (ShaderClass::MASK_POSTDETAILALPHAFUNC|ShaderClass::MASK_TEXTURING))
768+
if(diff & seca_mask)
756769
{
757-
D3DTEXTUREOP aOp = D3DTOP_DISABLE;
758-
DWORD aArg1 = D3DTA_TEXTURE;
759-
DWORD aArg2 = D3DTA_CURRENT;
760-
761770
if(Get_Texturing() == ShaderClass::TEXTURING_ENABLE)
762771
{
763772
switch(Get_Post_Detail_Alpha_Func())
@@ -769,34 +778,34 @@ void ShaderClass::Apply()
769778
case ShaderClass::DETAILALPHA_DETAIL:
770779
if(TextureOpCaps & D3DTEXOPCAPS_MODULATE)
771780
{
772-
aOp = D3DTOP_SELECTARG1;
773-
aArg1 = D3DTA_TEXTURE;
774-
aArg2 = D3DTA_CURRENT;
781+
SecaOp = D3DTOP_SELECTARG1;
782+
SecaArg1 = D3DTA_TEXTURE;
783+
SecaArg2 = D3DTA_CURRENT;
775784
}
776785
break;
777786

778787
case ShaderClass::DETAILALPHA_SCALE:
779788
if(TextureOpCaps & D3DTEXOPCAPS_MODULATE)
780789
{
781-
aOp = D3DTOP_MODULATE;
782-
aArg1 = D3DTA_TEXTURE;
783-
aArg2 = D3DTA_CURRENT;
790+
SecaOp = D3DTOP_MODULATE;
791+
SecaArg1 = D3DTA_TEXTURE;
792+
SecaArg2 = D3DTA_CURRENT;
784793
}
785794
break;
786795

787796
case ShaderClass::DETAILALPHA_INVSCALE:
788797
if(TextureOpCaps & D3DTEXOPCAPS_ADDSMOOTH)
789798
{
790-
aOp = D3DTOP_ADDSMOOTH;
791-
aArg1 = D3DTA_TEXTURE;
792-
aArg2 = D3DTA_CURRENT;
799+
SecaOp = D3DTOP_ADDSMOOTH;
800+
SecaArg1 = D3DTA_TEXTURE;
801+
SecaArg2 = D3DTA_CURRENT;
793802
}
794803
break;
795804
}
796805
}
797-
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAOP,aOp);
798-
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAARG1,aArg1);
799-
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAARG2,aArg2);
806+
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAOP,SecaOp);
807+
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAARG1,SecaArg1);
808+
DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAARG2,SecaArg2);
800809
}
801810
diff &= ~(ShaderClass::MASK_POSTDETAILALPHAFUNC);
802811
diff &= ~(ShaderClass::MASK_TEXTURING);

0 commit comments

Comments
 (0)