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.
1619 lines
43 KiB
C++
1619 lines
43 KiB
C++
#include <MLR\MLRHeaders.hpp>
|
|
|
|
extern bool dontSeeMe;
|
|
|
|
HGOSFONT3D Font_Arial8;
|
|
|
|
// the clipper is the "desciption" of the view frustrum
|
|
MLRClipper *theClipper;
|
|
|
|
// contains all necessary information to draw a shape
|
|
const int nrOfShapes = 2;
|
|
DrawShapeInformation *drawShapeInfo[nrOfShapes];
|
|
LinearMatrix4D *shapeOrigins[nrOfShapes], *invertedShapeOrigin[nrOfShapes];
|
|
IcoInfo icoInfo[nrOfShapes];
|
|
|
|
LinearMatrix4D cameraOrigin;
|
|
|
|
YawPitchRange Camera_Direction(0.0f, 0.0f, -10.0f);
|
|
Vector2DOf<Scalar> Camera_Shift(0.0f, 0.0f);
|
|
|
|
DynamicArrayOf<MLRState> *states; // need 2
|
|
|
|
Matrix4D cameraToClip;
|
|
|
|
RGBAColor fogColor(0.2f, 0.2f, 0.2f, 1.0f);
|
|
RGBAColor bgColor(0.1f, 0.1f, 0.1f, 1.0f);
|
|
RGBAColor white(1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
int activeLightType = 0;
|
|
DynamicArrayOf<MLRLight*> *sceneLights; // need 8
|
|
|
|
MLRLightMap *firstLightMap = NULL;
|
|
|
|
LinearMatrix4D displacementMatrix;
|
|
LinearMatrix4D *moreClones[nrOfShapes], *invertedMoreClones[nrOfShapes];
|
|
|
|
extern void _stdcall End3DScene();
|
|
|
|
// This function creates out of a frustum a camera-to-clip matrix
|
|
void
|
|
SetPerspective(
|
|
Scalar near_clip,
|
|
Scalar far_clip,
|
|
Scalar left_clip,
|
|
Scalar right_clip,
|
|
Scalar top_clip,
|
|
Scalar bottom_clip,
|
|
Matrix4D& cameraToClip
|
|
)
|
|
{
|
|
Verify(far_clip - near_clip > SMALL);
|
|
Verify(left_clip - right_clip > SMALL);
|
|
Verify(top_clip - bottom_clip > SMALL);
|
|
|
|
//
|
|
//-------------------------------------------------------
|
|
// Calculate the horizontal, vertical, and forward ranges
|
|
//-------------------------------------------------------
|
|
//
|
|
Scalar horizontal_range = APPLY_LEFT_SIGN(1.0f) / (left_clip - right_clip);
|
|
Scalar vertical_range = APPLY_UP_SIGN(1.0f) / (top_clip - bottom_clip);
|
|
Scalar depth_range = APPLY_FORWARD_SIGN(1.0f) / (far_clip - near_clip);
|
|
|
|
//
|
|
//------------------------------------------------------------------------
|
|
// Set up the camera to clip matrix. This matrix takes camera space
|
|
// coordinates and maps them into a homogeneous culling space where valid
|
|
// X, Y, and Z axis values (when divided by W) will all be between 0 and 1
|
|
//------------------------------------------------------------------------
|
|
//
|
|
cameraToClip(LEFT_AXIS, LEFT_AXIS) = near_clip * horizontal_range;
|
|
cameraToClip(LEFT_AXIS, UP_AXIS) = 0.0f;
|
|
cameraToClip(LEFT_AXIS, FORWARD_AXIS) = 0.0f;
|
|
cameraToClip(LEFT_AXIS, 3) = 0.0f;
|
|
|
|
cameraToClip(UP_AXIS, LEFT_AXIS) = 0.0f;
|
|
cameraToClip(UP_AXIS, UP_AXIS) = near_clip * vertical_range;
|
|
cameraToClip(UP_AXIS, FORWARD_AXIS) = 0.0f;
|
|
cameraToClip(UP_AXIS, 3) = 0.0f;
|
|
|
|
cameraToClip(FORWARD_AXIS, LEFT_AXIS) = -right_clip * horizontal_range;
|
|
cameraToClip(FORWARD_AXIS, UP_AXIS) = -bottom_clip * vertical_range;
|
|
cameraToClip(FORWARD_AXIS, FORWARD_AXIS) = far_clip * depth_range;
|
|
cameraToClip(FORWARD_AXIS, 3) = 1.0f;
|
|
|
|
cameraToClip(3, LEFT_AXIS) = 0.0f;
|
|
cameraToClip(3, UP_AXIS) = 0.0f;
|
|
cameraToClip(3, FORWARD_AXIS) = -far_clip * near_clip * depth_range;
|
|
cameraToClip(3, 3) = 0.0f;
|
|
}
|
|
|
|
// This function creates out of a frustum a world-to-clip matrix
|
|
void
|
|
SetPerspective(
|
|
Scalar near_clip,
|
|
Scalar far_clip,
|
|
const Radian &horizontal_fov,
|
|
Scalar height_to_width,
|
|
Matrix4D& cameraToClip
|
|
)
|
|
{
|
|
Verify(far_clip - near_clip > SMALL);
|
|
Verify(horizontal_fov > SMALL);
|
|
Verify(height_to_width > SMALL);
|
|
|
|
//
|
|
//-------------------------------------------------------------
|
|
// Calculate the near plane offsets to the side culling planes
|
|
//-------------------------------------------------------------
|
|
//
|
|
Scalar width = (Scalar)(near_clip * tan(horizontal_fov*0.5f));
|
|
Scalar height = width * height_to_width;
|
|
SetPerspective(near_clip, far_clip, width, -width, height, -height, cameraToClip);
|
|
}
|
|
|
|
#undef TRACE_ON
|
|
|
|
void __stdcall InitializeGameEngine()
|
|
{
|
|
// Memory_Registration_Enabled=FALSE;
|
|
// Armor_Level=0;
|
|
|
|
//
|
|
//---------------------
|
|
// Initialize libraries
|
|
//---------------------
|
|
//
|
|
Stuff::InitializeClasses();
|
|
|
|
MidLevelRenderer::InitializeClasses(NULL, 8192*16, 1024*8);
|
|
// MidLevelRenderer::InitializeStatistics();
|
|
|
|
Font_Arial8=gos_LoadFont("Assets\\Graphics\\arial8.tga",0);
|
|
//
|
|
//------------------------
|
|
// Set up the texture pool
|
|
//------------------------
|
|
//
|
|
gos_PushCurrentHeap(MidLevelRenderer::TexturePoolHeap);
|
|
TGAFilePool *pool = new TGAFilePool("Assets\\Graphics\\");
|
|
Register_Object(pool);
|
|
MLRTexturePool::Instance = new MLRTexturePool(pool);
|
|
Check_Object(MLRTexturePool::Instance);
|
|
Register_Object(MLRTexturePool::Instance);
|
|
|
|
MLRTexturePool::Instance->Add("dirt");
|
|
|
|
MLRTexturePool::Instance->LoadImages();
|
|
|
|
gos_PopCurrentHeap();
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::StatesHeap);
|
|
states = new DynamicArrayOf<MLRState>;
|
|
states->SetLength(2);
|
|
Register_Object(states);
|
|
gos_PopCurrentHeap();
|
|
|
|
(*states)[0].SetBackFaceOn();
|
|
(*states)[0].SetDitherOff();
|
|
(*states)[0].SetTextureCorrectionOn();
|
|
(*states)[0].SetZBufferCompareOn();
|
|
(*states)[0].SetZBufferWriteOn();
|
|
|
|
(*states)[0].SetFilterMode(MLRState::BiLinearFilterMode);
|
|
|
|
#ifdef OLDFOG
|
|
(*states)[0].SetFogMode(MLRState::DisableFogMode);
|
|
(*states)[0].SetFogData(
|
|
0,
|
|
0.0f,
|
|
1.0f,
|
|
100.0f
|
|
);
|
|
#else
|
|
(*states)[0].SetFogMode(0);
|
|
#endif
|
|
|
|
(*states)[0].SetLightingMode(MLRState::VertexLightingMode | MLRState::LightMapLightingMode);
|
|
|
|
(*states)[1] = (*states)[0];
|
|
|
|
//
|
|
//--------------------
|
|
// Set up a test light
|
|
//--------------------
|
|
//
|
|
static Stuff::LinearMatrix4D lightToWorld;
|
|
lightToWorld.BuildTranslation(Point3D(-5.0f, 0.0f, -5.0f));
|
|
lightToWorld.BuildRotation(EulerAngles(0.0f, Pi_Over_4, 0.0f));
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::TexturePoolHeap);
|
|
MLRTexture *texture = MLRTexturePool::Instance->Add("lightspot");
|
|
Check_Object(texture);
|
|
gos_PopCurrentHeap();
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::LightsHeap);
|
|
firstLightMap = new MLRLightMap(texture);
|
|
Register_Object(firstLightMap);
|
|
|
|
sceneLights = new DynamicArrayOf<MLRLight*>;
|
|
sceneLights->SetLength(8);
|
|
Register_Object(sceneLights);
|
|
|
|
(*sceneLights)[0] = new MLRAmbientLight;
|
|
(*sceneLights)[1] = new MLRInfiniteLight;
|
|
(*sceneLights)[2] = new MLRInfiniteLightWithFalloff;
|
|
(*sceneLights)[3] = new MLRPointLight;
|
|
(*sceneLights)[4] = new MLRSpotLight;
|
|
(*sceneLights)[5] = new MLRPointLight;
|
|
(*sceneLights)[6] = new MLRSpotLight;
|
|
(*sceneLights)[7] = new MLRLookUpLight;
|
|
|
|
Degree degree(5);
|
|
Cast_Pointer(MLRSpotLight*, (*sceneLights)[4])->SetSpreadAngle(degree);
|
|
Cast_Pointer(MLRSpotLight*, (*sceneLights)[6])->SetSpreadAngle(degree);
|
|
gos_PopCurrentHeap();
|
|
|
|
for(int i=0;i<8;i++)
|
|
{
|
|
Register_Object((*sceneLights)[i]);
|
|
(*sceneLights)[i]->SetLightToWorldMatrix(lightToWorld);
|
|
(*sceneLights)[i]->SetIntensity(1.0f);
|
|
(*sceneLights)[i]->SetColor(RGBColor(1.0f, 0.0f, 1.0f));
|
|
}
|
|
|
|
for(i=2;i<7;i++)
|
|
{
|
|
Cast_Pointer(MLRInfiniteLightWithFalloff*, (*sceneLights)[i])->SetFalloffDistance(2.0f, 15.0f);
|
|
}
|
|
|
|
Cast_Pointer(MLRPointLight*, (*sceneLights)[5])->SetLightMap(firstLightMap);
|
|
Cast_Pointer(MLRSpotLight*, (*sceneLights)[6])->SetLightMap(firstLightMap);
|
|
|
|
Cast_Pointer(MLRLookUpLight*, (*sceneLights)[7])->SetMapOrigin(-40.0f, 0.0f, -40.0f);
|
|
Cast_Pointer(MLRLookUpLight*, (*sceneLights)[7])->SetMapZoneSizeX(80.0f);
|
|
Cast_Pointer(MLRLookUpLight*, (*sceneLights)[7])->SetMapZoneSizeZ(80.0f);
|
|
Cast_Pointer(MLRLookUpLight*, (*sceneLights)[7])->SetMapSizeAndName(1, 1, "Assets\\Graphics\\lighttest.raw");
|
|
|
|
// create 2 (*states) for multi textured cube
|
|
(*states)[1].SetZBufferWriteOff();
|
|
(*states)[1].SetAlphaMode(MLRState::AlphaInvAlphaMode);
|
|
|
|
(*states)[0].SetPriority(MLRState::DefaultPriority);
|
|
(*states)[1].SetPriority(MLRState::DefaultPriority + 1);
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::TexturePoolHeap);
|
|
texture = MLRTexturePool::Instance->Add("ken");
|
|
(*states)[0].SetTextureHandle(texture->GetTextureHandle());
|
|
|
|
texture = MLRTexturePool::Instance->Add("Rock_Alpha");
|
|
(*states)[1].SetTextureHandle(texture->GetTextureHandle());
|
|
gos_PopCurrentHeap();
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::MiscellaneousHeap);
|
|
// creating the camera-to-clip-space matrix
|
|
SetPerspective(1.0f, 300.0f, Pi_Over_3, 0.75f, cameraToClip);
|
|
|
|
shapeOrigins[0] = new LinearMatrix4D;
|
|
*shapeOrigins[0] = LinearMatrix4D::Identity;
|
|
Register_Object(shapeOrigins[0]);
|
|
|
|
invertedShapeOrigin[0] = new LinearMatrix4D;
|
|
*invertedShapeOrigin[0] = LinearMatrix4D::Identity;
|
|
Register_Object(invertedShapeOrigin[0]);
|
|
|
|
moreClones[0] = new LinearMatrix4D;
|
|
*moreClones[0] = LinearMatrix4D::Identity;
|
|
Register_Object(moreClones[0]);
|
|
|
|
invertedMoreClones[0] = new LinearMatrix4D;
|
|
*invertedMoreClones[0] = LinearMatrix4D::Identity;
|
|
Register_Object(invertedMoreClones[0]);
|
|
|
|
// create a shape
|
|
drawShapeInfo[0] = new DrawShapeInformation;
|
|
Register_Object(drawShapeInfo[0]);
|
|
|
|
icoInfo[0].type = MLR_I_DeT_TMeshClassID;
|
|
icoInfo[0].depth = 3;
|
|
icoInfo[0].indexed = true;
|
|
icoInfo[0].radius = 1.0f;
|
|
icoInfo[0].all = 1.0f;
|
|
icoInfo[0].onOff = true;
|
|
drawShapeInfo[0]->shape = CreateIndexedIcosahedron(icoInfo[0], &(*states));
|
|
// drawShapeInfo[0]->shape = CreateIndexedTriIcosahedron_NoColor_NoLit(icoInfo[0], &((*states)[0]));
|
|
|
|
// drawShapeInfo[0]->clippingFlags.SetClippingState(0x3f);
|
|
drawShapeInfo[0]->clippingFlags.SetClippingState(0);
|
|
drawShapeInfo[0]->shapeToWorld = shapeOrigins[0];
|
|
drawShapeInfo[0]->worldToShape = invertedShapeOrigin[0];
|
|
|
|
drawShapeInfo[0]->activeLights = (*sceneLights).GetData()+activeLightType;
|
|
drawShapeInfo[0]->nrOfActiveLights = 1;
|
|
|
|
drawShapeInfo[0]->paintMeColor = &white;
|
|
|
|
shapeOrigins[0]->BuildTranslation(Point3D(-1.01f, 0.0f, 0.0f));
|
|
shapeOrigins[0]->BuildRotation(EulerAngles(0.0f, 0.0f, 0.0f));
|
|
|
|
invertedShapeOrigin[0]->Invert(*drawShapeInfo[0]->shapeToWorld);
|
|
|
|
drawShapeInfo[0]->state = (*states)[0];
|
|
|
|
// create another shape
|
|
shapeOrigins[1] = new LinearMatrix4D;
|
|
*shapeOrigins[1] = LinearMatrix4D::Identity;
|
|
Register_Object(shapeOrigins[1]);
|
|
|
|
invertedShapeOrigin[1] = new LinearMatrix4D;
|
|
*invertedShapeOrigin[1] = LinearMatrix4D::Identity;
|
|
Register_Object(invertedShapeOrigin[1]);
|
|
|
|
moreClones[1] = new LinearMatrix4D;
|
|
*moreClones[1] = LinearMatrix4D::Identity;
|
|
Register_Object(moreClones[1]);
|
|
|
|
invertedMoreClones[1] = new LinearMatrix4D;
|
|
*invertedMoreClones[1] = LinearMatrix4D::Identity;
|
|
Register_Object(invertedMoreClones[1]);
|
|
|
|
drawShapeInfo[1] = new DrawShapeInformation;
|
|
Register_Object(drawShapeInfo[1]);
|
|
|
|
icoInfo[1].type = MLR_I_TMeshClassID;
|
|
icoInfo[1].depth = 3;
|
|
icoInfo[1].indexed = true;
|
|
icoInfo[1].radius = 1.0f;
|
|
icoInfo[1].all = 1.0f;
|
|
icoInfo[1].onOff = true;
|
|
|
|
gos_PopCurrentHeap();
|
|
|
|
drawShapeInfo[1]->shape = CreateIndexedIcosahedron(icoInfo[1], &(*states));
|
|
|
|
// drawShapeInfo[1]->clippingFlags.SetClippingState(0x3f);
|
|
drawShapeInfo[1]->clippingFlags.SetClippingState(0);
|
|
drawShapeInfo[1]->shapeToWorld = shapeOrigins[1];
|
|
drawShapeInfo[1]->worldToShape = invertedShapeOrigin[1];
|
|
|
|
drawShapeInfo[1]->activeLights = (*sceneLights).GetData()+activeLightType;
|
|
drawShapeInfo[1]->nrOfActiveLights = 1;
|
|
|
|
drawShapeInfo[1]->paintMeColor = &white;
|
|
|
|
shapeOrigins[1]->BuildTranslation(Point3D(1.01f, 0.0f, 0.0f));
|
|
// shapeOrigins[1]->BuildRotation(EulerAngles(0.2f, 0.4f, 0.6f));
|
|
|
|
invertedShapeOrigin[1]->Invert(*drawShapeInfo[1]->shapeToWorld);
|
|
|
|
drawShapeInfo[1]->state = (*states)[0];
|
|
|
|
// misc.
|
|
displacementMatrix.BuildTranslation(Point3D(0.1f, 0.1f, 0.1f));
|
|
displacementMatrix.BuildRotation(EulerAngles(0.2f, 0.2f, 0.2f));
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::TexturePoolHeap);
|
|
MLRTexturePool::Instance->LoadImages();
|
|
gos_PopCurrentHeap();
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::SorterHeap);
|
|
MLRSortByOrder *cameraSorter = new MLRSortByOrder(MLRTexturePool::Instance);
|
|
Register_Object(cameraSorter);
|
|
gos_PopCurrentHeap();
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::ClipperHeap);
|
|
theClipper = new MLRClipper(0, cameraSorter);
|
|
Register_Object(theClipper);
|
|
gos_PopCurrentHeap();
|
|
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::MiscellaneousHeap);
|
|
cameraOrigin.BuildRotation(
|
|
EulerAngles(Camera_Direction.pitch, Camera_Direction.yaw, 0.0f)
|
|
);
|
|
cameraOrigin.BuildTranslation(Point3D(Camera_Direction));
|
|
|
|
GOSVertex::farClipReciprocal = (1.0f-cameraToClip(2, 2))/cameraToClip(3, 2);
|
|
gos_PopCurrentHeap();
|
|
}
|
|
|
|
int LastKey=-1;
|
|
bool cloneMe = false;
|
|
bool visText = true;
|
|
bool animateTextures = false;
|
|
bool displacement = true;
|
|
int moreShapes = 20;
|
|
bool otherCamera=false;
|
|
|
|
void __stdcall DoGameLogic()
|
|
{
|
|
gosEnum_KeyStatus status;
|
|
|
|
//
|
|
// Read keyboard
|
|
//
|
|
|
|
DWORD KeyPress, KeyPressAll=gos_GetKey();
|
|
if( KeyPressAll )
|
|
SPEW(( "Keyboard", "Key=0x%x, '%c'",KeyPressAll, KeyPressAll ));
|
|
|
|
KeyPress = KeyPressAll&255;
|
|
|
|
if( KeyPress=='m' || KeyPress=='M' )
|
|
{
|
|
gos_WalkMemoryHeap(StaticHeap, true);
|
|
}
|
|
|
|
|
|
if( KeyPress=='l' || KeyPress=='L' )
|
|
{
|
|
if(0==drawShapeInfo[0]->nrOfActiveLights)
|
|
{
|
|
drawShapeInfo[0]->nrOfActiveLights = 1;
|
|
drawShapeInfo[1]->nrOfActiveLights = 1;
|
|
}
|
|
else
|
|
{
|
|
drawShapeInfo[0]->nrOfActiveLights = 0;
|
|
drawShapeInfo[1]->nrOfActiveLights = 0;
|
|
}
|
|
}
|
|
|
|
if( KeyPress=='d')
|
|
{
|
|
dontSeeMe = !dontSeeMe;
|
|
}
|
|
|
|
if( KeyPress=='c')
|
|
{
|
|
if(0==drawShapeInfo[0]->clippingFlags.GetClippingState())
|
|
{
|
|
drawShapeInfo[0]->clippingFlags.SetClippingState(0x3f);;
|
|
}
|
|
else
|
|
{
|
|
drawShapeInfo[0]->clippingFlags.SetClippingState(0);;
|
|
}
|
|
}
|
|
if( KeyPress=='C' )
|
|
{
|
|
if(0==drawShapeInfo[1]->clippingFlags.GetClippingState())
|
|
{
|
|
drawShapeInfo[1]->clippingFlags.SetClippingState(0x3f);;
|
|
}
|
|
else
|
|
{
|
|
drawShapeInfo[1]->clippingFlags.SetClippingState(0);;
|
|
}
|
|
}
|
|
|
|
if( KeyPress=='s')
|
|
{
|
|
icoInfo[0].onOff = !icoInfo[0].onOff;
|
|
}
|
|
if( KeyPress=='S' )
|
|
{
|
|
icoInfo[1].onOff = !icoInfo[1].onOff;
|
|
}
|
|
|
|
if( KeyPress=='o' || KeyPress=='O')
|
|
{
|
|
cloneMe = !cloneMe;
|
|
}
|
|
|
|
if( KeyPress=='a' || KeyPress=='A')
|
|
{
|
|
animateTextures = !animateTextures;
|
|
}
|
|
|
|
if( KeyPress=='p' || KeyPress=='p')
|
|
{
|
|
displacement = !displacement;
|
|
}
|
|
|
|
if( KeyPress=='7')
|
|
{
|
|
if(moreShapes>0)
|
|
moreShapes--;
|
|
}
|
|
if( KeyPress=='8')
|
|
{
|
|
moreShapes++;
|
|
}
|
|
|
|
if( KeyPress=='h' || KeyPress=='H' || KeyPressAll==0x3b00)
|
|
{
|
|
visText = !visText;
|
|
}
|
|
|
|
if( KeyPress=='w' || KeyPress=='W')
|
|
{
|
|
otherCamera = !otherCamera;
|
|
}
|
|
|
|
int changed = 0;
|
|
if( KeyPress=='}' )
|
|
{
|
|
switch(icoInfo[1].type)
|
|
{
|
|
case MLR_I_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DeT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DeT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_TMeshClassID:
|
|
icoInfo[1].type = MLR_Terrain2ClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_Terrain2ClassID:
|
|
icoInfo[1].type = MLR_I_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
}
|
|
if(changed)
|
|
{
|
|
if(drawShapeInfo[1]->shape)
|
|
{
|
|
drawShapeInfo[1]->shape->DetachReference();
|
|
}
|
|
drawShapeInfo[1]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[1], &(*states));
|
|
}
|
|
}
|
|
|
|
if( KeyPress==']' )
|
|
{
|
|
switch(icoInfo[0].type)
|
|
{
|
|
case MLR_I_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DeT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DeT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_TMeshClassID:
|
|
icoInfo[0].type = MLR_Terrain2ClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_Terrain2ClassID:
|
|
icoInfo[0].type = MLR_I_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
}
|
|
if(changed)
|
|
{
|
|
if(drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
drawShapeInfo[0]->shape->DetachReference();
|
|
}
|
|
drawShapeInfo[0]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[0], &(*states));
|
|
}
|
|
}
|
|
|
|
if( KeyPress=='{' )
|
|
{
|
|
switch(icoInfo[1].type)
|
|
{
|
|
case MLR_I_PMeshClassID:
|
|
icoInfo[1].type = MLR_Terrain2ClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DeT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_PMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
|
|
|
|
case MLR_I_DeT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_L_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_TMeshClassID:
|
|
icoInfo[1].type = MLR_I_C_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
|
|
|
|
case MLR_Terrain2ClassID:
|
|
icoInfo[1].type = MLR_I_L_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
}
|
|
if(changed)
|
|
{
|
|
if(drawShapeInfo[1]->shape != NULL)
|
|
{
|
|
drawShapeInfo[1]->shape->DetachReference();
|
|
}
|
|
drawShapeInfo[1]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[1], &(*states));
|
|
}
|
|
}
|
|
|
|
if( KeyPress=='[' )
|
|
{
|
|
switch(icoInfo[0].type)
|
|
{
|
|
case MLR_I_PMeshClassID:
|
|
icoInfo[0].type = MLR_Terrain2ClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DeT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_DT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_PMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_DeT_PMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DeT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DeT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DeT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_DT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_L_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_C_DT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_DeT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_I_L_DT_TMeshClassID:
|
|
icoInfo[0].type = MLR_I_C_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
case MLR_Terrain2ClassID:
|
|
icoInfo[0].type = MLR_I_DT_TMeshClassID;
|
|
changed = 1;
|
|
break;
|
|
}
|
|
if(changed)
|
|
{
|
|
if(drawShapeInfo[0]->shape)
|
|
{
|
|
drawShapeInfo[0]->shape->DetachReference();
|
|
}
|
|
drawShapeInfo[0]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[0], &(*states));
|
|
}
|
|
}
|
|
|
|
if( KeyPress==',' )
|
|
{
|
|
if(activeLightType==0)
|
|
{
|
|
activeLightType=7;
|
|
}
|
|
else
|
|
{
|
|
activeLightType--;
|
|
}
|
|
|
|
|
|
drawShapeInfo[0]->activeLights = (*sceneLights).GetData()+activeLightType;
|
|
}
|
|
|
|
if( KeyPress=='<' )
|
|
{
|
|
if(activeLightType==0)
|
|
{
|
|
activeLightType=7;
|
|
}
|
|
else
|
|
{
|
|
activeLightType--;
|
|
}
|
|
|
|
drawShapeInfo[1]->activeLights = (*sceneLights).GetData()+activeLightType;
|
|
}
|
|
|
|
if( KeyPress=='.' )
|
|
{
|
|
if(activeLightType==7)
|
|
{
|
|
activeLightType=0;
|
|
}
|
|
else
|
|
{
|
|
activeLightType++;
|
|
}
|
|
|
|
drawShapeInfo[0]->activeLights = (*sceneLights).GetData()+activeLightType;
|
|
}
|
|
|
|
if( KeyPress=='>' )
|
|
{
|
|
if(activeLightType==7)
|
|
{
|
|
activeLightType=0;
|
|
}
|
|
else
|
|
{
|
|
activeLightType++;
|
|
}
|
|
|
|
drawShapeInfo[1]->activeLights = (*sceneLights).GetData()+activeLightType;
|
|
}
|
|
|
|
status = gos_GetKeyStatus(KEY_LSHIFT);
|
|
if (status != KEY_FREE && status != KEY_RELEASED)
|
|
{
|
|
if (KeyPress == '!' ||
|
|
KeyPress == '@' ||
|
|
KeyPress == '#' ||
|
|
KeyPress == '$' ||
|
|
KeyPress == '%' ||
|
|
KeyPress == '^'
|
|
)
|
|
{
|
|
drawShapeInfo[1]->shape->DetachReference();
|
|
|
|
switch(KeyPress)
|
|
{
|
|
case '!':
|
|
icoInfo[1].depth = 0;
|
|
break;
|
|
case '@':
|
|
icoInfo[1].depth = 1;
|
|
break;
|
|
case '#':
|
|
icoInfo[1].depth = 2;
|
|
break;
|
|
case '$':
|
|
icoInfo[1].depth = 3;
|
|
break;
|
|
case '%':
|
|
icoInfo[1].depth = 4;
|
|
break;
|
|
}
|
|
drawShapeInfo[1]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[1], &(*states));
|
|
}
|
|
if(KeyPress == 'I')
|
|
{
|
|
icoInfo[1].indexed = !icoInfo[1].indexed;
|
|
drawShapeInfo[1]->shape->DetachReference();
|
|
drawShapeInfo[1]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[1], &(*states));
|
|
}
|
|
if(KeyPress == '+')
|
|
{
|
|
icoInfo[1].radius += 0.2f;
|
|
drawShapeInfo[1]->shape->DetachReference();
|
|
drawShapeInfo[1]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[1], &(*states));
|
|
}
|
|
if(KeyPress == '_')
|
|
{
|
|
if(icoInfo[1].radius > 0.39f)
|
|
{
|
|
icoInfo[1].radius -= 0.2f;
|
|
drawShapeInfo[1]->shape->DetachReference();
|
|
drawShapeInfo[1]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[1], &(*states));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (KeyPress >= '1' && KeyPress < '6')
|
|
{
|
|
drawShapeInfo[0]->shape->DetachReference();
|
|
|
|
icoInfo[0].depth = KeyPress-'1';
|
|
drawShapeInfo[0]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[0], &(*states));
|
|
}
|
|
if(KeyPress == 'i')
|
|
{
|
|
icoInfo[0].indexed = !icoInfo[0].indexed;
|
|
drawShapeInfo[0]->shape->DetachReference();
|
|
drawShapeInfo[0]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[0], &(*states));
|
|
}
|
|
if(KeyPress == '=')
|
|
{
|
|
icoInfo[0].radius += 0.2f;
|
|
drawShapeInfo[0]->shape->DetachReference();
|
|
drawShapeInfo[0]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[0], &(*states));
|
|
}
|
|
if(KeyPress == '-')
|
|
{
|
|
if(icoInfo[0].radius > 0.39f)
|
|
{
|
|
icoInfo[0].radius -= 0.2f;
|
|
drawShapeInfo[0]->shape->DetachReference();
|
|
drawShapeInfo[0]->shape =
|
|
CreateIndexedIcosahedron(icoInfo[0], &(*states));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
//---------------
|
|
// Read the mouse
|
|
//---------------
|
|
//
|
|
int
|
|
x_delta,
|
|
y_delta;
|
|
DWORD
|
|
buttons;
|
|
gos_GetMouseInfo(NULL, NULL, &x_delta, &y_delta, NULL, &buttons);
|
|
Scalar
|
|
x_speed = x_delta * 0.01f,
|
|
y_speed = y_delta * 0.01f;
|
|
|
|
//
|
|
//------------------------------------------------------
|
|
// If the left Ctrl button is held down, move the camera
|
|
//------------------------------------------------------
|
|
//
|
|
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 in and out
|
|
//----------------------------------------------------------------
|
|
//
|
|
status = gos_GetKeyStatus(KEY_LMENU);
|
|
if (status != KEY_FREE && status != KEY_RELEASED)
|
|
{
|
|
Camera_Direction.range *= 1.0f + 3.0f*y_speed;
|
|
}
|
|
|
|
//
|
|
//----------------------
|
|
// Set the camera matrix
|
|
//----------------------
|
|
//
|
|
cameraOrigin.BuildRotation(
|
|
EulerAngles(Camera_Direction.pitch, Camera_Direction.yaw, 0.0f)
|
|
);
|
|
UnitVector3D
|
|
world_left,
|
|
world_up;
|
|
cameraOrigin.GetLocalLeftInWorld(&world_left);
|
|
cameraOrigin.GetLocalUpInWorld(&world_up);
|
|
Point3D translation(Camera_Direction);
|
|
translation.AddScaled(translation, world_left, Camera_Shift.x);
|
|
translation.AddScaled(translation, world_up, Camera_Shift.y);
|
|
cameraOrigin.BuildTranslation(translation);
|
|
|
|
static int i, j, count = 0;
|
|
|
|
static YawPitchRoll angles(*shapeOrigins[0]);
|
|
// static Point3D posCube(-1.01f, 0.0f, 0.0f);
|
|
|
|
angles.yaw += 0.002f;
|
|
// angles.pitch += 0.004f;
|
|
// angles.roll += 0.0015f;
|
|
|
|
shapeOrigins[0]->BuildRotation(angles);
|
|
// shapeOrigins[0]->BuildTranslation(posCube);
|
|
|
|
invertedShapeOrigin[0]->Invert(*drawShapeInfo[0]->shapeToWorld);
|
|
|
|
// posCube.x = 1.01f;
|
|
angles.yaw = -angles.yaw;
|
|
|
|
shapeOrigins[1]->BuildRotation(angles);
|
|
// shapeOrigins[1]->BuildTranslation(posCube);
|
|
|
|
invertedShapeOrigin[1]->Invert(*drawShapeInfo[1]->shapeToWorld);
|
|
|
|
angles.yaw = -angles.yaw;
|
|
|
|
count++;
|
|
}
|
|
|
|
void __stdcall UpdateDisplay()
|
|
{
|
|
Scalar z = 1.0f;
|
|
theClipper->StartDraw(cameraOrigin, cameraToClip, fogColor, &bgColor, (*states)[0], &z);
|
|
int renderedTriangles = 0;
|
|
|
|
if(animateTextures == true)
|
|
{
|
|
if((*states)[0].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[0].GetTextureHandle()];
|
|
texture->SetAnimateTexture(true);
|
|
Stuff::AffineMatrix4D &textureMatrix = texture->GetTextureMatrix();
|
|
textureMatrix(3, 0) += 0.005f;
|
|
textureMatrix(3, 1) += 0.005f;
|
|
}
|
|
if((*states)[1].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[1].GetTextureHandle()];
|
|
texture->SetAnimateTexture(true);
|
|
Stuff::AffineMatrix4D &textureMatrix = texture->GetTextureMatrix();
|
|
textureMatrix(3, 0) -= 0.005f;
|
|
textureMatrix(3, 1) -= 0.005f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if((*states)[0].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[0].GetTextureHandle()];
|
|
texture->SetAnimateTexture(false);
|
|
}
|
|
if((*states)[1].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[1].GetTextureHandle()];
|
|
texture->SetAnimateTexture(false);
|
|
}
|
|
}
|
|
|
|
if(icoInfo[0].onOff == true && drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
theClipper->DrawShape(drawShapeInfo[0]);
|
|
renderedTriangles += drawShapeInfo[0]->shape->GetNumDrawnTriangles();
|
|
}
|
|
|
|
if(icoInfo[1].onOff == true && drawShapeInfo[1]->shape != NULL && cloneMe == false)
|
|
{
|
|
theClipper->DrawShape(drawShapeInfo[1]);
|
|
renderedTriangles += drawShapeInfo[1]->shape->GetNumDrawnTriangles();
|
|
}
|
|
|
|
if(cloneMe == true && drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
drawShapeInfo[0]->shapeToWorld = shapeOrigins[1];
|
|
drawShapeInfo[0]->worldToShape = invertedShapeOrigin[1];
|
|
|
|
theClipper->DrawShape(drawShapeInfo[0]);
|
|
renderedTriangles += drawShapeInfo[0]->shape->GetNumDrawnTriangles();
|
|
|
|
drawShapeInfo[0]->shapeToWorld = shapeOrigins[0];
|
|
drawShapeInfo[0]->worldToShape = invertedShapeOrigin[0];
|
|
}
|
|
|
|
for(int i=0;i<moreShapes;i++)
|
|
{
|
|
if(i&1)
|
|
{
|
|
if(drawShapeInfo[1]->shape != NULL)
|
|
{
|
|
if(displacement)
|
|
{
|
|
*invertedMoreClones[1] = *shapeOrigins[1];
|
|
|
|
for(int j=0;j<1+(i>>1);j++)
|
|
{
|
|
moreClones[1]->Multiply(*invertedMoreClones[1], displacementMatrix);
|
|
*invertedMoreClones[1] = *moreClones[1];
|
|
}
|
|
|
|
invertedMoreClones[1]->Invert(*moreClones[1]);
|
|
|
|
drawShapeInfo[1]->shapeToWorld = moreClones[1];
|
|
drawShapeInfo[1]->worldToShape = invertedMoreClones[1];
|
|
}
|
|
theClipper->DrawShape(drawShapeInfo[1]);
|
|
renderedTriangles += drawShapeInfo[1]->shape->GetNumDrawnTriangles();
|
|
|
|
if(displacement)
|
|
{
|
|
drawShapeInfo[1]->shapeToWorld = shapeOrigins[1];
|
|
drawShapeInfo[1]->worldToShape = invertedShapeOrigin[1];
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
if(displacement)
|
|
{
|
|
*invertedMoreClones[0] = *shapeOrigins[0];
|
|
|
|
for(int j=0;j<1+(i>>1);j++)
|
|
{
|
|
moreClones[0]->Multiply(*invertedMoreClones[0], displacementMatrix);
|
|
*invertedMoreClones[0] = *moreClones[0];
|
|
}
|
|
|
|
invertedMoreClones[0]->Invert(*moreClones[0]);
|
|
|
|
drawShapeInfo[0]->shapeToWorld = moreClones[0];
|
|
drawShapeInfo[0]->worldToShape = invertedMoreClones[0];
|
|
}
|
|
|
|
theClipper->DrawShape(drawShapeInfo[0]);
|
|
renderedTriangles += drawShapeInfo[0]->shape->GetNumDrawnTriangles();
|
|
|
|
if(displacement)
|
|
{
|
|
drawShapeInfo[0]->shapeToWorld = shapeOrigins[0];
|
|
drawShapeInfo[0]->worldToShape = invertedShapeOrigin[0];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
theClipper->RenderNow();
|
|
|
|
if(otherCamera==true)
|
|
{
|
|
SetViewportScalars(0.25f, 0.25f, 0.0f, 0.0f);
|
|
ClearZBuffer();
|
|
SetDefaultRenderStates();
|
|
theClipper->ResetSorter((*states)[0]);
|
|
|
|
if(animateTextures == true)
|
|
{
|
|
if((*states)[0].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[0].GetTextureHandle()];
|
|
texture->SetAnimateTexture(true);
|
|
Stuff::AffineMatrix4D &textureMatrix = texture->GetTextureMatrix();
|
|
textureMatrix(3, 0) += 0.005f;
|
|
textureMatrix(3, 1) += 0.005f;
|
|
}
|
|
if((*states)[1].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[1].GetTextureHandle()];
|
|
texture->SetAnimateTexture(true);
|
|
Stuff::AffineMatrix4D &textureMatrix = texture->GetTextureMatrix();
|
|
textureMatrix(3, 0) -= 0.005f;
|
|
textureMatrix(3, 1) -= 0.005f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if((*states)[0].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[0].GetTextureHandle()];
|
|
texture->SetAnimateTexture(false);
|
|
}
|
|
if((*states)[1].GetTextureHandle())
|
|
{
|
|
MLRTexture *texture = (*MLRTexturePool::Instance)[(*states)[1].GetTextureHandle()];
|
|
texture->SetAnimateTexture(false);
|
|
}
|
|
}
|
|
|
|
if(icoInfo[0].onOff == true && drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
theClipper->DrawShape(drawShapeInfo[0]);
|
|
renderedTriangles += drawShapeInfo[0]->shape->GetNumDrawnTriangles();
|
|
}
|
|
|
|
if(icoInfo[1].onOff == true && drawShapeInfo[1]->shape != NULL && cloneMe == false)
|
|
{
|
|
theClipper->DrawShape(drawShapeInfo[1]);
|
|
renderedTriangles += drawShapeInfo[1]->shape->GetNumDrawnTriangles();
|
|
}
|
|
|
|
if(cloneMe == true && drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
drawShapeInfo[0]->shapeToWorld = shapeOrigins[1];
|
|
drawShapeInfo[0]->worldToShape = invertedShapeOrigin[1];
|
|
|
|
theClipper->DrawShape(drawShapeInfo[0]);
|
|
renderedTriangles += drawShapeInfo[0]->shape->GetNumDrawnTriangles();
|
|
|
|
drawShapeInfo[0]->shapeToWorld = shapeOrigins[0];
|
|
drawShapeInfo[0]->worldToShape = invertedShapeOrigin[0];
|
|
}
|
|
|
|
for(int i=0;i<moreShapes;i++)
|
|
{
|
|
if(i&1)
|
|
{
|
|
if(drawShapeInfo[1]->shape != NULL)
|
|
{
|
|
if(displacement)
|
|
{
|
|
*invertedMoreClones[1] = *shapeOrigins[1];
|
|
|
|
for(int j=0;j<1+(i>>1);j++)
|
|
{
|
|
moreClones[1]->Multiply(*invertedMoreClones[1], displacementMatrix);
|
|
*invertedMoreClones[1] = *moreClones[1];
|
|
}
|
|
|
|
invertedMoreClones[1]->Invert(*moreClones[1]);
|
|
|
|
drawShapeInfo[1]->shapeToWorld = moreClones[1];
|
|
drawShapeInfo[1]->worldToShape = invertedMoreClones[1];
|
|
}
|
|
theClipper->DrawShape(drawShapeInfo[1]);
|
|
renderedTriangles += drawShapeInfo[1]->shape->GetNumDrawnTriangles();
|
|
|
|
if(displacement)
|
|
{
|
|
drawShapeInfo[1]->shapeToWorld = shapeOrigins[1];
|
|
drawShapeInfo[1]->worldToShape = invertedShapeOrigin[1];
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
if(displacement)
|
|
{
|
|
*invertedMoreClones[0] = *shapeOrigins[0];
|
|
|
|
for(int j=0;j<1+(i>>1);j++)
|
|
{
|
|
moreClones[0]->Multiply(*invertedMoreClones[0], displacementMatrix);
|
|
*invertedMoreClones[0] = *moreClones[0];
|
|
}
|
|
|
|
invertedMoreClones[0]->Invert(*moreClones[0]);
|
|
|
|
drawShapeInfo[0]->shapeToWorld = moreClones[0];
|
|
drawShapeInfo[0]->worldToShape = invertedMoreClones[0];
|
|
}
|
|
|
|
theClipper->DrawShape(drawShapeInfo[0]);
|
|
renderedTriangles += drawShapeInfo[0]->shape->GetNumDrawnTriangles();
|
|
|
|
if(displacement)
|
|
{
|
|
drawShapeInfo[0]->shapeToWorld = shapeOrigins[0];
|
|
drawShapeInfo[0]->worldToShape = invertedShapeOrigin[0];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
theClipper->RenderNow();
|
|
}
|
|
|
|
char shapeDesc[256];
|
|
if(visText==true)
|
|
{
|
|
int yOffset = 200;
|
|
|
|
gos_TextSetRegion( 0, 0, 640, 480 );
|
|
gos_TextSetAttributes( Font_Arial8, 0xffffffff, 1.0, 0, 1, 0, 0 );
|
|
gos_TextSetPosition( 500, 0+yOffset );
|
|
gos_TextDraw( "Shift -> change 2nd shape" );
|
|
gos_TextSetPosition( 520, 10+yOffset );
|
|
gos_TextDraw( "1 - 20 tri" );
|
|
gos_TextSetPosition( 520, 20+yOffset );
|
|
gos_TextDraw( "2 - 80 tri" );
|
|
gos_TextSetPosition( 520, 30+yOffset );
|
|
gos_TextDraw( "3 - 320 tri" );
|
|
gos_TextSetPosition( 520, 40+yOffset );
|
|
gos_TextDraw( "4 - 1280 tri" );
|
|
gos_TextSetPosition( 520, 50+yOffset );
|
|
gos_TextDraw( "5 - 5120 tri" );
|
|
gos_TextSetPosition( 520, 60+yOffset );
|
|
gos_TextDraw( "s - shape on/off" );
|
|
gos_TextSetPosition( 520, 70+yOffset );
|
|
gos_TextDraw( "i - non-/indexed" );
|
|
gos_TextSetPosition( 520, 80+yOffset );
|
|
gos_TextDraw( "c - non-/clipped" );
|
|
gos_TextSetPosition( 520, 90+yOffset );
|
|
gos_TextDraw( "= - radius += 0.2" );
|
|
gos_TextSetPosition( 520, 100+yOffset );
|
|
gos_TextDraw( "- - radius -= 0.2" );
|
|
gos_TextSetPosition( 520, 110+yOffset );
|
|
gos_TextDraw( "[/] - cycles types" );
|
|
|
|
gos_TextSetPosition( 520, 160+yOffset );
|
|
gos_TextDraw( "p - (no) displacement" );
|
|
gos_TextSetPosition( 520, 170+yOffset );
|
|
gos_TextDraw( "d - (do not) draw" );
|
|
gos_TextSetPosition( 520, 180+yOffset );
|
|
gos_TextDraw( ",/. - cyc.light type" );
|
|
gos_TextSetPosition( 520, 190+yOffset );
|
|
gos_TextDraw( "a - toggle anim.tex." );
|
|
gos_TextSetPosition( 520, 200+yOffset );
|
|
gos_TextDraw( "l - lights on/off" );
|
|
gos_TextSetPosition( 520, 210+yOffset );
|
|
gos_TextDraw( "o - clone on/off" );
|
|
gos_TextSetPosition( 520, 220+yOffset );
|
|
gos_TextDraw( "7/8 - less/more shapes" );
|
|
gos_TextSetPosition( 520, 230+yOffset );
|
|
gos_TextDraw( "F1/h - help on/off" );
|
|
|
|
char shapeDesc[256];
|
|
|
|
if(icoInfo[0].onOff && drawShapeInfo[0]->shape != NULL)
|
|
{
|
|
sprintf(shapeDesc, "Shape 1: 20 %s, %d tris, %sindexed, %s clipped, radius %.1fm, %s lit",
|
|
icoInfo[0].GetTypeName(),
|
|
drawShapeInfo[0]->shape->GetNumPrimitives(),
|
|
icoInfo[0].indexed?"":"non",
|
|
drawShapeInfo[0]->clippingFlags.GetClippingState()?"":"not",
|
|
icoInfo[0].radius,
|
|
drawShapeInfo[0]->nrOfActiveLights?"":"not"
|
|
);
|
|
gos_TextSetPosition( 10, 450 );
|
|
gos_TextDraw( shapeDesc );
|
|
}
|
|
|
|
if(icoInfo[1].onOff && drawShapeInfo[1]->shape != NULL)
|
|
{
|
|
if(cloneMe)
|
|
{
|
|
gos_TextSetPosition( 10, 460 );
|
|
gos_TextDraw( "Shape 2: cloned" );
|
|
}
|
|
else
|
|
{
|
|
sprintf(shapeDesc, "Shape 2: 20 %s, %d tris, %sindexed, %sclipped, radius %.1fm, %s lit",
|
|
icoInfo[1].GetTypeName(),
|
|
drawShapeInfo[1]->shape->GetNumPrimitives(),
|
|
icoInfo[1].indexed?"":"non",
|
|
drawShapeInfo[1]->clippingFlags.GetClippingState()?"":"not ",
|
|
icoInfo[1].radius,
|
|
drawShapeInfo[1]->nrOfActiveLights?"":"not"
|
|
);
|
|
gos_TextSetPosition( 10, 460 );
|
|
gos_TextDraw( shapeDesc );
|
|
}
|
|
}
|
|
|
|
int nrOfShapes = (icoInfo[0].onOff?1:0) + (icoInfo[1].onOff?1:0) + moreShapes;
|
|
sprintf(shapeDesc, "%d Shape%s visible", nrOfShapes, (nrOfShapes==1)?"":"s");
|
|
gos_TextSetPosition( 520, 450 );
|
|
gos_TextDraw( shapeDesc );
|
|
|
|
if(drawShapeInfo[1]->nrOfActiveLights)
|
|
{
|
|
gos_TextSetPosition( 520, 460 );
|
|
switch(activeLightType)
|
|
{
|
|
case 0:
|
|
gos_TextDraw( "ambient light" );
|
|
break;
|
|
case 1:
|
|
gos_TextDraw( "infinite light" );
|
|
break;
|
|
case 2:
|
|
gos_TextDraw( "infinit light w/falloff" );
|
|
break;
|
|
case 3:
|
|
gos_TextDraw( "point light" );
|
|
break;
|
|
case 4:
|
|
gos_TextDraw( "spot light" );
|
|
break;
|
|
case 5:
|
|
gos_TextDraw( "point light w/LM" );
|
|
break;
|
|
case 6:
|
|
gos_TextDraw( "spot light w/LM" );
|
|
break;
|
|
case 7:
|
|
gos_TextDraw( "lookup light" );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static __int64 timeCounter, tempCounter;
|
|
extern __int64 frequency;
|
|
|
|
tempCounter = GetCycles();
|
|
|
|
sprintf(shapeDesc, "%ld", (frequency/(tempCounter - timeCounter)));
|
|
gos_TextSetPosition( 5, 5 );
|
|
gos_TextDraw( shapeDesc );
|
|
sprintf(shapeDesc, "%d", renderedTriangles/3);
|
|
gos_TextSetPosition( 5, 15 );
|
|
gos_TextDraw( shapeDesc );
|
|
|
|
timeCounter = tempCounter;
|
|
|
|
}
|
|
|
|
int* bad_boy = (int*)0x16c7be8;
|
|
|
|
void __stdcall TerminateGameEngine()
|
|
{
|
|
for(int i=0;i<nrOfShapes;i++)
|
|
{
|
|
if(drawShapeInfo[i]->shape != NULL)
|
|
{
|
|
drawShapeInfo[i]->shape->DetachReference();
|
|
}
|
|
|
|
Unregister_Object(drawShapeInfo[i]);
|
|
delete drawShapeInfo[i];
|
|
|
|
Unregister_Object(shapeOrigins[i]);
|
|
delete shapeOrigins[i];
|
|
|
|
Unregister_Object(invertedShapeOrigin[i]);
|
|
delete invertedShapeOrigin[i];
|
|
|
|
Unregister_Object(moreClones[i]);
|
|
delete moreClones[i];
|
|
|
|
Unregister_Object(invertedMoreClones[i]);
|
|
delete invertedMoreClones[i];
|
|
}
|
|
|
|
Unregister_Object(theClipper);
|
|
delete theClipper;
|
|
|
|
for(i=0;i<8;i++)
|
|
{
|
|
Unregister_Object((*sceneLights)[i]);
|
|
delete (*sceneLights)[i];
|
|
}
|
|
|
|
sceneLights->SetLength(0);
|
|
Unregister_Object(sceneLights);
|
|
delete sceneLights;
|
|
|
|
states->SetLength(0);
|
|
Unregister_Object(states);
|
|
delete states;
|
|
|
|
//
|
|
//-------------------
|
|
// Turn off libraries
|
|
//-------------------
|
|
//
|
|
// MemoryBlockBase::UsageReport();
|
|
Unregister_Object(MLRTexturePool::Instance);
|
|
delete MLRTexturePool::Instance;
|
|
MLRTexturePool::Instance = NULL;
|
|
|
|
MidLevelRenderer::TerminateClasses();
|
|
Stuff::TerminateClasses();
|
|
}
|
|
|
|
|
|
//
|
|
// Setup the GameOS structure
|
|
//
|
|
void __stdcall GetGameOSEnvironment( char* CommandLine )
|
|
{
|
|
Environment.applicationName = "MLR Stress Test";
|
|
Environment.screenWidth = 640;
|
|
Environment.screenHeight = 480;
|
|
Environment.fullScreen = FALSE;
|
|
Environment.bitDepth = 16;
|
|
Environment.debugLog = "MStress.txt";
|
|
Environment.spew = "GameOS_Memory*"; //"GameOS*";
|
|
|
|
Environment.UpdateRenderers = UpdateDisplay;
|
|
Environment.DoGameLogic = DoGameLogic;
|
|
Environment.InitializeGameEngine = InitializeGameEngine;
|
|
Environment.TerminateGameEngine = TerminateGameEngine;
|
|
|
|
Environment.FullScreenDevice = 0;
|
|
|
|
Environment.Renderer = 0;
|
|
|
|
Environment.AntiAlias = 0; // true/false - Enable full screen antialiasing
|
|
|
|
//
|
|
// Texture infomation
|
|
//
|
|
Environment.Texture_S_256 = 8;
|
|
Environment.Texture_S_128 = 0;
|
|
Environment.Texture_S_64 = 8;
|
|
Environment.Texture_S_32 = 0;
|
|
Environment.Texture_S_16 = 0;
|
|
|
|
Environment.Texture_K_256 = 2;
|
|
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;
|
|
}
|