#include #include #include #include #include #include #include #include #include #include #include using namespace std; class Cube : public Glyph { public: Cube(GlyphContext *gc=NULL); virtual ~Cube(); virtual string getName() {return string("Cube");} virtual void draw(node n); virtual Coord getAnchor(const Coord &vector) const; protected: GLuint LList; bool listOk; void drawCube(); }; GLYPHPLUGIN(Cube, "Cube", "Bertrand Mathieu", "09/07/2002", "Textured cube", "1", "1"); //=================================================================================== Cube::Cube(GlyphContext *gc): Glyph(gc),listOk(false) { } Cube::~Cube() { glDeleteLists(LList, 1); } void Cube::draw(node n) { setMaterial(glGraph->elementColor->getNodeValue(n)); string texFile = glGraph->elementTexture->getNodeValue(n); if (texFile != "") { if (glGraph->activateTexture(texFile)) setMaterial(Color(255,255,255,0)); } if (!listOk) { LList = glGenLists( 1 ); glNewList( LList, GL_COMPILE ); drawCube(); glEndList(); listOk=true; } glCallList(LList); } // Coord Cube::getAnchor(const Coord &vector) const // { // Coord anchor = vector; // /* anchor must be on the surface of smallest external sphere, radius=sqrt(3*(0.5)^2)=0.866025 */ // anchor *= ( 0.866025 / anchor.norm()); // return anchor; // } Coord Cube::getAnchor(const Coord &vector) const { Coord anchor = vector; anchor *= ( 0.866025 / anchor.norm()); float x,y,z,fx,fy,fz; anchor.get(x,y,z); fx=fabsf(x); fy=fabsf(y); fz=fabsf(z); if (fx > 0.5) { bool adjust=true; if (fy < fx) anchor.setY((y*0.5)/fx); else adjust=false; if (fz < fx) anchor.setZ((z*0.5)/fx); else adjust=false; if (adjust) anchor.setX(x/fx * 0.5); // x = +- 0.5 } if (fy > 0.5) { bool adjust=true; if (fx < fy) anchor.setX((x*0.5)/fy); else adjust=false; if (fz < fy) anchor.setZ((z*0.5)/fy); else adjust=false; if (adjust) anchor.setY(y/fy * 0.5); // y = +- 0.5 } if (fz > 0.5) { bool adjust=true; if (fx < fz) anchor.setX((x*0.5)/fz); else adjust=false; if (fy < fz) anchor.setY((y*0.5)/fz); else adjust=false; if (adjust) anchor.setZ(z/fz * 0.5); // y = +- 0.5 } return anchor; } void Cube::drawCube() { glBegin(GL_QUADS); /* front face */ glNormal3f(0.0f, 0.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f); /* back face */ glNormal3f(0.0f, 0.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); /* right face */ glNormal3f(1.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); /* left face */ glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); /* top face */ glNormal3f(0.0f, 1.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f); /* bottom face */ glNormal3f(0.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.5f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glEnd(); }