Skip to content

Commit d9f671d

Browse files
committed
Additive mesh transparency tests
1 parent 16c67ec commit d9f671d

File tree

9 files changed

+75
-3
lines changed

9 files changed

+75
-3
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ RenderInfoClass::RenderInfoClass(CameraClass & cam) :
5656
OverrideFlagLevel(0),
5757
Texture_Projector(NULL),
5858
alphaOverride(1.0f),
59+
emissiveOverride(1.0f),
5960
materialPassAlphaOverride(1.0f),
6061
materialPassEmissiveOverride(1.0f)
6162
{

GeneralsMD/Code/GameEngine/Include/GameClient/Drawable.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,11 @@ class Drawable : public Thing,
540540
inline Real getEffectiveOpacity() const { return m_explicitOpacity * m_effectiveStealthOpacity; } ///< get alpha/opacity value used to override defaults when drawing.
541541
void setEffectiveOpacity( Real pulseFactor, Real explicitOpacity = -1.0f );
542542

543+
// AW: new params for additive transparency scaling (=emissive)
544+
inline void setEmissiveOpacityScaling(bool value) { m_isEmissiveOpacityScaling = value; }
545+
inline bool getEmissiveOpacityScaling() const { return m_isEmissiveOpacityScaling; }
546+
inline Real getEmissiveOpacity() const { if (m_isEmissiveOpacityScaling) return getEffectiveOpacity(); else return 1.0; }
547+
543548
// this is for the add'l pass fx which operates completely independently of the stealth opacity effects. Draw() does the fading every frame.
544549
inline Real getSecondMaterialPassOpacity() const { return m_secondMaterialPassOpacity; } ///< get alpha/opacity value used to render add'l rendering pass.
545550
void setSecondMaterialPassOpacity( Real op ) { m_secondMaterialPassOpacity = op; }; ///< set alpha/opacity value used to render add'l rendering pass.
@@ -663,6 +668,8 @@ class Drawable : public Thing,
663668
Real m_stealthOpacity; ///< <<minimum>> opacity due to stealth. pulse is between opaque and this
664669
Real m_effectiveStealthOpacity; ///< opacity actually used to render with, after the pulse and stuff.
665670

671+
Bool m_isEmissiveOpacityScaling; ///< should emissive color be scaled with opacity (needed for fading out additive objects)
672+
666673
Real m_decalOpacityFadeTarget;
667674
Real m_decalOpacityFadeRate;
668675
Real m_decalOpacity;

GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,6 @@ void Drawable::fadeIn( UnsignedInt frames ) ///< decloak object
11221122
m_timeElapsedFade = 0;
11231123
}
11241124

1125-
11261125
//-------------------------------------------------------------------------------------------------
11271126
Real Drawable::getScale (void) const
11281127
{
@@ -5235,6 +5234,9 @@ void Drawable::xfer( Xfer *xfer )
52355234
// effective stealth opacity
52365235
xfer->xferReal( &m_effectiveStealthOpacity );
52375236

5237+
// Emissiv Opacity Scaling
5238+
xfer->xferBool(&m_isEmissiveOpacityScaling);
5239+
52385240
// decalOpacityFadeTarget
52395241
xfer->xferReal( &m_decalOpacityFadeTarget );
52405242

GeneralsMD/Code/GameEngine/Source/GameClient/Drawable/Update/DynamicGeometryClientUpdate.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,13 +191,29 @@ void DynamicGeometryClientUpdate::clientUpdate( void )
191191
progress = 0.5 - (Cos(progress * PI) * 0.5);
192192
}
193193

194-
// DEBUG_LOG((">>> DGCU - progress = %f", progress));
195-
196194
Real alpha = (1.0 - progress) * alpha0 + progress * alpha1;
197195
Real scale = (1.0 - progress) * scale0 + progress * scale1;
198196

197+
199198
draw->setInstanceScale(m_overrideScale * scale);
199+
200+
// This doesn't work for additive!
200201
draw->setDrawableOpacity(m_overrideAlpha * alpha);
202+
203+
// For additive with emissive color, this seems to work.
204+
// But apparently not for all of them, and only for Static sorting?
205+
draw->setEmissiveOpacityScaling(true);
206+
207+
// This doesn't seem to work for all models either
208+
//Real factor = (1.0 - alpha) * -2.5;
209+
//RGBColor color;
210+
//color.red = factor;
211+
//color.green = factor;
212+
//color.blue = factor;
213+
//draw->colorTint(&color);
214+
215+
// DEBUG_LOG((">>> DGCU - progress = %f, alpha = %f, scale = %f, effectiveOpacity = %f, factor = %f", progress, alpha, scale, draw->getEffectiveOpacity(), factor));
216+
201217
}
202218

