Files
firestorm/Gameleap/code/mw4/Tools/Max43DSPlugins/Proxies/FlattenHierarchy.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

219 lines
5.7 KiB
C++

#include "ProxyHeaders.hpp"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
ChildProxy::FlattenHierarchy(FlattenHierarchyProcess *process)
{
Check_Object(this);
Check_Object(process);
//
//------------------------------------------------------------
// Make sure that the process says its OK to check the texture
//------------------------------------------------------------
//
process->FlattenHierarchyCallback(this);
//
//-----------------------------------------------
// Tell whoever called us to detach the reference
//-----------------------------------------------
//
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
GroupProxy::FlattenHierarchy(FlattenHierarchyProcess *process)
{
Check_Object(this);
Check_Object(process);
//
//------------------------------------------------------------
// Make sure that the process says its OK to check the texture
//------------------------------------------------------------
//
process->FlattenHierarchyCallback(this);
if (!process->continueProcess)
return true;
//
//---------------------------------------------------------------------
// If this is not the parent group, move the group's children up to the
// parent then destroy the proxy
//---------------------------------------------------------------------
//
if (this != process->parentGroup)
{
LinearMatrix4D matrix;
bool push = GetLocalToParent(&matrix);
ChildProxy *child = UseFirstChildProxy();
while (child)
{
Check_Object(child);
ChildProxy *next = child->UseNextSiblingProxy();
if (push)
child->TransformLocalToParent(matrix);
if (child->FlattenHierarchy(process))
child->DetachReference();
child = next;
if (!process->continueProcess)
{
if (child)
child->DetachReference();
break;
}
}
Destroy();
return false;
}
//
//-------------------------------------------------------------------------
// This is the parent group, so just call flatten hierarchy on the children
//-------------------------------------------------------------------------
//
unsigned child_count = GetChildCount();
ChildProxy *child = UseFirstChildProxy();
for (unsigned i=0; i<child_count; ++i)
{
Check_Object(child);
ChildProxy *next = child->UseNextSiblingProxy();
if (child->FlattenHierarchy(process))
child->DetachReference();
child = next;
if (!process->continueProcess)
{
if (child)
{
child->DetachReference();
}
break;
}
}
//
//-------------------------------------------
// Make sure to discard any remaining proxies
//-------------------------------------------
//
if (child)
child->DetachReference();
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
PolygonMeshProxy::FlattenHierarchy(FlattenHierarchyProcess *process)
{
Check_Object(this);
Check_Object(process);
//
//------------------------------------------------------------
// Make sure that the process says its OK to check the texture
//------------------------------------------------------------
//
process->FlattenHierarchyCallback(this);
if (!process->continueProcess)
return true;
//
//-------------------------------
// Transfer the mesh to the scene
//-------------------------------
//
TransferAndAppendToParentGroup(process->parentGroup);
//
//----------------------------------------------------------------------
// Adjust all the vertices so they are correct for an identity transform
//----------------------------------------------------------------------
//
LinearMatrix4D matrix;
GetLocalToParent(&matrix);
SetLocalToParent(LinearMatrix4D::Identity);
DynamicArrayOf<VertexProxy*> vertices;
unsigned vertex_count = UseVertexArray(&vertices);
for (unsigned i=0; i<vertex_count; ++i)
{
VertexProxy *vertex = vertices[i];
Check_Object(vertex);
Point3D old_position;
vertex->GetPosition(&old_position);
Point3D new_position;
new_position.Multiply(old_position, matrix);
vertex->SetPosition(new_position);
Normal3D old_normal;
if(vertex->GetNormal(&old_normal))
{
Normal3D new_normal;
new_normal.Multiply(old_normal, matrix);
vertex->SetNormal(new_normal);
}
}
DetachArrayReferences(&vertices);
//
//-----------------------------------------------
// Tell whoever called us to detach the reference
//-----------------------------------------------
//
return true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
SceneProxy::FlattenHierarchy(FlattenHierarchyProcess *process)
{
Check_Object(this);
Check_Object(process);
Verify(!process->parentGroup);
//
//---------------------------------------
// Make sure that the process says its OK
//---------------------------------------
//
process->FlattenHierarchyCallback(this);
if (!process->continueProcess)
return;
//
//---------------------
// Flatten the children
//---------------------
//
unsigned child_count = GetChildCount();
ChildProxy *child = UseFirstChildProxy();
for (unsigned i=0; i<child_count; ++i)
{
Check_Object(child);
ChildProxy *next = child->UseNextSiblingProxy();
if (child->FlattenHierarchy(process))
child->DetachReference();
child = next;
if (!process->continueProcess)
{
if (child)
{
child->DetachReference();
}
break;
}
}
//
//-------------------------------------------
// Make sure to discard any remaining proxies
//-------------------------------------------
//
if (child)
child->DetachReference();
}