POVRayExporter.cc

Go to the documentation of this file.
00001 #include <esg/explorer/POVRayExporter.h>
00002 #include <esg/emittance/Emittance.h>
00003 #include <stdio.h>
00004 
00005 using namespace esg;
00006 
00007 void POVRayExporter::_write_mesh(Mesh & mesh, int texture)
00008 {
00009     fprintf(_file, "mesh {\n");
00010 
00011     mesh.resetActSolid();
00012     do {
00013         mesh.resetActPlane();
00014         do {
00015             _indent(1); fprintf(_file, "smooth_triangle {\n");
00016             bool first = true;
00017             mesh.resetActEdge();
00018             do {
00019                 Vector3 v(mesh.getActVert1(true));
00020                 Vector3 n(mesh.getActVertNormal1(true));
00021                 if (!first) fprintf(_file, ",\n");
00022                 _indent(2); fprintf(_file, "<%f, %f, %f>, <%f, %f, %f>",
00023                                     v.x, v.y, v.z, n.x, n.y, n.z);
00024                 first = false;
00025             } while (mesh.goToNextEdge());
00026             fprintf(_file, "\n"); _indent(1); fprintf(_file, "}\n");
00027         } while (mesh.goToNextPlane());
00028     } while (mesh.goToNextSolid());
00029 
00030     if (texture >= 0) {
00031         fprintf(_file, "\n");
00032         _indent(1); fprintf(_file, "texture {Texture%i}\n", texture);
00033     }
00034     fprintf(_file, "}\n\n");
00035 }
00036 
00037 void POVRayExporter::_write_sphere(const Sphere & sphere, int texture)
00038 {
00039     fprintf(_file, "sphere {\n");
00040     _indent(1); fprintf(_file, "<%f, %f, %f>, %f\n",
00041                         sphere.centre().x,sphere.centre().y,sphere.centre().z,
00042                         sphere.radius());
00043     if (texture >= 0) {
00044         _indent(1); fprintf(_file, "texture {Texture%i}\n", texture);
00045     }
00046     fprintf(_file, "}\n\n");
00047 }
00048 
00049 void POVRayExporter::_write_texture(MatVisitor & visitor, unsigned number)
00050 {
00051     fprintf(_file, "#declare Texture%i = texture {\n", number);
00052     _indent(1); fprintf(_file, "finish {\n");
00053     _indent(2); fprintf(_file, "diffuse %f\n",
00054                         (visitor.diffuse().x +
00055                          visitor.diffuse().y +
00056                          visitor.diffuse().z)/3);
00057     _indent(2); fprintf(_file, "ambient %f\n",
00058                         (visitor.ambient().x +
00059                          visitor.ambient().y +
00060                          visitor.ambient().z)/3);
00061     _indent(2); fprintf(_file, "specular %f\n",
00062                         (visitor.specular().x +
00063                          visitor.specular().y +
00064                          visitor.specular().z)/3);
00065     _indent(2); fprintf(_file, "roughness %f\n", visitor.roughness());
00066     _indent(1); fprintf(_file, "}\n");
00067     fprintf(_file, "}\n\n");
00068 }
00069 
00070 void POVRayExporter::_write_light_source(Emittance& em)
00071 {
00072     Vector3 v;
00073     Color3f c;
00074 
00075     if (!em.sourceLocation(v)) return;
00076     em.intensity(c);
00077     fprintf(_file, "light_source {\n");
00078     _indent(1); fprintf(_file, "<%f, %f, %f>\n", v.y, v.y, v.z);
00079     _indent(1); fprintf(_file, "color <%f, %f, %f>\n", c.x, c.y, c.z);
00080     fprintf(_file, "}\n\n");
00081 }
00082 
00083 bool POVRayExporter::_process_leaf(SceneGraphObject& obj)
00084 {
00085     MatVisitor mVisitor;
00086 
00087     obj.inspectMaterials(mVisitor);
00088 
00089     Emittance * pEmittance = obj.emittance();
00090     if (pEmittance) _write_light_source(*pEmittance);
00091     else            _write_texture(mVisitor, _oid);
00092 
00093     Geometry * pGeom = obj.geometry();
00094     if (!pGeom) return false;
00095 
00096     if (IS_INSTANCE_OF(*pGeom, Sphere)) {
00097         _write_sphere((Sphere&)(*pGeom), _oid++);
00098     } else {
00099         Mesh * pMesh = pGeom->mesh();
00100         if (pMesh) {
00101             _write_mesh(*pMesh, _oid++);
00102             delete pMesh;
00103         }
00104     }
00105 
00106     return true;
00107 }

Generated on Wed Jun 28 12:24:32 2006 for esg by  doxygen 1.4.6