void ewol::compositing::Drawing::setPoint(const vec3& _point) { m_triangle[m_triElement] = _point; m_triElement++; if (m_triElement >= 3) { generateTriangle(); } }
void prepare() { VulkanExampleBase::prepare(); generateTriangle(); setupVertexDescriptions(); prepareUniformBuffers(); setupDescriptorSetLayout(); preparePipelines(); setupDescriptorPool(); setupDescriptorSet(); buildCommandBuffers(); prepared = true; }
void VanDerWaals::generateTriangle(Data::Mesh& mesh, Data::OMMesh::VertexHandle const& Av, Data::OMMesh::VertexHandle const& Bv, Data::OMMesh::VertexHandle const& Cv, int div) { if (div <= 0) { mesh.addFace(Cv, Bv, Av); }else { Data::OMMesh::Point Ap(mesh.vertex(Av)); Data::OMMesh::Point Bp(mesh.vertex(Bv)); Data::OMMesh::Point Cp(mesh.vertex(Cv)); // create 3 new vertices at the edge midpoints Data::OMMesh::Point ABp((Ap+Bp)*0.5); Data::OMMesh::Point BCp((Bp+Cp)*0.5); Data::OMMesh::Point CAp((Cp+Ap)*0.5); // Normalize the midpoints to keep them on the sphere ABp.normalize(); BCp.normalize(); CAp.normalize(); Data::OMMesh::VertexHandle ABv(mesh.addVertex(ABp)); Data::OMMesh::VertexHandle BCv(mesh.addVertex(BCp)); Data::OMMesh::VertexHandle CAv(mesh.addVertex(CAp)); mesh.setNormal(ABv, ABp); mesh.setNormal(BCv, BCp); mesh.setNormal(CAv, CAp); generateTriangle(mesh, Av, ABv, CAv, div-1); generateTriangle(mesh, Bv, BCv, ABv, div-1); generateTriangle(mesh, Cv, CAv, BCv, div-1); generateTriangle(mesh, ABv, BCv, CAv, div-1); //<-- Remove for serpinski } }
Data::Mesh VanDerWaals::generateMesh(int ndiv, QList<VanDerWaals*> const& atoms) { Data::OMMesh::VertexHandle vertices[12]; Data::Mesh mesh; for (unsigned i = 0; i < 12; ++i) { vertices[i] = mesh.addVertex(s_vertices[i][0], s_vertices[i][1], s_vertices[i][2]); mesh.setNormal(vertices[i], mesh.vertex(vertices[i])); } for (unsigned i = 0; i < 20; ++i) { generateTriangle(mesh, vertices[s_indices[i][0]], vertices[s_indices[i][1]], vertices[s_indices[i][2]], ndiv); } // Now dilate and translate the unit sphere Data::OMMesh::Point vertex; Data::OMMesh::Point center(m_center[0], m_center[1], m_center[2]); Data::OMMesh::VertexIter iter; for (iter = mesh.vbegin(); iter != mesh.vend(); ++iter) { vertex = mesh.vertex(iter); vertex = vertex*m_radius + center; mesh.setPoint(iter.handle(), vertex); } QList<VanDerWaals*>::const_iterator atom; qglviewer::Vec A(m_center), B, BA, p; double r1(m_radius), r2, R, d; for (atom = atoms.begin(); atom != atoms.end(); ++atom) { if (*atom != this) { r2 = (*atom)->m_radius; B = (*atom)->m_center; BA = B-A; R = BA.norm(); if (R < r1+r2) { d = (R*R + r1*r1 - r2*r2) / (2.0*R); d += 0.001; // add a bit extra to make sure there are no holes in the surface p = A + BA*d/R; mesh.clip(-BA, p); } } } return mesh; }