Initial import of Red Planet v4.10 Win32 source
Imports the current Win32 source for the pod-racing game 'Red Planet', built on the MUNGA engine and its L4 (Win32/DirectX) platform layer: - MUNGA / MUNGA_L4: cross-platform engine core and Win32 backend - RP / RP_L4: Red Planet game logic and Win32 application - DivLoader, Setup1: asset loader and installer project - lib, MUNGA_L4/openal, MUNGA_L4/sos: third-party audio dependencies Removed stale Subversion metadata and added .gitignore/.gitattributes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,692 @@
|
||||
#include "munga.h"
|
||||
#pragma hdrstop
|
||||
|
||||
#include "boxsolid.h"
|
||||
#include "collorgn.h"
|
||||
#include "app.h"
|
||||
#include "notation.h"
|
||||
|
||||
//#############################################################################
|
||||
//########################### LatticeZone ###############################
|
||||
//#############################################################################
|
||||
|
||||
LatticeZone::LatticeZone(const ExtentBox &extents):
|
||||
boundingBox(extents, this)
|
||||
{
|
||||
}
|
||||
|
||||
LatticeZone::~LatticeZone()
|
||||
{
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
//######################### EnvironmentZone #############################
|
||||
//#############################################################################
|
||||
|
||||
EnvironmentZone::EnvironmentZone(
|
||||
const ExtentBox &extents,
|
||||
const Environment &the_environment
|
||||
):
|
||||
LatticeZone(extents)
|
||||
{
|
||||
environment = the_environment;
|
||||
}
|
||||
|
||||
EnvironmentZone::~EnvironmentZone()
|
||||
{
|
||||
}
|
||||
|
||||
Logical
|
||||
EnvironmentZone::TestInstance() const
|
||||
{
|
||||
LatticeZone::TestInstance();
|
||||
Check(&environment);
|
||||
return True;
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
//########################### InterestZone ##############################
|
||||
//#############################################################################
|
||||
|
||||
InterestZone::InterestZone(
|
||||
const ExtentBox &extents,
|
||||
InterestZoneID interest_zone_id,
|
||||
BoxedSolidTree *collision_root,
|
||||
EnvironmentZone *environment_zone,
|
||||
BoundingBoxTree *existance_root
|
||||
):
|
||||
LatticeZone(extents)
|
||||
{
|
||||
Verify(interest_zone_id != NullInterestZoneID);
|
||||
Check(collision_root);
|
||||
Check(environment_zone);
|
||||
Check(existance_root);
|
||||
|
||||
interestZoneID = interest_zone_id;
|
||||
collisionRoot = collision_root;
|
||||
environmentZone = environment_zone;
|
||||
collisionOrigin = NULL;
|
||||
existanceRoot = existance_root;
|
||||
}
|
||||
|
||||
InterestZone::~InterestZone()
|
||||
{
|
||||
//
|
||||
// HACK - delete collision tree
|
||||
//
|
||||
Unregister_Object(collisionRoot);
|
||||
delete collisionRoot;
|
||||
collisionRoot = NULL;
|
||||
|
||||
//
|
||||
// HACK - delete environment zone
|
||||
//
|
||||
Unregister_Object(environmentZone);
|
||||
delete environmentZone;
|
||||
environmentZone = NULL;
|
||||
|
||||
//
|
||||
// HACK - delete existance tree
|
||||
//
|
||||
Unregister_Object(existanceRoot);
|
||||
delete existanceRoot;
|
||||
existanceRoot = NULL;
|
||||
|
||||
//
|
||||
// HACK - delete collision origin
|
||||
//
|
||||
if (collisionOrigin != NULL)
|
||||
{
|
||||
Check(application);
|
||||
Check(application->GetInterestManager());
|
||||
application->GetInterestManager()->OrphanInterestOrigin(collisionOrigin);
|
||||
CollisionOrigin *col_origin = collisionOrigin;
|
||||
collisionOrigin = NULL;
|
||||
Unregister_Object(col_origin);
|
||||
delete col_origin;
|
||||
}
|
||||
}
|
||||
|
||||
Logical
|
||||
InterestZone::TestInstance() const
|
||||
{
|
||||
LatticeZone::TestInstance();
|
||||
|
||||
Verify(interestZoneID != NullInterestZoneID);
|
||||
|
||||
if (collisionOrigin != NULL)
|
||||
{
|
||||
Check(collisionOrigin);
|
||||
}
|
||||
if (collisionRoot != NULL)
|
||||
{
|
||||
Check(collisionRoot);
|
||||
}
|
||||
if (environmentZone != NULL)
|
||||
{
|
||||
Check(environmentZone);
|
||||
}
|
||||
if (existanceRoot != NULL)
|
||||
{
|
||||
Check(existanceRoot);
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
//########################### InterestArena #############################
|
||||
//#############################################################################
|
||||
|
||||
InterestArena::InterestArena(InterestZone *interest_zone):
|
||||
interestZoneSocket(NULL)
|
||||
{
|
||||
Check(interest_zone);
|
||||
Check(&interestZoneSocket);
|
||||
interestZoneSocket.Add(interest_zone);
|
||||
}
|
||||
|
||||
InterestArena::~InterestArena()
|
||||
{
|
||||
//
|
||||
// deconnect from interest zone
|
||||
//
|
||||
Check(&interestZoneSocket);
|
||||
#if DEBUG_LEVEL>0
|
||||
InterestZone *interest_zone = interestZoneSocket.GetCurrent();
|
||||
Check(interest_zone);
|
||||
#endif
|
||||
interestZoneSocket.Remove();
|
||||
|
||||
#if 0
|
||||
//
|
||||
// If the interest zone is not in any interest arenas then delete
|
||||
//
|
||||
PlugIterator iterator(interest_zone);
|
||||
Check(&iterator);
|
||||
if (iterator.GetSize() == 0)
|
||||
{
|
||||
Unregister_Object(interest_zone);
|
||||
delete interest_zone;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
Logical
|
||||
InterestArena::TestInstance() const
|
||||
{
|
||||
Node::TestInstance();
|
||||
Check(&interestZoneSocket);
|
||||
return True;
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
//########################### LatticeManager ############################
|
||||
//#############################################################################
|
||||
|
||||
LatticeManager::LatticeManager()
|
||||
{
|
||||
}
|
||||
|
||||
LatticeManager::~LatticeManager()
|
||||
{
|
||||
}
|
||||
|
||||
//#############################################################################
|
||||
//####################### InterestLatticeManager ########################
|
||||
//#############################################################################
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
InterestLatticeManager::InterestLatticeManager():
|
||||
interestZoneSocket(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
InterestLatticeManager::~InterestLatticeManager()
|
||||
{
|
||||
InterestZone *interest_zone;
|
||||
|
||||
Check(&interestZoneSocket);
|
||||
if ((interest_zone = interestZoneSocket.GetCurrent()) != NULL)
|
||||
{
|
||||
Unregister_Object(interest_zone);
|
||||
delete interest_zone;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
Logical
|
||||
InterestLatticeManager::TestInstance() const
|
||||
{
|
||||
Node::TestInstance();
|
||||
Check(&interestZoneSocket);
|
||||
return True;
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
InterestArena*
|
||||
InterestLatticeManager::MakeInterestArena(
|
||||
InterestZoneID,
|
||||
InterestType,
|
||||
InterestDepth
|
||||
)
|
||||
{
|
||||
Check(this);
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// HACK - See if the one interest zone has been created
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
InterestZone *interest_zone;
|
||||
|
||||
if ((interest_zone = interestZoneSocket.GetCurrent()) == NULL)
|
||||
{
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// Create the one environment
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
EnvironmentZone *environment_zone;
|
||||
|
||||
//
|
||||
// Make the memory stream
|
||||
//
|
||||
Check(application);
|
||||
ResourceFile *res_file = application->GetResourceFile();
|
||||
Check(res_file);
|
||||
|
||||
ResourceDescription *resource_description =
|
||||
res_file->FindResourceDescription(
|
||||
"EnvironmentZone",
|
||||
ResourceDescription::EnvironmentZoneResourceType
|
||||
);
|
||||
if (resource_description)
|
||||
{
|
||||
Check(resource_description);
|
||||
resource_description->Lock();
|
||||
|
||||
MemoryStream
|
||||
memory_stream(
|
||||
resource_description->resourceAddress,
|
||||
resource_description->resourceSize
|
||||
);
|
||||
|
||||
//
|
||||
// Get the construction arguments
|
||||
//
|
||||
ExtentBox extent_box;
|
||||
Environment environment;
|
||||
|
||||
memory_stream >> extent_box >> environment;
|
||||
|
||||
resource_description->Unlock();
|
||||
|
||||
//
|
||||
// Make the environment zone
|
||||
//
|
||||
environment_zone = new EnvironmentZone(extent_box, environment);
|
||||
Register_Object(environment_zone);
|
||||
}
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// Create the one interest zone
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
resource_description =
|
||||
res_file->FindResourceDescription(
|
||||
"InterestZone",
|
||||
ResourceDescription::InterestZoneResourceType
|
||||
);
|
||||
if (resource_description)
|
||||
{
|
||||
Check(resource_description);
|
||||
resource_description->Lock();
|
||||
|
||||
MemoryStream
|
||||
memory_stream(
|
||||
resource_description->resourceAddress,
|
||||
resource_description->resourceSize
|
||||
);
|
||||
|
||||
//
|
||||
// Get the construction arguments
|
||||
//
|
||||
ExtentBox extent_box;
|
||||
InterestZoneID interest_zone_ID;
|
||||
CString map_resource_name;
|
||||
|
||||
memory_stream >> extent_box >> interest_zone_ID >> map_resource_name;
|
||||
|
||||
resource_description->Unlock();
|
||||
|
||||
//
|
||||
// Make the collision tree root
|
||||
//
|
||||
BoxedSolidTree *collision_root = new BoxedSolidTree;
|
||||
Register_Object(collision_root);
|
||||
|
||||
//
|
||||
// Make the existance tree root
|
||||
//
|
||||
BoundingBoxTree *existance_root = new BoundingBoxTree;
|
||||
Register_Object(existance_root);
|
||||
|
||||
//
|
||||
// Make the interest zone
|
||||
//
|
||||
interest_zone =
|
||||
new InterestZone(
|
||||
extent_box,
|
||||
interest_zone_ID,
|
||||
collision_root,
|
||||
environment_zone,
|
||||
existance_root
|
||||
);
|
||||
Register_Object(interest_zone);
|
||||
}
|
||||
|
||||
interestZoneSocket.Add(interest_zone);
|
||||
Verify(interest_zone == interestZoneSocket.GetCurrent());
|
||||
}
|
||||
Check(interest_zone);
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// Create an interest arena pointing at this zone
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
return new InterestArena(interest_zone);
|
||||
}
|
||||
#if 0
|
||||
InterestArena*
|
||||
InterestLatticeManager::MakeInterestArena(
|
||||
InterestZoneID,
|
||||
InterestType,
|
||||
InterestDepth
|
||||
)
|
||||
{
|
||||
Check(this);
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// HACK - Create one interest zone
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
InterestZone *interest_zone;
|
||||
|
||||
if ((interest_zone = interestZoneSocket.GetCurrent()) == NULL)
|
||||
{
|
||||
const Scalar min_dimension = -100000.0f;
|
||||
const Scalar max_dimension = 100000.0f;
|
||||
|
||||
Vector3D min_vector(min_dimension, min_dimension, min_dimension);
|
||||
Vector3D max_vector(max_dimension, max_dimension, max_dimension);
|
||||
ExtentBox big_extent(min_vector, max_vector);
|
||||
|
||||
//
|
||||
// Pick one interest zone id
|
||||
//
|
||||
InterestZoneID interest_zone_ID = NullInterestZoneID + 1;
|
||||
|
||||
//
|
||||
// Set up one environment
|
||||
//
|
||||
Environment environment;
|
||||
EnvironmentZone *environment_zone;
|
||||
|
||||
environment.gravityConstant = 6.5f;
|
||||
environment.airDensity = 1.0f;
|
||||
environment.windVelocity = Vector3D::Identity;
|
||||
environment.ambientTemperature = 294.26f; // Seventy degrees farenheit
|
||||
|
||||
environment_zone = new EnvironmentZone(big_extent, environment);
|
||||
Register_Object(environment_zone);
|
||||
|
||||
//
|
||||
// Load entire collision tree
|
||||
//
|
||||
BoxedSolidTree *collision_root = new BoxedSolidTree;
|
||||
Register_Object(collision_root);
|
||||
|
||||
//
|
||||
// Make one interest zone for everything
|
||||
//
|
||||
interest_zone =
|
||||
new InterestZone(
|
||||
big_extent,
|
||||
interest_zone_ID,
|
||||
collision_root,
|
||||
environment_zone
|
||||
);
|
||||
Register_Object(interest_zone);
|
||||
|
||||
interestZoneSocket.Add(interest_zone);
|
||||
Verify(interest_zone == interestZoneSocket.GetCurrent());
|
||||
}
|
||||
Check(interest_zone);
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// Create an interest arena pointing at this zone
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
return new InterestArena(interest_zone);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
void
|
||||
InterestLatticeManager::DestroyInterestArena(InterestArena *interest_arena)
|
||||
{
|
||||
Check(this);
|
||||
Check(interest_arena);
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// Delete the interest arena
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
Unregister_Object(interest_arena);
|
||||
delete interest_arena;
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
InterestZoneID
|
||||
InterestLatticeManager::SearchForEntityInterestZone(
|
||||
InterestZoneID,
|
||||
const EntityID&
|
||||
)
|
||||
{
|
||||
Check(this);
|
||||
Check(interestZoneSocket.GetCurrent());
|
||||
return interestZoneSocket.GetCurrent()->GetInterestZoneID();
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
InterestZone*
|
||||
InterestLatticeManager::GetInterestZone(InterestZoneID)
|
||||
{
|
||||
Check(this);
|
||||
return interestZoneSocket.GetCurrent();
|
||||
}
|
||||
|
||||
//
|
||||
//#############################################################################
|
||||
//#############################################################################
|
||||
//
|
||||
void
|
||||
InterestLatticeManager::CreateZoneResources(
|
||||
ResourceFile *resource_file,
|
||||
NotationFile *zone_notation_file
|
||||
)
|
||||
{
|
||||
Check(zone_notation_file);
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// HACK - Create the one environment zone resource
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
{
|
||||
//
|
||||
// Environment zone construction arguments
|
||||
//
|
||||
ExtentBox extent_box;
|
||||
Environment environment;
|
||||
|
||||
//
|
||||
// Get environment zone construction arguments
|
||||
//
|
||||
const char *contents;
|
||||
|
||||
#if DEBUG_LEVEL>0
|
||||
int ret = zone_notation_file->GetEntry(
|
||||
"EnvironmentZone",
|
||||
"extent_box",
|
||||
&contents
|
||||
);
|
||||
Verify(ret);
|
||||
#else
|
||||
zone_notation_file->GetEntry(
|
||||
"EnvironmentZone",
|
||||
"extent_box",
|
||||
&contents
|
||||
);
|
||||
#endif
|
||||
Convert_From_Ascii(contents, &extent_box);
|
||||
|
||||
#if DEBUG_LEVEL>0
|
||||
ret = zone_notation_file->GetEntry(
|
||||
"EnvironmentZone",
|
||||
"environment",
|
||||
&contents
|
||||
);
|
||||
Verify(ret);
|
||||
#else
|
||||
zone_notation_file->GetEntry(
|
||||
"EnvironmentZone",
|
||||
"environment",
|
||||
&contents
|
||||
);
|
||||
#endif
|
||||
Convert_From_Ascii(contents, &environment);
|
||||
|
||||
//
|
||||
// Create environment zone memory stream
|
||||
//
|
||||
DynamicMemoryStream environment_zone_memory_stream;
|
||||
|
||||
environment_zone_memory_stream << extent_box << environment;
|
||||
|
||||
//
|
||||
// Add environment zone resource
|
||||
//
|
||||
CString environment_zone_resource_name("EnvironmentZone");
|
||||
|
||||
#if DEBUG_LEVEL>0
|
||||
ResourceDescription *res_description =
|
||||
resource_file->AddResourceMemoryStream(
|
||||
environment_zone_resource_name,
|
||||
ResourceDescription::EnvironmentZoneResourceType,
|
||||
1,
|
||||
ResourceDescription::Preload,
|
||||
&environment_zone_memory_stream
|
||||
);
|
||||
Check(res_description);
|
||||
#else
|
||||
resource_file->AddResourceMemoryStream(
|
||||
environment_zone_resource_name,
|
||||
ResourceDescription::EnvironmentZoneResourceType,
|
||||
1,
|
||||
ResourceDescription::Preload,
|
||||
&environment_zone_memory_stream
|
||||
);
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
//---------------------------------------------------------------------
|
||||
// HACK - Create the one interest zone resource
|
||||
//---------------------------------------------------------------------
|
||||
//
|
||||
{
|
||||
//
|
||||
// Interest zone construction arguments
|
||||
//
|
||||
ExtentBox extent_box;
|
||||
InterestZoneID interest_zone_ID;
|
||||
CString map_resource_name;
|
||||
|
||||
//
|
||||
// Get interest zone construction arguments
|
||||
//
|
||||
const char *contents;
|
||||
|
||||
#if DEBUG_LEVEL>0
|
||||
int ret = zone_notation_file->GetEntry(
|
||||
"InterestZone",
|
||||
"extent_box",
|
||||
&contents
|
||||
);
|
||||
Verify(ret);
|
||||
#else
|
||||
zone_notation_file->GetEntry(
|
||||
"InterestZone",
|
||||
"extent_box",
|
||||
&contents
|
||||
);
|
||||
#endif
|
||||
Convert_From_Ascii(contents, &extent_box);
|
||||
|
||||
#if DEBUG_LEVEL>0
|
||||
ret = zone_notation_file->GetEntry(
|
||||
"InterestZone",
|
||||
"interest_zone_ID",
|
||||
&contents
|
||||
);
|
||||
Verify(ret);
|
||||
#else
|
||||
zone_notation_file->GetEntry(
|
||||
"InterestZone",
|
||||
"interest_zone_ID",
|
||||
&contents
|
||||
);
|
||||
#endif
|
||||
Convert_From_Ascii(contents, &interest_zone_ID);
|
||||
|
||||
#if DEBUG_LEVEL>0
|
||||
ret = zone_notation_file->GetEntry(
|
||||
"InterestZone",
|
||||
"map_resource_name",
|
||||
&contents
|
||||
);
|
||||
Verify(ret);
|
||||
#else
|
||||
zone_notation_file->GetEntry(
|
||||
"InterestZone",
|
||||
"map_resource_name",
|
||||
&contents
|
||||
);
|
||||
#endif
|
||||
map_resource_name = contents;
|
||||
|
||||
//
|
||||
// Create interest zone memory stream
|
||||
//
|
||||
DynamicMemoryStream interest_zone_memory_stream;
|
||||
|
||||
interest_zone_memory_stream << extent_box << interest_zone_ID;
|
||||
interest_zone_memory_stream << map_resource_name;
|
||||
|
||||
//
|
||||
// Add interest zone resource
|
||||
//
|
||||
CString interest_zone_resource_name("InterestZone");
|
||||
|
||||
#if DEBUG_LEVEL>0
|
||||
ResourceDescription *res_description =
|
||||
resource_file->AddResourceMemoryStream(
|
||||
interest_zone_resource_name,
|
||||
ResourceDescription::InterestZoneResourceType,
|
||||
1,
|
||||
ResourceDescription::Preload,
|
||||
&interest_zone_memory_stream
|
||||
);
|
||||
Check(res_description);
|
||||
#else
|
||||
resource_file->AddResourceMemoryStream(
|
||||
interest_zone_resource_name,
|
||||
ResourceDescription::InterestZoneResourceType,
|
||||
1,
|
||||
ResourceDescription::Preload,
|
||||
&interest_zone_memory_stream
|
||||
);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user