Files
firestorm/Gameleap/code/mw4/Libraries/ElementProxies/MLRStateProxy.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

2108 lines
46 KiB
C++

#include "ElementProxyHeaders.hpp"
#include <MLR\MLRTexturePool.hpp>
#include <MLR\MLRTexture.hpp>
//
//############################################################################
//############################ MLRStateProxy ##############################
//############################################################################
//
MemoryBlock*
MLRStateProxy::AllocatedMemory = NULL;
MLRStateProxy::ClassData*
MLRStateProxy::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::InitializeClass()
{
Verify(!AllocatedMemory);
AllocatedMemory =
new MemoryBlock(
sizeof(MLRStateProxy),
10,
10,
"MLRStateProxy"
);
Register_Object(AllocatedMemory);
Verify(!DefaultData);
DefaultData =
new ClassData(
MLRStateProxyClassID,
"MLRStateProxy",
StateProxy::DefaultData
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
Unregister_Object(AllocatedMemory);
delete AllocatedMemory;
AllocatedMemory = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::Destroy()
{
Check_Object(this);
Verify(referenceCount == 1);
// STOP(("Not implemented"));
DetachReference();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStateProxy::MLRStateProxy(
MLRStatePoolProxy *library,
const MLRState &state
):
StateProxy(DefaultData, library)
{
Check_Pointer(this);
mlrState = state;
//
//----------------------------------------------------------------------
// If no blend mode is specified in the state, check to see if we are
// using an alpha texture. If so, we will automatically set up the RGBA
// blending mode
//----------------------------------------------------------------------
//
if (!(mlrState.GetRenderDeltaMask()&MLRState::AlphaMask))
{
MLRTexturePoolProxy *texture_pool =
Cast_Object(MLRTexturePoolProxy*, library->GetTextureLibrary());
Check_Object(&mlrState);
unsigned texture_handle = mlrState.GetTextureHandle();
if (texture_handle)
{
MLRTexture *mlr_texture = (*MLRTexturePool::Instance)[texture_handle];
Check_Object(mlr_texture);
TextureProxy *texture =
texture_pool->UseTextureProxy(mlr_texture->GetProxyNumber());
Check_Object(texture);
unsigned
red,
green,
blue,
alpha;
texture->GetChannelDepth(&red, &green, &blue, &alpha);
if (alpha>0)
{
mlrState.SetAlphaMode(MLRState::AlphaInvAlphaMode);
mlrState.SetPriority(MLRState::AlphaPriority);
mlrState.SetBackFaceOff();
}
texture->DetachReference();
}
}
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStateProxy::~MLRStateProxy()
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::TestInstance() const
{
Verify(IsDerivedFrom(DefaultData));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetName(MString *name)
{
Check_Object(this);
Check_Object(name);
//STOP(("Not implemented"));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetName(const char* name)
{
Check_Object(this);
Check_Pointer(name);
//STOP(("Not implemented"));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetAlpha(AlphaMode *alphaMode)
{
Check_Object(this);
Check_Pointer(alphaMode);
switch(mlrState.GetAlphaMode())
{
case MLRState::OneZeroMode:
*alphaMode = StateProxy::OneZeroMode;
break;
case MLRState::OneOneMode:
*alphaMode = StateProxy::OneOneMode;
break;
case MLRState::AlphaOneMode:
*alphaMode = StateProxy::AlphaOneMode;
break;
case MLRState::OneAlphaMode:
*alphaMode = StateProxy::OneAlphaMode;
break;
case MLRState::AlphaInvAlphaMode:
*alphaMode = StateProxy::AlphaInvAlphaMode;
break;
case MLRState::OneInvAlphaMode:
*alphaMode = StateProxy::OneInvAlphaMode;
break;
case MLRState::KeyedAlphaMode:
*alphaMode = StateProxy::KeyedAlphaMode;
break;
}
if(mlrState.GetRenderDeltaMask() & MLRState::AlphaMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetAlpha(AlphaMode alphaMode)
{
Check_Object(this);
switch(alphaMode)
{
case StateProxy::OneZeroMode:
mlrState.SetAlphaMode(MLRState::OneZeroMode);
break;
case StateProxy::OneOneMode:
mlrState.SetAlphaMode(MLRState::OneOneMode);
break;
case StateProxy::AlphaOneMode:
mlrState.SetAlphaMode(MLRState::AlphaOneMode);
break;
case StateProxy::OneAlphaMode:
mlrState.SetAlphaMode(MLRState::OneAlphaMode);
break;
case StateProxy::AlphaInvAlphaMode:
mlrState.SetAlphaMode(MLRState::AlphaInvAlphaMode);
break;
case StateProxy::OneInvAlphaMode:
mlrState.SetAlphaMode(MLRState::OneInvAlphaMode);
break;
case StateProxy::KeyedAlphaMode:
mlrState.SetAlphaMode(MLRState::KeyedAlphaMode);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetAlphaChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::AlphaMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetAlphaChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::AlphaMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::AlphaMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetFilter(FilterMode *filterMode)
{
Check_Object(this);
Check_Pointer(filterMode);
switch(mlrState.GetFilterMode())
{
case MLRState::NoFilterMode:
*filterMode = StateProxy::NoFilterMode;
break;
case MLRState::BiLinearFilterMode:
*filterMode = StateProxy::BiLinearFilterMode;
break;
case MLRState::TriLinearFilterMode:
*filterMode = StateProxy::TriLinearFilterMode;
break;
}
if(mlrState.GetRenderDeltaMask() & MLRState::FilterMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetFilter(FilterMode filterMode)
{
Check_Object(this);
switch(filterMode)
{
case StateProxy::NoFilterMode:
mlrState.SetFilterMode(MLRState::NoFilterMode);
break;
case StateProxy::BiLinearFilterMode:
mlrState.SetFilterMode(MLRState::BiLinearFilterMode);
break;
case StateProxy::TriLinearFilterMode:
mlrState.SetFilterMode(MLRState::TriLinearFilterMode);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetFilterChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::FilterMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetFilterChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::FilterMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::FilterMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetFog(FogMode *mode)
{
Check_Object(this);
Check_Pointer(mode);
if(!(mlrState.GetRenderDeltaMask() & MLRState::FogMask))
return false;
*mode = static_cast<FogMode>(mlrState.GetFogMode());
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetFog(FogMode mode)
{
Check_Object(this);
mlrState.SetFogMode(mode);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetFogChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::FogMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetFogChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::FogMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::FogMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetDither(bool *dither)
{
Check_Object(this);
Check_Pointer(dither);
*dither = (mlrState.GetDitherMode() == MLRState::DitherOnMode) ? true : false;
if(mlrState.GetRenderDeltaMask() & MLRState::DitherMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetDither(bool dither)
{
Check_Object(this);
if(dither == true)
{
mlrState.SetDitherOn();
}
else
{
mlrState.SetDitherOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetDitherChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::DitherMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetDitherChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::DitherMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::DitherMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetSpecular(bool *Specular)
{
Check_Object(this);
Check_Pointer(Specular);
*Specular = (mlrState.GetSpecularMode() == MLRState::SpecularOnMode) ? true : false;
if(mlrState.GetRenderDeltaMask() & MLRState::SpecularMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetSpecular(bool Specular)
{
Check_Object(this);
if(Specular == true)
{
mlrState.SetSpecularOn();
}
else
{
mlrState.SetSpecularOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetSpecularChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::SpecularMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetSpecularChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::SpecularMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::SpecularMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetTextureCorrection(bool *texCor)
{
Check_Object(this);
*texCor = (mlrState.GetTextureCorrectionMode() == MLRState::TextureCorrectionOnMode) ? true : false;
if(mlrState.GetRenderDeltaMask() & MLRState::TextureCorrectionMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetTextureCorrection(bool texCor)
{
Check_Object(this);
if(texCor == true)
{
mlrState.SetTextureCorrectionOn();
}
else
{
mlrState.SetTextureCorrectionOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetTextureCorrectionChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::TextureCorrectionMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetTextureCorrectionChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::TextureCorrectionMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::TextureCorrectionMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetTextureWrap(TextureWrapMode *texWrap)
{
Check_Object(this);
MLRState::TextureWrapMode mlrTexWrap;
mlrTexWrap = mlrState.GetTextureWrapMode();
if(mlrTexWrap == MLRState::TextureWrap)
{
*texWrap = StateProxy::TextureWrap;
}
else
{
*texWrap = StateProxy::TextureClamp;
}
if(mlrState.GetRenderDeltaMask() & MLRState::TextureWrapMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetTextureWrap(TextureWrapMode texWrap)
{
Check_Object(this);
if(texWrap == StateProxy::TextureWrap)
{
mlrState.SetTextureWrapMode(MLRState::TextureWrap);
}
else
{
mlrState.SetTextureWrapMode(MLRState::TextureClamp);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetTextureWrapChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::TextureWrapMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetTextureWrapChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::TextureWrapMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::TextureWrapMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetWireFrame(WireFrameMode *wireFrame)
{
Check_Object(this);
Check_Pointer(wireFrame);
switch(mlrState.GetWireFrameMode())
{
case MLRState::WireFrameOffMode:
*wireFrame = StateProxy::WireFrameOffMode;
break;
case MLRState::WireFrameOnlyMode:
*wireFrame = StateProxy::WireFrameOnlyMode;
break;
case MLRState::WireFrameAddMode:
*wireFrame = StateProxy::WireFrameAddMode;
break;
}
if(mlrState.GetRenderDeltaMask() & MLRState::WireFrameMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetWireFrame(WireFrameMode wireFrame)
{
Check_Object(this);
switch(wireFrame)
{
case StateProxy::WireFrameOffMode:
mlrState.SetWireFrameMode(MLRState::WireFrameOffMode);
break;
case StateProxy::WireFrameOnlyMode:
mlrState.SetWireFrameMode(MLRState::WireFrameOnlyMode);
break;
case StateProxy::WireFrameAddMode:
mlrState.SetWireFrameMode(MLRState::WireFrameAddMode);
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetWireFrameChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::WireFrameMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetWireFrameChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::WireFrameMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::WireFrameMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetZBufferCompare(bool *z)
{
Check_Object(this);
Check_Pointer(z);
*z = (mlrState.GetZBufferCompareMode() == MLRState::ZBufferCompareOnMode) ? true : false;
if(mlrState.GetRenderDeltaMask() & MLRState::ZBufferCompareMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetZBufferCompare(bool z)
{
Check_Object(this);
if(z==true)
{
mlrState.SetZBufferCompareOn();
}
else
{
mlrState.SetZBufferCompareOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetZBufferCompareChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::ZBufferCompareMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetZBufferCompareChildPermission(bool override)
{
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::ZBufferCompareMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::ZBufferCompareMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetZBufferWrite(bool *z)
{
Check_Object(this);
Check_Pointer(z);
*z = (mlrState.GetZBufferWriteMode() == MLRState::ZBufferWriteOnMode) ? true : false;
if(mlrState.GetRenderDeltaMask() & MLRState::ZBufferWriteMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetZBufferWrite(bool z)
{
Check_Object(this);
if(z==true)
{
mlrState.SetZBufferWriteOn();
}
else
{
mlrState.SetZBufferWriteOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetZBufferWriteChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::ZBufferWriteMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetZBufferWriteChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::ZBufferWriteMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::ZBufferWriteMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetFlatColoring(bool *z)
{
Check_Object(this);
Check_Pointer(z);
*z = (mlrState.GetFlatColoringMode() == MLRState::FlatColoringOnMode) ? true : false;
if(mlrState.GetRenderDeltaMask() & MLRState::FlatColoringMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetFlatColoring(bool z)
{
Check_Object(this);
if(z==true)
{
mlrState.SetFlatColoringOn();
}
else
{
mlrState.SetFlatColoringOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetFlatColoringChildPermission()
{
Check_Object(this);
return mlrState.GetRenderPermissionMask() & MLRState::FlatColoringMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetFlatColoringChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() & ~MLRState::FlatColoringMask
);
}
else
{
mlrState.SetRenderPermissionMask(
mlrState.GetRenderPermissionMask() | MLRState::FlatColoringMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetBackface(bool *onOff)
{
Check_Object(this);
Check_Pointer(onOff);
if(mlrState.GetBackFaceMode() == MLRState::BackFaceOnMode)
{
*onOff = true;
}
else
{
*onOff = false;
}
if(mlrState.GetProcessDeltaMask() & MLRState::BackFaceMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetBackface(bool onOff)
{
Check_Object(this);
if(onOff==true)
{
mlrState.SetBackFaceOn();
}
else
{
mlrState.SetBackFaceOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetBackfaceChildPermission()
{
Check_Object(this);
return mlrState.GetProcessPermissionMask() & MLRState::BackFaceMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetBackfaceChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() & ~MLRState::BackFaceMask
);
}
else
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() | MLRState::BackFaceMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetMatTwoSided(bool *onOff)
{
Check_Object(this);
Check_Pointer(onOff);
if(mlrState.GetMatTwoSidedMode() == MLRState::MatTwoSidedOnMode)
{
*onOff = true;
}
else
{
*onOff = false;
}
if(mlrState.GetProcessDeltaMask() & MLRState::MatTwoSidedMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetMatTwoSided(bool onOff)
{
Check_Object(this);
if(onOff==true)
{
mlrState.SetMatTwoSidedOn();
}
else
{
mlrState.SetMatTwoSidedOff();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetMatTwoSidedChildPermission()
{
Check_Object(this);
return mlrState.GetProcessPermissionMask() & MLRState::MatTwoSidedMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetMatTwoSidedChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() & ~MLRState::MatTwoSidedMask
);
}
else
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() | MLRState::MatTwoSidedMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetPriority(int *priority)
{
Check_Object(this);
Check_Pointer(priority);
*priority = mlrState.GetPriority();
if(mlrState.GetProcessDeltaMask() & MLRState::PriorityMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetPriority(int priority)
{
Check_Object(this);
mlrState.SetPriority(priority);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetPriorityChildPermission()
{
Check_Object(this);
return mlrState.GetProcessPermissionMask() & MLRState::PriorityMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetPriorityChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() & ~MLRState::PriorityMask
);
}
else
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() | MLRState::PriorityMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetLighting(int *lightingMode)
{
Check_Object(this);
Check_Pointer(lightingMode);
int mlr_mode = mlrState.GetLightingMode();
*lightingMode = 0;
if (mlr_mode&MLRState::LightMapLightingMode)
*lightingMode |= LightingLightMapMode;
if (mlr_mode&MLRState::VertexLightingMode)
*lightingMode |= LightingVertexMode;
if (mlr_mode&MLRState::LookupLightingMode)
*lightingMode |= LightingLookupMode;
if (mlr_mode&MLRState::FaceLightingMode)
*lightingMode |= LightingFaceMode;
if(mlrState.GetProcessDeltaMask() & MLRState::LightingMask)
{
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetLighting(int lightingMode)
{
Check_Object(this);
int mlr_mode = 0;
if (lightingMode&LightingLightMapMode)
mlr_mode |= MLRState::LightMapLightingMode;
if (lightingMode&LightingVertexMode)
mlr_mode |= MLRState::VertexLightingMode;
if (lightingMode&LightingLookupMode)
mlr_mode |= MLRState::LookupLightingMode;
if (lightingMode&LightingFaceMode)
mlr_mode |= MLRState::FaceLightingMode;
mlrState.SetLightingMode(mlr_mode);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetLightingChildPermission()
{
Check_Object(this);
return mlrState.GetProcessPermissionMask() & MLRState::LightingMask ? true : false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetLightingChildPermission(bool override)
{
Check_Object(this);
if(override == true)
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() & ~MLRState::LightingMask
);
}
else
{
mlrState.SetProcessPermissionMask(
mlrState.GetProcessPermissionMask() | MLRState::LightingMask
);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRStateProxy::GetSpecularColor(RGBColor *color)
{
Check_Object(this);
Check_Pointer(color);
// STOP(("Not implemented"));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetSpecularColor(const RGBColor &color)
{
Check_Object(this);
Check_Object(&color);
// STOP(("Not implemented"));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Scalar
MLRStateProxy::GetSpecularShininess()
{
Check_Object(this);
// STOP(("Not implemented"));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStateProxy::SetSpecularShininess(Scalar shininess)
{
Check_Object(this);
Verify(shininess >= 0.0f && shininess <= 1.0f);
// STOP(("Not implemented"));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
TextureProxy*
MLRStateProxy::UseTextureProxy()
{
Check_Object(this);
//
//--------------------------
// Return the state proxy
//--------------------------
//
StateLibrary *states = GetStateLibrary();
Check_Object(states);
MLRTexturePoolProxy *library =
Cast_Object(MLRTexturePoolProxy*, states->GetTextureLibrary());
Check_Object(&mlrState);
unsigned texture_handle = mlrState.GetTextureHandle();
if (!texture_handle)
return NULL;
MLRTexture *mlr_texture = (*MLRTexturePool::Instance)[texture_handle];
Check_Object(mlr_texture);
return library->UseTextureProxy(mlr_texture->GetProxyNumber());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
TextureProxy*
MLRStateProxy::SetToMatchTextureProxy(TextureProxy *texture)
{
Check_Object(this);
Check_Object(texture);
Check_Object(&mlrState);
MLRTextureProxy *MLRTexture = Cast_Object(MLRTextureProxy *,texture);
MidLevelRenderer::MLRTexture *tex = MLRTexture->GetMLRTexture();
mlrState.SetTextureHandle(tex->GetTextureHandle());
return texture;
//
//----------------------------------------
// Have the texture library make our proxy
//----------------------------------------
//
STOP(("Not implemented"));
return NULL;
#if 0
MGPolygonMesh *mesh = GetPolygonMeshProxy();
Check_Object(mesh);
MGScene *database = mesh->GetSceneProxy();
Check_Object(database);
MGTextureLibrary *library =
Cast_Object(MGTextureLibrary*, database->GetTextureLibrary());
MGTexture *proxy =
Cast_Object(
MGTexture*,
library->UseMatchingTextureProxy(texture)
);
//
//----------------------------------------
// Set our polyon to point at this texture
//----------------------------------------
//
int count =
mgSetAttList(
proxiedPolygon,
fltPolyTexture, static_cast<short>(proxy->GetTextureIndex()),
mgNULL
);
Verify(count == 1);
//
//------------------------------------------------------------------
// If the texture has an alpha channel, enable alpha blending on the
// polygon
//------------------------------------------------------------------
//
unsigned red,green,blue,alpha;
proxy->GetChannelDepth(&red, &green, &blue, &alpha);
if (alpha)
{
count =
mgSetAttList(
proxiedPolygon,
fltPolyMgTemplate, static_cast<char>(1),
mgNULL
);
Verify(count == 1);
}
return proxy;
#endif
}
//
//############################################################################
//############################ MLRStateProxy ##############################
//############################################################################
//
MLRStatePoolProxy::ClassData*
MLRStatePoolProxy::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStatePoolProxy::InitializeClass()
{
Verify(!DefaultData);
DefaultData =
new ClassData(
MLRStatePoolProxyClassID,
"MLRStatePoolProxy",
StateLibrary::DefaultData
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStatePoolProxy::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStatePoolProxy::Destroy()
{
Check_Object(this);
Verify(referenceCount == 1);
Verify(activeStateProxies.IsEmpty());
// STOP(("Not implemented"));
DetachReference();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStatePoolProxy::MLRStatePoolProxy(
ElementSceneProxy *scene,
const char *path
):
StateLibrary(DefaultData, scene),
proxiedStates(101, NULL, true)
{
Check_Pointer(this);
Check_Object(scene);
textureLibrary = MLRTexturePoolProxy::Instance;
if (!textureLibrary)
{
textureLibrary = MLRTexturePoolProxy::MakeProxy(this, path);
Register_Object(textureLibrary);
}
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStatePoolProxy::MLRStatePoolProxy(ElementSceneProxy *scene):
StateLibrary(DefaultData, scene),
proxiedStates(101, NULL, true)
{
Check_Pointer(this);
Check_Object(scene);
textureLibrary = MLRTexturePoolProxy::Instance;
if (!textureLibrary)
{
textureLibrary = MLRTexturePoolProxy::MakeProxy(this);
Register_Object(textureLibrary);
}
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRStatePoolProxy::~MLRStatePoolProxy()
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStatePoolProxy::TestInstance() const
{
Verify(IsDerivedFrom(DefaultData));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
StateProxy*
MLRStatePoolProxy::UseMatchingStateProxy(
StateProxy *state,
TextureProxy *texture
)
{
Check_Object(this);
Check_Object(state);
//
//------------------------------------
// See if this state needs to be added
//------------------------------------
//
MLRState mlr_state;
CalculateMLRState(&mlr_state, state, texture);
MLRStateProxy *our_state = proxiedStates.Find(mlr_state);
if (!our_state)
{
our_state = MLRStateProxy::MakeProxy(this, mlr_state);
Register_Object(our_state);
proxiedStates.AddValue(our_state, mlr_state);
}
our_state->AttachReference();
return our_state;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStatePoolProxy::CalculateMLRState(
MLRState *state,
StateProxy *proxy,
TextureProxy *texture
)
{
Check_Object(this);
Check_Pointer(state);
Check_Object(proxy);
//
//-----------------------------------------------------------------------
// Find the texture proxy from the state proxy unless there is a specific
// texture override
//-----------------------------------------------------------------------
//
if (!texture)
texture = proxy->UseTextureProxy();
else
{
Check_Object(texture);
texture->AttachReference();
}
//
//-------------------------------------------------------------------
// Figure out if the texture is keyed,
// used to override alpha mode and render priority
//-------------------------------------------------------------------
//
bool bKeyed = false;
if (texture)
{
Proxies::TextureProxy::FormatType format;
if (texture->GetFormat(&format)) {
if (format == Proxies::TextureProxy::KeyedTexture)
bKeyed = true;
}
}
//
//---------------------
// Deal with the states
//---------------------
//
state->SetRenderDeltaMask(0);
state->SetProcessDeltaMask(0);
state->SetRenderPermissionMask(0xffffffff);
state->SetProcessPermissionMask(0xffffffff);
bool permission, onOff;
StateProxy::AlphaMode alphaMode;
if(proxy->GetAlpha(&alphaMode))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::AlphaMask
);
switch(alphaMode)
{
case StateProxy::OneZeroMode:
state->SetAlphaMode(MLRState::OneZeroMode);
break;
case StateProxy::OneOneMode:
state->SetAlphaMode(MLRState::OneOneMode);
break;
case StateProxy::AlphaOneMode:
state->SetAlphaMode(MLRState::AlphaOneMode);
break;
case StateProxy::OneAlphaMode:
state->SetAlphaMode(MLRState::OneAlphaMode);
break;
case StateProxy::AlphaInvAlphaMode: {
// If texture is keyed
// Need to set Alpha mode to KeyedAlphaMode
if (bKeyed)
state->SetAlphaMode(MLRState::KeyedAlphaMode);
else {
bKeyed = false;
state->SetAlphaMode(MLRState::AlphaInvAlphaMode);
}
}
break;
case StateProxy::OneInvAlphaMode:
state->SetAlphaMode(MLRState::OneInvAlphaMode);
break;
case StateProxy::KeyedAlphaMode:
state->SetAlphaMode(MLRState::KeyedAlphaMode);
break;
}
}
permission = proxy->GetAlphaChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::AlphaMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::AlphaMask
);
}
StateProxy::FilterMode filterMode;
if(proxy->GetFilter(&filterMode))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::FilterMask
);
switch(filterMode)
{
case StateProxy::NoFilterMode:
state->SetFilterMode(MLRState::NoFilterMode);
break;
case StateProxy::BiLinearFilterMode:
state->SetFilterMode(MLRState::BiLinearFilterMode);
break;
case StateProxy::TriLinearFilterMode:
state->SetFilterMode(MLRState::TriLinearFilterMode);
break;
}
}
permission = proxy->GetFilterChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::FilterMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::FilterMask
);
}
StateProxy::FogMode fogMode;
if(proxy->GetFog(&fogMode))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::FogMask
);
state->SetFogMode(fogMode);
}
permission = proxy->GetFogChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::FogMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::FogMask
);
}
if(proxy->GetDither(&onOff))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::DitherMask
);
if(onOff)
{
state->SetDitherOn();
}
else
{
state->SetDitherOff();
}
}
permission = proxy->GetDitherChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::DitherMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::DitherMask
);
}
if(proxy->GetSpecular(&onOff))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::SpecularMask
);
if(onOff)
{
state->SetSpecularOn();
}
else
{
state->SetSpecularOff();
}
}
permission = proxy->GetSpecularChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::SpecularMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::SpecularMask
);
}
if(proxy->GetTextureCorrection(&onOff))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::TextureCorrectionMask
);
if(onOff)
{
state->SetTextureCorrectionOn();
}
else
{
state->SetTextureCorrectionOff();
}
}
permission = proxy->GetTextureCorrectionChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::TextureCorrectionMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::TextureCorrectionMask
);
}
StateProxy::TextureWrapMode textureWrapMode;
if(proxy->GetTextureWrap(&textureWrapMode))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::TextureWrapMask
);
if(textureWrapMode==StateProxy::TextureWrap)
{
state->SetTextureWrapMode(MLRState::TextureWrap);
}
else
{
state->SetTextureWrapMode(MLRState::TextureClamp);
}
}
permission = proxy->GetTextureWrapChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::TextureWrapMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::TextureWrapMask
);
}
StateProxy::WireFrameMode wireFrameMode;
if(proxy->GetWireFrame(&wireFrameMode))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::WireFrameMask
);
switch(wireFrameMode)
{
case StateProxy::WireFrameOffMode:
state->SetWireFrameMode(MLRState::WireFrameOffMode);
break;
case StateProxy::WireFrameOnlyMode:
state->SetWireFrameMode(MLRState::WireFrameOnlyMode);
break;
case StateProxy::WireFrameAddMode:
state->SetWireFrameMode(MLRState::WireFrameAddMode);
break;
}
}
permission = proxy->GetWireFrameChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::WireFrameMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::WireFrameMask
);
}
if(proxy->GetZBufferCompare(&onOff))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::ZBufferCompareMask
);
if(onOff)
{
state->SetZBufferCompareOn();
}
else
{
state->SetZBufferCompareOff();
}
}
permission = proxy->GetZBufferCompareChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::ZBufferCompareMask
);
}
else
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::ZBufferCompareMask
);
}
if(proxy->GetZBufferWrite(&onOff))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::ZBufferWriteMask
);
if(onOff)
{
state->SetZBufferWriteOn();
}
else
{
state->SetZBufferWriteOff();
}
}
permission = proxy->GetZBufferWriteChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::ZBufferWriteMask
);
}
else
{
state->SetProcessPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::ZBufferWriteMask
);
}
if(proxy->GetFlatColoring(&onOff))
{
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::FlatColoringMask
);
if(onOff)
{
state->SetFlatColoringOn();
}
else
{
state->SetFlatColoringOff();
}
}
permission = proxy->GetFlatColoringChildPermission();
if(permission==true)
{
state->SetRenderPermissionMask(
state->GetRenderPermissionMask() | MLRState::FlatColoringMask
);
}
else
{
state->SetProcessPermissionMask(
state->GetRenderPermissionMask() & ~MLRState::FlatColoringMask
);
}
// Material two sided
if(proxy->GetMatTwoSided(&onOff))
{
state->SetProcessDeltaMask(
state->GetProcessDeltaMask() | MLRState::MatTwoSidedMask
);
if(onOff)
{
state->SetMatTwoSidedOn();
}
else
{
state->SetMatTwoSidedOff();
}
}
permission = proxy->GetMatTwoSidedChildPermission();
if(permission==true)
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() | MLRState::MatTwoSidedMask
);
}
else
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() & ~MLRState::MatTwoSidedMask
);
}
// Back face culling
if(proxy->GetBackface(&onOff))
{
state->SetProcessDeltaMask(
state->GetProcessDeltaMask() | MLRState::BackFaceMask
);
if(onOff)
{
state->SetBackFaceOn();
}
else
{
state->SetBackFaceOff();
}
}
permission = proxy->GetBackfaceChildPermission();
if(permission==true)
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() | MLRState::BackFaceMask
);
}
else
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() & ~MLRState::BackFaceMask
);
}
int priority;
if(proxy->GetPriority(&priority))
{
state->SetProcessDeltaMask(
state->GetProcessDeltaMask() | MLRState::PriorityMask
);
state->SetPriority(priority);
// If texture is keyed
// Need to set priority to DetailPrority
if (bKeyed)
state->SetPriority(MLRState::DetailPrority);
}
permission = proxy->GetPriorityChildPermission();
if(permission==true)
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() | MLRState::PriorityMask
);
}
else
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() & ~MLRState::PriorityMask
);
}
int lightingMode;
if(proxy->GetLighting(&lightingMode))
{
state->SetProcessDeltaMask(
state->GetProcessDeltaMask() | MLRState::LightingMask
);
int mlr_mode = 0;
if (lightingMode&StateProxy::LightingLightMapMode)
mlr_mode |= MLRState::LightMapLightingMode;
if (lightingMode&StateProxy::LightingVertexMode)
mlr_mode |= MLRState::VertexLightingMode;
if (lightingMode&StateProxy::LightingLookupMode)
mlr_mode |= MLRState::LookupLightingMode;
if (lightingMode&StateProxy::LightingFaceMode)
mlr_mode |= MLRState::FaceLightingMode;
state->SetLightingMode(mlr_mode);
}
permission = proxy->GetLightingChildPermission();
if(permission==true)
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() | MLRState::LightingMask
);
}
else
{
state->SetProcessPermissionMask(
state->GetProcessPermissionMask() & ~MLRState::LightingMask
);
}
//
//----------------------
// Deal with the texture
//----------------------
//
if (texture)
{
Check_Object(texture);
MLRTexturePoolProxy *textures =
Cast_Object(MLRTexturePoolProxy*, GetTextureLibrary());
Check_Object(textures);
MLRTextureProxy *our_texture =
Cast_Object(
MLRTextureProxy*,
textures->UseMatchingTextureProxy(texture)
);
MLRTexture *mlr_texture = our_texture->GetMLRTexture();
Check_Object(mlr_texture);
state->SetTextureHandle(mlr_texture->GetTextureHandle());
state->SetRenderDeltaMask(
state->GetRenderDeltaMask() | MLRState::TextureMask
);
our_texture->DetachReference();
texture->DetachReference();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRStatePoolProxy::CloseLibrary()
{
Check_Object(this);
//
//----------------------------
// Release the texture manager
//----------------------------
//
textureLibrary = NULL;
//
//-----------------------------
// Now delete our state proxies
//-----------------------------
//
HashIteratorOf<MLRStateProxy*, MLRState> states(&proxiedStates);
MLRStateProxy *state;
while ((state = states.ReadAndNext()) != NULL)
{
Check_Object(state);
Verify(state->GetReferenceCount() == 1);
state->DetachReference();
}
Verify(GetReferenceCount() == 1);
}