nuclear@1: #include "object.h" nuclear@1: #include "opengl.h" nuclear@1: nuclear@1: Object::Object() nuclear@1: { nuclear@1: mesh = 0; nuclear@4: tex = 0; nuclear@6: nuclear@6: mtl.diffuse = Vector3(1, 1, 1); nuclear@6: mtl.specular = Vector3(0, 0, 0); nuclear@6: mtl.shininess = 60.0; nuclear@6: mtl.alpha = 1.0; nuclear@1: } nuclear@1: nuclear@1: Object::~Object() nuclear@1: { nuclear@1: delete mesh; nuclear@1: } nuclear@1: nuclear@1: Matrix4x4 &Object::xform() nuclear@1: { nuclear@1: return matrix; nuclear@1: } nuclear@1: nuclear@1: const Matrix4x4 &Object::xform() const nuclear@1: { nuclear@1: return matrix; nuclear@1: } nuclear@1: nuclear@6: Matrix4x4 &Object::tex_xform() nuclear@6: { nuclear@6: return tex_matrix; nuclear@6: } nuclear@6: nuclear@6: const Matrix4x4 &Object::tex_xform() const nuclear@6: { nuclear@6: return tex_matrix; nuclear@6: } nuclear@6: nuclear@1: void Object::set_mesh(Mesh *m) nuclear@1: { nuclear@1: this->mesh = m; nuclear@1: } nuclear@1: nuclear@1: Mesh *Object::get_mesh() const nuclear@1: { nuclear@1: return mesh; nuclear@1: } nuclear@1: nuclear@4: void Object::set_texture(unsigned int tex) nuclear@4: { nuclear@4: this->tex = tex; nuclear@4: } nuclear@4: nuclear@1: void Object::draw() const nuclear@1: { nuclear@1: if(!mesh) return; nuclear@1: nuclear@4: if(tex) { nuclear@4: glBindTexture(GL_TEXTURE_2D, tex); nuclear@4: glEnable(GL_TEXTURE_2D); nuclear@6: nuclear@6: glMatrixMode(GL_TEXTURE); nuclear@6: glPushMatrix(); nuclear@6: glLoadTransposeMatrixf(tex_matrix[0]); nuclear@4: } else { nuclear@4: glDisable(GL_TEXTURE_2D); nuclear@4: } nuclear@4: nuclear@1: glMatrixMode(GL_MODELVIEW); nuclear@1: glPushMatrix(); nuclear@2: glMultTransposeMatrixf(matrix[0]); nuclear@1: nuclear@6: float dcol[] = {mtl.diffuse.x, mtl.diffuse.y, mtl.diffuse.z, mtl.alpha}; nuclear@6: glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, dcol); nuclear@6: float scol[] = {mtl.specular.x, mtl.specular.y, mtl.specular.z, 1.0f}; nuclear@6: glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, scol); nuclear@6: glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mtl.shininess); nuclear@6: nuclear@1: mesh->draw(); nuclear@1: nuclear@4: if(tex) { nuclear@4: glDisable(GL_TEXTURE_2D); nuclear@6: nuclear@6: glMatrixMode(GL_TEXTURE); nuclear@6: glPopMatrix(); nuclear@4: } nuclear@6: nuclear@6: glMatrixMode(GL_MODELVIEW); nuclear@6: glPopMatrix(); nuclear@1: } nuclear@3: nuclear@11: void Object::draw_wire(const Vector4 &col) const nuclear@11: { nuclear@11: glPushAttrib(GL_ENABLE_BIT); nuclear@11: glDisable(GL_LIGHTING); nuclear@11: nuclear@11: glMatrixMode(GL_MODELVIEW); nuclear@11: glPushMatrix(); nuclear@11: glMultTransposeMatrixf(matrix[0]); nuclear@11: nuclear@11: glColor4f(col.x, col.y, col.z, col.w); nuclear@11: mesh->draw_wire(); nuclear@11: nuclear@11: glPopMatrix(); nuclear@11: glPopAttrib(); nuclear@11: } nuclear@11: nuclear@11: void Object::draw_vertices(const Vector4 &col) const nuclear@11: { nuclear@11: glPushAttrib(GL_ENABLE_BIT); nuclear@11: glDisable(GL_LIGHTING); nuclear@11: nuclear@11: glMatrixMode(GL_MODELVIEW); nuclear@11: glPushMatrix(); nuclear@11: glMultTransposeMatrixf(matrix[0]); nuclear@11: nuclear@11: glColor4f(col.x, col.y, col.z, col.w); nuclear@11: mesh->draw_vertices(); nuclear@11: nuclear@11: glPopMatrix(); nuclear@11: glPopAttrib(); nuclear@11: } nuclear@11: nuclear@11: void Object::draw_normals(float len, const Vector4 &col) const nuclear@11: { nuclear@11: glPushAttrib(GL_ENABLE_BIT); nuclear@11: glDisable(GL_LIGHTING); nuclear@11: nuclear@11: glMatrixMode(GL_MODELVIEW); nuclear@11: glPushMatrix(); nuclear@11: glMultTransposeMatrixf(matrix[0]); nuclear@11: nuclear@11: glColor4f(col.x, col.y, col.z, col.w); nuclear@11: mesh->set_vis_vecsize(len); nuclear@11: mesh->draw_normals(); nuclear@11: nuclear@11: glPopMatrix(); nuclear@11: glPopAttrib(); nuclear@11: } nuclear@11: nuclear@11: void Object::draw_tangents(float len, const Vector4 &col) const nuclear@11: { nuclear@11: glPushAttrib(GL_ENABLE_BIT); nuclear@11: glDisable(GL_LIGHTING); nuclear@11: nuclear@11: glMatrixMode(GL_MODELVIEW); nuclear@11: glPushMatrix(); nuclear@11: glMultTransposeMatrixf(matrix[0]); nuclear@11: nuclear@11: glColor4f(col.x, col.y, col.z, col.w); nuclear@11: mesh->set_vis_vecsize(len); nuclear@11: mesh->draw_tangents(); nuclear@11: nuclear@11: glPopMatrix(); nuclear@11: glPopAttrib(); nuclear@11: } nuclear@11: nuclear@3: bool Object::intersect(const Ray &ray, HitPoint *hit) const nuclear@3: { nuclear@3: return false; // TODO nuclear@3: }