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

321 lines
8.2 KiB
C++

#include "MLRHeaders.hpp"
#if !defined(MLR_MLRCLIPTRICK_HPP)
#include <MLR\MLRClipTrick.hpp>
#endif
#if !defined(MLR_MLRSPRITECLOUD_HPP)
#include <MLR\MLRSpriteCloud.hpp>
#endif
extern DWORD gShowClippedPolys;
//#############################################################################
//#################### MLRSpriteCloud ##########################
//#############################################################################
MLRSpriteCloud::ClassData*
MLRSpriteCloud::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRSpriteCloud::InitializeClass()
{
Verify(!DefaultData);
Verify(gos_GetCurrentHeap() == StaticHeap);
DefaultData =
new ClassData(
MLRSpriteCloudClassID,
"MidLevelRenderer::MLRSpriteCloud",
MLRPointCloud::DefaultData
);
Register_Object(DefaultData);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRSpriteCloud::TerminateClass()
{
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRSpriteCloud::MLRSpriteCloud(int nr) :
MLRPointCloud(nr)
{
Verify(gos_GetCurrentHeap() == EffectHeap);
usedNrOfVertices = NULL;
Check_Pointer(this);
drawMode = SortData::TriList;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRSpriteCloud::~MLRSpriteCloud()
{
Check_Object(this);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRSpriteCloud::SetData
(
const int *count,
const Stuff::Point3D *point_data,
const Stuff::RGBAColor *color_data,
const Stuff::Scalar *scale_data,
const Vector2DScalar *uv_data // only 4, regardless count !
)
{
Check_Pointer(this);
usedNrOfVertices = count;
points = point_data;
colors = color_data;
scales = scale_data;
texCoords = uv_data;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRSpriteCloud::Draw (DrawEffectInformation *dInfo, GOSVertexPool *allVerticesToDraw, MLRSorter *sorter)
{
Check_Object(this);
#ifdef LAB_ONLY
if(Limits::Max_Number_Vertices_Per_Frame < allVerticesToDraw->GetLast() + *usedNrOfVertices * 4)
{
SPEWALWAYS((0, "Not drawing MLRSpriteCloud. Too many vertices! Raid a bug to Art!"));
return;
}
#endif
worldToEffect.Invert(*dInfo->effectToWorld);
Transform(*usedNrOfVertices, 1);
if( Clip(dInfo->clippingFlags, allVerticesToDraw, false ) )
{
sorter->AddEffect(this, dInfo->state);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
MLRSpriteCloud::Draw (ToBeDrawnPrimitive *tbdp, MLRSorter *sorter)
{
Check_Object(this);
effectToClipMatrix = tbdp->shapeToClipMatrix;
Transform(*usedNrOfVertices, 1);
int index = -1;
if( Clip(tbdp->clippingFlags, tbdp->allVerticesToDraw, true ) )
{
sorter->AddEffect(this, tbdp->state, index);
}
return index;
}
static MLRClippingState theAnd, theOr, theTest;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int
MLRSpriteCloud::Clip(MLRClippingState clippingFlags, GOSVertexPool *vt, bool db)
{
//--------------------------------------
// See if we don't have to draw anything
//--------------------------------------
//
int i;
numGOSVertices = 0;
if(usedNrOfVertices <= 0)
{
return 0;
}
Check_Object(vt);
gos_vertices = vt->GetActualVertexPool(db);
Stuff::Vector4D *v4d = transformedCoords->GetData();
Vector4D tempVertex;
for(i=0;i<*usedNrOfVertices;i++,v4d++)
{
if(IsOn(i) == false)
{
continue;
}
if(clippingFlags.GetClippingState() != 0)
{
if( clippingFlags.IsFarClipped() && v4d->w < v4d->z)
{
continue;
}
if( clippingFlags.IsNearClipped() && v4d->z < 0.0f)
{
continue;
}
if( clippingFlags.IsRightClipped() && v4d->x < 0.0f)
{
continue;
}
if( clippingFlags.IsLeftClipped() && v4d->w < v4d->x)
{
continue;
}
if( clippingFlags.IsBottomClipped() && v4d->y < 0.0f)
{
continue;
}
if(clippingFlags.IsTopClipped() && v4d->w < v4d->y)
{
continue;
}
}
tempVertex.w = 1.0f/v4d->w;
tempVertex.x = v4d->x * tempVertex.w;
tempVertex.y = v4d->y * tempVertex.w;
tempVertex.z = v4d->z * tempVertex.w;
tempVertex.x = tempVertex.x*ViewportScalars::MulX + ViewportScalars::AddX;
tempVertex.y = tempVertex.y*ViewportScalars::MulY + ViewportScalars::AddY;
if( tempVertex.x + scales[i] >= Environment.screenWidth )
{
continue;
}
if( tempVertex.x < scales[i])
{
continue;
}
if( tempVertex.y + scales[i] >= Environment.screenHeight )
{
continue;
}
if( tempVertex.y < scales[i])
{
continue;
}
DWORD color;
#ifdef I_SAY_YES_TO_COLOR
#ifdef I_SAY_YES_TO_DWORD_COLOR
color = colors!=NULL ? colors[i] : paintMeColorDW;
#else // I_SAY_YES_TO_DWORD_COLOR
color = GOSCopyColor(colors!=NULL ? (&colors[i]) : (&paintMeColorF) );
#endif // I_SAY_YES_TO_DWORD_COLOR
#else // I_SAY_YES_TO_COLOR
color = paintMeColorDW;
#endif // I_SAY_YES_TO_COLOR
Scalar s = scales[i];
gos_vertices[numGOSVertices].x = tempVertex.x - s;
gos_vertices[numGOSVertices].y = tempVertex.y - s;
gos_vertices[numGOSVertices].z = tempVertex.z;
gos_vertices[numGOSVertices].rhw = tempVertex.w;
gos_vertices[numGOSVertices].argb = color;
*((BYTE *)&gos_vertices[numGOSVertices].frgb + 3) = 0xff;
gos_vertices[numGOSVertices].u = texCoords[0][0];
gos_vertices[numGOSVertices].v = texCoords[0][1];
numGOSVertices++;
gos_vertices[numGOSVertices].x = tempVertex.x - s;
gos_vertices[numGOSVertices].y = tempVertex.y + s;
gos_vertices[numGOSVertices].z = tempVertex.z;
gos_vertices[numGOSVertices].rhw = tempVertex.w;
gos_vertices[numGOSVertices].argb = color;
*((BYTE *)&gos_vertices[numGOSVertices].frgb + 3) = 0xff;
gos_vertices[numGOSVertices].u = texCoords[1][0];
gos_vertices[numGOSVertices].v = texCoords[1][1];
numGOSVertices++;
gos_vertices[numGOSVertices].x = tempVertex.x + s;
gos_vertices[numGOSVertices].y = tempVertex.y + s;
gos_vertices[numGOSVertices].z = tempVertex.z;
gos_vertices[numGOSVertices].rhw = tempVertex.w;
gos_vertices[numGOSVertices].argb = color;
*((BYTE *)&gos_vertices[numGOSVertices].frgb + 3) = 0xff;
gos_vertices[numGOSVertices].u = texCoords[2][0];
gos_vertices[numGOSVertices].v = texCoords[2][1];
numGOSVertices++;
gos_vertices[numGOSVertices].x = tempVertex.x - s;
gos_vertices[numGOSVertices].y = tempVertex.y - s;
gos_vertices[numGOSVertices].z = tempVertex.z;
gos_vertices[numGOSVertices].rhw = tempVertex.w;
gos_vertices[numGOSVertices].argb = color;
*((BYTE *)&gos_vertices[numGOSVertices].frgb + 3) = 0xff;
gos_vertices[numGOSVertices].u = texCoords[0][0];
gos_vertices[numGOSVertices].v = texCoords[0][1];
numGOSVertices++;
gos_vertices[numGOSVertices].x = tempVertex.x + s;
gos_vertices[numGOSVertices].y = tempVertex.y + s;
gos_vertices[numGOSVertices].z = tempVertex.z;
gos_vertices[numGOSVertices].rhw = tempVertex.w;
gos_vertices[numGOSVertices].argb = color;
*((BYTE *)&gos_vertices[numGOSVertices].frgb + 3) = 0xff;
gos_vertices[numGOSVertices].u = texCoords[2][0];
gos_vertices[numGOSVertices].v = texCoords[2][1];
numGOSVertices++;
gos_vertices[numGOSVertices].x = tempVertex.x + s;
gos_vertices[numGOSVertices].y = tempVertex.y - s;
gos_vertices[numGOSVertices].z = tempVertex.z;
gos_vertices[numGOSVertices].rhw = tempVertex.w;
gos_vertices[numGOSVertices].argb = color;
*((BYTE *)&gos_vertices[numGOSVertices].frgb + 3) = 0xff;
gos_vertices[numGOSVertices].u = texCoords[3][0];
gos_vertices[numGOSVertices].v = texCoords[3][1];
numGOSVertices++;
}
if(db==false)
{
vt->Increase(numGOSVertices);
}
visible = numGOSVertices ? 1 : 0;
return visible;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRSpriteCloud::TestInstance() const
{
if (usedNrOfVertices)
{
Verify(*usedNrOfVertices >= 0);
Verify(*usedNrOfVertices <= maxNrOf);
}
}