00001 #include "CameraLoader.h"
00002 #include "conversion.hpp"
00003
00004 using namespace std;
00005
00006 namespace rcrt
00007 {
00008
00009 CameraLoader::CameraLoader(string camFile):XMLLoader(camFile),initialised(false)
00010 {
00011 }
00012
00013 CameraLoader::~CameraLoader()
00014 {
00015 }
00016
00017 void CameraLoader::init()
00018 {
00019 initialised = true;
00020 nextStartTag("camera");
00021 name = parser.getAttributeValue("","name");
00022 nextStartTag("res");
00023 int resX = convertTo<int>(parser.getAttributeValue("","x"));
00024 int resY = convertTo<int>(parser.getAttributeValue("","y"));
00025 nextStartTag("angle");
00026 float angle = convertTo<float>(parser.getAttributeValue("","val"));
00027 camera.setResolution(resX, resY);
00028 camera.setAngle(angle);
00029 }
00030
00031 Camera* CameraLoader::getCamera()
00032 {
00033 return &camera;
00034 }
00035
00036 bool CameraLoader::nextFrame()
00037 {
00038 if(!initialised)
00039 init();
00040 if(eof) return false;
00041 int eventType = parser.getEventType();
00042 string tagName = parser.getName();
00043 if(eventType == XmlPullParser::START_TAG &&
00044 tagName == "frame"){
00045 currentFrame = convertTo<int>(parser.getAttributeValue("","no"));
00046 } else {
00047 eof = !nextStartTag("frame");
00048 if(!eof) currentFrame = convertTo<int>(parser.getAttributeValue("","no"));
00049 }
00050 if(!eof){
00051 nextStartTag("loc");
00052 Point3D loc(convertTo<float>(parser.getAttributeValue("","x")),
00053 convertTo<float>(parser.getAttributeValue("","y")),
00054 convertTo<float>(parser.getAttributeValue("","z")));
00055 nextStartTag("dir");
00056 Vec3D dir(convertTo<float>(parser.getAttributeValue("","x")),
00057 convertTo<float>(parser.getAttributeValue("","y")),
00058 convertTo<float>(parser.getAttributeValue("","z")));
00059 nextStartTag("up");
00060 Vec3D up(convertTo<float>(parser.getAttributeValue("","x")),
00061 convertTo<float>(parser.getAttributeValue("","y")),
00062 convertTo<float>(parser.getAttributeValue("","z")));
00063
00064 camera.update(loc, dir, up);
00065 return true;
00066 } else {
00067 return false;
00068 }
00069 }
00070
00071 bool CameraLoader::goToFrame(const int& n)
00072 {
00073 if(!initialised)
00074 init();
00075
00076 if(n < currentFrame)
00077 return false;
00078 if(n == currentFrame)
00079 return true;
00080 string tagName = parser.getName();
00081 while(currentFrame < n && !eof){
00082 eof = !nextStartTag("frame");
00083 currentFrame = convertTo<int>(parser.getAttributeValue("","no"));
00084 }
00085 if(!eof) {
00086 nextStartTag("loc");
00087 Point3D loc(convertTo<float>(parser.getAttributeValue("","x")),
00088 convertTo<float>(parser.getAttributeValue("","y")),
00089 convertTo<float>(parser.getAttributeValue("","z")));
00090 nextStartTag("dir");
00091 Vec3D dir(convertTo<float>(parser.getAttributeValue("","x")),
00092 convertTo<float>(parser.getAttributeValue("","y")),
00093 convertTo<float>(parser.getAttributeValue("","z")));
00094 nextStartTag("up");
00095 Vec3D up(convertTo<float>(parser.getAttributeValue("","x")),
00096 convertTo<float>(parser.getAttributeValue("","y")),
00097 convertTo<float>(parser.getAttributeValue("","z")));
00098
00099 camera.update(loc, dir, up);
00100 return true;
00101 } else {
00102 return false;
00103 }
00104 }
00105
00106
00107 }