Files
firestorm/Gameleap/code/mw4/Libraries/mlr/MLRState.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

613 lines
15 KiB
C++

#include "MLRHeaders.hpp"
#define NO_LEADING_BACKSLASHES_FOR_YOU
void
MidLevelRenderer::SetDefaultRenderStates()
{
gos_SetRenderState( gos_State_Texture, 0 );
gos_SetRenderState( gos_State_AlphaMode, gos_Alpha_OneZero );
gos_SetRenderState( gos_State_Clipping, 0 );
gos_SetRenderState( gos_State_ZWrite, 1 );
gos_SetRenderState( gos_State_Filter, gos_FilterTriLinear );
gos_SetRenderState( gos_State_ZCompare, 1 );
gos_SetRenderState( gos_State_WireframeMode, 0 );
gos_SetRenderState( gos_State_Specular, 0 );
gos_SetRenderState( gos_State_Dither, 0 );
gos_SetRenderState( gos_State_ShadeMode, gos_ShadeGouraud );
gos_SetRenderState( gos_State_TextureMapBlend, gos_BlendModulateAlpha );
gos_SetRenderState( gos_State_AlphaTest, 0 );
gos_SetRenderState( gos_State_Fog, 0 );
}
//#############################################################################
//############################### MLRState ##################################
//#############################################################################
int MLRStateBase::systemFlags;
float MLRStateBase::maxUV;
int MLRStateBase::currentTextureSize;
#ifndef OLDFOG
unsigned int
MLRState::fogColor;
#endif
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStateBase::MLRStateBase(
MemoryStream *stream,
int version
)
{
Verify(gos_GetCurrentHeap() == StatesHeap);
Check_Pointer(this);
Check_Object(stream);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStateBase::MLRStateBase()
{
renderState = 0;
processState = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStateBase::MLRStateBase(const MLRStateBase& mState)
{
Check_Object(&mState);
renderState = mState.renderState;
processState = mState.processState;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStateBase*
MLRStateBase::Make(
MemoryStream *stream,
int version
)
{
Check_Object(stream);
gos_PushCurrentHeap(StatesHeap);
MLRStateBase *state = new MLRStateBase(stream, version);
gos_PopCurrentHeap();
return state;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRState::MLRState(
MemoryStream *stream,
int version
)
{
Verify(gos_GetCurrentHeap() == StatesHeap);
Check_Pointer(this);
Check_Object(stream);
Load(stream, version);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRState::MLRState()
{
renderState = renderDeltaMask = 0;
renderPermissionMask = 0xFFFFFFFF;
processState = processDeltaMask = 0;
processPermissionMask = 0xFFFFFFFF;
#ifdef OLDFOG
fogColor = 0xffffffff;
fogDensity = 0.0f;
nearFog = 1.0f;
farFog = 100.0f;
#endif
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRState::MLRState(const MLRState& mState)
{
Check_Object(&mState);
renderState = mState.renderState;
renderDeltaMask = mState.renderDeltaMask;
renderPermissionMask = mState.renderPermissionMask;
processState = mState.processState;
processDeltaMask = mState.processDeltaMask;
processPermissionMask = mState.processPermissionMask;
#ifdef OLDFOG
nearFog = mState.nearFog;
farFog = mState.farFog;
#endif
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRState*
MLRState::Make(
MemoryStream *stream,
int version
)
{
Check_Object(stream);
gos_PushCurrentHeap(StatesHeap);
MLRState *state = new MLRState(stream, version);
gos_PopCurrentHeap();
return state;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRState::Save(MemoryStream *stream)
{
Check_Object(this);
Check_Object(stream);
//
//-----------------------------
// Save the renderState to the stream
//-----------------------------
//
*stream << renderState << renderDeltaMask << renderPermissionMask;
*stream << processState << processDeltaMask << processPermissionMask;
#if OLDFOG
*stream << nearFog << farFog << fogDensity << fogColor;
#endif
if (renderState&TextureMask)
{
MLRTexture *texture = (*MLRTexturePool::Instance)[this];
Check_Object(texture);
MString name = texture->GetTextureName();
int hint = texture->GetHint();
if(GetMovieTextureMode()==MovieTextureOnMode && texture->IsDerivedFrom(MLRMovieTexture::DefaultData))
{
hint = Cast_Object(MLRMovieTexture*, texture)->GetNumFrames();
Verify(hint>1);
}
else
{
hint = texture->GetHint();
hint <<= 4;
hint |= texture->GetTextureInstance();
}
*stream << name << hint;
Verify((GetTextureHandle()&7) == 1);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRState::Load(
MemoryStream *stream,
int version
)
{
Check_Object(this);
Check_Object(stream);
//
//-------------------------------------
// Load the renderState from the stream
//-------------------------------------
//
*stream >> renderState >> renderDeltaMask >> renderPermissionMask;
*stream >> processState >> processDeltaMask >> processPermissionMask;
#ifdef OLDFOG
*stream >> nearFog >> farFog;
#else
if(version < 6)
{
Scalar dummy;
*stream >> dummy >> dummy;
}
#endif
if (version > 3)
{
#ifdef OLDFOG
*stream >> fogDensity >> fogColor;
#else
if(version < 6)
{
int dummy1;
Scalar dummy2;
*stream >> dummy2 >> dummy1;
}
#endif
}
else
{
#ifdef OLDFOG
fogDensity = 0.0f;
fogColor = 0;
#endif
if (renderDeltaMask & FogMask)
renderDeltaMask |= FogMask;
renderState &= ~(TextureWrapMask|SpecularMask);
renderDeltaMask &= ~(TextureWrapMask|SpecularMask);
renderPermissionMask |= TextureWrapMask|SpecularMask;
}
if (renderState & TextureMask)
{
MString name;
int instance;
*stream >> name;
*stream >> instance;
name.ToLower();
#ifdef NO_LEADING_BACKSLASHES_FOR_YOU
char *real_name = (char *)name;
if(*real_name=='\\')
{
real_name++;
}
#endif
Check_Object(MLRTexturePool::Instance);
MLRTexture *texture = NULL;
if(GetMovieTextureMode()==MovieTextureOnMode && instance > 0)
{
#ifdef NO_LEADING_BACKSLASHES_FOR_YOU
texture = (*MLRTexturePool::Instance)(real_name);
#else
texture = (*MLRTexturePool::Instance)(name);
#endif
if (!texture)
{
#ifdef NO_LEADING_BACKSLASHES_FOR_YOU
texture = MLRTexturePool::Instance->AddMovie(real_name, instance, 0.01f);
#else
texture = MLRTexturePool::Instance->AddMovie(name, instance, 0.01f);
#endif
}
Check_Object(texture);
}
else
{
this->SetMovieTextureOff();
#ifdef NO_LEADING_BACKSLASHES_FOR_YOU
texture = (*MLRTexturePool::Instance)(real_name, instance & 0xf);
#else
texture = (*MLRTexturePool::Instance)(name, instance & 0xf);
#endif
if (!texture)
{
#ifdef NO_LEADING_BACKSLASHES_FOR_YOU
texture = MLRTexturePool::Instance->Add(real_name, instance & 0xf);
#else
texture = MLRTexturePool::Instance->Add(name, instance & 0xf);
#endif
}
Check_Object(texture);
texture->SetHint(instance>>4);
}
SetTextureHandle(texture->GetTextureHandle());
Verify((GetTextureHandle()&7) == 1);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStateBase&
MLRStateBase::CombineIntoBase(
const MLRState &master,
const MLRState &slave
)
{
Check_Pointer(this);
Check_Object(&master);
Check_Object(&slave);
DWORD renderDeltaMask = slave.renderDeltaMask & master.renderPermissionMask;
renderState =
(master.renderState&~renderDeltaMask) | (slave.renderState&renderDeltaMask);
DWORD processDeltaMask = slave.processDeltaMask & master.processPermissionMask;
processState = (master.processState&~processDeltaMask) | (slave.processState&processDeltaMask);
return *this;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRState&
MLRState::Combine(
const MLRState &master,
const MLRState &slave
)
{
Check_Pointer(this);
Check_Object(&master);
Check_Object(&slave);
renderPermissionMask = master.renderPermissionMask & slave.renderPermissionMask;
renderDeltaMask = slave.renderDeltaMask & master.renderPermissionMask;
renderState =
(master.renderState&~renderDeltaMask) | (slave.renderState&renderDeltaMask);
processPermissionMask = master.processPermissionMask & slave.processPermissionMask;
processDeltaMask = slave.processDeltaMask & master.processPermissionMask;
processState = (master.processState&~processDeltaMask) | (slave.processState&processDeltaMask);
#ifdef OLDFOG
unsigned fog_mode = renderDeltaMask & FogMask;
if (fog_mode)
{
fogDensity = slave.fogDensity;
nearFog = slave.nearFog;
farFog = slave.farFog;
if ((renderState&fog_mode) == OverrideFogAndColorMode)
{
fogColor = slave.fogColor;
}
else
{
nearFog = master.nearFog;
farFog = master.farFog;
fogColor = master.fogColor;
}
}
else
{
fogColor = master.fogColor;
fogDensity = master.fogDensity;
nearFog = master.nearFog;
farFog = master.farFog;
}
#endif
return *this;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
void
MLRState::SetFogData (
unsigned fog_color,
Scalar fog_density,
Scalar near_fog,
Scalar far_fog
)
{
fogColor = fog_color;
fogDensity = fog_density;
nearFog = near_fog;
farFog = far_fog;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRState::SetFogData (
RGBAColor fog_color,
Scalar fog_density,
Scalar near_fog,
Scalar far_fog
)
{
SetFogData(GOSCopyColor(&fog_color), fog_density, near_fog, far_fog);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRState::GetFogData (
RGBAColor *fog_color,
Scalar *fog_density,
Scalar *near_fog,
Scalar *far_fog
) const
{
*fog_color =
RGBAColor(
((fogColor>>16)&0xFF)/255.0f,
((fogColor>>8)&0xFF)/255.0f,
(fogColor&0xFF)/255.0f,
((fogColor>>24)&0xFF)/255.0f
);
*fog_density = fogDensity;
*near_fog = nearFog;
*far_fog = farFog;
}
*/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateBase::SetRendererState(MLRTexturePool *texturePool, DWORD tex2, DWORD tex3)
{
Check_Object(this);
Check_Object(texturePool);
MLRTexture *tex = NULL;
if( renderState & MLRState::TextureMask && (NULL!=(tex = (*texturePool)[renderState & MLRState::TextureMask])))
{
gos_SetRenderState(
gos_State_Texture,
tex->GetImage(NULL)->imageHandle
);
}
else
gos_SetRenderState( gos_State_Texture, 0 );
switch( renderState&MLRState::AlphaMask )
{
case MLRState::OneZeroMode:
gos_SetRenderState(gos_State_AlphaTest, 0);
gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_OneZero);
break;
case MLRState::KeyedAlphaMode:
gos_SetRenderState(gos_State_AlphaTest, 1);
gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_OneZero);
break;
case MLRState::OneOneMode:
gos_SetRenderState(gos_State_AlphaTest, 0);
gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_OneOne);
break;
case MLRState::AlphaOneMode:
gos_SetRenderState(gos_State_AlphaTest, 1);
gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_AlphaOne);
break;
case MLRState::OneAlphaMode:
SPEW(("micgaert", "MLRState::OneAlphaMode not available anymore"));
break;
case MLRState::AlphaInvAlphaMode:
gos_SetRenderState(gos_State_AlphaTest, 1);
gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_AlphaInvAlpha);
break;
case MLRState::OneInvAlphaMode:
gos_SetRenderState(gos_State_AlphaTest, 0);
gos_SetRenderState(gos_State_AlphaMode, gos_Alpha_OneInvAlpha);
break;
default:
STOP(("Unknown alpha state"));
}
switch( renderState&MLRState::FilterMask )
{
case MLRState::NoFilterMode:
gos_SetRenderState(gos_State_Filter, gos_FilterNone);
break;
case MLRState::BiLinearFilterMode:
gos_SetRenderState(gos_State_Filter, gos_FilterBiLinear);
break;
case MLRState::TriLinearFilterMode:
gos_SetRenderState(gos_State_Filter, gos_FilterTriLinear);
break;
default:
STOP(("Unknown filter state"));
}
gos_SetRenderState( gos_State_Dither, renderState & MLRState::DitherOnMode );
if( renderState & MLRState::WireFrameOnlyMode )
{
DWORD wfColor=0xffffff;
gos_SetRenderState( gos_State_WireframeMode, (DWORD)&wfColor );
}
else
{
gos_SetRenderState( gos_State_WireframeMode, 0 );
}
gos_SetRenderState( gos_State_Perspective, renderState & MLRState::TextureCorrectionOnMode );
if (renderState & MLRState::FogMask)
{
gos_SetRenderState( gos_State_Fog, (int)&fogColor);
}
else
{
gos_SetRenderState( gos_State_Fog, 0);
}
gos_SetRenderState(
gos_State_ShadeMode,
(renderState & MLRState::FlatColoringMask) ? gos_ShadeFlat : gos_ShadeGouraud
);
gos_SetRenderState(
gos_State_ZWrite,
(renderState & MLRState::ZBufferWriteMask) ? 1 : 0
);
gos_SetRenderState( gos_State_Specular, renderState & MLRState::SpecularOnMode );
gos_SetRenderState(
gos_State_TextureAddress,
(renderState & MLRState::TextureClamp) ? gos_TextureClamp : gos_TextureWrap
);
gos_SetRenderState( gos_State_ZCompare,(renderState & MLRState::ZBufferCompareMask) ? 1 : 0 );
MLRTexture *tex2_p = NULL;
MLRTexture *tex3_p = NULL;
if( (renderState&MLRState::BumpMapMask) &&
(NULL!=(tex = (*texturePool)[renderState & MLRState::TextureMask])) &&
(NULL!=(tex2_p = (*texturePool)[tex2 & MLRState::TextureMask]))
)
{
if(MLRState::GetCanBumpEnvMap() && (NULL!=(tex3_p = (*texturePool)[tex3 & MLRState::TextureMask])))
{
gos_SetRenderState(
gos_State_Texture,
tex->GetImage(NULL)->imageHandle
);
gos_SetRenderState(
gos_State_Texture2,
tex2_p->GetImage(NULL)->imageHandle
);
gos_SetRenderState(
gos_State_Texture3,
tex3_p->GetImage(NULL)->imageHandle
);
gos_SetRenderState( gos_State_Multitexture, gos_Multitexture_BumpEnvMap );
}
else if(MLRState::GetCanBumpDotMap())
{
gos_SetRenderState(
gos_State_Texture,
tex2_p->GetImage(NULL)->imageHandle
);
gos_SetRenderState(
gos_State_Texture2,
tex->GetImage(NULL)->imageHandle
);
gos_SetRenderState( gos_State_Multitexture, gos_Multitexture_BumpDotMap );
}
}
else
{
gos_SetRenderState( gos_State_Multitexture, gos_Multitexture_None );
// gos_SetRenderState( gos_State_Texture, 0 );
// gos_SetRenderState( gos_State_Texture2, 0 );
gos_SetRenderState( gos_State_Texture3, 0 );
}
}