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>
262 lines
7.0 KiB
C++
262 lines
7.0 KiB
C++
#include "munga.h"
|
|
#pragma hdrstop
|
|
|
|
#include "vidrend.h"
|
|
#include "app.h"
|
|
#include "entity.h"
|
|
|
|
#if defined(USE_ONE_VIDEO_TRACE) || defined(TRACE_VIDEO_RENDERER)
|
|
BitTrace Video_Renderer("Video Renderer");
|
|
#endif
|
|
|
|
#if !defined(USE_ONE_VIDEO_TRACE)
|
|
# if defined(TRACE_VIDEO_BECOME_INTERESTING)
|
|
BitTrace Video_Become_Interesting("Video Become Interesting");
|
|
# endif
|
|
|
|
# if defined(TRACE_VIDEO_BECOME_UNINTERESTING)
|
|
BitTrace Video_Become_Uninteresting("Video Become Uninteresting");
|
|
# endif
|
|
#endif
|
|
|
|
//
|
|
//#############################################################################
|
|
// Constructor for the video renderer
|
|
//#############################################################################
|
|
//
|
|
VideoRenderer::VideoRenderer(
|
|
RendererRate calibration_rate,
|
|
RendererComplexity calibration_complexity,
|
|
RendererPriority calibration_priority,
|
|
InterestType interest_type,
|
|
InterestDepth depth_calibration
|
|
):
|
|
Renderer(
|
|
calibration_rate,
|
|
calibration_complexity,
|
|
calibration_priority,
|
|
interest_type,
|
|
depth_calibration
|
|
)
|
|
{
|
|
Disconnected_Eye = False;
|
|
}
|
|
//
|
|
//#############################################################################
|
|
// Destructor for the video renderer
|
|
//#############################################################################
|
|
//
|
|
VideoRenderer::~VideoRenderer()
|
|
{
|
|
}
|
|
//
|
|
//#############################################################################
|
|
// This creates the data structures and loads up data for an entity that has
|
|
// become interesting to the renderer.
|
|
//#############################################################################
|
|
//
|
|
void
|
|
VideoRenderer::NotifyOfNewInterestingEntity(Entity *interesting_entity)
|
|
{
|
|
ResourceDescription
|
|
*video_resource;
|
|
ResourceFile
|
|
*this_resource_file;
|
|
ResourceDescription::ResourceID
|
|
this_resource_ID;
|
|
ViewFrom
|
|
view_this_entity_from;
|
|
//
|
|
// Check the newly interesting entity, then determine what kind of view we want
|
|
// to construct for it by seeing if it is the linked entity and checking to
|
|
// see if the eye is disconnected at a higher renderer level.
|
|
//
|
|
SET_VIDEO_BECOME_INTERESTING();
|
|
Check(interesting_entity);
|
|
if(Disconnected_Eye)
|
|
{
|
|
view_this_entity_from = outsideEntity;
|
|
}
|
|
else
|
|
{
|
|
if(interesting_entity == GetLinkedEntity())
|
|
{
|
|
view_this_entity_from = insideEntity;
|
|
}
|
|
else
|
|
{
|
|
view_this_entity_from = outsideEntity;
|
|
}
|
|
}
|
|
//
|
|
// Try to fetch this entity's video resource, if there isn't one, we still
|
|
// call make renderables as something up above us may have code to construct
|
|
// some effects independant of the resource file.
|
|
//
|
|
Check(application);
|
|
this_resource_file = application->GetResourceFile();
|
|
Check(this_resource_file);
|
|
this_resource_ID = interesting_entity->GetResourceID();
|
|
video_resource = this_resource_file->SearchList(
|
|
this_resource_ID,
|
|
ResourceDescription::VideoModelResourceType);
|
|
//
|
|
// Call the make renderables process to convert the resource script into a
|
|
// set of renderables for this entity.
|
|
//
|
|
if (video_resource)
|
|
{
|
|
video_resource->Lock();
|
|
}
|
|
MakeEntityRenderables(
|
|
interesting_entity,
|
|
video_resource,
|
|
view_this_entity_from
|
|
);
|
|
if (video_resource)
|
|
{
|
|
video_resource->Unlock();
|
|
}
|
|
|
|
CLEAR_VIDEO_BECOME_INTERESTING();
|
|
}
|
|
//
|
|
//#############################################################################
|
|
// This handles killing off of an entity that has become uninteresting.
|
|
//#############################################################################
|
|
//
|
|
void
|
|
VideoRenderer::NotifyOfBecomingUninterestingEntity(Entity *uninteresting_entity)
|
|
{
|
|
SET_VIDEO_BECOME_UNINTERESTING();
|
|
//
|
|
// Destroy the dynamic entities that go with this uninteresting Entity
|
|
// in the reverse order that they were created.
|
|
//
|
|
{
|
|
Entity::DynamicVideoSocketIterator
|
|
iterator(uninteresting_entity);
|
|
Component
|
|
*component;
|
|
|
|
Check(&iterator);
|
|
iterator.Last();
|
|
while ((component = iterator.ReadAndPrevious()) != NULL)
|
|
{
|
|
Unregister_Object(component);
|
|
delete component;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Destroy the static entities that go with this uninteresting Entity
|
|
// in the reverse order that they were created.
|
|
//
|
|
{
|
|
Entity::StaticVideoSocketIterator
|
|
iterator(uninteresting_entity);
|
|
Component
|
|
*component;
|
|
|
|
Check(&iterator);
|
|
iterator.Last();
|
|
while ((component = iterator.ReadAndPrevious()) != NULL)
|
|
{
|
|
Unregister_Object(component);
|
|
delete component;
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
//
|
|
// Destroy all the static and dynamic entities that go with this uninteresting Entity
|
|
// in the same order they were created. This caused some problems for DPL in the past
|
|
// but it may no longer be the case.
|
|
//
|
|
|
|
Entity::DynamicVideoSocketIterator iterator(uninteresting_entity);
|
|
iterator.DeletePlugs();
|
|
|
|
Entity::StaticVideoSocketIterator static_iterator(uninteresting_entity);
|
|
static_iterator.DeletePlugs();
|
|
|
|
uninteresting_entity->DeleteVideoWatchers();
|
|
#endif
|
|
|
|
CLEAR_VIDEO_BECOME_UNINTERESTING();
|
|
}
|
|
//
|
|
//#############################################################################
|
|
// Execute Method, performs the rendering of one frame
|
|
//#############################################################################
|
|
//
|
|
void
|
|
VideoRenderer::ExecuteImplementation(
|
|
RendererComplexity,
|
|
RendererOrigin::InterestingEntityIterator *
|
|
)
|
|
{
|
|
Tell("VideoRenderer::ExecuteImplementation has been called\n");
|
|
}
|
|
//
|
|
//#############################################################################
|
|
// This process is supposed to make the renderables for an object, when a higher
|
|
// level of this virtual can't figure out how to make something it calls down
|
|
// to the level below it. If we reach here then nobody could figure out what
|
|
// to do so we can print an error or information message.
|
|
//#############################################################################
|
|
//
|
|
void
|
|
VideoRenderer::MakeEntityRenderables(
|
|
Entity* my_entity, // The entity we are dealing with
|
|
ResourceDescription*, // Pointer to the video resource
|
|
ViewFrom) // Type of reference (inside/outside...etc.)
|
|
{
|
|
switch (my_entity->GetClassID())
|
|
{
|
|
//
|
|
// Scorezones are allowed to have no graphics.
|
|
//
|
|
case ScoreZoneClassID:
|
|
break;
|
|
//
|
|
// Default case complains about missing graphics
|
|
//
|
|
default:
|
|
DEBUG_STREAM<<"Entity "<<my_entity->entityID<<" class"<<my_entity->GetClassID() << std::flush;
|
|
DEBUG_STREAM<<" couldn't figure out how to MakeEntityRenderables\n" << std::flush;
|
|
break;
|
|
}
|
|
}
|
|
//
|
|
//#############################################################################
|
|
// Startup the implementation of the Division video renderer
|
|
//#############################################################################
|
|
//
|
|
void
|
|
VideoRenderer::LoadMissionImplementation(Mission*)
|
|
{
|
|
Tell("VideoRenderer::StartImplementation has been called\n");
|
|
}
|
|
void
|
|
VideoRenderer::ShutdownImplementation()
|
|
{
|
|
Tell("VideoRenderer::StopImplementation has been called\n");
|
|
}
|
|
void
|
|
VideoRenderer::SuspendImplementation()
|
|
{
|
|
Tell("VideoRenderer::SuspendImplementation has been called\n");
|
|
}
|
|
void
|
|
VideoRenderer::ResumeImplementation()
|
|
{
|
|
Tell("VideoRenderer::ResumeImplementation has been called\n");
|
|
}
|
|
|
|
Logical
|
|
VideoRenderer::TestInstance() const
|
|
{
|
|
return IsDerivedFrom(*GetClassDerivations());
|
|
}
|