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

343 lines
9.5 KiB
C++

//===========================================================================//
// File: ScreenPolyManager.cpp //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- -----------------------------------------------------------//
// 07/21/98 DPB File Creation //
//---------------------------------------------------------------------------//
// Copyright (C) 1994-1995, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#include "AdeptHeaders.hpp"
#include "ScreenPolyManager.hpp"
#include <ElementRenderer\StateChange.hpp>
#include <MLR\MLRTexture.hpp>
#include <MLR\MLRTexturePool.hpp>
using namespace ElementRenderer;
using namespace MidLevelRenderer;
//#############################################################################
//######################## ScreenPolyManager ############################
//#############################################################################
ScreenPolyManager
*ScreenPolyManager::Instance = NULL;
ScreenPolyManager::ClassData*
ScreenPolyManager::DefaultData = NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
ScreenPolyManager::InitializeClass()
{
Verify(!DefaultData);
DefaultData =
new ClassData(
ScreenPolyManagerClassID,
"Adept::ScreenPolyManager",
Node::DefaultData
);
Register_Object(DefaultData);
ScreenPolyManager::Instance = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
ScreenPolyManager::TerminateClass()
{
if (ScreenPolyManager::Instance)
{
Unregister_Object(ScreenPolyManager::Instance);
delete ScreenPolyManager::Instance;
}
Unregister_Object(DefaultData);
delete DefaultData;
DefaultData = NULL;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ScreenPolyManager::ScreenPolyManager():
Node(DefaultData),
polyGroupSocket(NULL, false)
{
nextGroup = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
ScreenPolyManager::~ScreenPolyManager()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
ScreenPolyManager::AdoptCamera(CameraElement *camera)
{
Check_Object(this);
Check_Object(camera);
Camera = camera;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MString
ScreenPolyManager::CreateScreenPoly(
int *polyIndex,
Vector4D **corners,
RGBAColor **colors,
Vector2DOf<Scalar> **uvs,
bool **status,
int priority_level,
MString texture_name,
MString alpha_name)
{
Check_Object(this);
//This function has to do a ton of shit!
//First
//Create a StateSwitch based upon the parameters
StateChange *quad_state = new StateChange();
Register_Object(quad_state);
StateChange::RenderPass level;
level = (StateChange::RenderPass)priority_level;
level = (StateChange::RenderPass)(level + StateChange::PostPass1);
quad_state->SetRenderPass(level);
Check_Object(MLRTexturePool::Instance);
// change later to the right image instances !!!
if(strcmp(texture_name, "None"))
{
MLRTexture *quad_texture = (*MLRTexturePool::Instance)(texture_name, 0);
if(!quad_texture)
{
quad_texture = MLRTexturePool::Instance->Add(texture_name, 0);
}
Check_Object(quad_texture);
quad_state->SetTextureHandle(quad_texture->GetTextureHandle());
}
//Sets for all Screen Quads elements
if(!strcmp(alpha_name, "AlphaInvAlphaMode"))
{
quad_state->SetAlphaMode(StateChange::AlphaInvAlphaMode);
}
else if(!strcmp(alpha_name, "AlphaOneMode"))
{
quad_state->SetAlphaMode(StateChange::AlphaOneMode);
}
quad_state->DisableDithering();
quad_state->DisableBackfaceCulling();
quad_state->SetFilterMode(StateChange::PointSampleMode);
quad_state->DisableFog();
quad_state->SetLightingMode(StateChange::NoLightingMode);
quad_state->DisablePerspectiveCorrection();
quad_state->SetWireFrameMode(StateChange::SolidMode);
quad_state->DisableZBufferWrite();
quad_state->DisableZBufferCompare();
//Second
//Run through the group list to find a poly group that
//has the same state.
SortedChainIteratorOf<ScreenQuadsElement *, MString> iterator(&polyGroupSocket);
iterator.First();
ScreenQuadsElement *quad_group;
ScreenQuadsElement *found_group = NULL;
bool found = false;
while((!found) && ((quad_group = iterator.ReadAndNext()) != NULL))
{
Check_Pointer(quad_group);
found = true;
//Check the group state with the quad_state
if(quad_state->GetRenderPass() != quad_group->GetStateChange()->GetRenderPass())
{
found = false;
}
if(quad_state->GetTextureHandle() != quad_group->GetStateChange()->GetTextureHandle())
{
found = false;
}
found_group = quad_group;
}
//Third
//If a group with an identical StateSwitch is found then
//get the next available index from the group and set the
//pointers
if(found)
{
bool poly_found = false;
int index = 0;
while(!poly_found)
{
found_group->GetQuadData(index, corners, colors, uvs, status);
if(*(*status) == false)
{
poly_found = true;
}
index++;
}
*(*status) = true;
}
//If the group is not found then a new group with using the
//current state must be created and added to the chain. Returning
//0 as the index a the pointers must be set.
else
{
ScreenQuadsElement *new_quad;
new_quad = new ScreenQuadsElement(20);
Register_Object(new_quad);
new_quad->AdoptStateChange(quad_state);
new_quad->SetName(texture_name);
Check_Object(Camera);
Camera->AttachChild(new_quad);
new_quad->Sync();
polyGroupSocket.AddValue(new_quad, texture_name);
new_quad->GetQuadData(0, corners, colors, uvs, status);
*(*status) = true;
}
//Set the status in the current group of the poly with the given
//index
return texture_name;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MString
ScreenPolyManager::CreateTextString(
int str_len,
char *string_text,
Vector4D **text_corners,
RGBAColor **text_colors,
Vector2DOf<Scalar> **text_uvs,
bool **text_status,
int priority_level,
MString string_texture)
{
Check_Object(this);
//This function has to do a ton of shit!
//First
//Create a StateSwitch based upon the parameters
StateChange *quad_state = new StateChange();
Register_Object(quad_state);
StateChange::RenderPass level;
level = (StateChange::RenderPass)priority_level;
level = (StateChange::RenderPass)(level + StateChange::PostPass1);
quad_state->SetRenderPass(level);
Check_Object(MLRTexturePool::Instance);
// change later to the right image instances !!!
if(strcmp(string_texture, "None"))
{
MLRTexture *quad_texture = (*MLRTexturePool::Instance)(string_texture, 0);
if(!quad_texture)
{
quad_texture = MLRTexturePool::Instance->Add(string_texture, 0);
}
Check_Object(quad_texture);
quad_state->SetTextureHandle(quad_texture->GetTextureHandle());
}
//Sets for all Screen Quads elements
quad_state->SetAlphaMode(StateChange::AlphaInvAlphaMode);
quad_state->DisableDithering();
quad_state->DisableBackfaceCulling();
quad_state->SetFilterMode(StateChange::PointSampleMode);
quad_state->DisableFog();
quad_state->SetLightingMode(StateChange::NoLightingMode);
quad_state->DisablePerspectiveCorrection();
quad_state->SetWireFrameMode(StateChange::SolidMode);
quad_state->DisableZBufferWrite();
quad_state->DisableZBufferCompare();
ScreenQuadsElement *new_quad;
bool *temp_status;
bool status;
status = true;
temp_status = &status;
new_quad = new ScreenQuadsElement(50);
new_quad->AdoptStateChange(quad_state);
new_quad->SetName(string_text);
Camera->AttachChild(new_quad);
new_quad->Sync();
MString group_name;
group_name = string_text;
char num[4];
sprintf(num, "%d", nextGroup);
group_name += num;
nextGroup ++;
polyGroupSocket.AddValue(new_quad, group_name);
new_quad->GetQuadData(0, text_corners, text_colors, text_uvs, text_status);
int i;
for(i=0; i<str_len; i++)
{
new_quad->SetQuadStatus(i, true);
}
// return string_text;
return group_name;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
ScreenPolyManager::RemovePolyGroup(const MString& group_name)
{
Check_Object(this);
ScreenQuadsElement *removed_quad = polyGroupSocket.Find(group_name);
if(removed_quad)
{
polyGroupSocket.Remove(removed_quad);
}
delete removed_quad;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Scalar
ScreenPolyManager::GetWValue(Scalar z)
{
Check_Object(this);
Scalar w;
Scalar l, r, t, b, n, f;
Camera->GetNearPlaneBorders(&l, &r, &t, &b, &n, &f);
w = 1/(n + z * (f - n));
return w;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
#if 0
void
ScreenPolyManager::ReleaseScreenPoly(MString group_name, int poly_index);
{
Check_Object(this);
SortedChainIteratorOf<ScreenQuadsElement *, MString> iterator(&polyGroupSocket);
ScreenQuadsElement *group;
group = iterator.Find(group_name);
Check_Pointer(group);
#endif