void drawcube() { int pt[][3] = { { 10, 10, 10 }, { 10, -10, 10 }, { -10, -10, 10 }, { -10, 10, 10 }, { 10, 10, -10 }, { 10, -10, -10 }, { -10, -10, -10 }, { -10, 10, -10 } }; int face[][4] = { { 0, 3, 2, 1 }, { 3, 7, 6, 2 }, { 7, 4, 5, 6 }, { 4, 0, 1, 5 }, { 0, 4, 7, 3 }, { 1, 2, 6, 5 } }; float norm[][3] = { { 0, 0, 1.0 }, { -1.0, 0, 0 }, { 0, 0, -1.0 }, { 1.0, 0, 0 }, { 0, 1.0, 0 }, { 0, -1.0, 0 } }; int i; GLfloat mat_ambient[] = { 0.0215, 0.1745, 0.0215, 1.0 }; GLfloat mat_diffuse[] = { 0.0757, 0.6142, 0.1757, 1.0 }; GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 77.0 }; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glRotatef(global.angle[X], 1.0, 0.0, 0.0); glRotatef(global.angle[Y], 0.0, 1.0, 0.0); glRotatef(global.angle[Z], 0.0, 0.0, 1.0); for (i = 0; i < 6; ++i) { glNormal3fv(norm[i]); glBegin(GL_POLYGON); glVertex3iv(pt[face[i][0]]); glVertex3iv(pt[face[i][1]]); glVertex3iv(pt[face[i][2]]); glVertex3iv(pt[face[i][3]]); glEnd(); } glutSwapBuffers(); }
void draw_triangle(GLint a[], GLint b[], GLint c[]) { glBegin(GL_TRIANGLES); glVertex3iv(a); glVertex3iv(b); glVertex3iv(c); glEnd(); }
void Mesh::render(const vec3b& color, bool texturing, bool selected) const { bool use_texture = texturing && !tex_coord.empty(); glEnable(GL_NORMALIZE); glEnable(GL_LIGHTING); if (use_texture) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture_id); } auto& mesh = *this; auto triangles = mesh.triangles; triangles << top_cover.triangles; triangles << bottom_cover.triangles; glBegin(GL_TRIANGLES); for (auto& tri : triangles) { if (selected) glColor3ub(255, 0, 0); else if (use_texture) glColor3ub(255, 255, 255); else glColor3ubv(color.coords); glNormal3dv(tri.normal.coords); if (use_texture) glTexCoord2dv(tex(tri[0]).coords); glVertex3iv(mesh[tri[0]].coords); glNormal3dv(tri.normal.coords); if (use_texture) glTexCoord2dv(tex(tri[1]).coords); glVertex3iv(mesh[tri[1]].coords); glNormal3dv(tri.normal.coords); if (use_texture) glTexCoord2dv(tex(tri[2]).coords); glVertex3iv(mesh[tri[2]].coords); } glEnd(); if (use_texture) { glDisable(GL_TEXTURE_2D); } glDisable(GL_LIGHTING); glDisable(GL_NORMALIZE); #ifndef NDEBUG if (selected && use_texture) { glLineWidth(5); glColor3d(1, 0, 0); glBegin(GL_LINE_STRIP); for(auto &e: anchor_points) glVertex2iv(e[0].coords); glEnd(); glBegin(GL_LINE_STRIP); for (auto &e: anchor_points) glVertex2iv(e[1].coords); glEnd(); glLineWidth(1); } #endif glColor3d(1, 1, 1); }
// I thought about making a lookup table for this, but it would involve an STL map of STL vectors // and some weird function casts, so I'm doing it the naive way instead. void GeomRenderer::sendVertex(GLuint vertexIndex) { assert(vertexData.size >= 2 && vertexData.size <= 4); switch(vertexData.type) { case GL_SHORT: if (vertexData.size == 2) glVertex2sv((const GLshort*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 3) glVertex3sv((const GLshort*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 4) glVertex4sv((const GLshort*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); break; case GL_INT: if (vertexData.size == 2) glVertex2iv((const GLint*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 3) glVertex3iv((const GLint*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 4) glVertex4iv((const GLint*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); break; case GL_FLOAT: if (vertexData.size == 2) glVertex2fv((const GLfloat*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 3) glVertex3fv((const GLfloat*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 4) glVertex4fv((const GLfloat*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); break; case GL_DOUBLE: if (vertexData.size == 2) glVertex2dv((const GLdouble*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 3) glVertex3dv((const GLdouble*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); if (vertexData.size == 4) glVertex4dv((const GLdouble*)((const char*)vertexData.pointer + vertexIndex*vertexData.stride)); break; } }
template< > inline void glVertex3v< Vector3i > ( const Vector3i v ) { glVertex3iv((int*)&v); };
inline void glVertex(Vector< GLint, 3 > const &v) { glVertex3iv(v.c); }
M(void, glVertex3iv, jobject v) { glVertex3iv(BUFF(GLint, v)); }
void Vector3D<GLint>::SendOGLVertex(){glVertex3iv(V);}
void __glXDisp_Vertex3iv(GLbyte *pc) { glVertex3iv( (GLint *)(pc + 0) ); }
///////////////////////////////////////////////////////// // Render // void GEMglVertex3iv :: render(GemState *state) { glVertex3iv (v); }