220 lines
8.2 KiB
C++
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));
|
|
}
|