203219
// ------------------------------------------------------------------------------------------------

GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DScene.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,7 @@ void RTS3DScene::flushTranslucentObjects(RenderInfoClass & rinfo)
16121612
draw = ((DrawableInfo *)robj->Get_User_Data())->m_drawable;
16131613

16141614
rinfo.alphaOverride = draw->getEffectiveOpacity();
1615+
rinfo.emissiveOverride = draw->getEmissiveOpacity();
16151616

16161617
renderOneObject(rinfo, robj, localPlayerIndex);//WW3D::Render(*robj,rinfo);
16171618
}
@@ -1620,6 +1621,7 @@ void RTS3DScene::flushTranslucentObjects(RenderInfoClass & rinfo)
16201621
TheDX8MeshRenderer.Flush();
16211622
WW3D::Render_And_Clear_Static_Sort_Lists(rinfo); //draws things like water
16221623
rinfo.alphaOverride = 1.0f; //disable forced alpha
1624+
rinfo.emissiveOverride = 1.0f; //disable forced alpha
16231625
m_translucentObjectsCount = 0;
16241626
}
16251627

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/dx8renderer.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,6 +1879,13 @@ void DX8TextureCategoryClass::Render(void)
18791879
if (!DX8RendererDebugger::Is_Enabled() || !mesh->Is_Disabled_By_Debugger()) {
18801880

18811881
if ((!!mesh->Peek_Model()->Get_Flag(MeshGeometryClass::SORT)) && WW3D::Is_Sorting_Enabled()) {
1882+
1883+
if (std::strcmp(mesh->Get_Name(),"EXPRTBLSTBBBL.SPHERE01") == 0) {
1884+
DEBUG_LOG((">>>DX8Renderer: (render sorted?) mesh = '%s' - alpha = %f - isAdditive = %d",
1885+
mesh->Get_Name(),
1886+
mesh->Get_Alpha_Override(), mesh->Is_Additive()));
1887+
}
1888+
18821889
renderer->Render_Sorted(mesh->Get_Base_Vertex_Offset(),mesh->Get_Bounding_Sphere());
18831890
} else {
18841891
//non-transparent mesh that will be rendered immediately. Okay to adjust the shader/material
@@ -1887,10 +1894,18 @@ void DX8TextureCategoryClass::Render(void)
18871894
{ //mesh has material override of some kind
18881895
//adjust the opacity of this model
18891896
float oldOpacity=vmaterial->Get_Opacity();
1897+
18901898
Vector3 oldDiffuse;
1899+
Vector3 oldEmissive;
1900+
1901+
18911902
Vector2 oldUVOffset;
18921903
unsigned int oldUVOffsetSyncTime;
18931904
vmaterial->Get_Diffuse(&oldDiffuse);
1905+
1906+
vmaterial->Get_Emissive(&oldEmissive);
1907+
1908+
18941909
LinearOffsetTextureMapperClass *oldMapper=(LinearOffsetTextureMapperClass *)vmaterial->Peek_Mapper();
18951910
if ( mesh->Get_User_Data() && *(int *)mesh->Get_User_Data() == RenderObjClass::USER_DATA_MATERIAL_OVERRIDE && oldMapper && oldMapper->Mapper_ID() == TextureMapperClass::MAPPER_ID_LINEAR_OFFSET)
18961911
{ RenderObjClass::Material_Override *matOverride=(RenderObjClass::Material_Override *)mesh->Get_User_Data();
@@ -1903,10 +1918,18 @@ void DX8TextureCategoryClass::Render(void)
19031918
oldMapper=NULL;
19041919
if (mesh->Get_Alpha_Override() != 1.0)
19051920
{
1921+
DEBUG_LOG((">>>DX8Renderer: ALPHA OVERRIDE - mesh = '%s' - alpha = %f - isAdditive = %d",
1922+
mesh->Get_Name(),
1923+
mesh->Get_Alpha_Override(), mesh->Is_Additive()));
19061924
if (mesh->Is_Additive())
19071925
{ //additvie blended mesh can't switch to alpha or we will get a black outline.
19081926
//so adjust diffuse color instead.
1927+
DEBUG_LOG((">>>DX8Renderer: ADDITIVE + ALPHA OVERRIDE - alpha = %f", mesh->Get_Alpha_Override()));
19091928
vmaterial->Set_Diffuse(mesh->Get_Alpha_Override(),mesh->Get_Alpha_Override(),mesh->Get_Alpha_Override());
1929+
1930+
//debug (this actually works)
1931+
vmaterial->Set_Emissive(mesh->Get_Emissive_Override(), mesh->Get_Emissive_Override(), mesh->Get_Emissive_Override());
1932+
19101933
theAlphaShader = theShader; //keep using additive blending.
19111934
}
19121935
vmaterial->Set_Opacity(mesh->Get_Alpha_Override());
@@ -1917,6 +1940,9 @@ void DX8TextureCategoryClass::Render(void)
19171940
DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHAREF,0x60);
19181941
vmaterial->Set_Opacity(oldOpacity); //restore previous value
19191942
vmaterial->Set_Diffuse(oldDiffuse.X,oldDiffuse.Y,oldDiffuse.Z);
1943+
1944+
vmaterial->Set_Emissive(oldEmissive.X, oldEmissive.Y, oldEmissive.Z);
1945+
19201946
DX8Wrapper::Set_Shader(theShader); //restore previous value
19211947
}
19221948
else

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,9 +673,16 @@ void MeshClass::Render(RenderInfoClass & rinfo)
673673
Set_Lighting_Environment(rinfo.light_environment);
674674
//Add custom alpha
675675
m_alphaOverride = rinfo.alphaOverride;
676+
m_emissiveOverride = rinfo.emissiveOverride;
676677
m_materialPassAlphaOverride = rinfo.materialPassAlphaOverride;
677678
m_materialPassEmissiveOverride = rinfo.materialPassEmissiveOverride;
678679

680+
/*if (m_alphaOverride != 1.0) {
681+
DEBUG_LOG((">>>mesh.cpp - Render (static sort) - '%s' - m_alphaOverride = %f, m_materialPassAlphaOverride = %f, m_materialPassEmissiveOverride = %f",
682+
Model->Get_Name(),
683+
m_alphaOverride, m_materialPassAlphaOverride, m_materialPassEmissiveOverride));
684+
}*/
685+
679686
WW3D::Add_To_Static_Sort_List(this, sort_level);
680687

681688
} else {
@@ -710,9 +717,17 @@ void MeshClass::Render(RenderInfoClass & rinfo)
710717
{ Set_Lighting_Environment(rinfo.light_environment);
711718

712719
//Add custom alpha
720+
713721
m_alphaOverride = rinfo.alphaOverride;
722+
m_emissiveOverride = rinfo.emissiveOverride;
714723
m_materialPassAlphaOverride = rinfo.materialPassAlphaOverride;
715724
m_materialPassEmissiveOverride = rinfo.materialPassEmissiveOverride;
725+
726+
//if (m_alphaOverride != 1.0) {
727+
// DEBUG_LOG((">>>mesh.cpp - Render - '%s' - m_alphaOverride = %f, m_materialPassAlphaOverride = %f, m_materialPassEmissiveOverride = %f",
728+
// Model->Get_Name(),
729+
// m_alphaOverride, m_materialPassAlphaOverride, m_materialPassEmissiveOverride));
730+
//}
716731
}
717732

718733
/*

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/mesh.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ class MeshClass : public W3DMPO, public RenderObjClass
145145
void Set_Lighting_Environment(LightEnvironmentClass * light_env) { if (light_env) {m_localLightEnv=*light_env;LightEnvironment = &m_localLightEnv;} else {LightEnvironment = NULL;} }
146146
LightEnvironmentClass * Get_Lighting_Environment(void) { return LightEnvironment; }
147147
inline float Get_Alpha_Override(void) { return m_alphaOverride;}
148+
inline float Get_Emissive_Override(void) { return m_emissiveOverride;}
148149

149150
void Set_Next_Visible_Skin(MeshClass * next_visible) { NextVisibleSkin = next_visible; }
150151
MeshClass * Peek_Next_Visible_Skin(void) { return NextVisibleSkin; }
@@ -181,6 +182,7 @@ class MeshClass : public W3DMPO, public RenderObjClass
181182
LightEnvironmentClass * LightEnvironment; // cached pointer to the light environment for this mesh
182183
LightEnvironmentClass m_localLightEnv; //added for 'Generals'
183184
float m_alphaOverride; //added for 'Generals' to allow variable alpha on meshes.
185+
float m_emissiveOverride; //added by AW for variable additive scaling
184186
float m_materialPassEmissiveOverride; //added for 'Generals' to allow variable emissive on additional passes.
185187
float m_materialPassAlphaOverride; //added for 'Generals' to allow variable alpha on additional render passes.
186188
int BaseVertexOffset; // offset to our first vertex in whatever vb this mesh is in.

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/rinfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class RenderInfoClass
103103
float fog_start;
104104
float fog_end;
105105
float alphaOverride; //added for 'Generals' to allow variable alpha -MW
106+
float emissiveOverride; //added by AW for variable additive scaling
106107
float materialPassAlphaOverride; ////added for 'Generals' to allow variable alpha on additional render passes.-MW
107108
float materialPassEmissiveOverride; ////added for 'Generals' to allow variable emissive on additional render passes.-MW
108109

0 commit comments

Comments
 (0)