Files
firestorm/Gameleap/code/mw4/Code/Test ElementRenderer/ElementTest.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

1093 lines
32 KiB
C++

#include <ElementRenderer\ListElement.hpp>
#include <ElementRenderer\LODElement.hpp>
#include <ElementRenderer\ScalableShapeElement.hpp>
#include <ElementRenderer\ScreenQuadsElement.hpp>
#include <ElementRenderer\CameraElement.hpp>
#include <ElementRenderer\PointCloudElement.hpp>
#include <ElementRenderer\LineCloudElement.hpp>
#include <ElementRenderer\TriangleCloudElement.hpp>
#include <ElementRenderer\StateChange.hpp>
#include <ElementRenderer\gosFXElement.hpp>
#include <MLR\MLRHeaders.hpp>
#include "BuildCurves.hpp"
//
// Globals used for test
//
ElementRenderer::ListElement *Scene=NULL;
ElementRenderer::SwitchElement *Switch=NULL;
enum {SwitchSize=10};
#define EFFECT 7
//
// data for base shape on '1'
//
ElementRenderer::ShapeElement *Shape=NULL;
Stuff::RGBAColor Shape_Colors[8]={
Stuff::RGBAColor(0.5f, 0.5f, 0.5f, 1.0f),
Stuff::RGBAColor(0.5f, 0.5f, 1.0f, 1.0f),
Stuff::RGBAColor(0.5f, 1.0f, 0.5f, 1.0f),
Stuff::RGBAColor(0.5f, 1.0f, 1.0f, 1.0f),
Stuff::RGBAColor(1.0f, 0.5f, 0.5f, 1.0f),
Stuff::RGBAColor(1.0f, 0.5f, 1.0f, 1.0f),
Stuff::RGBAColor(1.0f, 1.0f, 0.5f, 1.0f),
Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f)
};
//
// data for point cloud on '2'
//
enum {MaxPoints=300};
unsigned Point_Count=MaxPoints;
Stuff::Point3D
Point_Data[MaxPoints],
Point_Dest[MaxPoints];
Stuff::RGBAColor Color_Data[MaxPoints];
Stuff::Scalar Time_Left[MaxPoints];
Stuff::Scalar Last_Frame = 0.0;
//
// data for LOD on '3'
//
Stuff::RGBAColor Lod0_Colors[8]={
Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f),
Stuff::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f),
Stuff::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f),
Stuff::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f),
Stuff::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f),
Stuff::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f),
Stuff::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f),
Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f)
};
Stuff::RGBAColor Lod1_Colors[8]={
Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f),
Stuff::RGBAColor(0.0f, 1.0f, 0.0f, 1.0f),
Stuff::RGBAColor(0.0f, 1.0f, 0.0f, 1.0f),
Stuff::RGBAColor(0.0f, 1.0f, 0.0f, 1.0f),
Stuff::RGBAColor(0.0f, 1.0f, 0.0f, 1.0f),
Stuff::RGBAColor(0.0f, 1.0f, 0.0f, 1.0f),
Stuff::RGBAColor(0.0f, 1.0f, 0.0f, 1.0f),
Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f)
};
Stuff::RGBAColor Lod2_Colors[8]={
Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f),
Stuff::RGBAColor(0.0f, 0.0f, 1.0f, 1.0f),
Stuff::RGBAColor(0.0f, 0.0f, 1.0f, 1.0f),
Stuff::RGBAColor(0.0f, 0.0f, 1.0f, 1.0f),
Stuff::RGBAColor(0.0f, 0.0f, 1.0f, 1.0f),
Stuff::RGBAColor(0.0f, 0.0f, 1.0f, 1.0f),
Stuff::RGBAColor(0.0f, 0.0f, 1.0f, 1.0f),
Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f)
};
ElementRenderer::LODElement::Entry Lod_Entries[3]={
{0.0f, 225.0f},
{225.0f, 400.0f},
{400.0f, 500.0f}
};
//
// Data for triangle cloud on '6'
//
Stuff::RGBAColor Tri_Color_Data[MaxPoints];
unsigned Triangle_Count = MaxPoints/3;
//
// Data for scaling mlr_shape on '7'
//
ElementRenderer::ScalableShapeElement *Scalable;
Stuff::Vector3D New_Scale;
Stuff::RGBAColor New_Color;
Stuff::Scalar Scale_Time;
//
// Data for gosFX on '8'
//
ElementRenderer::gosFXElement *Effect;
gosFX::Effect *gos_Effect;
Stuff::DynamicMemoryStream * dms;
Stuff::Radian Effect_Angle;
//
// Data for the screen quad
//
ElementRenderer::ScreenQuadsElement *Quad;
bool *Quad_Status;
//
// Data for camera
//
ElementRenderer::CameraElement *Camera=NULL;
Stuff::YawPitchRange Camera_Direction(0.0f, 0.0f, -10.0f);
Stuff::Vector2DOf<Stuff::Scalar> Camera_Shift(0.0f, 0.0f);
ElementRenderer::StateChange *Camera_State=NULL;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void __stdcall InitializeGameEngine()
{
//
//---------------------
// Initialize libraries
//---------------------
//
Stuff::ArmorLevel = 4;
Stuff::InitializeClasses();
MidLevelRenderer::InitializeClasses();
gosFX::InitializeClasses();
ElementRenderer::InitializeClasses();
Stuff::NotationFile::TestClass();
//
//------------------------
// Set up the texture pool
//------------------------
//
gos_PushCurrentHeap(MidLevelRenderer::Heap);
MidLevelRenderer::TGAFilePool *pool = new MidLevelRenderer::TGAFilePool("Assets\\Graphics\\");
Check_Object(pool);
MidLevelRenderer::MLRTexturePool::Instance =
new MidLevelRenderer::MLRTexturePool(pool);
Check_Object(MidLevelRenderer::MLRTexturePool::Instance);
MidLevelRenderer::MLRTexture *texture =
MidLevelRenderer::MLRTexturePool::Instance->Add("texture");
Check_Object(texture);
MidLevelRenderer::MLRTexture *texture2 =
MidLevelRenderer::MLRTexturePool::Instance->Add("lightspot");
Check_Object(texture2);
MidLevelRenderer::MLRState state;
// state.SetAlphaMode(MidLevelRenderer::MLRState::OneZeroMode);
state.SetTextureHandle(texture->GetTextureHandle());
state.SetPriority(MidLevelRenderer::MLRState::DefaultPriority);
MidLevelRenderer::MLRState state2;
state2.SetTextureHandle(texture2->GetTextureHandle());
state2.SetZBufferWriteOff();
state2.SetAlphaMode(MidLevelRenderer::MLRState::OneOneMode);
state2.SetPriority(MidLevelRenderer::MLRState::DefaultPriority + 1);
gos_PopCurrentHeap();
//
//-------------------------------------------------------------------
// Build the scene root and a shifting node for testing element types
//-------------------------------------------------------------------
//
gos_PushCurrentHeap(ElementRenderer::ListElement::s_Heap);
Scene = new ElementRenderer::ListElement;
Check_Object(Scene);
Scene->SetSize(2);
gos_PopCurrentHeap();
gos_PushCurrentHeap(ElementRenderer::SwitchElement::s_Heap);
Switch = new ElementRenderer::SwitchElement;
Check_Object(Switch);
Switch->SetSize(SwitchSize);
Scene->AttachIndexedChild(0, Switch);
Switch->SetNeverCullMode();
//
//----------------------
// Build a default shape
//----------------------
//
Shape = new ElementRenderer::ShapeElement;
Check_Object(Shape);
MidLevelRenderer::MLRShape *two_pass_shape = Shape->GetMLRShape();
Check_Object(two_pass_shape);
MidLevelRenderer::MLR_I_C_DT_PMesh *cube_2pass =
MidLevelRenderer::CreateIndexedCube_Color_NoLit_2Tex(
1.0f,
Shape_Colors,
&state,
&state2
);
Check_Object(cube_2pass);
two_pass_shape->Add(cube_2pass);
cube_2pass->DetachReference();
Shape->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
#if 0
Shape->m_localOBB.axisExtents = Stuff::Vector3D(1.0f, 1.0f, 1.0f);
Shape->SetOBBMode();
#endif
ElementRenderer::Element::CallbackSet = ElementRenderer::Element::Callbacks;
Switch->AttachIndexedChild(0, Shape);
Shape->SetVolumeCullMode();
Shape->SetName("Cube");
// Shape->SetCallbackIndex(ElementRenderer::Element::DrawGreenBounds);
Shape->Sync();
//
//--------------------
// Build a point cloud
//--------------------
//
ElementRenderer::PointCloudElement *cloud =
new ElementRenderer::PointCloudElement(ELEMENTS(Point_Data));
Check_Object(cloud);
cloud->SetDataPointers(&Point_Count, Point_Data, Color_Data);
unsigned i;
for (i=0; i<ELEMENTS(Point_Data); ++i)
{
Color_Data[i] = Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f);
Point_Data[i].x = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Data[i].y = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Data[i].z = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].x = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].y = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].z = 2.0f*Stuff::Random::GetFraction()-1.0f;
Time_Left[i] = 2.0f*Stuff::Random::GetFraction()+1.0f;
}
cloud->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
Switch->AttachIndexedChild(1, cloud);
cloud->SetVolumeCullMode();
cloud->SetName("Point Cloud");
//
//-------------------
// Build a line cloud
//-------------------
//
ElementRenderer::LineCloudElement *lineCloud =
new ElementRenderer::LineCloudElement(ELEMENTS(Point_Data));
Check_Object(lineCloud);
lineCloud->SetDataPointers(&Point_Count, Point_Data, Color_Data);
for (i=0; i<ELEMENTS(Point_Data); ++i)
{
Color_Data[i] = Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f);
Point_Data[i].x = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Data[i].y = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Data[i].z = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].x = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].y = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].z = 2.0f*Stuff::Random::GetFraction()-1.0f;
Time_Left[i] = 2.0f*Stuff::Random::GetFraction()+1.0f;
}
lineCloud->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
Switch->AttachIndexedChild(8, lineCloud);
lineCloud->SetVolumeCullMode();
lineCloud->SetName("Line Cloud");
//
//--------------------
// Build an LOD object
//--------------------
//
ElementRenderer::LODElement *lod =
new ElementRenderer::LODElement;
Check_Object(lod);
lod->SetSize(ELEMENTS(Lod_Entries));
lod->SetName("LOD");
ElementRenderer::ShapeElement *child =
new ElementRenderer::ShapeElement;
Check_Object(child);
MidLevelRenderer::MLRShape *lod_0_shape = child->GetMLRShape();
Check_Object(lod_0_shape);
MidLevelRenderer::MLR_I_C_PMesh *lod_0_mesh =
MidLevelRenderer::CreateIndexedCube_Color_NoLit(1.0f, Lod0_Colors, &state);
Check_Object(lod_0_mesh);
lod_0_shape->Add(lod_0_mesh);
lod_0_mesh->DetachReference();
child->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
child->m_localOBB.axisExtents = Stuff::Vector3D(1.0f, 1.0f, 1.0f);
child->SetOBBMode();
lod->AttachLOD(0, child, Lod_Entries[0]);
child->SetVolumeCullMode();
child->SetName("LOD0");
child =
new ElementRenderer::ShapeElement;
Check_Object(child);
MidLevelRenderer::MLRShape *lod_1_shape = child->GetMLRShape();
Check_Object(lod_1_shape);
MidLevelRenderer::MLR_I_C_PMesh *lod_1_mesh =
MidLevelRenderer::CreateIndexedCube_Color_NoLit(1.0f, Lod1_Colors, &state);
Check_Object(lod_1_mesh);
lod_1_shape->Add(lod_1_mesh);
lod_1_mesh->DetachReference();
child->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
child->m_localOBB.axisExtents = Stuff::Vector3D(1.0f, 1.0f, 1.0f);
child->SetOBBMode();
lod->AttachLOD(1, child, Lod_Entries[1]);
child->SetVolumeCullMode();
child->SetName("LOD1");
child = new ElementRenderer::ShapeElement;
Check_Object(child);
MidLevelRenderer::MLRShape *lod_2_shape = child->GetMLRShape();
Check_Object(lod_2_shape);
MidLevelRenderer::MLR_I_C_PMesh *lod_2_mesh =
MidLevelRenderer::CreateIndexedCube_Color_NoLit(1.0f, Lod2_Colors, &state);
Check_Object(lod_2_mesh);
lod_2_shape->Add(lod_2_mesh);
lod_2_mesh->DetachReference();
child->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
child->m_localOBB.axisExtents = Stuff::Vector3D(1.0f, 1.0f, 1.0f);
child->SetOBBMode();
lod->AttachLOD(2, child, Lod_Entries[2]);
child->SetVolumeCullMode();
child->SetName("LOD2");
Switch->AttachIndexedChild(2, lod);
lod->NeedNewBounds();
//
//----------------------------------------------------------
// Build a shape like option one, but enable Y-Axis aligning
//----------------------------------------------------------
//
ElementRenderer::GroupElement *g =
new ElementRenderer::GroupElement;
Check_Object(g);
Switch->AttachIndexedChild(3, g);
child = new ElementRenderer::ShapeElement;
Check_Object(child);
MidLevelRenderer::MLRShape *y_shape = child->GetMLRShape();
Check_Object(y_shape);
MidLevelRenderer::MLR_I_C_PMesh *cube =
MidLevelRenderer::CreateIndexedCube_Color_NoLit(
1.0f,
NULL, //Shape_Colors,
&state
);
Check_Object(cube);
y_shape->Add(cube);
cube->DetachReference();
child->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
child->m_localOBB.axisExtents = Stuff::Vector3D(1.0f, 1.0f, 1.0f);
child->SetOBBMode();
g->AttachChild(child);
child->SetAlignY();
child->SetVolumeCullMode();
child->SetName("YAxis");
Stuff::Scalar x,y;
Stuff::LinearMatrix4D matrix;
for (x=-10.0f; x <= 10.0f; x += 4.0f)
for (y=-10.0f; y <= 10.0f; y += 4.0f)
if (x != 0.0f || y != 0)
{
ElementRenderer::ShapeElement *element =
new ElementRenderer::ShapeElement(child);
Check_Object(element);
g->AttachChild(element);
matrix = Stuff::LinearMatrix4D::Identity;
matrix.BuildTranslation(Stuff::Point3D(x, y, 0.0f));
element->SetLocalToParent(matrix);
}
//
//-----------------------------------------------------------
// Build a shape like option one, but enable XY-Axis aligning
//-----------------------------------------------------------
//
g = new ElementRenderer::GroupElement;
Check_Object(g);
Switch->AttachIndexedChild(4, g);
child = new ElementRenderer::ShapeElement;
Check_Object(child);
MidLevelRenderer::MLRShape *xy_shape = child->GetMLRShape();
Check_Object(xy_shape);
xy_shape->Add(cube);
child->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
child->m_localOBB.axisExtents = Stuff::Vector3D(1.0f, 1.0f, 1.0f);
child->SetOBBMode();
g->AttachChild(child);
child->SetAlignX();
child->SetAlignY();
child->SetVolumeCullMode();
child->SetName("XYAxis");
for (x=-10.0f; x <= 10.0f; x += 4.0f)
for (y=-10.0f; y <= 10.0f; y += 4.0f)
if (x != 0.0f || y != 0)
{
ElementRenderer::ShapeElement *element =
new ElementRenderer::ShapeElement(child);
Check_Object(element);
g->AttachChild(element);
matrix = Stuff::LinearMatrix4D::Identity;
matrix.BuildTranslation(Stuff::Point3D(x, y, 0.0f));
element->SetLocalToParent(matrix);
}
//
//-----------------------
// Build a triangle cloud
//-----------------------
//
ElementRenderer::TriangleCloudElement *tri_cloud =
new ElementRenderer::TriangleCloudElement(Triangle_Count);
Check_Object(tri_cloud);
tri_cloud->SetDataPointers(&Triangle_Count, Point_Data, Tri_Color_Data);
for (i=0; i<ELEMENTS(Tri_Color_Data); ++i)
{
Tri_Color_Data[i].red = Stuff::Random::GetFraction();
Tri_Color_Data[i].green = Stuff::Random::GetFraction();
Tri_Color_Data[i].blue = Stuff::Random::GetFraction();
Tri_Color_Data[i].alpha = Stuff::Random::GetFraction();
}
tri_cloud->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
Switch->AttachIndexedChild(5, tri_cloud);
tri_cloud->SetVolumeCullMode();
tri_cloud->SetName("Triangle cloud");
//
//-------------------------------------------
// Build a mlr_shape like option one, but scale it
//-------------------------------------------
//
Scalable =
new ElementRenderer::ScalableShapeElement;
Check_Object(Scalable);
MidLevelRenderer::MLRShape *scaling_shape = Scalable->GetMLRShape();
Check_Object(scaling_shape);
scaling_shape->Add(cube);
Scalable->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
Scalable->m_localOBB.axisExtents = Stuff::Vector3D(1.0f, 1.0f, 1.0f);
Scalable->SetOBBMode();
Switch->AttachIndexedChild(6, Scalable);
Scalable->SetVolumeCullMode();
New_Scale.x = 3.75f*Stuff::Random::GetFraction() + 0.25f;
New_Scale.y = 3.75f*Stuff::Random::GetFraction() + 0.25f;
New_Scale.z = 3.75f*Stuff::Random::GetFraction() + 0.25f;
New_Color.red = Stuff::Random::GetFraction();
New_Color.green = Stuff::Random::GetFraction();
New_Color.blue = Stuff::Random::GetFraction();
New_Color.alpha = Stuff::Random::GetFraction();
Scale_Time = 2.0f*Stuff::Random::GetFraction()+1.0f;
Scalable->SetName("Scalable");
//
//---------------------
// Build the FX library
//---------------------
//
gos_PushCurrentHeap(gosFX::Heap);
gosFX::EffectLibrary::Instance = new gosFX::EffectLibrary;
Check_Object(gosFX::EffectLibrary::Instance);
gosFX::EffectLibrary::Instance->m_effects.SetLength(EFFECT_COUNT);
gosFX::EffectLibrary::Instance->m_effects.AssignValue(NULL,EFFECT_COUNT);
CreateShardCloud(gosFX::EffectLibrary::Instance, 0);
CreateShape(gosFX::EffectLibrary::Instance, 1, scaling_shape);
CreatePointCloud(gosFX::EffectLibrary::Instance, 2 /*, 1*/);
CreateShapeCloud(gosFX::EffectLibrary::Instance, 3, scaling_shape);
CreatePertCloud(gosFX::EffectLibrary::Instance, 4);
CreateCardCloud(gosFX::EffectLibrary::Instance, 5, texture /*, 0*/);
CreateEffectCloud(gosFX::EffectLibrary::Instance, 6, 2);
CreateCard(gosFX::EffectLibrary::Instance, 7, texture);
CreateTube(gosFX::EffectLibrary::Instance, 8, texture);
MString fileName("Assets\\Graphics\\test.EBF");
CreateDebris(gosFX::EffectLibrary::Instance, 9, &fileName);
CreateBeam(gosFX::EffectLibrary::Instance, 10, texture);
CreateFlare(gosFX::EffectLibrary::Instance, 11, texture);
gos_PopCurrentHeap();
//
//-------------------------
// Build a simple FX holder
//-------------------------
//
gos_Effect =
gosFX::EffectLibrary::Instance->MakeEffect(
EFFECT,
gosFX::Effect::LoopFlag
// | gosFX::Effect::LocalSpaceSimulationMode
// | gosFX::Effect::StaticWorldSpaceSimulationMode
| gosFX::Effect::DynamicWorldSpaceSimulationMode
);
Check_Object(gos_Effect);
Effect = new ElementRenderer::gosFXElement(gos_Effect);
Check_Object(Effect);
Effect->m_localOBB.sphereRadius = Stuff::Sqrt(3.0f);
Switch->AttachIndexedChild(7,Effect);
Effect->SetVolumeCullMode();
Effect->SetName("gosFX");
Stuff::LinearMatrix4D effect_origin(true);
// effect_origin.BuildRotation(YawPitchRoll(0.0f, 0.0f, Stuff::Pi_Over_2));
Effect->SetLocalToParent(effect_origin);
Effect->Sync();
//
//---------------
// Build a camera
//---------------
//
Camera_State = new ElementRenderer::StateChange();
Check_Object(Camera_State);
Camera_State->EnableBackfaceCulling();
Camera_State->EnableDithering();
Camera_State->EnablePerspectiveCorrection();
Camera_State->EnableZBufferWrite();
Camera_State->EnableZBufferCompare();
Camera_State->DisableChildWireFrameControl();
Camera = new ElementRenderer::CameraElement(Camera_State);
Check_Object(Camera);
Scene->AttachIndexedChild(1, Camera);
Camera->SetPerspective(1.0f, 1100.0f, Stuff::Pi_Over_3);
Camera->SetViewport(0.0f, 0.0f, 1.0f, 1.0f);
Camera->SetScene(Scene);
Stuff::LinearMatrix4D origin;
origin.BuildRotation(
Stuff::EulerAngles(Camera_Direction.pitch, Camera_Direction.yaw, 0.0f)
);
origin.BuildTranslation(Stuff::Point3D(Camera_Direction));
Camera->SetLocalToParent(origin);
Camera->LockBounds();
//
//-------------------------------
// Build the screen Quads element
//-------------------------------
//
Quad = new ElementRenderer::ScreenQuadsElement(1);
Check_Object(Quad);
Stuff::Vector4D *corners;
Stuff::RGBAColor *colors;
Stuff::Vector2DOf<Stuff::Scalar> *uvs;
Quad->GetQuadData(0, &corners, &colors, &uvs, &Quad_Status);
corners[0] = Stuff::Vector4D(0.1f, 0.1f, 0.0f, 1.0f);
corners[1] = Stuff::Vector4D(0.1f, 0.2f, 0.0f, 1.0f);
corners[2] = Stuff::Vector4D(0.2f, 0.2f, 0.0f, 1.0f);
corners[3] = Stuff::Vector4D(0.2f, 0.1f, 0.0f, 1.0f);
colors[0] = Stuff::RGBAColor(1.0f, 0.0f, 0.0f, 1.0f);
colors[1] = Stuff::RGBAColor(0.0f, 1.0f, 0.0f, 1.0f);
colors[2] = Stuff::RGBAColor(0.0f, 0.0f, 1.0f, 1.0f);
colors[3] = Stuff::RGBAColor(1.0f, 1.0f, 1.0f, 1.0f);
uvs[0] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
uvs[1] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
uvs[2] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
uvs[3] = Stuff::Vector2DOf<Stuff::Scalar>(0.0f, 0.0f);
Camera->AttachChild(Quad);
ElementRenderer::StateChange *quad_state = new ElementRenderer::StateChange();
Check_Object(quad_state);
quad_state->SetRenderPriority(ElementRenderer::StateChange::HUDPriority1);
Quad->AdoptStateChange(quad_state);
//
//-----------------------------------------------------
// Sync the matrices of the scene and load the textures
//-----------------------------------------------------
//
Scene->Sync();
MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
gos_PopCurrentHeap();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void __stdcall DoGameLogic()
{
//
//------------------------
// Animate the point cloud
//------------------------
//
Stuff::Scalar now = static_cast<Stuff::Scalar>(gos_GetElapsedTime());
Stuff::Scalar step = now - Last_Frame;
Last_Frame = now;
for (int i=0; i<Point_Count; ++i)
{
Time_Left[i] -= step;
if (Time_Left[i] <= 0.0f)
{
Point_Data[i] = Point_Dest[i];
Point_Dest[i].x = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].y = 2.0f*Stuff::Random::GetFraction()-1.0f;
Point_Dest[i].z = 2.0f*Stuff::Random::GetFraction()-1.0f;
Time_Left[i] = 2.0f*Stuff::Random::GetFraction()+1.0f;
}
else
{
Point_Data[i].Lerp(
Point_Data[i],
Point_Dest[i],
step / (step + Time_Left[i])
);
}
}
//
//------------------
// Animate the scale
//------------------
//
Scale_Time -= step;
Check_Object(Scalable);
if (Scale_Time <= 0.0f)
{
Scalable->SetColor(New_Color);
Scalable->SetScale(New_Scale);
New_Scale.x = 3.75f*Stuff::Random::GetFraction() + 0.25f;
New_Scale.y = 3.75f*Stuff::Random::GetFraction() + 0.25f;
New_Scale.z = 3.75f*Stuff::Random::GetFraction() + 0.25f;
New_Color.red = Stuff::Random::GetFraction();
New_Color.green = Stuff::Random::GetFraction();
New_Color.blue = Stuff::Random::GetFraction();
New_Color.alpha = Stuff::Random::GetFraction();
Scale_Time = 2.0f*Stuff::Random::GetFraction()+1.0f;
}
else
{
Stuff::Vector3D scale;
Stuff::Scalar t = step / (step + Scale_Time);
scale.Lerp(Scalable->GetScale(), New_Scale, t);
Scalable->SetScale(scale);
Stuff::RGBAColor color;
color.Lerp(Scalable->GetColor(), New_Color, t);
Scalable->SetColor(color);
}
//
//--------------
// Run the gosFX
//--------------
//
#if 1
Stuff::LinearMatrix4D effect_origin = Effect->GetLocalToParent();
Effect_Angle += step * Stuff::Pi_Over_2;
Effect_Angle.Normalize();
Stuff::YawPitchRoll ypr(-Effect_Angle, Stuff::Pi_Over_2, 0.0f);
Stuff::SinCosPair xz;
xz = Effect_Angle;
effect_origin(3, Stuff::X_Axis) = xz.cosine*3.0f;
effect_origin(3, Stuff::Z_Axis) = xz.sine*3.0f;
effect_origin.BuildRotation(ypr);
Effect->SetLocalToParent(effect_origin);
#endif
//
//-----------------------------------------------
// Read the keyboard to see how to set the switch
//-----------------------------------------------
//
int temp;
char key = (char)(gos_GetKey()&255);
switch (key)
{
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (key<'1'+SwitchSize)
Switch->SetSwitch(static_cast<unsigned short>(key-'1'));
if (key == '8')
{
Point3D end(
Effect->GetLocalToWorld()(3,0) * xz.cosine,
Effect->GetLocalToWorld()(3,1) * xz.cosine,
Effect->GetLocalToWorld()(3,2) * xz.cosine
);
gosFX::Beam::ExecuteInfo
info(
gos_GetElapsedTime(),
&Effect->GetLocalToWorld(),
&end,
&Effect->m_localOBB
);
#if EFFECT!=10
Effect->GetEffect()->Start(&info);
#else
Cast_Object(gosFX::Beam*, Effect->GetEffect())->Start(&info);
#endif
Effect->SetNeverCullMode();
}
else
{
Effect->GetEffect()->Kill();
}
break;
//
//--------------
// Blending mode
//--------------
//
case 'a':
Check_Object(Camera_State);
temp = Camera_State->GetAlphaMode() + 1;
if (temp>ElementRenderer::StateChange::AlphaInvAlphaMode)
Camera_State->SetAlphaMode(ElementRenderer::StateChange::OneZeroMode);
else
Camera_State->SetAlphaMode(
static_cast<ElementRenderer::StateChange::AlphaMode>(temp)
);
break;
//
//---------------
// Backface mode
//---------------
//
case 'b':
Check_Object(Camera_State);
if (Camera_State->IsBackfaceCullingEnabled())
Camera_State->DisableBackfaceCulling();
else
Camera_State->EnableBackfaceCulling();
break;
//
//---------------------
// Zbuffer compare mode
//---------------------
//
case 'c':
Check_Object(Camera_State);
if (Camera_State->IsZBufferCompareEnabled())
Camera_State->DisableZBufferCompare();
else
Camera_State->EnableZBufferCompare();
break;
//
//---------------
// Dithering mode
//---------------
//
case 'd':
Check_Object(Camera_State);
if (Camera_State->IsDitheringEnabled())
Camera_State->DisableDithering();
else
Camera_State->EnableDithering();
break;
//
//----------------
// Filtering modes
//----------------
//
case 'f':
Check_Object(Camera_State);
temp = Camera_State->GetFilterMode() + 1;
if (temp>ElementRenderer::StateChange::TrilinearMode)
Camera_State->SetFilterMode(ElementRenderer::StateChange::PointSampleMode);
else
Camera_State->SetFilterMode(
static_cast<ElementRenderer::StateChange::FilterMode>(temp)
);
break;
//
//-----------------
// perspective mode
//-----------------
//
case 'p':
Check_Object(Camera_State);
if (Camera_State->IsPerspectiveCorrectionEnabled())
Camera_State->DisablePerspectiveCorrection();
else
Camera_State->EnablePerspectiveCorrection();
break;
//
//-----------------------
// toggle the screen quad
//-----------------------
//
case 'q':
Check_Pointer(Quad_Status);
*Quad_Status = (*Quad_Status) ? false : true;
break;
//
//---------------
// texture handle
//---------------
//
case 's':
Check_Object(Effect);
Effect->GetEffect()->Stop();
break;
//
//---------------
// texture handle
//---------------
//
case 't':
Check_Object(Camera_State);
if (
Camera_State->GetMLRState().GetRenderPermissionMask()
& MidLevelRenderer::MLRState::TextureMask
)
Camera_State->DisableChildTextureHandleControl();
else
Camera_State->EnableChildTextureHandleControl();
break;
//
//---------------
// Wireframe mode
//---------------
//
case 'w':
Check_Object(Camera_State);
temp = Camera_State->GetWireFrameMode() + 1;
if (temp>ElementRenderer::StateChange::SolidAndWireMode)
Camera_State->SetWireFrameMode(ElementRenderer::StateChange::SolidMode);
else
Camera_State->SetWireFrameMode(
static_cast<ElementRenderer::StateChange::WireFrameMode>(temp)
);
break;
//
//-------------------
// Zbuffer write mode
//-------------------
//
case 'z':
Check_Object(Camera_State);
if (Camera_State->IsZBufferWriteEnabled())
Camera_State->DisableZBufferWrite();
else
Camera_State->EnableZBufferWrite();
break;
}
//
//---------------
// Read the mouse
//---------------
//
static float
last_x_pos,
last_y_pos;
float
x_pos,
y_pos;
static bool
first_time = true;
int
x_delta,
y_delta;
DWORD
buttons;
Stuff::Scalar
x_speed = 0.0f,
y_speed = 0.0f;
gos_GetMouseInfo(&x_pos, &y_pos, &x_delta, &y_delta, NULL, &buttons);
if (first_time)
first_time = false;
else
{
x_speed = x_pos - last_x_pos;
y_speed = y_pos - last_y_pos;
}
last_x_pos = x_pos;
last_y_pos = y_pos;
//
//------------------------------------------------------
// If the left Ctrl button is held down, move the camera
//------------------------------------------------------
//
gosEnum_KeyStatus status = gos_GetKeyStatus(KEY_LCONTROL);
if (status != KEY_FREE && status != KEY_RELEASED)
{
Camera_Direction.pitch += y_speed;
Camera_Direction.yaw -= x_speed;
}
//
//------------------------------------------------------
// If the left Shift button is held down, pan the camera
//------------------------------------------------------
//
status = gos_GetKeyStatus(KEY_LSHIFT);
if (status != KEY_FREE && status != KEY_RELEASED)
{
Camera_Shift.x += x_speed;
Camera_Shift.y += y_speed;
}
//
//-----------------------------------------------------
// If the left Alt button is held down, zoom the camera
//-----------------------------------------------------
//
status = gos_GetKeyStatus(KEY_LMENU);
if (status != KEY_FREE && status != KEY_RELEASED)
{
Camera_Direction.range += y_speed;
}
//
//----------------------
// Set the camera matrix
//----------------------
//
Stuff::LinearMatrix4D origin;
origin.BuildRotation(
Stuff::EulerAngles(Camera_Direction.pitch, Camera_Direction.yaw, 0.0f)
);
Stuff::UnitVector3D
world_left,
world_up;
origin.GetLocalLeftInWorld(&world_left);
origin.GetLocalUpInWorld(&world_up);
Stuff::Point3D translation(Camera_Direction);
translation.AddScaled(translation, world_left, Camera_Shift.x);
translation.AddScaled(translation, world_up, Camera_Shift.y);
origin.BuildTranslation(translation);
Camera->SetLocalToParent(origin);
//
//-------------------------------------------------------
// Now that we have moved everything, update the matrices
//-------------------------------------------------------
//
Scene->Sync();
//
//------------------------
// Now animate the effects
//------------------------
//
Point3D end(
Effect->GetLocalToWorld()(3,0) * xz.cosine,
Effect->GetLocalToWorld()(3,1) * xz.cosine,
Effect->GetLocalToWorld()(3,2) * xz.cosine
);
gosFX::Beam::ExecuteInfo
info(
gos_GetElapsedTime(),
&Effect->GetLocalToWorld(),
&end,
&Effect->m_localOBB
);
#if EFFECT!=10
if (Effect->GetEffect()->Execute(&info))
#else
if (Cast_Object(gosFX::Beam*, Effect->GetEffect())->Execute(&info))
#endif
{
if (Effect->m_localOBB.sphereRadius > 0.0f)
Effect->NeedNewBounds();
else
Effect->SetNeverCullMode();
}
else
Effect->SetAlwaysCullMode();
Effect->Sync();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void __stdcall UpdateDisplay()
{
Camera->DrawScene();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void __stdcall TerminateGameEngine()
{
//
//-----------------
// Delete the scene
//-----------------
//
Check_Object(Scene);
delete Scene;
//
//-------------------
// Turn off libraries
//-------------------
//
ElementRenderer::TerminateClasses();
gosFX::TerminateClasses();
MidLevelRenderer::TerminateClasses();
Stuff::TerminateClasses();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void __stdcall GetGameOSEnvironment(char* CommandLine)
{
Environment.applicationName = "fart";
Environment.version = "";
// Environment.directoryPath = "code\\MW4Application";
Environment.allowMultipleApps = false;
Environment.screenWidth = 640;
Environment.screenHeight = 480;
Environment.bitDepth = 16;
Environment.FullScreenDevice = 0;
Environment.Renderer = 0;
Environment.fullScreen = false;
Environment.disableZBuffer = false;
Environment.AntiAlias = false;
Environment.RenderToVram = false;
Environment.Key_FullScreen = 0;
Environment.Key_SwitchMonitors = KEY_F5;
Environment.Key_Exit = 0;
Environment.debugLog = "ElementTest.txt";
Environment.spew = "GameOS_Memory";
Environment.TimeStampSpew = false;
Environment.memoryTraceLevel = 5;
Environment.MaxTimeDelta = 0.25f;
Environment.MinimumTimeDelta = 0.25f;
Environment.soundDisable = true;
Environment.soundHiFi = true;
Environment.soundDevice = 0;
Environment.soundChannels = 16;
Environment.NetworkGame = false;
Environment.Texture_S_256 = 0;
Environment.Texture_S_128 = 0;
Environment.Texture_S_64 = 0;
Environment.Texture_S_32 = 0;
Environment.Texture_S_16 = 0;
Environment.Texture_K_256 = 0;
Environment.Texture_K_128 = 0;
Environment.Texture_K_64 = 0;
Environment.Texture_K_32 = 0;
Environment.Texture_K_16 = 0;
Environment.Texture_A_256 = 0;
Environment.Texture_A_128 = 0;
Environment.Texture_A_64 = 0;
Environment.Texture_A_32 = 0;
Environment.Texture_A_16 = 0;
Environment.GetGameInformation = NULL;
Environment.InitializeGameEngine = InitializeGameEngine;
Environment.DoGameLogic = DoGameLogic;
Environment.UpdateRenderers = UpdateDisplay;
Environment.TerminateGameEngine = TerminateGameEngine;
}