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

246 lines
7.3 KiB
C++

#include "ElementProxyHeaders.hpp"
#include <MLR\MLRTexture.hpp>
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ApplyDetailTexturesProcess::ApplyDetailTexturesProcess(
Stuff::NotationFile *tron_file
)
{
tronFile = tron_file;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ApplyDetailTexturesProcess::ApplyDetailTexturesProcess(
Stuff::NotationFile *tron_file,
Stuff::NotationFile *config_file
):
Process(config_file)
{
tronFile = tron_file;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ApplyDetailTexturesProcess::~ApplyDetailTexturesProcess()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
ElementPolygonMeshProxy::ApplyDetailTextures(ApplyDetailTexturesProcess *process)
{
Check_Object(this);
Check_Object(process);
//
//------------------------------------------------------------
// Make sure that the process says its OK to check the texture
//------------------------------------------------------------
//
process->ApplyDetailTexturesCallback(this);
if (!process->continueProcess)
return;
//
//------------------------------------------------------------------------
// Get the state arrays for this mesh and make sure that they have already
// been split
//------------------------------------------------------------------------
//
DynamicArrayOf<PolygonProxy*> polygons;
unsigned polygon_count = UsePolygonArray(&polygons);
if (!polygon_count)
return;
DynamicArrayOf<MultiState*> states;
DynamicArrayOf<unsigned> index;
DynamicArrayOf<unsigned> count;
#if defined(_ARMOR)
unsigned unique_states =
#endif
UseMultiStateArray(&states, &index, &count, polygons);
Verify(unique_states==1 && count[0]==polygon_count);
//
//----------------------------------------------------------------------
// If this mesh is not textured, we can just return. Otherwise, get the
// texture name and size
//----------------------------------------------------------------------
//
Check_Object(states[0]);
unsigned state_count = states[0]->GetLength();
Check_Object(process->tronFile);
for(unsigned state_loop=0;state_loop<state_count;++state_loop)
{
TextureProxy *texture = (*states[0])[state_loop]->UseTextureProxy();
if (!texture)
break;
MString name;
texture->GetName(&name);
Vector2DOf<int> texture_size;
texture->GetImageSize(&texture_size);
texture->DetachReference();
//
//---------------------------------------------------------------------
// See if there is a detail texture for this texture. If so, parse the
// info
//---------------------------------------------------------------------
//
const char *detail_info = NULL;
Page *page = process->tronFile->FindPage(name);
if (!page)
continue;
if (!page->GetEntry("DetailTexture", &detail_info))
continue;
Check_Pointer(detail_info);
char detail_name[80];
Vector2DOf<Scalar>
detail_offset,
detail_scale;
#if defined(_ARMOR)
int count =
#endif
sscanf(
detail_info,
"%s %f %f %f %f",
detail_name,
&detail_offset.x,
&detail_offset.y,
&detail_scale.x,
&detail_scale.y
);
Verify(count == 5);
Verify(strlen(detail_name)>0);
//
//-----------------------------------------------------------------------
// Now, get the detail tron from the library. If it isn't already there,
// an empty one will be created
//-----------------------------------------------------------------------
//
SceneProxy *scene = GetSceneProxy();
Check_Object(scene);
StateLibrary *state_library = scene->GetStateLibrary();
Check_Object(state_library);
TextureLibrary *textures = state_library->GetTextureLibrary();
Check_Object(textures);
texture = textures->UseTextureProxy(detail_name);
Check_Object(texture);
MLRTexture *mlr_texture =
Cast_Object(MLRTextureProxy*, texture)->GetMLRTexture();
Check_Object(mlr_texture);
int detail_handle = mlr_texture->GetTextureHandle();
//
//------------------------------------------------
// Loop over the primitives within the shape proxy
//------------------------------------------------
//
unsigned i;
unsigned primitive_count = primitiveArray.GetLength();
for (i=0; i<primitive_count; ++i)
{
MLR_I_PMesh *primitive = primitiveArray[i];
Check_Object(primitive);
//
//--------------------------------------------------------------------
// Create the detail state from the primitive state and detail texture
//--------------------------------------------------------------------
//
MLRState detail_state = primitive->GetReferenceState();
detail_state.SetTextureHandle(detail_handle);
detail_state.SetAlphaMode(MLRState::OneOneMode);
detail_state.SetPriority(detail_state.GetPriority()+1);
//
//----------------------------------------------------------------
// Determine the type of primitive (non-colored, colored, and lit)
//----------------------------------------------------------------
//
STOP(("Not implemented"));
//
//-----------------------------------------------------------------
// Create a new detail primitive out of the primitive given the new
// state and offset parameters
//-----------------------------------------------------------------
//
STOP(("Not implemented"));
//
//----------------------------------------
// Replace the old primitive with this one
//----------------------------------------
//
STOP(("Not implemented"));
}
//
//------------------------------------
// Clean up and move to the next state
//------------------------------------
//
texture->DetachReference();
}
DetachArrayReferences(&states);
DetachArrayReferences(&polygons);
SetToMatchMultiState(states[0]);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
ElementSceneProxy::ApplyDetailTextures(ApplyDetailTexturesProcess *process)
{
Check_Object(this);
Check_Object(process);
//
//---------------------------------------
// Make sure that the process says its OK
//---------------------------------------
//
process->ApplyDetailTexturesCallback(this);
if (!process->continueProcess)
return;
//
//--------------------------------------------------------------------
// Apply details to all the children. At this point, they must all be
// flattened
//--------------------------------------------------------------------
//
unsigned child_count = GetChildCount();
ChildProxy *child = UseFirstChildProxy();
for (unsigned i=0; i<child_count; ++i)
{
Check_Object(child);
ChildProxy *next = child->UseNextSiblingProxy();
ElementPolygonMeshProxy *mesh =
Cast_Object(ElementPolygonMeshProxy*, child);
mesh->ApplyDetailTextures(process);
child->DetachReference();
child = next;
if (!process->continueProcess)
{
if (child)
child->DetachReference();
break;
}
}
//
//-------------------------------------------
// Make sure to discard any remaining proxies
//-------------------------------------------
//
if (child)
child->DetachReference();
}