Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <cstdio>
00022 #include <cstdlib>
00023 #include <fstream>
00024 #include <iostream>
00025 #include <string>
00026 #include "rtc/rtcMeshSet3D.h"
00027 #include "rtc/rtcBinaryInputHandler.h"
00028 #include "rtc/rtcBinaryOutputHandler.h"
00029
00030
00031 namespace rtc {
00032
00033
00034 MeshSet3D::MeshSet3D()
00035 :IOObject(), flags(0)
00036 {
00037 }
00038
00039 MeshSet3D::MeshSet3D(const MeshSet3D& other)
00040 :IOObject(), flags(0)
00041 {
00042 set(other);
00043 }
00044
00045 const MeshSet3D &MeshSet3D::operator=(const MeshSet3D& other)
00046 {
00047 set(other);
00048 return *this;
00049 }
00050
00051
00052 MeshSet3D::~MeshSet3D() {
00053 clear();
00054 }
00055
00056 int MeshSet3D::numMeshes() const
00057 {
00058 return (int)meshes.size();
00059 }
00060
00061 void MeshSet3D::clear()
00062 {
00063 for (int i=0;i<int(meshes.size());i++) delete (meshes[i]);
00064 meshes.clear();
00065 }
00066
00067 void MeshSet3D::set(const MeshSet3D& other)
00068 {
00069 clear();
00070 flags = other.flags;
00071 VecMesh3D::const_iterator it,it_end;
00072 for (it=other.meshes.begin(),it_end=other.meshes.end(); it!=it_end; ++it){
00073 Mesh3D* mesh = new Mesh3D(*(*it));
00074 meshes.push_back(mesh);
00075 }
00076 }
00077
00078
00079 void MeshSet3D::updateNormals()
00080 {
00081 for (unsigned int i=0;i<meshes.size();i++)
00082 meshes[i]->updateNormals();
00083 }
00084
00085 bool MeshSet3D::getFlag(int flag) const
00086 {
00087 return (flags&flag);
00088 }
00089
00090 void MeshSet3D::setFlag(int flag, bool value)
00091 {
00092 if(value)
00093 flags|=flag;
00094 else
00095 flags&=flag;
00096 }
00097
00098 bool MeshSet3D::hasAABB() const
00099 {
00100 return (flags&MESHSET3D_HAS_AABB);
00101 }
00102
00103 bool MeshSet3D::write(OutputHandler &oh) const
00104 {
00105
00106 int num_meshes = meshes.size();
00107 rtc_write(oh,"flags",flags);
00108 rtc_write(oh,"num_meshes",num_meshes);
00109
00110 for(unsigned int i=0;i<meshes.size();++i) {
00111 meshes[i]->write(oh);
00112 }
00113 if (hasAABB()) {
00114 topleft.write(oh);
00115 bottomright.write(oh);
00116 }
00117 return oh.good();
00118 }
00119
00120 bool MeshSet3D::read(InputHandler &ih)
00121 {
00122
00123 clear();
00124 int num_meshes;
00125 rtc_read(ih,"flags",flags);
00126 rtc_read(ih,"num_meshes",num_meshes);
00127
00128 for(int i=0;i<num_meshes;++i) {
00129 Mesh3D* mesh = new Mesh3D();
00130 mesh->read(ih);
00131 meshes.push_back(mesh);
00132 if(!ih.good())
00133 throw Exception("format error: unexpected end of file");
00134 }
00135 if (hasAABB()) {
00136 topleft.read(ih);
00137 bottomright.read(ih);
00138 }
00139 return ih.good();
00140 }
00141
00142 bool MeshSet3D::writeToFile( const char* filename ) const
00143 {
00144 try
00145 {
00146 rtc::BinaryOutputHandler bsh;
00147 std::ofstream out(filename, std::ios_base::binary);
00148 bsh.use(out);
00149 write(bsh);
00150 }
00151 catch (Exception e)
00152 {
00153 std::cout << e.getErrorMessage() << std::endl;
00154 return false;
00155 }
00156 return true;
00157 }
00158
00159 bool MeshSet3D::readFromFile( const char* filename )
00160 {
00161
00162 try {
00163
00164 rtc::BinaryInputHandler bsh;
00165 std::ifstream in(filename,std::ios_base::binary);
00166 bsh.use(in);
00167 read(bsh);
00168 }
00169 catch (Exception e) {
00170 std::cout << e.getErrorMessage() << std::endl;
00171 return false;
00172 }
00173 return true;
00174 }
00175
00176 void MeshSet3D::read( FILE *fp )
00177 {
00178 size_t res = 0;
00179
00180 clear();
00181 int num_meshes;
00182 res+=fread(&flags,sizeof(flags),1,fp);
00183 res+=fread(&num_meshes,sizeof(num_meshes),1,fp);
00184
00185 for(int i=0;i<num_meshes;++i) {
00186 Mesh3D* mesh = new Mesh3D();
00187 mesh->read(fp);
00188 meshes.push_back(mesh);
00189 if(feof(fp))
00190 throw Exception("format error: unexpected end of file");
00191 }
00192 if (hasAABB()) {
00193 res+=fread(&topleft,sizeof(topleft),1,fp);
00194 res+=fread(&bottomright,sizeof(bottomright),1,fp);
00195 }
00196 }
00197
00198 void MeshSet3D::write(FILE *fp) const
00199 {
00200
00201 int num_meshes = meshes.size();
00202 fwrite(&flags,sizeof(flags),1,fp);
00203 fwrite(&num_meshes,sizeof(num_meshes),1,fp);
00204
00205 for(unsigned int i=0;i<meshes.size();++i) {
00206 meshes[i]->write(fp);
00207 }
00208 if (hasAABB()) {
00209 fwrite(&topleft,sizeof(topleft),1,fp);
00210 fwrite(&bottomright,sizeof(bottomright),1,fp);
00211 }
00212 }
00213
00214 void MeshSet3D::loadToGPU()
00215 {
00216 for (size_t i=0;i<meshes.size();i++)
00217 meshes[i]->loadTexture();
00218 }
00219
00220 void MeshSet3D::unloadGPU()
00221 {
00222 for (size_t i=0;i<meshes.size();i++)
00223 meshes[i]->unloadTexture();
00224 }
00225
00226
00227 }
00228