Files
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

2140 lines
48 KiB
C++

#include "MAXProxyHeaders.hpp"
#include <ElementRenderer\StateChange.hpp>
//
//############################################################################
//############################ MAXState ##############################
//############################################################################
//
MemoryBlock*
MAXState::AllocatedMemory = NULL;
MAXState::ClassData*
MAXState::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::InitializeClass()
{
Verify(!AllocatedMemory);
AllocatedMemory =
new MemoryBlock(
sizeof(MAXState),
80,
10,
"MAXState"
);
Register_Object(AllocatedMemory);
Verify(!DefaultData);
DefaultData =
new ClassData(
MAXStateClassID,
"MAXState",
StateProxy::DefaultData
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
Unregister_Object(AllocatedMemory);
delete AllocatedMemory;
AllocatedMemory = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::Destroy()
{
Check_Object(this);
Verify(referenceCount == 1);
STOP(("Not implemented"));
DetachReference();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MAXState::MAXState(
MAXStateLibrary *library,
INode *mesh,
Mtl *material,
BitmapTex *texture,
int indice
):
StateProxy(DefaultData, library),
meshState(mesh),
materialState(material),
textureState(texture),
mapIndice(indice)
{
Check_Pointer(this);
Check_Object(this);
bAlphaMode = false;
bFlatShaded = false;
matID = 0;
mipmapHint=0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MAXState::~MAXState()
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::TestInstance() const
{
Verify(IsDerivedFrom(DefaultData));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetName(MString *name)
{
Check_Object(this);
Check_Object(name);
name->AllocateLength(0);
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetName(const char* name)
{
Check_Object(this);
Check_Pointer(name);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetSpecularColor(RGBColor *color)
{
return false;
// Not implemented in MLRSTate
Check_Object(this);
Check_Pointer(color);
if (materialState)
{
Check_Pointer(materialState);
Color matcolor = materialState->GetSpecular();
color->red = matcolor.r;
color->green = matcolor.g;
color->blue = matcolor.b;
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetSpecularColor(const RGBColor &color)
{
Check_Object(this);
Check_Object(&color);
Check_Pointer(materialState);
Color matcolor;
matcolor.r = color.red;
matcolor.g = color.green;
matcolor.b = color.blue;
// TODO: What about animated textures?
materialState->SetSpecular(matcolor,0);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Scalar
MAXState::GetSpecularShininess()
{
Check_Object(this);
if (materialState)
{
Check_Pointer(materialState);
return materialState->GetShininess();
}
return 0.0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetSpecularShininess(Scalar shininess)
{
Check_Object(this);
Check_Pointer(materialState);
materialState->SetShininess(shininess,0);
STOP(("SetSpecularShininess not implemented"));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetSpecular(bool *bval)
{
Check_Object(this);
if (materialState)
{
Check_Pointer(materialState);
if (materialState->SubTexmapOn(ID_SP))
{
*bval = true;
return true;
}
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetSpecular(bool)
{
Check_Object(this);
// Needs to set the texmap flag to on
//STOP(("SetSpecular not implemented"));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetSpecularChildPermission()
{
Check_Object(this);
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetSpecularChildPermission(bool override)
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// this routine was done the hard way because it is a quick hack to include
// multi - texture. It will be rewritten when the God's above decide how
// multi - texture will be implemented and used - BDB
//
bool
MAXState::GetAlpha(Proxies::StateProxy::AlphaMode *alpha_mode)
{
Check_Object(this);
if (NULL == materialState)
return false;
if (0==mipmapHint)
{
mipmapHint=1;
char *name = materialState->GetName();
MAXStateLibrary *max_states = GetStateLibrary();
Check_Object(max_states);
MAXScene *scene = max_states->GetSceneProxy();
Page *page = scene->FindHint(name);
if (page)
{
const char *entry;
if (page->GetEntry("MipMap",&entry))
{
if (strnicmp(entry,"None",4)==0)
{
mipmapHint++;
}
}
}
}
if (mipmapHint)
{
if (mipmapHint>1)
{
*alpha_mode = Proxies::StateProxy::AlphaMode::OneZeroMode;
return true;
}
}
Check_Pointer(materialState);
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
if ((Cast_Pointer(StdMat*, materialState)->GetTransparencyType() == TRANSP_ADDITIVE))
{
*alpha_mode = Proxies::StateProxy::AlphaMode::OneOneMode;
if (bAlphaMode || materialState->SubTexmapOn(ID_OP))
*alpha_mode = Proxies::StateProxy::AlphaMode::AlphaOneMode;
return true;
}
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
if ((Cast_Pointer(StdMat*, sub)->GetTransparencyType() == TRANSP_ADDITIVE))
{
*alpha_mode = Proxies::StateProxy::AlphaMode::OneOneMode;
if (bAlphaMode || materialState->SubTexmapOn(ID_OP))
*alpha_mode = Proxies::StateProxy::AlphaMode::AlphaOneMode;
return true;
}
}
}
if (bAlphaMode || materialState->SubTexmapOn(ID_OP))
{
*alpha_mode = Proxies::StateProxy::AlphaMode::AlphaInvAlphaMode;
return true;
}
*alpha_mode = Proxies::StateProxy::AlphaMode::OneZeroMode;
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetAlpha(Proxies::StateProxy::AlphaMode alpha)
{
Check_Object(this);
Check_Pointer(materialState);
switch (alpha)
{
case Proxies::StateProxy::AlphaMode::OneOneMode:
{
// Set the material to additive
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
if ((Cast_Pointer(StdMat*, materialState)->GetTransparencyType() == TRANSP_ADDITIVE))
{
int x=1;
}
Cast_Pointer(StdMat*, materialState)->SetTransparencyType(TRANSP_ADDITIVE);
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
Cast_Pointer(StdMat*, sub)->SetTransparencyType(TRANSP_ADDITIVE);
}
}
break;
}
case Proxies::StateProxy::AlphaMode::OneZeroMode:
{
//Check_Pointer(textureState);
// Set to texture to AlphaNone
//textureState->SetAlphaSource(ALPHA_NONE);
break;
}
case Proxies::StateProxy::AlphaMode::AlphaInvAlphaMode:
case Proxies::StateProxy::AlphaMode::KeyedAlphaMode:
{
bAlphaMode = true;
//Check_Pointer(materialState);
Texmap *tex = materialState->GetSubTexmap(ID_DI);
if (tex && tex->ClassID() == Class_ID(BMTEX_CLASS_ID,0))
{
BitmapTex *bmtex = (BitmapTex*)tex;
bmtex->SetAlphaAsMono(true);
bmtex->SetAlphaSource(ALPHA_NONE);
}
materialState->SetSubTexmap(ID_OP,tex);
/* materialState->EnableMap(ID_OP, TRUE);
materialState->SetTexmapAmt(ID_OP, 1.f, 0);*/
break;
}
default:
STOP(("SetAlpha, mode not supported"));
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetAlphaChildPermission()
{
Check_Object(this);
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetAlphaChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetFilter(FilterMode *filter_mode)
{
Check_Object(this);
if (materialState)
{
Check_Pointer(materialState);
// TODO: What about multi-texture???
Texmap *texmap = materialState->GetSubTexmap(ID_DI);
if (texmap)
{
Check_Pointer(texmap);
if (texmap->ClassID() == Class_ID(BMTEX_CLASS_ID,0))
{
switch ( ((BitmapTex*)texmap)->GetFilterType())
{
case FILTER_PYR:
{
*filter_mode = Proxies::StateProxy::FilterMode::TriLinearFilterMode;
break;
}
case FILTER_SAT:
{
*filter_mode = Proxies::StateProxy::FilterMode::BiLinearFilterMode;
break;
}
case FILTER_NADA:
{
*filter_mode = Proxies::StateProxy::FilterMode::NoFilterMode;
break;
}
default:
{
STOP(("Invalid Filter Type"));
}
}
// Should let always let decide filter type
return false;
}
}
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetFilter(FilterMode mode)
{
Check_Object(this);
Check_Pointer(materialState);
// TODO: What about multi-texture???
Texmap *texmap = materialState->GetSubTexmap(ID_DI);
if (texmap)
{
Check_Pointer(texmap);
if (texmap->ClassID() == Class_ID(BMTEX_CLASS_ID,0))
{
int filter = 0;
switch ( mode)
{
case Proxies::StateProxy::FilterMode::TriLinearFilterMode:
{
filter = FILTER_PYR;
break;
}
case Proxies::StateProxy::FilterMode::BiLinearFilterMode:
{
filter = FILTER_SAT;
break;
}
case Proxies::StateProxy::FilterMode::NoFilterMode:
{
filter = FILTER_NADA;
break;
}
default:
{
STOP(("Invalid Filter Type"));
}
}
((BitmapTex*)texmap)->SetFilterType(filter);
}
else
{
STOP(("SetFilter: Diffuse Material map must have a bitmap texture"));
}
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetFilterChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetFilterChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetFog(FogMode *fog_on)
{
Check_Object(this);
//
// Art is using self-illumination to prevent lighting, and this automatically turns on fog
// they want to have the option of turning it off explicitely so we are checking for this first
//
// While I'm here I will enable all the values
//
if (meshState)
{
Check_Pointer(meshState);
char *name = meshState->GetName();
TSTR value;
TSTR key="FOGMODESETTING";
if (meshState->GetUserPropString(key,value))
{
bool bValid = false;
if ('0' == value[0])
{
*fog_on = DisableFogMode;
bValid = true;
}
if ('1' == value[0])
{
*fog_on = GeneralFogMode;
bValid = true;
}
if ('2' == value[0])
{
*fog_on = LightFogMode;
bValid = true;
}
if ('3' == value[0])
{
*fog_on = CustomFogMode;
bValid = true;
}
if (bValid)
return true;
}
}
if (materialState)
{
float fval = materialState->GetSelfIllum(0);
if (fval > 0.0f)
{
*fog_on = LightFogMode;
return true;
}
// Check that Self-Illumination is checked
// float fval = 0.0f;
// if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
// {
// fval = Cast_Pointer(StdMat*, materialState)->GetTexmapAmt(ID_SI,0);
// }
//
// if (/*materialState->SubTexmapOn(ID_SI) || */fval > 0.0f)
//
// //if (materialState->SubTexmapOn(ID_SI))
// {
// *fog_on = LightFogMode;
// return true;
// }
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetFog(FogMode mode)
{
/* STOP(("Not Implemented"));
Check_Object(this);
Check_Pointer(materialState);
if (LightFogMode == mode)
{
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
if ((Cast_Pointer(StdMat*, materialState)->GetTransparencyType() == TRANSP_ADDITIVE))
{
int x=1;
}
Cast_Pointer(StdMat*, materialState)->SetTransparencyType(TRANSP_ADDITIVE);
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
Cast_Pointer(StdMat*, sub)->SetTransparencyType(TRANSP_ADDITIVE);
}
}
}*/
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetFogChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetFogChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetDither(bool *dither_on)
{
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetDither(bool)
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetDitherChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetDitherChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetTextureCorrection(bool *correction_on)
{
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetTextureCorrection(bool)
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetTextureCorrectionChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetTextureCorrectionChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetTextureWrap(TextureWrapMode* mode)
{
Check_Object(this);
if (materialState)
{
Check_Pointer(materialState);
Texmap *texmap = materialState->GetSubTexmap(ID_DI);
if (texmap)
{
Check_Pointer(texmap);
UVGen *gen = texmap->GetTheUVGen();
if (gen)
{
Check_Pointer(gen);
int tiling = gen->GetTextureTiling();
if ((tiling & U_WRAP) && (tiling & V_WRAP))
{
*mode = TextureWrap;
return true;
}
else
{
*mode = TextureClamp;
return true;
}
}
}
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetTextureWrap(TextureWrapMode)
{
Check_Object(this);
// TODO: does import need this?
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetTextureWrapChildPermission()
{
Check_Object(this);
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetTextureWrapChildPermission(bool override)
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetWireFrame(WireFrameMode *wireframe_mode)
{
Check_Object(this);
if (NULL == materialState)
return false;
Check_Pointer(materialState);
ULONG mat_requirements = materialState->Requirements(-1);
if (mat_requirements & MTLREQ_WIRE)
{
*wireframe_mode = Proxies::StateProxy::WireFrameMode::WireFrameOnlyMode;
}
else
{
*wireframe_mode = Proxies::StateProxy::WireFrameMode::WireFrameOffMode;
}
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetWireFrame(WireFrameMode mode)
{
Check_Object(this);
Check_Pointer(materialState);
//if (LightFogMode == mode)
{
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
Cast_Pointer(StdMat*, materialState)->SetWire(Proxies::StateProxy::WireFrameMode::WireFrameOnlyMode == mode?true:false);
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
Cast_Pointer(StdMat*, sub)->SetWire(Proxies::StateProxy::WireFrameMode::WireFrameOnlyMode == mode?true:false);
}
}
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetWireFrameChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetWireFrameChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetZBufferCompare(bool *z_compare)
{
Check_Object(this);
if (meshState)
{
Check_Pointer(meshState);
char *name = meshState->GetName();
TSTR value;
TSTR key="ZBUFFERCOMPARE";
if (meshState->GetUserPropString(key,value))
{
bool bValid = false;
if ('1' == value[0])
{
*z_compare = true;
bValid = true;
}
if ('0' == value[0])
{
*z_compare = false;
bValid = true;
}
if (bValid)
return true;
}
}
*z_compare = true;
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetZBufferCompare(bool)
{
Check_Object(this);
//STOP(("SetZBufferCompare Not implemented"));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetZBufferCompareChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetZBufferCompareChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetZBufferWrite(bool *z_write)
{
Check_Object(this);
if (meshState)
{
Check_Pointer(meshState);
char *name = meshState->GetName();
TSTR value;
TSTR key="ZBUFFERWRITE";
if (meshState->GetUserPropString(key,value))
{
bool bValid = false;
if ('1' == value[0])
{
*z_write = true;
bValid = true;
}
if ('0' == value[0])
{
*z_write = false;
bValid = true;
}
if (bValid)
return true;
}
}
if (NULL == materialState)
return false;
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
if ((Cast_Pointer(StdMat*, materialState)->GetTransparencyType() == TRANSP_ADDITIVE))
{
*z_write = false;
return true;
}
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
if ((Cast_Pointer(StdMat*, sub)->GetTransparencyType() == TRANSP_ADDITIVE))
{
*z_write = false;
return true;
}
}
}
*z_write = true;
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetZBufferWrite(bool)
{
Check_Object(this);
//STOP(("SetZBufferWrite Not implemented"));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetZBufferWriteChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetZBufferWriteChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetFlatColoring(bool *flat)
{
Check_Object(this);
*flat = bFlatShaded;
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetFlatColoring(bool flat)
{
bFlatShaded = flat;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetFlatColoringChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetFlatColoringChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetMatTwoSided(bool *onOff)
{
Check_Object(this);
if (NULL == materialState)
return false;
Check_Pointer(materialState);
ULONG mat_requirements = materialState->Requirements(-1);
*onOff = (mat_requirements & MTLREQ_2SIDE)?true:false;
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetMatTwoSided(bool onOff)
{
Check_Object(this);
if (onOff)
{
Check_Pointer(materialState);
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
Cast_Pointer(StdMat*, materialState)->SetTwoSided(true);
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
Cast_Pointer(StdMat*, sub)->SetTwoSided(true);
}
}
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetMatTwoSidedChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetMatTwoSidedChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetBackface(bool *onOff)
{
Check_Object(this);
if (NULL == meshState)
return false;
Check_Pointer(meshState);
*onOff = meshState->GetBackCull()?true:false;
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetBackface(bool onOff)
{
Check_Object(this);
if (NULL == meshState)
return;
Check_Pointer(meshState);
meshState->BackCull(onOff);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetBackfaceChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetBackfaceChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetPriority(int *priority)
{
Check_Object(this);
if (NULL == materialState)
return false;
Check_Pointer(materialState);
if (meshState)
{
Check_Pointer(meshState);
char *name = meshState->GetName();
TSTR value;
TSTR key="PRIORITY";
if (meshState->GetUserPropString(key,value))
{
bool bValid = false;
if (0==stricmp(value,"CagePriority"))
{
*priority = Proxies::StateProxy::CagePriority;
bValid = true;
}
else if (0==stricmp(value,"CageDashPriority"))
{
*priority = Proxies::StateProxy::CageEffectsPriority;
bValid = true;
}
else if (0==stricmp(value,"CageEffectsPriority"))
{
*priority = Proxies::StateProxy::FlarePriority;
bValid = true;
}
else if (0==stricmp(value,"HUDPriority0"))
{
*priority = Proxies::StateProxy::HUDPriority0;
bValid = true;
}
else if (0==stricmp(value,"HUDPriority1"))
{
*priority = Proxies::StateProxy::HUDPriority1;
bValid = true;
}
else if (0==stricmp(value,"HUDPriority2"))
{
*priority = Proxies::StateProxy::HUDPriority2;
bValid = true;
}
else if (0==stricmp(value,"HUDPriority3"))
{
*priority = Proxies::StateProxy::HUDPriority3;
bValid = true;
}
if (bValid)
return true;
}
}
if (0==mipmapHint)
{
mipmapHint=1;
char *name = materialState->GetName();
MAXStateLibrary *max_states = GetStateLibrary();
Check_Object(max_states);
MAXScene *scene = max_states->GetSceneProxy();
Page *page = scene->FindHint(name);
if (page)
{
const char *entry;
if (page->GetEntry("MipMap",&entry))
{
if (strnicmp(entry,"None",4)==0)
{
mipmapHint++;
}
}
}
}
if (mipmapHint)
{
if (mipmapHint>1)
{
*priority = Proxies::StateProxy::DetailPrority;
return true;
}
}
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
if ((Cast_Pointer(StdMat*, materialState)->GetTransparencyType() == TRANSP_ADDITIVE))
{
*priority = Proxies::StateProxy::AlphaPriority;
return true;
}
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
if ((Cast_Pointer(StdMat*, sub)->GetTransparencyType() == TRANSP_ADDITIVE))
{
*priority = Proxies::StateProxy::AlphaPriority;
return true;
}
}
}
if (bAlphaMode || materialState->SubTexmapOn(ID_OP))
{
*priority = Proxies::StateProxy::AlphaPriority;
}
else
{
*priority = Proxies::StateProxy::DefaultPriority;
}
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetPriority(int priority)
{
//STOP(("Not Implemented"));
Check_Object(this);
switch (priority)
{
case Proxies::StateProxy::AlphaPriority:
{
bAlphaMode = true;
break;
}
}
/* if (Proxies::StateProxy::AlphaPriority == priority)
{
// Either set the alphasource to ALPHA_FILE or set the transparency to TRANSP_ADDITIVE
// Set the material to additive
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
if ((Cast_Pointer(StdMat*, materialState)->GetTransparencyType() == TRANSP_ADDITIVE))
{
int x=1;
}
Cast_Pointer(StdMat*, materialState)->SetTransparencyType(TRANSP_ADDITIVE);
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
Cast_Pointer(StdMat*, sub)->SetTransparencyType(TRANSP_ADDITIVE);
}
}
}*/
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetPriorityChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetPriorityChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetLighting(int *lighting_mode)
{
Check_Object(this);
if (NULL == materialState)
return false;
Check_Pointer(materialState);
// float fval = 0.0f;
// if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
// {
// fval = Cast_Pointer(StdMat*, materialState)->GetTexmapAmt(ID_SI,0);
// }
// if (materialState->SubTexmapOn(ID_SI) && (fval > 0.0f))
// {
// *lighting_mode = Proxies::StateProxy::LightingMode::LightingOffMode;
// return true;
// }
float fval = materialState->GetSelfIllum(0);
if (fval > 0.0f)
{
*lighting_mode = Proxies::StateProxy::LightingMode::LightingOffMode;
return true;
}
// *lighting_mode = (materialState->SubTexmapOn(ID_SI))?Proxies::StateProxy::LightingMode::LightingFaceMode
// :Proxies::StateProxy::LightingMode::LightingOffMode;
// return true;
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetLighting(int lighting_mode)
{
Check_Object(this);
/* if (Proxies::StateProxy::LightingMode::LightingOffMode == lighting_mode)
{
// Set the material to additive
if (materialState->ClassID() == Class_ID(DMTL_CLASS_ID,0))
{
if ((Cast_Pointer(StdMat*, materialState)->GetTransparencyType() == TRANSP_ADDITIVE))
{
int x=1;
}
Cast_Pointer(StdMat*, materialState)->SetTransparencyType(TRANSP_ADDITIVE);
}
else if (materialState->ClassID() == Class_ID(MULTI_CLASS_ID,0))
{
int number_sub_materials = materialState->NumSubMtls();
for (int w=0;w<number_sub_materials;w++)
{
Mtl* sub = materialState->GetSubMtl(w);
Cast_Pointer(StdMat*, sub)->SetTransparencyType(TRANSP_ADDITIVE);
}
}
}*/
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetLightingChildPermission()
{
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXState::SetLightingChildPermission(bool override)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Proxies::TextureProxy*
MAXState::UseTextureProxy()
{
Check_Object(this);
//
//--------------------------
// Return the state proxy
//--------------------------
//
Proxies::StateLibrary *states = GetStateLibrary();
Check_Object(states);
MAXStateLibrary *max_states = GetStateLibrary();
Check_Object(max_states);
MAXScene *scene = max_states->GetSceneProxy();
MAXTextureLibrary *library =
Cast_Object(MAXTextureLibrary*, states->GetTextureLibrary());
int textureIndex = scene->bmpList.GetBitmapID(textureState);
if (textureIndex == -1)
return NULL;
MAXTexture *proxy = MAXTexture::MakeProxy(library, scene, textureIndex);
Register_Object(proxy);
//return library->UseTextureProxy(textureIndex);
//return library->UseTextureProxy(textureState);
Proxies::TextureProxy *proxyret = (NULL == materialState)?NULL:library->UseMatchingTextureProxy(proxy);
Unregister_Object(proxy);
proxy->Destroy();
return proxyret;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Proxies::TextureProxy*
MAXState::SetToMatchTextureProxy(Proxies::TextureProxy *texture)
{
Check_Object(this);
Check_Object(texture);
//
//----------------------------------------
// Have the texture library make our proxy
//----------------------------------------
//
Proxies::StateLibrary *state_library = GetStateLibrary();
Proxies::TextureLibrary *texture_library = state_library->GetTextureLibrary();
Proxies::TextureProxy *proxy = texture_library->UseMatchingTextureProxy(texture);
return proxy;
}
#if 0 // was input to fix a bug in the lower level proxies that has since been
// solved "we think"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::IsEqualTo(Proxies::StateProxy *state)
{
Check_Object(this);
Check_Object(state);
if (StateProxy::IsEqualTo(state))
{
bool us = GetAlphaSetting();
MAXState *max_state = Cast_Object(MAXState *, state);
bool them = max_state->GetAlphaSetting();
if (them == us)
return true;
}
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MAXState::GetAlphaSetting()
{
if (textureState)
{
Check_Pointer(textureState);
int alpha_source = textureState->GetAlphaSource();
if (alpha_source == ALPHA_NONE)
return false;
else //if (alpha_source == ALPHA_FILE)
return true;
}
return false;
}
#endif
//
//############################################################################
//############################ MAXStateLibrary #########################
//############################################################################
//
MAXStateLibrary::ClassData*
MAXStateLibrary::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXStateLibrary::InitializeClass()
{
Verify(!DefaultData);
DefaultData =
new ClassData(
MAXStateLibraryClassID,
"MAXStateLibrary",
StateLibrary::DefaultData
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXStateLibrary::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXStateLibrary::Destroy()
{
Check_Object(this);
Verify(referenceCount == 1);
Verify(activeStateProxies.IsEmpty());
STOP(("Not implemented"));
DetachReference();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MAXStateLibrary::MAXStateLibrary(MAXScene *scene):
StateLibrary(DefaultData, scene)
{
Check_Pointer(this);
multiMtl = NULL;
//
//---------------------------------------------------
// Get the number of textures present in the database
//---------------------------------------------------
//
textureLibrary = MAXTextureLibrary::MakeProxy(this);
Register_Object(textureLibrary);
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MAXStateLibrary::~MAXStateLibrary()
{
//TODO: clean up multiMtl
Check_Object(this);
Cast_Object(MAXTextureLibrary*, textureLibrary)->CloseLibrary();
textureLibrary->DetachReference();
Unregister_Object(textureLibrary);
textureLibrary = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXStateLibrary::TestInstance() const
{
Verify(IsDerivedFrom(DefaultData));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Proxies::StateProxy*
MAXStateLibrary::UseMatchingStateProxy(Proxies::StateProxy *state,Proxies::TextureProxy *texture)
{
Check_Object(this);
Check_Object(state);
//
//------------------------------------
// See if this state needs to be added
//------------------------------------
//
if (!texture)
texture = state->UseTextureProxy();
else
{
texture->AttachReference();
Check_Object(texture);
}
if (!texture)
{
// Breakpoint here. Exporting didn't detect that there is no texture
int x=1;
}
MAXProxies::MAXState *our_state = NULL;
ChainIteratorOf< Proxies::StateProxy* > iterator(&activeStateProxies);
Proxies::StateProxy *iterator_state;
int index = 0;
while (iterator_state = iterator.ReadAndNext())
{
our_state = Cast_Object(MAXState *,iterator_state);
//iterator.Next();
if (state->IsEqualTo(our_state))
break;
our_state = NULL;
index++;
}
index = index >> 1;
//index++;
if (!our_state)
{
MAXProxies::MAXScene *scene = GetSceneProxy();
// Create the material and texture
StdMat *mat = NewDefaultStdMat();
scene->mtlList.AddMtl(mat);
// Add this material to the multimaterial object (connected to the node)
int numMat = multiMtl->NumSubMtls();
multiMtl->SetNumSubMtls(numMat+1);
multiMtl->SetSubMtl(numMat,mat);
scene->GetInterface()->GetMaterialLibrary().Add(mat);
static int addtex = 0;
BitmapTex *tex = NULL;
if (texture && addtex)
{
// Get Ready for FPU error here
tex = NewDefaultBitmapTex();
Stuff::MString name;
if (texture->GetName(&name))
{
tex->SetMapName(name+".tga");
}
else
STOP(("UseMatchingStateProxy - could not get texture name"));
if (tex->SupportTexDisplay() == TRUE)
{
tex->SetMtlFlag(MTL_TEX_DISPLAY_ENABLED, TRUE);
tex->ActivateTexDisplay(TRUE);
}
scene->bmpList.AddBitmap(tex);
mat->SetSubTexmap(ID_DI,tex);
}
mat->EnableMap(ID_DI, TRUE);
mat->SetTexmapAmt(ID_DI, 1.f, 0);
if (tex && tex->SupportTexDisplay() == TRUE)
mat->SetMtlFlag(MTL_TEX_DISPLAY_ENABLED, TRUE);
our_state = MAXProxies::MAXState::MakeProxy(this, NULL,mat,tex,0);
// TODO: Use the matching texture proxy to add the texture to the bmp list
MAXCopyProcess process;
our_state->Copy(&process,state);
Register_Object(our_state);
AttachStateProxy(our_state);
}
else
our_state->matID = index;
our_state->AttachReference();
// Set the Material ID - only really used for import
/* if (texture)
texture->DetachReference();*/
return our_state;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MAXStateLibrary::CloseLibrary()
{
Check_Object(this);
Verify(GetReferenceCount() == 1);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MAXState*
MAXStateLibrary::UseStateProxy(
Mtl *material,
BitmapTex *texture,
INode *mesh,
int indice
)
{
Check_Object(this);
//
//--------------------------------------------
// Look up the material and make a state proxy
//--------------------------------------------
//
MAXState *proxy =
MAXState::MakeProxy(this, mesh, material, texture, indice);
Register_Object(proxy);
return proxy;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MultiMtl *MAXStateLibrary::GetMultiMtl()
{
if (!multiMtl)
{
multiMtl = NewDefaultMultiMtl();
multiMtl->SetName("Mesh Materials");
multiMtl->SetNumSubMtls(0);
MAXProxies::MAXScene *scene = GetSceneProxy();
scene->GetInterface()->GetMaterialLibrary().Add(multiMtl);
}
return multiMtl;
}
void
MAXStateLibrary::CalculateMaxState(
MAXState *state,
Proxies::StateProxy *proxy,
Proxies::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();
}
//
//---------------------
// Deal with the states
//---------------------
//
bool permission, onOff;
Proxies::StateProxy::AlphaMode alphaMode;
if(proxy->GetAlpha(&alphaMode))
{
state->SetAlpha(alphaMode);
}
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
);
}
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);
}
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();
}*/
}