int main(int argc, char **argv) { // interface: QApplication app(argc, argv); MyQT sqt; if (argc>1) sqt.NBP = atoi(argv[1]); sqt.setHelpMsg("Param :size of grid (number of objects)\nMpuse (with shift):\n" " -click on object: selection\n -left click on frame: constraint 3d Rotation/Translation/Scale\n" " -right click on frame :free 2D Rotation/Translation\nKeys:\n x/y/z lock/unlock translation\n a/b/c lock/unlock rotation\n s/t/u lock/unlock scaling"); // bounding box Geom::Vec3f lPosObj = Geom::Vec3f(0.0f,0.0f,0.0f); float lWidthObj = sqt.NBP*4.0f; // envoit info BB a l'interface sqt.setParamObject(lWidthObj,lPosObj.data()); // show final pour premier redraw sqt.show(); // et on attend la fin. return app.exec(); return 0; }
void ShaderPhong::setLightPosition(const Geom::Vec3f& lightPos) { bind(); glUniform3fv(*m_unif_lightPos,1,lightPos.data()); m_lightPos = lightPos; unbind(); }
void ShaderExplodeSmoothVolumes::setLightPosition(const Geom::Vec3f& lp) { m_light_pos = lp; bind(); glUniform3fv(*m_unif_lightPos,1,lp.data()); unbind(); }
void MyQT::createMap() { // Dart d1 = Algo::Modelisation::createTetrahedron<PFP>(myMap); // Dart d2 = d1; position = myMap.addAttribute<PFP::VEC3, VERTEX>("position"); Algo::Modelisation::Polyhedron<PFP> prim1(myMap, position); prim1.cylinder_topo(256, 256, true, true); // topo of sphere is a closed cylinder prim1.embedSphere(2.0f); // Dart d2 = d1; // position[d2] = PFP::VEC3(1, 0, 0); // d2 = PHI1(d2); // position[d2] = PFP::VEC3(-1, 0, 0); // d2 = PHI1(d2); // position[d2] = PFP::VEC3(0, 2, 0); // d2 = PHI<211>(d2); // position[d2] = PFP::VEC3(0, 1, 2); Algo::Modelisation::Polyhedron<PFP> prim2(myMap, position); prim2.cylinder_topo(256, 256, true, true); // topo of sphere is a closed cylinder prim2.embedSphere(2.0f); Geom::Matrix44f trf; trf.identity(); Geom::translate<float>(5.0f, 0.0, 0.0, trf); prim2.transform(trf); xd1 = prim2.getDart(); // xd1 = Algo::Modelisation::Polyhedron<PFP>::createTetra(myMap); // Dart xd2 = xd1; // // position[xd2] = PFP::VEC3(5, 0, 0); // xd2 = PHI1(xd2); // position[xd2] = PFP::VEC3(3, 0, 0); // xd2 = PHI1(xd2); // position[xd2] = PFP::VEC3(4, 2, 0); // xd2 = PHI<211>(xd2); // position[xd2] = PFP::VEC3(4, 1, 2); // bounding box of scene Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position); float lWidthObj = std::max<PFP::REAL>(std::max<PFP::REAL>(bb.size(0), bb.size(1)), bb.size(2)); Geom::Vec3f lPosObj = (bb.min() + bb.max()) / PFP::REAL(2); // send BB info to interface for centering on GL screen setParamObject(lWidthObj, lPosObj.data()); // first show for be sure that GL context is binded show(); // render the topo of the map without boundary darts SelectorDartNoBoundary<PFP::MAP> nb(myMap); m_render_topo->updateData<PFP>(myMap, position, 0.9f, 0.9f,nb); }
void ShaderPhong::setEyePosition(const Geom::Vec3f& eyePos) { if (m_with_eyepos) { bind(); glUniform3fv(*m_unif_eyePos,1,eyePos.data()); m_eyePos = eyePos; unbind(); } }
void Strings3D::predraw(const Geom::Vec3f& color) { bind(); glUniform1i(*m_uniform_texture, 0); glUniform3fv(*m_uniform_color, 1, color.data()); glActiveTextureARB(GL_TEXTURE0_ARB); glBindTexture(GL_TEXTURE_2D, *m_idTexture); glEnable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); enableVertexAttribs(); }
void ShaderExplodeSmoothVolumes::setParams(float explV, float explF, const Geom::Vec4f& ambiant, const Geom::Vec3f& lightPos, const Geom::Vec4f& plane) { bind(); m_explodeV = explV; glUniform1f(*m_unif_explodeV, explV); m_explodeF = explF; glUniform1f(*m_unif_explodeF, explF); m_ambiant = ambiant; glUniform4fv(*m_unif_ambiant, 1, ambiant.data()); m_light_pos = lightPos; glUniform3fv(*m_unif_lightPos, 1, lightPos.data()); m_plane = plane; glUniform4fv(*m_unif_plane, 1, m_plane.data()); unbind(); }
void MyQT::createMap() { // creation of a new attribute on vertices of type 3D vector for position. // a handler to this attribute is returned position = myMap.addAttribute<VEC3, VERTEX, MAP>("position"); // creation of 2 new faces: 1 triangle and 1 square Dart d1 = myMap.newFace(3); Dart d2 = myMap.newFace(4); // sew these faces along one of their edge myMap.sewFaces(d1, d2); // affect position by moving in the map position[d1] = VEC3(0, 0, 0); position[PHI1(d1)] = VEC3(2, 0, 0); position[PHI_1(d1)] = VEC3(1, 2, 0); position[PHI<11>(d2)] = VEC3(0, -2, 0); position[PHI_1(d2)] = VEC3(2, -2, 0); // bounding box of scene Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position); float lWidthObj = std::max<PFP::REAL>(std::max<PFP::REAL>(bb.size(0), bb.size(1)), bb.size(2)); Geom::Vec3f lPosObj = (bb.min() + bb.max()) / PFP::REAL(2); show(); // send BB info to interface for centering on GL screen setParamObject(lWidthObj, lPosObj.data()); // first show for be sure that GL context is binded show(); // render the topo of the map without boundary darts m_render_topo->setInitialBoundaryDartsColor(0,1,0); m_render_topo->updateDataGMap<PFP>(myMap, position, 0.9f, 0.9f,true); }
void Strings3D::draw(unsigned int idSt, const Geom::Vec3f& pos) { glUniform3fv(*m_uniform_position, 1, pos.data()); glDrawArrays(GL_QUADS, m_strpos[idSt].first , m_strpos[idSt].second ); }
int main(int argc, char **argv) { position = myMap.addAttribute<VEC3, VERTEX>("position"); Dart d0 = myMap.newFace(12); position[d0] = PFP::VEC3(0, 20, 0); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(10, 20, 0); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(10, 30, 0); Dart dx = myMap.phi1(d0); d0 = myMap.phi<11>(dx); position[d0] = PFP::VEC3(8, 27, 0); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(8, 22, 0); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(2, 22, 0); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(2, 27, 0); d0 = myMap.phi1(d0); myMap.sewFaces(d0,dx); position[d0] = PFP::VEC3(5, 27, 0); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(5, 30, 0); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(0, 30, 0); d0 = myMap.newFace(4); position[d0] = PFP::VEC3(-5, 14, -5); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(0, 18, -5); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(5, 14, -5); d0 = myMap.phi1(d0); position[d0] = PFP::VEC3(0, 20, -5); d0 = myMap.phi1(d0); Dart d1 = myMap.newFace(10); position[d1] = PFP::VEC3(0, 0, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(2, 4, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(4, 0, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(10, 0, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(4, 2, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(14, 6, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(6, 16, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(8, 8, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(4, 4, 0); d1 = myMap.phi1(d1); position[d1] = PFP::VEC3(0, 8, 0); Dart d2 = myMap.newFace(12); position[d2] = PFP::VEC3(0, -20, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(4, -20, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(8, -20, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(12, -20, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(12, -16, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(12, -12, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(12, -8, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(8, -8, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(4, -8, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(0, -8, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(0, -12, 0); d2 = myMap.phi1(d2); position[d2] = PFP::VEC3(0, -16, 0); d2 = myMap.phi1(d2); #define NB 32 //SPIRAL Dart d3 = myMap.newFace(NB*2); for (int i = 0; i<NB; ++i) { float z = 3.0f*float(rand()-RAND_MAX/2)/float(RAND_MAX); float alpha = (4.0f*6.283f / NB)*i; float radius = 1.2f*(NB-i); position[d3] = PFP::VEC3(radius*cos(alpha) - 2*NB+8, radius*sin(alpha), z); d3 = myMap.phi1(d3); } for (int i = NB-1; i>=0; --i) { float z = 3.0f*float(rand()-RAND_MAX/2)/float(RAND_MAX); float alpha = (4.0f*6.283f / NB)*i; float radius = (NB-i); position[d3] = PFP::VEC3(radius*cos(alpha) - 2*NB+8, radius*sin(alpha), z); d3 = myMap.phi1(d3); } //CIRCLE Dart d6 = myMap.newFace(NB); for (int i = 0; i<NB; ++i) { float z = 3.0f*float(rand()-RAND_MAX/2)/float(RAND_MAX); float alpha = (6.283f / NB)*i; float radius = NB; position[d6] = PFP::VEC3(radius*cos(alpha) + 2*NB+8, radius*sin(alpha), z); d6 = myMap.phi1(d6); } // pour comparer les 2 versions (oreille et basique) //#define NBB 100 // for (int j = 0; j<10000; ++j) // { // Dart d6 = myMap.newFace(NBB); // for (int i = 0; i<NBB; ++i) // { // float alpha = (6.283f / NB)*i; // float radius = NB; // position[d6] = PFP::VEC3(radius*cos(alpha) + 2*NB+8, radius*sin(alpha), 0.1f*j); // d6 = myMap.phi1(d6); // } // } Geom::Vec3f V1(3,3,3); V1.normalize(); Geom::Vec3f V2 = V1 ^ Geom::Vec3f(0,0,-1); Geom::Vec3f V3 = V1 ^ V2; V1 *= 50.0f; V2 *= 50.0f; Dart d5 = myMap.newFace(74); for (int i=0; i<74;++i) { float a = float(rand()-RAND_MAX/2)/float(RAND_MAX) * 0.25f; position[d5] = PFP::VEC3(0.0,60.0,0.0f) + Ifont[2*i] * V1 + Ifont[2*i+1]*V2 + a*V3; d5 = myMap.phi1(d5); } Dart d9 = myMap.newFace(174); for (int i=0; i<174;++i) { float a = float(rand()-RAND_MAX/2)/float(RAND_MAX) * 0.25f; position[d9] = PFP::VEC3(60.0,60.0,0.0f) + Gfont[2*i] * V1 + Gfont[2*i+1]*V2 + a*V3; d9 = myMap.phi1(d9); } // interface: QApplication app(argc, argv); MyQT sqt; // message d'aide sqt.setHelpMsg("Concave face rendering (ears method):\n" "a show all trianglesfaces\n" "a show none trianglesfaces\n" "+ / - show trinagles order rendering (ears creation)"); // bounding box Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position); float lWidthObj = std::max<PFP::REAL>(std::max<PFP::REAL>(bb.size(0), bb.size(1)), bb.size(2)); Geom::Vec3f lPosObj = (bb.min() + bb.max()) / PFP::REAL(2); // envoit info BB a l'interface sqt.setParamObject(lWidthObj, lPosObj.data()); // show 1 pour GL context sqt.show(); // update du VBO position (context GL necessaire) sqt.m_positionVBO->updateData(position); // update des primitives du renderer sqt.m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::TRIANGLES, &position); sqt.m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::LINES, &position); sqt.m_render->initPrimitives<PFP>(myMap, allDarts, Algo::Render::GL2::POINTS, &position); // show final pour premier redraw sqt.show(); // et on attend la fin. return app.exec(); }