Files
firestorm/Gameleap/code/mw4/Code/MW4/GUILightAmp.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

348 lines
8.2 KiB
C++

#include "MW4Headers.hpp"
#include "GUILightAmp.hpp"
#include <ElementRenderer\StateChange.hpp>
#include <ElementRenderer\ScreenQuadsElement.hpp>
#include <ElementRenderer\CameraElement.hpp>
#include <MLR\MLRTexture.hpp>
#include <MLR\MLRTexturePool.hpp>
using MidLevelRenderer::MLRTexturePool;
using MidLevelRenderer::MLRTexture;
//ElementRenderer::CameraElement *GUILightAmp::s_Camera = NULL;
//bool GUILightAmp::s_MarkForAttach = false;
//#######################################################################
//########################### GUIWeaponManager #####################
//#######################################################################
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUILightAmp::GUILightAmp() :
Plug(Plug::DefaultData),
m_screenTiles(NULL),
s_Camera(NULL)
{
s_MarkForAttach = false;
m_CurrentMod = 0;
m_numTiles = 0;
isShown = false;
m_LastScreenX = 0;
m_LastScreenY = 0;
ChangeResolution();
Hide();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
GUILightAmp::~GUILightAmp()
{
if(m_screenTiles.GetCurrent())
{
delete m_screenTiles.GetCurrent();
m_screenTiles.Remove();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUILightAmp::Initialize()
{
Check_Object(this);
s_MarkForAttach = false;
m_numTiles = 0;
isShown = false;
ChangeResolution();
Hide();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void GUILightAmp::SetModifier (Stuff::Scalar mod)
{
m_CurrentMod = mod;
SetupTiles ();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void GUILightAmp::SetupTiles (void)
{
Scalar left,right;
Scalar top;
left = m_CurrentMod * 16.0f;
left = (Scalar) floor (left);
Clamp (left,0,15);
right = left + 1;
left *= 0.0625f;
right *= 0.0625f;
top = 0;
Scalar TOffset=gos_GetMachineInformation(gos_Info_TextureOffset) ? 0.0f : 0.5f;
for(int i=0; i<m_numTiles; i++,top+=256.0f)
{
//Pointers into the screen quad
Vector4D *poly_corners;
RGBAColor *poly_colors;
Vector2DOf<Scalar> *poly_UVs;
bool *poly_status;
Vector4D corners[4];
RGBAColor colors[4];
Vector2DOf<Scalar> UVs[4];
m_screenTiles.GetCurrent()->GetQuadData(
i,
&poly_corners,
&poly_colors,
&poly_UVs,
&poly_status
);
colors[0].red = colors[1].red = colors[2].red = colors[3].red = 1.0f;
colors[0].green = colors[1].green = colors[2].green = colors[3].green = 1.0f;
colors[0].blue = colors[1].blue = colors[2].blue = colors[3].blue = 1.0f;
colors[0].alpha = colors[1].alpha = colors[2].alpha = colors[3].alpha = 1.0f;
Mem_Copy(poly_colors, colors, 4 * sizeof(RGBAColor), 4 * sizeof(RGBAColor));
UVs[0].x = left;
UVs[0].y = 0.0f;
UVs[1].x = right;
UVs[1].y = 0.0f;
UVs[2].x = right;
if((i + 1) <m_numTiles)
UVs[2].y = 1.0f;
else
UVs[2].y = m_Left_Over / 256.0f;
UVs[3].x = left;
UVs[3].y = UVs[2].y;
if( 0.0f==TOffset )
{
float TexOffset=0.0625f/256.0f; // 0.0625/texture size.
UVs[0].x +=TexOffset;
UVs[0].y +=TexOffset;
UVs[1].x +=TexOffset;
UVs[1].y +=TexOffset;
UVs[2].x +=TexOffset;
UVs[2].y +=TexOffset;
UVs[3].x +=TexOffset;
UVs[3].y +=TexOffset;
}
Mem_Copy(poly_UVs, UVs, 4 * sizeof(Vector2DOf<Scalar>), 4 * sizeof(Vector2DOf<Scalar>));
corners[0].x = 0.0f;
if(i > 0)
corners[0].y = ((top-TOffset) / Environment.screenHeight);
else
corners[0].y = 0.0f;
corners[1].x = 1.0f;
corners[1].y = corners[0].y;
corners[2].x = 1.0f;
if((i + 1) <m_numTiles)
corners[2].y = ((top+256.0f-TOffset) / Environment.screenHeight);
else
corners[2].y = 1.0f;
corners[3].x = 0.0f;
corners[3].y = corners[2].y;
corners[0].z = 0.0f;
corners[0].w = 1.0f;
corners[1].z = 0.0f;
corners[1].w = 1.0f;
corners[2].z = 0.0f;
corners[2].w = 1.0f;
corners[3].z = 0.0f;
corners[3].w = 1.0f;
Mem_Copy(poly_corners, corners, 4 * sizeof(Vector4D), 4 * sizeof(Vector4D));
*poly_status = IsOn();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void GUILightAmp::NewVehicle()
{
m_LastScreenX = 0;
m_LastScreenY = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void GUILightAmp::ChangeResolution()
{
Check_Object(this);
if ((m_LastScreenX == Environment.screenWidth) && (m_LastScreenY == Environment.screenHeight))
return;
m_LastScreenX = Environment.screenWidth;
m_LastScreenY = Environment.screenHeight;
if(m_screenTiles.GetCurrent())
{
delete m_screenTiles.GetCurrent();
m_screenTiles.Remove();
}
Scalar ratio = 255.0f / Environment.screenHeight;
int left_over = Environment.screenHeight % 256;
m_Ratio = ratio;
m_numTiles = (Environment.screenHeight / 256) + 1;
m_Left_Over = (left_over);//+m_numTiles-1);
if (m_Left_Over >= 256)
{
m_Left_Over -= 256;
m_numTiles++;
}
gos_PushCurrentHeap(ElementRenderer::ScreenQuadsElement::s_Heap);
ElementRenderer::ScreenQuadsElement *screen_tiles = new ElementRenderer::ScreenQuadsElement(m_numTiles);
m_screenTiles.Add(screen_tiles);
gos_PopCurrentHeap();
SetupTiles ();
ElementRenderer::StateChange *state_change = new ElementRenderer::StateChange();
Check_Object(MLRTexturePool::Instance);
MLRTexture *quad_texture = (*MLRTexturePool::Instance)("LI", 0);
if(!quad_texture)
{
quad_texture = MLRTexturePool::Instance->Add("LI", 0);
}
Check_Object(quad_texture);
state_change->SetTextureHandle(quad_texture->GetTextureHandle());
// state_change->SetAlphaMode(ElementRenderer::StateChange::AlphaInvAlphaMode);
// state_change->SetAlphaMode(MidLevelRenderer::MLRState::OneOneMode);
state_change->SetAlphaMode(MidLevelRenderer::MLRState::OneInvAlphaMode);
state_change->SetRenderPriority(ElementRenderer::StateChange::HUDPriority0);
state_change->DisableBackfaceCulling();
state_change->DisableChildBackfaceControl();
state_change->SetFogMode(ElementRenderer::StateChange::DisableFogMode);
state_change->DisableChildFogControl();
state_change->DisableZBufferWrite();
state_change->DisableChildZBufferWriteControl();
state_change->DisableZBufferCompare();
state_change->DisableChildZBufferCompareControl();
state_change->DisableTextureWrap();
state_change->DisableChildTextureWrapControl();
state_change->DisableChildFilterControl ();
state_change->SetFilterMode (MidLevelRenderer::MLRStateBase::NoFilterMode);
screen_tiles->AdoptStateChange(state_change);
if(s_Camera.GetCurrent() && m_screenTiles.GetCurrent ())
{
s_Camera.GetCurrent()->AttachChild(m_screenTiles.GetCurrent());
m_screenTiles.GetCurrent()->Sync();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUILightAmp::Hide()
{
Check_Object(this);
for(int i=0; i<m_numTiles; i++)
{
if (m_screenTiles.GetCurrent ())
{
m_screenTiles.GetCurrent()->SetQuadStatus(i, false);
}
}
isShown = false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUILightAmp::Show()
{
Check_Object(this);
if (!m_screenTiles.GetCurrent ())
{
ChangeResolution ();
}
if (m_screenTiles.GetCurrent ())
{
for(int i=0; i<m_numTiles; i++)
{
m_screenTiles.GetCurrent()->SetQuadStatus(i, true);
}
if(s_MarkForAttach)
{
s_Camera.GetCurrent()->AttachChild(m_screenTiles.GetCurrent());
m_screenTiles.GetCurrent()->Sync();
s_MarkForAttach = false;
}
}
isShown = true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUILightAmp::AdoptCamera(ElementRenderer::CameraElement *camera)
{
Check_Pointer(camera);
if (s_Camera.GetCurrent())
{
Verify (s_Camera.GetCurrent () == camera);
return;
}
s_Camera.Add(camera);
s_MarkForAttach = true;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
GUILightAmp::RemoveCamera()
{
if (s_Camera.GetCurrent())
{
s_Camera.Remove();
}
s_MarkForAttach = false;
}