00001 #include "vuSphericLightfieldFile.h"
00002
00003 template <int S, class T>
00004 vuSphericLightfieldFile<S,T>::vuSphericLightfieldFile() : vuLightfieldFile()
00005 {
00006 }
00007
00008 template <int S, class T>
00009 vuSphericLightfieldFile<S,T>::vuSphericLightfieldFile(const char *fileName) :
00010 vuLightfieldFile(fileName, false)
00011 {
00012 m_Width = 0;
00013 m_Height = 0;
00014 m_NumberOfViews = 0;
00015 }
00016
00017 template <int S, class T>
00018 vuSphericLightfieldFile<S,T>::vuSphericLightfieldFile(dword width, dword height, dword views, const char *fileName) : vuLightfieldFile(fileName, true)
00019 {
00020 m_Width = width;
00021 m_Height = height;
00022 m_NumberOfViews = views;
00023 m_DataSize = vuSphericView<S,T>::getSizeInByte(width, height);
00024 m_DataSize *= m_NumberOfViews;
00025 }
00026
00027 template <int S, class T>
00028 vuSphericLightfieldFile<S,T>::~vuSphericLightfieldFile()
00029 {
00030 }
00031
00032 template <int S, class T>
00033 vuSphericLightfieldFile<S,T>::vuSphericLightfieldFile(const vuSphericLightfieldFile<S,T> &other)
00034 {
00035 throw "vuSphericLightfieldFile:: The copy constructor is not implemented";
00036 }
00037
00038 template <int S, class T>
00039 bool vuSphericLightfieldFile<S,T>::readHeader()
00040 {
00041 if (!vuLightfieldFile::readHeader()) return false;
00042
00043 char str[64];
00044
00045 m_FileStream->get(str, 8);
00046 if (strcmp(str, "SPHERIC") != 0)
00047 return _setErrorMessage("No spheric lightfield file");
00048
00049 *m_FileStream >> m_Width;
00050 *m_FileStream >> m_Height;
00051 *m_FileStream >> m_NumberOfViews;
00052
00053 if (m_Width == 0) return _setErrorMessage("No width set");
00054 if (m_Height == 0) return _setErrorMessage("No height set");
00055 if (m_NumberOfViews == 0) return _setErrorMessage("No views set");
00056
00057 m_FileStream->getline(str,32);
00058 m_FileStream->get(str, 10);
00059 if (strcmp(str, "DATA_SIZE") != 0)
00060 return _setErrorMessage("No DATA_SIZE specified");
00061
00062 *m_FileStream >> m_DataSize;
00063 if (!_isDataSizeValid(m_DataSize))
00064 return _setErrorMessage("Data size is not valid");
00065
00066 m_FileStream->getline(str,32);
00067 m_FileStream->get(str,8);
00068 if (strcmp(str, "FIELDS ") != 0)
00069 return _setErrorMessage("No FIELDS specified");
00070
00071 m_FileStream->get(str, 64, ' ');
00072 m_DataName = vuString(str);
00073 if (m_DataName.isEmpty())
00074 return _setErrorMessage("No data name set");
00075
00076 int size;
00077 *m_FileStream >> size;
00078 if (size != S)
00079 return _setErrorMessage("Wrong data type size");
00080 m_FileStream->get();
00081 m_FileStream->get(str,32);
00082 if ((strcmp(str, "byte") == 0) && (sizeof(T) == 1));
00083 else if ((strcmp(str, "float") == 0) && (sizeof(T) == 4));
00084 else return _setErrorMessage("Unsupported data type");
00085
00086 m_FileStream->getline(str, 32);
00087 m_FileStream->getline(str,32);
00088 if (strcmp(str, "LOOKUP_TABLE default") != 0)
00089 return _setErrorMessage("Not default LOOKUP_TABLE used");
00090
00091 m_IsHeaderDone = true;
00092 return true;
00093 }
00094
00095 template <int S, class T>
00096 bool vuSphericLightfieldFile<S,T>::writeHeader()
00097 {
00098 if (!vuLightfieldFile::writeHeader()) return false;
00099
00100 if (m_Width == 0) return _setErrorMessage("No width set");
00101 if (m_Height == 0) return _setErrorMessage("No height set");
00102 if (m_NumberOfViews == 0) return _setErrorMessage("No views set");
00103 if (!_isDataSizeValid(m_DataSize))
00104 return _setErrorMessage("Data size is not valid");
00105
00106 *m_FileStream << "SPHERIC " << m_Width << " " << m_Height;
00107 *m_FileStream << " " << m_NumberOfViews << endl;
00108
00109 *m_FileStream << "DATA_SIZE " << m_DataSize << endl;
00110 *m_FileStream << "FIELDS " << m_DataName << " " << S << " ";
00111 if (sizeof(T) == 1)
00112 *m_FileStream << "byte";
00113 else if (sizeof(T) == 4)
00114 *m_FileStream << "float";
00115 else
00116 return _setErrorMessage("Unsupported data type");
00117
00118 *m_FileStream << endl << "LOOKUP_TABLE default" << endl;
00119
00120 m_IsHeaderDone = true;
00121 return true;
00122 }
00123
00124 template <int S, class T>
00125 bool vuSphericLightfieldFile<S,T>::readView(vuSphericView<S,T> *view)
00126 {
00127 if (!_isReadyForReading())
00128 return false;
00129 else if (!m_IsHeaderDone)
00130 return _setErrorMessage("Header is not read yet");
00131 else if (view == NULL)
00132 return _setErrorMessage("Can't read into NULL pointer");
00133
00134 if (!view->readFromFileStream(m_FileStream, m_Width, m_Height))
00135 return _setErrorMessage("Could not read view");
00136 else
00137 return true;
00138 }
00139
00140 template <int S, class T>
00141 bool vuSphericLightfieldFile<S,T>::writeView(vuSphericView<S,T> *view)
00142 {
00143 if (!_isReadyForWriting()) return false;
00144 else if (!m_IsHeaderDone)
00145 return _setErrorMessage("Header is not written yet");
00146 else if (view == NULL)
00147 return _setErrorMessage("Can't write NULL pointer");
00148
00149 if (!view->writeToFileStream(m_FileStream))
00150 return _setErrorMessage("Could not write view");
00151 else {
00152 m_FileStream->sync();
00153 return true;
00154 }
00155 }
00156
00157
00158
00159
00160
00161 template <int S, class T>
00162 dword vuSphericLightfieldFile<S,T>::getNumberOfViews()
00163 {
00164 return m_NumberOfViews;
00165 }
00166
00167 template <int S, class T>
00168 dword vuSphericLightfieldFile<S,T>::getWidth()
00169 {
00170 return m_Width;
00171 }
00172
00173 template <int S, class T>
00174 dword vuSphericLightfieldFile<S,T>::getHeight()
00175 {
00176 return m_Height;
00177 }
00178
00179
00180
00181
00182
00183
00184 template <int S, class T>
00185 bool vuSphericLightfieldFile<S,T>::_isDataSizeValid(dword dataSize)
00186 {
00187 dword size = vuSphericView<S,T>::getSizeInByte(m_Width, m_Height);
00188 return (dataSize == (size * m_NumberOfViews));
00189 }