Files
Work/proto/source/SCENE.CPP
2024-08-07 09:16:27 -04:00

220 lines
8.2 KiB
C++

#include <proto/scene.hpp>
#include <proto/sobject.hpp>
#include <proto/tobject.hpp>
#include <common/keydata.hpp>
#include <engine/vector3d.hpp>
SceneManager::SceneManager(GUIWindow &displayWindow)
: DisplayManager(displayWindow,PurePalette("syspal.pal")),
mBmFighter("c:\\work\\scene\\media\\bmp\\tiea1.bmp"),
mBmBurst("c:\\work\\scene\\media\\bmp\\burst.bmp"),
mDisplayWindow(displayWindow)
{
ASMRoutines::setMaskInfo(TRUE,0);
mFreezeFrame=false;
}
SceneManager::~SceneManager()
{
}
void SceneManager::initVector(const Point3D &point3D,int width,Vector3D &vector3D)const
{
vector3D[0]=point3D;
vector3D[1]=Point3D(point3D.x()+width,point3D.y(),point3D.z());
vector3D[2]=Point3D(point3D.x()+width,point3D.y()-width,point3D.z());
vector3D[3]=Point3D(point3D.x(),point3D.y()-width,point3D.z());
}
// virtuals
bool SceneManager::initializeHandler(PointerPureObjectBlock &pureObjects)
{
SimpleObject *pSimpleObject;
Vector3D vector3D;
int zBegin(350);
pureObjects.remove();
for(zBegin=150;zBegin<500;zBegin+=50)
{
initVector(Point3D(200,25,zBegin+100),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-25,25,zBegin),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-25,-100,zBegin),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-100,100,zBegin+25),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-150,150,zBegin+50),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(0,0,zBegin+50),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(50,0,zBegin+75),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-200,100,zBegin+100),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-400,100,zBegin+100),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-500,100,zBegin+100),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
initVector(Point3D(-600,100,zBegin+100),50,vector3D);
pSimpleObject=::new SimpleObject(vector3D,(Ship<<16)|pureObjects.size());
pureObjects.insert(&SmartPointer<PureObject>(pSimpleObject));
pureObjects[pureObjects.size()-1].disposition(PointerDisposition::Delete);
pSimpleObject->setTexture(SmartPointer<Bitmap>(&mBmFighter));
}
return true;
}
bool SceneManager::preprocessHandler(PointerPureObject &pureObject)
{
if(mFreezeFrame)return true;
if(PureObject::Idle==pureObject->getState())return true;
if(!(pureObject->getID()%2))pureObject->translate(Point(1,-2),TranslationMatrix::AboutX);
else pureObject->translate(Point(-1,-1),TranslationMatrix::AboutX);
// pureObject->normalize();
return true;
}
bool SceneManager::scopeHandler(PointerPureObject &scopeObject)
{
if(scopeObject->getID()>>16==Ship)
{
((SimpleObject&)*scopeObject).setVector(((SimpleObject&)*scopeObject).getInitVector());
return false;
}
return true;
}
void SceneManager::keyDownHandler(const KeyData &keyData)
{
int repeatIndex;
switch(keyData.virtualKey())
{
case inKey :
break;
case outKey :
break;
case VK_UP :
for(repeatIndex=0;repeatIndex<keyData.repeatCount();repeatIndex++)handleUpArrow();
mDisplayWindow.invalidate(FALSE);
break;
case VK_DOWN :
for(repeatIndex=0;repeatIndex<keyData.repeatCount();repeatIndex++)handleDownArrow();
mDisplayWindow.invalidate(FALSE);
break;
case VK_LEFT :
for(repeatIndex=0;repeatIndex<keyData.repeatCount();repeatIndex++)handleLeftArrow();
mDisplayWindow.invalidate(FALSE);
break;
case VK_RIGHT :
for(repeatIndex=0;repeatIndex<keyData.repeatCount();repeatIndex++)handleRightArrow();
mDisplayWindow.invalidate(FALSE);
break;
default:
{
// String strKey;
// ::sprintf(strKey,"%lx",keyData.virtualKey());
// ::OutputDebugString(strKey);
// if(0x20==keyData.virtualKey())mFreezeFrame=!mFreezeFrame;
// if(mFreezeFrame)handleFreezeFrame();
if(0x20==keyData.virtualKey())handleFreezeFrame();
}
break;
}
return;
}
void SceneManager::handleLeftArrow(void)
{
Point3D cameraPoint(getViewSystem().cameraPoint());
if(KeyData::shiftKeyPressed())getViewSystem().cameraTwistDegrees(getViewSystem().cameraTwistDegrees()-ThetaDelta);
else cameraPoint.x(cameraPoint.x()+TurnDelta);
getViewSystem().cameraPoint(cameraPoint);
}
void SceneManager::handleRightArrow(void)
{
Point3D cameraPoint(getViewSystem().cameraPoint());
if(KeyData::shiftKeyPressed())getViewSystem().cameraTwistDegrees(getViewSystem().cameraTwistDegrees()+ThetaDelta);
else cameraPoint.x(cameraPoint.x()-TurnDelta);
getViewSystem().cameraPoint(cameraPoint);
}
void SceneManager::handleUpArrow(void)
{
Point3D cameraPoint(getViewSystem().cameraPoint());
cameraPoint.y(cameraPoint.y()+TurnDelta);
getViewSystem().cameraPoint(cameraPoint);
}
void SceneManager::handleDownArrow(void)
{
Point3D cameraPoint(getViewSystem().cameraPoint());
cameraPoint.y(cameraPoint.y()-TurnDelta);
getViewSystem().cameraPoint(cameraPoint);
}
void SceneManager::handleFreezeFrame(void)
{
DisplayManager::PointerPureObjectBlock &objects=getObjects();
int minDistance;
int minIndex;
int distance;
Point3D cameraPoint(getViewSystem().cameraPoint());
for(int index=0;index<objects.size();index++)
{
PureObject &pureObject=*objects[index];
if(pureObject.getID()>>16!=Ship)continue;
Vector3D vector3D(pureObject.getVector());
if(!index){minDistance=cameraPoint.z()-vector3D[0].z();minIndex=index;}
else if(minDistance<cameraPoint.z()-vector3D[0].z()){minDistance=cameraPoint.z()-vector3D[0].z();minIndex=index;}
}
Vector3D vector3D(objects[minIndex]->getVector());
TestObject *pTestObject=::new TestObject(vector3D,(Other<<16)|getObjects().size());
getObjects().insert(&SmartPointer<PureObject>(pTestObject));
getObjects()[getObjects().size()-1].disposition(PointerDisposition::Delete);
pTestObject->setTexture(SmartPointer<Bitmap>(&mBmBurst));
}