00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <wx/stopwatch.h>
00013 #include "ioimage.h"
00014 #include "../../geometrynode.h"
00015 #include "../../geometrytriangles.h"
00016
00017 using namespace VRUT;
00018
00019
00020 IOImageModule::IOImageModule(const MODULE_ID & _id, const wxString & _name, EventHandler * msgSink)
00021 : IOModule(_id, _name, 0, msgSink)
00022 {
00024 REGISTER_LISTENER(Event::EVT_SCENE_IMAGE_ADDED);
00025 }
00026
00027
00028 IOImageModule::~IOImageModule()
00029 {
00030 }
00031
00032
00033 wxString IOImageModule::GetDesc() const
00034 {
00035 return wxT("Import and export images");
00036 }
00037
00038
00039 wxString IOImageModule::GetSupportedExts() const
00040 {
00041 return wxT("BMP,PNG,JPG,JPEG,GIF,PCX,PNM,TIF,TIFF,TGA,IFF,XPM,ICO,CUR,ANI,RGB");
00042 }
00043
00044
00045 bool IOImageModule::ImportScene(const wxString & fname, SCENE_ID sceneID, const wxString & rootUid)
00046 {
00047 wxStopWatch sw;
00048 bool ret = false;
00049
00050
00051 Material * material = new Material(rootUid);
00052 material->diffuse = VECTOR4(1, 1, 1, 1);
00053 material->specular = VECTOR4(0, 0, 0, 1);
00054 material->shininess = 16;
00055 material->flags |= Material::DOUBLE_SIDED;
00056 material->depthFunc = 203;
00057 wxCommandEvent ev1(Event::GET_EVT_SCENE_IMAGE_ADD(fname));
00058 PostToKernel(ev1);
00059 material->imageName = fname;
00060 material->texFlags |= Material::TEX_UWRAP_REPEAT;
00061 material->texFlags |= Material::TEX_VWRAP_REPEAT;
00062 material->texFlags |= Material::TEX_MIN_FILTER_MIPMAP;
00063 material->texFlags |= Material::TEX_MAG_FILTER_LINEAR;
00064 material->texFlags |= Material::TEX_ENV_MODULATE;
00065 wxCommandEvent ev2(Event::GET_EVT_SCENE_MATERIAL_ADD(sceneID, material));
00066 PostToKernel(ev2);
00067 WaitForEvent(Event::EVT_SCENE_IMAGE_ADDED, 10000, -1, -1, fname);
00068 const Image * img = (GetSceneMgr()->GetScene(sceneID))->GetImage(fname);
00069 int width = 1, height = 1;
00070 if (!img || !img->IsOk())
00071 {
00072 LOGERROR(wxT("<IOImageModule>Image cannot be loaded."));
00073 return false;
00074 }
00075 else
00076 {
00077 width = img->GetWidth();
00078 height = img->GetHeight();
00079 if (img->HasTransparency())
00080 {
00081 material->flags |= Material::BLENDED;
00082 material->texBlendSrc = GL_SRC_ALPHA;
00083 material->texBlendDst = GL_ONE;
00084 }
00085 }
00086
00087 GeometryNode *node = new GeometryNode(rootUid+wxT("Geometry"), rootUid+wxT("Geometry"));
00088 wxCommandEvent ev3(Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, rootUid));
00089 PostToKernel(ev3);
00090
00091
00092 wxCommandEvent ev4(Event::GET_EVT_SCENE_NODE_MATERIAL_SET(sceneID, rootUid+wxT("Geometry"), rootUid));
00093 PostToKernel(ev4);
00094
00096 GeometryTriangles *geometry = new GeometryTriangles(rootUid+wxT("Geometry"));
00097 std::vector<VECTOR3> * verts = &(geometry->vertices);
00098 std::vector<VECTOR3> * normals = &(geometry->normals);
00099 std::vector<GeometryTriangles::TexCoord> * texCoords = &(geometry->texCoords);
00100 verts->push_back(VECTOR3(0,0,0));
00101 verts->push_back(VECTOR3(width,0,0));
00102 verts->push_back(VECTOR3(0,height,0));
00103 verts->push_back(VECTOR3(width,height,0));
00104 normals->push_back(VECTOR3(0,0,1));
00105 normals->push_back(VECTOR3(0,0,1));
00106 normals->push_back(VECTOR3(0,0,1));
00107 normals->push_back(VECTOR3(0,0,1));
00108 texCoords->push_back(GeometryTriangles::TexCoord(0,0));
00109 texCoords->push_back(GeometryTriangles::TexCoord(1,0));
00110 texCoords->push_back(GeometryTriangles::TexCoord(0,1));
00111 texCoords->push_back(GeometryTriangles::TexCoord(1,1));
00112 std::vector<GeometryTriangles::Indice> * indices = &(geometry->indices);
00113 GeometryTriangles::TriDescList * triDescList = &geometry->triDescList;
00114 std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_STRIP);
00115 triDescList->push_back(indType);
00116 indices->push_back((GeometryTriangles::Indice)0);
00117 indices->push_back((GeometryTriangles::Indice)1);
00118 indices->push_back((GeometryTriangles::Indice)2);
00119 indices->push_back((GeometryTriangles::Indice)3);
00120
00122 wxCommandEvent ev5(Event::GET_EVT_SCENE_GEOMETRY_ADD(sceneID, geometry));
00123 PostToKernel(ev5);
00125 wxCommandEvent ev6(Event::GET_EVT_SCENE_NODE_GEOMETRY_SET(sceneID, rootUid+wxT("Geometry"), geometry->GetName()));
00126 PostToKernel(ev6);
00127
00128 LOG(wxString::Format(wxT("<IOImageModule>Scene parsed in %.3f secs, ID %i"), 0.001f * sw.Time(), sceneID));
00129 wxCommandEvent ev7(Event::GET_EVT_IO_SCENE_IMPORT_DONE(sceneID));
00130 PostToKernel(ev7);
00131 return ret;
00132 }
00133
00134
00135 bool IOImageModule::ExportScene(const wxString & fname, const Scene * scene)
00136 {
00137
00138
00139
00140
00141
00142
00143
00144 return false;
00145 }