LineFieldRenderer::LineFieldRenderer(const Manifold& m, bool smooth, VertexAttributeVector<Vec3d>& lines, float _r): SimpleShaderRenderer(vss,fss), r(_r) { float noise_scale = 10.0f/r; float line_scale = 0.003f; GLint old_prog; glGetIntegerv(GL_CURRENT_PROGRAM, &old_prog); glUseProgram(prog); glUniform1fARB(glGetUniformLocationARB(prog, "scale_line"),line_scale*noise_scale); glUniform1fARB(glGetUniformLocationARB(prog, "noise_scale"),noise_scale); glUniform1iARB(glGetUniformLocationARB(prog, "noise_tex"),0); GLuint direction = glGetAttribLocation(prog, "direction"); glNewList(display_list,GL_COMPILE); for(FaceIDIterator f = m.faces_begin(); f != m.faces_end(); ++f) { if(!smooth) glNormal3dv(normal(m, *f).get()); if(no_edges(m, *f) == 3) glBegin(GL_TRIANGLES); else glBegin(GL_POLYGON); for(Walker w = m.walker(*f); !w.full_circle(); w = w.circulate_face_ccw()) { Vec3d n(normal(m, w.vertex())); if(smooth) glNormal3dv(n.get()); Vec3d d = lines[w.vertex()]; d = normalize(d-n*dot(n,d)); glVertexAttrib3dv(direction, d.get()); glVertex3dv(m.pos(w.vertex()).get()); } glEnd(); } glBindTexture(GL_TEXTURE_3D, 0); glEndList(); glUseProgram(old_prog); }
void ShaderProgram::setAttribute(GLint index, const Vector3d &v) { glVertexAttrib3dv(index, &(v.x)); }
void drawBumpTorus(double radius1, double radius2, int nSide, int nRing, int nRepeatS, int nRepeatT) { //radius1:円環断面半径 //radius2:円環の中心軸半径 //nSide:円環断面における表面分割点数 //nRing:円環中心軸に沿った分割点数 int i, j; double rr, zz; double s0, s1, t, phi0, phi1, theta; double p[2][3], tnt[2][3]; GLuint tangentLoc = glGetAttribLocation(shaderProg, "tangent"); for(i = 0; i < nRing; i++) { //i=0は基本断面(x=radius2を中心とする円, y=0) //2つのs座標 s0 = (double)i / (double)nRing; s1 = (double)(i+1) / (double)nRing; phi0 = 2.0 * M_PI * s0; phi1 = 2.0 * M_PI * s1; //接線ベクトルのxyz成分 tnt[0][0] = - sin(phi0); tnt[0][1] = cos(phi0); tnt[0][2] = 0.0; tnt[1][0] = - sin(phi1); tnt[1][1] = cos(phi1); tnt[1][2] = 0.0; //s座標 s0 *= (double)nRepeatS; s1 *= (double)nRepeatS; glEnable(GL_TEXTURE_2D); glBegin(GL_QUAD_STRIP); for(j = 0; j <= nSide; j++) { //t座標 t = (double)j / (double)nSide; theta = -M_PI + 2.0 * M_PI * t; rr = radius2 + radius1 * cos(theta);//z軸からの距離 zz = radius1 * sin(theta); //頂点のxyz座標(j=0を内側xy平面) p[0][0] = rr * cos(phi0);//x座標 p[0][1] = rr * sin(phi0);//y p[0][2] = zz; //z p[1][0] = rr * cos(phi1);//x座標 p[1][1] = rr * sin(phi1);//y p[1][2] = zz; //z t *= (double)nRepeatT; glVertexAttrib3dv(tangentLoc, tnt[0]); glTexCoord2d(s0, t);//テクスチャ座標 glNormal3d(cos(theta)*cos(phi0),cos(theta)*sin(phi0),sin(theta)); glVertex3dv(p[0]);//頂点座標 glVertexAttrib3dv(tangentLoc, tnt[1]); glTexCoord2d(s1, t);//テクスチャ座標 glNormal3d(cos(theta)*cos(phi1),cos(theta)*sin(phi1),sin(theta)); glVertex3dv(p[1]);//頂点座標 } glEnd(); glDisable(GL_TEXTURE_2D); } }